aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/en/developers/01_Index.md1
-rw-r--r--docs/en/developers/03_Backend/04_Changing_source_code.md17
-rw-r--r--docs/fr/developers/03_Backend/04_Changing_source_code.md17
-rw-r--r--docs/i18n/freshrss.fr.po9461
-rw-r--r--docs/i18n/templates/freshrss.pot8566
-rw-r--r--docs/po4a.conf16
6 files changed, 12372 insertions, 5706 deletions
diff --git a/docs/en/developers/01_Index.md b/docs/en/developers/01_Index.md
index 878aa56c7..c3787377a 100644
--- a/docs/en/developers/01_Index.md
+++ b/docs/en/developers/01_Index.md
@@ -19,7 +19,6 @@ Start by creating your development environment. A guide to setting up FreshRSSâ€
* [Making extensions for FreshRSS](03_Backend/05_Extensions.md)
* [Database Schema](03_Backend/01_Database_schema.md)
* [External libraries](03_Backend/03_External_libraries.md)
-* [Changing source code](03_Backend/04_Changing_source_code.md)
## Frontend Development
diff --git a/docs/en/developers/03_Backend/04_Changing_source_code.md b/docs/en/developers/03_Backend/04_Changing_source_code.md
deleted file mode 100644
index 2f5ed8e14..000000000
--- a/docs/en/developers/03_Backend/04_Changing_source_code.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Changing the source code
-
-## Accessing the database
-
-> **TODO**
-
-## Writing an action and its related view
-
-> **TODO**
-
-## Authentication
-
-> **TODO**
-
-## Logs
-
-> **TODO**
diff --git a/docs/fr/developers/03_Backend/04_Changing_source_code.md b/docs/fr/developers/03_Backend/04_Changing_source_code.md
deleted file mode 100644
index 3bcbada97..000000000
--- a/docs/fr/developers/03_Backend/04_Changing_source_code.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Éditer le code source
-
-## Accès à la base de données
-
-> **Ă€ FAIRE**
-
-## Écrire une action et sa vue associée
-
-> **Ă€ FAIRE**
-
-## Gestion de l’authentification
-
-> **Ă€ FAIRE**
-
-## Gestion des logs
-
-> **Ă€ FAIRE**
diff --git a/docs/i18n/freshrss.fr.po b/docs/i18n/freshrss.fr.po
index ca167989b..719527dc4 100644
--- a/docs/i18n/freshrss.fr.po
+++ b/docs/i18n/freshrss.fr.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: FreshRSS\n"
"Report-Msgid-Bugs-To: https://github.com/FreshRSS/FreshRSS/issues\n"
-"POT-Creation-Date: 2020-02-29 18:49+0100\n"
+"POT-Creation-Date: 2023-05-11 00:12+0200\n"
"PO-Revision-Date: 2019-12-07 10:50+0100\n"
"Last-Translator: Marien Fressinaud <dev@marienfressinaud.fr>\n"
"Language-Team: French <>\n"
@@ -24,47 +24,11 @@ msgstr ""
#. type: Title ##
#: en/./contributing.md:1
#, no-wrap
-msgid "Join us on the mailing lists"
-msgstr "Rejoignez-nous sur les listes de mailing"
-
-#. type: Plain text
-#: en/./contributing.md:4
-msgid ""
-"Do you want to ask us some questions? Do you want to discuss with us? Don’t "
-"hesitate to subscribe to our mailing lists!"
-msgstr ""
-"S’il vous manque des informations, n’hésitez pas à fouiller un peu la "
-"documentation ou venir nous poser directement vos questions sur [la mailing "
-"list des développeurs](https://freshrss.org/mailman/listinfo/dev)."
-
-#. type: Bullet: '* '
-#: en/./contributing.md:7
-msgid ""
-"The first mailing is destined to generic information, it should be adapted "
-"to users. [Join mailing@freshrss.org](https://freshrss.org/mailman/listinfo/"
-"mailing)."
-msgstr ""
-"Le premier mailing est destiné à l’information générique, il doit être "
-"adapté aux utilisateurs. [Rejoignez mailing@freshrss.org](https://freshrss."
-"org/mailman/listinfo/mailing)."
-
-#. type: Bullet: '* '
-#: en/./contributing.md:7
-msgid ""
-"The second mailing is mainly for developers. [Join dev@freshrss.org](https://"
-"freshrss.org/mailman/listinfo/dev)"
-msgstr ""
-"Le deuxième mailing s’adresse principalement aux développeurs. [Rejoignez "
-"dev@freshrss.org](https://freshrss.org/mailman/listinfo/dev)"
-
-#. type: Title ##
-#: en/./contributing.md:8
-#, no-wrap
msgid "Report a bug"
msgstr "Signaler un bug"
#. type: Plain text
-#: en/./contributing.md:11
+#: en/./contributing.md:4
msgid ""
"Have you found a bug? Don’t panic, here are some steps to report it with "
"ease:"
@@ -73,7 +37,7 @@ msgstr ""
"signaler facilement :"
#. type: Bullet: '1. '
-#: en/./contributing.md:15
+#: en/./contributing.md:8
msgid ""
"Search for it on [the bug tracker](https://github.com/FreshRSS/FreshRSS/"
"issues) (don’t forget to use the search bar)."
@@ -82,7 +46,7 @@ msgstr ""
"(n’oubliez pas d’utiliser la barre de recherche)."
#. type: Bullet: '2. '
-#: en/./contributing.md:15
+#: en/./contributing.md:8
msgid ""
"If you find a similar bug, don’t hesitate to post a comment to add more "
"importance to the related ticket."
@@ -91,7 +55,7 @@ msgstr ""
"pour ajouter de l’importance au ticket correspondant."
#. type: Bullet: '3. '
-#: en/./contributing.md:15
+#: en/./contributing.md:8
msgid ""
"If you didn’t find it, [open a new ticket](https://github.com/FreshRSS/"
"FreshRSS/issues/new)."
@@ -100,7 +64,7 @@ msgstr ""
"FreshRSS/FreshRSS/issues/new)."
#. type: Plain text
-#: en/./contributing.md:17
+#: en/./contributing.md:10
msgid ""
"If you have to create a new ticket, please try to keep in mind the following "
"advice:"
@@ -109,7 +73,7 @@ msgstr ""
"suivants :"
#. type: Bullet: '* '
-#: en/./contributing.md:20
+#: en/./contributing.md:13
msgid ""
"Give an explicit title to the ticket so it will be easier to find it later."
msgstr ""
@@ -117,7 +81,7 @@ msgstr ""
"tard."
#. type: Bullet: '* '
-#: en/./contributing.md:20
+#: en/./contributing.md:13
msgid ""
"Be as exhaustive as possible in the description: what did you do? What is "
"the bug? What are the steps to reproduce the bug?"
@@ -126,12 +90,12 @@ msgstr ""
"Quel est le bogue ? Quelles sont les étapes pour reproduire le bogue ?"
#. type: Plain text
-#: en/./contributing.md:22
+#: en/./contributing.md:15
msgid "We also need some information:"
msgstr "Nous avons aussi besoin de quelques informations :"
#. type: Bullet: '* '
-#: en/./contributing.md:27
+#: en/./contributing.md:20
msgid ""
"Your FreshRSS version (on the about page or in the `constants.php` file)"
msgstr ""
@@ -139,19 +103,19 @@ msgstr ""
"php`)"
#. type: Bullet: '* '
-#: en/./contributing.md:27
+#: en/./contributing.md:20
msgid "Your server configuration: the type of hosting and the PHP version"
msgstr "Votre configuration de serveur : type d’hébergement, version PHP"
#. type: Bullet: '* '
-#: en/./contributing.md:27
+#: en/./contributing.md:20
msgid "Your storage system (SQLite, MySQL, MariaDB, PostgreSQL)"
msgstr ""
"Quelle base de données : SQLite, MySQL, MariaDB, PostgreSQL ? Quelle "
"version ?"
#. type: Bullet: '* '
-#: en/./contributing.md:27
+#: en/./contributing.md:20
msgid ""
"If possible, the related logs (PHP logs and FreshRSS logs under `data/users/"
"your_user/log.txt`)"
@@ -159,14 +123,21 @@ msgstr ""
"Si possible, les logs associés (logs PHP et logs FreshRSS sous `data/users/"
"your_user/log.txt`)"
+#. type: Plain text
+#: en/./contributing.md:22
+msgid ""
+"For a more detailed guide on writing bug reports, please refer to [the in-"
+"depth guide on reporting bugs](developers/06_Reporting_Bugs)."
+msgstr ""
+
#. type: Title ##
-#: en/./contributing.md:28
+#: en/./contributing.md:23
#, no-wrap
msgid "Fix a bug"
msgstr "Corriger un bogue"
#. type: Plain text
-#: en/./contributing.md:31
+#: en/./contributing.md:26
msgid ""
"Would you like to fix a bug? For optimum coordination between collaborators, "
"you should follow these indications:"
@@ -175,7 +146,7 @@ msgstr ""
"les collaborateurs, vous devrez suivre ces indications :"
#. type: Bullet: '1. '
-#: en/./contributing.md:36
+#: en/./contributing.md:31
msgid ""
"Be sure the bug is associated with a ticket and indicate that you’ll work on "
"it."
@@ -184,7 +155,7 @@ msgstr ""
"travailler sur le bogue."
#. type: Bullet: '2. '
-#: en/./contributing.md:36
+#: en/./contributing.md:31
msgid ""
"[Fork the project repository](https://help.github.com/articles/fork-a-repo/)."
msgstr ""
@@ -192,7 +163,7 @@ msgstr ""
"repo/)."
#. type: Bullet: '3. '
-#: en/./contributing.md:36
+#: en/./contributing.md:31
msgid ""
"[Create a new branch](https://help.github.com/articles/creating-and-deleting-"
"branches-within-your-repository/). The name of the branch should be clear, "
@@ -207,7 +178,7 @@ msgstr ""
"com/FreshRSS/FreshRSS/issues/783)."
#. type: Bullet: '4. '
-#: en/./contributing.md:36
+#: en/./contributing.md:31
msgid ""
"Make your changes to your fork and [send a pull request](https://help.github."
"com/articles/using-pull-requests/)."
@@ -216,28 +187,32 @@ msgstr ""
"request](https://help.github.com/articles/using-pull-requests/)."
#. type: Plain text
-#: en/./contributing.md:38
+#: en/./contributing.md:33
+#, fuzzy
+#| msgid ""
+#| "If you have to write code, please follow [our coding style "
+#| "recommendations](developers/01_First_steps.md)."
msgid ""
"If you have to write code, please follow [our coding style recommendations]"
-"(developers/01_First_steps.md)."
+"(developers/02_First_steps.md)."
msgstr ""
"Si vous devez écrire du code, veuillez suivre [nos recommandations de style "
"de codage](developers/01_First_steps.md)."
#. type: Plain text
-#: en/./contributing.md:40
+#: en/./contributing.md:35
#, no-wrap
msgid "**Tip:** if you’re searching for easy-to-fix bugs, please have a look at the “[good first issue](https://github.com/FreshRSS/FreshRSS/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)” ticket label.\n"
msgstr "**Conseil : **si vous cherchez des bugs faciles à corriger, jetez un coup d’oeil à la vignette « [good first issue](https://github.com/FreshRSS/FreshRSS/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) ».\n"
#. type: Title ##
-#: en/./contributing.md:41
+#: en/./contributing.md:36
#, no-wrap
msgid "Submit an idea"
msgstr "Soumettre une idée"
#. type: Plain text
-#: en/./contributing.md:44
+#: en/./contributing.md:39
msgid ""
"You have great ideas, yes! Don’t be shy and open [a new ticket](https://"
"github.com/FreshRSS/FreshRSS/issues/new) on our bug tracker to ask if we can "
@@ -249,48 +224,31 @@ msgstr ""
"grandes idées viennent souvent des suggestions les plus timides !"
#. type: Plain text
-#: en/./contributing.md:46
+#: en/./contributing.md:41
msgid "If your idea is nice, we’ll have a look at it."
msgstr "Si votre idée est bonne, nous y jetterons un coup d’oeil."
#. type: Title ##
-#: en/./contributing.md:47
+#: en/./contributing.md:42
#, no-wrap
msgid "Contribute to internationalization (i18n)"
msgstr "Contribuer à l’internationalisation (i18n)"
#. type: Plain text
-#: en/./contributing.md:50
-msgid ""
-"If you want to improve internationalization, please open a new ticket first "
-"and follow the advice from the *Fix a bug* section."
-msgstr ""
-"Si vous voulez améliorer l’internationalisation, ouvrez d’abord un nouveau "
-"ticket et suivez les conseils de la section *Fixer un bogue*."
-
-#. type: Plain text
-#: en/./contributing.md:52
-msgid "Translations are present in the subdirectories of `./app/i18n/`."
-msgstr ""
-"Les traductions sont disponibles dans les sous-répertoires de `./app/i18n/`."
-
-#. type: Plain text
-#: en/./contributing.md:54
+#: en/./contributing.md:45
msgid ""
-"We’re working on a better way to handle internationalization, but don’t "
-"hesitate to suggest any ideas!"
+"Learn how to contribute to translations in [the dedicated documentation](./"
+"internationalization.md)."
msgstr ""
-"Nous travaillons sur une meilleure façon de gérer l’internationalisation "
-"mais n’hésitez pas à nous suggérer des idées !"
#. type: Title ##
-#: en/./contributing.md:55
+#: en/./contributing.md:46
#, no-wrap
msgid "Contribute to documentation"
msgstr "Contribuer Ă  la documentation"
#. type: Plain text
-#: en/./contributing.md:58
+#: en/./contributing.md:49
msgid ""
"The documentation needs a lot of improvements in order to be more useful to "
"new contributors and we are working on it. If you want to give some help, "
@@ -303,13 +261,136 @@ msgstr ""
"com/FreshRSS/FreshRSS/tree/edge/docs) !"
#. type: Title #
-#: en/./developers/01_First_steps.md:1
+#: en/./developers/01_Index.md:1
+#, fuzzy, no-wrap
+#| msgid "FreshRSS - Fever API implementation"
+msgid "FreshRSS Development"
+msgstr "FreshRSS - API compatible Fever"
+
+#. type: Title ##
+#: en/./developers/01_Index.md:3
+#, no-wrap
+msgid "First Steps"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_Index.md:6
+msgid ""
+"Start by creating your development environment. A guide to setting up "
+"FreshRSS’s development environment can be found on [the appropriate page]"
+"(02_First_steps.md)."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_Index.md:7
+#, no-wrap
+msgid "After That"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+msgid "[Github Branching and Pushing](02_Github.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+msgid "[Running tests](03_Running_tests.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+msgid "[Creating a pull request](04_Pull_requests.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+msgid "[Releasing a new version](05_Release_new_version.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+msgid "[Reporting bugs](06_Reporting_Bugs.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+msgid "[Fever API](06_Fever_API.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+msgid "[GoogleReader API](06_GoogleReader_API.md)"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_Index.md:17
+#, no-wrap
+msgid "Backend Development"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:22
+msgid "[Making extensions for FreshRSS](03_Backend/05_Extensions.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:22
+msgid "[Database Schema](03_Backend/01_Database_schema.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:22
+msgid "[External libraries](03_Backend/03_External_libraries.md)"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_Index.md:23
+#, no-wrap
+msgid "Frontend Development"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:27
+msgid "[View files](04_Frontend/01_View_files.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:27
+msgid "[Design (Themes/Theming)](04_Frontend/02_Design.md)"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_Index.md:28
+#, no-wrap
+msgid "Namespaces"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:31
+msgid "[OPML FreshRSS namespace](OPML.md)"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_Index.md:32
+#, no-wrap
+msgid "Minz"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_Index.md:34
+msgid ""
+"Minz is the homemade PHP framework used by FreshRSS. More information can be "
+"found [here](Minz/index.md)."
+msgstr ""
+
+#. type: Title #
+#: en/./developers/02_First_steps.md:1
#, no-wrap
msgid "Environment configuration (Docker)"
msgstr "Configurer son environnement (Docker)"
#. type: Plain text
-#: en/./developers/01_First_steps.md:4
+#: en/./developers/02_First_steps.md:4
msgid ""
"FreshRSS is built with PHP and uses a homemade framework, Minz. The "
"dependencies are directly included in the source code, so you don’t need "
@@ -320,7 +401,7 @@ msgstr ""
"pas besoin d’utiliser Composer."
#. type: Plain text
-#: en/./developers/01_First_steps.md:6
+#: en/./developers/02_First_steps.md:6
msgid ""
"There are various ways to configure your development environment. The "
"easiest and most supported method is based on Docker, which is the solution "
@@ -333,7 +414,7 @@ msgstr ""
"déjà unenvironnement PHP fonctionnel, vous n’en avez probablement pas besoin."
#. type: Plain text
-#: en/./developers/01_First_steps.md:8
+#: en/./developers/02_First_steps.md:8
msgid ""
"We assume here that you use a GNU/Linux distribution, capable of running "
"Docker. Otherwise, you’ll have to adapt the commands accordingly."
@@ -342,7 +423,7 @@ msgstr ""
"d’exécuter Docker. Sinon, vous devrez adapter les commandes en conséquence."
#. type: Plain text
-#: en/./developers/01_First_steps.md:10
+#: en/./developers/02_First_steps.md:10
msgid ""
"The commands that follow have to be executed in a console. They start by `$` "
"when commands need to be executed as normal user, and by `#` when they need "
@@ -361,7 +442,7 @@ msgstr ""
"répertoire `app/`."
#. type: Plain text
-#: en/./developers/01_First_steps.md:12
+#: en/./developers/02_First_steps.md:12
msgid ""
"First, you need to install [Docker](https://docs.docker.com/install/linux/"
"docker-ce/ubuntu/)."
@@ -370,34 +451,26 @@ msgstr ""
"linux/docker-ce/ubuntu/)."
#. type: Plain text
-#: en/./developers/01_First_steps.md:14
+#: en/./developers/02_First_steps.md:14
msgid "Once you’re done, clone the repository with:"
msgstr ""
"Une fois que c’est fait, clonez le dépôt de code de la manière suivante :"
-#. type: Code fence info string
-#: en/./developers/01_First_steps.md:15 en/./developers/01_First_steps.md:24
-#: en/./developers/01_First_steps.md:34 en/./developers/01_First_steps.md:42
-#: en/./developers/01_First_steps.md:50 en/./developers/03_Running_tests.md:9
-#: en/./developers/03_Running_tests.md:17
-#: en/./developers/04_Pull_requests.md:23
-#: en/./developers/04_Pull_requests.md:38
-#, no-wrap
-msgid "console"
-msgstr "console"
-
-#. type: Plain text
-#: en/./developers/01_First_steps.md:15
-#, no-wrap
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:15
+#, fuzzy, no-wrap
+#| msgid ""
+#| "$ git clone https://github.com/FreshRSS/FreshRSS.git\n"
+#| "$ cd FreshRSS\n"
msgid ""
-"$ git clone https://github.com/FreshRSS/FreshRSS.git\n"
-"$ cd FreshRSS\n"
+"git clone https://github.com/FreshRSS/FreshRSS.git\n"
+"cd FreshRSS\n"
msgstr ""
"$ git clone https://github.com/FreshRSS/FreshRSS.git\n"
"$ cd FreshRSS\n"
#. type: Plain text
-#: en/./developers/01_First_steps.md:21
+#: en/./developers/02_First_steps.md:21
msgid ""
"Note that, if you want to contribute, you have to fork the repository first "
"and clone your fork instead of the \"root\" one. Adapt the commands in "
@@ -408,18 +481,19 @@ msgstr ""
"Adaptez les commandes en conséquence."
#. type: Plain text
-#: en/./developers/01_First_steps.md:23
+#: en/./developers/02_First_steps.md:23
msgid "Then, the only command you need to know is the following:"
msgstr "Ensuite, la seule commande que vous devez connaître est la suivante :"
-#. type: Plain text
-#: en/./developers/01_First_steps.md:24
-#, no-wrap
-msgid "$ make start\n"
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:24
+#, fuzzy, no-wrap
+#| msgid "$ make start\n"
+msgid "make start\n"
msgstr "$ make start\n"
#. type: Plain text
-#: en/./developers/01_First_steps.md:29
+#: en/./developers/02_First_steps.md:29
msgid ""
"This might take some time while Docker downloads the image. If your user "
"isn’t in the `docker` group, you’ll need to prepend the command with `sudo`."
@@ -430,25 +504,26 @@ msgstr ""
"commande en la préfixant par `sudo`."
#. type: Plain text
-#: en/./developers/01_First_steps.md:31
+#: en/./developers/02_First_steps.md:31
#, no-wrap
msgid "**You can now access FreshRSS at [http://localhost:8080](http://localhost:8080).** Just follow the install process and select the SQLite database.\n"
msgstr "**Vous pouvez maintenant accéder à FreshRSS à [http://localhost:8080](http://localhost:8080).** Suivez simplement le processus d’installation et sélectionnez la base de données SQLite.\n"
#. type: Plain text
-#: en/./developers/01_First_steps.md:33
+#: en/./developers/02_First_steps.md:33
#, no-wrap
msgid "You can stop the containers by typing <kbd>Control</kbd> + <kbd>c</kbd> or with the following command, in another terminal:\n"
msgstr "Vous pouvez arrĂŞter les conteneurs en tapant <kbd>Control</kbd> + <kbd>c</kbd> ou avec la commande suivante, dans un autre terminal:\n"
-#. type: Plain text
-#: en/./developers/01_First_steps.md:34
-#, no-wrap
-msgid "$ make stop\n"
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:34
+#, fuzzy, no-wrap
+#| msgid "$ make stop\n"
+msgid "make stop\n"
msgstr "$ make stop\n"
#. type: Plain text
-#: en/./developers/01_First_steps.md:39
+#: en/./developers/02_First_steps.md:39
msgid ""
"If you’re interested in the configuration, the `make` commands are defined "
"in the [`Makefile`](/Makefile)."
@@ -457,7 +532,7 @@ msgstr ""
"le fichier [`Makefile`](/Makefile)."
#. type: Plain text
-#: en/./developers/01_First_steps.md:41
+#: en/./developers/02_First_steps.md:41
msgid ""
"If you need to use a different tag image (default is `alpine`), you can set "
"the `TAG` environment variable:"
@@ -467,14 +542,15 @@ msgstr ""
"suivante la variable d’environnement `TAG` au moment de l’exécution de la "
"commande :"
-#. type: Plain text
-#: en/./developers/01_First_steps.md:42
-#, no-wrap
-msgid "$ TAG=arm make start\n"
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:42
+#, fuzzy, no-wrap
+#| msgid "$ TAG=arm make start\n"
+msgid "TAG=arm make start\n"
msgstr "$ TAG=arm make start\n"
#. type: Plain text
-#: en/./developers/01_First_steps.md:47
+#: en/./developers/02_First_steps.md:47
msgid ""
"You can find the full list of available tags [on the Docker hub](https://hub."
"docker.com/r/freshrss/freshrss/tags)."
@@ -483,7 +559,7 @@ msgstr ""
"Docker](https://hub.docker.com/r/freshrss/freshrss/tags)."
#. type: Plain text
-#: en/./developers/01_First_steps.md:49
+#: en/./developers/02_First_steps.md:49
msgid ""
"If you want to build the Docker image yourself, you can use the following "
"command:"
@@ -491,20 +567,24 @@ msgstr ""
"Si vous voulez construire l’image Docker, vous pouvez lancer la commande "
"suivante :"
-#. type: Plain text
-#: en/./developers/01_First_steps.md:50
-#, no-wrap
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:50
+#, fuzzy, no-wrap
+#| msgid ""
+#| "$ make build\n"
+#| "$ # or\n"
+#| "$ TAG=arm make build\n"
msgid ""
-"$ make build\n"
-"$ # or\n"
-"$ TAG=arm make build\n"
+"make build\n"
+"# or\n"
+"TAG=arm make build\n"
msgstr ""
"$ make build\n"
"$ # ou\n"
"$ TAG=arm make build\n"
#. type: Plain text
-#: en/./developers/01_First_steps.md:57
+#: en/./developers/02_First_steps.md:57
msgid ""
"The `TAG` variable can be anything (e.g. `local`). You can target a specific "
"architecture by adding `-alpine` or `-arm` at the end of the tag (e.g. "
@@ -514,51 +594,25 @@ msgstr ""
"exemple `local`). Vous pouvez cibler une architecture spécifique en ajoutant "
"`-alpine` ou `-arm` Ă  la fin du tag (par exemple `local-arm`)."
-#. type: Title #
-#: en/./developers/01_First_steps.md:58
+#. type: Title ##
+#: en/./developers/02_First_steps.md:58
#, no-wrap
msgid "Project architecture"
msgstr "Architecture du projet"
-#. type: Plain text
-#: en/./developers/01_First_steps.md:61 en/./developers/03_Backend/02_Minz.md:4
-#: en/./developers/03_Backend/02_Minz.md:8
-#: en/./developers/03_Backend/02_Minz.md:12
-#: en/./developers/03_Backend/02_Minz.md:16
-#: en/./developers/03_Backend/02_Minz.md:20
-#: en/./developers/03_Backend/02_Minz.md:24
-#: en/./developers/03_Backend/02_Minz.md:27
-#: en/./developers/03_Backend/04_Changing_source_code.md:4
-#: en/./developers/03_Backend/04_Changing_source_code.md:8
-#: en/./developers/03_Backend/04_Changing_source_code.md:12
-#: en/./developers/03_Backend/04_Changing_source_code.md:15
-#: en/./developers/03_Backend/05_Extensions.md:342
-#: en/./developers/03_Backend/05_Extensions.md:383
-#: en/./developers/04_Frontend/01_View_files.md:4
-#: en/./developers/04_Frontend/01_View_files.md:8
-#: en/./developers/04_Frontend/01_View_files.md:12
-#: en/./developers/04_Frontend/01_View_files.md:15
-#: en/./developers/04_Frontend/02_Design.md:4
-#: en/./developers/04_Frontend/02_Design.md:8
-#: en/./developers/04_Frontend/02_Design.md:11 en/./users/03_Main_view.md:4
-#: en/./users/03_Main_view.md:8 en/./users/03_Main_view.md:12
-#: en/./users/04_Subscriptions.md:4 en/./users/04_Subscriptions.md:8
-#: en/./users/04_Subscriptions.md:19 en/./users/05_Configuration.md:70
-#: en/./users/05_Configuration.md:74 en/./users/05_Configuration.md:128
-#: en/./users/05_Configuration.md:153 en/./users/05_Configuration.md:157
-#: en/./users/05_Configuration.md:161
-#, no-wrap
-msgid "**TODO**\n"
-msgstr "**Ă€ FAIRE**\n"
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:61
+msgid "the PHP framework: [Minz](Minz/index.md)"
+msgstr ""
#. type: Title #
-#: en/./developers/01_First_steps.md:62
+#: en/./developers/02_First_steps.md:62 en/./users/05_Configuration.md:178
#, no-wrap
msgid "Extensions"
msgstr "Extensions"
#. type: Plain text
-#: en/./developers/01_First_steps.md:65
+#: en/./developers/02_First_steps.md:65
msgid ""
"If you want to create your own FreshRSS extension, take a look at the "
"[extension documentation](03_Backend/05_Extensions.md)."
@@ -566,14 +620,14 @@ msgstr ""
"Si vous souhaitez créer votre propre extension FreshRSS, consultez la "
"[documentation de l’extension](03_Backend/05_Extensions.md)."
-#. type: Title #
-#: en/./developers/01_First_steps.md:66
+#. type: Title ##
+#: en/./developers/02_First_steps.md:66
#, no-wrap
msgid "Coding style"
msgstr "Style de codage"
#. type: Plain text
-#: en/./developers/01_First_steps.md:69
+#: en/./developers/02_First_steps.md:69
msgid ""
"If you want to contribute to the source code, it’s important to follow the "
"project’s coding style. The actual code doesn’t always follow it throughout "
@@ -584,7 +638,7 @@ msgstr ""
"de notre devoir à tous de le changer dès que l’occasion se présente."
#. type: Plain text
-#: en/./developers/01_First_steps.md:71
+#: en/./developers/02_First_steps.md:71
msgid ""
"Contributions which don’t follow the coding style will be rejected as long "
"as the coding style is not fixed."
@@ -593,31 +647,235 @@ msgstr ""
"tant que les corrections nécessaires ne sont pas appliquées."
#. type: Title ##
-#: en/./developers/01_First_steps.md:72
+#: en/./developers/02_First_steps.md:72
+#, no-wrap
+msgid "GitHub Actions"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_First_steps.md:76
+msgid ""
+"The code will be checked for every pull request commit on GitHub via [GitHub "
+"Actions](https://github.com/FreshRSS/FreshRSS/actions). See the "
+"configuration file [`tests.yml`](../../../.github/workflows/tests.yml)."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/02_First_steps.md:77
+#, no-wrap
+msgid "Running fixes & tests"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_First_steps.md:80
+msgid ""
+"Tests can be run locally, e.g. by running `make test-all`, and several "
+"problems can be automatically fixed by running `make fix-all`."
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:81
+#, no-wrap
+msgid ""
+"make fix-all\n"
+"make test-all\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_First_steps.md:87
+msgid ""
+"This requires `make` and `npm` in addition to the FreshRSS requirements. See "
+"below for the precise requirements for a few platforms."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:88
+#, no-wrap
+msgid "Debian / Ubuntu"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_First_steps.md:91
+#, no-wrap
+msgid "> ℹ️ Also applies to [Microsoft Windows](https://docs.microsoft.com/windows/wsl/install-win10) thanks to [WSL](https://ubuntu.com/wsl).\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_First_steps.md:93
+msgid ""
+"Here are the dependencies that need to be manually installed prior to "
+"running the fixes & tests."
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:94
+#, no-wrap
+msgid "sudo apt update && sudo apt install --no-install-recommends -y make npm php-cli php-curl php-mbstring php-xml unzip wget\n"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:98
+#, no-wrap
+msgid "Fedora / Red Hat"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:100
+#, no-wrap
+msgid "yum install -y git make npm php-cli php-curl php-mbstring php-xml php-pdo unzip wget\n"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:104
+#, no-wrap
+msgid "Alpine Linux"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:106
+#, no-wrap
+msgid "apk add git make npm php-cli php-curl php-ctype php-dom php-mbstring php-openssl php-phar php-simplexml php-xml php-pdo php-tokenizer php-xmlreader php-xmlwriter unzip wget\n"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:110
+#, no-wrap
+msgid "Partial fixes & tests"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:114
+msgid ""
+"composer-based: `npm run fix && npm test` or see the [`scripts` section of "
+"`composer.json`](../../../composer.json) for individual tests or fixes such "
+"as `composer phpstan`"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:114
+msgid ""
+"npm-based: `npm run fix && npm test` or see the [`scripts` section of "
+"`package.json`](../../../package.json) for individual tests or fixes such as "
+"`npm run rtlcss`"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:115
+#, no-wrap
+msgid "Tests summary"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_First_steps.md:118
+msgid "A short (not complete) summary:"
+msgstr ""
+
+#. type: Title ####
+#: en/./developers/02_First_steps.md:119
+#, no-wrap
+msgid "PHP"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:127
+msgid "Syntax of `php` and `phtml` files is checked."
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:127
+msgid ""
+"translation files (`i18n`) are checked ([more information about i18n files]"
+"(internationalization.html))."
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:127
+msgid "unit test (`tests`) are run by [PHPunit](https://phpunit.de/)."
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:127 en/./developers/02_First_steps.md:134
+#: en/./developers/02_First_steps.md:139 en/./developers/02_First_steps.md:144
+msgid "Linter:"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./developers/02_First_steps.md:127 en/./developers/02_First_steps.md:134
+msgid "[PHP_Codesniffer (phpcs)](https://github.com/squizlabs/PHP_CodeSniffer)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./developers/02_First_steps.md:127
+msgid "[PHPstan](https://github.com/phpstan/phpstan)"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:128
+#, no-wrap
+msgid "CSS"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./developers/02_First_steps.md:134
+msgid "via npm `.styleintrc.json`"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./developers/02_First_steps.md:134
+msgid "check that RTL (right-to-left) CSS files match to standard CSS files"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:135
+#, fuzzy, no-wrap
+#| msgid "javascript"
+msgid "JavaScript"
+msgstr "javascript"
+
+#. type: Bullet: ' - '
+#: en/./developers/02_First_steps.md:139
+msgid ""
+"via npm `.styleintrc.json` ([ECMAScript 2017](https://en.wikipedia.org/wiki/"
+"ECMAScript#8th_Edition_%E2%80%93_ECMAScript_2017))"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:140
+#, no-wrap
+msgid "Markdown"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./developers/02_First_steps.md:144
+msgid "via npm `.markdownlint.json`"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/02_First_steps.md:145
#, no-wrap
msgid "Spaces, tabs and other whitespace characters"
msgstr "Espaces, tabulations et autres caractères blancs"
#. type: Title ###
-#: en/./developers/01_First_steps.md:74
+#: en/./developers/02_First_steps.md:147
#, no-wrap
msgid "Indentation"
msgstr "Indentation"
#. type: Plain text
-#: en/./developers/01_First_steps.md:76
+#: en/./developers/02_First_steps.md:150
msgid "Code indentation must use tabs."
msgstr ""
"L’indentation du code doit être faite impérativement avec des tabulations."
#. type: Title ###
-#: en/./developers/01_First_steps.md:77
+#: en/./developers/02_First_steps.md:151
#, no-wrap
msgid "Alignment"
msgstr "Alignement"
#. type: Plain text
-#: en/./developers/01_First_steps.md:80
+#: en/./developers/02_First_steps.md:154
msgid ""
"Once the code has been correctly indented, it might be useful to align it "
"for ease of reading. In that case, please use spaces."
@@ -625,26 +883,8 @@ msgstr ""
"Une fois l’indentation faite, il peut être nécessaire de faire un alignement "
"pour simplifier la lecture. Dans ce cas, il faut utiliser les espaces."
-#. type: Code fence info string
-#: en/./developers/01_First_steps.md:81 en/./developers/01_First_steps.md:111
-#: en/./developers/01_First_steps.md:123 en/./developers/01_First_steps.md:158
-#: en/./developers/01_First_steps.md:173 en/./developers/01_First_steps.md:186
-#: en/./developers/01_First_steps.md:196 en/./developers/01_First_steps.md:213
-#: en/./developers/01_First_steps.md:228
-#: en/./developers/03_Backend/05_Extensions.md:47
-#: en/./developers/03_Backend/05_Extensions.md:88
-#: en/./developers/03_Backend/05_Extensions.md:130
-#: en/./developers/03_Backend/05_Extensions.md:149
-#: en/./developers/03_Backend/05_Extensions.md:166
-#: en/./developers/03_Backend/05_Extensions.md:188
-#: en/./developers/03_Backend/05_Extensions.md:225
-#: en/./developers/05_Release_new_version.md:53 en/./users/06_Fever_API.md:107
-#, no-wrap
-msgid "php"
-msgstr "php"
-
-#. type: Plain text
-#: en/./developers/01_First_steps.md:81
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:155
#, no-wrap
msgid ""
"$result = a_function_with_a_really_long_name($param1, $param2,\n"
@@ -654,13 +894,13 @@ msgstr ""
" $param3, $param4);\n"
#. type: Title ###
-#: en/./developers/01_First_steps.md:86
+#: en/./developers/02_First_steps.md:160
#, no-wrap
msgid "End of line"
msgstr "Fin de ligne"
#. type: Plain text
-#: en/./developers/01_First_steps.md:89
+#: en/./developers/02_First_steps.md:163
msgid ""
"The newline character must be a line feed (LF), which is the default line "
"ending on *NIX systems. This character must not follow other white space."
@@ -670,7 +910,7 @@ msgstr ""
"précédé par des caractères blanc."
#. type: Plain text
-#: en/./developers/01_First_steps.md:91
+#: en/./developers/02_First_steps.md:165
msgid ""
"You can verify if there is any unintended white space at the end of line "
"with the following Git command:"
@@ -678,18 +918,8 @@ msgstr ""
"Il est possible de vérifier la présence de caractères blancs en fin de ligne "
"grâce à Git avec la commande suivante :"
-#. type: Code fence info string
-#: en/./developers/01_First_steps.md:92 en/./developers/02_Github.md:80
-#: en/./developers/02_Github.md:85 en/./developers/02_Github.md:90
-#: en/./developers/02_Github.md:96 en/./developers/02_Github.md:102
-#: en/./developers/05_Release_new_version.md:15
-#: en/./developers/05_Release_new_version.md:101
-#, no-wrap
-msgid "bash"
-msgstr "bash"
-
-#. type: Plain text
-#: en/./developers/01_First_steps.md:92
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:166
#, no-wrap
msgid ""
"# command to check files before adding them in the Git index\n"
@@ -703,41 +933,41 @@ msgstr ""
"git diff --check --cached\n"
#. type: Title ###
-#: en/./developers/01_First_steps.md:99 en/./developers/01_First_steps.md:220
+#: en/./developers/02_First_steps.md:173
#, no-wrap
msgid "End of file"
msgstr "Fin de fichier"
#. type: Plain text
-#: en/./developers/01_First_steps.md:102
+#: en/./developers/02_First_steps.md:176
msgid "Every file must end by an empty line."
msgstr "Chaque fichier doit se terminer par une ligne vide."
#. type: Title ###
-#: en/./developers/01_First_steps.md:103
+#: en/./developers/02_First_steps.md:177
#, no-wrap
msgid "Commas, dots and semi-columns"
msgstr "Le cas de la virgule, du point et du point-virgule"
#. type: Plain text
-#: en/./developers/01_First_steps.md:106
+#: en/./developers/02_First_steps.md:180
msgid ""
"There should no space before those characters, but there should be one after."
msgstr "Il n’y a pas d’espace avant ces caractères, il y en a un après."
#. type: Title ###
-#: en/./developers/01_First_steps.md:107 en/./developers/01_First_steps.md:210
+#: en/./developers/02_First_steps.md:181
#, no-wrap
msgid "Operators"
msgstr "Le cas des opérateurs"
#. type: Plain text
-#: en/./developers/01_First_steps.md:110
+#: en/./developers/02_First_steps.md:184
msgid "There should be a space before and after every operator."
msgstr "Chaque opérateur est entouré d’espaces."
-#. type: Plain text
-#: en/./developers/01_First_steps.md:111
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:185
#, no-wrap
msgid ""
"if ($a == 10) {\n"
@@ -753,13 +983,13 @@ msgstr ""
"echo $a ? 1 : 0;\n"
#. type: Title ###
-#: en/./developers/01_First_steps.md:119
+#: en/./developers/02_First_steps.md:193
#, no-wrap
msgid "Parentheses"
msgstr "Le cas des parenthèses"
#. type: Plain text
-#: en/./developers/01_First_steps.md:122
+#: en/./developers/02_First_steps.md:196
msgid ""
"There should be no spaces in between brackets. There should be no spaces "
"before the opening bracket, except if it’s after a keyword. There shouldn’t "
@@ -771,8 +1001,8 @@ msgstr ""
"d’espaces après une parenthèse fermante sauf si elle est suivie d’une "
"accolade ouvrante."
-#. type: Plain text
-#: en/./developers/01_First_steps.md:123
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:197
#, no-wrap
msgid ""
"if ($a == 10) {\n"
@@ -792,16 +1022,23 @@ msgstr ""
"}\n"
#. type: Title ###
-#: en/./developers/01_First_steps.md:133
+#: en/./developers/02_First_steps.md:207
#, no-wrap
msgid "With chained functions"
msgstr "Le cas des fonctions chainées"
#. type: Plain text
-#: en/./developers/01_First_steps.md:136
-msgid ""
-"It happens most of the time in Javascript files. When there are chained "
-"functions with closures and callback functions, it’s hard to understand the "
+#: en/./developers/02_First_steps.md:210
+#, fuzzy
+#| msgid ""
+#| "It happens most of the time in Javascript files. When there are chained "
+#| "functions with closures and callback functions, it’s hard to understand "
+#| "the code if not properly formatted. In those cases, we add a new indent "
+#| "level for the complete instruction and reset the indent for a new "
+#| "instruction on the same level."
+msgid ""
+"It happens most of the time in JavaScript files. When there are chained "
+"functions with closures and call-back functions, it’s hard to understand the "
"code if not properly formatted. In those cases, we add a new indent level "
"for the complete instruction and reset the indent for a new instruction on "
"the same level."
@@ -812,14 +1049,8 @@ msgstr ""
"supplémentaire pour toute l’instruction et on revient au même niveau pour "
"une instruction de mĂŞme niveau."
-#. type: Code fence info string
-#: en/./developers/01_First_steps.md:137
-#, no-wrap
-msgid "javascript"
-msgstr "javascript"
-
-#. type: Plain text
-#: en/./developers/01_First_steps.md:137
+#. type: Fenced code block (javascript)
+#: en/./developers/02_First_steps.md:211
#, no-wrap
msgid ""
"// First instruction\n"
@@ -849,13 +1080,13 @@ msgstr ""
"\t});\n"
#. type: Title ##
-#: en/./developers/01_First_steps.md:152
+#: en/./developers/02_First_steps.md:226
#, no-wrap
msgid "Line length"
msgstr "Longueur des lignes"
#. type: Plain text
-#: en/./developers/01_First_steps.md:155
+#: en/./developers/02_First_steps.md:229
msgid ""
"Lines should strive to be shorter than 80 characters. However, this limit "
"may be extended to 100 characters when strictly necessary."
@@ -866,14 +1097,14 @@ msgstr ""
"caractères."
#. type: Plain text
-#: en/./developers/01_First_steps.md:157
+#: en/./developers/02_First_steps.md:231
msgid "With functions, parameters can be declared on multiple lines."
msgstr ""
"Dans le cas des fonctions, les paramètres peuvent être déclarés sur "
"plusieurs lignes."
-#. type: Plain text
-#: en/./developers/01_First_steps.md:158
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:232
#, no-wrap
msgid ""
"function my_function($param_1, $param_2,\n"
@@ -887,13 +1118,13 @@ msgstr ""
"}\n"
#. type: Title ##
-#: en/./developers/01_First_steps.md:165
+#: en/./developers/02_First_steps.md:239
#, no-wrap
msgid "Naming"
msgstr "Nommage"
#. type: Plain text
-#: en/./developers/01_First_steps.md:168
+#: en/./developers/02_First_steps.md:242
msgid ""
"All code elements (functions, classes, methods and variables) must describe "
"their usage succinctly."
@@ -902,20 +1133,20 @@ msgstr ""
"doivent être nommés de manière à décrire leur usage de façon concise."
#. type: Title ###
-#: en/./developers/01_First_steps.md:169
+#: en/./developers/02_First_steps.md:243
#, no-wrap
msgid "Functions and variables"
msgstr "Fonctions et variables"
#. type: Plain text
-#: en/./developers/01_First_steps.md:172
+#: en/./developers/02_First_steps.md:246
msgid ""
"Functions and variables must follow the \"snake case\" naming convention."
msgstr ""
"Les fonctions et les variables doivent suivre la convention \"snake case\"."
-#. type: Plain text
-#: en/./developers/01_First_steps.md:173
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:247
#, no-wrap
msgid ""
"// a function\n"
@@ -933,18 +1164,18 @@ msgstr ""
"$nom_de_la_variable;\n"
#. type: Title ###
-#: en/./developers/01_First_steps.md:182
+#: en/./developers/02_First_steps.md:256
#, no-wrap
msgid "Methods"
msgstr "Méthodes"
#. type: Plain text
-#: en/./developers/01_First_steps.md:185
+#: en/./developers/02_First_steps.md:259
msgid "Methods must follow the \"lower camel case\" naming convention."
msgstr "Les méthodes doivent suivre la convention \"lower camel case\"."
-#. type: Plain text
-#: en/./developers/01_First_steps.md:186
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:260
#, no-wrap
msgid ""
"private function methodName() {\n"
@@ -956,41 +1187,41 @@ msgstr ""
"}\n"
#. type: Title ###
-#: en/./developers/01_First_steps.md:192
+#: en/./developers/02_First_steps.md:266
#, no-wrap
msgid "Classes"
msgstr "Classes"
#. type: Plain text
-#: en/./developers/01_First_steps.md:195
+#: en/./developers/02_First_steps.md:269
msgid "Classes must follow the \"upper camel case\" naming convention."
msgstr "Les classes doivent suivre la convention \"upper camel case\"."
-#. type: Plain text
-#: en/./developers/01_First_steps.md:196
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:270
#, no-wrap
msgid "abstract class ClassName {}\n"
msgstr "abstract class NomDeLaClasse {}\n"
#. type: Title ##
-#: en/./developers/01_First_steps.md:200
+#: en/./developers/02_First_steps.md:274
#, no-wrap
msgid "Encoding"
msgstr "Encodage"
#. type: Plain text
-#: en/./developers/01_First_steps.md:203
+#: en/./developers/02_First_steps.md:277
msgid "Files must be encoded with the UTF-8 character set."
msgstr "Les fichiers doivent être encodés en UTF-8."
#. type: Title ##
-#: en/./developers/01_First_steps.md:204
+#: en/./developers/02_First_steps.md:278
#, no-wrap
msgid "PHP compatibility"
msgstr "Compatibilité PHP"
#. type: Plain text
-#: en/./developers/01_First_steps.md:207
+#: en/./developers/02_First_steps.md:281
msgid ""
"Please ensure that your code works with the oldest PHP version officially "
"supported by FreshRSS."
@@ -998,14 +1229,20 @@ msgstr ""
"Assurez-vous que votre code fonctionne avec une version de PHP aussi "
"ancienne que celle que FreshRSS supporte officiellement."
-#. type: Title ##
-#: en/./developers/01_First_steps.md:208
+#. type: Title ###
+#: en/./developers/02_First_steps.md:282 en/./developers/OPML.md:47
#, no-wrap
msgid "Miscellaneous"
msgstr "Divers"
+#. type: Title ###
+#: en/./developers/02_First_steps.md:284
+#, no-wrap
+msgid "Operators on multiple lines"
+msgstr ""
+
#. type: Plain text
-#: en/./developers/01_First_steps.md:212
+#: en/./developers/02_First_steps.md:287
msgid ""
"Operators must be at the end of the line if a condition is split over more "
"than one line."
@@ -1013,8 +1250,8 @@ msgstr ""
"Les opérateurs doivent être en fin de ligne dans le cas de conditions sur "
"plusieurs lignes."
-#. type: Plain text
-#: en/./developers/01_First_steps.md:213
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:288
#, no-wrap
msgid ""
"if ($a == 10 ||\n"
@@ -1027,8 +1264,15 @@ msgstr ""
"\t// faire quelque chose\n"
"}\n"
+#. type: Title ###
+#: en/./developers/02_First_steps.md:295
+#, fuzzy, no-wrap
+#| msgid "End of file"
+msgid "End of PHP file"
+msgstr "Fin de fichier"
+
#. type: Plain text
-#: en/./developers/01_First_steps.md:223
+#: en/./developers/02_First_steps.md:298
msgid ""
"If the file contains only PHP code, the PHP closing tag must be omitted."
msgstr ""
@@ -1036,13 +1280,13 @@ msgstr ""
"fermante."
#. type: Title ###
-#: en/./developers/01_First_steps.md:224
+#: en/./developers/02_First_steps.md:299
#, no-wrap
msgid "Arrays"
msgstr "Tableaux"
#. type: Plain text
-#: en/./developers/01_First_steps.md:227
+#: en/./developers/02_First_steps.md:302
msgid ""
"If an array declaration runs on more than one line, each element must be "
"followed by a comma, including the last one."
@@ -1050,8 +1294,8 @@ msgstr ""
"Lors de l’écriture de tableaux sur plusieurs lignes, tous les éléments "
"doivent être suivis d’une virgule (même le dernier)."
-#. type: Plain text
-#: en/./developers/01_First_steps.md:228
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:303
#, no-wrap
msgid ""
"$variable = [\n"
@@ -1069,347 +1313,17 @@ msgstr ""
#. type: Title #
#: en/./developers/02_Github.md:1
#, no-wrap
-msgid "Reporting a bug or a suggestion"
-msgstr "Remonter un problème ou une suggestion"
-
-#. type: Plain text
-#: en/./developers/02_Github.md:4
-msgid ""
-"Despite the care given to FreshRSS, it’s still possible that bugs occur. The "
-"project is young and development is dynamic, so it can be corrected quickly. "
-"You might also have a feature in mind that doesn’t yet exist. Regardless "
-"whether your idea seems silly, far-fetched, useless or too specific, please "
-"don’t hesitate to propose it to us! “Ideas in the air” often find an "
-"attentive ear. It’s new external perspectives that make the project evolve "
-"the most."
-msgstr ""
-"Malgré le soin apporté à FreshRSS, il se peut que des bugs apparaissent "
-"encore. Le projet est jeune et le développement dynamique, aussi celui-ci "
-"pourra être corrigé rapidement. Il se peut aussi que vous ayez en tête une "
-"fonctionnalité qui n’existe pas encore. Que celle-ci vous paraisse idiote, "
-"farfelue, inutile ou trop spécifique, il ne faut surtout pas hésiter à nous "
-"la proposer ! Très souvent des « idées en l’air » ont trouvé une oreille "
-"attentive. Ce sont les regards externes qui font le plus évoluer le projet."
-
-#. type: Plain text
-#: en/./developers/02_Github.md:6
-msgid ""
-"If you’re convinced that you should be heard, here’s how you can go about it."
-msgstr ""
-"Si vous êtes convaincus qu’il faut vous faire entendre, voici la marche à "
-"suivre."
-
-#. type: Title ##
-#: en/./developers/02_Github.md:7
-#, no-wrap
-msgid "On GitHub"
-msgstr "Sur GitHub"
-
-#. type: Plain text
-#: en/./developers/02_Github.md:10
-msgid ""
-"GitHub is the ideal platform to submit your requests. It allows us to "
-"discuss a problem or suggestion with others and it often generates new "
-"ideas. Let’s not neglect this “social” aspect!"
-msgstr ""
-"GitHub est la plate-forme à privilégier pour vos demandes. En effet, cela "
-"nous permet de pouvoir discuter à plusieurs sur un problème ou une "
-"suggestion et de faire émerger, souvent, des idées nouvelles. Ne négligeons "
-"pas cet aspect « social » !"
-
-#. type: Bullet: ' 1. '
-#: en/./developers/02_Github.md:16
-msgid ""
-"[Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/issues)"
-msgstr ""
-"[Rendez-vous sur le gestionnaire de tickets de bugs](https://github.com/"
-"FreshRSS/FreshRSS/issues)"
-
-#. type: Bullet: ' 2. '
-#: en/./developers/02_Github.md:16
-msgid ""
-"Start by checking if a similar request hasn’t already been made. If so, "
-"please feel free to add your voice to the request."
-msgstr ""
-"Commencez par rechercher si une demande similaire n’a pas déjà été faite. Si "
-"oui, n’hésitez pas à ajouter votre voix à la demande."
-
-#. type: Bullet: ' 3. '
-#: en/./developers/02_Github.md:16
-msgid ""
-"If your request is new, [open a new bug ticket](https://github.com/FreshRSS/"
-"FreshRSS/issues/new)"
-msgstr ""
-"Si votre demande est nouvelle, [ouvrez un nouveau ticket de bug](https://"
-"github.com/FreshRSS/FreshRSS/issues/new)"
-
-#. type: Bullet: ' 4. '
-#: en/./developers/02_Github.md:16
-msgid ""
-"Finally, write your request. If you’re fluent in English, it’s the preferred "
-"language because it allows for discussion with the largest number of people."
-msgstr ""
-"Rédigez enfin votre demande. Si vous maitrisez l’anglais, c’est la langue à "
-"privilégier car cela permet d’ouvrir la discussion à un plus grand nombre de "
-"personnes. Sinon, ce n’est pas grave, continuez en français :)"
-
-#. type: Bullet: ' 5. '
-#: en/./developers/02_Github.md:16
-msgid ""
-"Please follow the tips below to make it easier to let your ticket be heard."
-msgstr ""
-"Merci de bien vouloir suivre les quelques conseils donnés plus bas pour "
-"faciliter la prise en compte de votre ticket."
-
-#. type: Title ##
-#: en/./developers/02_Github.md:17
-#, no-wrap
-msgid "Informal"
-msgstr "De façon informelle"
-
-#. type: Plain text
-#: en/./developers/02_Github.md:20
-msgid ""
-"Not everyone likes or uses GitHub for a variety of legitimate reasons. That "
-"is why you can also contact us in a more informal way."
-msgstr ""
-"Tout le monde n’aime pas ou n’utilise pas GitHub pour des raisons aussi "
-"diverses que légitimes. C’est pourquoi vous pouvez aussi nous contacter de "
-"façon plus informelle."
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:26
-msgid ""
-"On [our Mattermost chat](https://framateam.org/signup_user_complete/?"
-"id=e2680d3e3128b9fac8fdb3003b0024ee)"
-msgstr ""
-"Sur [notre chat Mattermost](https://framateam.org/signup_user_complete/?"
-"id=e2680d3e3128b9fac8fdb3003b0024ee)"
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:26
-msgid ""
-"On [the mailing lists](https://freshrss.org/announce-of-the-mailing-lists."
-"html)"
-msgstr ""
-"Sur [les listes de diffusion](https://freshrss.org/announce-of-the-mailing-"
-"lists.html)"
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:26
-msgid "At events / meetings around Free Software"
-msgstr "À des évènements / rencontres autour du Logiciel Libre"
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:26
-msgid "Over a beer in a bar"
-msgstr "Autour d’une bière dans un bar"
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:26
-msgid "Etc."
-msgstr "Etc."
-
-#. type: Title ##
-#: en/./developers/02_Github.md:27
-#, no-wrap
-msgid "Tips"
-msgstr "Conseils"
-
-#. type: Plain text
-#: en/./developers/02_Github.md:30
-msgid "Here are some tips to help you present your bug report or suggestion:"
-msgstr ""
-"Voici quelques conseils pour bien présenter votre remontée de bug ou votre "
-"suggestion :"
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"**Pay attention to spelling**. Even if it’s not always easy, try your best!"
-msgstr ""
-"**Faites attention à l’orthographe.** même si ce n’est pas toujours facile, "
-"faites votre maximum. ;)"
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"**Give an explicit title to your request**, even if it’s a bit long. This "
-"not only helps us understand your request, but also to find your ticket "
-"later."
-msgstr ""
-"**Donnez un titre explicite à votre demande**, quitte à ce qu’il soit un peu "
-"long. Cela nous aide non seulement Ă  comprendre votre demande, mais aussi Ă  "
-"retrouver votre ticket plus tard."
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"**One request = one ticket.** You may have lots of ideas while being afraid "
-"to spam the bug manager: it doesn’t matter. It’s better to have a few too "
-"many tickets than too many requests in one. We’ll close and consolidate "
-"requests when possible."
-msgstr ""
-"**Une demande = un ticket.** Vous pouvez avoir des tas d’idées mais vous "
-"avez peur de spammer le gestionnaire de bugs : ça ne fait rien. Il vaut "
-"mieux avoir un peu trop de tickets que trop de demandes dans un seul. On "
-"s’occupera de fermer et regrouper les demandes qui le peuvent."
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"If you report a bug, think about **providing us with the FreshRSS logs** "
-"(accessible in the FreshRSS `data/log/` folder) and the **PHP logs** (the "
-"location may vary by distribution, but consider searching in `/var/log/"
-"httpd` or `/var/log/apache`)."
-msgstr ""
-"Si vous remontez un bug, pensez Ă  nous **fournir les logs de FreshRSS** "
-"(accessibles dans les dossier ''data/log/'' de FreshRSS) **et PHP** "
-"(l’emplacement peut varier selon les distributions, mais pensez à chercher "
-"dans ''/var/log/httpd'' ou ''/var/log/apache'')."
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"If you can’t find the log files, specify it in your ticket so we know you’ve "
-"already searched."
-msgstr ""
-"Si vous ne trouvez pas les fichiers de logs, précisez-le dans votre ticket "
-"afin que nous sachions que vous avez déjà cherché."
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"Not all bugs require logs, but if you have any doubts, it is better to "
-"provide them to us. Logs are important and very useful for debugging!"
-msgstr ""
-"Tous les bugs ne nécessitent pas les logs, mais si vous doutez, mieux vaut "
-"nous les fournir. Les logs sont importants et très utiles pour débugguer !"
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"The logs may reveal confidential information, so **be careful not to "
-"disclose anything sensitive.**"
-msgstr ""
-"Il se peut que les logs puissent révéler des informations plus ou moins "
-"confidentielles, **faites attention Ă  ne rien divulguer de sensible.**"
-
-#. type: Plain text
-#: en/./developers/02_Github.md:41
-msgid ""
-"In addition, when facing a bug, you’re encouraged to follow this message "
-"format (from the [Sam & Max website](http://sametmax.com/template-de-demande-"
-"daide-en-informatique/):"
-msgstr ""
-"De plus, face Ă  un bug, je ne peux que vous encourager Ă  suivre le format de "
-"message suivant (tiré du [site de Sam & Max](http://sametmax.com/template-de-"
-"demande-daide-en-informatique/)) :"
-
-#. type: Title ###
-#: en/./developers/02_Github.md:42
-#, no-wrap
-msgid "What’s my goal?"
-msgstr "Quel est mon objectif ?"
-
-#. type: Plain text
-#: en/./developers/02_Github.md:45
-msgid "Give the general context of what you were trying to do."
-msgstr "Donnez le contexte général de ce que vous essayiez de faire."
-
-#. type: Title ###
-#: en/./developers/02_Github.md:46
-#, no-wrap
-msgid "What have I been trying to do?"
-msgstr "Qu’est-ce que j’ai essayé de faire ?"
-
-#. type: Plain text
-#: en/./developers/02_Github.md:49
-msgid ""
-"Explain step by step what you have done so that we can reproduce the bug."
-msgstr ""
-"Expliquez pas Ă  pas ce que vous avez fait afin que nous puissions reproduire "
-"le bug."
-
-#. type: Title ###
-#: en/./developers/02_Github.md:50
-#, no-wrap
-msgid "What results have I achieved?"
-msgstr "Quels résultats ai-je obtenus ?"
-
-#. type: Plain text
-#: en/./developers/02_Github.md:53
-msgid ""
-"The bug: what you see that shouldn’t have happened. Here you can provide the "
-"logs."
-msgstr ""
-"Le bug : ce que vous voyez qui n’aurez pas dû se passer. Ici vous pouvez "
-"fournir les logs."
-
-#. type: Title ###
-#: en/./developers/02_Github.md:54
-#, no-wrap
-msgid "What was the expected result?"
-msgstr "Quel était le résultat attendu ?"
-
-#. type: Plain text
-#: en/./developers/02_Github.md:57
-msgid "So that we understand what you consider to be the problem."
-msgstr ""
-"Afin que nous comprenions bien où est le problème… au moins selon vous :p"
-
-#. type: Title ###
-#: en/./developers/02_Github.md:58
-#, no-wrap
-msgid "What are my circumstances?"
-msgstr "Quelle est ma situation ?"
-
-#. type: Plain text
-#: en/./developers/02_Github.md:61
-msgid "Remember to give the following information if you know it:"
-msgstr "Pensez Ă  donner les informations suivantes si vous les connaissez :"
-
-#. type: Bullet: ' 1. '
-#: en/./developers/02_Github.md:67
-msgid "Which browser? Which version?"
-msgstr "Quel navigateur ? Quelle version ?"
-
-#. type: Bullet: ' 2. '
-#: en/./developers/02_Github.md:67
-msgid "Which server: Apache, Nginx? Which version?"
-msgstr "Quel serveur : Apache, Nginx ? Quelle version ?"
-
-#. type: Bullet: ' 3. '
-#: en/./developers/02_Github.md:67
-msgid "Which version of PHP?"
-msgstr "Quelle version de PHP ?"
-
-#. type: Bullet: ' 4. '
-#: en/./developers/02_Github.md:67
-msgid "Which database: SQLite, MySQL, MariaDB, PostgreSQL? Which version?"
-msgstr ""
-"Quelle base de données : SQLite, MySQL, MariaDB, PostgreSQL ? Quelle "
-"version ?"
-
-#. type: Bullet: ' 5. '
-#: en/./developers/02_Github.md:67
-msgid "Which distribution runs on the server? And… which version?"
-msgstr "Quelle distribution sur le serveur ? Et… quelle version ?"
-
-#. type: Title #
-#: en/./developers/02_Github.md:68
-#, no-wrap
msgid "Branching"
msgstr "Système de branches"
#. type: Title ##
-#: en/./developers/02_Github.md:70
+#: en/./developers/02_Github.md:3
#, no-wrap
msgid "Basic"
msgstr "Élémentaire"
#. type: Plain text
-#: en/./developers/02_Github.md:72
+#: en/./developers/02_Github.md:6
msgid ""
"If you are new to Git, here are some of the resources you might find useful:"
msgstr ""
@@ -1417,63 +1331,63 @@ msgstr ""
"ĂŞtre utiles :"
#. type: Bullet: '* '
-#: en/./developers/02_Github.md:77
+#: en/./developers/02_Github.md:11
msgid "[GitHub’s blog post](https://github.com/blog/120-new-to-git)"
msgstr "[Article du blog de GitHub](https://github.com/blog/120-new-to-git)"
#. type: Bullet: '* '
-#: en/./developers/02_Github.md:77
+#: en/./developers/02_Github.md:11
msgid "<http://try.github.com/>"
msgstr "<http://try.github.com/>"
#. type: Bullet: '* '
-#: en/./developers/02_Github.md:77
+#: en/./developers/02_Github.md:11
msgid "<http://sixrevisions.com/resources/git-tutorials-beginners/>"
msgstr "<http://sixrevisions.com/resources/git-tutorials-beginners/>"
#. type: Bullet: '* '
-#: en/./developers/02_Github.md:77
+#: en/./developers/02_Github.md:11
msgid "<http://rogerdudler.github.io/git-guide/>"
msgstr "<http://rogerdudler.github.io/git-guide/>"
#. type: Title ##
-#: en/./developers/02_Github.md:78
+#: en/./developers/02_Github.md:12
#, no-wrap
msgid "Getting the latest code from the FreshRSS repository"
msgstr "Obtenir le dernier code du répertoire FreshRSS"
#. type: Plain text
-#: en/./developers/02_Github.md:80
+#: en/./developers/02_Github.md:15
msgid "First you need to add the official repo to your remote repo list:"
msgstr ""
"Vous devez avant tout ajouter le repo officiel Ă  votre liste de repo remote :"
-#. type: Plain text
-#: en/./developers/02_Github.md:80
+#. type: Fenced code block (sh)
+#: en/./developers/02_Github.md:16
#, no-wrap
msgid "git remote add upstream git@github.com:FreshRSS/FreshRSS.git\n"
msgstr "git remote add upstream git@github.com:FreshRSS/FreshRSS.git\n"
#. type: Plain text
-#: en/./developers/02_Github.md:85
+#: en/./developers/02_Github.md:21
msgid "You can verify the remote repo is successfully added by using:"
msgstr ""
"Vous pouvez vérifier que le repo remote a été ajouté avec succès en "
"utilisant :"
-#. type: Plain text
-#: en/./developers/02_Github.md:85
+#. type: Fenced code block (sh)
+#: en/./developers/02_Github.md:22
#, no-wrap
msgid "git remote -v show\n"
msgstr "git remote -v show\n"
#. type: Plain text
-#: en/./developers/02_Github.md:90
+#: en/./developers/02_Github.md:27
msgid "Now you can pull the latest development code:"
msgstr "Vous pouvez maintenant pull le dernier code de développement :"
-#. type: Plain text
-#: en/./developers/02_Github.md:90
+#. type: Fenced code block (sh)
+#: en/./developers/02_Github.md:28
#, no-wrap
msgid ""
"git checkout edge\n"
@@ -1483,25 +1397,25 @@ msgstr ""
"git pull upstream edge\n"
#. type: Title ##
-#: en/./developers/02_Github.md:95
+#: en/./developers/02_Github.md:33
#, no-wrap
msgid "Starting a new development branch"
msgstr "Lancer une nouvelle branche de développement"
-#. type: Plain text
-#: en/./developers/02_Github.md:96
+#. type: Fenced code block (sh)
+#: en/./developers/02_Github.md:35
#, no-wrap
msgid "git checkout -b my-development-branch\n"
msgstr "git checkout -b mon-branch-developpement\n"
-#. type: Title #
-#: en/./developers/02_Github.md:100
+#. type: Title ##
+#: en/./developers/02_Github.md:39
#, no-wrap
msgid "Sending a patch"
msgstr "Proposer un patch"
-#. type: Plain text
-#: en/./developers/02_Github.md:102
+#. type: Fenced code block (sh)
+#: en/./developers/02_Github.md:41
#, no-wrap
msgid ""
"# Add the changed file, here actualize_script.php\n"
@@ -1523,33 +1437,37 @@ msgstr ""
"git push\n"
#. type: Plain text
-#: en/./developers/02_Github.md:114
+#: en/./developers/02_Github.md:53
msgid "Now you can create a PR based on your branch."
msgstr "Vous pouvez maintenant créer une PR en fonction de votre branche."
#. type: Title ##
-#: en/./developers/02_Github.md:115
+#: en/./developers/02_Github.md:54
#, no-wrap
msgid "How to write a commit message"
msgstr "Comment écrire un message de commit"
#. type: Plain text
-#: en/./developers/02_Github.md:118
+#: en/./developers/02_Github.md:57
+#, fuzzy
+#| msgid ""
+#| "A commit message should succintly describe the changes on the first line. "
+#| "For example:"
msgid ""
-"A commit message should succintly describe the changes on the first line. "
+"A commit message should succinctly describe the changes on the first line. "
"For example:"
msgstr ""
"Un message de commit devrait décrire succinctement les changements sur la "
"première ligne. Par exemple :"
#. type: Plain text
-#: en/./developers/02_Github.md:120
+#: en/./developers/02_Github.md:59
#, no-wrap
msgid "> Fix broken icon\n"
msgstr "> Fixe une icône cassée\n"
#. type: Plain text
-#: en/./developers/02_Github.md:122
+#: en/./developers/02_Github.md:61
msgid ""
"If necessary, this can be followed by a blank line and a longer explanation."
msgstr ""
@@ -1557,79 +1475,46 @@ msgstr ""
"suivre."
#. type: Plain text
-#: en/./developers/02_Github.md:123
+#: en/./developers/02_Github.md:62
msgid "For further tips, see [here](https://chris.beams.io/posts/git-commit/)."
msgstr ""
"Pour d’autres conseils, voir [ici](https://chris.beams.io/posts/git-commit/)."
#. type: Title #
-#: en/./developers/03_Backend/02_Minz.md:1
-#, no-wrap
-msgid "Models"
-msgstr "Modèles"
-
-#. type: Title #
-#: en/./developers/03_Backend/02_Minz.md:5
-#, no-wrap
-msgid "Controllers and actions"
-msgstr "ContrĂ´leurs et actions"
-
-#. type: Title ###
-#: en/./developers/03_Backend/02_Minz.md:9
-#: en/./developers/03_Backend/05_Extensions.md:69
-#, no-wrap
-msgid "Views"
-msgstr "Vues"
-
-#. type: Title ###
-#: en/./developers/03_Backend/02_Minz.md:13
-#: en/./developers/03_Backend/05_Extensions.md:39
-#, no-wrap
-msgid "Routing"
-msgstr "Routage"
-
-#. type: Title #
-#: en/./developers/03_Backend/02_Minz.md:17
-#, no-wrap
-msgid "Writing URL"
-msgstr "Écriture des URL"
-
-#. type: Title #
-#: en/./developers/03_Backend/02_Minz.md:21
-#: en/./developers/04_Frontend/01_View_files.md:13
-#, no-wrap
-msgid "Internationalisation"
-msgstr "Internationalisation"
-
-#. type: Title #
-#: en/./developers/03_Backend/02_Minz.md:25
+#: en/./developers/03_Backend/01_Database_schema.md:1
#, no-wrap
-msgid "Understanding internals"
-msgstr "Comprendres les mécanismes internes"
+msgid "Database Schema"
+msgstr ""
-#. type: Title #
-#: en/./developers/03_Backend/04_Changing_source_code.md:1
-#, no-wrap
-msgid "Accessing the database"
-msgstr "Accès à la base de données"
+#. type: Plain text
+#: en/./developers/03_Backend/01_Database_schema.md:4
+#: en/./developers/03_Backend/05_Extensions.md:169
+#: en/./developers/04_Frontend/01_View_files.md:6
+#: en/./developers/04_Frontend/01_View_files.md:10
+#: en/./developers/04_Frontend/01_View_files.md:14
+#: en/./developers/04_Frontend/01_View_files.md:17
+#: en/./users/05_Configuration.md:185
+#, fuzzy, no-wrap
+#| msgid "**TODO**\n"
+msgid "> **TODO**\n"
+msgstr "**Ă€ FAIRE**\n"
-#. type: Title #
-#: en/./developers/03_Backend/04_Changing_source_code.md:5
+#. type: Title ##
+#: en/./developers/03_Backend/01_Database_schema.md:5
#, no-wrap
-msgid "Writing an action and its related view"
-msgstr "Écrire une action et sa vue associée"
+msgid "See also"
+msgstr ""
-#. type: Title #
-#: en/./developers/03_Backend/04_Changing_source_code.md:9
-#, no-wrap
-msgid "Authentication"
-msgstr "Gestion de l’authentification"
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/01_Database_schema.md:7
+msgid "[Database configuration](../../admins/DatabaseConfig.md)"
+msgstr ""
#. type: Title #
-#: en/./developers/03_Backend/04_Changing_source_code.md:13
+#: en/./developers/03_Backend/03_External_libraries.md:1
#, no-wrap
-msgid "Logs"
-msgstr "Gestion des logs"
+msgid "External Libraries"
+msgstr ""
#. type: Title #
#: en/./developers/03_Backend/05_Extensions.md:1
@@ -1743,788 +1628,26 @@ msgstr ""
"façon officielle. Cela permet de proposer un « proof of concept » assez "
"facilement."
-#. type: Title ##
+#. type: Title #
#: en/./developers/03_Backend/05_Extensions.md:25
+#: en/./developers/Minz/index.md:1
#, no-wrap
-msgid "Understanding basic mechanics (Minz and MVC)"
-msgstr "Comprendre les mécaniques de base (Minz et MVC)"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:28
-#, no-wrap
-msgid "**TODO** : move to 02_Minz.md\n"
-msgstr "**TODO** : bouger dans 02_Minz.md\n"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:30
-msgid ""
-"This data sheet should refer to the official FreshRSS and Minz documentation "
-"(the PHP framework on which FreshRSS is based). Unfortunately, this "
-"documentation does not yet exist. In a few words, here are the main things "
-"you should know. It is not necessary to read all the chapters in this "
-"section if you don’t need to use a feature in your extension (if you don’t "
-"need to translate your extension, no need to know more about the "
-"`Minz_Translate` module for example)."
+msgid "Minz Framework"
msgstr ""
-"Cette fiche technique devrait renvoyer vers la documentation officielle de "
-"FreshRSS et de Minz (le framework PHP sur lequel repose FreshRSS). "
-"Malheureusement cette documentation n’existe pas encore. Voici donc en "
-"quelques mots les principaux éléments à connaître. Il n’est pas nécessaire "
-"de lire l’ensemble des chapitres de cette section si vous n’avez pas à "
-"utiliser une fonctionnalité dans votre extension (si vous n’avez pas besoin "
-"de traduire votre extension, pas besoin d’en savoir plus sur le module "
-"`Minz_Translate` par exemple)."
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:31
-#, no-wrap
-msgid "MVC Architecture"
-msgstr "Architecture MVC"
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:34
-msgid ""
-"Minz relies on and imposes an MVC architecture on projects using it. This "
-"architecture consists of three main components:"
-msgstr ""
-"Minz repose et impose une architecture MVC pour les projets l’utilisant. On "
-"distingue dans cette architecture trois composants principaux :"
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:38
-msgid ""
-"The model: this is the base object that we will manipulate. In FreshRSS, "
-"categories, flows and articles are templates. The part of the code that "
-"makes it possible to manipulate them in a database is also part of the model "
-"but is separated from the base model: we speak of DAO (for \"Data Access "
-"Object\"). The templates are stored in a `Models` folder."
-msgstr ""
-"Le Modèle : c’est l’objet de base que l’on va manipuler. Dans FreshRSS, les "
-"catégories, les flux et les articles sont des modèles. La partie du code qui "
-"permet de les manipuler en base de données fait aussi partie du modèle mais "
-"est séparée du modèle de base : on parle de DAO (pour « Data Access Object "
-"»). Les modèles sont stockés dans un répertoire `Models`."
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:38
-msgid ""
-"The view: this is what the user sees. The view is therefore simply HTML code "
-"mixed with PHP to display dynamic information. The views are stored in a "
-"`views` folder."
-msgstr ""
-"La Vue : c’est ce qui représente ce que verra l’utilisateur. La vue est donc "
-"simplement du code HTML que l’on mixe avec du PHP pour afficher les "
-"informations dynamiques. Les vues sont stockées dans un répertoire `views`."
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:38
-msgid ""
-"The controller: this is what makes it possible to link models and views. "
-"Typically, a controller will load templates from the database (like a list "
-"of items) to \"pass\" them to a view for display. Controllers are stored in "
-"a `Controllers` directory."
-msgstr ""
-"Le Contrôleur : c’est ce qui permet de lier modèles et vues entre eux. "
-"Typiquement, un contrôleur va charger des modèles à partir de la base de "
-"données (une liste d’articles par exemple) pour les « passer » à une vue "
-"afin qu’elle les affiche. Les contrôleurs sont stockés dans un répertoire "
-"`Controllers`."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:42
-msgid ""
-"In order to link a URL to a controller, first you have to go through a "
-"\"routing\" phase. In FreshRSS, this is particularly simple because it "
-"suffices to specify the name of the controller to load into the URL using a "
-"`c` parameter. For example, the address http://exemple.com?c=hello will "
-"execute the code contained in the `hello` controller."
-msgstr ""
-"Afin de lier une URL à un contrôleur, on doit passer par une phase dite de « "
-"routage ». Dans FreshRSS, cela est particulièrement simple car il suffit "
-"d’indiquer le nom du contrôleur à charger dans l’URL à l’aide d’un paramètre "
-"`c`. Par exemple, l’adresse http://exemple.com?c=hello va exécuter le code "
-"contenu dans le contrĂ´leur `hello`."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:44
-msgid ""
-"One concept that has not yet been discussed is the \"actions\" system. An "
-"action is executed *on* a controller. Concretely, a controller is "
-"represented by a class and its actions by methods. To execute an action, it "
-"is necessary to specify an `a` parameter in the URL."
-msgstr ""
-"Une notion qui n’a pas encore été évoquée est le système d'« actions ». Une "
-"action est exécutée *sur* un contrôleur. Concrètement, un contrôleur va être "
-"représenté par une classe et ses actions par des méthodes. Pour exécuter une "
-"action, il est nécessaire d’indiquer un paramètre `a` dans l’URL."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:46
-#: en/./developers/03_Backend/05_Extensions.md:165
-msgid "Code example:"
-msgstr "Exemple de code :"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:47
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"class FreshRSS_hello_Controller extends FreshRSS_ActionController {\n"
-"\tpublic function indexAction() {\n"
-"\t\t$this->view->a_variable = 'FooBar';\n"
-"\t}\n"
-"\n"
-"\tpublic function worldAction() {\n"
-"\t\t$this->view->a_variable = 'Hello World!';\n"
-"\t}\n"
-"}\n"
-"\n"
-"?>\n"
-msgstr ""
-"<?php\n"
-"\n"
-"class FreshRSS_hello_Controller extends FreshRSS_ActionController {\n"
-"\tpublic function indexAction() {\n"
-"\t\t$this->view->a_variable = 'FooBar';\n"
-"\t}\n"
-"\n"
-"\tpublic function worldAction() {\n"
-"\t\t$this->view->a_variable = 'Hello World!';\n"
-"\t}\n"
-"}\n"
-"\n"
-"?>\n"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:64
-msgid ""
-"When loading the address http://exemple.com?c=hello&a=world, the `world` "
-"action is executed on the `hello` controller."
-msgstr ""
-"Si l’on charge l’adresse http://exemple.com?c=hello&a=world, l’action "
-"`world` va donc être exécutée sur le contrôleur `hello`."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:66
-msgid ""
-"Note: if `c` or `a` is not specified, the default value for each of these "
-"variables is `index`. So the address http://exemple.com?c=hello will execute "
-"the `index` action of the `hello` controller."
-msgstr ""
-"Note : si `c` ou `a` n’est pas précisée, la valeur par défaut de chacune de "
-"ces variables est `index`. Ainsi l’adresse http://exemple.com?c=hello va "
-"exécuter l’action `index` du contrôleur `hello`."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:68
-msgid ""
-"From now on, the `hello/world` naming convention will be used to refer to a "
-"controller/action pair."
-msgstr ""
-"Plus loin, sera utilisée la convention `hello/world` pour évoquer un couple "
-"contrĂ´leur/action."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:72
-msgid ""
-"Each view is associated with a controller and an action. The view associated "
-"with `hello/world` will be stored in a very specific file: `views/hello/"
-"world. phtml`. This convention is imposed by Minz."
-msgstr ""
-"Chaque vue est associée à un contrôleur et à une action. La vue associée à "
-"`hello/world` va être stockée dans un fichier bien spécifique : `views/hello/"
-"world.phtml`. Cette convention est imposée par Minz."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:74
-msgid ""
-"As explained above, the views consist of HTML mixed with PHP. Code example:"
-msgstr ""
-"Comme expliqué plus haut, les vues sont du code HTML mixé à du PHP. Exemple "
-"de code :"
-
-#. type: Code fence info string
-#: en/./developers/03_Backend/05_Extensions.md:75
-#: en/./developers/03_Backend/05_Extensions.md:120
-#: en/./developers/03_Backend/05_Extensions.md:248
-#: en/./developers/03_Backend/05_Extensions.md:284
-#: en/./developers/03_Backend/05_Extensions.md:351
-#, no-wrap
-msgid "html"
-msgstr "html"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:75
-#, no-wrap
-msgid ""
-"<p>\n"
-"\tThis is a parameter passed from the controller: <?= $this->a_variable ?>\n"
-"</p>\n"
-msgstr ""
-"<p>\n"
-"\tPhrase passée en paramètre : <?= $this->a_variable ?>\n"
-"</p>\n"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:82
-#, no-wrap
-msgid "The variable `$this->a_variable` is passed by the controller (see previous example). The difference is that in the controller it is necessary to pass `$this->view`, while in the view `$this` suffices.\n"
-msgstr "La variable `$this->a_variable` a été passée précédemment par le contrôleur (voir exemple précédent). La différence est que dans le contrôleur il est nécessaire de passer par `$this->view` et que dans la vue `$this` suffit.\n"
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:83
-#, no-wrap
-msgid "Working with GET / POST"
-msgstr "Accéder aux paramètres GET / POST"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:87
-msgid ""
-"It is often necessary to take advantage of parameters passed by GET or POST. "
-"In Minz, these parameters are accessible using the `Minz_Request` class. "
-"Code example:"
-msgstr ""
-"Il est souvent nécessaire de profiter des paramètres passés par GET ou par "
-"POST. Dans Minz, ces paramètres sont accessibles de façon indistincts à "
-"l’aide de la classe `Minz_Request`. Exemple de code :"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:88
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"$default_value = 'foo';\n"
-"$param = Minz_Request::param('bar', $default_value);\n"
-"\n"
-"// Display the value of the parameter `bar` (passed via GET or POST)\n"
-"// or \"foo\" if the parameter does not exist.\n"
-"echo $param;\n"
-"\n"
-"// Sets the value of the `bar` parameter\n"
-"Minz_Request::_param('bar', 'baz');\n"
-"\n"
-"// Will necessarily display \"baz\" since we have just forced its value.\n"
-"// Note that the second parameter (default) is optional.\n"
-"echo Minz_Request::param('bar');\n"
-"\n"
-"?>\n"
-msgstr ""
-"<?php\n"
-"\n"
-"$default_value = 'foo';\n"
-"$param = Minz_Request::param('bar', $default_value);\n"
-"\n"
-"// Affichera la valeur du paramètre `bar` (passé via GET ou POST)\n"
-"// ou \"foo\" si le paramètre n’existe pas.\n"
-"echo $param;\n"
-"\n"
-"// Force la valeur du paramètre `bar`\n"
-"Minz_Request::_param('bar', 'baz');\n"
-"\n"
-"// Affichera forcément \"baz\" puisque nous venons de forcer sa valeur.\n"
-"// Notez que le second paramètre (valeur par défaut) est facultatif.\n"
-"echo Minz_Request::param('bar');\n"
-"\n"
-"?>\n"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:109
-msgid ""
-"The `Minz_Request::isPost()` method can be used to execute a piece of code "
-"only if it is a POST request."
-msgstr ""
-"La méthode `Minz_Request::isPost()` peut être utile pour n’exécuter un "
-"morceau de code que s’il s’agit d’une requête POST."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:111
-msgid ""
-"Note: it is preferable to use `Minz_Request` only in controllers. It is "
-"likely that you will encounter this method in FreshRSS views, or even in "
-"templates, but be aware that this is **not** good practice."
-msgstr ""
-"Note : il est préférable de n’utiliser `Minz_Request` que dans les "
-"contrôleurs. Il est probable que vous rencontriez cette méthode dans les "
-"vues de FreshRSS, voire dans les modèles, mais sachez qu’il ne s’agit "
-"**pas** d’une bonne pratique."
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:112
-#, no-wrap
-msgid "Access session settings"
-msgstr "Accéder aux paramètres de session"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:115
-msgid ""
-"The access to session parameters is strangely similar to the GET / POST "
-"parameters but passes through the `Minz_Session` class this time! There is "
-"no example here because you can repeat the previous example by changing all "
-"`Minz_Request` to `Minz_Session`."
-msgstr ""
-"L’accès aux paramètres de session est étrangement similaire aux paramètres "
-"GET / POST mais passe par la classe `Minz_Session` cette fois-ci ! Il n’y a "
-"pas d’exemple ici car vous pouvez reprendre le précédent en changeant tous "
-"les `Minz_Request` par des `Minz_Session`."
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:116
-#, no-wrap
-msgid "Working with URLs"
-msgstr "Gestion des URL"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:119
-msgid ""
-"To take full advantage of the Minz routing system, it is strongly "
-"discouraged to write hard URLs in your code. For example, the following view "
-"should be avoided:"
-msgstr ""
-"Pour profiter pleinement du système de routage de Minz, il est fortement "
-"déconseillé d’écrire les URL en dur dans votre code. Par exemple, la vue "
-"suivante doit être évitée :"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:120
-#, no-wrap
-msgid ""
-"<p>\n"
-"\tGo to page <a href=\"http://example.com?c=hello&amp;a=world\">Hello world</a>!\n"
-"</p>\n"
-msgstr ""
-"<p>\n"
-"\tAccéder à la page <a href=\"http://exemple.com?c=hello&amp;a=world\">Hello world</a>!\n"
-"</p>\n"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:127
-msgid ""
-"If one day it was decided to use a \"url rewriting\" system to have "
-"addresses in a http://exemple.com/controller/action format, all previous "
-"addresses would become ineffective!"
-msgstr ""
-"Si un jour il est décidé d’utiliser un système d'« url rewriting » pour "
-"avoir des adresses au format http://exemple.com/controller/action, toutes "
-"les adresses précédentes deviendraient ineffectives !"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:129
-msgid ""
-"So use the `Minz_Url` class and its `display()` method instead. `Minz_Url::"
-"display()` takes an array of the following form as its argument:"
-msgstr ""
-"Préférez donc l’utilisation de la classe `Minz_Url` et de sa méthode "
-"`display()`. `Minz_Url::display()` prend en paramètre un tableau de la forme "
-"suivante :"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:130
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"$url_array = [\n"
-"\t'c' => 'hello',\n"
-"\t'a' => 'world',\n"
-"\t'params' => [\n"
-"\t\t'foo' => 'bar',\n"
-"\t],\n"
-"];\n"
-"\n"
-"// Show something like .?c=hello&amp;a=world&amp;foo=bar\n"
-"echo Minz_Url::display($url_array);\n"
-"\n"
-"?>\n"
-msgstr ""
-"<?php\n"
-"\n"
-"$url_array = [\n"
-"\t'c' => 'hello',\n"
-"\t'a' => 'world',\n"
-"\t'params' => [\n"
-"\t\t'foo' => 'bar',\n"
-"\t],\n"
-"];\n"
-"\n"
-"// Affichera quelque chose comme .?c=hello&amp;a=world&amp;foo=bar\n"
-"echo Minz_Url::display($url_array);\n"
-"\n"
-"?>\n"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:148
-msgid ""
-"Since this can become a bit tedious to use in the long run, especially in "
-"views, it is preferable to use the `_url()` shortcut:"
-msgstr ""
-"Comme cela peut devenir un peu pénible à utiliser à la longue, surtout dans "
-"les vues, il est préférable d’utiliser le raccourci `_url()` :"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:149
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"// Displays the same as above\n"
-"echo _url('hello', 'world', 'foo', 'bar');\n"
-"\n"
-"?>\n"
-msgstr ""
-"<?php\n"
-"\n"
-"// Affichera la même chose que précédemment\n"
-"echo _url('hello', 'world', 'foo', 'bar');\n"
-"\n"
-"?>\n"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:159
-msgid ""
-"Note: as a general rule, the shortened form (`_url()`) should be used in "
-"views, while the long form (`Minz_Url::display()`) should be used in "
-"controllers."
-msgstr ""
-"Note : en règle générale, la forme raccourcie (`_url()`) doit être utilisée "
-"dans les vues tandis que la forme longue (`Minz_Url::display()`) doit ĂŞtre "
-"utilisée dans les contrôleurs."
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:160
-#, no-wrap
-msgid "Redirections"
-msgstr "Redirections"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:163
-msgid ""
-"It is often necessary to redirect a user to another page. To do so, the "
-"`Minz_Request` class offers another useful method: `forward()`. This method "
-"takes the same URL format as the one seen just before as its argument."
-msgstr ""
-"Il est souvent nécessaire de rediriger un utilisateur vers une autre page. "
-"Pour cela, la classe `Minz_Request` dispose d’une autre méthode utile : "
-"`forward()`. Cette méthode prend en argument le même format d’URL que celui "
-"vu juste avant."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:166
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"$url_array = [\n"
-"\t'c' => 'hello',\n"
-"\t'a' => 'world',\n"
-"];\n"
-"\n"
-"// Tells Minz to redirect the user to the hello / world page.\n"
-"// Note that this is a redirection in the Minz sense of the term, not a redirection that the browser will have to manage (HTTP code 301 or 302)\n"
-"// The code that follows forward() will thus be executed!\n"
-"Minz_Request::forward($url_array);\n"
-"\n"
-"// To perform a type 302 redirect, add \"true\".\n"
-"// The code that follows will never be executed.\n"
-"Minz_Request::forward($url_array, true);\n"
-"\n"
-"?>\n"
-msgstr ""
-"<?php\n"
-"\n"
-"$url_array = [\n"
-"\t'c' => 'hello',\n"
-"\t'a' => 'world',\n"
-"];\n"
-"\n"
-"// Indique à Minz de rediriger l’utilisateur vers la page hello/world.\n"
-"// Notez qu’il s’agit d’une redirection au sens Minz du terme, pas d’une redirection que le navigateur va avoir à gérer (code HTTP 301 ou 302)\n"
-"// Le code qui suit forward() va ainsi être exécuté !\n"
-"Minz_Request::forward($url_array);\n"
-"\n"
-"// Pour effectuer une redirection type 302, ajoutez \"true\".\n"
-"// Le code qui suivra ne sera alors jamais exécuté.\n"
-"Minz_Request::forward($url_array, true);\n"
-"\n"
-"?>\n"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:187
-msgid ""
-"It is very common to want display a message to the user while performing a "
-"redirect, to tell the user how the action was carried out (validation of a "
-"form for example). Such a message is passed through a `notification` session "
-"variable (note: we will talk about feedback from now on to avoid confusion "
-"with a notification that can occur at any time). To facilitate this kind of "
-"very frequent action, there are two shortcuts that both perform a 302 "
-"redirect by assigning a feedback message:"
-msgstr ""
-"Il est très fréquent de vouloir effectuer une redirection tout en affichant "
-"un message à l’utilisateur pour lui indiquer comment s’est déroulée l’action "
-"effectuée juste avant (validation d’un formulaire par exemple). Un tel "
-"message est passé par une variable de session `notification` (note : nous "
-"parlerons plutôt de « feedback » désormais pour éviter la confusion avec une "
-"notification qui peut survenir Ă  tout moment). Pour faciliter ce genre "
-"d’action très fréquente, il existe deux raccourcis qui effectuent tout deux "
-"une redirection type 302 en affectant un message de feedback :"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:188
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"$url_array = [\n"
-"\t'c' => 'hello',\n"
-"\t'a' => 'world',\n"
-"];\n"
-"$feedback_good = 'All went well!';\n"
-"$feedback_bad = 'Oops, something went wrong.';\n"
-"\n"
-"Minz_Request::good($feedback_good, $url_array);\n"
-"\n"
-"// or\n"
-"\n"
-"Minz_Request::bad($feedback_bad, $url_array);\n"
-"\n"
-"?>\n"
-msgstr ""
-"<?php\n"
-"\n"
-"$url_array = [\n"
-"\t'c' => 'hello',\n"
-"\t'a' => 'world',\n"
-"];\n"
-"$feedback_good = 'Tout s’est bien passé !';\n"
-"$feedback_bad = 'Oups, quelque chose n’a pas marché.';\n"
-"\n"
-"Minz_Request::good($feedback_good, $url_array);\n"
-"\n"
-"// ou\n"
-"\n"
-"Minz_Request::bad($feedback_bad, $url_array);\n"
-"\n"
-"?>\n"
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:207
-#, no-wrap
-msgid "Translation Management"
-msgstr "Gestion de la traduction"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:210
-msgid ""
-"It is common (and that’s an understatement) to want to show some text to the "
-"user. In the previous example, for example, we display feedback to the user "
-"based on the result of form validation. The problem is that FreshRSS has "
-"users of different nationalities. It is therefore necessary to be able to "
-"manage different languages in order not to remain confined to English or "
-"French."
-msgstr ""
-"Il est fréquent (et c’est un euphémisme) de vouloir afficher des phrases à "
-"l’utilisateur. Dans l’exemple précédent par exemple, nous affichions un "
-"feedback à l’utilisateur en fonction du résultat d’une validation de "
-"formulaire. Le problème est que FreshRSS possède des utilisateurs de "
-"différentes nationalités. Il est donc nécessaire de pouvoir gérer "
-"différentes langues pour ne pas rester cantonné à l’Anglais ou au Français."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:212
-msgid ""
-"The solution is to use the `Minz_Translate` class, which allows dynamic "
-"translation of FreshRSS (or any Minz-based application). Before using this "
-"module, it is necessary to know where to find the strings to be translated. "
-"Each language has its own subdirectory in a parent directory named `i18n`. "
-"For example, English language files are located in `i18n/fr/`. There are "
-"seven different files:"
-msgstr ""
-"La solution consiste Ă  utiliser la classe `Minz_Translate` qui permet de "
-"traduire dynamiquement FreshRSS (ou toute application basée sur Minz). Avant "
-"d’utiliser ce module, il est nécessaire de savoir où trouver les chaînes de "
-"caractères à traduire. Chaque langue possède son propre sous-répertoire dans "
-"un répertoire parent nommé `i18n`. Par exemple, les fichiers de langue en "
-"Français sont situés dans `i18n/fr/`. Il existe sept fichiers différents :"
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`admin.php` for anything related to FreshRSS administration"
-msgstr ""
-"`admin.php` pour tout ce qui est relatif à l’administration de FreshRSS ;"
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`conf.php` for configuration"
-msgstr "`conf.php` pour l’aspect configuration ;"
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`feedback.php` contains translations of feedback messages"
-msgstr "`feedback.php` contient les traductions des messages de feedback ;"
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`gen.php` stores what is global to FreshRSS (gen for \"general\")"
-msgstr "`gen.php` stocke ce qui est global à FreshRSS (gen pour « general ») ;"
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`index.php` for the main page that lists feeds and the About page"
-msgstr ""
-"`index.php` pour la page principale qui liste les flux et la page « À propos "
-"» ;"
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`install.php` contains strings related FreshRSS installation"
-msgstr ""
-"`install.php` contient les phrases relatives à l’installation de FreshRSS ;"
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`sub.php` for subscription management (sub for \"subscription\")"
-msgstr ""
-"`sub.php` pour l’aspect gestion des abonnements (sub pour « subscription »)."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:222
-msgid ""
-"This organization makes it possible to avoid a single huge translation file."
-msgstr ""
-"Cette organisation permet de ne pas avoir un unique énorme fichier de "
-"traduction."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:224
-msgid ""
-"The translation files are quite simple: it’s only a matter of returning a "
-"PHP table containing the translations. As an example, here’s an extract from "
-"`app/i18n/fr/gen.php`:"
-msgstr ""
-"Les fichiers de traduction sont assez simples : il s’agit seulement de "
-"retourner un tableau PHP contenant les traductions. Extrait du fichier `app/"
-"i18n/fr/gen.php` :"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:225
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"return array(\n"
-"\t'action' => [\n"
-"\t\t'actualize' => 'Actualiser',\n"
-"\t\t'back_to_rss_feeds' => '↠Retour à vos flux RSS',\n"
-"\t\t'cancel' => 'Annuler',\n"
-"\t\t'create' => 'Créer',\n"
-"\t\t'disable' => 'Désactiver',\n"
-"\t),\n"
-"\t'freshrss' => array(\n"
-"\t\t'_' => 'FreshRSS',\n"
-"\t\t'about' => 'Ă€ propos de FreshRSS',\n"
-"\t),\n"
-"];\n"
-"\n"
-"?>\n"
-msgstr ""
-"<?php\n"
-"\n"
-"return array(\n"
-"\t'action' => [\n"
-"\t\t'actualize' => 'Actualiser',\n"
-"\t\t'back_to_rss_feeds' => '↠Retour à vos flux RSS',\n"
-"\t\t'cancel' => 'Annuler',\n"
-"\t\t'create' => 'Créer',\n"
-"\t\t'disable' => 'Désactiver',\n"
-"\t),\n"
-"\t'freshrss' => array(\n"
-"\t\t'_' => 'FreshRSS',\n"
-"\t\t'about' => 'Ă€ propos de FreshRSS',\n"
-"\t),\n"
-"];\n"
-"\n"
-"?>\n"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:247
-msgid ""
-"To access these translations, `Minz_Translate` will help us with its "
-"`Minz_Translate::t()` method. As this can be a bit long to type, a shortcut "
-"has been introduced that **must** be used in all circumstances: `_t()`. "
-"Code example:"
-msgstr ""
-"Pour accéder à ces traductions, `Minz_Translate` va nous aider à l’aide de "
-"sa méthode `Minz_Translate::t()`. Comme cela peut être un peu long à taper, "
-"il a été introduit un raccourci qui **doit** être utilisé en toutes "
-"circonstances : `_t()`. Exemple de code :"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:248
-#, no-wrap
-msgid ""
-"<p>\n"
-"\t<a href=\"<?= _url('index', 'index') ?>\">\n"
-"\t\t<?= _t('gen.action.back_to_rss_feeds') ?>\n"
-"\t</a>\n"
-"</p>\n"
-msgstr ""
-"<p>\n"
-"\t<a href=\"<?= _url('index', 'index') ?>\">\n"
-"\t\t<?= _t('gen.action.back_to_rss_feeds') ?>\n"
-"\t</a>\n"
-"</p>\n"
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:257
-msgid ""
-"The string to pass to the `_t()` function consists of a series of "
-"identifiers separated by dots. The first identifier indicates from which "
-"file to extract the translation (in this case, `gen.php`), while the "
-"following ones indicate table entries. Thus `action` is an entry of the main "
-"array and `back_to_rss_feeds` is an entry of the `action` array. This allows "
-"us to further organize our translation files."
-msgstr ""
-"La chaîne à passer à la fonction `_t()` consiste en une série d’identifiants "
-"séparés par des points. Le premier identifiant indique de quel fichier on "
-"veut extraire la traduction (dans notre cas présent, de `gen.php`), tandis "
-"que les suivantes indiquent des entrées de tableaux. Ainsi `action` est une "
-"entrée du tableau principal et `back_to_rss_feeds` est une entrée du tableau "
-"`action`. Cela permet d’organiser encore un peu plus nos fichiers de "
-"traduction."
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:259
-msgid ""
-"There is a small special case that sometimes makes life easier: the `_` "
-"identifier. This must necessarily be present at the end of the chain and "
-"gives a value to the higher-level identifier. It’s pretty hard to explain "
-"but very simple to understand. In the example given above, a `_` is "
-"associated with the value `FreshRSS`: this means that there is no need to "
-"write `_t('gen.freshrss._')` but `_t('gen.freshrss')` suffices."
+#: en/./developers/03_Backend/05_Extensions.md:28
+msgid "see [Minz documentation](/docs/en/developers/Minz/index.md)"
msgstr ""
-"Il existe un petit cas particulier qui permet parfois de se simplifier la "
-"vie : le cas de l’identifiant `_`. Celui-ci doit nécessairement être présent "
-"en bout de chaîne et permet de donner une valeur à l’identifiant de niveau "
-"supérieur. C’est assez dur à expliquer mais très simple à comprendre. Dans "
-"l’exemple donné plus haut, un `_` est associé à la valeur `FreshRSS` : cela "
-"signifie qu’il n’y a pas besoin d’écrire `_t('gen.freshrss._')` mais "
-"`_t('gen.freshrss')` suffit."
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:260
-#, no-wrap
-msgid "Configuration management"
-msgstr "Gestion de la configuration"
#. type: Title ##
-#: en/./developers/03_Backend/05_Extensions.md:262
+#: en/./developers/03_Backend/05_Extensions.md:29
#, no-wrap
msgid "Write an extension for FreshRSS"
msgstr "Écrire une extension pour FreshRSS"
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:265
+#: en/./developers/03_Backend/05_Extensions.md:32
msgid ""
"Here we are! We’ve talked about the most useful features of Minz and how to "
"run FreshRSS correctly and it’s about time to address the extensions "
@@ -2535,7 +1658,7 @@ msgstr ""
"temps d’aborder les extensions en elles-même."
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:267
+#: en/./developers/03_Backend/05_Extensions.md:34
msgid ""
"An extension allows you to easily add functionality to FreshRSS without "
"having to touch the core of the project directly."
@@ -2544,13 +1667,34 @@ msgstr ""
"FreshRSS sans avoir à toucher au cœur du projet directement."
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:268
+#: en/./developers/03_Backend/05_Extensions.md:35
+#, no-wrap
+msgid "Make it work in Docker"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:38
+msgid ""
+"When working on an extension, it’s easier to see it working directly in its "
+"environment. With Docker, you can leverage the use of the ```volume``` "
+"option when starting the container. Hopefully, you can use it without Docker-"
+"related knowledge by using the Makefile rule:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/03_Backend/05_Extensions.md:38
+#, no-wrap
+msgid "make start extensions=\"/full/path/to/extension/1 /full/path/to/extension/2\"\n"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:42
#, no-wrap
msgid "Basic files and folders"
msgstr "Les fichiers et répertoires de base"
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:273
+#: en/./developers/03_Backend/05_Extensions.md:47
msgid ""
"The first thing to note is that **all** extensions **must** be located in "
"the `extensions` directory, at the base of the FreshRSS tree. An extension "
@@ -2567,7 +1711,7 @@ msgstr ""
"s’agit pas d’une extension incluse par défaut dans FreshRSS."
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:275
+#: en/./developers/03_Backend/05_Extensions.md:49
msgid ""
"The main directory of an extension must contain at least two **mandatory** "
"files:"
@@ -2576,7 +1720,7 @@ msgstr ""
"fichiers **obligatoire** :"
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:278
+#: en/./developers/03_Backend/05_Extensions.md:52
msgid ""
"A `metadata.json` file that contains a description of the extension. This "
"file is written in JSON."
@@ -2585,14 +1729,14 @@ msgstr ""
"fichier est écrit en JSON ;"
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:278
+#: en/./developers/03_Backend/05_Extensions.md:52
msgid ""
"An `extension.php` file containing the entry point of the extension (which "
"is a class that inherits Minz_Extension)."
msgstr "Un fichier `extension.php` contenant le point d’entrée de l’extension."
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:282
+#: en/./developers/03_Backend/05_Extensions.md:56
msgid ""
"Please note that there is a not a required link between the directory name "
"of the extension and the name of the class inside `extension.php`, but you "
@@ -2602,14 +1746,14 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:284
+#: en/./developers/03_Backend/05_Extensions.md:58
msgid ""
"In the file `freshrss/extensions/xExtension-HelloWorld/extension.php` you "
"need the structure:"
msgstr ""
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:284
+#. type: Fenced code block (php)
+#: en/./developers/03_Backend/05_Extensions.md:58
#, no-wrap
msgid ""
"class HelloWorldExtension extends Minz_Extension {\n"
@@ -2620,20 +1764,20 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:292
+#: en/./developers/03_Backend/05_Extensions.md:67
msgid ""
"There is an example HelloWorld extension that you can download from [our "
"GitHub repo](https://github.com/FreshRSS/xExtension-HelloWorld)."
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:294
+#: en/./developers/03_Backend/05_Extensions.md:69
msgid ""
"You may also need additional files or subdirectories depending on your needs:"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:300
+#: en/./developers/03_Backend/05_Extensions.md:75
msgid ""
"`configure.phtml` is the file containing the form to parameterize your "
"extension"
@@ -2642,7 +1786,7 @@ msgstr ""
"votre extension"
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:300
+#: en/./developers/03_Backend/05_Extensions.md:75
msgid ""
"A `static/` directory containing CSS and JavaScript files that you will need "
"for your extension (note that if you need to write a lot of CSS it may be "
@@ -2650,38 +1794,38 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:300
+#: en/./developers/03_Backend/05_Extensions.md:75
msgid "A `Controllers` directory containing additional controllers"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:300
+#: en/./developers/03_Backend/05_Extensions.md:75
msgid "An `i18n` directory containing additional translations"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:300
+#: en/./developers/03_Backend/05_Extensions.md:75
msgid ""
-"`layout` and` views` directories to define new views or to overwrite the "
+"`layout` and `views` directories to define new views or to overwrite the "
"current views"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:302
+#: en/./developers/03_Backend/05_Extensions.md:77
msgid ""
"In addition, it is good to have a `LICENSE` file indicating the license "
-"under which your extension is distributed and a` README` file giving a "
+"under which your extension is distributed and a `README` file giving a "
"detailed description of it."
msgstr ""
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:303
+#: en/./developers/03_Backend/05_Extensions.md:78
#, no-wrap
msgid "The metadata.json file"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:306
+#: en/./developers/03_Backend/05_Extensions.md:81
msgid ""
"The `metadata.json` file defines your extension through a number of "
"important elements. It must contain a valid JSON array containing the "
@@ -2689,12 +1833,12 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:313
+#: en/./developers/03_Backend/05_Extensions.md:89
msgid "`name`: the name of your extension"
msgstr "`name` : le nom de votre extension ;"
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:313
+#: en/./developers/03_Backend/05_Extensions.md:89
msgid ""
"`author`: your name, your e-mail address … but there is no specific format "
"to adopt"
@@ -2703,181 +1847,160 @@ msgstr ""
"format spécifique à adopter ;"
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:313
+#: en/./developers/03_Backend/05_Extensions.md:89
msgid "`description`: a description of your extension"
msgstr "`description` : une description de votre extension ;"
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:313
+#: en/./developers/03_Backend/05_Extensions.md:89
msgid "`version`: the current version number of the extension"
msgstr "`version` : le numéro de version actuel de l’extension ;"
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:313
-msgid ""
-"`entrypoint`: Indicates the entry point of your extension. It must match the "
-"name of the class contained in the file `extension.php` without the suffix` "
-"Extension` (so if the entry point is `HelloWorld`, your class will be "
-"called` HelloWorldExtension`)"
-msgstr ""
-"`entrypoint` : indique le point d’entrée de votre extension. Il doit "
-"correspondre au nom de la classe contenue dans le fichier `extension.php` "
-"sans le suffixe `Extension` (donc si le point d’entrée est `HelloWorld`, "
-"votre classe s’appellera `HelloWorldExtension`) ;"
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:313
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:89
+#, fuzzy, no-wrap
+#| msgid "`entrypoint`: Indicates the entry point of your extension. It must match the name of the class contained in the file `extension.php` without the suffix` Extension` (so if the entry point is `HelloWorld`, your class will be called` HelloWorldExtension`)"
msgid ""
-"`type`: Defines the type of your extension. There are two types: `system` "
-"and` user`. We will study this difference right after."
-msgstr ""
-"`type` : définit le type de votre extension. Il existe deux types : `system` "
-"et `user`. Nous étudierons cette différence juste après."
+"* `entrypoint`: Indicates the entry point of your extension. It must match the name of the class contained in the file `extension.php` without the suffix `Extension`\n"
+"(so if the entry point is `HelloWorld`, your class will be called `HelloWorldExtension`)\n"
+"* `type`: Defines the type of your extension. There are two types: `system` and `user`. We will study this difference right after.\n"
+msgstr "`entrypoint` : indique le point d’entrée de votre extension. Il doit correspondre au nom de la classe contenue dans le fichier `extension.php` sans le suffixe `Extension` (donc si le point d’entrée est `HelloWorld`, votre classe s’appellera `HelloWorldExtension`) ;"
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:315
-msgid "Only the `name` and` entrypoint` fields are required."
+#: en/./developers/03_Backend/05_Extensions.md:91
+#, fuzzy
+#| msgid "Only the `name` and` entrypoint` fields are required."
+msgid "Only the `name` and `entrypoint` fields are required."
msgstr "Seuls les champs `name` et `entrypoint` sont requis."
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:316
+#: en/./developers/03_Backend/05_Extensions.md:92
#, no-wrap
msgid "Choosing between `system` and `user`"
msgstr "Choisir entre extension « system » ou « user »"
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:319
+#: en/./developers/03_Backend/05_Extensions.md:95
msgid ""
-"A __user__ extension can be enabled by some users and not by others "
-"(typically for user preferences)."
+"A *user* extension can be enabled by some users and not by others (typically "
+"for user preferences)."
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:321
-msgid "A __system__ extension in comparison is enabled for every account."
+#: en/./developers/03_Backend/05_Extensions.md:97
+msgid "A *system* extension in comparison is enabled for every account."
msgstr ""
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:322
+#: en/./developers/03_Backend/05_Extensions.md:98
#, no-wrap
msgid "Writing your own extension.php"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:327
+#: en/./developers/03_Backend/05_Extensions.md:102
msgid ""
-"This file is the entry point of your extension. It must contain a specific "
-"class to function. As mentioned above, the name of the class must be your "
-"`entrypoint` suffixed by` Extension` (`HelloWorldExtension` for example). "
-"In addition, this class must be inherited from the `Minz_Extension` class to "
-"benefit from extensions-specific methods."
+"This file is the core of your extension. It must define some key elements "
+"to be loaded by the extension system:"
msgstr ""
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:329
-msgid "Your class will benefit from four methods to redefine:"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:334
-msgid ""
-"`install()` is called when a user clicks the button to activate your "
-"extension. It allows, for example, to update the database of a user in order "
-"to make it compatible with the extension. It returns `true` if everything "
-"went well or, if not, a string explaining the problem."
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:334
+#. type: Bullet: '1. '
+#: en/./developers/03_Backend/05_Extensions.md:106
+#, fuzzy
+#| msgid ""
+#| "`entrypoint`: Indicates the entry point of your extension. It must match "
+#| "the name of the class contained in the file `extension.php` without the "
+#| "suffix` Extension` (so if the entry point is `HelloWorld`, your class "
+#| "will be called` HelloWorldExtension`)"
msgid ""
-"`uninstall()` is called when a user clicks the button to disable your "
-"extension. This will allow you to undo the database changes you potentially "
-"made in `install ()`. It returns `true` if everything went well or, if not, "
-"a string explaining the problem."
+"The class name must be the `entrypoint` value defined in the `metadata.json` "
+"file suffixed by `Extension` (if your `entrypoint` value is `HelloWorld`, "
+"your class name will be `HelloWorldExtension`)."
msgstr ""
+"`entrypoint` : indique le point d’entrée de votre extension. Il doit "
+"correspondre au nom de la classe contenue dans le fichier `extension.php` "
+"sans le suffixe `Extension` (donc si le point d’entrée est `HelloWorld`, "
+"votre classe s’appellera `HelloWorldExtension`) ;"
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:334
+#. type: Bullet: '1. '
+#: en/./developers/03_Backend/05_Extensions.md:106
msgid ""
-"`init()` is called for every page load *if the extension is enabled*. It "
-"will therefore initialize the behavior of the extension. This is the most "
-"important method."
+"The class must extend the `Minz_Extension` abstract class which defines the "
+"core methods and properties of a FreshRSS extension."
msgstr ""
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:334
+#. type: Bullet: '1. '
+#: en/./developers/03_Backend/05_Extensions.md:106
msgid ""
-"`handleConfigureAction()` is called when a user loads the extension "
-"management panel. Specifically, it is called when the `?"
-"c=extension&a=configured&e=name-of-your-extension` URL is loaded. You should "
-"also write here the behavior you want when validating the form in your "
-"`configure.phtml` file."
+"The class must define the `init` method. This method is called **only** if "
+"the extension is loaded. Its purpose is to initialize the extension and its "
+"behavior during every page load."
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:336
-msgid ""
-"In addition, you will have a number of methods directly inherited from "
-"`Minz_Extension` that you should not redefine:"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:340
+#: en/./developers/03_Backend/05_Extensions.md:111
msgid ""
-"The \"getters\" first: most are explicit enough not to detail them here - "
-"`getName()`, `getEntrypoint()`, `getPath()` (allows you to retrieve the path "
-"to your extension), `getAuthor()`, `getDescription()`, `getVersion()`, "
-"`getType()`."
+"The `Minz_Extension` abstract class defines a set of methods that can be "
+"overridden to fit your needs: * the `install` method is called when the user "
+"enables the extension in the configuration page. It must return `true` when "
+"successful and a string containing an error message when not. Its purpose is "
+"to prepare FreshRSS for the extension (adding a table to the database, "
+"creating a folder tree, …). * the `uninstall` method is called when the "
+"user disables the extension in the configuration page. It must return `true` "
+"when successful and a string containing an error message when not. Its "
+"purpose is to clean FreshRSS (removing a table from the database, deleting a "
+"folder tree, …). Usually it reverts changes introduced by the `install` "
+"method. * the `handleConfigureAction` method is called when a user loads "
+"the extension configuration panel. It contains the logic to validate and "
+"store the submitted values defined in the `configure.phtml` file."
msgstr ""
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:340
-msgid ""
-"`getFileUrl($filename, $type)` will return the URL to a file in the `static` "
-"directory. The first parameter is the name of the file (without `static /`), "
-"the second is the type of file to be used (`css` or` js`)."
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:113
+#, no-wrap
+msgid "> If your extension code is scattered in different classes, you need to load their source before using them. Of course you could include the files manually, but it’s more efficient to load them automatically. To do so, you just need to define the `autoload` method which will include them when needed. This method will be registered automatically when the extension is enabled.\n"
msgstr ""
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:340
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:127
+#, no-wrap
msgid ""
-"`registerController($base_name)` will tell Minz to take into account the "
-"given controller in the routing system. The controller must be located in "
-"your `Controllers` directory, the name of the file must be` "
-"<base_name>Controller.php` and the name of the "
-"`FreshExtension_<base_name>_Controller` class."
+"The `Minz_Extension` abstract class defines another set of methods that should not be overridden:\n"
+"* the `getName`, `getEntrypoint`, `getPath`, `getAuthor`, `getDescription`, `getVersion`, and `getType` methods return the extension internal properties. Those properties are extracted from the `metadata.json` file.\n"
+"* the `getFileUrl` returns the URL of the selected file. The file must exist in the `static` folder of the extension.\n"
+"* the `registerController` method register an extension controller in FreshRSS. The selected controller must be defined in the extension *Controllers* folder, its file name must be `\\<name\\>Controller.php`, and its class name must be `FreshExtension_\\<name\\>_Controller`.\n"
+"* the `registerViews` method registers the extension views in FreshRSS.\n"
+"* the `registerTranslates` method registers the extension translation files in FreshRSS.\n"
+"* the `registerHook` method registers hook actions in different part of the application.\n"
+"* the `getSystemConfiguration` method retrieves the extension configuration for the system.\n"
+"* the `setSystemConfiguration` method stores the extension configuration for the system.\n"
+"* the `removeSystemConfiguration` method removes the extension configuration for the system.\n"
+"* the `getUserConfiguration` method retrieves the extension configuration for the current user.\n"
+"* the `setUserConfiguration` method stores the extension configuration for the current user.\n"
+"* the `removeUserConfiguration` method removes the extension configuration for the current user.\n"
msgstr ""
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:346
-msgid "`registerViews()`"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:346
-msgid "`registerTranslates()`"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:346
-msgid "`registerHook($hook_name, $hook_function)`"
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:129
+#, no-wrap
+msgid "> Note that if you modify the later set of methods, you might break the extension system. Thus making FreshRSS unusable. So it’s highly recommended to let those unmodified.\n"
msgstr ""
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:347
+#: en/./developers/03_Backend/05_Extensions.md:130
#, no-wrap
msgid "The \"hooks\" system"
msgstr "Le système « hooks »"
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:350
+#: en/./developers/03_Backend/05_Extensions.md:133
msgid ""
"You can register at the FreshRSS event system in an extensions `init()` "
"method, to manipulate data when some of the core functions are executed."
msgstr ""
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:351
+#. type: Fenced code block (html)
+#: en/./developers/03_Backend/05_Extensions.md:134
#, no-wrap
msgid ""
"class HelloWorldExtension extends Minz_Extension\n"
@@ -2893,12 +2016,12 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:365
+#: en/./developers/03_Backend/05_Extensions.md:148
msgid "The following events are available:"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
msgid ""
"`check_url_before_add` (`function($url) -> Url | null`): will be executed "
"every time a URL is added. The URL itself will be passed as parameter. This "
@@ -2907,7 +2030,7 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
msgid ""
"`entry_before_display` (`function($entry) -> Entry | null`): will be "
"executed every time an entry is rendered. The entry itself (instance of "
@@ -2915,7 +2038,7 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
msgid ""
"`entry_before_insert` (`function($entry) -> Entry | null`): will be executed "
"when a feed is refreshed and new entries will be imported into the database. "
@@ -2923,7 +2046,7 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
msgid ""
"`feed_before_actualize` (`function($feed) -> Feed | null`): will be executed "
"when a feed is updated. The feed (instance of FreshRSS\\_Feed) will be "
@@ -2931,7 +2054,7 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
msgid ""
"`feed_before_insert` (`function($feed) -> Feed | null`): will be executed "
"when a new feed is imported into the database. The new feed (instance of "
@@ -2939,65 +2062,87 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
msgid ""
"`freshrss_init` (`function() -> none`): will be executed at the end of the "
"initialization of FreshRSS, useful to initialize components or to do "
-"additional access checks"
+"additional access checks."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:164
+msgid ""
+"`freshrss_user_maintenance` (`function() -> none`): will be executed for "
+"each user during the `actualize_script`, useful to run some maintenance "
+"tasks on the user."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+msgid ""
+"`js_vars` (`function($vars = array) -> array | null`): will be executed if "
+"the `jsonVars` in the header will be generated."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:164
msgid ""
"`menu_admin_entry` (`function() -> string`): add an entry at the end of the "
"\"Administration\" menu, the returned string must be valid HTML (e.g. `<li "
-"class=\"item active\"><a href=\"url\">New entry</a></li>`)"
+"class=\"item active\"><a href=\"url\">New entry</a></li>`)."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
msgid ""
"`menu_configuration_entry` (`function() -> string`): add an entry at the end "
"of the \"Configuration\" menu, the returned string must be valid HTML (e.g. "
-"`<li class=\"item active\"><a href=\"url\">New entry</a></li>`)"
+"`<li class=\"item active\"><a href=\"url\">New entry</a></li>`)."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
msgid ""
"`menu_other_entry` (`function() -> string`): add an entry at the end of the "
"header dropdown menu (i.e. after the \"About\" entry), the returned string "
"must be valid HTML (e.g. `<li class=\"item active\"><a href=\"url\">New "
-"entry</a></li>`)"
+"entry</a></li>`)."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+msgid ""
+"`nav_menu` (`function() -> string`): will be executed if the navigation was "
+"built."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:164
msgid ""
"`nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** "
-"add documentation"
+"add documentation."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
-msgid "`post_update` (`function(none) -> none`): **TODO** add documentation"
+#: en/./developers/03_Backend/05_Extensions.md:164
+msgid "`post_update` (`function(none) -> none`): **TODO** add documentation."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
msgid ""
"`simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** "
-"add documentation"
+"add documentation."
msgstr ""
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:379
+#: en/./developers/03_Backend/05_Extensions.md:165
#, no-wrap
msgid "Writing your own configure.phtml"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:382
+#: en/./developers/03_Backend/05_Extensions.md:168
msgid ""
"When you want to support user configurations for your extension or simply "
"display some information, you have to create the `configure.phtml` file."
@@ -3029,11 +2174,11 @@ msgid ""
"commands. You can run the test suite with:"
msgstr ""
-#. type: Plain text
+#. type: Fenced code block (sh)
#: en/./developers/03_Running_tests.md:9
#, fuzzy, no-wrap
#| msgid "$ make stop\n"
-msgid "$ make test\n"
+msgid "make test\n"
msgstr "$ make stop\n"
#. type: Plain text
@@ -3052,77 +2197,274 @@ msgid ""
"you can run the command directly with:"
msgstr ""
-#. type: Plain text
+#. type: Fenced code block (sh)
#: en/./developers/03_Running_tests.md:17
#, fuzzy, no-wrap
#| msgid "$ make stop\n"
-msgid "$ NO_DOCKER=true make test\n"
+msgid "NO_DOCKER=true make test\n"
msgstr "$ make stop\n"
+#. type: Plain text
+#: en/./developers/03_Running_tests.md:22
+msgid "The linter can be run with a `make` command as well:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/03_Running_tests.md:23
+#, no-wrap
+msgid ""
+"make lint # to execute the linter on the PHP files\n"
+"make lint-fix # or, to fix the errors detected by the linter\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Running_tests.md:29
+msgid ""
+"Similarly to PHPUnit, it downloads a [PHP\\_CodeSniffer](https://github.com/"
+"squizlabs/PHP_CodeSniffer) binary (i.e. `phpcs` or `phpcbf` depending on the "
+"command) and verifies its checksum."
+msgstr ""
+
#. type: Title ##
-#: en/./developers/03_Running_tests.md:21
+#: en/./developers/03_Running_tests.md:30
#, no-wrap
-msgid "Travis"
+msgid "GitHub Actions for Continuous Integration"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Running_tests.md:24
+#: en/./developers/03_Running_tests.md:35
msgid ""
-"Tests are automatically run when you open a pull request on GitHub. It is "
-"done with [Travis CI](https://travis-ci.org/FreshRSS/FreshRSS/). This is "
-"done to ensure there is no regressions in your code. We cannot merge a PR if "
-"the tests fail so we will ask you to fix bugs before to review your code."
+"Tests are automatically run when you open a pull request on GitHub. They "
+"are performed with [GitHub Actions](https://github.com/FreshRSS/FreshRSS/"
+"actions). This ensures your code will not introduce some kind of "
+"regression. We will not merge a PR if tests fail so we will ask you to fix "
+"any bugs before reviewing your code."
msgstr ""
#. type: Plain text
-#: en/./developers/03_Running_tests.md:25
+#: en/./developers/03_Running_tests.md:37
#, fuzzy
#| msgid ""
#| "If your request is new, [open a new bug ticket](https://github.com/"
#| "FreshRSS/FreshRSS/issues/new)"
msgid ""
-"If you’re interested in, you can take a look at [the configuration file]"
-"(https://github.com/FreshRSS/FreshRSS/blob/edge/.travis.yml)."
+"If you are interested, you can take a look at [the configuration file]"
+"(https://github.com/FreshRSS/FreshRSS/blob/edge/.github/workflows/tests.yml)."
msgstr ""
"Si votre demande est nouvelle, [ouvrez un nouveau ticket de bug](https://"
"github.com/FreshRSS/FreshRSS/issues/new)"
+#. type: Title ##
+#: en/./developers/03_Running_tests.md:38
+#, no-wrap
+msgid "Using feed snapshots"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Running_tests.md:42
+msgid ""
+"As feed data is volatile, it’s better to work with snapshots when debugging "
+"some issues. You can find the description to retrieve a snapshot [here]"
+"(06_Reporting_Bugs.md#how-to-provide-feed-data)."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Running_tests.md:46
+msgid ""
+"To serve those snapshots, you can use a mock server. Here we will "
+"demonstrate how to work with [WireMock](https://wiremock.org/) but other "
+"solutions exist. Here are the steps to start using the WireMock mock server:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Running_tests.md:76
+#, no-wrap
+msgid ""
+"1. Go to the mock server home folder.\n"
+"If you do not have one, you need to create one.\n"
+"1. Inside the mock server home folder, create the ___file_ and _mappings_ folders.\n"
+"1. Copy or move your snapshots in the ___file_ folder.\n"
+"1. Create the _feed.json_ file in the _mappings_ folder with the following content:\n"
+"\t```js\n"
+"\t{\n"
+"\t\t\"request\": {\n"
+"\t\t\t\"method\": \"GET\",\n"
+"\t\t\t\"urlPathPattern\": \"/.*\"\n"
+"\t\t},\n"
+"\t\t\"response\": {\n"
+"\t\t\t\"status\": 200,\n"
+"\t\t\t\"bodyFileName\": \"{{request.pathSegments.[0]}}\",\n"
+"\t\t\t\"transformers\": [\"response-template\"],\n"
+"\t\t\t\"headers\": {\n"
+"\t\t\t\t\"Content-Type\": \"application/rss+xml\"\n"
+"\t\t\t}\n"
+"\t\t}\n"
+"\t}\n"
+"\t```\n"
+"1. Launch the containerized server with the following command:\n"
+"\t```bash\n"
+"\t# <PORT> is the port used on the host to communicate with the server\n"
+"\t# <NETWORK> is the name of the docker network used (by default, it’s freshrss-network)\n"
+"\tdocker run -it --rm -p <PORT>:8080 --name wiremock --network <NETWORK> -v $PWD:/home/wiremock wiremock/wiremock:latest-alpine --local-response-templating\n"
+"\t```\n"
+"1. You can access the `<RSS>` mock file directly:\n"
+" * from the host by sending a GET request to `http://localhost:<PORT>/<RSS>`,\n"
+" * from any container connected on the same network by sending a GET request to `http://wiremock:8080/<RSS>`.\n"
+msgstr ""
+
#. type: Title #
#: en/./developers/04_Frontend/01_View_files.md:1
+#, fuzzy, no-wrap
+#| msgid "Views"
+msgid "View files"
+msgstr "Vues"
+
+#. type: Title ##
+#: en/./developers/04_Frontend/01_View_files.md:3
#, no-wrap
msgid "The .phtml files"
msgstr "Les fichiers .phtml"
-#. type: Title #
-#: en/./developers/04_Frontend/01_View_files.md:5
+#. type: Title ##
+#: en/./developers/04_Frontend/01_View_files.md:7
#, no-wrap
msgid "Writing a URL"
msgstr "Écrire une URL"
-#. type: Title #
-#: en/./developers/04_Frontend/01_View_files.md:9
+#. type: Title ##
+#: en/./developers/04_Frontend/01_View_files.md:11
#, no-wrap
msgid "Displaying an icon"
msgstr "Afficher une icĂ´ne"
-#. type: Title #
-#: en/./developers/04_Frontend/02_Design.md:1
+#. type: Title ##
+#: en/./developers/04_Frontend/01_View_files.md:15
#, no-wrap
-msgid "Template file"
-msgstr "Fichier modèle"
+msgid "Internationalisation"
+msgstr "Internationalisation"
#. type: Title #
-#: en/./developers/04_Frontend/02_Design.md:5
+#: en/./developers/04_Frontend/02_Design.md:1
#, no-wrap
msgid "Writing a new theme"
msgstr "Écrire un nouveau thème"
-#. type: Title #
-#: en/./developers/04_Frontend/02_Design.md:9
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:4
+#, no-wrap
+msgid "**Note: Currently personal themes are not officially supported and may be overwritten when updating. Be sure to keep backups!**\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:6
+#, no-wrap
+msgid "**As of writing (02-02-2021), support for themes as extensions is under development.**\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:8
+msgid ""
+"The easiest way to create a theme is by copying and modifying the base theme "
+"(or another of the pre-installed themes). The base theme can be found in [/p/"
+"themes/base-theme](https://github.com/FreshRSS/FreshRSS/tree/edge/p/themes/"
+"base-theme). Themes require:"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/04_Frontend/02_Design.md:13
+msgid "a **metadata.json** file to describe the theme."
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/04_Frontend/02_Design.md:13
+msgid ""
+"a **loader.gif** file to use as a loading icon (assuming .loading’s "
+"background has not been overridden)"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/04_Frontend/02_Design.md:13
+msgid ""
+"an **icons** folder containing .svg, .ico, and .png files to override "
+"existing icons"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/04_Frontend/02_Design.md:13
+msgid ""
+"a **thumbs** folder containing a file, **original.png** that will be used as "
+"the preview for the theme"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:15
+msgid ""
+"\"_frss.css\" is normally added to the metadata file as a fallback for "
+"missing aspects. The file is taken from the base theme. If submitting a pull "
+"request for a theme, please know that [pull request themes must include this "
+"file.](https://github.com/FreshRSS/FreshRSS/pull/2938#issuecomment-624085450)"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/04_Frontend/02_Design.md:16
+#, no-wrap
+msgid "RTL Support"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:19
+msgid ""
+"RTL (right-to-left) support for languages such as Hebrew and Arabic is "
+"handled through CSSJanus. To generate an RTL CSS file from your standard "
+"file, use `make rtl`. Be sure to commit the resulting file (filename.rtl."
+"css)."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/04_Frontend/02_Design.md:20
#, no-wrap
msgid "Overriding icons"
msgstr "Surcharger les icĂ´nes"
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:23
+msgid ""
+"To replace the default icons, add an \"icons\" folder to your theme’s "
+"folder. Use files with the same name as the default icon to override them."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/04_Frontend/02_Design.md:24
+#, no-wrap
+msgid "Template file"
+msgstr "Fichier modèle"
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:27
+msgid "`metadata.json`"
+msgstr ""
+
+#. type: Fenced code block (json)
+#: en/./developers/04_Frontend/02_Design.md:28
+#, no-wrap
+msgid ""
+"{\n"
+"\t\"name\": \"Theme name\",\n"
+"\t\"author\": \"Theme author\",\n"
+"\t\"description\": \"Theme description\",\n"
+"\t\"version\": 0.1,\n"
+"\t\"files\": [\"_frss.css\", \"file1.css\", \"file2.css\"]\n"
+"}\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:38
+msgid ""
+"An example of a css theme file can be found at [/p/themes/base-theme/base."
+"css](https://github.com/FreshRSS/FreshRSS/blob/edge/p/themes/base-theme/base."
+"css)"
+msgstr ""
+
#. type: Title #
#: en/./developers/04_Pull_requests.md:1
#, no-wrap
@@ -3166,6 +2508,12 @@ msgstr ""
#. type: Plain text
#: en/./developers/04_Pull_requests.md:12
+#, no-wrap
+msgid "**TODO:** Update this section. With GitHub’s *squash and merge*, rebasing (and other forms of history rewriting) is more dangerous and annoying (e.g. breaking review mechanism) than useful.\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Pull_requests.md:14
msgid ""
"Rebasing a branch is useful to make sure your code is based on the most "
"recent version of FreshRSS and there are no conflicts. You have two ways to "
@@ -3173,20 +2521,20 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:14
+#: en/./developers/04_Pull_requests.md:16
msgid ""
"If you have any doubt, please let us know and we’ll help you! We all began "
"with Git one day and it’s not an easy thing to work with."
msgstr ""
#. type: Title ###
-#: en/./developers/04_Pull_requests.md:15
+#: en/./developers/04_Pull_requests.md:17
#, no-wrap
msgid "Rebasing"
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:18
+#: en/./developers/04_Pull_requests.md:20
msgid ""
"Rebasing is the cleanest method because the Git history will be completely "
"linear and consequently easier to read and navigate. It might also be more "
@@ -3195,7 +2543,7 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:20
+#: en/./developers/04_Pull_requests.md:22
msgid ""
"Note that you should never rebase a branch if someone else is working on it. "
"Otherwise, since it rewrites the history, it can be a real mess to sort it "
@@ -3203,36 +2551,36 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:22
+#: en/./developers/04_Pull_requests.md:24
msgid "To rebase a branch:"
msgstr ""
-#. type: Plain text
-#: en/./developers/04_Pull_requests.md:23
+#. type: Fenced code block (sh)
+#: en/./developers/04_Pull_requests.md:25
#, no-wrap
msgid ""
-"$ git checkout edge # go on edge branch\n"
-"$ git pull upstream edge # pull the last version of edge\n"
-"$ git checkout - # go back to your branch\n"
-"$ git rebase edge # rebase your branch on edge\n"
+"git checkout edge # go on edge branch\n"
+"git pull upstream edge # pull the last version of edge\n"
+"git checkout - # go back to your branch\n"
+"git rebase edge # rebase your branch on edge\n"
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:31
+#: en/./developers/04_Pull_requests.md:33
msgid ""
"If you feel confident, you can use `git rebase -i edge` to rewrite your "
"history and make it clearer."
msgstr ""
#. type: Title ###
-#: en/./developers/04_Pull_requests.md:32
+#: en/./developers/04_Pull_requests.md:34
#, fuzzy, no-wrap
#| msgid "Debugging"
msgid "Merging"
msgstr "Déboguer"
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:35
+#: en/./developers/04_Pull_requests.md:37
msgid ""
"If you prefer, you can simply merge `edge` into your own branch. Conflicts "
"might be easier to resolve, but your Git history will be less readable. "
@@ -3240,29 +2588,29 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:37
+#: en/./developers/04_Pull_requests.md:39
msgid "To merge `edge`:"
msgstr ""
-#. type: Plain text
-#: en/./developers/04_Pull_requests.md:38
+#. type: Fenced code block (sh)
+#: en/./developers/04_Pull_requests.md:40
#, no-wrap
msgid ""
-"$ git checkout edge # go on edge branch\n"
-"$ git pull upstream edge # pull the last version of edge\n"
-"$ git checkout - # go back to your branch\n"
-"$ git merge edge # merge edge into your branch\n"
+"git checkout edge # go on edge branch\n"
+"git pull upstream edge # pull the last version of edge\n"
+"git checkout - # go back to your branch\n"
+"git merge edge # merge edge into your branch\n"
msgstr ""
#. type: Title ##
-#: en/./developers/04_Pull_requests.md:45
+#: en/./developers/04_Pull_requests.md:47
#, fuzzy, no-wrap
#| msgid "How to write a commit message"
msgid "How to write a Git commit message"
msgstr "Comment écrire un message de commit"
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:48
+#: en/./developers/04_Pull_requests.md:50
msgid ""
"It’s important to have proper commit messages in order to facilitate later "
"debugging, so please read the following advice. Commit messages should "
@@ -3270,22 +2618,22 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:50
+#: en/./developers/04_Pull_requests.md:52
msgid ""
-"The first line should start with a verb (e.g., \"Add\") and explain the "
+"The first line should start with a verb (e.g., “Add”) and explain the "
"objective of the commit in few words. It’s usually less than 50 characters "
"so it remains concise. You can consider this line the subject of your "
"commit. Think of it as the second part of a sentence that starts with the "
-"words \"This commit will.\""
+"words “This commit will.”"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/04_Pull_requests.md:52
+#: en/./developers/04_Pull_requests.md:54
msgid "This commit will *add feature X*"
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:54
+#: en/./developers/04_Pull_requests.md:56
msgid ""
"Then, insert a blank line, and start to write the body. It’s usually wrapped "
"at 72 characters, but you are pretty free in the tone of the message. The "
@@ -3297,14 +2645,14 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:56
+#: en/./developers/04_Pull_requests.md:58
msgid ""
"You also can add references (e.g., the URL to the initial ticket in the bug "
"tracker, or a reference to some forum explaining a point)."
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:58
+#: en/./developers/04_Pull_requests.md:60
#, fuzzy
#| msgid ""
#| "For further tips, see [here](https://chris.beams.io/posts/git-commit/)."
@@ -3315,14 +2663,14 @@ msgstr ""
"Pour d’autres conseils, voir [ici](https://chris.beams.io/posts/git-commit/)."
#. type: Title ##
-#: en/./developers/04_Pull_requests.md:59
+#: en/./developers/04_Pull_requests.md:61
#, fuzzy, no-wrap
#| msgid "How to write a commit message"
msgid "How to write tests"
msgstr "Comment écrire un message de commit"
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:62
+#: en/./developers/04_Pull_requests.md:64
msgid ""
"FreshRSS has few tests for now, but we’re working on it. We added this point "
"to the checklist to help us to write more tests, and we would really "
@@ -3330,35 +2678,35 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:64
+#: en/./developers/04_Pull_requests.md:66
msgid ""
"We use [PHPUnit](https://phpunit.de/) version 7.5 ([documentation](https://"
"phpunit.readthedocs.io/en/7.5/))."
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:66
+#: en/./developers/04_Pull_requests.md:68
msgid ""
"You’ll find more information on how to run tests [in this document]"
"(03_Running_tests.md)."
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:68
+#: en/./developers/04_Pull_requests.md:70
msgid ""
"Feel free to ask us for assistance. Not everything will be easy to test, so "
"don’t spend too much time on this."
msgstr ""
#. type: Title ##
-#: en/./developers/04_Pull_requests.md:69
+#: en/./developers/04_Pull_requests.md:71
#, fuzzy, no-wrap
#| msgid "Contribute to documentation"
msgid "Why you should write documentation"
msgstr "Contribuer Ă  la documentation"
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:72
+#: en/./developers/04_Pull_requests.md:74
msgid ""
"A friendly project should have correct and complete documentation, so "
"newcomers don’t have to ask too many questions, and users can find answers "
@@ -3367,7 +2715,7 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:73
+#: en/./developers/04_Pull_requests.md:75
msgid ""
"Our documentation can still be improved quite a bit, so you’re very welcome "
"if you want to help."
@@ -3380,32 +2728,40 @@ msgid "Preparing the release"
msgstr "Préparer la sortie"
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:4
+#: en/./developers/05_Release_new_version.md:5
+#, fuzzy
+#| msgid ""
+#| "In order to get as much feedback as possible before a release, it’s "
+#| "preferable to announce it on GitHub by creating a dedicated ticket ([see "
+#| "examples] (https://github.com/FreshRSS/FreshRSS/search?"
+#| "utf8=%E2%9C%93&q=Call+for+testing&type=Issues)). This should be done **at "
+#| "least one week in advance**."
msgid ""
"In order to get as much feedback as possible before a release, it’s "
"preferable to announce it on GitHub by creating a dedicated ticket ([see "
-"examples] (https://github.com/FreshRSS/FreshRSS/search?utf8=%E2%9C%93&q=Call"
-"+for+testing&type=Issues)). This should be done **at least one week in "
-"advance**."
+"examples](https://github.com/FreshRSS/FreshRSS/search?"
+"utf8=%E2%9C%93&q=Call+for+testing&type=Issues)). This should be done **at "
+"least one week in advance**."
msgstr ""
"Afin d’avoir le plus de retour possible avant une sortie, il est préférable "
"de l’annoncer sur GitHub en créant un ticket dédié ([voir les exemples]"
-"(https://github.com/FreshRSS/FreshRSS/search?utf8=%E2%9C%93&q=Call+for"
-"+testing&type=Issues)). Ceci est à faire **au moins une semaine à l’avance**."
+"(https://github.com/FreshRSS/FreshRSS/search?"
+"utf8=%E2%9C%93&q=Call+for+testing&type=Issues)). Ceci est Ă  faire **au moins "
+"une semaine à l’avance**."
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:6
+#: en/./developers/05_Release_new_version.md:7
msgid "It’s also recommended to make the announcement on mailing@freshrss.org."
msgstr "Il est aussi recommandé de faire l’annonce sur mailing@freshrss.org."
-#. type: Title #
-#: en/./developers/05_Release_new_version.md:7
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:8
#, no-wrap
msgid "Check the dev status"
msgstr "S’assurer de l’état de dev"
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:10
+#: en/./developers/05_Release_new_version.md:11
msgid ""
"Before releasing a new version of FreshRSS, you must ensure that the code is "
"stable and free of major bugs. Ideally, our tests should be automated and "
@@ -3417,7 +2773,7 @@ msgstr ""
"publication."
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:12
+#: en/./developers/05_Release_new_version.md:13
msgid ""
"You must also **make sure that the CHANGELOG file is up to date** with the "
"updates of the version to be released."
@@ -3425,14 +2781,14 @@ msgstr ""
"Il faut aussi **vous assurer que le fichier CHANGELOG est Ă  jour** avec les "
"mises Ă  jour de la version Ă  sortir."
-#. type: Title #
-#: en/./developers/05_Release_new_version.md:13
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:14
#, no-wrap
msgid "Git process"
msgstr "Processus Git"
-#. type: Plain text
-#: en/./developers/05_Release_new_version.md:15
+#. type: Fenced code block (console)
+#: en/./developers/05_Release_new_version.md:16
#, no-wrap
msgid ""
"$ git checkout edge\n"
@@ -3455,14 +2811,14 @@ msgstr ""
"Version x.y.z\n"
"$ git push && git push --tags\n"
-#. type: Title #
-#: en/./developers/05_Release_new_version.md:27
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:28
#, no-wrap
msgid "Updating `update.freshrss.org`"
msgstr "Mise Ă  jour de update.freshrss.org"
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:30
+#: en/./developers/05_Release_new_version.md:31
msgid ""
"It’s important to update update.freshrss.org since this is the default "
"service for automatic FreshRSS updates."
@@ -3471,38 +2827,41 @@ msgstr ""
"service par défaut gérant les mises à jour automatiques de FreshRSS."
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:32
+#: en/./developers/05_Release_new_version.md:33
+#, fuzzy
+#| msgid ""
+#| "The repository managing the code is located on GitHub: [FreshRSS/update."
+#| "freshrss.org] (https://github.com/FreshRSS/update.freshrss.org/)."
msgid ""
"The repository managing the code is located on GitHub: [FreshRSS/update."
-"freshrss.org] (https://github.com/FreshRSS/update.freshrss.org/)."
+"freshrss.org](https://github.com/FreshRSS/update.freshrss.org/)."
msgstr ""
"Le dépot gérant le code se trouve sur GitHub : [FreshRSS/update.freshrss.org]"
"(https://github.com/FreshRSS/update.freshrss.org/)."
#. type: Title ##
-#: en/./developers/05_Release_new_version.md:33
+#: en/./developers/05_Release_new_version.md:34
#, no-wrap
msgid "Writing the update script"
msgstr "Écriture du script de mise à jour"
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:36
+#: en/./developers/05_Release_new_version.md:37
msgid ""
"The scripts are located in the `./scripts/` directory and must take the form "
"`update_to_x.y.z.z.php`. This directory also contains `update_to_dev.php` "
-"intended for updates of the `edge` branch (this script must not include "
-"code specific to a particular version!) and `update_util.php`, which "
-"contains a list of functions useful for all scripts."
+"intended for updates of the `edge` branch (this script must not include code "
+"specific to a particular version!) and `update_util.php`, which contains a "
+"list of functions useful for all scripts."
msgstr ""
"Les scripts se trouvent dans le répertoire `./scripts/` et doivent être de "
"la forme `update_to_x.y.z.php`. On trouve aussi dans ce répertoire "
-"`update_to_dev.php` destiné aux mises à jour de la branche `edge` (ce "
-"script ne doit pas inclure de code spécifique à une version particulière !) "
-"et `update_util.php` contenant une liste de fonctions utiles Ă  tous les "
-"scripts."
+"`update_to_dev.php` destiné aux mises à jour de la branche `edge` (ce script "
+"ne doit pas inclure de code spécifique à une version particulière !) et "
+"`update_util.php` contenant une liste de fonctions utiles Ă  tous les scripts."
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:38
+#: en/./developers/05_Release_new_version.md:39
msgid ""
"In order to write a new script, it’s better to copy/paste the last version "
"or to start from `update_to_dev.php`. The first thing to do is to define the "
@@ -3517,12 +2876,12 @@ msgstr ""
"github.com/FreshRSS/FreshRSS/zip/x.y.z`."
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:40
+#: en/./developers/05_Release_new_version.md:41
msgid "There are then 5 functions that have to be executed:"
msgstr "Il existe ensuite 5 fonctions Ă  remplir :"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:46
+#: en/./developers/05_Release_new_version.md:47
msgid ""
"`apply_update()` takes care of saving the directory containing the data, "
"checking its structure, downloading the FreshRSS package, deploying it and "
@@ -3538,7 +2897,7 @@ msgstr ""
"ou une chaîne de caractères indiquant un soucis ;"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:46
+#: en/./developers/05_Release_new_version.md:47
msgid ""
"`need_info_update()` returns `true` if the user must intervene during the "
"update or `false` if not;"
@@ -3547,7 +2906,7 @@ msgstr ""
"la mise Ă  jour ou `false` sinon ;"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:46
+#: en/./developers/05_Release_new_version.md:47
msgid ""
"`ask_info_update()` displays a form to the user if `need_info_update()` has "
"returned `true`;"
@@ -3556,7 +2915,7 @@ msgstr ""
"`need_info_update()` a retourné `true` ;"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:46
+#: en/./developers/05_Release_new_version.md:47
msgid ""
"`save_info_update()` is responsible for saving the information filled out by "
"the user (from the `ask_info_update()` form);"
@@ -3565,7 +2924,7 @@ msgstr ""
"par l’utilisateur (issues du formulaire de `ask_info_update()`) ;"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:46
+#: en/./developers/05_Release_new_version.md:47
msgid ""
"`do_post_update()` is executed at the end of the update and takes into "
"account the code of the new version (e.g., if the new version changes the "
@@ -3576,13 +2935,13 @@ msgstr ""
"l’objet `Minz_Configuration`, vous bénéficierez de ces améliorations)."
#. type: Title ##
-#: en/./developers/05_Release_new_version.md:47
+#: en/./developers/05_Release_new_version.md:48
#, no-wrap
msgid "Updating the versions file"
msgstr "Mise Ă  jour du fichier de versions"
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:50
+#: en/./developers/05_Release_new_version.md:51
msgid ""
"Once the script has been written and versioned, it’s necessary to update the "
"`./versions.php' file which contains a mapping table indicating which "
@@ -3593,12 +2952,12 @@ msgstr ""
"indiquant quelles versions sont mises Ă  jour vers quelles autres versions."
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:52
+#: en/./developers/05_Release_new_version.md:53
msgid "Here’s an example of a `versions.php` file:"
msgstr "Voici un exemple de fichier `versions.php` :"
-#. type: Plain text
-#: en/./developers/05_Release_new_version.md:53
+#. type: Fenced code block (php)
+#: en/./developers/05_Release_new_version.md:54
#, no-wrap
msgid ""
"<?php\n"
@@ -3626,27 +2985,27 @@ msgstr ""
");\n"
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:68
+#: en/./developers/05_Release_new_version.md:69
msgid "And here’s how this table works:"
msgstr "Et voici comment fonctionne cette table :"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:74
+#: en/./developers/05_Release_new_version.md:75
msgid "on the left you can find the N version, on the right the N+1 version;"
msgstr "Ă  gauche se trouve la version N, Ă  droite la version N+1 ;"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:74
+#: en/./developers/05_Release_new_version.md:75
msgid "the `x.y.z.z-dev` versions are **all** updated to `edge`;"
msgstr "les versions `x.y.z-dev` sont **toutes** mises Ă  jour vers `edge` ;"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:74
+#: en/./developers/05_Release_new_version.md:75
msgid "stable versions are updated to stable versions;"
msgstr "les versions stables sont mises Ă  jour vers des versions stables ;"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:74
+#: en/./developers/05_Release_new_version.md:75
msgid ""
"it’s possible to skip several versions at once, provided that the update "
"scripts support it;"
@@ -3655,7 +3014,7 @@ msgstr ""
"scripts de mise Ă  jour le prennent en charge ;"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:74
+#: en/./developers/05_Release_new_version.md:75
msgid ""
"it’s advisable to indicate the correspondence of the current version to its "
"potential future version by specifying that this version does not yet exist. "
@@ -3666,22 +3025,26 @@ msgstr ""
"encore. Tant que le script correspondant n’existera pas, rien ne se passera."
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:76
+#: en/./developers/05_Release_new_version.md:77
+#, fuzzy
+#| msgid ""
+#| "It’s **very strongly** recommended to keep this file organized according "
+#| "to version numbers by separating stable and dev versions."
msgid ""
-"It’s **very strongly** recommended to keep this file organized according to "
+"It’s**very strongly** recommended to keep this file organized according to "
"version numbers by separating stable and dev versions."
msgstr ""
"Il est **très fortement** indiqué de garder ce fichier rangé selon les "
"numéros de versions en séparant les versions stables et de dev."
#. type: Title ##
-#: en/./developers/05_Release_new_version.md:77
+#: en/./developers/05_Release_new_version.md:78
#, no-wrap
msgid "Deployment"
msgstr "Déploiement"
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:80
+#: en/./developers/05_Release_new_version.md:81
msgid ""
"Before updating update.freshrss.org, it’s better to test with dev.update."
"freshrss.org, which corresponds to pre-production. So update dev.update."
@@ -3695,7 +3058,7 @@ msgstr ""
"déroule correctement."
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:82
+#: en/./developers/05_Release_new_version.md:83
msgid ""
"When you’re satisfied, update update.freshrss.org with the new script, test "
"it again, and then move on."
@@ -3703,44 +3066,44 @@ msgstr ""
"Lorsque vous serez satisfait, mettez Ă  jour update.freshrss.org avec le "
"nouveau script et en testant de nouveau puis passez Ă  la suite."
-#. type: Title #
-#: en/./developers/05_Release_new_version.md:83
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:84
#, no-wrap
msgid "Updating the FreshRSS services"
msgstr "Mise Ă  jour des services FreshRSS"
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:86
+#: en/./developers/05_Release_new_version.md:87
msgid "Two services need to be updated immediately after the update."
msgstr ""
"Deux services sont à mettre à jour immédiatement après la mise à jour de "
"update.freshrss.org :"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:89
+#: en/./developers/05_Release_new_version.md:90
msgid "rss.freshrss.org;"
msgstr "rss.freshrss.org ;"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:89
+#: en/./developers/05_Release_new_version.md:90
msgid "demo.freshrss.org (public login: `demo` / `demodemo`)."
msgstr "demo.freshrss.org (identifiants publics : `demo` / `demodemo`)."
-#. type: Title #
-#: en/./developers/05_Release_new_version.md:90
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:91
#, no-wrap
msgid "Publicly announce the release"
msgstr "Annoncer publiquement la sortie"
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:93
+#: en/./developers/05_Release_new_version.md:94
msgid ""
"When everything’s working, it’s time to announce the release to the world!"
msgstr ""
"Lorsque tout fonctionne, il est temps d’annoncer la sortie au monde entier !"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:98
+#: en/./developers/05_Release_new_version.md:99
msgid ""
"on GitHub by creating[a new release](https://github.com/FreshRSS/FreshRSS/"
"releases/new)"
@@ -3749,7 +3112,7 @@ msgstr ""
"FreshRSS/releases/new) ;"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:98
+#: en/./developers/05_Release_new_version.md:99
msgid ""
"on the freshrss.org blog, at least for stable versions (write the article "
"on[FreshRSS/freshrss.org](https://github.com/FreshRSS/freshrss.org))"
@@ -3759,23 +3122,23 @@ msgstr ""
"org))."
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:98
+#: en/./developers/05_Release_new_version.md:99
msgid "on Twitter ([@FreshRSS](https://twitter.com/FreshRSS) account)"
msgstr "sur Twitter (compte [@FreshRSS](https://twitter.com/FreshRSS)) ;"
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:98
+#: en/./developers/05_Release_new_version.md:99
msgid "and on mailing@freshrss.org"
msgstr "et sur mailing@freshrss.org ;"
-#. type: Title #
-#: en/./developers/05_Release_new_version.md:99
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:100
#, no-wrap
msgid "Starting the next development version"
msgstr "Lancer la prochaine version de développement"
-#. type: Plain text
-#: en/./developers/05_Release_new_version.md:101
+#. type: Fenced code block (console)
+#: en/./developers/05_Release_new_version.md:102
#, no-wrap
msgid ""
"$ git checkout edge\n"
@@ -3793,7 +3156,7 @@ msgstr ""
"$ git add CHANGELOG.md && git commit && git push\n"
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:110
+#: en/./developers/05_Release_new_version.md:111
msgid ""
"Also remember to update update.freshrss.org so that it takes the current "
"development version into account."
@@ -3801,13 +3164,2129 @@ msgstr ""
"Pensez aussi à mettre à jour update.freshrss.org pour qu’il prenne en compte "
"la version de développement actuelle."
+#. type: Title #
+#: en/./developers/06_Fever_API.md:1
+#, no-wrap
+msgid "FreshRSS - Fever API implementation"
+msgstr "FreshRSS - API compatible Fever"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:5
+msgid ""
+"See [Mobile access](../users/06_Mobile_access.md) for general aspects of API "
+"access. Additionally [page about our Google Reader compatible API]"
+"(06_GoogleReader_API.md) for another possibility."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_Fever_API.md:7 en/./developers/06_GoogleReader_API.md:7
+#, no-wrap
+msgid "RSS clients"
+msgstr "Clients compatibles"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:12
+#, fuzzy
+#| msgid ""
+#| "There are many RSS clients that support the Fever API, but they seem to "
+#| "understand the Fever API a bit differently. If your favourite client "
+#| "doesn’t work properly with this API, please create an issue and we will "
+#| "have a look. But we can **only** do that for free clients."
+msgid ""
+"There are many RSS clients that support the Fever API, but they seem to "
+"understand the Fever API a bit differently. If your favourite client "
+"doesn’t work properly with this API, please create an issue and we’ll have a "
+"look. But we can **only** do that for free clients."
+msgstr ""
+"De nombreux clients RSS prennent en charge l’API Fever, mais ils semblent "
+"comprendre l’API Fever un peu différemment. Si votre client préféré ne "
+"fonctionne pas correctement avec cette API, veuiller créer un ticket et nous "
+"y jetterons un oeil. Mais nous ne pouvons le faire que pour les clients "
+"gratuits."
+
+#. type: Title ##
+#: en/./developers/06_Fever_API.md:13 en/./developers/06_GoogleReader_API.md:13
+#, no-wrap
+msgid "Usage & Authentication"
+msgstr "Utilisation et authentification"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:17 en/./developers/06_GoogleReader_API.md:17
+#, fuzzy
+#| msgid ""
+#| "Before you can start using this API, you have to enable and setup API "
+#| "access, which is [documented here](https://freshrss.github.io/FreshRSS/en/"
+#| "users/06_Mobile_access.html), and then reset the user’s API password."
+msgid ""
+"Before you can start using this API, you have to enable and setup API "
+"access, which is [documented here](../users/06_Mobile_access.md), and then "
+"reset the user’s API password."
+msgstr ""
+"Avant de pouvoir commencer Ă  utiliser cette API, vvous devez activer et "
+"configurer l’accès à l’API, qui est [documenté ici](https://freshrss.github."
+"io/FreshRSS/en/users/06_Mobile_access.html), et réinitialisez ensuite le mot "
+"de passe API de l’utilisateur."
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:19
+msgid ""
+"Then point your mobile application to the `fever.php` address (e.g. `https://"
+"freshrss.example.net/api/fever.php`)."
+msgstr ""
+"Connectez ensuite votre application mobile en utilisant l’adresse de l’API "
+"(e.g. `https://freshrss.example.net/api/fever.php`)."
+
+#. type: Title ##
+#: en/./developers/06_Fever_API.md:20 en/./developers/06_GoogleReader_API.md:20
+#, no-wrap
+msgid "Compatible clients"
+msgstr "Clients compatibles"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:31
+#, no-wrap
+msgid ""
+"| App | Platform | License |\n"
+"|:----------------------------------------------------------------------------------:|:-------------------:|:--------------------------------------------------------:|\n"
+"|[Fluent Reader](https://hyliu.me/fluent-reader/) |Windows, Linux, macOS|[BSD-3-Clause](https://github.com/yang991178/fluent-reader/blob/master/LICENSE)|\n"
+"|[Fluent Reader lite](https://hyliu.me/fluent-reader-lite/) |Android, iOS |[BSD-3-Clause](https://github.com/yang991178/fluent-reader-lite)|\n"
+"|[Fiery Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) |iOS |Closed Source |\n"
+"|[Newsflash](https://gitlab.com/news-flash/news_flash_gtk/) |Linux |[GPLv3](https://gitlab.com/news-flash/news_flash_gtk/)|\n"
+"|[Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) |iOS |Closed Source |\n"
+"|[Reeder](https://www.reederapp.com/) |iOS |Closed Source |\n"
+"|[ReadKit](https://apps.apple.com/app/readkit/id588726889) |macOS |Closed Source |\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_Fever_API.md:32 en/./index.md:7
+#, no-wrap
+msgid "Features"
+msgstr "Fonctionnalités"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:35
+msgid "The following features are implemented:"
+msgstr "Les fonctionnalités suivantes sont implémentées :"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:45
+msgid "fetching categories"
+msgstr "récupération des catégories"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:45
+msgid "fetching feeds"
+msgstr "récupération des flux"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:45
+msgid ""
+"fetching RSS items (new, favorites, unread, by_id, by_feed, by_category, "
+"since)"
+msgstr ""
+"récupération des entrées (new, favorites, unread, by_id, by_feed, "
+"by_category,since)"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:45
+msgid "fetching favicons"
+msgstr "récupération des favicons"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:45
+msgid "setting read marker for item(s)"
+msgstr "marquage des entrées comme lues"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:45
+msgid "setting starred marker for item(s)"
+msgstr "marquage des entrées comme favoris"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:45
+msgid "setting read marker for feed"
+msgstr "marquage d’un flux comme lu"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:45
+msgid "setting read marker for category"
+msgstr "marquage d’une catégorie comme lue"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:45
+msgid "supports FreshRSS extensions, which use the `entry_before_display` hook"
+msgstr "support des extensions grace au hook `entry_before_display`"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:47
+msgid "The following features are not supported:"
+msgstr "Les fonctionnalités suivantes ne sont pas implémentées :"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:49
+msgid ""
+"**Hot Links** aka **hot** as there is nothing in FreshRSS yet that is "
+"similar or could be used to simulate it."
+msgstr ""
+"« Hot Links » car il n’y a encore rien dans FreshRSS qui soit similaire ou "
+"qui puisse être utilisé pour le simuler."
+
+#. type: Title ##
+#: en/./developers/06_Fever_API.md:50
+#, no-wrap
+msgid "Testing and debugging"
+msgstr "Tester et déboguer"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:53
+#, fuzzy
+#| msgid ""
+#| "If this API doesn’t work as expected in your RSS reader, you can test it "
+#| "manually with a tool like [Postman](https://www.getpostman.com/)."
+msgid ""
+"If this API does not work as expected in your RSS reader, you can test it "
+"manually with a tool like [Postman](https://www.getpostman.com/)."
+msgstr ""
+"Si l’API ne fonctionne pas comme attendu dans votre lecteur, il est possible "
+"de la tester manuellement avec un outil tel que [Postman](https://www."
+"getpostman.com/)."
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:55
+#, fuzzy
+#| msgid ""
+#| "Configure a POST request to the URL https://freshrss.example.net/api/"
+#| "fever.php?api which should give you the result:"
+msgid ""
+"Configure a POST request to the URL <https://freshrss.example.net/api/fever."
+"php?api> which should give you the result:"
+msgstr ""
+"Envoyer une requête POST à l’adresse https://freshrss.example.net/api/fever."
+"php?api devrait vous renvoyer le résultat suivant :"
+
+#. type: Fenced code block (json)
+#: en/./developers/06_Fever_API.md:55
+#, no-wrap
+msgid ""
+"{\n"
+"\t\"api_version\": 3,\n"
+"\t\"auth\": 0\n"
+"}\n"
+msgstr ""
+"{\n"
+"\t\"api_version\": 3,\n"
+"\t\"auth\": 0\n"
+"}\n"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:62
+msgid "Great, the base setup seems to work!"
+msgstr "Super, la configuration de base fonctionne !"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:65
+msgid ""
+"Now lets try an authenticated call. Fever uses an `api_key`, which is the "
+"MD5 hash of `\"$username:$apiPassword\"`. Assuming the user is `kevin` and "
+"the password `freshrss`, here is a command-line example to compute the "
+"resulting `api_key`"
+msgstr ""
+"Maintenant essayons de faire un appel authentifié. Fever utilise un "
+"paramètre `api_key` qui contient le résultat de la fonction de hachage MD5 "
+"de la valeur `\"$username:$apiPassword\"`. En considérant que l’utilisateur "
+"est `kevin` et que son mot de passe est `freshrss`, voici la commande Ă  "
+"lancer pour calculer la valeur du paramètre `api_key` :"
+
+#. type: Fenced code block (sh)
+#: en/./developers/06_Fever_API.md:66
+#, no-wrap
+msgid "api_key=`echo -n \"kevin:freshrss\" | md5sum | cut -d' ' -f1`\n"
+msgstr "api_key=`echo -n \"kevin:freshrss\" | md5sum | cut -d' ' -f1`\n"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:71
+msgid ""
+"Add a body to your POST request encoded as `form-data` and one key named "
+"`api_key` with the value `your-password-hash`:"
+msgstr ""
+"Ajoutez un contenu sous forme de `form-data`Ă  votre requĂŞte POST ainsi que "
+"le paramètre `api_key` contenant la valeur calculée à l’étape précédente :"
+
+#. type: Fenced code block (sh)
+#: en/./developers/06_Fever_API.md:72
+#, no-wrap
+msgid "curl -s -F \"api_key=$api_key\" 'https://freshrss.example.net/api/fever.php?api'\n"
+msgstr "curl -s -F \"api_key=$api_key\" 'https://freshrss.exemple.net/api/fever.php?api'\n"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:77
+msgid "This should give:"
+msgstr "Vous devriez obtenir le résultat suivant :"
+
+#. type: Fenced code block (json)
+#: en/./developers/06_Fever_API.md:77
+#, no-wrap
+msgid ""
+"{\n"
+"\t\"api_version\": 3,\n"
+"\t\"auth\": 1,\n"
+"\t\"last_refreshed_on_time\": \"1520013061\"\n"
+"}\n"
+msgstr ""
+"{\n"
+"\t\"api_version\": 3,\n"
+"\t\"auth\": 1,\n"
+"\t\"last_refreshed_on_time\": \"1520013061\"\n"
+"}\n"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:85
+msgid ""
+"Perfect, you’re now authenticated and you can start testing the more "
+"advanced features. To do so, change the URL and append the possible API "
+"actions to your request parameters. Please refer to the [original Fever "
+"documentation](https://feedafever.com/api) for more information."
+msgstr ""
+"Parfait, maintenant vous êtes autentifié et vous pouvez commencer à tester "
+"les fonctions avancées. Pour cela, il suffit de changer l’adresse en lui "
+"ajoutant les paramètres nécessaires à la réalisation des actions supportées. "
+"Pour plus d’information, veuillez vous référer à la [documentation "
+"officielle de Fever](https://feedafever.com/api)."
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:87
+msgid "Some basic calls are:"
+msgstr "Voici quelques exemples simples d’appels réalisables :"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:97
+#, fuzzy
+#| msgid "https://freshrss.example.net/api/fever.php?api&items"
+msgid "<https://freshrss.example.net/api/fever.php?api&items>"
+msgstr "https://freshrss.example.net/api/fever.php?api&items"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:97
+#, fuzzy
+#| msgid "https://freshrss.example.net/api/fever.php?api&feeds"
+msgid "<https://freshrss.example.net/api/fever.php?api&feeds>"
+msgstr "https://freshrss.example.net/api/fever.php?api&feeds"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:97
+#, fuzzy
+#| msgid "https://freshrss.example.net/api/fever.php?api&groups"
+msgid "<https://freshrss.example.net/api/fever.php?api&groups>"
+msgstr "https://freshrss.example.net/api/fever.php?api&groups"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:97
+#, fuzzy
+#| msgid "https://freshrss.example.net/api/fever.php?api&unread_item_ids"
+msgid "<https://freshrss.example.net/api/fever.php?api&unread_item_ids>"
+msgstr "https://freshrss.example.net/api/fever.php?api&unread_item_ids"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:97
+#, fuzzy
+#| msgid "https://freshrss.example.net/api/fever.php?api&saved_item_ids"
+msgid "<https://freshrss.example.net/api/fever.php?api&saved_item_ids>"
+msgstr "https://freshrss.example.net/api/fever.php?api&saved_item_ids"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:97
+#, fuzzy
+#| msgid ""
+#| "https://freshrss.example.net/api/fever.php?api&items&since_id=some_id"
+msgid "<https://freshrss.example.net/api/fever.php?api&items&since_id=some_id>"
+msgstr "https://freshrss.example.net/api/fever.php?api&items&since_id=some_id"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:97
+#, fuzzy
+#| msgid "https://freshrss.example.net/api/fever.php?api&items&max_id=some_id"
+msgid "<https://freshrss.example.net/api/fever.php?api&items&max_id=some_id>"
+msgstr "https://freshrss.example.net/api/fever.php?api&items&max_id=some_id"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:97
+#, fuzzy
+#| msgid ""
+#| "https://freshrss.example.net/api/fever.php?"
+#| "api&mark=item&as=read&id=some_id"
+msgid ""
+"<https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id>"
+msgstr ""
+"https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:97
+#, fuzzy
+#| msgid ""
+#| "https://freshrss.example.net/api/fever.php?"
+#| "api&mark=item&as=unread&id=some_id"
+msgid ""
+"<https://freshrss.example.net/api/fever.php?"
+"api&mark=item&as=unread&id=some_id>"
+msgstr ""
+"https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:99
+msgid ""
+"Replace `some_id` with a real ID from your `freshrss_username_entry` "
+"database."
+msgstr ""
+"Remplacez `some_id` par un identifiant réel de votre base de données "
+"`freshrss_username_entry`."
+
+#. type: Title ###
+#: en/./developers/06_Fever_API.md:100
+#, no-wrap
+msgid "Debugging"
+msgstr "Déboguer"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:103
+msgid ""
+"If nothing helps and your client is still misbehaving, you can add the "
+"following lines to the beginning of the `fever.api` file to determine the "
+"cause of the problems:"
+msgstr ""
+"Si rien ne fonctionne correctement et que votre client se comporte "
+"étrangement, vous pouvez ajouter les quelques lignes suivantes au début du "
+"fichier `fever.api` pour déterminer la cause des problèmes rencontrés :"
+
+#. type: Fenced code block (php)
+#: en/./developers/06_Fever_API.md:104
+#, no-wrap
+msgid "file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' . json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);\n"
+msgstr "file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' . json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);\n"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:109
+msgid ""
+"Then use your RSS client to query the API and afterwards check the file "
+"`fever.log`."
+msgstr ""
+"Utilisez ensuite votre client RSS pour interroger l’API et vérifier le "
+"fichier `fever.log`."
+
+#. type: Title ##
+#: en/./developers/06_Fever_API.md:110
+#, no-wrap
+msgid "Credits"
+msgstr "Remerciements"
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:112
+msgid ""
+"This plugin was inspired by the [tinytinyrss-fever-plugin](https://github."
+"com/dasmurphy/tinytinyrss-fever-plugin)."
+msgstr ""
+"Ce plugin a été inspiré par le [tinytinyrss-fever-plugin](https://github.com/"
+"dasmurphy/tinytinyrss-fever-plugin)."
+
+#. type: Title #
+#: en/./developers/06_GoogleReader_API.md:1
+#, fuzzy, no-wrap
+#| msgid "FreshRSS - Fever API implementation"
+msgid "FreshRSS - Google Reader compatible API implementation"
+msgstr "FreshRSS - API compatible Fever"
+
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:4
+#, fuzzy
+#| msgid ""
+#| "See the [page about our Google Reader compatible API](06_Mobile_access."
+#| "md) for another possibility and general aspects of API access."
+msgid ""
+"See [Mobile access](../users/06_Mobile_access.md) for general aspects of API "
+"access."
+msgstr ""
+"Voir la page [sur notre API compatible Google Reader](06_Mobile_access.md) "
+"pour une autre possibilité et des généralités sur l’accès par API."
+
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:6
+#, fuzzy
+#| msgid ""
+#| "See the [page about our Google Reader compatible API](06_Mobile_access."
+#| "md) for another possibility and general aspects of API access."
+msgid ""
+"See also the [page about our Fever compatible API](06_Fever_API.md) for "
+"another possibility (less powerful)."
+msgstr ""
+"Voir la page [sur notre API compatible Google Reader](06_Mobile_access.md) "
+"pour une autre possibilité et des généralités sur l’accès par API."
+
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:12
+#, fuzzy
+#| msgid ""
+#| "There are many RSS clients that support the Fever API, but they seem to "
+#| "understand the Fever API a bit differently. If your favourite client "
+#| "doesn’t work properly with this API, please create an issue and we will "
+#| "have a look. But we can **only** do that for free clients."
+msgid ""
+"There are many RSS clients that support the Fever API, but they might "
+"understand the API a bit differently. If your favourite client doesn’t work "
+"properly with this API, please create an issue and we’ll have a look. But "
+"we can **only** do that for free clients."
+msgstr ""
+"De nombreux clients RSS prennent en charge l’API Fever, mais ils semblent "
+"comprendre l’API Fever un peu différemment. Si votre client préféré ne "
+"fonctionne pas correctement avec cette API, veuiller créer un ticket et nous "
+"y jetterons un oeil. Mais nous ne pouvons le faire que pour les clients "
+"gratuits."
+
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:19
+#, fuzzy
+#| msgid ""
+#| "Then point your mobile application to the `fever.php` address (e.g. "
+#| "`https://freshrss.example.net/api/fever.php`)."
+msgid ""
+"Then point your mobile application to the `greader.php` address (e.g. "
+"`https://freshrss.example.net/api/greader.php`)."
+msgstr ""
+"Connectez ensuite votre application mobile en utilisant l’adresse de l’API "
+"(e.g. `https://freshrss.example.net/api/fever.php`)."
+
+#. type: Bullet: '1. '
+#: en/./developers/06_GoogleReader_API.md:24
+#, fuzzy
+#| msgid ""
+#| "6. On the same FreshRSS API page, note the address given under “Your API "
+#| "address”, like `https://freshrss.example.net/api/greader.php`\n"
+#| "\t* Type the API address in a client, together with your FreshRSS "
+#| "username, and the corresponding special API password.\n"
+msgid ""
+"On the same FreshRSS API page, note the address given under “Your API "
+"address”, like `https://freshrss.example.net/api/greader.php`"
+msgstr ""
+"6. Sur la même page de l’API FreshRSS, notez l’adresse donnée sous \"Votre "
+"adresse API\", comme `https://freshrss.example.net/api/greader.php`\n"
+"\t* Saisissez l’adresse de l’API dans le client sélectionné puis votre nom "
+"d’utilisateur et votre mot de passe spécialement créé pour l’API.\n"
+
+#. type: Bullet: '2. '
+#: en/./developers/06_GoogleReader_API.md:24
+#, fuzzy
+#| msgid ""
+#| "6. On the same FreshRSS API page, note the address given under “Your API "
+#| "address”, like `https://freshrss.example.net/api/greader.php`\n"
+#| "\t* Type the API address in a client, together with your FreshRSS "
+#| "username, and the corresponding special API password.\n"
+msgid ""
+"Type the API address in a client, together with your FreshRSS username, and "
+"the corresponding special API password."
+msgstr ""
+"6. Sur la même page de l’API FreshRSS, notez l’adresse donnée sous \"Votre "
+"adresse API\", comme `https://freshrss.example.net/api/greader.php`\n"
+"\t* Saisissez l’adresse de l’API dans le client sélectionné puis votre nom "
+"d’utilisateur et votre mot de passe spécialement créé pour l’API.\n"
+
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:39
+#, no-wrap
+msgid ""
+"| App | Platform | License |\n"
+"|:----------------------------------------------------------------------------------:|:-------------------:|:--------------------------------------------------------:|\n"
+"|[News+](https://github.com/noinnion/newsplus/blob/master/apk/NewsPlus_202.apk) with [News+ Google Reader extension](https://github.com/noinnion/newsplus/blob/master/apk/GoogleReaderCloneExtension_101.apk) |Android|Closed Source (Free), [partially open source](https://github.com/noinnion/newsplus/blob/master/extensions/GoogleReaderCloneExtension/src/com/noinnion/android/newsplus/extension/google_reader/GoogleReaderClient.java)|\n"
+"|[FeedMe 3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) |Android |Closed Source (Free) |\n"
+"|[EasyRSS](https://github.com/Alkarex/EasyRSS) |Android |[GPLv3](https://github.com/Alkarex/EasyRSS/blob/master/license.txt) ([F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/))|\n"
+"|[Readrops](https://github.com/readrops/Readrops) |Android |[GPLv3](https://github.com/readrops/Readrops/blob/develop/LICENSE) |\n"
+"|[Fluent Reader Lite](https://hyliu.me/fluent-reader-lite/) |Android, iOS |[BSD-3](https://github.com/yang991178/fluent-reader-lite) |\n"
+"|[FocusReader](https://play.google.com/store/apps/details?id=allen.town.focus.reader) |Android |Closed Source(Free) |\n"
+"|[Newsflash](https://gitlab.com/news-flash/news_flash_gtk/) |Linux |[GPLv3](https://gitlab.com/news-flash/news_flash_gtk/) |\n"
+"|[lire](https://lireapp.com/) |iOS, macOS |Closed Source |\n"
+"|[Newsboat 2.24+](https://newsboat.org/) |Linux |[MIT](https://github.com/newsboat/newsboat/blob/master/LICENSE) |\n"
+"|[Vienna RSS](http://www.vienna-rss.com/) |macOS |[Apache-2.0](https://github.com/ViennaRSS/vienna-rss/blob/master/LICENCE.md) |\n"
+"|[Reeder](https://www.reederapp.com/) |macOS, iOS |Closed Source |\n"
+"|[FreshRSS-Notify](https://addons.mozilla.org/firefox/addon/freshrss-notify-webextension/) |Firefox |Open Source |\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:41
+#, no-wrap
+msgid "> ℹ️ See a [better table of compatible clients in our main Readme](https://github.com/FreshRSS/FreshRSS/blob/edge/README.md#apis--native-apps).\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_GoogleReader_API.md:42
+#, no-wrap
+msgid "Google Reader compatible API"
+msgstr "API compatible Google Reader"
+
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:45
+msgid "Examples of basic queries:"
+msgstr "Exemples de requĂŞtes simples :"
+
+#. type: Fenced code block (sh)
+#: en/./developers/06_GoogleReader_API.md:46
+#, no-wrap
+msgid ""
+"# Initial login, using API password (Email and Passwd can be given either as GET, or POST - better)\n"
+"curl 'https://freshrss.example.net/api/greader.php/accounts/ClientLogin?Email=alice&Passwd=Abcdef123456'\n"
+"SID=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
+"Auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
+"\n"
+"# Examples of read-only requests\n"
+"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/subscription/list?output=json'\n"
+"\n"
+"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/unread-count?output=json'\n"
+"\n"
+"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/tag/list?output=json'\n"
+"\n"
+"# Retrieve a token for requests making modifications\n"
+"curl -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/token'\n"
+"8e6845e089457af25303abc6f53356eb60bdb5f8ZZZZZZZZZZZZZZZZZ\n"
+"\n"
+"# Get articles, piped to jq for easier JSON reading\n"
+"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/stream/contents/reading-list' | jq .\n"
+msgstr ""
+"# Authentification utilisant le mot de passe API (Email et Passwd peuvent être passés en GET, ou POST - mieux)\n"
+"curl 'https://freshrss.example.net/api/greader.php/accounts/ClientLogin?Email=alice&Passwd=Abcdef123456'\n"
+"SID=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
+"Auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
+"\n"
+"# Exemples de requĂŞtes en lecture\n"
+"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/subscription/list?output=json'\n"
+"\n"
+"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/unread-count?output=json'\n"
+"\n"
+"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/tag/list?output=json'\n"
+"\n"
+"# Demande de jeton pour faire de requĂŞtes de modification\n"
+"curl -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/token'\n"
+"8e6845e089457af25303abc6f53356eb60bdb5f8ZZZZZZZZZZZZZZZZZ\n"
+"\n"
+"# Récupère les articles, envoyés à jq pour une lecture JSON plus facile\n"
+"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/stream/contents/reading-list' | jq .\n"
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:73
+#, fuzzy
+#| msgid ""
+#| "[Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/"
+#| "issues)"
+msgid ""
+"[Source code of our API implementation](https://github.com/FreshRSS/FreshRSS/"
+"blob/edge/p/api/greader.php)"
+msgstr ""
+"[Rendez-vous sur le gestionnaire de tickets de bugs](https://github.com/"
+"FreshRSS/FreshRSS/issues)"
+
+#. type: Title ###
+#: en/./developers/06_GoogleReader_API.md:74
+#, no-wrap
+msgid "API documentation from the original Google Reader"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:81
+msgid ""
+"[By Daniel Arowser](https://web.archive.org/web/20130710044440/http://undoc."
+"in/api.html) ([source](https://github.com/arowser/google-reader-api))"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:81
+msgid ""
+"[By Martin Doms](https://web.archive.org/web/20210126115837/https://blog."
+"martindoms.com/2009/10/16/using-the-google-reader-api-part-2/)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:81
+msgid ""
+"[By Nick Bradbury](https://inessential.com/2013/03/14/"
+"google_reader_api_documentation)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:81
+msgid ""
+"[By Niall Kennedy](https://web.archive.org/web/20170426184845/http://www."
+"niallkennedy.com/blog/2005/12/google-reader-api.html)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:81
+msgid ""
+"[By Mihai Parparita](https://web.archive.org/web/20140919042419/http://code."
+"google.com/p/google-reader-api/w/list) ([source](https://github.com/mihaip/"
+"google-reader-api))"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/06_GoogleReader_API.md:82
+#, no-wrap
+msgid "API documentation from other compatible clients"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:89
+msgid "[FeedHQ](https://feedhq.readthedocs.io/en/latest/api/index.html)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:89
+msgid "[Inoreader](https://www.inoreader.com/developers/)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:89
+msgid "[The Old Reader](https://github.com/theoldreader/api)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:89
+msgid "[pyrfeed](http://code.google.com/p/pyrfeed/wiki/GoogleReaderAPI)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:89
+msgid "[BazQux](https://github.com/bazqux/bazqux-api)"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/06_GoogleReader_API.md:90
+#, no-wrap
+msgid "Synchronisation strategy"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:94
+#, no-wrap
+msgid ""
+"> ℹ️ If you are maintaining a client or planning to develop a new one, please read carefully the following pieces of advice,\n"
+"as many clients start by having a very inneficient synchronisation strategy.\n"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:96
+#, fuzzy
+#| msgid ""
+#| "If your request is new, [open a new bug ticket](https://github.com/"
+#| "FreshRSS/FreshRSS/issues/new)"
+msgid ""
+"[*Synchronisation recommendation* by Alkarex](https://github.com/FreshRSS/"
+"FreshRSS/issues/2566#issuecomment-541317776)"
+msgstr ""
+"Si votre demande est nouvelle, [ouvrez un nouveau ticket de bug](https://"
+"github.com/FreshRSS/FreshRSS/issues/new)"
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:96
+msgid ""
+"[*The Right Way to Sync* by BazQux](https://github.com/bazqux/bazqux-"
+"api#user-content-the-right-way-to-sync)"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/06_Reporting_Bugs.md:1
+#, no-wrap
+msgid "Reporting a bug or a suggestion"
+msgstr "Remonter un problème ou une suggestion"
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:4
+#, fuzzy
+#| msgid ""
+#| "Despite the care given to FreshRSS, it’s still possible that bugs occur. "
+#| "The project is young and development is dynamic, so it can be corrected "
+#| "quickly. You might also have a feature in mind that doesn’t yet exist. "
+#| "Regardless whether your idea seems silly, far-fetched, useless or too "
+#| "specific, please don’t hesitate to propose it to us! “Ideas in the air” "
+#| "often find an attentive ear. It’s new external perspectives that make the "
+#| "project evolve the most."
+msgid ""
+"Despite the care given to FreshRSS, it’s still possible that bugs occur. "
+"Development is dynamic, so issues can be corrected quickly. You might also "
+"have a feature in mind that doesn’t yet exist. Regardless whether your idea "
+"seems silly, far-fetched, useless or too specific, please don’t hesitate to "
+"propose it to us! “Ideas in the air” often find an attentive ear. It’s new "
+"external perspectives that make the project evolve the most."
+msgstr ""
+"Malgré le soin apporté à FreshRSS, il se peut que des bugs apparaissent "
+"encore. Le projet est jeune et le développement dynamique, aussi celui-ci "
+"pourra être corrigé rapidement. Il se peut aussi que vous ayez en tête une "
+"fonctionnalité qui n’existe pas encore. Que celle-ci vous paraisse idiote, "
+"farfelue, inutile ou trop spécifique, il ne faut surtout pas hésiter à nous "
+"la proposer ! Très souvent des « idées en l’air » ont trouvé une oreille "
+"attentive. Ce sont les regards externes qui font le plus évoluer le projet."
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:6
+msgid ""
+"If you’re convinced that you should be heard, here’s how you can go about it."
+msgstr ""
+"Si vous êtes convaincus qu’il faut vous faire entendre, voici la marche à "
+"suivre."
+
+#. type: Title ##
+#: en/./developers/06_Reporting_Bugs.md:7
+#, no-wrap
+msgid "On GitHub"
+msgstr "Sur GitHub"
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:10
+msgid ""
+"GitHub is the ideal platform to submit your requests. It allows us to "
+"discuss a problem or suggestion with others and it often generates new "
+"ideas. Let’s not neglect this “social” aspect!"
+msgstr ""
+"GitHub est la plate-forme à privilégier pour vos demandes. En effet, cela "
+"nous permet de pouvoir discuter à plusieurs sur un problème ou une "
+"suggestion et de faire émerger, souvent, des idées nouvelles. Ne négligeons "
+"pas cet aspect « social » !"
+
+#. type: Bullet: '1. '
+#: en/./developers/06_Reporting_Bugs.md:16
+msgid ""
+"[Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/issues)"
+msgstr ""
+"[Rendez-vous sur le gestionnaire de tickets de bugs](https://github.com/"
+"FreshRSS/FreshRSS/issues)"
+
+#. type: Bullet: '2. '
+#: en/./developers/06_Reporting_Bugs.md:16
+msgid ""
+"Start by checking if a similar request hasn’t already been made. If so, "
+"please feel free to add your voice to the request."
+msgstr ""
+"Commencez par rechercher si une demande similaire n’a pas déjà été faite. Si "
+"oui, n’hésitez pas à ajouter votre voix à la demande."
+
+#. type: Bullet: '3. '
+#: en/./developers/06_Reporting_Bugs.md:16
+msgid ""
+"If your request is new, [open a new bug ticket](https://github.com/FreshRSS/"
+"FreshRSS/issues/new)"
+msgstr ""
+"Si votre demande est nouvelle, [ouvrez un nouveau ticket de bug](https://"
+"github.com/FreshRSS/FreshRSS/issues/new)"
+
+#. type: Bullet: '4. '
+#: en/./developers/06_Reporting_Bugs.md:16
+msgid ""
+"Finally, write your request. If you’re fluent in English, it’s the preferred "
+"language because it allows for discussion with the largest number of people."
+msgstr ""
+"Rédigez enfin votre demande. Si vous maitrisez l’anglais, c’est la langue à "
+"privilégier car cela permet d’ouvrir la discussion à un plus grand nombre de "
+"personnes. Sinon, ce n’est pas grave, continuez en français :)"
+
+#. type: Bullet: '5. '
+#: en/./developers/06_Reporting_Bugs.md:16
+msgid ""
+"Please follow the tips below to make it easier to let your ticket be heard."
+msgstr ""
+"Merci de bien vouloir suivre les quelques conseils donnés plus bas pour "
+"faciliter la prise en compte de votre ticket."
+
+#. type: Title ##
+#: en/./developers/06_Reporting_Bugs.md:17
+#, no-wrap
+msgid "Informal"
+msgstr "De façon informelle"
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:20
+msgid ""
+"Not everyone likes or uses GitHub for a variety of legitimate reasons. That "
+"is why you can also contact us in a more informal way."
+msgstr ""
+"Tout le monde n’aime pas ou n’utilise pas GitHub pour des raisons aussi "
+"diverses que légitimes. C’est pourquoi vous pouvez aussi nous contacter de "
+"façon plus informelle."
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:26
+msgid ""
+"On [our Mattermost chat](https://framateam.org/signup_user_complete/?"
+"id=e2680d3e3128b9fac8fdb3003b0024ee)"
+msgstr ""
+"Sur [notre chat Mattermost](https://framateam.org/signup_user_complete/?"
+"id=e2680d3e3128b9fac8fdb3003b0024ee)"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:26
+msgid "On [our subreddit](https://www.reddit.com/r/freshrss/)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:26
+msgid "At events / meetings around Free Software"
+msgstr "À des évènements / rencontres autour du Logiciel Libre"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:26
+msgid "Over a beer in a bar"
+msgstr "Autour d’une bière dans un bar"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:26
+msgid "Etc."
+msgstr "Etc."
+
+#. type: Title ##
+#: en/./developers/06_Reporting_Bugs.md:27
+#, no-wrap
+msgid "Tips"
+msgstr "Conseils"
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:30
+msgid "Here are some tips to help you present your bug report or suggestion:"
+msgstr ""
+"Voici quelques conseils pour bien présenter votre remontée de bug ou votre "
+"suggestion :"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:41
+msgid ""
+"**Pay attention to spelling**. Even if it’s not always easy, try your best!"
+msgstr ""
+"**Faites attention à l’orthographe.** même si ce n’est pas toujours facile, "
+"faites votre maximum. ;)"
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:41
+msgid ""
+"**Give an explicit title to your request**, even if it’s a bit long. This "
+"not only helps us understand your request, but also to find your ticket "
+"later."
+msgstr ""
+"**Donnez un titre explicite à votre demande**, quitte à ce qu’il soit un peu "
+"long. Cela nous aide non seulement Ă  comprendre votre demande, mais aussi Ă  "
+"retrouver votre ticket plus tard."
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:41
+msgid ""
+"**One request = one ticket.** You may have lots of ideas while being afraid "
+"to spam the bug manager: it doesn’t matter. It’s better to have a few too "
+"many tickets than too many requests in one. We’ll close and consolidate "
+"requests when possible."
+msgstr ""
+"**Une demande = un ticket.** Vous pouvez avoir des tas d’idées mais vous "
+"avez peur de spammer le gestionnaire de bugs : ça ne fait rien. Il vaut "
+"mieux avoir un peu trop de tickets que trop de demandes dans un seul. On "
+"s’occupera de fermer et regrouper les demandes qui le peuvent."
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:41
+msgid ""
+"If you report a bug, think about **providing us with the FreshRSS logs** "
+"(accessible in the FreshRSS `data/log/` folder) and the **PHP logs** (the "
+"location may vary by distribution, but consider searching in `/var/log/"
+"httpd` or `/var/log/apache`)."
+msgstr ""
+"Si vous remontez un bug, pensez Ă  nous **fournir les logs de FreshRSS** "
+"(accessibles dans les dossier ''data/log/'' de FreshRSS) **et PHP** "
+"(l’emplacement peut varier selon les distributions, mais pensez à chercher "
+"dans ''/var/log/httpd'' ou ''/var/log/apache'')."
+
+#. type: Bullet: ' * '
+#: en/./developers/06_Reporting_Bugs.md:41
+msgid ""
+"If you can’t find the log files, specify it in your ticket so we know you’ve "
+"already searched."
+msgstr ""
+"Si vous ne trouvez pas les fichiers de logs, précisez-le dans votre ticket "
+"afin que nous sachions que vous avez déjà cherché."
+
+#. type: Bullet: ' * '
+#: en/./developers/06_Reporting_Bugs.md:41
+msgid ""
+"Not all bugs require logs, but if you have any doubts, it is better to "
+"provide them to us. Logs are important and very useful for debugging!"
+msgstr ""
+"Tous les bugs ne nécessitent pas les logs, mais si vous doutez, mieux vaut "
+"nous les fournir. Les logs sont importants et très utiles pour débugguer !"
+
+#. type: Bullet: ' * '
+#: en/./developers/06_Reporting_Bugs.md:41
+msgid ""
+"The logs may reveal confidential information, so **be careful not to "
+"disclose anything sensitive.**"
+msgstr ""
+"Il se peut que les logs puissent révéler des informations plus ou moins "
+"confidentielles, **faites attention Ă  ne rien divulguer de sensible.**"
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:41
+#, no-wrap
+msgid ""
+"* If you report a feed problem, it will be easier if you could provide a snapshot of its content in a text file.\n"
+"See [here](#how-to-provide-feed-data) for more information.\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:43
+msgid ""
+"In addition, when facing a bug, you’re encouraged to follow this message "
+"format (from the [Sam & Max website](http://sametmax.com/template-de-demande-"
+"daide-en-informatique/):"
+msgstr ""
+"De plus, face Ă  un bug, je ne peux que vous encourager Ă  suivre le format de "
+"message suivant (tiré du [site de Sam & Max](http://sametmax.com/template-de-"
+"demande-daide-en-informatique/)) :"
+
+#. type: Title ###
+#: en/./developers/06_Reporting_Bugs.md:44
+#, no-wrap
+msgid "What’s my goal?"
+msgstr "Quel est mon objectif ?"
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:47
+msgid "Give the general context of what you were trying to do."
+msgstr "Donnez le contexte général de ce que vous essayiez de faire."
+
+#. type: Title ###
+#: en/./developers/06_Reporting_Bugs.md:48
+#, no-wrap
+msgid "What have I been trying to do?"
+msgstr "Qu’est-ce que j’ai essayé de faire ?"
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:51
+msgid ""
+"Explain step by step what you have done so that we can reproduce the bug."
+msgstr ""
+"Expliquez pas Ă  pas ce que vous avez fait afin que nous puissions reproduire "
+"le bug."
+
+#. type: Title ###
+#: en/./developers/06_Reporting_Bugs.md:52
+#, no-wrap
+msgid "What results have I achieved?"
+msgstr "Quels résultats ai-je obtenus ?"
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:55
+msgid ""
+"The bug: what you see that shouldn’t have happened. Here you can provide the "
+"logs."
+msgstr ""
+"Le bug : ce que vous voyez qui n’aurez pas dû se passer. Ici vous pouvez "
+"fournir les logs."
+
+#. type: Title ###
+#: en/./developers/06_Reporting_Bugs.md:56
+#, no-wrap
+msgid "What was the expected result?"
+msgstr "Quel était le résultat attendu ?"
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:59
+msgid "So that we understand what you consider to be the problem."
+msgstr ""
+"Afin que nous comprenions bien où est le problème… au moins selon vous :p"
+
+#. type: Title ###
+#: en/./developers/06_Reporting_Bugs.md:60
+#, no-wrap
+msgid "What are my circumstances?"
+msgstr "Quelle est ma situation ?"
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:63
+msgid "Remember to give the following information if you know it:"
+msgstr "Pensez Ă  donner les informations suivantes si vous les connaissez :"
+
+#. type: Bullet: '1. '
+#: en/./developers/06_Reporting_Bugs.md:69
+msgid "Which browser? Which version?"
+msgstr "Quel navigateur ? Quelle version ?"
+
+#. type: Bullet: '2. '
+#: en/./developers/06_Reporting_Bugs.md:69
+msgid "Which server: Apache, Nginx? Which version?"
+msgstr "Quel serveur : Apache, Nginx ? Quelle version ?"
+
+#. type: Bullet: '3. '
+#: en/./developers/06_Reporting_Bugs.md:69
+msgid "Which version of PHP?"
+msgstr "Quelle version de PHP ?"
+
+#. type: Bullet: '4. '
+#: en/./developers/06_Reporting_Bugs.md:69
+msgid "Which database: SQLite, MySQL, MariaDB, PostgreSQL? Which version?"
+msgstr ""
+"Quelle base de données : SQLite, MySQL, MariaDB, PostgreSQL ? Quelle "
+"version ?"
+
+#. type: Bullet: '5. '
+#: en/./developers/06_Reporting_Bugs.md:69
+msgid "Which distribution runs on the server? And… which version?"
+msgstr "Quelle distribution sur le serveur ? Et… quelle version ?"
+
+#. type: Title ##
+#: en/./developers/06_Reporting_Bugs.md:70
+#, fuzzy, no-wrap
+#| msgid "How to write a commit message"
+msgid "How to provide feed data"
+msgstr "Comment écrire un message de commit"
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:74
+msgid ""
+"If you need us to investigate a feed problem, it will be easier if you "
+"provide a snapshot of the feed data. To do that, you can launch the "
+"following command:"
+msgstr ""
+
+#. type: Fenced code block (bash)
+#: en/./developers/06_Reporting_Bugs.md:75
+#, no-wrap
+msgid "wget <feed url> -O output.rss.txt\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:78
+msgid "Then you can drag-and-drop the generated file into the issue."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:4
+msgid "Minz is the homemade PHP framework used by FreshRSS."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:6
+msgid ""
+"This data sheet should refer to the official FreshRSS and Minz documentation "
+"(the PHP framework on which FreshRSS is based). Unfortunately, this "
+"documentation does not yet exist. In a few words, here are the main things "
+"you should know. It is not necessary to read all the chapters in this "
+"section if you don’t need to use a feature in your extension (if you don’t "
+"need to translate your extension, no need to know more about the "
+"`Minz_Translate` module for example)."
+msgstr ""
+"Cette fiche technique devrait renvoyer vers la documentation officielle de "
+"FreshRSS et de Minz (le framework PHP sur lequel repose FreshRSS). "
+"Malheureusement cette documentation n’existe pas encore. Voici donc en "
+"quelques mots les principaux éléments à connaître. Il n’est pas nécessaire "
+"de lire l’ensemble des chapitres de cette section si vous n’avez pas à "
+"utiliser une fonctionnalité dans votre extension (si vous n’avez pas besoin "
+"de traduire votre extension, pas besoin d’en savoir plus sur le module "
+"`Minz_Translate` par exemple)."
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:7
+#, no-wrap
+msgid "MVC Architecture"
+msgstr "Architecture MVC"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:10
+msgid ""
+"Minz relies on and imposes an MVC architecture on projects using it. This "
+"architecture consists of three main components:"
+msgstr ""
+"Minz repose et impose une architecture MVC pour les projets l’utilisant. On "
+"distingue dans cette architecture trois composants principaux :"
+
+#. type: Bullet: '* '
+#: en/./developers/Minz/index.md:14
+msgid ""
+"The model: this is the base object that we will manipulate. In FreshRSS, "
+"categories, flows and articles are templates. The part of the code that "
+"makes it possible to manipulate them in a database is also part of the model "
+"but is separated from the base model: we speak of DAO (for \"Data Access "
+"Object\"). The templates are stored in a `Models` folder."
+msgstr ""
+"Le Modèle : c’est l’objet de base que l’on va manipuler. Dans FreshRSS, les "
+"catégories, les flux et les articles sont des modèles. La partie du code qui "
+"permet de les manipuler en base de données fait aussi partie du modèle mais "
+"est séparée du modèle de base : on parle de DAO (pour « Data Access Object "
+"»). Les modèles sont stockés dans un répertoire `Models`."
+
+#. type: Bullet: '* '
+#: en/./developers/Minz/index.md:14
+msgid ""
+"The view: this is what the user sees. The view is therefore simply HTML code "
+"mixed with PHP to display dynamic information. The views are stored in a "
+"`views` folder."
+msgstr ""
+"La Vue : c’est ce qui représente ce que verra l’utilisateur. La vue est donc "
+"simplement du code HTML que l’on mixe avec du PHP pour afficher les "
+"informations dynamiques. Les vues sont stockées dans un répertoire `views`."
+
+#. type: Bullet: '* '
+#: en/./developers/Minz/index.md:14
+msgid ""
+"The controller: this is what makes it possible to link models and views. "
+"Typically, a controller will load templates from the database (like a list "
+"of items) to \"pass\" them to a view for display. Controllers are stored in "
+"a `Controllers` directory."
+msgstr ""
+"Le Contrôleur : c’est ce qui permet de lier modèles et vues entre eux. "
+"Typiquement, un contrôleur va charger des modèles à partir de la base de "
+"données (une liste d’articles par exemple) pour les « passer » à une vue "
+"afin qu’elle les affiche. Les contrôleurs sont stockés dans un répertoire "
+"`Controllers`."
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:15
+#, no-wrap
+msgid "Routing"
+msgstr "Routage"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:19
+#, fuzzy
+#| msgid ""
+#| "In order to link a URL to a controller, first you have to go through a "
+#| "\"routing\" phase. In FreshRSS, this is particularly simple because it "
+#| "suffices to specify the name of the controller to load into the URL using "
+#| "a `c` parameter. For example, the address http://exemple.com?c=hello will "
+#| "execute the code contained in the `hello` controller."
+msgid ""
+"In order to link a URL to a controller, first you have to go through a "
+"\"routing\" phase. In FreshRSS, this is particularly simple because it "
+"suffices to specify the name of the controller to load into the URL using a "
+"`c` parameter. For example, the address <http://example.com?c=hello> will "
+"execute the code contained in the `hello` controller."
+msgstr ""
+"Afin de lier une URL à un contrôleur, on doit passer par une phase dite de « "
+"routage ». Dans FreshRSS, cela est particulièrement simple car il suffit "
+"d’indiquer le nom du contrôleur à charger dans l’URL à l’aide d’un paramètre "
+"`c`. Par exemple, l’adresse http://exemple.com?c=hello va exécuter le code "
+"contenu dans le contrĂ´leur `hello`."
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:21
+msgid ""
+"One concept that has not yet been discussed is the \"actions\" system. An "
+"action is executed *on* a controller. Concretely, a controller is "
+"represented by a class and its actions by methods. To execute an action, it "
+"is necessary to specify an `a` parameter in the URL."
+msgstr ""
+"Une notion qui n’a pas encore été évoquée est le système d'« actions ». Une "
+"action est exécutée *sur* un contrôleur. Concrètement, un contrôleur va être "
+"représenté par une classe et ses actions par des méthodes. Pour exécuter une "
+"action, il est nécessaire d’indiquer un paramètre `a` dans l’URL."
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:23 en/./developers/Minz/index.md:143
+msgid "Code example:"
+msgstr "Exemple de code :"
+
+#. type: Fenced code block (php)
+#: en/./developers/Minz/index.md:24
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"class FreshRSS_hello_Controller extends FreshRSS_ActionController {\n"
+"\tpublic function indexAction() {\n"
+"\t\t$this->view->a_variable = 'FooBar';\n"
+"\t}\n"
+"\n"
+"\tpublic function worldAction() {\n"
+"\t\t$this->view->a_variable = 'Hello World!';\n"
+"\t}\n"
+"}\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"class FreshRSS_hello_Controller extends FreshRSS_ActionController {\n"
+"\tpublic function indexAction() {\n"
+"\t\t$this->view->a_variable = 'FooBar';\n"
+"\t}\n"
+"\n"
+"\tpublic function worldAction() {\n"
+"\t\t$this->view->a_variable = 'Hello World!';\n"
+"\t}\n"
+"}\n"
+"\n"
+"?>\n"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:41
+#, fuzzy
+#| msgid ""
+#| "When loading the address http://exemple.com?c=hello&a=world, the `world` "
+#| "action is executed on the `hello` controller."
+msgid ""
+"When loading the address <http://example.com?c=hello&a=world>, the `world` "
+"action is executed on the `hello` controller."
+msgstr ""
+"Si l’on charge l’adresse http://exemple.com?c=hello&a=world, l’action "
+"`world` va donc être exécutée sur le contrôleur `hello`."
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:44
+#, fuzzy
+#| msgid ""
+#| "Note: if `c` or `a` is not specified, the default value for each of these "
+#| "variables is `index`. So the address http://exemple.com?c=hello will "
+#| "execute the `index` action of the `hello` controller."
+msgid ""
+"Note: if `c` or `a` is not specified, the default value for each of these "
+"variables is `index`. So the address <http://example.com?c=hello> will "
+"execute the `index` action of the `hello` controller."
+msgstr ""
+"Note : si `c` ou `a` n’est pas précisée, la valeur par défaut de chacune de "
+"ces variables est `index`. Ainsi l’adresse http://exemple.com?c=hello va "
+"exécuter l’action `index` du contrôleur `hello`."
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:46
+msgid ""
+"From now on, the `hello/world` naming convention will be used to refer to a "
+"controller/action pair."
+msgstr ""
+"Plus loin, sera utilisée la convention `hello/world` pour évoquer un couple "
+"contrĂ´leur/action."
+
+#. type: Title #
+#: en/./developers/Minz/index.md:47 en/./users/03_Main_view.md:1
+#, no-wrap
+msgid "Views"
+msgstr "Vues"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:50
+msgid ""
+"Each view is associated with a controller and an action. The view associated "
+"with `hello/world` will be stored in a very specific file: `views/hello/"
+"world. phtml`. This convention is imposed by Minz."
+msgstr ""
+"Chaque vue est associée à un contrôleur et à une action. La vue associée à "
+"`hello/world` va être stockée dans un fichier bien spécifique : `views/hello/"
+"world.phtml`. Cette convention est imposée par Minz."
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:52
+msgid ""
+"As explained above, the views consist of HTML mixed with PHP. Code example:"
+msgstr ""
+"Comme expliqué plus haut, les vues sont du code HTML mixé à du PHP. Exemple "
+"de code :"
+
+#. type: Fenced code block (html)
+#: en/./developers/Minz/index.md:53
+#, no-wrap
+msgid ""
+"<p>\n"
+"\tThis is a parameter passed from the controller: <?= $this->a_variable ?>\n"
+"</p>\n"
+msgstr ""
+"<p>\n"
+"\tPhrase passée en paramètre : <?= $this->a_variable ?>\n"
+"</p>\n"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:60
+#, no-wrap
+msgid "The variable `$this->a_variable` is passed by the controller (see previous example). The difference is that in the controller it is necessary to pass `$this->view`, while in the view `$this` suffices.\n"
+msgstr "La variable `$this->a_variable` a été passée précédemment par le contrôleur (voir exemple précédent). La différence est que dans le contrôleur il est nécessaire de passer par `$this->view` et que dans la vue `$this` suffit.\n"
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:61
+#, no-wrap
+msgid "Working with GET / POST"
+msgstr "Accéder aux paramètres GET / POST"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:65
+msgid ""
+"It is often necessary to take advantage of parameters passed by GET or POST. "
+"In Minz, these parameters are accessible using the `Minz_Request` class. "
+"Code example:"
+msgstr ""
+"Il est souvent nécessaire de profiter des paramètres passés par GET ou par "
+"POST. Dans Minz, ces paramètres sont accessibles de façon indistincts à "
+"l’aide de la classe `Minz_Request`. Exemple de code :"
+
+#. type: Fenced code block (php)
+#: en/./developers/Minz/index.md:66
+#, fuzzy, no-wrap
+#| msgid ""
+#| "<?php\n"
+#| "\n"
+#| "$default_value = 'foo';\n"
+#| "$param = Minz_Request::param('bar', $default_value);\n"
+#| "\n"
+#| "// Display the value of the parameter `bar` (passed via GET or POST)\n"
+#| "// or \"foo\" if the parameter does not exist.\n"
+#| "echo $param;\n"
+#| "\n"
+#| "// Sets the value of the `bar` parameter\n"
+#| "Minz_Request::_param('bar', 'baz');\n"
+#| "\n"
+#| "// Will necessarily display \"baz\" since we have just forced its value.\n"
+#| "// Note that the second parameter (default) is optional.\n"
+#| "echo Minz_Request::param('bar');\n"
+#| "\n"
+#| "?>\n"
+msgid ""
+"<?php\n"
+"\n"
+"$default_value = 'foo';\n"
+"$param = Minz_Request::paramString('bar') ?: $default_value;\n"
+"\n"
+"// Display the value of the parameter `bar` (passed via GET or POST)\n"
+"// or \"foo\" if the parameter does not exist.\n"
+"echo $param;\n"
+"\n"
+"// Sets the value of the `bar` parameter\n"
+"Minz_Request::_param('bar', 'baz');\n"
+"\n"
+"// Will necessarily display \"baz\" since we have just forced its value.\n"
+"// Note that the second parameter (default) is optional.\n"
+"echo Minz_Request::paramString('bar');\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"$default_value = 'foo';\n"
+"$param = Minz_Request::param('bar', $default_value);\n"
+"\n"
+"// Affichera la valeur du paramètre `bar` (passé via GET ou POST)\n"
+"// ou \"foo\" si le paramètre n’existe pas.\n"
+"echo $param;\n"
+"\n"
+"// Force la valeur du paramètre `bar`\n"
+"Minz_Request::_param('bar', 'baz');\n"
+"\n"
+"// Affichera forcément \"baz\" puisque nous venons de forcer sa valeur.\n"
+"// Notez que le second paramètre (valeur par défaut) est facultatif.\n"
+"echo Minz_Request::param('bar');\n"
+"\n"
+"?>\n"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:87
+msgid ""
+"The `Minz_Request::isPost()` method can be used to execute a piece of code "
+"only if it is a POST request."
+msgstr ""
+"La méthode `Minz_Request::isPost()` peut être utile pour n’exécuter un "
+"morceau de code que s’il s’agit d’une requête POST."
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:89
+msgid ""
+"Note: it is preferable to use `Minz_Request` only in controllers. It is "
+"likely that you will encounter this method in FreshRSS views, or even in "
+"templates, but be aware that this is **not** good practice."
+msgstr ""
+"Note : il est préférable de n’utiliser `Minz_Request` que dans les "
+"contrôleurs. Il est probable que vous rencontriez cette méthode dans les "
+"vues de FreshRSS, voire dans les modèles, mais sachez qu’il ne s’agit "
+"**pas** d’une bonne pratique."
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:90
+#, no-wrap
+msgid "Access session settings"
+msgstr "Accéder aux paramètres de session"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:93
+msgid ""
+"The access to session parameters is strangely similar to the GET / POST "
+"parameters but passes through the `Minz_Session` class this time! There is "
+"no example here because you can repeat the previous example by changing all "
+"`Minz_Request` to `Minz_Session`."
+msgstr ""
+"L’accès aux paramètres de session est étrangement similaire aux paramètres "
+"GET / POST mais passe par la classe `Minz_Session` cette fois-ci ! Il n’y a "
+"pas d’exemple ici car vous pouvez reprendre le précédent en changeant tous "
+"les `Minz_Request` par des `Minz_Session`."
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:94
+#, no-wrap
+msgid "Working with URLs"
+msgstr "Gestion des URL"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:97
+msgid ""
+"To take full advantage of the Minz routing system, it is strongly "
+"discouraged to write hard URLs in your code. For example, the following view "
+"should be avoided:"
+msgstr ""
+"Pour profiter pleinement du système de routage de Minz, il est fortement "
+"déconseillé d’écrire les URL en dur dans votre code. Par exemple, la vue "
+"suivante doit être évitée :"
+
+#. type: Fenced code block (html)
+#: en/./developers/Minz/index.md:98
+#, no-wrap
+msgid ""
+"<p>\n"
+"\tGo to page <a href=\"http://example.com?c=hello&amp;a=world\">Hello world</a>!\n"
+"</p>\n"
+msgstr ""
+"<p>\n"
+"\tAccéder à la page <a href=\"http://exemple.com?c=hello&amp;a=world\">Hello world</a>!\n"
+"</p>\n"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:105
+#, fuzzy
+#| msgid ""
+#| "If one day it was decided to use a \"url rewriting\" system to have "
+#| "addresses in a http://exemple.com/controller/action format, all previous "
+#| "addresses would become ineffective!"
+msgid ""
+"If one day it was decided to use a \"url rewriting\" system to have "
+"addresses in a <http://example.com/controller/action> format, all previous "
+"addresses would become ineffective!"
+msgstr ""
+"Si un jour il est décidé d’utiliser un système d'« url rewriting » pour "
+"avoir des adresses au format http://exemple.com/controller/action, toutes "
+"les adresses précédentes deviendraient ineffectives !"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:107
+msgid ""
+"So use the `Minz_Url` class and its `display()` method instead. `Minz_Url::"
+"display()` takes an array of the following form as its argument:"
+msgstr ""
+"Préférez donc l’utilisation de la classe `Minz_Url` et de sa méthode "
+"`display()`. `Minz_Url::display()` prend en paramètre un tableau de la forme "
+"suivante :"
+
+#. type: Fenced code block (php)
+#: en/./developers/Minz/index.md:108
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"\t'params' => [\n"
+"\t\t'foo' => 'bar',\n"
+"\t],\n"
+"];\n"
+"\n"
+"// Show something like .?c=hello&amp;a=world&amp;foo=bar\n"
+"echo Minz_Url::display($url_array);\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"\t'params' => [\n"
+"\t\t'foo' => 'bar',\n"
+"\t],\n"
+"];\n"
+"\n"
+"// Affichera quelque chose comme .?c=hello&amp;a=world&amp;foo=bar\n"
+"echo Minz_Url::display($url_array);\n"
+"\n"
+"?>\n"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:126
+msgid ""
+"Since this can become a bit tedious to use in the long run, especially in "
+"views, it is preferable to use the `_url()` shortcut:"
+msgstr ""
+"Comme cela peut devenir un peu pénible à utiliser à la longue, surtout dans "
+"les vues, il est préférable d’utiliser le raccourci `_url()` :"
+
+#. type: Fenced code block (php)
+#: en/./developers/Minz/index.md:127
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"// Displays the same as above\n"
+"echo _url('hello', 'world', 'foo', 'bar');\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"// Affichera la même chose que précédemment\n"
+"echo _url('hello', 'world', 'foo', 'bar');\n"
+"\n"
+"?>\n"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:137
+msgid ""
+"Note: as a general rule, the shortened form (`_url()`) should be used in "
+"views, while the long form (`Minz_Url::display()`) should be used in "
+"controllers."
+msgstr ""
+"Note : en règle générale, la forme raccourcie (`_url()`) doit être utilisée "
+"dans les vues tandis que la forme longue (`Minz_Url::display()`) doit ĂŞtre "
+"utilisée dans les contrôleurs."
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:138
+#, no-wrap
+msgid "Redirections"
+msgstr "Redirections"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:141
+msgid ""
+"It is often necessary to redirect a user to another page. To do so, the "
+"`Minz_Request` class offers another useful method: `forward()`. This method "
+"takes the same URL format as the one seen just before as its argument."
+msgstr ""
+"Il est souvent nécessaire de rediriger un utilisateur vers une autre page. "
+"Pour cela, la classe `Minz_Request` dispose d’une autre méthode utile : "
+"`forward()`. Cette méthode prend en argument le même format d’URL que celui "
+"vu juste avant."
+
+#. type: Fenced code block (php)
+#: en/./developers/Minz/index.md:144
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"];\n"
+"\n"
+"// Tells Minz to redirect the user to the hello / world page.\n"
+"// Note that this is a redirection in the Minz sense of the term, not a redirection that the browser will have to manage (HTTP code 301 or 302)\n"
+"// The code that follows forward() will thus be executed!\n"
+"Minz_Request::forward($url_array);\n"
+"\n"
+"// To perform a type 302 redirect, add \"true\".\n"
+"// The code that follows will never be executed.\n"
+"Minz_Request::forward($url_array, true);\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"];\n"
+"\n"
+"// Indique à Minz de rediriger l’utilisateur vers la page hello/world.\n"
+"// Notez qu’il s’agit d’une redirection au sens Minz du terme, pas d’une redirection que le navigateur va avoir à gérer (code HTTP 301 ou 302)\n"
+"// Le code qui suit forward() va ainsi être exécuté !\n"
+"Minz_Request::forward($url_array);\n"
+"\n"
+"// Pour effectuer une redirection type 302, ajoutez \"true\".\n"
+"// Le code qui suivra ne sera alors jamais exécuté.\n"
+"Minz_Request::forward($url_array, true);\n"
+"\n"
+"?>\n"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:165
+msgid ""
+"It is very common to want display a message to the user while performing a "
+"redirect, to tell the user how the action was carried out (validation of a "
+"form for example). Such a message is passed through a `notification` session "
+"variable (note: we will talk about feedback from now on to avoid confusion "
+"with a notification that can occur at any time). To facilitate this kind of "
+"very frequent action, there are two shortcuts that both perform a 302 "
+"redirect by assigning a feedback message:"
+msgstr ""
+"Il est très fréquent de vouloir effectuer une redirection tout en affichant "
+"un message à l’utilisateur pour lui indiquer comment s’est déroulée l’action "
+"effectuée juste avant (validation d’un formulaire par exemple). Un tel "
+"message est passé par une variable de session `notification` (note : nous "
+"parlerons plutôt de « feedback » désormais pour éviter la confusion avec une "
+"notification qui peut survenir Ă  tout moment). Pour faciliter ce genre "
+"d’action très fréquente, il existe deux raccourcis qui effectuent tout deux "
+"une redirection type 302 en affectant un message de feedback :"
+
+#. type: Fenced code block (php)
+#: en/./developers/Minz/index.md:166
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"];\n"
+"$feedback_good = 'All went well!';\n"
+"$feedback_bad = 'Oops, something went wrong.';\n"
+"\n"
+"Minz_Request::good($feedback_good, $url_array);\n"
+"\n"
+"// or\n"
+"\n"
+"Minz_Request::bad($feedback_bad, $url_array);\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"];\n"
+"$feedback_good = 'Tout s’est bien passé !';\n"
+"$feedback_bad = 'Oups, quelque chose n’a pas marché.';\n"
+"\n"
+"Minz_Request::good($feedback_good, $url_array);\n"
+"\n"
+"// ou\n"
+"\n"
+"Minz_Request::bad($feedback_bad, $url_array);\n"
+"\n"
+"?>\n"
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:185
+#, no-wrap
+msgid "Translation Management"
+msgstr "Gestion de la traduction"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:188
+msgid "This part [is explained here](/docs/en/internationalization.md)."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:189
+#, fuzzy, no-wrap
+#| msgid "Information"
+msgid "Migration"
+msgstr "Informations"
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:192
+msgid "Existing documentation includes:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/Minz/index.md:193
+msgid "[How to manage migrations](migrations.md)"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/Minz/migrations.md:1
+#, no-wrap
+msgid "How to manage migrations with Minz"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:4
+msgid ""
+"Migrations are the way to modify the database or the structure of files "
+"under the `data/` path."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/Minz/migrations.md:5
+#, fuzzy, no-wrap
+#| msgid "How to write a commit message"
+msgid "How to write a migration?"
+msgstr "Comment écrire un message de commit"
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:8
+msgid "Migrations are placed under the `app/migrations` folder."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:10
+msgid ""
+"Good practice is to prepend the filename by the current date and explain "
+"what does the migration do in few words (e.g. `2020_01_11_CreateFooTable."
+"php`)."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:12
+msgid ""
+"The files must contain a class which name starts with `FreshRSS_Migration_`, "
+"followed by the basename of the file (e.g. "
+"`FreshRSS_Migration_2020_01_11_CreateFooTable`)."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:14
+msgid ""
+"The class must declare a `migrate` static function. It must return `true` or "
+"a string to indicate the migration is applied, or `false` otherwise. It can "
+"also raise an exception: the message will be used to detail the error."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:16
+#, fuzzy
+#| msgid "Example: Rue89"
+msgid "Example:"
+msgstr "Exemple : Rue89"
+
+#. type: Fenced code block (php)
+#: en/./developers/Minz/migrations.md:17
+#, no-wrap
+msgid ""
+"// File: app/migrations/2020_01_11_CreateFooTable.php\n"
+"class FreshRSS_Migration_2020_01_11_CreateFooTable {\n"
+"\tpublic static function migrate() {\n"
+"\t\t$pdo = new Minz_PdoSqlite('sqlite:/some/path/db.sqlite');\n"
+"\t\t$result = $pdo->exec('CREATE TABLE foos (bar TEXT)');\n"
+"\t\tif ($result === false) {\n"
+"\t\t\t$error = $pdo->errorInfo();\n"
+"\t\t\traise Exception('Error in SQL statement: ' . $error[2]);\n"
+"\t\t}\n"
+"\n"
+"\t\treturn true;\n"
+"\t}\n"
+"}\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/Minz/migrations.md:33
+#, no-wrap
+msgid "How to apply migrations?"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:36
+msgid ""
+"They are automatically applied one by one when a user accesses FreshRSS."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:38
+msgid ""
+"Before being applied, migrations are sorted by filenames (see the "
+"[`strnatcmp`](https://php.net/strnatcmp) function). Already applied "
+"migrations are skipped (the list can be found in the `data/"
+"applied_migrations.txt` file)."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:39
+msgid ""
+"To ensure migrations are not applied several times if two users access "
+"FreshRSS at the same time, a folder named `data/applied_migrations.txt.lock` "
+"is created, then deleted at the end of the process."
+msgstr ""
+
+#. type: Title #
+#: en/./developers/OPML.md:1
+#, fuzzy, no-wrap
+#| msgid "Enable the API in FreshRSS"
+msgid "OPML in FreshRSS"
+msgstr "Activer l’API dans FreshRSS"
+
+#. type: Plain text
+#: en/./developers/OPML.md:4
+msgid ""
+"FreshRSS supports the [OPML](https://en.wikipedia.org/wiki/OPML) format to "
+"export and import lists of RSS/Atom feeds in a standard way, compatible with "
+"several other RSS aggregators."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/OPML.md:7
+msgid ""
+"However, FreshRSS also supports several additional features not covered by "
+"the basic OPML specification. Luckily, the [OPML specification](http://opml."
+"org/spec2.opml) allows extensions:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/OPML.md:9
+#, no-wrap
+msgid "> *An OPML file may contain elements and attributes not described on this page, only if those elements are defined in a namespace.*\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/OPML.md:11
+msgid "and:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/OPML.md:13
+#, no-wrap
+msgid "> *OPML can also be extended by the addition of new values for the type attribute.*\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/OPML.md:14
+#, no-wrap
+msgid "FreshRSS OPML extension"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/OPML.md:17
+msgid ""
+"FreshRSS uses the XML namespace <https://freshrss.org/opml> to export/import "
+"extended information not covered by the basic OPML specification."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/OPML.md:19
+msgid ""
+"The list of the custom FreshRSS attributes can be seen in [the source code]"
+"(https://github.com/FreshRSS/FreshRSS/blob/edge/app/views/helpers/export/"
+"opml.phtml), and here is an overview:"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/OPML.md:20
+#, no-wrap
+msgid "HTML+XPath or XML+XPath"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:23
+msgid ""
+"`<outline type=\"HTML+XPath\" ...`: Additional type of source, which is not "
+"RSS/Atom, but HTML Web Scraping using [XPath](https://www.w3.org/TR/"
+"xpath-10/) 1.0."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/OPML.md:25
+#, no-wrap
+msgid "> ℹ️ [XPath 1.0](https://en.wikipedia.org/wiki/XPath) is a standard query language, which FreshRSS supports to enable [Web scraping](https://en.wikipedia.org/wiki/Web_scraping).\n"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:27
+msgid ""
+"`<outline type=\"XML+XPath\" ...`: Same than `HTML+XPath` but using an XML "
+"parser."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/OPML.md:29
+msgid ""
+"The following attributes are using similar naming conventions than [RSS-"
+"Bridge](https://rss-bridge.github.io/rss-bridge/Bridge_API/XPathAbstract."
+"html)."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+msgid ""
+"`frss:xPathItem`: XPath expression for extracting the feed items from the "
+"source page."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:46
+msgid "Example: `//div[@class=\"news-item\"]`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+msgid ""
+"`frss:xPathItemTitle`: XPath expression for extracting the item’s title from "
+"the item context."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:46
+msgid "Example: `descendant::h2`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+msgid ""
+"`frss:xPathItemContent`: XPath expression for extracting an item’s content "
+"from the item context."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:46
+#, fuzzy
+#| msgid "Example: Rue89"
+msgid "Example: `.`"
+msgstr "Exemple : Rue89"
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+msgid ""
+"`frss:xPathItemUri`: XPath expression for extracting an item link from the "
+"item context."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:46
+msgid "Example: `descendant::a/@href`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+msgid ""
+"`frss:xPathItemAuthor`: XPath expression for extracting an item author from "
+"the item context."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:46
+msgid "Example: `\"Anonymous\"`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+msgid ""
+"`frss:xPathItemTimestamp`: XPath expression for extracting an item timestamp "
+"from the item context. The result will be parsed by [`strtotime()`](https://"
+"php.net/strtotime)."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+msgid ""
+"`frss:xPathItemTimeFormat`: Date/Time format to parse the timestamp, "
+"according to [`DateTime::createFromFormat()`](https://php.net/datetime."
+"createfromformat)."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+msgid ""
+"`frss:xPathItemThumbnail`: XPath expression for extracting an item’s "
+"thumbnail (image) URL from the item context."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:46
+msgid "Example: `descendant::img/@src`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+msgid ""
+"`frss:xPathItemCategories`: XPath expression for extracting a list of "
+"categories (tags) from the item context."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+msgid ""
+"`frss:xPathItemUid`: XPath expression for extracting an item’s unique ID "
+"from the item context. If left empty, a hash is computed automatically."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:54
+msgid ""
+"`frss:cssFullContent`: [CSS Selector](https://developer.mozilla.org/en-US/"
+"docs/Web/CSS/CSS_Selectors) to enable the download and extraction of the "
+"matching HTML section of each articles’ Web address."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:54
+msgid "Example: `div.main, .summary`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:54
+msgid ""
+"`frss:cssFullContentFilter`: [CSS Selector](https://developer.mozilla.org/en-"
+"US/docs/Web/CSS/CSS_Selectors) to remove the matching HTML elements from the "
+"full content retrieved by `frss:cssFullContent`."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:54
+msgid "Example: `.footer, .aside`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:54
+msgid ""
+"`frss:filtersActionRead`: List (separated by a new line) of search queries "
+"to automatically mark a new article as read."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/OPML.md:55
+#, no-wrap
+msgid "Dynamic OPML (reading lists)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:58
+msgid ""
+"`frss:opmlUrl`: If non-empty, indicates that this outline (category) should "
+"be dynamically populated from a remote OPML at the specified URL."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/OPML.md:59
+#, fuzzy, no-wrap
+#| msgid "Example: Rue89"
+msgid "Example"
+msgstr "Exemple : Rue89"
+
+#. type: Fenced code block (xml)
+#: en/./developers/OPML.md:61
+#, no-wrap
+msgid ""
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<opml version=\"2.0\">\n"
+"\t<head>\n"
+"\t\t<title>FreshRSS OPML extension example</title>\n"
+"\t</head>\n"
+"\t<body>\n"
+"\t\t<outline xmlns:frss=\"https://freshrss.org/opml\"\n"
+"\t\t\ttext=\"Example\"\n"
+"\t\t\ttype=\"HTML+XPath\"\n"
+"\t\t\txmlUrl=\"https://www.example.net/page.html\"\n"
+"\t\t\thtmlUrl=\"https://www.example.net/page.html\"\n"
+"\t\t\tdescription=\"Example of Web scraping\"\n"
+"\t\t\tfrss:xPathItem=\"//a[contains(@href, '/interesting/')]/ancestor::article\"\n"
+"\t\t\tfrss:xPathItemTitle=\"descendant::h2\"\n"
+"\t\t\tfrss:xPathItemContent=\".\"\n"
+"\t\t\tfrss:xPathItemUri=\"descendant::a[string-length(@href)&gt;0]/@href\"\n"
+"\t\t\tfrss:xPathItemThumbnail=\"descendant::img/@src\"\n"
+"\t\t\tfrss:cssFullContent=\"article\"\n"
+"\t\t\tfrss:filtersActionRead=\"intitle:⚡️ OR intitle:🔥&#10;something\"\n"
+"\t\t/>\n"
+"\t</body>\n"
+"</opml>\n"
+msgstr ""
+
#. type: Plain text
#: en/./index.md:2
msgid "![FreshRSS logo](img/logo_freshrss.png)"
msgstr "![Logo de FreshRSS](img/logo_freshrss.png)"
+#. type: Title #
+#: en/./index.md:3
+#, no-wrap
+msgid "FreshRSS manual (English)"
+msgstr ""
+
#. type: Plain text
-#: en/./index.md:4
+#: en/./index.md:6
msgid ""
"FreshRSS is an RSS aggregator and reader. It allows you to read and follow "
"several news websites at a glance without the need to browse from one "
@@ -3818,19 +5297,19 @@ msgstr ""
"vous puissiez la lire sans devoir aller de site en site."
#. type: Plain text
-#: en/./index.md:6
+#: en/./index.md:10
msgid "FreshRSS has a lot of features including:"
msgstr ""
"FreshRSS a été conçu comme un agrégateur puissant et propose des tas de "
"fonctionnalités :"
#. type: Bullet: '* '
-#: en/./index.md:18
+#: en/./index.md:24
msgid "RSS and Atom aggregation"
msgstr "Agrégation des flux RSS et Atom."
#. type: Bullet: '* '
-#: en/./index.md:18
+#: en/./index.md:24
msgid ""
"Mark article as favorite if you liked it or if you want to read it later"
msgstr ""
@@ -3838,14 +5317,14 @@ msgstr ""
"souhaitez lire plus tard."
#. type: Bullet: '* '
-#: en/./index.md:18
+#: en/./index.md:24
msgid "Filter and search functionality helps to easily find articles"
msgstr ""
"Le système de filtrage et de recherche permettent de cibler exactement les "
"articles que vous souhaitez lire."
#. type: Bullet: '* '
-#: en/./index.md:18
+#: en/./index.md:24
msgid ""
"Statistics to show you the publishing frequency all the websites you follow"
msgstr ""
@@ -3853,22 +5332,29 @@ msgstr ""
"qui publient le plus, ou à l’inverse, le moins."
#. type: Bullet: '* '
-#: en/./index.md:18
+#: en/./index.md:24
msgid "Import/export of your feeds into OPML format"
msgstr "Importation / exportation des flux au format OPML."
#. type: Bullet: '* '
-#: en/./index.md:18
+#: en/./index.md:24
msgid "Several themes created by the community"
msgstr "Multi-thèmes pour changer l’habillage de FreshRSS."
#. type: Bullet: '* '
-#: en/./index.md:18
+#: en/./index.md:24
+#, fuzzy
+#| msgid "Several themes created by the community"
+msgid "Several extensions created by the community"
+msgstr "Multi-thèmes pour changer l’habillage de FreshRSS."
+
+#. type: Bullet: '* '
+#: en/./index.md:24
msgid "\"Google Reader\"-like API to connect Android applications"
msgstr "API Google Reader pour pouvoir y brancher des applications Android."
#. type: Bullet: '* '
-#: en/./index.md:18
+#: en/./index.md:24
msgid ""
"The application is \"responsive,\" which means it adapts to small screens so "
"you can bring articles in your pocket"
@@ -3877,7 +5363,7 @@ msgstr ""
"emporter FreshRSS dans votre poche."
#. type: Bullet: '* '
-#: en/./index.md:18
+#: en/./index.md:24
msgid ""
"Self-hosted: the code is free (under AGPL3 licence), so you can host your "
"own instance of FreshRSS"
@@ -3886,51 +5372,75 @@ msgstr ""
"l’héberger sur votre propre serveur."
#. type: Bullet: '* '
-#: en/./index.md:18
+#: en/./index.md:24
msgid "Multi-user, so you can also host for your friends and family"
msgstr ""
"Multi-utilisateurs pour héberger plusieurs personnes sur une même "
"installation."
#. type: Bullet: '* '
-#: en/./index.md:18
+#: en/./index.md:24
+msgid "share article links with a bunch of services"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
msgid "And a lot more!"
msgstr "Et bien d’autres !"
+#. type: Title ##
+#: en/./index.md:25
+#, fuzzy, no-wrap
+#| msgid "Manual update"
+msgid "Manual Chapters"
+msgstr "Mise Ă  jour manuelle"
+
#. type: Plain text
-#: en/./index.md:20
+#: en/./index.md:28
msgid "This documentation is split into different sections:"
msgstr "Cette documentation est divisée en plusieurs parties :"
#. type: Bullet: '* '
-#: en/./index.md:24
+#: en/./index.md:33
+#, fuzzy
+#| msgid ""
+#| "[User documentation](./users/02_First_steps.html), where you can discover "
+#| "all the possibilities offered by FreshRSS"
msgid ""
-"[User documentation](./users/02_First_steps.html), where you can discover "
-"all the possibilities offered by FreshRSS"
+"[User documentation](./users/02_First_steps.md), where you can discover all "
+"the possibilities offered by FreshRSS"
msgstr ""
"La [documentation utilisateurs](./users/02_First_steps.md) pour découvrir "
"les fonctionnalités de FreshRSS."
#. type: Bullet: '* '
-#: en/./index.md:24
+#: en/./index.md:33
+#, fuzzy
+#| msgid ""
+#| "[Administrator documentation](./admins/01_Index.html) for detailed "
+#| "installation and maintenance related tasks"
msgid ""
-"[Administrator documentation](./admins/01_Index.html) for detailed "
+"[Administrator documentation](./admins/01_Index.md) for detailed "
"installation and maintenance related tasks"
msgstr ""
"La [documentation administrateurs](../en/admins/01_Installation.md) (en "
"anglais) pour l’installation et la maintenance de FreshRSS."
#. type: Bullet: '* '
-#: en/./index.md:24
+#: en/./index.md:33
+#, fuzzy
+#| msgid ""
+#| "[Developer documentation](./developers/01_First_steps.html) to guide you "
+#| "in the source code of FreshRSS and to help you if you want to contribute"
msgid ""
-"[Developer documentation](./developers/01_First_steps.html) to guide you in "
-"the source code of FreshRSS and to help you if you want to contribute"
+"[Developer documentation](./developers/01_Index.md) to guide you in the "
+"source code of FreshRSS and to help you if you want to contribute"
msgstr ""
"La [documentation développeurs](./developers/01_First_steps.md) pour savoir "
"comment contribuer et mieux comprendre le code source de FreshRSS."
#. type: Bullet: '* '
-#: en/./index.md:24
+#: en/./index.md:33
msgid ""
"[Contributor guidelines](./contributing.md) for those who want to help "
"improve FreshRSS"
@@ -3938,6 +5448,553 @@ msgstr ""
"Le [guide de contribution](./contributing.md) pour nous aider à développer "
"FreshRSS."
+#. type: Title ##
+#: en/./index.md:34
+#, no-wrap
+msgid "Demo"
+msgstr ""
+
+#. type: Plain text
+#: en/./index.md:37
+msgid ""
+"The official demo of FreshRSS is available under [https://demo.freshrss.org/]"
+"(https://demo.freshrss.org/)."
+msgstr ""
+
+#. type: Plain text
+#: en/./index.md:39
+msgid "Login credentials:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:42
+msgid "Username: demo"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:42
+msgid "Password: demodemo"
+msgstr ""
+
+#. type: Plain text
+#: en/./index.md:44
+msgid ""
+"Another chance to try out, but not official supported by FreshRSS: The "
+"application is listed on Softaculous [https://www.softaculous.com/apps/rss/"
+"FreshRSS](https://www.softaculous.com/apps/rss/FreshRSS)."
+msgstr ""
+
+#. type: Title ##
+#: en/./index.md:45
+#, no-wrap
+msgid "Licence"
+msgstr ""
+
+#. type: Plain text
+#: en/./index.md:47
+msgid "FreshRSS is licensed under the GNU Affero General Public License v3.0."
+msgstr ""
+
+#. type: Title #
+#: en/./internationalization.md:1
+#, fuzzy, no-wrap
+#| msgid "Contribute to internationalization (i18n)"
+msgid "Contributing to internationalization (i18n)"
+msgstr "Contribuer à l’internationalisation (i18n)"
+
+#. type: Plain text
+#: en/./internationalization.md:4
+msgid ""
+"Thanks to our contributors, FreshRSS is translated into [more than 20 "
+"languages](./users/05_Configuration.md#language). This section will explain "
+"the basics of internationalization in FreshRSS, from translating the "
+"application to your own language to making a specific change."
+msgstr ""
+
+#. type: Title ##
+#: en/./internationalization.md:5
+#, fuzzy, no-wrap
+#| msgid "Reader view"
+msgid "Overview"
+msgstr "La vue lecture"
+
+#. type: Plain text
+#: en/./internationalization.md:8
+#, fuzzy
+#| msgid ""
+#| "It is common (and that’s an understatement) to want to show some text to "
+#| "the user. In the previous example, for example, we display feedback to "
+#| "the user based on the result of form validation. The problem is that "
+#| "FreshRSS has users of different nationalities. It is therefore necessary "
+#| "to be able to manage different languages in order not to remain confined "
+#| "to English or French."
+msgid ""
+"It is common (and that’s an understatement) to want to show some text to the "
+"user. The problem is that FreshRSS has users of different nationalities. It "
+"is therefore necessary to be able to manage different languages in order not "
+"to remain confined to English or French."
+msgstr ""
+"Il est fréquent (et c’est un euphémisme) de vouloir afficher des phrases à "
+"l’utilisateur. Dans l’exemple précédent par exemple, nous affichions un "
+"feedback à l’utilisateur en fonction du résultat d’une validation de "
+"formulaire. Le problème est que FreshRSS possède des utilisateurs de "
+"différentes nationalités. Il est donc nécessaire de pouvoir gérer "
+"différentes langues pour ne pas rester cantonné à l’Anglais ou au Français."
+
+#. type: Plain text
+#: en/./internationalization.md:10
+#, fuzzy
+#| msgid ""
+#| "The solution is to use the `Minz_Translate` class, which allows dynamic "
+#| "translation of FreshRSS (or any Minz-based application). Before using "
+#| "this module, it is necessary to know where to find the strings to be "
+#| "translated. Each language has its own subdirectory in a parent directory "
+#| "named `i18n`. For example, English language files are located in `i18n/fr/"
+#| "`. There are seven different files:"
+msgid ""
+"The solution is to use the `Minz_Translate` module, which allows dynamic "
+"translation of FreshRSS. Before using this module, it is necessary to know "
+"where to find the strings to be translated. Each language has its own "
+"subdirectory in a parent directory named `app/i18n/`. For example, English "
+"language files are located in [`app/i18n/en/`](/app/i18n/en/). There are "
+"seven different files:"
+msgstr ""
+"La solution consiste Ă  utiliser la classe `Minz_Translate` qui permet de "
+"traduire dynamiquement FreshRSS (ou toute application basée sur Minz). Avant "
+"d’utiliser ce module, il est nécessaire de savoir où trouver les chaînes de "
+"caractères à traduire. Chaque langue possède son propre sous-répertoire dans "
+"un répertoire parent nommé `i18n`. Par exemple, les fichiers de langue en "
+"Français sont situés dans `i18n/fr/`. Il existe sept fichiers différents :"
+
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+msgid "`admin.php` for anything related to FreshRSS administration"
+msgstr ""
+"`admin.php` pour tout ce qui est relatif à l’administration de FreshRSS ;"
+
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+msgid "`conf.php` for configuration"
+msgstr "`conf.php` pour l’aspect configuration ;"
+
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+msgid "`feedback.php` contains translations of feedback messages"
+msgstr "`feedback.php` contient les traductions des messages de feedback ;"
+
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+#, fuzzy
+#| msgid "`gen.php` stores what is global to FreshRSS (gen for \"general\")"
+msgid ""
+"`gen.php` stores what is global to FreshRSS (`gen` stands for “general”)"
+msgstr "`gen.php` stocke ce qui est global à FreshRSS (gen pour « general ») ;"
+
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+msgid "`index.php` for the main page that lists feeds and the About page"
+msgstr ""
+"`index.php` pour la page principale qui liste les flux et la page « À propos "
+"» ;"
+
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+#, fuzzy
+#| msgid "`install.php` contains strings related FreshRSS installation"
+msgid "`install.php` contains strings related to the installation"
+msgstr ""
+"`install.php` contient les phrases relatives à l’installation de FreshRSS ;"
+
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+#, fuzzy
+#| msgid "`sub.php` for subscription management (sub for \"subscription\")"
+msgid "`sub.php` for subscription management (`sub` stands for “subscription”)"
+msgstr ""
+"`sub.php` pour l’aspect gestion des abonnements (sub pour « subscription »)."
+
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+#, fuzzy
+#| msgid "`install.php` contains strings related FreshRSS installation"
+msgid "`user.php` contains some strings related to the User model"
+msgstr ""
+"`install.php` contient les phrases relatives à l’installation de FreshRSS ;"
+
+#. type: Plain text
+#: en/./internationalization.md:21
+msgid ""
+"This organization makes it possible to avoid a single huge translation file."
+msgstr ""
+"Cette organisation permet de ne pas avoir un unique énorme fichier de "
+"traduction."
+
+#. type: Plain text
+#: en/./internationalization.md:23
+#, fuzzy
+#| msgid ""
+#| "The translation files are quite simple: it’s only a matter of returning a "
+#| "PHP table containing the translations. As an example, here’s an extract "
+#| "from `app/i18n/fr/gen.php`:"
+msgid ""
+"The translation files are quite simple: it’s only a matter of returning a "
+"PHP array containing the translations. As an example, here’s an extract from "
+"[`app/i18n/fr/gen.php`](/app/i18n/fr/gen.php):"
+msgstr ""
+"Les fichiers de traduction sont assez simples : il s’agit seulement de "
+"retourner un tableau PHP contenant les traductions. Extrait du fichier `app/"
+"i18n/fr/gen.php` :"
+
+#. type: Fenced code block (php)
+#: en/./internationalization.md:24
+#, fuzzy, no-wrap
+#| msgid ""
+#| "<?php\n"
+#| "\n"
+#| "return array(\n"
+#| "\t'action' => [\n"
+#| "\t\t'actualize' => 'Actualiser',\n"
+#| "\t\t'back_to_rss_feeds' => '↠Retour à vos flux RSS',\n"
+#| "\t\t'cancel' => 'Annuler',\n"
+#| "\t\t'create' => 'Créer',\n"
+#| "\t\t'disable' => 'Désactiver',\n"
+#| "\t),\n"
+#| "\t'freshrss' => array(\n"
+#| "\t\t'_' => 'FreshRSS',\n"
+#| "\t\t'about' => 'Ă€ propos de FreshRSS',\n"
+#| "\t),\n"
+#| "];\n"
+#| "\n"
+#| "?>\n"
+msgid ""
+"<?php\n"
+"return array(\n"
+"\t'action' => [\n"
+"\t\t'actualize' => 'Actualiser',\n"
+"\t\t'back_to_rss_feeds' => '↠Retour à vos flux RSS',\n"
+"\t\t'cancel' => 'Annuler',\n"
+"\t\t'create' => 'Créer',\n"
+"\t\t'disable' => 'Désactiver',\n"
+"\t),\n"
+"\t'freshrss' => array(\n"
+"\t\t'_' => 'FreshRSS',\n"
+"\t\t'about' => 'Ă€ propos de FreshRSS',\n"
+"\t),\n"
+"\t// ...\n"
+");\n"
+msgstr ""
+"<?php\n"
+"\n"
+"return array(\n"
+"\t'action' => [\n"
+"\t\t'actualize' => 'Actualiser',\n"
+"\t\t'back_to_rss_feeds' => '↠Retour à vos flux RSS',\n"
+"\t\t'cancel' => 'Annuler',\n"
+"\t\t'create' => 'Créer',\n"
+"\t\t'disable' => 'Désactiver',\n"
+"\t),\n"
+"\t'freshrss' => array(\n"
+"\t\t'_' => 'FreshRSS',\n"
+"\t\t'about' => 'Ă€ propos de FreshRSS',\n"
+"\t),\n"
+"];\n"
+"\n"
+"?>\n"
+
+#. type: Plain text
+#: en/./internationalization.md:43
+#, fuzzy
+#| msgid ""
+#| "The string to pass to the `_t()` function consists of a series of "
+#| "identifiers separated by dots. The first identifier indicates from which "
+#| "file to extract the translation (in this case, `gen.php`), while the "
+#| "following ones indicate table entries. Thus `action` is an entry of the "
+#| "main array and `back_to_rss_feeds` is an entry of the `action` array. "
+#| "This allows us to further organize our translation files."
+msgid ""
+"Each value can be referenced by a key: it consists of a series of "
+"identifiers separated by dots. The first identifier indicates from which "
+"file to extract the translation, while the following ones indicate array "
+"entries. Thus, the `gen.freshrss.about` key is referencing the `about` entry "
+"from the `freshrss` entry which is part of the main array returned by the "
+"`gen.php` file. This allows us to further organize our translation files."
+msgstr ""
+"La chaîne à passer à la fonction `_t()` consiste en une série d’identifiants "
+"séparés par des points. Le premier identifiant indique de quel fichier on "
+"veut extraire la traduction (dans notre cas présent, de `gen.php`), tandis "
+"que les suivantes indiquent des entrées de tableaux. Ainsi `action` est une "
+"entrée du tableau principal et `back_to_rss_feeds` est une entrée du tableau "
+"`action`. Cela permet d’organiser encore un peu plus nos fichiers de "
+"traduction."
+
+#. type: Plain text
+#: en/./internationalization.md:45
+msgid ""
+"You should not have to write the array by yourself and we provide several "
+"commands to ease the manipulation of these files. Let’s see some common use "
+"cases."
+msgstr ""
+
+#. type: Title ##
+#: en/./internationalization.md:46
+#, no-wrap
+msgid "Add support for a new language"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:49
+msgid ""
+"If you want to add support for a language which isn’t supported by FreshRSS "
+"yet, you can run this command:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:50
+#, no-wrap
+msgid "make i18n-add-language lang=[your language code]\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:55
+msgid ""
+"You must replace `[your language code]` by the language tag of your "
+"language. It must follow the [IETF BCP 47 standard](https://en.wikipedia.org/"
+"wiki/IETF_language_tag). For instance, English is `en` and French is `fr`. "
+"You can target a specific region with a subtag, for instance `pt-br` for "
+"Brazilian Portuguese. If you’re not sure of the code, Wikipedia might be a "
+"good start to find it or you can ask us for help too."
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:57
+msgid ""
+"The command will create a new subfolder under `app/i18n/` and copy the "
+"strings from the reference language (i.e. English). It will also mark all "
+"the translations with a special tag represented by a comment: `// TODO - "
+"Translation`. We’ll see in the next section how to translate the strings."
+msgstr ""
+
+#. type: Title ##
+#: en/./internationalization.md:58
+#, no-wrap
+msgid "Translate the interface"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:61
+msgid ""
+"You might have noticed some strings are not yet translated from English even "
+"though you’ve selected a different language. This is because we mostly speak "
+"English or French and it’s pretty difficult to us to speak all the different "
+"languages!"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:63
+msgid ""
+"To update a string, you just have to open its file, find the string, and "
+"change it (without removing the quotes around it!) You might want to remove "
+"the comment at the end of the line, but you should prefer to use the "
+"following command:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:64
+#, no-wrap
+msgid "make i18n-format\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:69
+msgid ""
+"It will remove the comments on the lines that you’ve changed, and will "
+"reformat the file correctly. If you’ve made any mistakes, it will fix them "
+"automatically or it will tell you it can’t (well… the command will "
+"dramatically fail without any damage, don’t worry)."
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:71
+msgid ""
+"The strings to translate can be easily found in the translations files "
+"thanks to the tag we spoke about at the end of the previous section. Indeed, "
+"it indicates to our tools that the strings are not translated yet. This "
+"means you can find them with Git. For instance for the Greek language:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:72
+#, no-wrap
+msgid "git grep TODO app/i18n/he\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./internationalization.md:76
+#, no-wrap
+msgid "Acknowledge a false-positive"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:79
+msgid ""
+"Our tool detects if a string needs to be translated if it equals to the "
+"English version. For instance, the word “version” is the same in English and "
+"French. Thus, our tool would mark the French word to be translated. This is, "
+"in fact, the case for the `index.about.version` key. This case is considered "
+"as a false-positive because the word _is_ actually translated. To aknowledge "
+"such translations, you can run:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:80
+#, no-wrap
+msgid "make i18n-ignore-key lang=fr key=index.about.version\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:85
+msgid ""
+"This command adds an IGNORE comment on the translation so the key can be "
+"considered as translated."
+msgstr ""
+
+#. type: Title ##
+#: en/./internationalization.md:86
+#, no-wrap
+msgid "Add/remove/update a key"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:89
+msgid ""
+"If you’re developing a new part of the application, you might want to "
+"declare a new translation key. Your first impulse would be to add the key to "
+"each file manually: don’t do that, it’s very painful. We provide another "
+"command:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:90
+#, no-wrap
+msgid "make i18n-add-key key=the.key.to.add value='Your string in English'\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:95
+msgid ""
+"This adds the key to all the files. It’ll be in English, waiting for other "
+"translators."
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:97
+msgid ""
+"Conversely, you may want to remove a key that is no longer used in the "
+"application with:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:98
+#, no-wrap
+msgid "make i18n-remove-key key=the.key.to.remove\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:103
+msgid ""
+"Finally, if the English version of a string needs to be changed, you need to "
+"consider two cases. If the change doesn’t impact the meaning of the "
+"sentence, and therefore other languages don’t need to change (e.g. to fix a "
+"typo), you should make the change manually in the file. In any other case, "
+"you should use the following command:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:104
+#, no-wrap
+msgid "make i18n-update-key key=the.key.to.change value='The new string in English'\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:109
+msgid "The key will simply be removed and added back with the new value."
+msgstr ""
+
+#. type: Title ##
+#: en/./internationalization.md:110
+#, no-wrap
+msgid "How to access a translation programmatically"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:113
+msgid ""
+"To access these translations, you must use the `_t()` function (which is a "
+"shortcut for `Minz_Translate::t()`). Code example:"
+msgstr ""
+
+#. type: Fenced code block (html)
+#: en/./internationalization.md:114
+#, no-wrap
+msgid ""
+"<p>\n"
+"\t<?= _t('gen.freshrss.about') ?>\n"
+"</p>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:121
+#, fuzzy
+#| msgid ""
+#| "There is a small special case that sometimes makes life easier: the `_` "
+#| "identifier. This must necessarily be present at the end of the chain and "
+#| "gives a value to the higher-level identifier. It’s pretty hard to explain "
+#| "but very simple to understand. In the example given above, a `_` is "
+#| "associated with the value `FreshRSS`: this means that there is no need to "
+#| "write `_t('gen.freshrss._')` but `_t('gen.freshrss')` suffices."
+msgid ""
+"The function expects a translation key, but there’s a special case that "
+"sometimes makes life easier: the `_` identifier. This must necessarily be "
+"present at the end of the chain and gives a value to the higher-level "
+"identifier. It’s pretty hard to explain but very simple to understand. In "
+"the example given above, an `_` is associated with the value `FreshRSS`: "
+"this means that there is no need to write `_t('gen.freshrss._')` but "
+"`_t('gen.freshrss')` suffices."
+msgstr ""
+"Il existe un petit cas particulier qui permet parfois de se simplifier la "
+"vie : le cas de l’identifiant `_`. Celui-ci doit nécessairement être présent "
+"en bout de chaîne et permet de donner une valeur à l’identifiant de niveau "
+"supérieur. C’est assez dur à expliquer mais très simple à comprendre. Dans "
+"l’exemple donné plus haut, un `_` est associé à la valeur `FreshRSS` : cela "
+"signifie qu’il n’y a pas besoin d’écrire `_t('gen.freshrss._')` mais "
+"`_t('gen.freshrss')` suffit."
+
+#. type: Plain text
+#: en/./internationalization.md:123
+msgid ""
+"`_t()` can take any number of variables. The variables will then be replaced "
+"in the translation if it contains some “conversion specifications” (usually "
+"`%s` or `%d`). You can learn more about these specifications in the "
+"[`sprintf()` PHP function documentation](https://www.php.net/manual/function."
+"sprintf)."
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:125
+#, no-wrap
+msgid "For instance, the English translation for `gen.auth.keep_logged_in` is `Keep me logged in <small>(%s days)</small>`. It means this translation expects a string to be passed as an argument to the `t()` function (well, it should be a `%d` because we want a number here, but it doesn’t matter). For instance:\n"
+msgstr ""
+
+#. type: Fenced code block (php)
+#: en/./internationalization.md:126
+#, no-wrap
+msgid ""
+"<label>\n"
+"\t<input type=\"checkbox\" name=\"keep_logged_in\" />\n"
+"\t<?= _t('gen.auth.keep_logged_in', 30) ?>\n"
+"</label>\n"
+msgstr ""
+
#. type: Plain text
#: en/./users/02_First_steps.md:2
msgid ""
@@ -3987,9 +6044,13 @@ msgstr "[Utiliser le bookmark dédié](04_Subscriptions.md#utiliser-le-bookmark)
#. type: Plain text
#: en/./users/02_First_steps.md:12
+#, fuzzy
+#| msgid ""
+#| "Once you have added your feeds to FreshRSS, it is time to read them. "
+#| "There are three availalbe reading modes:"
msgid ""
"Once you have added your feeds to FreshRSS, it is time to read them. There "
-"are three availalbe reading modes:"
+"are three available reading modes:"
msgstr ""
"Une fois que vous avez ajouté vos flux à FreshRSS, il est temps de les lire. "
"Pour cela, trois modes de lecture s’offrent à vous :"
@@ -4058,23 +6119,31 @@ msgstr ""
#. type: Bullet: '* '
#: en/./users/02_First_steps.md:27
-msgid "[Refresh feeds](03_Main_view.md#refreshing-feeds)"
+#, fuzzy
+#| msgid "[Refresh feeds](03_Main_view.md#refreshing-feeds)"
+msgid "[Refresh feeds](09_refreshing_feeds.md)"
msgstr "[Mettez Ă  jour vos flux](03_Main_view.md#rafraichir-les-flux)"
#. type: Bullet: '* '
#: en/./users/02_First_steps.md:27
-msgid ""
-"[Filter articles](03_Main_view.md#filtering-articles) for a fast access to a "
-"selection"
+#, fuzzy
+#| msgid ""
+#| "[Filter articles](03_Main_view.md#filtering-articles) for a fast access "
+#| "to a selection"
+msgid "[Filter articles](10_filter.md) for a fast access to a selection"
msgstr ""
"[Filtrez les articles](03_Main_view.md#filtrer-les-articles) pour accéder "
"rapidement à ceux que vous voulez lire en priorité"
#. type: Bullet: '* '
#: en/./users/02_First_steps.md:27
+#, fuzzy
+#| msgid ""
+#| "[search for an article](03_Main_view.md#with-the-search-field) published "
+#| "some time ago"
msgid ""
-"[search for an article](03_Main_view.md#with-the-search-field) published some time "
-"ago"
+"[search for an article](10_filter.md#with-the-search-field) published some "
+"time ago"
msgstr ""
"[Retrouvez un article](03_Main_view.md#rechercher-des-articles) qui a été "
"publié il y a quelques jours ou mois"
@@ -4094,648 +6163,575 @@ msgstr "[Ajoutez quelques extensions](https://github.com/FreshRSS/Extensions)"
msgid "[Frequently asked questions](07_Frequently_Asked_Questions.md)"
msgstr "[Foire aux questions](07_Frequently_Asked_Questions.md)"
-#. type: Title #
-#: en/./users/03_Main_view.md:1
-#, no-wrap
-msgid "Normal view"
-msgstr "La vue normale"
-
-#. type: Title #
-#: en/./users/03_Main_view.md:5
-#, no-wrap
-msgid "Global view"
-msgstr "La vue globale"
-
-#. type: Title #
-#: en/./users/03_Main_view.md:9
-#, no-wrap
-msgid "Reader view"
-msgstr "La vue lecture"
-
-#. type: Title #
-#: en/./users/03_Main_view.md:13
-#, no-wrap
-msgid "Refreshing feeds"
-msgstr "Rafraîchir les flux"
-
#. type: Plain text
-#: en/./users/03_Main_view.md:16
+#: en/./users/03_Main_view.md:4
msgid ""
-"To take full advantage of FreshRSS, it needs to retrieve new items from the "
-"feeds you have subscribed to. There are several ways to do this."
+"FreshRSS has three primary viewing modes: Normal, Global, and Reader view."
msgstr ""
-"Pour profiter pleinement de FreshRSS, il faut qu’il récupère les nouveaux "
-"articles disponibles des flux auxquels vous avez souscrit. Pour cela, il "
-"existe plusieurs méthodes."
#. type: Title ##
-#: en/./users/03_Main_view.md:17
+#: en/./users/03_Main_view.md:5
#, no-wrap
-msgid "Automatic update"
-msgstr "Mise Ă  jour automatique"
+msgid "Normal view"
+msgstr "La vue normale"
#. type: Plain text
-#: en/./users/03_Main_view.md:20
+#: en/./users/03_Main_view.md:8
msgid ""
-"This is the recommended method since you can forget about it once it is "
-"configured."
+"Normal view will allow you to view articles in a compressed view. They can "
+"be separated by category or individual feed, or viewed in the \"main "
+"stream\" containing all feeds. Clicking a feed in the sidebar (mobile users "
+"will need to click the folder icon to open it) will open that feed’s view."
msgstr ""
-"C’est la méthode recommandée car il n’y a pas besoin d’y penser, elle se "
-"fait toute seule, à la fréquence que vous avez choisi."
#. type: Title ###
-#: en/./users/03_Main_view.md:21
-#, no-wrap
-msgid "With the actualize_script.php script"
-msgstr "Par le script actualize_script.php"
+#: en/./users/03_Main_view.md:9
+#, fuzzy, no-wrap
+#| msgid "Article icons"
+msgid "Article List"
+msgstr "Icônes d’article"
#. type: Plain text
-#: en/./users/03_Main_view.md:24
+#: en/./users/03_Main_view.md:18
msgid ""
-"This method is only available if you have access to the scheduled tasks of "
-"the machine on which your FreshRSS instance is installed."
+"By default, the normal view includes six items per article. From left to "
+"right: * **Read status:** An envelope icon to show if the article has been "
+"read or not. Closed envelopes are unread, open envelopes are read. Clicking "
+"on the icon will toggle the read status. * **Favourite status:** A star "
+"icon to show if the article has been favourited or not. Filled stars are "
+"favourited, empty stars are not. Clicking on the icon will toggle the "
+"favourite status. * **Feed name:** The name of the feed that the article is "
+"from. Clicking the feed name will move to that feed’s view in normal view. "
+"* **Article title:** The title of the article. Clicking will open the "
+"article for viewing within FreshRSS. * **Article date/time:** The time the "
+"article was posted. * **Link to original article:** A globe icon that can "
+"be clicked to go to the article on the original website."
msgstr ""
-"Cette méthode n’est possible que si vous avez accès aux tâches planifiées de "
-"la machine sur laquelle est installée votre instance de FreshRSS."
-#. type: Plain text
-#: en/./users/03_Main_view.md:26
-msgid ""
-"The script is named *actualize_script.php* and is located in the *app* "
-"folder. The scheduled task syntax will not be explained here. However, here "
-"is [a quick introduction to crontab](http://www.adminschoice.com/crontab-"
-"quick-reference/) that might help you."
-msgstr ""
-"Le script qui permet de mettre à jour les articles s’appelle "
-"*actualize_script.php* et se trouve dans le répertoire *app* de votre "
-"instance de FreshRSS. La syntaxe des tâches planifiées ne sera pas expliqué "
-"ici, cependant voici [une introduction rapide Ă  crontab](http://www."
-"adminschoice.com/crontab-quick-reference/) qui peut vous aider."
+#. type: Title ###
+#: en/./users/03_Main_view.md:19
+#, fuzzy, no-wrap
+#| msgid "Normal view"
+msgid "Normal View Sidebar"
+msgstr "La vue normale"
#. type: Plain text
#: en/./users/03_Main_view.md:28
-msgid "Here is an example to trigger article update every hour."
+msgid ""
+"Clicking the gear icon next to an individual feed will display additional "
+"options for that feed. * **Filter:** Run the defined filter to mark "
+"articles as read * **Statistics:** View statistics about the feed * **See "
+"website:** Open the feed’s website in another tab * **Manage:** Configure "
+"the feed * **Actualize:** Force-update the feed * **Mark as read:** Mark all "
+"items in the feed as read"
msgstr ""
-"Ci-dessous vous trouverez un exemple permettant la mise Ă  jour des articles "
-"toutes les heures."
-
-#. type: Code fence info string
-#: en/./users/03_Main_view.md:29 en/./users/03_Main_view.md:61
-#: en/./users/03_Main_view.md:79 en/./users/03_Main_view.md:85
-#: en/./users/03_Main_view.md:93
-#, no-wrap
-msgid "cron"
-msgstr "cron"
-#. type: Plain text
+#. type: Title ##
#: en/./users/03_Main_view.md:29
#, no-wrap
-msgid "0 * * * * php /path/to/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log 2>&1\n"
-msgstr "0 * * * * php /chemin/vers/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log 2>&1\n"
-
-#. type: Plain text
-#: en/./users/03_Main_view.md:34
-msgid ""
-"Special parameters to configure the script - all parameters can be combined:"
-msgstr ""
-"« Paramètres de configuration du script; Ils sont utilisables "
-"simultanément : »"
+msgid "Global view"
+msgstr "La vue globale"
#. type: Plain text
-#: en/./users/03_Main_view.md:38
+#: en/./users/03_Main_view.md:32
msgid ""
-"- Parameter \"force\" https://freshrss.example.net/i/?"
-"c=feed&a=actualize&force=1 If *force* is set to 1 all feeds will be "
-"refreshed at once."
+"Global view allows quick views of feed’s statuses at once. Feeds and "
+"categories are shown with the number of unread articles next to them. "
+"Clicking a feed’s name will open it in a view similar to normal view."
msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:42
-msgid ""
-"- Parameter \"ajax\" https://freshrss.example.net/i/?"
-"c=feed&a=actualize&ajax=1 Only a status site is returned and not a complete "
-"website. Example: \"OK\""
-msgstr ""
+#. type: Title ##
+#: en/./users/03_Main_view.md:33
+#, no-wrap
+msgid "Reader view"
+msgstr "La vue lecture"
#. type: Plain text
-#: en/./users/03_Main_view.md:46
+#: en/./users/03_Main_view.md:36
msgid ""
-"- Parameter \"maxFeeds\" https://freshrss.example.net/i/?"
-"c=feed&a=actualize&maxFeeds=30 If *maxFeeds* is set the configured amount of "
-"feeds is refreshed at once. The default setting is \"10\"."
+"Reader view will display a feed will all articles already open for reading. "
+"Feeds can be switched by clicking the folder icon at the top to bring up the "
+"category/feed sidebar."
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:50
+#: en/./users/03_Main_view.md:40
msgid ""
-"- Parameter \"token\" https://freshrss.example.net/i/?"
-"c=feed&a=actualize&token=542345872345734 Security parameter to prevent "
-"unauthorized refreshes. For detailed Documentation see \"Form authentication"
-"\"."
+"Read more: * [Refreshing the feeds](./09_refreshing_feeds.md) * [Filter the "
+"feeds and search](./10_filter.md)"
msgstr ""
-#. type: Title ###
-#: en/./users/03_Main_view.md:51
+#. type: Title #
+#: en/./users/04_Subscriptions.md:1
#, no-wrap
-msgid "Online cron"
-msgstr ""
+msgid "Adding a feed"
+msgstr "Ajouter un flux"
-#. type: Plain text
-#: en/./users/03_Main_view.md:54
+#. type: Bullet: '1. '
+#: en/./users/04_Subscriptions.md:10
msgid ""
-"If you do not have access to the installation server scheduled task, you can "
-"still automate the update process."
+"To add a feed, copy the URL of its RSS or Atom file (for instance, the "
+"Framablog RSS URL is `https://framablog.org/feed/`). FreshRSS is able to "
+"automatically find the address of the feed for websites that are declaring "
+"it in a standard way."
msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:56
+#. type: Bullet: '2. '
+#: en/./users/04_Subscriptions.md:10
msgid ""
-"To do so, you need to create a scheduled task, which need to call a specific "
-"URL: https://freshrss.example.net/i/?c=feed&a=actualize (it could be "
-"different depending on your installation). Depending on your application "
-"authentication method, you need to adapt the scheduled task."
+"In FreshRSS, click the \"**+**\" button next to “Subscriptions management”."
msgstr ""
-#. type: Title ####
-#: en/./users/03_Main_view.md:57
-#, no-wrap
-msgid "No authentication"
-msgstr "Aucune authentification"
+#. type: Bullet: '3. '
+#: en/./users/04_Subscriptions.md:10
+msgid "Paste the URL in the “Feed URL” field."
+msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:60
+#. type: Bullet: '4. '
+#: en/./users/04_Subscriptions.md:10
msgid ""
-"This is the most straightforward since you have a public instance; there is "
-"nothing special to configure:"
+"(optional): You can select the category for your feed. By default, it will "
+"be in “Uncategorized”."
msgstr ""
-"C’est le cas le plus simple, puisque votre instance est publique, vous "
-"n’avez rien de particulier à préciser :"
-
-#. type: Plain text
-#: en/./users/03_Main_view.md:61
-#, no-wrap
-msgid "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
-msgstr "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
-#. type: Title ###
-#: en/./users/03_Main_view.md:65
-#, no-wrap
-msgid "Form authentication"
-msgstr "Authentification par formulaire"
-
-#. type: Plain text
-#: en/./users/03_Main_view.md:68
+#. type: Bullet: '5. '
+#: en/./users/04_Subscriptions.md:10
msgid ""
-"If you configure the application to allow anonymous reading, you can also "
-"allow anonymous users to update feeds (“Allow anonymous refresh of the "
-"articles”)."
+"(optional): If the subscription requires credentials, you can enter them in "
+"the \"HTTP username\" and \"HTTP password\" fields."
msgstr ""
-"Dans ces cas-là, si vous avez autorisé la lecture anonyme des articles, vous "
-"pouvez aussi permettre à n’importe qui de rafraîchir vos flux (« Autoriser "
-"le rafraîchissement anonyme des flux »)."
-#. type: Plain text
-#: en/./users/03_Main_view.md:70
-msgid "![Anonymous access configuration](../img/users/anonymous_access.1.png)"
+#. type: Bullet: '6. '
+#: en/./users/04_Subscriptions.md:10
+msgid "(optional): You can set a timeout for the feed request."
msgstr ""
-"![Configuration de l’accès anonymes](../img/users/anonymous_access.1.png)"
-#. type: Plain text
-#: en/./users/03_Main_view.md:72
+#. type: Bullet: '7. '
+#: en/./users/04_Subscriptions.md:10
msgid ""
-"The URL used in the previous section will now become accessible to anyone. "
-"Therefore you can use the same syntax for the scheduled task."
+"(optional): You can choose to ignore SSL certificate errors (such as with "
+"self-signed certificates) by setting \"Verify SSL security\" to \"No\". This "
+"is not recommended, and it is better to either add the root certificate to "
+"the FreshRSS server or to fix the SSL certificate problems on the feed "
+"hosting server."
msgstr ""
-"L’url précédente devient donc accessible à n’importe qui et vous pouvez "
-"utiliser la tâche cron de la partie précédente."
-#. type: Plain text
-#: en/./users/03_Main_view.md:74
-msgid ""
-"You can also configure an authentication token to grant special access on "
-"the server."
-msgstr ""
-"Vous pouvez aussi configurer un jeton d’authentification pour accorder un "
-"droit spécial sur votre serveur."
-
-#. type: Plain text
-#: en/./users/03_Main_view.md:76
-msgid "![Token configuration](../img/users/token.1.png)"
-msgstr "![Configuration du token](../img/users/token.1.png)"
-
-#. type: Plain text
-#: en/./users/03_Main_view.md:78
-msgid "The scheduled task syntax should look as follows:"
-msgstr "La tâche cron à utiliser sera de la forme suivante :"
-
-#. type: Plain text
-#: en/./users/03_Main_view.md:79
+#. type: Title ##
+#: en/./users/04_Subscriptions.md:11
#, no-wrap
-msgid "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize&token=my-token'\n"
-msgstr "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize&token=mon-token'\n"
+msgid "Subscription management"
+msgstr "Gestion des flux"
#. type: Plain text
-#: en/./users/03_Main_view.md:84
+#: en/./users/04_Subscriptions.md:14
msgid ""
-"You can also target a different user by adding their username to the query "
-"string, with `&user=insert-username`:"
+"The \"Subscription management\" submenu allows categories and feeds to be "
+"configured. Feeds can be moved between categories by drag-and-drop, or in "
+"the individual feed’s settings. Hovering over a feed/category will cause a "
+"gear icon to appear. Clicking the icon will bring up the settings for that "
+"item."
msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:85
+#. type: Title ##
+#: en/./users/04_Subscriptions.md:15
#, no-wrap
-msgid "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize&user=someone&token=my-token'\n"
-msgstr "0 * * * * curl 'https://freshrss.exemple.net/i/?c=feed&a=actualize&user=quelquun&token=mon-token'\n"
+msgid "Category Settings"
+msgstr ""
#. type: Title ###
-#: en/./users/03_Main_view.md:89
+#: en/./users/04_Subscriptions.md:17
#, no-wrap
-msgid "HTTP authentication"
-msgstr "Authentification HTTP"
+msgid "Information"
+msgstr "Informations"
-#. type: Plain text
-#: en/./users/03_Main_view.md:92
-msgid ""
-"When using HTTP authentication, the syntax in the two previous sections is "
-"unusable. You’ll need to provide your credentials to the scheduled task. "
-"**Note that this method is highly discouraged since it means that your "
-"credentials will be in plain sight!**"
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:21
+msgid "**Title:** Name of category"
msgstr ""
-"Dans ce cas-là, le token et les permissions “anonymes” sont inutilisables et "
-"il vous sera nécessaire d’indiquer vos identifiants dans la tâche cron. "
-"**Notez que cette solution est grandement déconseillée puisqu’elle implique "
-"que vos identifiants seront visibles en clair !**"
-#. type: Plain text
-#: en/./users/03_Main_view.md:93
-#, no-wrap
-msgid "0 * * * * curl -u alice:password123 'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
-msgstr "0 * * * * curl -u alice:motdepasse123 'https://freshrss.exemple.net/i/?c=feed&a=actualize'\n"
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:21
+msgid ""
+"**Display position:** Defines the order of categories. Lower numbers get "
+"priority, non-numbered items come last, and equally numbered items will sort "
+"by alphabetical order."
+msgstr ""
#. type: Title ##
-#: en/./users/03_Main_view.md:97
-#, no-wrap
-msgid "Manual update"
-msgstr "Mise Ă  jour manuelle"
+#: en/./users/04_Subscriptions.md:22 en/./users/05_Configuration.md:115
+#, fuzzy, no-wrap
+#| msgid "Archival"
+msgid "Archiving"
+msgstr "Archivage"
#. type: Plain text
-#: en/./users/03_Main_view.md:100
+#: en/./users/04_Subscriptions.md:25
msgid ""
-"If you can’t or don’t want to use the automatic method, you can update "
-"manually. There are two methods for updating all or some of the feeds."
+"If \"Purge Policy\" has \"By default\" selected, then the [default purge "
+"policy](./05_Configuration.md) is used and the other options are not "
+"displayed. Category options will override the default policy, but they will "
+"not override feed-specific options."
msgstr ""
-"Si vous ne pouvez pas ou ne voulez pas utiliser la méthode automatique, vous "
-"pouvez le faire de façon manuelle. Il existe deux méthodes qui permettent de "
-"mettre Ă  jour tout ou partie des flux."
-#. type: Title ###
-#: en/./users/03_Main_view.md:101
+#. type: Title ##
+#: en/./users/04_Subscriptions.md:26
#, no-wrap
-msgid "Complete update"
-msgstr "Mise à jour complète"
+msgid "Feed Settings"
+msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:104
+#: en/./users/04_Subscriptions.md:29
msgid ""
-"This update occurs on all feeds. To trigger it, simply click on the update "
-"link in the navigation menu."
+"These fields will be auto-filled when adding a feed, but they can be "
+"modified later. **Visibility** will define if the feed is displayed in the "
+"main feed, only in specific categories, or not at all."
msgstr ""
-"Cette mise à jour se fait pour l’ensemble des flux de l’instance. Pour "
-"initier cette mise Ă  jour, il suffit de cliquer sur le lien de mise Ă  jour "
-"disponible dans le menu de navigation."
-#. type: Plain text
-#: en/./users/03_Main_view.md:106
-msgid "![Navigation menu](../img/users/refresh.1.png)"
-msgstr "![Menu de navigation](../img/users/refresh.1.png)"
+#. type: Title #
+#: en/./users/04_Subscriptions.md:30 en/./users/05_Configuration.md:113
+#, no-wrap
+msgid "Archival"
+msgstr "Archivage"
#. type: Plain text
-#: en/./users/03_Main_view.md:108
+#: en/./users/04_Subscriptions.md:33
msgid ""
-"When the update starts, a progress bar appears and changes while feeds are "
-"processed."
+"This section will let you override the default settings for feed archiving "
+"and update frequency."
msgstr ""
-"Lorsque la mise à jour démarre, une barre de progression apparait et "
-"s’actualise au fur et à mesure de la récupération des articles."
-
-#. type: Plain text
-#: en/./users/03_Main_view.md:110
-msgid "![Progress bar](../img/users/refresh.5.png)"
-msgstr "![Barre de progression](../img/users/refresh.5.png)"
#. type: Title ###
-#: en/./users/03_Main_view.md:111
+#: en/./users/04_Subscriptions.md:34
#, no-wrap
-msgid "Partial update"
-msgstr "Mise Ă  jour partielle"
+msgid "Login"
+msgstr "Identification"
#. type: Plain text
-#: en/./users/03_Main_view.md:114
+#: en/./users/04_Subscriptions.md:37
msgid ""
-"This update occurs on the selected feed only. To trigger it, simply click on "
-"the update link in the feed menu."
+"Some feeds require a username/password submitted over HTTP. These usually "
+"aren’t needed for feeds."
msgstr ""
-"Cette mise à jour se fait pour le flux sélectionné uniquement. Pour initier "
-"cette mise Ă  jour, il suffit de cliquer sur le lien de mise Ă  jour "
-"disponible dans le menu du flux."
-#. type: Plain text
-#: en/./users/03_Main_view.md:116
-msgid "![Feed menu](../img/users/refresh.2.png)"
-msgstr "![Menu du flux](../img/users/refresh.2.png)"
-
-#. type: Title #
-#: en/./users/03_Main_view.md:117
+#. type: Title ###
+#: en/./users/04_Subscriptions.md:38
#, no-wrap
-msgid "Filtering articles"
-msgstr "Filtrer les articles"
+msgid "Advanced"
+msgstr "Avancé"
+
+#. type: Title ####
+#: en/./users/04_Subscriptions.md:40
+#, fuzzy, no-wrap
+#| msgid "Retrieve a truncated stream from within FreshRSS"
+msgid "Retrieve a truncated feed from within FreshRSS"
+msgstr "Récupérer un flux tronqué à partir de FreshRSS"
#. type: Plain text
-#: en/./users/03_Main_view.md:120
+#: en/./users/04_Subscriptions.md:43
+#, fuzzy
+#| msgid ""
+#| "This question comes up regularly, so we will try to clarify how one can "
+#| "retrieve a truncated RSS feed with FreshRSS. Please note that the process "
+#| "is absolutely not user friendly, but it works. :)"
msgid ""
-"When the number of articles stored by FreshRSS inevitably grows larger, it’s "
-"important to use efficient filters to display only a subset of the articles. "
-"There are several methods that filter with different criteria. Usually those "
-"methods can be combined."
+"This question comes up regularly, so we’ll try to clarify how one can "
+"retrieve a truncated RSS feed with FreshRSS. Please note that the process is "
+"absolutely not user friendly, but it works. :)"
msgstr ""
-"Avec le nombre croissant d’articles stockés par FreshRSS, il devient "
-"important d’avoir des filtres efficaces pour n’afficher qu’une partie des "
-"articles. Il existe plusieurs méthodes qui filtrent selon des critères "
-"différents. Ces méthodes peuvent être combinées dans la plus part des cas."
-
-#. type: Title ##
-#: en/./users/03_Main_view.md:121
-#, no-wrap
-msgid "By category"
-msgstr "Par catégorie"
+"La question revient régulièrement, je vais essayer de clarifier ici comment "
+"on peut récupérer un flux RSS tronqué avec FreshRSS. Sachez avant tout que "
+"la manière de s’y prendre n’est absolument pas \"user friendly\", mais elle "
+"fonctionne. :)"
#. type: Plain text
-#: en/./users/03_Main_view.md:124
+#: en/./users/04_Subscriptions.md:45
msgid ""
-"This is the easiest method. You only need to click on the category title in "
-"the side panel. There are two special categories at the top of the panel:"
+"Please be aware that this way you’ll generate much more traffic to the "
+"originating sites, and they might block you accordingly. FreshRSS "
+"performance is also negatively affected, because you’ll have to fetch the "
+"full article content one by one. So it’s a feature to use sparingly!"
msgstr ""
-"C’est la méthode la plus simple. Il suffit de cliquer sur le titre d’une "
-"catégorie dans le panneau latéral. Il existe deux catégories spéciales qui "
-"sont placées en haut dudit panneau :"
+"Sachez aussi que par cette manière vous générez beaucoup plus de trafic vers "
+"les sites d’origines et qu’ils peuvent vous bloquer par conséquent. Les "
+"performances de FreshRSS sont aussi moins bonnes car vous devez alors aller "
+"chercher le contenu des articles un par un. C’est donc une fonctionnalité à "
+"utiliser avec parcimonie !"
-#. type: Bullet: ' * '
-#: en/./users/03_Main_view.md:127
-msgid ""
-"*Main feed* displays only articles from feeds marked as available in that "
-"category"
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:47
+#, fuzzy
+#| msgid ""
+#| "What’s meant by \"CSS path of articles on the original site\" actually "
+#| "corresponds to the \"path\" consisting of IDs and classes (which in HTML, "
+#| "matches the id and class attributes) to retrieve only the interesting "
+#| "part that corresponds to the article. Ideally, this path starts with an "
+#| "id (which is unique to the page)."
+msgid ""
+"The \"Article CSS selector on original website\" corresponds to the \"path\" "
+"consisting of IDs and classes (which in HTML, matches the id and class "
+"attributes) to retrieve only the interesting part that corresponds to the "
+"article. Ideally, this path starts with an id (which is unique to the page). "
+"The basics are explained [here](https://developer.mozilla.org/en-US/docs/"
+"Learn/CSS/Building_blocks/Selectors)."
msgstr ""
-"*Flux principal* qui affiche uniquement les articles des flux marqués comme "
-"visible dans cette catégorie"
+"Ce que j’entends par \"Chemin CSS des articles sur le site d’origine\" "
+"correspond en fait au \"chemin\" constitué par les IDs et les classes (en "
+"html, correspond aux attributs id et class) pour récupérer uniquement la "
+"partie intéressante qui correspond à l’article. L’idéal est que ce chemin "
+"commence par un id (qui est unique pour la page)."
-#. type: Bullet: ' * '
-#: en/./users/03_Main_view.md:127
-msgid "*Favourites* displays only articles marked as favourites"
+#. type: Title #####
+#: en/./users/04_Subscriptions.md:48
+#, no-wrap
+msgid "Example: Rue89"
+msgstr "Exemple : Rue89"
+
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:52
+#, fuzzy
+#| msgid ""
+#| "To find this path, you have to go to the address of one of the truncated "
+#| "articles (for example, http://www.rue89.com/2013/10/15/prof-maths-jai-"
+#| "atteint-lextase-dihn-pedagogie-inversee-246635). You look have to look "
+#| "for the \"block\" of HTML that corresponds to article content (in the "
+#| "source code!)."
+msgid ""
+"To find this path, you have to go to the address of one of the truncated "
+"articles. You look have to look for the \"block\" of HTML that corresponds "
+"to article content (in the source code!)."
msgstr ""
-"*Favoris* qui affiche uniquement les articles, tous flux confondus, marqués "
-"comme favoris"
+"Pour trouver ce chemin, il faut se rendre à l’adresse d’un des articles "
+"tronqués (par exemple http://www.rue89.com/2013/10/15/prof-maths-jai-atteint-"
+"lextase-dihn-pedagogie-inversee-246635). Il faut alors chercher le \"bloc\" "
+"HTML correspondant au contenu de l’article (dans le code source !)"
-#. type: Title ##
-#: en/./users/03_Main_view.md:128
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:54
#, no-wrap
-msgid "By feed"
-msgstr "Par flux"
+msgid "Here we find that the block that encompasses nothing but the content of the article is ```<div class=\"content clearfix\">```. We’ll only use the `.content` class here. Nevertheless, as said above, it’s best to start the path with an id. If we go back to the parent block, we find ```<div id=\"article\">``` and that’s perfect! The path will be ```#article .content```.\n"
+msgstr "On trouve ici que le bloc qui englobe uniquement le contenu de l’article est ```<div class=\"content clearfix\">```. On ne va garder que la classe `.content` ici. Néanmoins, comme je le disais plus haut, il est préférable de commencer le chemin avec un id. Si on remonte au bloc parent, il s’agit du bloc ```<div id=\"article\">``` et c’est parfait ! Le chemin sera donc ```#article .content```.\n"
-#. type: Plain text
-#: en/./users/03_Main_view.md:131
-msgid "There are several methods to filter articles by feed:"
-msgstr "Il existe plusieurs méthodes pour filtrer les articles par flux :"
+#. type: Title #####
+#: en/./users/04_Subscriptions.md:55
+#, fuzzy, no-wrap
+#| msgid "Add the corresponding classes to the article CSS path on the feed configuration page. Examples:"
+msgid "Add the corresponding classes to the article CSS path on the feed configuration page"
+msgstr "Liste de correspondances site → chemin css"
-#. type: Bullet: ' * '
-#: en/./users/03_Main_view.md:136
-msgid "by clicking the feed title in the side panel"
-msgstr "en cliquant sur le titre du flux dans le panneau latéral"
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:58
+#, fuzzy
+#| msgid "Example: Rue89"
+msgid "Examples:"
+msgstr "Exemple : Rue89"
-#. type: Bullet: ' * '
-#: en/./users/03_Main_view.md:136
-msgid "by clicking the feed title in the article details"
-msgstr "en cliquant sur le titre du flux dans le détail de l’article"
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:63
+msgid "Rue89: ```#article .content```"
+msgstr "Rue89 : ```#article .content```"
-#. type: Bullet: ' * '
-#: en/./users/03_Main_view.md:136
-msgid "by filtering in the feed options from the side panel"
-msgstr "en filtrant dans les options du flux dans le panneau latéral"
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:63
+msgid "PCINpact: ```#actu_content```"
+msgstr "PCINpact : ```#actu_content```"
-#. type: Bullet: ' * '
-#: en/./users/03_Main_view.md:136
-msgid "by filtering in the feed configuration"
-msgstr "en filtrant dans la configuration du flux"
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:63
+msgid "Lesnumériques: ```article#body div.text.clearfix```"
+msgstr "Lesnumériques : ```article#body div.text.clearfix```"
-#. type: Plain text
-#: en/./users/03_Main_view.md:138
-msgid "![Feed filter](../img/users/feed.filter.1.png)"
-msgstr "![Filtrer par flux](../img/users/feed.filter.1.png)"
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:63
+msgid "Phoronix: ```#main .content```"
+msgstr "Phoronix : ```#main .content```"
-#. type: Title ##
-#: en/./users/03_Main_view.md:139
+#. type: Title #####
+#: en/./users/04_Subscriptions.md:64
#, no-wrap
-msgid "By status"
-msgstr "Par statut"
+msgid "Combining CSS Classes"
+msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:142
+#: en/./users/04_Subscriptions.md:67
msgid ""
-"Each article has two attributes that can be combined. The first attribute "
-"indicates whether or not the article has been read. The second attribute "
-"indicates if the article was marked as favorite or not."
+"Let’s say we have an article which contains ads, and we do not want to have "
+"those ads retrieved by FreshRSS. Example HTML:"
msgstr ""
-"Chaque article possède deux attributs qui peuvent être combinés. Le premier "
-"attribut indique si l’article a été lu ou non. Le second attribut indique si "
-"l’article a été noté comme favori ou non."
-#. type: Plain text
-#: en/./users/03_Main_view.md:144
+#. type: Fenced code block (html)
+#: en/./users/04_Subscriptions.md:68
+#, no-wrap
msgid ""
-"In version 0.7, attribute filters are available in the article display "
-"dropdown list. With this version, it’s not possible to combine filters. For "
-"instance, it’s not possible to display only read and favorite articles."
+"<div id=\"article\">\n"
+"<h2>wanted</h2>\n"
+"<p class=\"content\">wanted content</p>\n"
+"<p class=\"ad\">unwanted content</p>\n"
+"<h2>wanted</h2>\n"
+"<p class=\"content\">wanted content</p>\n"
+"<h2>wanted</h2>\n"
+"<p class=\"ad\">unwanted content</p>\n"
+"<p class=\"content\">wanted content</p>\n"
+"</div>\n"
msgstr ""
-"Dans la version 0.7.x, les filtres sur les attributs sont accessibles depuis "
-"la liste déroulante qui gère l’affichage des articles. Dans cette version, "
-"il n’est pas possible de combiner les filtres. Par exemple, on ne peut pas "
-"afficher les articles lus qui ont été notés comme favori."
#. type: Plain text
-#: en/./users/03_Main_view.md:146
-msgid "![Attribute filters in 0.7](../img/users/status.filter.0.7.png)"
+#: en/./users/04_Subscriptions.md:82
+msgid ""
+"In this case it’s possible to combine multiple CSS selectors with a comma: "
+"```#article p.content, #article h2```"
msgstr ""
-"![Filtrer par attribut en version 0.7](../img/users/status.filter.0.7.png)"
+
+#. type: Title ####
+#: en/./users/04_Subscriptions.md:83
+#, fuzzy, no-wrap
+#| msgid "Retrieve a truncated stream with external tools"
+msgid "Retrieve a truncated feed with external tools"
+msgstr "Récupérer un flux tronqué à l’aide d’outils externes"
#. type: Plain text
-#: en/./users/03_Main_view.md:148
+#: en/./users/04_Subscriptions.md:86
+#, fuzzy
+#| msgid ""
+#| "Complimentary tools can be used to retrieve full article content, such as:"
msgid ""
-"Starting with version 0.8, all attribute filters are visible as toggle "
-"icons. They can be combined. As any combination is possible, some have the "
-"same result. For instance, the result for all filters selected is the same "
-"as no filter selected."
+"Complementary tools can be used to retrieve full article content, such as:"
msgstr ""
+"Des outils complémentaires peuvent être utilisés pour récupérer le contenu "
+"complet d’un article, comme :"
-#. type: Plain text
-#: en/./users/03_Main_view.md:150
-msgid "![Attribute filters in 0.8](../img/users/status.filter.0.8.png)"
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:89
+msgid "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)"
+msgstr "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)"
+
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:89
+msgid "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)"
+msgstr "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)"
+
+#. type: Title ###
+#: en/./users/04_Subscriptions.md:90
+#, no-wrap
+msgid "Filter"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:152
-msgid "By default, this filter displays only unread articles"
+#: en/./users/04_Subscriptions.md:93
+msgid ""
+"Articles can be automatically marked as read based on some search terms. See "
+"[filtering](./10_filter.md) for more information on how to create these "
+"filters."
msgstr ""
#. type: Title ##
-#: en/./users/03_Main_view.md:153
-#, no-wrap
-msgid "By content"
-msgstr ""
+#: en/./users/04_Subscriptions.md:94
+#, fuzzy, no-wrap
+#| msgid "Import and export"
+msgid "Import / export"
+msgstr "Import et export"
#. type: Plain text
-#: en/./users/03_Main_view.md:156
+#: en/./users/04_Subscriptions.md:97
msgid ""
-"It is possible to filter articles by their content by inputting a string in "
-"the search field."
+"See [SQLite export/import]( https://github.com/FreshRSS/FreshRSS/tree/edge/"
+"cli) as an alternative."
msgstr ""
#. type: Title ##
-#: en/./users/03_Main_view.md:157
+#: en/./users/04_Subscriptions.md:98
#, no-wrap
-msgid "With the search field"
-msgstr "Grâce au champ de recherche"
+msgid "Export"
+msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:160
-msgid "You can use the search field to further refine results:"
+#. type: Bullet: '1. '
+#: en/./users/04_Subscriptions.md:108
+msgid "To export your list of feeds, go to “Subscriptions management”."
msgstr ""
-"Il est possible d’utiliser le champ de recherche pour raffiner les "
-"résultats :"
-#. type: Bullet: '* '
-#: en/./users/03_Main_view.md:199
-msgid "by author: `author:name` or `author:'composed name'`"
-msgstr "par auteur : `author:nom` or `author:'nom composé'`"
+#. type: Bullet: '2. '
+#: en/./users/04_Subscriptions.md:108
+msgid "Click on “Import / export”"
+msgstr ""
-#. type: Bullet: '* '
-#: en/./users/03_Main_view.md:199
-msgid "by title: `intitle:keyword` or `intitle:'composed keyword'`"
-msgstr "par titre : `intitle:mot` or `intitle:'mot composé'`"
+#. type: Bullet: '3. '
+#: en/./users/04_Subscriptions.md:108
+msgid "You can select for your export:"
+msgstr ""
-#. type: Bullet: '* '
-#: en/./users/03_Main_view.md:199
-msgid "by URL: `inurl:keyword` or `inurl:'composed keyword'`"
-msgstr "par URL: `inurl:mot` or `inurl:'mot composé'`"
+#. type: Bullet: ' 1. '
+#: en/./users/04_Subscriptions.md:108
+msgid "the list of feeds"
+msgstr ""
-#. type: Bullet: '* '
-#: en/./users/03_Main_view.md:199
-msgid "by tag: `#tag`"
-msgstr "par tag: `#tag`"
+#. type: Bullet: ' 2. '
+#: en/./users/04_Subscriptions.md:108
+#, fuzzy
+#| msgid "Filtering articles"
+msgid "labelled articles"
+msgstr "Filtrer les articles"
-#. type: Bullet: '* '
-#: en/./users/03_Main_view.md:199
-msgid "by free-text: `keyword` or `'composed keyword'`"
-msgstr "par texte libre : `mot` or `'mot composé'`"
+#. type: Bullet: ' 3. '
+#: en/./users/04_Subscriptions.md:108
+#, fuzzy
+#| msgid "Filtering articles"
+msgid "favourite articles"
+msgstr "Filtrer les articles"
-#. type: Plain text
-#: en/./users/03_Main_view.md:199
-#, no-wrap
-msgid ""
-"* by date of discovery, using the [ISO 8601 time interval format](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals): `date:<date-interval>`\n"
-"\t* From a specific day, or month, or year:\n"
-"\t\t* `date:2014-03-30`\n"
-"\t\t* `date:2014-03` or `date:201403`\n"
-"\t\t* `date:2014`\n"
-"\t* From a specific time of a given day:\n"
-"\t\t* `date:2014-05-30T13`\n"
-"\t\t* `date:2014-05-30T13:30`\n"
-"\t* Between two given dates:\n"
-"\t\t* `date:2014-02/2014-04`\n"
-"\t\t* `date:2014-02--2014-04`\n"
-"\t\t* `date:2014-02/04`\n"
-"\t\t* `date:2014-02-03/05`\n"
-"\t\t* `date:2014-02-03T22:00/22:15`\n"
-"\t\t* `date:2014-02-03T22:00/15`\n"
-"\t* After a given date:\n"
-"\t\t* `date:2014-03/`\n"
-"\t* Before a given date:\n"
-"\t\t* `date:/2014-03`\n"
-"\t* For a specific duration after a given date:\n"
-"\t\t* `date:2014-03/P1W`\n"
-"\t* For a specific duration before a given date:\n"
-"\t\t* `date:P1W/2014-05-25T23:59:59`\n"
-"\t* For the past duration before now (the trailing slash is optional):\n"
-"\t\t* `date:P1Y/` or `date:P1Y` (past year)\n"
-"\t\t* `date:P2M/` (past two months)\n"
-"\t\t* `date:P3W/` (past three weeks)\n"
-"\t\t* `date:P4D/` (past four days)\n"
-"\t\t* `date:PT5H/` (past five hours)\n"
-"\t\t* `date:PT30M/` (past thirty minutes)\n"
-"\t\t* `date:PT90S/` (past ninety seconds)\n"
-"\t\t* `date:P1DT1H/` (past one day and one hour)\n"
-"* by date of publication, using the same format: `pubdate:<date-interval>`\n"
-msgstr ""
-
-#. type: Plain text
-#: en/./users/03_Main_view.md:201
+#. type: Bullet: ' 4. '
+#: en/./users/04_Subscriptions.md:108
msgid ""
-"Be careful not to enter a space between the operator and the search value."
+"and finally, you can select feeds you want to export (by default, all feeds "
+"are selected)"
msgstr ""
-"Attention à ne pas introduire d’espace entre l’opérateur et la valeur "
-"recherchée."
-#. type: Plain text
-#: en/./users/03_Main_view.md:204
-msgid ""
-"Some operators can be used negatively, to exclude articles, with the same "
-"syntax as above, but prefixed by a `!` or `-`: `-author:name`, `-intitle:"
-"keyword`, `-inurl:keyword`, `-#tag`, `!keyword`."
+#. type: Bullet: '4. '
+#: en/./users/04_Subscriptions.md:108
+msgid "Click on “export”."
msgstr ""
-"Certains opérateurs peuvent être utilisé négativement, pour exclure des "
-"articles, avec la même syntaxe que ci-dessus, mais préfixé par `!` ou `-` :`-"
-"author:nom`, `-intitle:mot`, `-inurl:mot`, `-#tag`, `!mot`."
-#. type: Plain text
-#: en/./users/03_Main_view.md:206
-msgid ""
-"It is also possible to combine keywords to create a more precise filter. For "
-"example, you can enter multiple instances of `author:`, `intitle:`, `inurl:"
-"`, `#`, and free-text."
+#. type: Title ##
+#: en/./users/04_Subscriptions.md:109
+#, no-wrap
+msgid "Import"
msgstr ""
-"Il est également possible de combiner les mots-clefs pour faire un filtrage "
-"encore plus précis, et il est autorisé d’avoir plusieurs instances de : "
-"`author:`, `intitle:`, `inurl:`, `#`, et texte libre."
-#. type: Plain text
-#: en/./users/03_Main_view.md:208
+#. type: Bullet: '1. '
+#: en/./users/04_Subscriptions.md:114
+msgid "Go to the page “Import / export”."
+msgstr ""
+
+#. type: Bullet: '2. '
+#: en/./users/04_Subscriptions.md:114
msgid ""
-"Combining several search criteria implies a logical *and*, but the keyword ` "
-"OR ` can be used to combine several search criteria with a logical *or* "
-"instead: `author:Dupont OR author:Dupond`"
+"Click on “Browse” and select your OPML or archive file on your computer."
msgstr ""
-"Combiner plusieurs critères implique un *et* logique, mais le mot clef ` OR "
-"` peut être utiliser pour combiner plusieurs critères avec un *ou* logique :"
-"`author:Dupont OR author:Dupond`"
-#. type: Title #
-#: en/./users/04_Subscriptions.md:1
-#, no-wrap
-msgid "Adding a feed"
-msgstr "Ajouter un flux"
+#. type: Bullet: '3. '
+#: en/./users/04_Subscriptions.md:114
+msgid "Click on “Import”"
+msgstr ""
-#. type: Title #
-#: en/./users/04_Subscriptions.md:5
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:122
#, no-wrap
-msgid "Import and export"
-msgstr "Import et export"
+msgid ""
+"> **Important**: you can not import directly a list of feeds from a text file.\n"
+"> You need to convert it beforehand to _OPML_.\n"
+"> Here is some tools you could use :\n"
+">\n"
+"> * [Pandoc](https://pandoc.org/) available for most systems,\n"
+"> * [OPML generator](https://opml-gen.ovh/) available online,\n"
+"> * [txt2opml](https://alterfiles.com/convert/txt/opml) available online.\n"
+msgstr ""
-#. type: Title #
-#: en/./users/04_Subscriptions.md:9
+#. type: Title ##
+#: en/./users/04_Subscriptions.md:123
#, no-wrap
msgid "Use bookmarklet"
msgstr "Utiliser le « bookmarklet »"
#. type: Plain text
-#: en/./users/04_Subscriptions.md:12
+#: en/./users/04_Subscriptions.md:126
msgid ""
"Bookmarklets are little scripts that you can execute to perform various "
"tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds."
@@ -4744,33 +6740,35 @@ msgstr ""
"effectuer des tâches diverses et variées. FreshRSS offre un signet "
"( « bookmark » ) pour s’abonner aux fils de nouvelles."
-#. type: Bullet: ' 1. '
-#: en/./users/04_Subscriptions.md:16
-msgid "Open \"Subscriptions management\"."
+#. type: Bullet: '1. '
+#: en/./users/04_Subscriptions.md:129
+#, fuzzy
+#| msgid "Open \"Subscriptions management\"."
+msgid "Open “Subscriptions management”."
msgstr "Ouvrez \"Gestion des abonnements\"."
-#. type: Bullet: ' 2. '
-#: en/./users/04_Subscriptions.md:16
-msgid "Click on \"Subscription tools\"."
+#. type: Bullet: '2. '
+#: en/./users/04_Subscriptions.md:129
+#, fuzzy
+#| msgid "Click on \"Subscription tools\"."
+msgid "Click on “Subscription tools”."
msgstr "Cliquez sur \"Outils d’abonnement\"."
-#. type: Bullet: ' 3. '
-#: en/./users/04_Subscriptions.md:16
+#. type: Bullet: '3. '
+#: en/./users/04_Subscriptions.md:129
+#, fuzzy
+#| msgid ""
+#| "Drag the \"Subscribe\" button to your bookmark toolbar or right click and "
+#| "choose your browser’s \"Bookmark link\" action."
msgid ""
-"Drag the \"Subscribe\" button to your bookmark toolbar or right click and "
-"choose your browser’s \"Bookmark link\" action."
+"Drag the “Subscribe” button to your bookmark toolbar or right click and "
+"choose your browser’s “Bookmark link” action."
msgstr ""
"Glissez le bouton \"S’abonner\" dans la barre d’outils des signets ou "
"cliquez droit et choisissez l’action \"Lien vers les signets\" de votre "
"navigateur."
#. type: Title #
-#: en/./users/04_Subscriptions.md:17
-#, no-wrap
-msgid "Feed management"
-msgstr "Organisation des flux"
-
-#. type: Title #
#: en/./users/05_Configuration.md:2
#, no-wrap
msgid "Display"
@@ -4784,8 +6782,17 @@ msgstr "Langue"
#. type: Plain text
#: en/./users/05_Configuration.md:9
-msgid ""
-"FreshRSS is currently available in 14 languages. After confirming your "
+#, fuzzy
+#| msgid ""
+#| "FreshRSS is currently available in 14 languages. After confirming your "
+#| "choice, the interface will be displayed in your preferred language. "
+#| "Depending on the language chosen, parts of the interface may not be not "
+#| "translated yet. If you’re willing to help translate the missing bits or "
+#| "would like to add a new language, please take a look at how you can "
+#| "[contribute to the project](../contributing.md#contribute-to-"
+#| "internationalization-i18n)."
+msgid ""
+"FreshRSS is currently available in 22 languages. After confirming your "
"choice, the interface will be displayed in your preferred language. "
"Depending on the language chosen, parts of the interface may not be not "
"translated yet. If you’re willing to help translate the missing bits or "
@@ -4802,8 +6809,13 @@ msgstr ""
#. type: Plain text
#: en/./users/05_Configuration.md:11
+#, fuzzy
+#| msgid ""
+#| "Some parts of FreshRSS aren’t translated and aren’t intended to be "
+#| "translated either. For now, this includes the logs visible in the "
+#| "application as well as the log generated by automatic update scripts."
msgid ""
-"Some parts of FreshRSS aren’t translated and aren’t intended to be "
+"Some parts of FreshRSS are not translated and are not intended to be "
"translated either. For now, this includes the logs visible in the "
"application as well as the log generated by automatic update scripts."
msgstr ""
@@ -4814,70 +6826,81 @@ msgstr ""
#. type: Plain text
#: en/./users/05_Configuration.md:13
-msgid ""
-"Available languages are: cz, de, en, es, fr, he, it, ko, nl, oc, pt-br, ru, "
-"tr, zh-cn."
+msgid "Available languages are:"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:38
+#, no-wrap
+msgid ""
+"| Language (English name) | Language (Endonym) | Ordered by language code (ISO-639-1) |\n"
+"|:------------------------|:-----------------------|:-------------------------------------|\n"
+"| Czech | Čeština | cz |\n"
+"| German | Deutsch | de |\n"
+"| Greek | Ελληνικά | el |\n"
+"| English | English | en |\n"
+"| English (United States) | English (United States) | en-us |\n"
+"| Spanish | Español | es |\n"
+"| French | Français | fr |\n"
+"| Hebrew | עברית | he |\n"
+"| Indonesian | Bahasa Indonesia | id |\n"
+"| Italian | Italiano | it |\n"
+"| Japanease | 日本語 | ja |\n"
+"| Korean | 한국어 | ko |\n"
+"| Latvian | Latviešu | lv |\n"
+"| Dutch | Nederlands | nl |\n"
+"| Occitan | Occitan | oc |\n"
+"| Polish | Polski | pl |\n"
+"| Brazilian Portuguese | PortuguĂŞs (Brasil) | pt-br |\n"
+"| Russian | Đ ŃŃŃкий | ru |\n"
+"| Slovak | SlovenÄŤina | sk |\n"
+"| Turkish | Türkçe | tr |\n"
+"| Chinese (Simplified, People’s Republic of China) | 简体中文 | zh-cn |\n"
+"| Chinese (Traditional, Taiwan) | 正體中文 | zh-tw |\n"
msgstr ""
-"Les langues disponibles sont : cz, de, en, es, fr, he, it, ko, nl, oc, pt-"
-"br, ru, tr, zh-cn."
#. type: Title ##
-#: en/./users/05_Configuration.md:14
+#: en/./users/05_Configuration.md:39
#, no-wrap
msgid "Theme"
msgstr "Thème"
#. type: Plain text
-#: en/./users/05_Configuration.md:17
+#: en/./users/05_Configuration.md:42
+#, fuzzy
+#| msgid ""
+#| "There’s no accounting for tastes, which is why FreshRSS offers eight "
+#| "official themes:"
msgid ""
-"There’s no accounting for tastes, which is why FreshRSS offers eight "
-"official themes:"
+"There’s no accounting for tastes, which is why FreshRSS offers 13 official "
+"themes:"
msgstr ""
"Les goûts et les couleurs, ça ne se discute pas. C’est pourquoi FreshRSS "
"propose huit thèmes officiels :"
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Blue Lagoon* by **Mister aiR**"
-msgstr "*Blue Lagoon* par **Mister aiR**"
-
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Dark* by **AD**"
-msgstr "*Dark* par **AD**"
-
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Flat design* by **Marien Fressinaud**"
-msgstr "*Flat design* par **Marien Fressinaud**"
-
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Origine* by **Marien Fressinaud**"
-msgstr "*Origine* par **Marien Fressinaud**"
-
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Origine-compact* by **Kevin Papst**"
-msgstr "*Origine-compact* par **Kevin Papst**"
-
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Pafat* by **Plopoyop**"
-msgstr "*Pafat* par **Plopoyop**"
-
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Screwdriver* by **Mister aiR**"
-msgstr "*Screwdriver* par **Mister aiR**"
-
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Swage* by **Patrick Crandol**"
-msgstr "*Swage* par **Patrick Crandol**"
+#. type: Plain text
+#: en/./users/05_Configuration.md:58
+#, no-wrap
+msgid ""
+"| Theme | designed by | Notes |\n"
+"|:--------------|:-------------------------------------------------------|:--------------------------------------------------------------|\n"
+"| Alternative Dark | Ghost | |\n"
+"| Ansum | Thomas Guesnon | |\n"
+"| Blue Lagoon |Mister aiR | No longer supported. Will be removed with FreshRSS V1.22.0 |\n"
+"| Dark | AD | |\n"
+"| Dark pink | Miicat_47 | |\n"
+"| Flat design | Marien Fressinaud | |\n"
+"| Mapco | Thomas Guesnon | |\n"
+"| Nord theme | joelchrono12 | |\n"
+"| Origine | Marien Fressinaud | (default theme) |\n"
+"| Origine-compact | Kevin Papst | |\n"
+"| Pafat | Plopoyop | |\n"
+"| Screwdriver | Mister aiR | No longer supported. Will be removed with FreshRSS V1.22.0 |\n"
+"| Swage | Patrick Crandol | |\n"
+msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:28
+#: en/./users/05_Configuration.md:60
msgid ""
"If you can’t find any themes you like, it’s always possible to [create your "
"own](../developers/04_Frontend/02_Design.md)."
@@ -4886,7 +6909,7 @@ msgstr ""
"son propre thème](../developers/04_Frontend/02_Design.md)."
#. type: Plain text
-#: en/./users/05_Configuration.md:30
+#: en/./users/05_Configuration.md:62
msgid ""
"To select a theme, simply scroll through the themes and select one that "
"strikes your fancy. After confirmation, the theme will be applied to the "
@@ -4897,13 +6920,13 @@ msgstr ""
"l’interface."
#. type: Title ##
-#: en/./users/05_Configuration.md:31
+#: en/./users/05_Configuration.md:63
#, no-wrap
msgid "Content width"
msgstr "Largeur du contenu"
#. type: Plain text
-#: en/./users/05_Configuration.md:34
+#: en/./users/05_Configuration.md:66
msgid ""
"Some people prefer short lines of text, while others prefer to maximize the "
"available screen space. To satisfy the maximum number of people, it’s "
@@ -4915,40 +6938,40 @@ msgstr ""
"personne, il est possible de choisir la largeur du contenu affiché. Il y a "
"quatre réglages disponibles :"
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:39
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:71
msgid "**Fine** displays content up to a maximum width of 550 pixels"
msgstr "**Fine** qui affiche le contenu jusqu’à 550 pixels"
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:39
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:71
msgid "**Medium** displays content up to a maximum width of 800 pixels"
msgstr "**Moyenne** qui affiche le contenu jusqu’à 800 pixels"
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:39
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:71
msgid "**Large** displays content up to a maximum width of 1000 pixels"
msgstr "**Large** qui affiche le contenu jusqu’à 1000 pixels"
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:39
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:71
msgid "**No limit** displays the content on 100% of the available space"
msgstr ""
"**Pas de limite** qui affiche le contenu sur 100% de la place disponible"
#. type: Title ##
-#: en/./users/05_Configuration.md:40
+#: en/./users/05_Configuration.md:72
#, no-wrap
msgid "Article icons"
msgstr "Icônes d’article"
#. type: Plain text
-#: en/./users/05_Configuration.md:43
+#: en/./users/05_Configuration.md:75
msgid "Please note that this section only affects normal view."
msgstr "Veuillez noter que cette section n’affecte que la vue normale."
#. type: Plain text
-#: en/./users/05_Configuration.md:45
+#: en/./users/05_Configuration.md:77
msgid ""
"![Article icons configuration](../img/users/configuration.article.icons.png)"
msgstr ""
@@ -4956,7 +6979,7 @@ msgstr ""
"icons.png)"
#. type: Plain text
-#: en/./users/05_Configuration.md:48
+#: en/./users/05_Configuration.md:80
msgid ""
"Each article is rendered with a header (top line) and a footer (bottom "
"line). In that section, you can choose what will be displayed in those."
@@ -4966,7 +6989,7 @@ msgstr ""
"affiché dans ceux-ci."
#. type: Plain text
-#: en/./users/05_Configuration.md:52
+#: en/./users/05_Configuration.md:84
msgid ""
"If you disable every item in the top line, you’ll still be able to see it "
"since it contains the feed name and the article title. But if you do the "
@@ -4978,13 +7001,14 @@ msgstr ""
"sera vide."
#. type: Title ##
-#: en/./users/05_Configuration.md:53
-#, no-wrap
-msgid "HTML5 notification timout"
+#: en/./users/05_Configuration.md:85
+#, fuzzy, no-wrap
+#| msgid "HTML5 notification timout"
+msgid "HTML5 notification timeout"
msgstr "Temps d’affichage de la notification HTML5"
#. type: Plain text
-#: en/./users/05_Configuration.md:56
+#: en/./users/05_Configuration.md:88
msgid ""
"After automatically updating the feeds, FreshRSS can pop up a notification "
"using the HTML5 notification API."
@@ -4993,7 +7017,7 @@ msgstr ""
"notification de HTML5 pour avertir de l’arrivée de nouveaux articles."
#. type: Plain text
-#: en/./users/05_Configuration.md:58
+#: en/./users/05_Configuration.md:90
msgid ""
"The duration of this notification can be set. By default, the value is 0."
msgstr ""
@@ -5001,52 +7025,109 @@ msgstr ""
"défaut, la valeur est 0."
#. type: Title ##
-#: en/./users/05_Configuration.md:59
+#: en/./users/05_Configuration.md:91
#, no-wrap
msgid "Show the navigation button"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:62
+#: en/./users/05_Configuration.md:94
msgid ""
"By default, FreshRSS displays buttons to ease the article navigation when "
"browsing on mobile. The drawback is that they eat up some precious space."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:64
+#: en/./users/05_Configuration.md:96
msgid ""
"![navigation button configuration](../img/users/configuration.navigation."
"button.png)"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:66
+#: en/./users/05_Configuration.md:98
msgid ""
"If you don’t use those buttons because you never browse on mobile or because "
"you browse with gestures, you can disable them from the interface."
msgstr ""
#. type: Title #
-#: en/./users/05_Configuration.md:67
+#: en/./users/05_Configuration.md:99
#, no-wrap
msgid "Reading"
msgstr ""
#. type: Title ##
-#: en/./users/05_Configuration.md:71 en/./users/05_Configuration.md:154
+#: en/./users/05_Configuration.md:101
#, no-wrap
-msgid "Archival"
-msgstr "Archivage"
+msgid "Number of articles per page"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:104
+msgid ""
+"This setting defines the number of articles to display at once before "
+"needing to load more. In normal and reading view, more articles are loaded "
+"automatically. In global view, a button will appear at the bottom of the "
+"list."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:105
+#, fuzzy, no-wrap
+#| msgid "Article icons"
+msgid "Articles to display"
+msgstr "Icônes d’article"
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:108
+msgid ""
+"The status of articles to display when loading FreshRSS. \"Adjust showing\" "
+"will display only unread articles by default, but will display all articles "
+"when there are no unread articles to show."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:109
+#, no-wrap
+msgid "Use “lazy load” mode to load images"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:112
+msgid ""
+"This will set images to load as they are viewed. This can save data, but "
+"will can cause images to load in later."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:118
+msgid ""
+"These are the global options for fetching and retaining articles from feeds. "
+"They can be overridden by individual feed’s settings."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:119
+#, no-wrap
+msgid "Maintenance"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:122
+msgid ""
+"This allows for purging/optimizing the current user’s articles in the "
+"database."
+msgstr ""
#. type: Title #
-#: en/./users/05_Configuration.md:75
+#: en/./users/05_Configuration.md:123
#, no-wrap
msgid "Sharing"
msgstr "Partage"
#. type: Plain text
-#: en/./users/05_Configuration.md:78
+#: en/./users/05_Configuration.md:126
msgid ""
"To make your life easier, you can share articles straight from FreshRSS."
msgstr ""
@@ -5054,67 +7135,68 @@ msgstr ""
"via FreshRSS."
#. type: Plain text
-#: en/./users/05_Configuration.md:80
+#: en/./users/05_Configuration.md:128
msgid ""
-"At the moment, FreshRSS supports 18 sharing methods, ranging from self-"
-"hosted services (Shaarli, etc.) to proprietary services (Facebook, etc.)."
+"At the moment, FreshRSS supports [20+ sharing services](08_sharing_services."
+"md), ranging from self-hosted services (Shaarli, etc.) to proprietary "
+"services (Facebook, etc.)."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:83
+#: en/./users/05_Configuration.md:131
msgid ""
"By default, the sharing list is empty. ![Sharing configuration](../img/"
"users/configuration.sharing.png)"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:85
+#: en/./users/05_Configuration.md:133
msgid ""
"To add a new item to the list, please follow the following simple steps:"
msgstr ""
"Pour ajouter un nouvel élément à la liste, veuillez suivre les étapes "
"simples ci-dessous :"
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:90
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:138
msgid "Select the desired sharing method in the drop-down list."
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:90
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:138
msgid "Press the ```âśš``` button to add it to the list."
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:90
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:138
msgid ""
"Configure the method in the list. All names can be modified in the display. "
"Some methods need the sharing URL to be able to work properly (ex: Shaarli)."
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:90 en/./users/05_Configuration.md:95
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:138 en/./users/05_Configuration.md:143
msgid "Submit your changes."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:92
+#: en/./users/05_Configuration.md:140
msgid "To remove an item from the list, follow those simple steps:"
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:95
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:143
msgid "Press the ```❌``` button next to the share method you want to remove."
msgstr ""
#. type: Title #
-#: en/./users/05_Configuration.md:96
+#: en/./users/05_Configuration.md:145
#, no-wrap
msgid "Shortcuts"
msgstr "Raccourcis"
#. type: Plain text
-#: en/./users/05_Configuration.md:100
+#: en/./users/05_Configuration.md:149
msgid ""
"To ease the use of the application, FreshRSS comes with a lot of predefined "
"keyboard shortcuts. They allow actions to improve the user experience with "
@@ -5122,44 +7204,44 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:102
+#: en/./users/05_Configuration.md:151
msgid ""
"Of course, if you’re not satisfied with the key mapping, you can change you "
"configuration to fit your needs."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:104
+#: en/./users/05_Configuration.md:153
msgid "There are 4 types of shortcuts:"
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:109
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:158
msgid "Views: they allow switching views with ease."
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:109
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:158
msgid ""
"Navigation: they allow navigation through articles, feeds, and categories."
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:109
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:158
msgid ""
"Article actions: they allow interactions with an article, like sharing or "
"opening it on the original web-site."
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:109
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:158
msgid ""
"Other actions: they allow other interactions with the application, like "
"opening the user queries menu or accessing the documentation."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:112
+#: en/./users/05_Configuration.md:161
msgid ""
"It’s worth noting that the share article action has two levels. Once you "
"press the shortcut, a menu containing all the share options opens. To "
@@ -5168,12 +7250,12 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:114
+#: en/./users/05_Configuration.md:163
msgid "The same process applies to the user queries."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:117
+#: en/./users/05_Configuration.md:166
msgid ""
"Be aware that there is no validation on the selected shortcuts. This means "
"that if you assign a shortcut to more than one action, you’ll end up with "
@@ -5181,13 +7263,13 @@ msgid ""
msgstr ""
#. type: Title #
-#: en/./users/05_Configuration.md:118
+#: en/./users/05_Configuration.md:167
#, no-wrap
msgid "User queries"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:122
+#: en/./users/05_Configuration.md:171
msgid ""
"You can configure your [user queries](./03_Main_view.md) in that section. "
"There is not much to say here as it is pretty straightforward. You can only "
@@ -5195,55 +7277,76 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:124
+#: en/./users/05_Configuration.md:173
msgid "At the moment, there is no helper to build a user query from here."
msgstr ""
#. type: Title #
-#: en/./users/05_Configuration.md:125
+#: en/./users/05_Configuration.md:174
+#, no-wrap
+msgid "Profile"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:177
+msgid ""
+"You can change your email address or password here. The authentication token "
+"is required for accessing the aggregated RSS feed for a user. A blank token "
+"will disable accessing the RSS feed without being logged in."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:181
+msgid ""
+"Extensions can be managed from this menu. Note that while extensions can be "
+"removed from the web interface, they cannot be added from it."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:182
#, no-wrap
msgid "Users"
msgstr ""
#. type: Title ##
-#: en/./users/05_Configuration.md:129
+#: en/./users/05_Configuration.md:186
#, no-wrap
msgid "Authentication methods"
msgstr ""
#. type: Title ###
-#: en/./users/05_Configuration.md:131
+#: en/./users/05_Configuration.md:188
#, no-wrap
msgid "HTTP Authentication (Apache)"
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:137
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:194
msgid "User control is based on the `.htaccess` file."
msgstr ""
-#. type: Bullet: ' 2. '
-#: en/./users/05_Configuration.md:137
+#. type: Bullet: '2. '
+#: en/./users/05_Configuration.md:194
msgid ""
"It is best practice to place the `.htaccess` file in the `./i/` subdirectory "
"so the API and other third party services can work."
msgstr ""
-#. type: Bullet: ' 3. '
-#: en/./users/05_Configuration.md:137
+#. type: Bullet: '3. '
+#: en/./users/05_Configuration.md:194
msgid ""
"If you want to limit all access to registered users only, place the file in "
"the FreshRSS directory itself or in a parent directory. Note that WebSub and "
"API will not work!"
msgstr ""
-#. type: Bullet: ' 4. '
-#: en/./users/05_Configuration.md:137
+#. type: Bullet: '4. '
+#: en/./users/05_Configuration.md:194
msgid "Example `.htaccess` file for a user \"marie\":"
msgstr ""
-#. type: Plain text
-#: en/./users/05_Configuration.md:138
+#. type: Fenced code block (apache)
+#: en/./users/05_Configuration.md:195
#, no-wrap
msgid ""
"AuthUserFile /home/marie/repertoire/.htpasswd\n"
@@ -5254,7 +7357,7 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:147
+#: en/./users/05_Configuration.md:204
msgid ""
"More information can be found in the [Apache documentation](http://httpd."
"apache.org/docs/trunk/howto/auth.html#gettingitworking)."
@@ -5262,802 +7365,293 @@ msgstr ""
"Plus d’informations dans [la documentation d’Apache.](http://httpd.apache."
"org/docs/trunk/howto/auth.html#gettingitworking)"
-#. type: Title #
-#: en/./users/05_Configuration.md:148
-#, no-wrap
-msgid "Subscription management"
-msgstr "Gestion des flux"
-
-#. type: Title ##
-#: en/./users/05_Configuration.md:150
-#, no-wrap
-msgid "Information"
-msgstr "Informations"
-
-#. type: Title ##
-#: en/./users/05_Configuration.md:158
-#, no-wrap
-msgid "Login"
-msgstr "Identification"
-
-#. type: Title ##
-#: en/./users/05_Configuration.md:162
-#, no-wrap
-msgid "Advanced"
-msgstr "Avancé"
-
-#. type: Title ###
-#: en/./users/05_Configuration.md:164
-#, no-wrap
-msgid "Retrieve a truncated stream from within FreshRSS"
-msgstr "Récupérer un flux tronqué à partir de FreshRSS"
-
-#. type: Plain text
-#: en/./users/05_Configuration.md:167
-msgid ""
-"This question comes up regularly, so we will try to clarify how one can "
-"retrieve a truncated RSS feed with FreshRSS. Please note that the process is "
-"absolutely not user friendly, but it works. :)"
-msgstr ""
-"La question revient régulièrement, je vais essayer de clarifier ici comment "
-"on peut récupérer un flux RSS tronqué avec FreshRSS. Sachez avant tout que "
-"la manière de s’y prendre n’est absolument pas \"user friendly\", mais elle "
-"fonctionne. :)"
-
-#. type: Plain text
-#: en/./users/05_Configuration.md:169
-msgid ""
-"Please be aware that this way you’ll generate much more traffic to the "
-"originating sites, and they might block you accordingly. FreshRSS "
-"performance is also negatively affected, because you’ll have to fetch the "
-"full article content one by one. So it’s a feature to use sparingly!"
-msgstr ""
-"Sachez aussi que par cette manière vous générez beaucoup plus de trafic vers "
-"les sites d’origines et qu’ils peuvent vous bloquer par conséquent. Les "
-"performances de FreshRSS sont aussi moins bonnes car vous devez alors aller "
-"chercher le contenu des articles un par un. C’est donc une fonctionnalité à "
-"utiliser avec parcimonie !"
-
#. type: Plain text
-#: en/./users/05_Configuration.md:171
+#: en/./users/06_Mobile_access.md:2
+#, fuzzy
+#| msgid ""
+#| "This page assumes you have completed the [server setup](../"
+#| "admins/02_Installation.md)."
msgid ""
-"What’s meant by \"CSS path of articles on the original site\" actually "
-"corresponds to the \"path\" consisting of IDs and classes (which in HTML, "
-"matches the id and class attributes) to retrieve only the interesting part "
-"that corresponds to the article. Ideally, this path starts with an id (which "
-"is unique to the page)."
+"This page assumes you have completed the [server setup](../"
+"admins/03_Installation.md)."
msgstr ""
-"Ce que j’entends par \"Chemin CSS des articles sur le site d’origine\" "
-"correspond en fait au \"chemin\" constitué par les IDs et les classes (en "
-"html, correspond aux attributs id et class) pour récupérer uniquement la "
-"partie intéressante qui correspond à l’article. L’idéal est que ce chemin "
-"commence par un id (qui est unique pour la page)."
+"Cette page suppose que vous ayez fini [l’installation du serveur]"
+"(01_Installation.md)."
-#. type: Title ####
-#: en/./users/05_Configuration.md:172
+#. type: Title #
+#: en/./users/06_Mobile_access.md:3
#, no-wrap
-msgid "Example: Rue89"
-msgstr "Exemple : Rue89"
-
-#. type: Plain text
-#: en/./users/05_Configuration.md:175
-msgid ""
-"To find this path, you have to go to the address of one of the truncated "
-"articles (for example, http://www.rue89.com/2013/10/15/prof-maths-jai-"
-"atteint-lextase-dihn-pedagogie-inversee-246635). You look have to look for "
-"the \"block\" of HTML that corresponds to article content (in the source "
-"code!)."
+msgid "Mobile Access"
msgstr ""
-"Pour trouver ce chemin, il faut se rendre à l’adresse d’un des articles "
-"tronqués (par exemple http://www.rue89.com/2013/10/15/prof-maths-jai-atteint-"
-"lextase-dihn-pedagogie-inversee-246635). Il faut alors chercher le \"bloc\" "
-"HTML correspondant au contenu de l’article (dans le code source !)"
#. type: Plain text
-#: en/./users/05_Configuration.md:177
-#, no-wrap
-msgid "Here we find that the block that encompasses nothing but the content of the article is ```<div class=\"content clearfix\">```. We’ll only use the `.content` class here. Nevertheless, as said above, it’s best to start the path with an id. If we go back to the parent block, we find ```<div id=\"article\">``` and that’s perfect! The path will be ```#article .content```.\n"
-msgstr "On trouve ici que le bloc qui englobe uniquement le contenu de l’article est ```<div class=\"content clearfix\">```. On ne va garder que la classe `.content` ici. Néanmoins, comme je le disais plus haut, il est préférable de commencer le chemin avec un id. Si on remonte au bloc parent, il s’agit du bloc ```<div id=\"article\">``` et c’est parfait ! Le chemin sera donc ```#article .content```.\n"
-
-#. type: Title ####
-#: en/./users/05_Configuration.md:178
-#, no-wrap
-msgid "Add the corresponding classes to the article CSS path on the feed configuration page. Examples:"
-msgstr "Liste de correspondances site → chemin css"
-
-#. type: Bullet: '* '
-#: en/./users/05_Configuration.md:184
-msgid "Rue89: ```#article .content```"
-msgstr "Rue89 : ```#article .content```"
-
-#. type: Bullet: '* '
-#: en/./users/05_Configuration.md:184
-msgid "PCINpact: ```#actu_content```"
-msgstr "PCINpact : ```#actu_content```"
-
-#. type: Bullet: '* '
-#: en/./users/05_Configuration.md:184
-msgid "Lesnumériques: ```article#body div.text.clearfix```"
-msgstr "Lesnumériques : ```article#body div.text.clearfix```"
-
-#. type: Bullet: '* '
-#: en/./users/05_Configuration.md:184
-msgid "Phoronix: ```#main .content```"
-msgstr "Phoronix : ```#main .content```"
-
-#. type: Title ###
-#: en/./users/05_Configuration.md:185
-#, no-wrap
-msgid "Retrieve a truncated stream with external tools"
-msgstr "Récupérer un flux tronqué à l’aide d’outils externes"
-
-#. type: Plain text
-#: en/./users/05_Configuration.md:188
+#: en/./users/06_Mobile_access.md:6
msgid ""
-"Complimentary tools can be used to retrieve full article content, such as:"
+"You can access FreshRSS on mobile devices via browser and via mobile apps."
msgstr ""
-"Des outils complémentaires peuvent être utilisés pour récupérer le contenu "
-"complet d’un article, comme :"
-#. type: Bullet: '* '
-#: en/./users/05_Configuration.md:190
-msgid "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)"
-msgstr "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)"
-
-#. type: Bullet: '* '
-#: en/./users/05_Configuration.md:190
-msgid "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)"
-msgstr "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)"
-
-#. type: Title #
-#: en/./users/06_Fever_API.md:1
+#. type: Title ##
+#: en/./users/06_Mobile_access.md:8
#, no-wrap
-msgid "FreshRSS - Fever API implementation"
-msgstr "FreshRSS - API compatible Fever"
+msgid "Access via Browser"
+msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:5
+#: en/./users/06_Mobile_access.md:11
msgid ""
-"See the [page about our Google Reader compatible API](06_Mobile_access.md) "
-"for another possibility and general aspects of API access."
+"The FreshRSS user interface is optimized for both small and large screens. "
+"The content will fit nicely on small mobile device screens as well."
msgstr ""
-"Voir la page [sur notre API compatible Google Reader](06_Mobile_access.md) "
-"pour une autre possibilité et des généralités sur l’accès par API."
#. type: Title ##
-#: en/./users/06_Fever_API.md:6
+#: en/./users/06_Mobile_access.md:13
#, no-wrap
-msgid "RSS clients"
-msgstr "Clients compatibles"
-
-#. type: Plain text
-#: en/./users/06_Fever_API.md:11
-msgid ""
-"There are many RSS clients that support the Fever API, but they seem to "
-"understand the Fever API a bit differently. If your favourite client "
-"doesn’t work properly with this API, please create an issue and we will have a "
-"look. But we can **only** do that for free clients."
+msgid "Access via Mobile App"
msgstr ""
-"De nombreux clients RSS prennent en charge l’API Fever, mais ils semblent "
-"comprendre l’API Fever un peu différemment. Si votre client préféré ne "
-"fonctionne pas correctement avec cette API, veuiller créer un ticket et nous "
-"y jetterons un oeil. Mais nous ne pouvons le faire que pour les clients "
-"gratuits."
-
-#. type: Title ###
-#: en/./users/06_Fever_API.md:12
-#, no-wrap
-msgid "Usage & Authentication"
-msgstr "Utilisation et authentification"
#. type: Plain text
-#: en/./users/06_Fever_API.md:16
+#: en/./users/06_Mobile_access.md:16
msgid ""
-"Before you can start using this API, you have to enable and setup API "
-"access, which is [documented here](https://freshrss.github.io/FreshRSS/en/"
-"users/06_Mobile_access.html), and then reset the user’s API password."
+"FreshRSS supports access from mobile / native apps for Linux, Android, iOS, "
+"Windows and macOS, via two distinct APIs: Google Reader API (best), and "
+"Fever API (limited features and less efficient)."
msgstr ""
-"Avant de pouvoir commencer Ă  utiliser cette API, vvous devez activer et "
-"configurer l’accès à l’API, qui est [documenté ici](https://freshrss.github."
-"io/FreshRSS/en/users/06_Mobile_access.html), et réinitialisez ensuite le mot "
-"de passe API de l’utilisateur."
#. type: Plain text
-#: en/./users/06_Fever_API.md:18
+#: en/./users/06_Mobile_access.md:18
msgid ""
-"Then point your mobile application to the `fever.php` address (e.g. `https://"
-"freshrss.example.net/api/fever.php`)."
+"A list of known apps is available on the [FreshRSS GitHub page](https://"
+"github.com/FreshRSS/FreshRSS#apis--native-apps)."
msgstr ""
-"Connectez ensuite votre application mobile en utilisant l’adresse de l’API "
-"(e.g. `https://freshrss.example.net/api/fever.php`)."
-
-#. type: Title #
-#: en/./users/06_Fever_API.md:19 en/./users/06_Mobile_access.md:44
-#, no-wrap
-msgid "Compatible clients"
-msgstr "Clients compatibles"
-
-#. type: Plain text
-#: en/./users/06_Fever_API.md:22
-msgid "Tested with:"
-msgstr "Testé avec :"
-#. type: Plain text
-#: en/./users/06_Fever_API.md:25
+#. type: Title ###
+#: en/./users/06_Mobile_access.md:20
#, no-wrap
-msgid ""
-"* Android\n"
-" * [Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) (Closed source)\n"
-msgstr ""
-"* Android\n"
-" * [Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) (Propriétaire)\n"
+msgid "Enable the API in FreshRSS"
+msgstr "Activer l’API dans FreshRSS"
-#. type: Plain text
-#: en/./users/06_Fever_API.md:30
-#, no-wrap
+#. type: Bullet: '1. '
+#: en/./users/06_Mobile_access.md:26
msgid ""
-"* iOS\n"
-" * [Fiery Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) (Closed source)\n"
-" * [Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) (Commercial)\n"
-" * [Reeder](https://www.reederapp.com/) (Commercial) (Use its Google Reader API / native FreshRSS option when possible)\n"
+"Under the section “Authentication”, enable the option “Allow API access "
+"(required for mobile apps)”."
msgstr ""
-"* iOS\n"
-" * [Fiery Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) (Propriétaire)\n"
-" * [Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) (Commercial)\n"
-" * [Reeder](https://www.reederapp.com/) (Commercial) (Connectez-vous plutĂ´t par son option Google Reader API)\n"
+"Dans la section “Authentification”, cocher l’option “Autoriser l’accès par "
+"API (nécessaire pour les applis mobiles)”."
-#. type: Plain text
-#: en/./users/06_Fever_API.md:33
-#, no-wrap
+#. type: Bullet: '2. '
+#: en/./users/06_Mobile_access.md:26
+#, fuzzy
+#| msgid ""
+#| "Under the section “Authentication”, enable the option “Allow API access "
+#| "(required for mobile apps)”."
msgid ""
-"* MacOS\n"
-" * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial)\n"
+"Under the section “Profile”, fill-in the field “API password (e.g., for "
+"mobile apps)”."
msgstr ""
-"* MacOS\n"
-" * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial)\n"
-
-#. type: Title ##
-#: en/./users/06_Fever_API.md:35
-#, no-wrap
-msgid "Features"
-msgstr "Fonctionnalités"
-
-#. type: Plain text
-#: en/./users/06_Fever_API.md:38
-msgid "The following features are implemented:"
-msgstr "Les fonctionnalités suivantes sont implémentées :"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "fetching categories"
-msgstr "récupération des catégories"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "fetching feeds"
-msgstr "récupération des flux"
+"Dans la section “Authentification”, cocher l’option “Autoriser l’accès par "
+"API (nécessaire pour les applis mobiles)”."
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid ""
-"fetching RSS items (new, favorites, unread, by_id, by_feed, by_category, "
-"since)"
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:26
+msgid "Every user must define an API password."
msgstr ""
-"récupération des entrées (new, favorites, unread, by_id, by_feed, "
-"by_category,since)"
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "fetching favicons"
-msgstr "récupération des favicons"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "setting read marker for item(s)"
-msgstr "marquage des entrées comme lues"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "setting starred marker for item(s)"
-msgstr "marquage des entrées comme favoris"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "setting read marker for feed"
-msgstr "marquage d’un flux comme lu"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "setting read marker for category"
-msgstr "marquage d’une catégorie comme lue"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "supports FreshRSS extensions, which use the `entry_before_display` hook"
-msgstr "support des extensions grace au hook `entry_before_display`"
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:26
+#, fuzzy
+#| msgid ""
+#| "2. Under the section “Profile”, fill-in the field “API password (e.g., "
+#| "for mobile apps)”.\n"
+#| "\t* Every user must define an API password.\n"
+#| "\t* The reason for an API-specific password is that it may be used in "
+#| "less safe situations than the main password, and does not grant access to "
+#| "as many things.\n"
+msgid ""
+"The reason for an API-specific password is that it may be used in less safe "
+"situations than the main password, and does not grant access to as many "
+"things."
+msgstr ""
+"2. Dans la section “Profil”, remplir le champ “Mot de passe API (ex. : pour "
+"applis mobiles)”.\n"
+"\t* Chaque utilisateur doit choisir son mot de passe API.\n"
+"\t* La raison d’être d’un mot de passe API\n"
+" différent du mot de passe principal est que le mot de passe API est "
+"potentiellement utilisé de manière moins sûre, mais il permet aussi moins de "
+"choses.\n"
#. type: Plain text
-#: en/./users/06_Fever_API.md:50
-msgid "The following features are not supported:"
-msgstr "Les fonctionnalités suivantes ne sont pas implémentées :"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:52
+#: en/./users/06_Mobile_access.md:29
+#, fuzzy
+#| msgid ""
+#| "The rest of this page is about the Google Reader compatible API. See the "
+#| "[page about the Fever compatible API](06_Fever_API.md) for another "
+#| "possibility."
msgid ""
-"**Hot Links** aka **hot** as there is nothing in FreshRSS yet that is "
-"similar or could be used to simulate it."
+"See the [page about the Google Reader compatible API](../"
+"developers/06_GoogleReader_API.md) for more details. See the [page about "
+"the Fever compatible API](../developers/06_Fever_API.md) for more details."
msgstr ""
-"« Hot Links » car il n’y a encore rien dans FreshRSS qui soit similaire ou "
-"qui puisse être utilisé pour le simuler."
+"Le reste de cette page concerne l’API compatible Google Reader. Voir la "
+"[page sur l’API compatible Fever](06_Fever_API.md) pour une autre "
+"possibilité."
-#. type: Title ##
-#: en/./users/06_Fever_API.md:53
+#. type: Title ###
+#: en/./users/06_Mobile_access.md:31
#, no-wrap
-msgid "Testing and debugging"
-msgstr "Tester et déboguer"
+msgid "Testing"
+msgstr "Tester"
-#. type: Plain text
-#: en/./users/06_Fever_API.md:56
+#. type: Bullet: '1. '
+#: en/./users/06_Mobile_access.md:38
msgid ""
-"If this API doesn’t work as expected in your RSS reader, you can test it "
-"manually with a tool like [Postman](https://www.getpostman.com/)."
+"Under the section “Profile”, click on the link like `https://rss.example.net/"
+"api/` next to the field “API password”."
msgstr ""
-"Si l’API ne fonctionne pas comme attendu dans votre lecteur, il est possible "
-"de la tester manuellement avec un outil tel que [Postman](https://www."
-"getpostman.com/)."
+"Dans la section “Profil”, cliquer sur le lien de la forme `https://rss."
+"example.net/api/` à côté du champ “Mot de passe API”."
-#. type: Plain text
-#: en/./users/06_Fever_API.md:58
-msgid ""
-"Configure a POST request to the URL https://freshrss.example.net/api/fever."
-"php?api which should give you the result:"
+#. type: Bullet: '2. '
+#: en/./users/06_Mobile_access.md:38
+msgid "Click on first link “Check full server configuration”:"
msgstr ""
-"Envoyer une requête POST à l’adresse https://freshrss.example.net/api/fever."
-"php?api devrait vous renvoyer le résultat suivant :"
-#. type: Code fence info string
-#: en/./users/06_Fever_API.md:58 en/./users/06_Fever_API.md:80
-#, no-wrap
-msgid "json"
-msgstr "json"
-
-#. type: Plain text
-#: en/./users/06_Fever_API.md:58
-#, no-wrap
-msgid ""
-"{\n"
-"\t\"api_version\": 3,\n"
-"\t\"auth\": 0\n"
-"}\n"
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:38
+msgid "If you get *PASS* then you are done; all is well."
msgstr ""
-"{\n"
-"\t\"api_version\": 3,\n"
-"\t\"auth\": 0\n"
-"}\n"
-
-#. type: Plain text
-#: en/./users/06_Fever_API.md:65
-msgid "Great, the base setup seems to work!"
-msgstr "Super, la configuration de base fonctionne !"
-#. type: Plain text
-#: en/./users/06_Fever_API.md:68
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:38
msgid ""
-"Now lets try an authenticated call. Fever uses an `api_key`, which is the "
-"MD5 hash of `\"$username:$apiPassword\"`. Assuming the user is `kevin` and "
-"the password `freshrss`, here is a command-line example to compute the "
-"resulting `api_key`"
+"If you get *Bad Request!* or *Not Found*, then your server probably does not "
+"accept slashes `/` that are escaped `%2F`, see the next section \"Fix server "
+"configuration\"."
msgstr ""
-"Maintenant essayons de faire un appel authentifié. Fever utilise un "
-"paramètre `api_key` qui contient le résultat de la fonction de hachage MD5 "
-"de la valeur `\"$username:$apiPassword\"`. En considérant que l’utilisateur "
-"est `kevin` et que son mot de passe est `freshrss`, voici la commande Ă  "
-"lancer pour calculer la valeur du paramètre `api_key` :"
-
-#. type: Code fence info string
-#: en/./users/06_Fever_API.md:69 en/./users/06_Fever_API.md:75
-#: en/./users/06_Mobile_access.md:69
-#: en/./users/07_Frequently_Asked_Questions.md:37
-#: en/./users/07_Frequently_Asked_Questions.md:45
-#, no-wrap
-msgid "sh"
-msgstr "sh"
-#. type: Plain text
-#: en/./users/06_Fever_API.md:69
-#, no-wrap
-msgid "api_key=`echo -n \"kevin:freshrss\" | md5sum | cut -d' ' -f1`\n"
-msgstr "api_key=`echo -n \"kevin:freshrss\" | md5sum | cut -d' ' -f1`\n"
-
-#. type: Plain text
-#: en/./users/06_Fever_API.md:74
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:38
msgid ""
-"Add a body to your POST request encoded as `form-data` and one key named "
-"`api_key` with the value `your-password-hash`:"
+"If you receive any other error message, see the next section “Fix server "
+"configuration”."
msgstr ""
-"Ajoutez un contenu sous forme de `form-data`Ă  votre requĂŞte POST ainsi que "
-"le paramètre `api_key` contenant la valeur calculée à l’étape précédente :"
-#. type: Plain text
-#: en/./users/06_Fever_API.md:75
+#. type: Title ###
+#: en/./users/06_Mobile_access.md:39
#, no-wrap
-msgid "curl -s -F \"api_key=$api_key\" 'https://freshrss.example.net/api/fever.php?api'\n"
-msgstr "curl -s -F \"api_key=$api_key\" 'https://freshrss.exemple.net/api/fever.php?api'\n"
-
-#. type: Plain text
-#: en/./users/06_Fever_API.md:80
-msgid "This should give:"
-msgstr "Vous devriez obtenir le résultat suivant :"
+msgid "Fix server configuration"
+msgstr "Déboguer la configuration du serveur"
-#. type: Plain text
-#: en/./users/06_Fever_API.md:80
-#, no-wrap
+#. type: Bullet: '* '
+#: en/./users/06_Mobile_access.md:57
msgid ""
-"{\n"
-"\t\"api_version\": 3,\n"
-"\t\"auth\": 1,\n"
-"\t\"last_refreshed_on_time\": \"1520013061\"\n"
-"}\n"
+"Click on the second link “Check partial server configuration (without `%2F` "
+"support)”:"
msgstr ""
-"{\n"
-"\t\"api_version\": 3,\n"
-"\t\"auth\": 1,\n"
-"\t\"last_refreshed_on_time\": \"1520013061\"\n"
-"}\n"
-#. type: Plain text
-#: en/./users/06_Fever_API.md:88
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
msgid ""
-"Perfect, you’re now authenticated and you can start testing the more "
-"advanced features. To do so, change the URL and append the possible API "
-"actions to your request parameters. Please refer to the [original Fever "
-"documentation](https://feedafever.com/api) for more information."
+"If you get `PASS`, then the problem is indeed that your server does not "
+"accept slashes `/` that are escaped `%2F`."
msgstr ""
-"Parfait, maintenant vous êtes autentifié et vous pouvez commencer à tester "
-"les fonctions avancées. Pour cela, il suffit de changer l’adresse en lui "
-"ajoutant les paramètres nécessaires à la réalisation des actions supportées. "
-"Pour plus d’information, veuillez vous référer à la [documentation "
-"officielle de Fever](https://feedafever.com/api)."
-
-#. type: Plain text
-#: en/./users/06_Fever_API.md:90
-msgid "Some basic calls are:"
-msgstr "Voici quelques exemples simples d’appels réalisables :"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&items"
-msgstr "https://freshrss.example.net/api/fever.php?api&items"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&feeds"
-msgstr "https://freshrss.example.net/api/fever.php?api&feeds"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&groups"
-msgstr "https://freshrss.example.net/api/fever.php?api&groups"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&unread_item_ids"
-msgstr "https://freshrss.example.net/api/fever.php?api&unread_item_ids"
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&saved_item_ids"
-msgstr "https://freshrss.example.net/api/fever.php?api&saved_item_ids"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&items&since_id=some_id"
-msgstr "https://freshrss.example.net/api/fever.php?api&items&since_id=some_id"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&items&max_id=some_id"
-msgstr "https://freshrss.example.net/api/fever.php?api&items&max_id=some_id"
-
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
msgid ""
-"https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id"
+"With Apache, remember the directive [`AllowEncodedSlashes On`](http://httpd."
+"apache.org/docs/trunk/mod/core.html#allowencodedslashes)"
msgstr ""
-"https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id"
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
msgid ""
-"https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id"
+"Or use a client that does not escape slashes (such as EasyRSS) ([`check "
+"client list`](https://github.com/FreshRSS/FreshRSS#apis--native-apps))."
msgstr ""
-"https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id"
-#. type: Plain text
-#: en/./users/06_Fever_API.md:102
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
msgid ""
-"Replace `some_id` with a real ID from your `freshrss_username_entry` "
-"database."
+"If you get *Service Unavailable!*, then check the preceding section “Enable "
+"the API in FreshRSS” again."
msgstr ""
-"Remplacez `some_id` par un identifiant réel de votre base de données "
-"`freshrss_username_entry`."
-#. type: Title ###
-#: en/./users/06_Fever_API.md:103
-#, no-wrap
-msgid "Debugging"
-msgstr "Déboguer"
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+msgid "With __Apache__:"
+msgstr ""
-#. type: Plain text
-#: en/./users/06_Fever_API.md:106
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
msgid ""
-"If nothing helps and your client is still misbehaving, you can add the "
-"following lines to the beginning of the `fever.api` file to determine the "
-"cause of the problems:"
+"If you get *FAIL getallheaders!*, the combination of your PHP version and "
+"your Web server does not provide access to [`getallheaders`](http://php.net/"
+"getallheaders)"
msgstr ""
-"Si rien ne fonctionne correctement et que votre client se comporte "
-"étrangement, vous pouvez ajouter les quelques lignes suivantes au début du "
-"fichier `fever.api` pour déterminer la cause des problèmes rencontrés :"
-#. type: Plain text
-#: en/./users/06_Fever_API.md:107
-#, no-wrap
-msgid "file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' . json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);\n"
-msgstr "file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' . json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);\n"
-
-#. type: Plain text
-#: en/./users/06_Fever_API.md:112
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
msgid ""
-"Then use your RSS client to query the API and afterwards check the file "
-"`fever.log`."
+"Turn on Apache `mod_setenvif` (often enabled by default), or `mod_rewrite` "
+"with the following procedure:"
msgstr ""
-"Utilisez ensuite votre client RSS pour interroger l’API et vérifier le "
-"fichier `fever.log`."
-
-#. type: Title ##
-#: en/./users/06_Fever_API.md:113
-#, no-wrap
-msgid "Credits"
-msgstr "Remerciements"
-#. type: Plain text
-#: en/./users/06_Fever_API.md:115
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
msgid ""
-"This plugin was inspired by the [tinytinyrss-fever-plugin](https://github."
-"com/dasmurphy/tinytinyrss-fever-plugin)."
+"Allow [`FileInfo` in `.htaccess`](http://httpd.apache.org/docs/trunk/mod/"
+"core.html#allowoverride): see the [server setup](../admins/03_Installation."
+"md) again."
msgstr ""
-"Ce plugin a été inspiré par le [tinytinyrss-fever-plugin](https://github.com/"
-"dasmurphy/tinytinyrss-fever-plugin)."
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:2
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
msgid ""
-"This page assumes you have completed the [server setup](../"
-"admins/02_Installation.md)."
+"Enable [`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite."
+"html):"
msgstr ""
-"Cette page suppose que vous ayez fini [l’installation du serveur]"
-"(01_Installation.md)."
-#. type: Title #
-#: en/./users/06_Mobile_access.md:3
-#, no-wrap
-msgid "Enable the API in FreshRSS"
-msgstr "Activer l’API dans FreshRSS"
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+msgid "With Debian / Ubuntu: `sudo a2enmod rewrite`"
+msgstr ""
-#. type: Bullet: '1. '
-#: en/./users/06_Mobile_access.md:9
-msgid ""
-"Under the section “Authentication”, enable the option “Allow API access "
-"(required for mobile apps)”."
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+msgid "With __nginx__:"
msgstr ""
-"Dans la section “Authentification”, cocher l’option “Autoriser l’accès par "
-"API (nécessaire pour les applis mobiles)”."
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:9
-#, no-wrap
-msgid ""
-"2. Under the section “Profile”, fill-in the field “API password (e.g., for mobile apps)”.\n"
-"\t* Every user must define an API password.\n"
-"\t* The reason for an API-specific password is that it may be used in less safe situations than the main password, and does not grant access to as many things.\n"
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+msgid "If you get *Bad Request!*, check your server `PATH_INFO` configuration."
msgstr ""
-"2. Dans la section “Profil”, remplir le champ “Mot de passe API (ex. : pour applis mobiles)”.\n"
-"\t* Chaque utilisateur doit choisir son mot de passe API.\n"
-"\t* La raison d’être d’un mot de passe API\n"
-" différent du mot de passe principal est que le mot de passe API est potentiellement utilisé de manière moins sûre, mais il permet aussi moins de choses.\n"
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:12
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
msgid ""
-"The rest of this page is about the Google Reader compatible API. See the "
-"[page about the Fever compatible API](06_Fever_API.md) for another "
-"possibility."
+"If you get *File not found!*, check your server `fastcgi_split_path_info`."
msgstr ""
-"Le reste de cette page concerne l’API compatible Google Reader. Voir la "
-"[page sur l’API compatible Fever](06_Fever_API.md) pour une autre "
-"possibilité."
-#. type: Title #
-#: en/./users/06_Mobile_access.md:14
-#, no-wrap
-msgid "Testing"
-msgstr "Tester"
-
-#. type: Bullet: '3. '
-#: en/./users/06_Mobile_access.md:21
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
msgid ""
-"Under the section “Profile”, click on the link like `https://rss.example.net/"
-"api/` next to the field “API password”."
+"If you get *FAIL 64-bit or GMP extension!*, then your PHP version does not "
+"pass the requirement of being 64-bit and/or have PHP [GMP](http://php.net/"
+"gmp) extension."
msgstr ""
-"Dans la section “Profil”, cliquer sur le lien de la forme `https://rss."
-"example.net/api/` à côté du champ “Mot de passe API”."
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:21
-#, no-wrap
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
msgid ""
-"4. Click on first link “Check full server configuration”:\n"
-"\t* If you get *PASS* then you are done, all is good: you may proceed to step 6.\n"
-"\t* If you get *Bad Request!* or *Not Found*, then your server probably does not accept slashes `/` that are escaped `%2F`. Proceed to step 5.\n"
-"\t* If you get any other error message, proceed to step 5.\n"
+"The easiest is to add the GMP extension. On Debian / Ubuntu: `sudo apt "
+"install php-gmp`"
msgstr ""
-"4. Cliquer sur le premier lien “Check full server configuration”:\n"
-"\t* Si vous obtenez `PASS`, tout est bon : passer à l’étape 6.\n"
-"\t* Si vous obtenez *Bad Request!* ou *Not Found*, alors votre serveur ne semble pas accepter les slashs `/` qui sont encodés `%2F`. Passer à l’étape 5.\n"
-"\t* Si vous obtenez un autre message d’erreur, passer à l’étape 5.\n"
-
-#. type: Title #
-#: en/./users/06_Mobile_access.md:23
-#, no-wrap
-msgid "Fix server configuration"
-msgstr "Déboguer la configuration du serveur"
-
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:42
-#, no-wrap
-msgid ""
-"5. Click on the second link “Check partial server configuration (without `%2F` support)”:\n"
-"\t* If you get `PASS`, then the problem is indeed that your server does not accept slashes `/` that are escaped `%2F`.\n"
-"\t\t* With Apache, remember the directive [`AllowEncodedSlashes On`](http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes)\n"
-"\t\t* Or use a client that does not escape slashes (such as EasyRSS), in which case proceed to step 6.\n"
-"\t* If you get *Service Unavailable!*, then check from step 1 again.\n"
-"\t* With __Apache__:\n"
-"\t\t* If you get *FAIL getallheaders!*, the combination of your PHP version and your Web server does not provide access to [`getallheaders`](http://php.net/getallheaders)\n"
-"\t\t\t* Turn on Apache `mod_setenvif` (often enabled by default), or `mod_rewrite` with the following procedure:\n"
-"\t\t\t\t* Allow [`FileInfo` in `.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride): see the [server setup](../admins/02_Installation.md) again.\n"
-"\t\t\t\t* Enable [`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html):\n"
-"\t\t\t\t\t* With Debian / Ubuntu: `sudo a2enmod rewrite`\n"
-"\t* With __nginx__:\n"
-"\t\t* If you get *Bad Request!*, check your server `PATH_INFO` configuration.\n"
-"\t\t* If you get *File not found!*, check your server `fastcgi_split_path_info`.\n"
-"\t* If you get *FAIL 64-bit or GMP extension!*, then your PHP version does not pass the requirement of being 64-bit and/or have PHP [GMP](http://php.net/gmp) extension.\n"
-"\t\t* The easiest is to add the GMP extension. On Debian / Ubuntu: `sudo apt install php-gmp`\n"
-"\t* Update and try again from step 3.\n"
-msgstr ""
-"5. Cliquer sur le second lien “Check partial server configuration (without `%2F` support)”:\n"
-"\t* Si vous obtenez `PASS`, alors le problème est bien que votre serveur n’accepte pas les slashs `/` qui sont encodés `%2F`.\n"
-"\t\t* Avec Apache, vérifiez la directive [`AllowEncodedSlashes On`](http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes)\n"
-"\t\t* Ou utilisez un client qui n’encode pas les slashs (comme EasyRSS), auquel cas passer à l’étape 6.\n"
-"\t* Si vous obtenez *Service Unavailable!*, retourner à l’étape 6.\n"
-"\t* Avec __Apache__:\n"
-"\t\t* Si vous obtenez *FAIL getallheaders!*, alors la combinaison de votre version de PHP et de votre serveur Web ne permet pas l’accès à [`getallheaders`](http://php.net/getallheaders)\n"
-"\t\t\t* Activer Apache `mod_setenvif` (souvent activé par défault), ou `mod_rewrite` avec la procédure suivante :\n"
-"\t\t\t\t* Autoriser [`FileInfo` dans `.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride) : revoir [l’installation du serveur](01_Installation.md).\n"
-"\t\t\t\t* Activer [`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html) :\n"
-"\t\t\t\t\t* Sur Debian / Ubuntu : `sudo a2enmod rewrite`\n"
-"\t* Avec __nginx__:\n"
-"\t\t* Si vous obtenez *Bad Request!*, vérifier la configuration `PATH_INFO` de votre serveur.\n"
-"\t\t* Si vous obtenez *File not found!*, vérifier la configuration `fastcgi_split_path_info` de votre serveur.\n"
-"\t* Si vous obtenez *FAIL 64-bit or GMP extension!*, alors votre installation PHP soit n’est pas en 64 bit, soit n’a pas l’extension PHP [GMP](http://php.net/gmp) activée.\n"
-"\t\t* Le plus simple est d’activer l’extension GMP. Sur Debian / Ubuntu : `sudo apt install php-gmp`\n"
-"\t* Mettre à jour et retourner à l’étape 3.\n"
-
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:48
-#, no-wrap
-msgid ""
-"6. On the same FreshRSS API page, note the address given under “Your API address”, like `https://freshrss.example.net/api/greader.php`\n"
-"\t* Type the API address in a client, together with your FreshRSS username, and the corresponding special API password.\n"
-msgstr ""
-"6. Sur la même page de l’API FreshRSS, notez l’adresse donnée sous \"Votre adresse API\", comme `https://freshrss.example.net/api/greader.php`\n"
-"\t* Saisissez l’adresse de l’API dans le client sélectionné puis votre nom d’utilisateur et votre mot de passe spécialement créé pour l’API.\n"
-
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:63
-#, no-wrap
-msgid ""
-"7. Pick a client supporting a Google Reader-like API. Selection:\n"
-"\t* Android\n"
-"\t\t* [News+](https://github.com/noinnion/newsplus/blob/master/apk/NewsPlus_202.apk) with [News+ Google Reader extension](https://github.com/noinnion/newsplus/tree/master/extensions/GoogleReaderCloneExtension) (Closed source)\n"
-"\t\t* [FeedMe 3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) (Closed source)\n"
-"\t\t* [EasyRSS](https://github.com/Alkarex/EasyRSS) (Open source, [F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/))\n"
-"\t* Linux\n"
-"\t\t* [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Open source)\n"
-"\t* MacOS\n"
-"\t\t* [Vienna RSS](http://www.vienna-rss.com/) (Open source)\n"
-"\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
-"\t* iOS\n"
-"\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
-"\t* Firefox\n"
-"\t\t* [FreshRSS-Notify](https://addons.mozilla.org/firefox/addon/freshrss-notify-webextension/) (Open source)\n"
-msgstr ""
-"7. Vous pouvez maintenant tester sur une application mobile:\n"
-"\t* Android\n"
-"\t\t* [News+](https://github.com/noinnion/newsplus/blob/master/apk/NewsPlus_202.apk) avec [News+ Google Reader extension](https://github.com/noinnion/newsplus/tree/master/extensions/GoogleReaderCloneExtension) (Closed source)\n"
-"\t\t* [FeedMe 3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) (Propriétaire)\n"
-"\t\t* [EasyRSS](https://github.com/Alkarex/EasyRSS) (Libre, [F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/))\n"
-"\t* Linux\n"
-"\t\t* [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Libre)\n"
-"\t* MacOS\n"
-"\t\t* [Vienna RSS](http://www.vienna-rss.com/) (Libre)\n"
-"\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
-"\t* iOS\n"
-"\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
-"\t* Firefox\n"
-"\t\t* [FreshRSS-Notify](https://addons.mozilla.org/firefox/addon/freshrss-notify-webextension/) (Libre)\n"
-
-#. type: Title #
-#: en/./users/06_Mobile_access.md:65
-#, no-wrap
-msgid "Google Reader compatible API"
-msgstr "API compatible Google Reader"
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:68
-msgid "Examples of basic queries:"
-msgstr "Exemples de requĂŞtes simples :"
-
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:69
-#, no-wrap
-msgid ""
-"# Initial login, using API password (Email and Passwd can be given either as GET, or POST - better)\n"
-"curl 'https://freshrss.example.net/api/greader.php/accounts/ClientLogin?Email=alice&Passwd=Abcdef123456'\n"
-"SID=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
-"Auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
-"\n"
-"# Examples of read-only requests\n"
-"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" 'https://freshrss.example.net/api/greader.php/reader/api/0/subscription/list?output=json'\n"
-"\n"
-"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" 'https://freshrss.example.net/api/greader.php/reader/api/0/unread-count?output=json'\n"
-"\n"
-"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" 'https://freshrss.example.net/api/greader.php/reader/api/0/tag/list?output=json'\n"
-"\n"
-"# Retrieve a token for requests making modifications\n"
-"curl -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" 'https://freshrss.example.net/api/greader.php/reader/api/0/token'\n"
-"8e6845e089457af25303abc6f53356eb60bdb5f8ZZZZZZZZZZZZZZZZZ\n"
-"\n"
-"# Get articles, piped to jq for easier JSON reading\n"
-"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" 'https://freshrss.example.net/api/greader.php/reader/api/0/stream/contents/reading-list' | jq .\n"
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+msgid "Update and try again from the preceding section “Testing”."
msgstr ""
-"# Authentification utilisant le mot de passe API (Email et Passwd peuvent être passés en GET, ou POST - mieux)\n"
-"curl 'https://freshrss.example.net/api/greader.php/accounts/ClientLogin?Email=alice&Passwd=Abcdef123456'\n"
-"SID=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
-"Auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
-"\n"
-"# Exemples de requĂŞtes en lecture\n"
-"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" 'https://freshrss.example.net/api/greader.php/reader/api/0/subscription/list?output=json'\n"
-"\n"
-"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" 'https://freshrss.example.net/api/greader.php/reader/api/0/unread-count?output=json'\n"
-"\n"
-"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" 'https://freshrss.example.net/api/greader.php/reader/api/0/tag/list?output=json'\n"
-"\n"
-"# Demande de jeton pour faire de requĂŞtes de modification\n"
-"curl -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" 'https://freshrss.example.net/api/greader.php/reader/api/0/token'\n"
-"8e6845e089457af25303abc6f53356eb60bdb5f8ZZZZZZZZZZZZZZZZZ\n"
-"\n"
-"# Récupère les articles, envoyés à jq pour une lecture JSON plus facile\n"
-"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" 'https://freshrss.example.net/api/greader.php/reader/api/0/stream/contents/reading-list' | jq .\n"
#. type: Plain text
#: en/./users/07_Frequently_Asked_Questions.md:2
@@ -6143,13 +7737,20 @@ msgstr ""
"p```."
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:17
-msgid ""
-"As explained in the [security section](/en/User_documentation/Installation/"
-"Security), it’s highly recommended to make only the public section available "
-"at the domain level. With that configuration, `./p` is the root folder for "
-"http://demo.freshrss.org/, thus making `robots.txt` available at the root of "
-"the application."
+#: en/./users/07_Frequently_Asked_Questions.md:18
+#, fuzzy
+#| msgid ""
+#| "As explained in the [security section](/en/User_documentation/"
+#| "Installation/Security), it’s highly recommended to make only the public "
+#| "section available at the domain level. With that configuration, `./p` is "
+#| "the root folder for http://demo.freshrss.org/, thus making `robots.txt` "
+#| "available at the root of the application."
+msgid ""
+"As explained in the [security section](../admins/09_AccessControl.html), "
+"it’s highly recommended to make only the public section available at the "
+"domain level. With that configuration, `./p` is the root folder for "
+"<https://demo.freshrss.org/>, thus making `robots.txt` available at the root "
+"of the application."
msgstr ""
"Comme expliqué dans les [conseils de sécurité](01_Installation.md#conseils-"
"de-securite), il est recommandé de faire pointer un nom de domaine vers ce "
@@ -6159,20 +7760,20 @@ msgstr ""
"site : https://demo.freshrss.org/robots.txt."
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:19
+#: en/./users/07_Frequently_Asked_Questions.md:20
msgid "The same principle applies to `favicon.ico` and `.htaccess`."
msgstr ""
"L’explication est la même pour les fichiers ```favicon.ico``` et ```."
"htaccess```."
#. type: Title ##
-#: en/./users/07_Frequently_Asked_Questions.md:20
+#: en/./users/07_Frequently_Asked_Questions.md:21
#, no-wrap
msgid "Why do I have errors while registering a feed?"
msgstr "Pourquoi j’ai des erreurs quand j’essaye d’enregistrer un flux ?"
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:26
+#: en/./users/07_Frequently_Asked_Questions.md:27
msgid ""
"There can be different origins for that problem. The feed syntax can be "
"invalid, it can be unrecognized by the SimplePie library, the hosting server "
@@ -6186,7 +7787,7 @@ msgstr ""
"étapes à suivre pour la déterminer :"
#. type: Bullet: '1. '
-#: en/./users/07_Frequently_Asked_Questions.md:30
+#: en/./users/07_Frequently_Asked_Questions.md:31
msgid ""
"__Verify if the feed syntax is valid__ with the [W3C on-line tool](https://"
"validator.w3.org/feed/ \"RSS and Atom feed validator\"). If it’s not valid, "
@@ -6197,7 +7798,7 @@ msgstr ""
"ne fonctionne pas, nous ne pouvons rien faire."
#. type: Bullet: '1. '
-#: en/./users/07_Frequently_Asked_Questions.md:30
+#: en/./users/07_Frequently_Asked_Questions.md:31
msgid ""
"__Verify SimplePie validation__ with the [SimplePie on-line tool](https://"
"simplepie.org/demo/ \"SimplePie official demo\"). If it’s not recognized, "
@@ -6208,7 +7809,7 @@ msgstr ""
"ça ne fonctionne pas, nous ne pouvons rien faire."
#. type: Bullet: '1. '
-#: en/./users/07_Frequently_Asked_Questions.md:30
+#: en/./users/07_Frequently_Asked_Questions.md:31
msgid ""
"__Verify FreshRSS integration__ with the [demo](https://demo.freshrss.org "
"\"FreshRSS official demo\"). If it’s not working, you need to [create an "
@@ -6224,13 +7825,13 @@ msgstr ""
"l’hébergement."
#. type: Title ##
-#: en/./users/07_Frequently_Asked_Questions.md:31
+#: en/./users/07_Frequently_Asked_Questions.md:32
#, no-wrap
msgid "How can you change a forgotten password?"
msgstr "Comment changer un mot de passe oublié ?"
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:35
+#: en/./users/07_Frequently_Asked_Questions.md:36
msgid ""
"Since the [1.10.0](https://github.com/FreshRSS/FreshRSS/releases/tag/1.10.0) "
"release, admins can change user passwords directly from the interface. This "
@@ -6244,7 +7845,7 @@ msgstr ""
"l’utilisateur, de saisir un mot de passe et de valider."
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:37
+#: en/./users/07_Frequently_Asked_Questions.md:38
msgid ""
"Since the [1.8.0](https://github.com/FreshRSS/FreshRSS/releases/tag/1.8.0) "
"release, admins can change user passwords using a terminal. It worth "
@@ -6257,8 +7858,8 @@ msgstr ""
"PHP en ligne de commande. Pour cela, il suffit d’ouvrir son terminal et de "
"saisir la commande suivante :"
-#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:37
+#. type: Fenced code block (sh)
+#: en/./users/07_Frequently_Asked_Questions.md:39
#, no-wrap
msgid "./cli/update_user.php --user <username> --password <password>\n"
msgstr ""
@@ -6266,27 +7867,39 @@ msgstr ""
"\n"
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:41
+#: en/./users/07_Frequently_Asked_Questions.md:44
+#, fuzzy
+#| msgid ""
+#| "For more information on that matter, please refer to the [dedicated "
+#| "documentation](../../cli/README.md)."
msgid ""
"For more information on that matter, please refer to the [dedicated "
-"documentation](../../cli/README.md)."
+"documentation](https://github.com/FreshRSS/FreshRSS/blob/edge/cli/README.md)."
msgstr ""
"Pour plus d’information à ce sujet, il existe la [documentation dédiée]"
"(../../cli/README.md)."
#. type: Title ##
-#: en/./users/07_Frequently_Asked_Questions.md:42
+#: en/./users/07_Frequently_Asked_Questions.md:45
#, no-wrap
msgid "Permissions under SELinux"
msgstr "Gérer les permissions sous SELinux"
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:45
+#: en/./users/07_Frequently_Asked_Questions.md:48
+#, fuzzy
+#| msgid ""
+#| "Some Linux distribution, like Fedora or RedHat Enterprise Linux, have "
+#| "SELinux enabled. This acts similar to a firewall application, so that "
+#| "applications can’t write or modify files under certain conditions. While "
+#| "installing FreshRSS, step 2 can fail if the httpd process cannot write to "
+#| "some data sub-directories. The following command should be executed as "
+#| "root to fix this problem:"
msgid ""
"Some Linux distribution, like Fedora or RedHat Enterprise Linux, have "
"SELinux enabled. This acts similar to a firewall application, so that "
"applications can’t write or modify files under certain conditions. While "
-"installing FreshRSS, step 2 can fail if the httpd process cannot write to "
+"installing FreshRSS, step 2 can fail if the httpd process can’t write to "
"some data sub-directories. The following command should be executed as root "
"to fix this problem:"
msgstr ""
@@ -6296,8 +7909,8 @@ msgstr ""
"l’étape 2 procède à la vérification des droits sur certains répertoires, il "
"faut donc exécuter la commande suivante en tant que root:"
-#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:45
+#. type: Fenced code block (sh)
+#: en/./users/07_Frequently_Asked_Questions.md:49
#, no-wrap
msgid ""
"semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/FreshRSS/data(/.*)?'\n"
@@ -6307,13 +7920,13 @@ msgstr ""
"restorecon -Rv /usr/share/FreshRSS/data\n"
#. type: Title ##
-#: en/./users/07_Frequently_Asked_Questions.md:50
+#: en/./users/07_Frequently_Asked_Questions.md:54
#, no-wrap
msgid "Why do I have a blank page while trying to configure the sharing options?"
msgstr "Pourquoi y a-t-il une page blanche lorsque je configure les options de partage ?"
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:53
+#: en/./users/07_Frequently_Asked_Questions.md:57
msgid ""
"The `sharing` word in the URL is a trigger word for some ad-blocker rules. "
"Starting with version 1.16, `sharing` has been replaced by `integration` in "
@@ -6326,7 +7939,7 @@ msgstr ""
"exactement la même dénomination à travers l’application."
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:55
+#: en/./users/07_Frequently_Asked_Questions.md:59
msgid ""
"If you are using a version prior to 1.16, you can disable your ad-blocker "
"for FreshRSS or you can add a rule to allow the `sharing` page to be "
@@ -6337,12 +7950,12 @@ msgstr ""
"permettre la consultation de la page de configuration « partage »."
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:57
+#: en/./users/07_Frequently_Asked_Questions.md:61
msgid "Examples with _uBlock_:"
msgstr "Exemples avec _uBlock_ :"
-#. type: Bullet: '- '
-#: en/./users/07_Frequently_Asked_Questions.md:59
+#. type: Bullet: '* '
+#: en/./users/07_Frequently_Asked_Questions.md:64
msgid ""
"Whitelist your FreshRSS instance by adding it in _uBlock > Open the "
"dashboard > Whitelist_."
@@ -6350,8 +7963,8 @@ msgstr ""
"Ajoutez votre instance FreshRSS à la liste blanche de en l’ajoutant dans "
"_uBlock > Ouvrir le tableau de bord > Liste blanche_."
-#. type: Bullet: '- '
-#: en/./users/07_Frequently_Asked_Questions.md:59
+#. type: Bullet: '* '
+#: en/./users/07_Frequently_Asked_Questions.md:64
msgid ""
"Authorize your FreshRSS instance to call `sharing` configuration page by "
"adding the rule `*sharing,domain=~yourdomain.com` in _uBlock > Open the "
@@ -6361,6 +7974,1616 @@ msgstr ""
"`sharing` en ajoutant la règle `*sharing,domain=~votredomaine.com` dans "
"_uBlock > Ouvrir le fichier tableau de bord > Mes filtres_"
+#. type: Title ##
+#: en/./users/07_Frequently_Asked_Questions.md:65
+#, no-wrap
+msgid "Problems with firewalls"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:68
+msgid ""
+"If you have the error \"Blast! This feed has encountered a problem. Please "
+"verify that it is always reachable then update it.\", it might be because of "
+"a firewall misconfiguration."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:70
+msgid "To identify the problem, here are the steps to follow:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/07_Frequently_Asked_Questions.md:73
+msgid ""
+"step 1: Try to reach the feed locally to discard a problem with the feed "
+"itself. You can use your browser to this purpose."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/07_Frequently_Asked_Questions.md:73
+msgid ""
+"step 2: Try to reach the feed from the host in which FreshRSS is installed. "
+"Something like `time curl -v 'https://github.com/FreshRSS/FreshRSS/commits/"
+"edge.atom'` should make the deal. If you are running FreshRSS within a "
+"Docker container, then you can check connectivity from within the container "
+"itself with something similar to `sudo docker exec freshrss php -r "
+"\"readfile('https://github.com/FreshRSS/FreshRSS/commits/edge.atom');\"`. If "
+"none of this works, then it might be a problem with your firewall."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:75
+msgid ""
+"Then to fix it, you need to do check your firewall configuration and ensure "
+"that you are not blocking connections to IPs and/or ports in which your "
+"feeds are located. If using iptables and you are blocking inbound "
+"connections to ports 80/443, check that the rules are properly configured "
+"and you are not also blocking outbound connections to the very same ports."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:76
+msgid ""
+"For example, when using the firewall provided by Synology, you can block "
+"traffic for certain applications (i.e., ports). One could think that these "
+"rules would be applied only to incoming connections but specifying * for the "
+"originating host of the requests will also include your local networks. To "
+"deal with this issue, you will have to add exceptions for your local "
+"networks to be able to access those ports with a higher priority than the "
+"one blocking incoming connections. This could be similar for other frontends "
+"to iptables. Please check the following discussion about a [similar issue]"
+"(https://www.reddit.com/r/synology/comments/8fo2sj/"
+"ds918_firewall_blocking_outgoing_traffic_from/)."
+msgstr ""
+
+#. type: Title #
+#: en/./users/08_sharing_services.md:1
+#, fuzzy, no-wrap
+#| msgid "Sharing"
+msgid "Sharing Services"
+msgstr "Partage"
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:4
+msgid "FreshRSS has the option to share links with a bunch of services."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/08_sharing_services.md:5
+#, no-wrap
+msgid "Available Services: Simple Sharing"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:12
+#, no-wrap
+msgid ""
+"| Service | Short description | Notes |\n"
+"|:--------------|:-------------------------------------------------------|:--------------------------------------------------------------|\n"
+"| Clipboard | Copy article link into the operation system clipboard | |\n"
+"| Email | Open the email app to send the article link | |\n"
+"| Print | Open browser’s print dialog to print out the article | |\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/08_sharing_services.md:13
+#, no-wrap
+msgid "Available Services: Hosted Services"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:39
+#, no-wrap
+msgid ""
+"| Service | Short description | Links | Notes |\n"
+"|:------------------|:-----------------------------------------------------|:-------------------------------------------------|:--------------------------------------------------------------|\n"
+"| Blogotext | A little more than a lightweight SQLite Blog-Engine. | [GitHub](https://github.com/BlogoText/blogotext) | Deprecated since FreshRSS V1.20.0 (2022). Will be deleted in 2023 (scheduled to FreshRSS V1.22.0) |\n"
+"| Buffer | Buffer.com is a social media management platform for scheduling, publishing, and analyzing content. | [Website](https://buffer.com) ||\n"
+"| Diaspora* | The online social world where you are in control | [Website](https://diasporafoundation.org/), [Wikipedia](https://en.wikipedia.org/wiki/Diaspora_(social_network)) | |\n"
+"| Facebook | Worldwide social network (by Meta Platforms) | [Website](https://facebook.com), [Wikipedia](https://en.wikipedia.org/wiki/Facebook)\n"
+"| GNU social | Social communication software for both public and private communications | [Website](https://gnu.io/social/) | |\n"
+"| Journal du hacker | Le Journal du hacker s'inspire directement du site anglophone Hacker News | [Website](https://www.journalduhacker.net/) |\n"
+"| Known based sites | Its robust open source framework can be used to build fully-fledged community sites, or a blog for a single user. | [Website](https://withknown.com/) | |\n"
+"| Lemmy | Selfhosted social link aggregation and discussion platform | [Website](https://join-lemmy.org/) | |\n"
+"| Linkding | Selfhosted bookmark service | [Website](https://github.com/sissbruecker/linkding) | |\n"
+"| LinkedIn | Business and employment-oriented online service | [Website](https://www.linkedin.com/), [Wikipedia](https://en.wikipedia.org/wiki/LinkedIn)| |\n"
+"| Mastodon | Self-hosted social networking & microblogging services | [Website](https://joinmastodon.org/), [Wikipedia](https://en.wikipedia.org/wiki/Mastodon_(software)) | |\n"
+"| Movim | A powerful web frontend for XMPP | [Website](https://movim.eu/) | |\n"
+"| Pinboard | Social Bookmarking for Introverts | [Website](https://pinboard.in/) | |\n"
+"| Pinterest | Is an image sharing and social media service designed to enable saving and discovery of information| [Website](https://pinterest.com/), [Wikipedia](https://en.wikipedia.org/wiki/Pinterest) | |\n"
+"| Pocket | Social bookmarking (previous \"Read it Later\", owned by Mozilla) | [Website](https://getpocket.com), [Wikipedia](https://en.wikipedia.org/wiki/Pocket_(service)) | |\n"
+"| Raindrop.io | All-in-one bookmark manager | [Website](https://raindrop.io/)| |\n"
+"| Reddit | A network of communities where people can dive into their interests, hobbies and passions| [Website](https://www.reddit.com/), [Wikipedia](https://en.wikipedia.org/wiki/Reddit)| |\n"
+"| Shaarli | Self-hosted minimalist bookmark manager and link sharing service | [Website](https://shaarli.readthedocs.io/) | |\n"
+"| Twitter | Microblogging social network | [Website](https://twitter.com), [Wikipedia](https://de.wikipedia.org/wiki/Twitter) | |\n"
+"| wallabag | Save and classify articles. Read them later. Freely | [Website](https://www.wallabag.org) | Compatible to version 1 and 2\n"
+"| Whatsapp | Instant messaging and voice-over-IP service owned by Meta Platforms| [Website](https://www.whatsapp.com), [Wikipedia](https://en.wikipedia.org/wiki/WhatsApp) | |\n"
+"| XING | Career-oriented social networking site, operated by New Work SE | [Website](https://www.xing.com/), [Wikipedia](https://en.wikipedia.org/wiki/XING) | |\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/08_sharing_services.md:40
+#, fuzzy, no-wrap
+#| msgid "Configuration management"
+msgid "Configuration"
+msgstr "Gestion de la configuration"
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:43
+msgid ""
+"Select the needed sharing services in the configuration menu "
+"(Configuration / Sharing)."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/08_sharing_services.md:44
+#, no-wrap
+msgid "Usage"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:47
+msgid ""
+"Activate the sharing menu in configuration menu (Configuration / Display). "
+"It is only available for the bottom line."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:49
+msgid ""
+"The menu with the selected services is available in the footer of article."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/08_sharing_services.md:50
+#, no-wrap
+msgid "Add More Sharing Services"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:52
+#, fuzzy
+#| msgid ""
+#| "Search for it on [the bug tracker](https://github.com/FreshRSS/FreshRSS/"
+#| "issues) (don’t forget to use the search bar)."
+msgid ""
+"Please open a new issue on [GitHub](https://github.com/FreshRSS/FreshRSS/"
+"issues) and support us with information."
+msgstr ""
+"Cherche sur [le bug tracker](https://github.com/FreshRSS/FreshRSS/issues) "
+"(n’oubliez pas d’utiliser la barre de recherche)."
+
+#. type: Title #
+#: en/./users/09_refreshing_feeds.md:1
+#, no-wrap
+msgid "Refreshing feeds"
+msgstr "Rafraîchir les flux"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:4
+#, fuzzy
+#| msgid ""
+#| "To take full advantage of FreshRSS, it needs to retrieve new items from "
+#| "the feeds you have subscribed to. There are several ways to do this."
+msgid ""
+"To take full advantage of FreshRSS, it needs to retrieve new items from the "
+"feeds you have subscribed to. There are several ways to do this:"
+msgstr ""
+"Pour profiter pleinement de FreshRSS, il faut qu’il récupère les nouveaux "
+"articles disponibles des flux auxquels vous avez souscrit. Pour cela, il "
+"existe plusieurs méthodes."
+
+#. type: Bullet: '- '
+#: en/./users/09_refreshing_feeds.md:17
+msgid "[Manual update](#manual-update)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+#, fuzzy
+#| msgid "Complete update"
+msgid "[Complete update](#complete-update)"
+msgstr "Mise à jour complète"
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+msgid "[Partial update](#partial-update)"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./users/09_refreshing_feeds.md:17
+msgid "[Automatic update with cron](#automatic-update-with-cron)"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./users/09_refreshing_feeds.md:17
+msgid "[Online cron](#online-cron)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+msgid "[For Form Authentication](#for-form-authentication)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+msgid "[For HTTP authentication](#for-http-authentication)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+msgid "[For No authentication None](#for-no-authentication-none)"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./users/09_refreshing_feeds.md:17
+msgid ""
+"[Feed configuration of “Do not automatically refresh more often than”](#feed-"
+"configuration-of-do-not-automatically-refresh-more-often-than)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+msgid "[Background](#background)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+msgid "[Default value](#default-value)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+msgid "[Individual feed configuration](#individual-feed-configuration)"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/09_refreshing_feeds.md:18
+#, no-wrap
+msgid "Manual update"
+msgstr "Mise Ă  jour manuelle"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:21
+msgid ""
+"If you can’t or don’t want to use the automatic method, you can update "
+"manually. There are two methods for updating all or some of the feeds."
+msgstr ""
+"Si vous ne pouvez pas ou ne voulez pas utiliser la méthode automatique, vous "
+"pouvez le faire de façon manuelle. Il existe deux méthodes qui permettent de "
+"mettre Ă  jour tout ou partie des flux."
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:22
+#, no-wrap
+msgid "Complete update"
+msgstr "Mise à jour complète"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:25
+msgid ""
+"This update occurs on all feeds. To trigger it, simply click on the update "
+"link in the navigation menu."
+msgstr ""
+"Cette mise à jour se fait pour l’ensemble des flux de l’instance. Pour "
+"initier cette mise Ă  jour, il suffit de cliquer sur le lien de mise Ă  jour "
+"disponible dans le menu de navigation."
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:27
+msgid "![Navigation menu](../img/users/refresh.1.png)"
+msgstr "![Menu de navigation](../img/users/refresh.1.png)"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:29
+msgid ""
+"When the update starts, a progress bar appears and changes while feeds are "
+"processed."
+msgstr ""
+"Lorsque la mise à jour démarre, une barre de progression apparait et "
+"s’actualise au fur et à mesure de la récupération des articles."
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:31
+msgid "![Progress bar](../img/users/refresh.5.png)"
+msgstr "![Barre de progression](../img/users/refresh.5.png)"
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:32
+#, no-wrap
+msgid "Partial update"
+msgstr "Mise Ă  jour partielle"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:35
+msgid ""
+"This update occurs on the selected feed only. To trigger it, simply click on "
+"the update link in the feed menu."
+msgstr ""
+"Cette mise à jour se fait pour le flux sélectionné uniquement. Pour initier "
+"cette mise Ă  jour, il suffit de cliquer sur le lien de mise Ă  jour "
+"disponible dans le menu du flux."
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:37
+msgid "![Feed menu](../img/users/refresh.2.png)"
+msgstr "![Menu du flux](../img/users/refresh.2.png)"
+
+#. type: Title ##
+#: en/./users/09_refreshing_feeds.md:38
+#, fuzzy, no-wrap
+#| msgid "Automatic update"
+msgid "Automatic update with cron"
+msgstr "Mise Ă  jour automatique"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:41
+msgid "This is the recommended method."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:43
+msgid ""
+"This method is only available if you have access to the scheduled tasks of "
+"the machine on which your FreshRSS instance is installed."
+msgstr ""
+"Cette méthode n’est possible que si vous avez accès aux tâches planifiées de "
+"la machine sur laquelle est installée votre instance de FreshRSS."
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:45
+msgid ""
+"The script is named *actualize_script.php* and is located in the *app* "
+"folder. The scheduled task syntax will not be explained here. However, here "
+"is [a quick introduction to crontab](http://www.adminschoice.com/crontab-"
+"quick-reference/) that might help you."
+msgstr ""
+"Le script qui permet de mettre à jour les articles s’appelle "
+"*actualize_script.php* et se trouve dans le répertoire *app* de votre "
+"instance de FreshRSS. La syntaxe des tâches planifiées ne sera pas expliqué "
+"ici, cependant voici [une introduction rapide Ă  crontab](http://www."
+"adminschoice.com/crontab-quick-reference/) qui peut vous aider."
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:47
+msgid "Here is an example to trigger article update every hour."
+msgstr ""
+"Ci-dessous vous trouverez un exemple permettant la mise Ă  jour des articles "
+"toutes les heures."
+
+#. type: Fenced code block (cron)
+#: en/./users/09_refreshing_feeds.md:48
+#, no-wrap
+msgid "0 * * * * php /path/to/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log 2>&1\n"
+msgstr "0 * * * * php /chemin/vers/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log 2>&1\n"
+
+#. type: Title ##
+#: en/./users/09_refreshing_feeds.md:52
+#, no-wrap
+msgid "Online cron"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:55
+msgid ""
+"If you do not have access to the installation server scheduled task, you can "
+"still automate the update process."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:58
+msgid ""
+"To do so, you need to create a scheduled task, which need to call a specific "
+"URL: <https://freshrss.example.net/i/?c=feed&a=actualize> (it could be "
+"different depending on your installation). Depending on your application "
+"authentication method, you need to adapt the scheduled task."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:60
+msgid ""
+"Special parameters to configure the script - all parameters can be combined:"
+msgstr ""
+"« Paramètres de configuration du script; Ils sont utilisables "
+"simultanément : »"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:64
+msgid ""
+"- Parameter \"force\" <https://freshrss.example.net/i/?"
+"c=feed&a=actualize&force=1> If *force* is set to 1 all feeds will be "
+"refreshed at once."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:68
+msgid ""
+"- Parameter \"ajax\" <https://freshrss.example.net/i/?"
+"c=feed&a=actualize&ajax=1> Only a status site is returned and not a complete "
+"website. Example: \"OK\""
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:72
+msgid ""
+"- Parameter \"maxFeeds\" <https://freshrss.example.net/i/?"
+"c=feed&a=actualize&maxFeeds=30> If *maxFeeds* is set the configured amount "
+"of feeds is refreshed at once. The default setting is \"10\"."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:76
+msgid ""
+"- Parameter \"token\" <https://freshrss.example.net/i/?"
+"c=feed&a=actualize&token=542345872345734> Security parameter to prevent "
+"unauthorized refreshes. For detailed Documentation see \"Form "
+"authentication\"."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:77
+#, fuzzy, no-wrap
+#| msgid "Form authentication"
+msgid "For Form Authentication"
+msgstr "Authentification par formulaire"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:80
+#, fuzzy
+#| msgid ""
+#| "You can also configure an authentication token to grant special access on "
+#| "the server."
+msgid ""
+"If your FreshRSS instance is using Form Authentication, you can configure an "
+"authentication token to grant access to the online cron."
+msgstr ""
+"Vous pouvez aussi configurer un jeton d’authentification pour accorder un "
+"droit spécial sur votre serveur."
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:82
+msgid "![Token configuration](../img/users/token.1.png)"
+msgstr "![Configuration du token](../img/users/token.1.png)"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:84
+msgid ""
+"You can target a specific user by adding their username to the query string, "
+"with `&user=insert-username`:"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:86
+msgid "The scheduled task syntax should look as follows:"
+msgstr "La tâche cron à utiliser sera de la forme suivante :"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:88
+#, fuzzy
+#| msgid ""
+#| "0 * * * * curl 'https://freshrss.example.net/i/?"
+#| "c=feed&a=actualize&user=someone&token=my-token'\n"
+msgid ""
+"<https://freshrss.example.net/i/?"
+"c=feed&a=actualize&maxFeeds=10&ajax=1&user=someone&token=my-token>"
+msgstr ""
+"0 * * * * curl 'https://freshrss.exemple.net/i/?"
+"c=feed&a=actualize&user=quelquun&token=mon-token'\n"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:90
+#, fuzzy
+#| msgid ""
+#| "If you configure the application to allow anonymous reading, you can also "
+#| "allow anonymous users to update feeds (“Allow anonymous refresh of the "
+#| "articles”)."
+msgid ""
+"Alternatively, but not recommended, if you configure the application to "
+"allow anonymous reading, you can also allow anonymous users to update feeds "
+"(“Allow anonymous refresh of the articles”), and that does not require a "
+"token."
+msgstr ""
+"Dans ces cas-là, si vous avez autorisé la lecture anonyme des articles, vous "
+"pouvez aussi permettre à n’importe qui de rafraîchir vos flux (« Autoriser "
+"le rafraîchissement anonyme des flux »)."
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:92
+msgid "![Anonymous access configuration](../img/users/anonymous_access.1.png)"
+msgstr ""
+"![Configuration de l’accès anonymes](../img/users/anonymous_access.1.png)"
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:93
+#, fuzzy, no-wrap
+#| msgid "HTTP authentication"
+msgid "For HTTP authentication"
+msgstr "Authentification HTTP"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:96
+msgid ""
+"If your FreshRSS instance is using HTTP authentication, you’ll need to "
+"provide your credentials to the scheduled task."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:98
+#, no-wrap
+msgid "**Note:** This method is discouraged as your credentials are stored in plain text.\n"
+msgstr ""
+
+#. type: Fenced code block (cron)
+#: en/./users/09_refreshing_feeds.md:99
+#, fuzzy, no-wrap
+#| msgid "0 * * * * curl -u alice:password123 'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
+msgid "0 * * * * curl -u alice:password123 'https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=10&ajax=1&user=alice'\n"
+msgstr "0 * * * * curl -u alice:motdepasse123 'https://freshrss.exemple.net/i/?c=feed&a=actualize'\n"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:104
+msgid "On some systems, that syntax might also work:"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:106
+#, fuzzy
+#| msgid ""
+#| "0 * * * * curl -u alice:password123 'https://freshrss.example.net/i/?"
+#| "c=feed&a=actualize'\n"
+msgid ""
+"<https://alice:password123@freshrss.example.net/i/?"
+"c=feed&a=actualize&maxFeeds=10&ajax=1&user=alice>"
+msgstr ""
+"0 * * * * curl -u alice:motdepasse123 'https://freshrss.exemple.net/i/?"
+"c=feed&a=actualize'\n"
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:107
+#, fuzzy, no-wrap
+#| msgid "Form authentication"
+msgid "For No authentication (None)"
+msgstr "Authentification par formulaire"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:110
+msgid ""
+"If your FreshRSS instance uses no authentication (public instance, default "
+"user):"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:112
+#, fuzzy
+#| msgid ""
+#| "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
+msgid "<https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=10&ajax=1>"
+msgstr "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
+
+#. type: Title ##
+#: en/./users/09_refreshing_feeds.md:113
+#, no-wrap
+msgid "Feed configuration of “Do not automatically refresh more often than”"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:115
+#, no-wrap
+msgid "Background"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:118
+msgid ""
+"FreshRSS does not, by design, supports pull refreshes at frequencies higher "
+"than once every 15 minutes. But FreshRSS supports instant push (WebSub)."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:120
+msgid ""
+"FreshRSS is part of an RSS ecosystem. A typical reaction that we have seen "
+"from several servers is to simply ban by, IP, user-agent, or to remove their "
+"RSS feed altogether. Bad user behaviours affect the larger community."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:121
+#, no-wrap
+msgid "Default value"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:124
+#, no-wrap
+msgid "The default value of “Do not automatically refresh more often than” is set in Configuration -> Archiving.\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:126
+msgid ""
+"The lowest global/default purposely cannot be set faster than every 20 "
+"minutes, to avoid wasting resources and make sure the RSS ecosystem remains "
+"sane."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:127
+#, fuzzy, no-wrap
+#| msgid "Fix server configuration"
+msgid "Individual feed configuration"
+msgstr "Déboguer la configuration du serveur"
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:130
+msgid "Under the settings for individual feeds, you can go down to 15min."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:134
+msgid ""
+"Read more: - [Normal, Global and Reader view](./03_Main_view.md) - [Filter "
+"the feeds and search](./10_filter.md)"
+msgstr ""
+
+#. type: Title #
+#: en/./users/10_filter.md:2
+#, no-wrap
+msgid "Filtering articles"
+msgstr "Filtrer les articles"
+
+#. type: Title ##
+#: en/./users/10_filter.md:4
+#, no-wrap
+msgid "Purpose"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:7
+msgid ""
+"When the number of articles stored by FreshRSS inevitably grows larger, it’s "
+"important to use efficient filters to display only a subset of the articles. "
+"There are several methods that filter with different criteria. Usually those "
+"methods can be combined."
+msgstr ""
+"Avec le nombre croissant d’articles stockés par FreshRSS, il devient "
+"important d’avoir des filtres efficaces pour n’afficher qu’une partie des "
+"articles. Il existe plusieurs méthodes qui filtrent selon des critères "
+"différents. Ces méthodes peuvent être combinées dans la plus part des cas."
+
+#. type: Title ##
+#: en/./users/10_filter.md:8
+#, no-wrap
+msgid "By category"
+msgstr "Par catégorie"
+
+#. type: Plain text
+#: en/./users/10_filter.md:11
+msgid ""
+"This is the easiest method. You only need to click on the category title in "
+"the side panel. There are two special categories at the top of the panel:"
+msgstr ""
+"C’est la méthode la plus simple. Il suffit de cliquer sur le titre d’une "
+"catégorie dans le panneau latéral. Il existe deux catégories spéciales qui "
+"sont placées en haut dudit panneau :"
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:14
+msgid ""
+"*Main feed* displays only articles from feeds marked as available in that "
+"category"
+msgstr ""
+"*Flux principal* qui affiche uniquement les articles des flux marqués comme "
+"visible dans cette catégorie"
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:14
+msgid "*Favourites* displays only articles marked as favourites"
+msgstr ""
+"*Favoris* qui affiche uniquement les articles, tous flux confondus, marqués "
+"comme favoris"
+
+#. type: Title ##
+#: en/./users/10_filter.md:15
+#, no-wrap
+msgid "By feed"
+msgstr "Par flux"
+
+#. type: Plain text
+#: en/./users/10_filter.md:18
+msgid "There are several methods to filter articles by feed:"
+msgstr "Il existe plusieurs méthodes pour filtrer les articles par flux :"
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:23
+msgid "by clicking the feed title in the side panel"
+msgstr "en cliquant sur le titre du flux dans le panneau latéral"
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:23
+msgid "by clicking the feed title in the article details"
+msgstr "en cliquant sur le titre du flux dans le détail de l’article"
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:23
+msgid "by filtering in the feed options from the side panel"
+msgstr "en filtrant dans les options du flux dans le panneau latéral"
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:23
+msgid "by filtering in the feed configuration"
+msgstr "en filtrant dans la configuration du flux"
+
+#. type: Plain text
+#: en/./users/10_filter.md:25
+msgid "![Feed filter](../img/users/feed.filter.1.png)"
+msgstr "![Filtrer par flux](../img/users/feed.filter.1.png)"
+
+#. type: Title ##
+#: en/./users/10_filter.md:26
+#, no-wrap
+msgid "By status"
+msgstr "Par statut"
+
+#. type: Plain text
+#: en/./users/10_filter.md:29
+msgid ""
+"Each article has two attributes that can be combined. The first attribute "
+"indicates whether or not the article has been read. The second attribute "
+"indicates if the article was marked as favorite or not."
+msgstr ""
+"Chaque article possède deux attributs qui peuvent être combinés. Le premier "
+"attribut indique si l’article a été lu ou non. Le second attribut indique si "
+"l’article a été noté comme favori ou non."
+
+#. type: Plain text
+#: en/./users/10_filter.md:31
+msgid ""
+"In version 0.7, attribute filters are available in the article display "
+"dropdown list. With this version, it’s not possible to combine filters. For "
+"instance, it’s not possible to display only read and favorite articles."
+msgstr ""
+"Dans la version 0.7.x, les filtres sur les attributs sont accessibles depuis "
+"la liste déroulante qui gère l’affichage des articles. Dans cette version, "
+"il n’est pas possible de combiner les filtres. Par exemple, on ne peut pas "
+"afficher les articles lus qui ont été notés comme favori."
+
+#. type: Plain text
+#: en/./users/10_filter.md:33
+msgid "![Attribute filters in 0.7](../img/users/status.filter.0.7.png)"
+msgstr ""
+"![Filtrer par attribut en version 0.7](../img/users/status.filter.0.7.png)"
+
+#. type: Plain text
+#: en/./users/10_filter.md:35
+msgid ""
+"Starting with version 0.8, all attribute filters are visible as toggle "
+"icons. They can be combined. As any combination is possible, some have the "
+"same result. For instance, the result for all filters selected is the same "
+"as no filter selected."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:37
+msgid "![Attribute filters in 0.8](../img/users/status.filter.0.8.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:39
+msgid "By default, this filter displays only unread articles"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/10_filter.md:40
+#, no-wrap
+msgid "By content"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:43
+msgid ""
+"It is possible to filter articles by their content by inputting a string in "
+"the search field."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/10_filter.md:44
+#, no-wrap
+msgid "With the search field"
+msgstr "Grâce au champ de recherche"
+
+#. type: Plain text
+#: en/./users/10_filter.md:47
+msgid "You can use the search field to further refine results:"
+msgstr ""
+"Il est possible d’utiliser le champ de recherche pour raffiner les "
+"résultats :"
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid "by feed ID: `f:123` or multiple feed IDs (*or*): `f:123,234,345`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid "by author: `author:name` or `author:'composed name'`"
+msgstr "par auteur : `author:nom` or `author:'nom composé'`"
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid "by title: `intitle:keyword` or `intitle:'composed keyword'`"
+msgstr "par titre : `intitle:mot` or `intitle:'mot composé'`"
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid "by URL: `inurl:keyword` or `inurl:'composed keyword'`"
+msgstr "par URL: `inurl:mot` or `inurl:'mot composé'`"
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid "by tag: `#tag` or `#tag+with+whitespace`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid "by free-text: `keyword` or `'composed keyword'`"
+msgstr "par texte libre : `mot` or `'mot composé'`"
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid ""
+"by date of discovery, using the [ISO 8601 time interval format](http://en."
+"wikipedia.org/wiki/ISO_8601#Time_intervals): `date:<date-interval>`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "From a specific day, or month, or year:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014-03-30`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014-03` or `date:201403`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "From a specific time of a given day:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014-05-30T13`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014-05-30T13:30`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "Between two given dates:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014-02/2014-04`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014-02--2014-04`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014-02/04`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014-02-03/05`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014-02-03T22:00/22:15`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014-02-03T22:00/15`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "After a given date:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014-03/`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "Before a given date:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:/2014-03`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "For a specific duration after a given date:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:2014-03/P1W`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "For a specific duration before a given date:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:P1W/2014-05-25T23:59:59`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "For the past duration before now (the trailing slash is optional):"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:P1Y/` or `date:P1Y` (past year)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:P2M/` (past two months)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:P3W/` (past three weeks)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:P4D/` (past four days)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:PT5H/` (past five hours)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:PT30M/` (past thirty minutes)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:PT90S/` (past ninety seconds)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid "`date:P1DT1H/` (past one day and one hour)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid ""
+"by date of publication, using the same format: `pubdate:<date-interval>`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid ""
+"by custom label ID `L:12` or multiple label IDs: `L:12,13,14` or with any "
+"label: `L:*`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid ""
+"by custom label name `label:label`, `label:\"my label\"` or any label name "
+"from a list (*or*): `labels:\"my label,my other label\"`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid ""
+"by several label names (*and*): `label:\"my label\" label:\"my other label\"`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid ""
+"by entry (article) ID: `e:1639310674957894` or multiple entry IDs (*or*): "
+"`e:1639310674957894,1639310674957893`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+msgid ""
+"by user query (saved search) name: `search:myQuery`, `search:\"My query\"` "
+"or saved search ID: `S:3`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+msgid ""
+"internally, those references are replaced by the corresponding user query in "
+"the search expression"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:95
+msgid ""
+"Be careful not to enter a space between the operator and the search value."
+msgstr ""
+"Attention à ne pas introduire d’espace entre l’opérateur et la valeur "
+"recherchée."
+
+#. type: Plain text
+#: en/./users/10_filter.md:98
+#, fuzzy
+#| msgid ""
+#| "Some operators can be used negatively, to exclude articles, with the same "
+#| "syntax as above, but prefixed by a `!` or `-`: `-author:name`, `-intitle:"
+#| "keyword`, `-inurl:keyword`, `-#tag`, `!keyword`."
+msgid ""
+"Some operators can be used negatively, to exclude articles, with the same "
+"syntax as above, but prefixed by a `!` or `-`: `!f:234`, `-author:name`, `-"
+"intitle:keyword`, `-inurl:keyword`, `-#tag`, `!keyword`, `!date:2019`, `!"
+"date:P1W`, `!pubdate:P3d/`."
+msgstr ""
+"Certains opérateurs peuvent être utilisé négativement, pour exclure des "
+"articles, avec la même syntaxe que ci-dessus, mais préfixé par `!` ou `-` :`-"
+"author:nom`, `-intitle:mot`, `-inurl:mot`, `-#tag`, `!mot`."
+
+#. type: Plain text
+#: en/./users/10_filter.md:101
+#, fuzzy
+#| msgid ""
+#| "It is also possible to combine keywords to create a more precise filter. "
+#| "For example, you can enter multiple instances of `author:`, `intitle:`, "
+#| "`inurl:`, `#`, and free-text."
+msgid ""
+"It is also possible to combine keywords to create a more precise filter. "
+"For example, you can enter multiple instances of `f:`, `author:`, `intitle:"
+"`, `inurl:`, `#`, and free-text."
+msgstr ""
+"Il est également possible de combiner les mots-clefs pour faire un filtrage "
+"encore plus précis, et il est autorisé d’avoir plusieurs instances de : "
+"`author:`, `intitle:`, `inurl:`, `#`, et texte libre."
+
+#. type: Plain text
+#: en/./users/10_filter.md:104
+msgid ""
+"Combining several search criteria implies a logical *and*, but the keyword ` "
+"OR ` can be used to combine several search criteria with a logical *or* "
+"instead: `author:Dupont OR author:Dupond`"
+msgstr ""
+"Combiner plusieurs critères implique un *et* logique, mais le mot clef ` OR "
+"` peut être utiliser pour combiner plusieurs critères avec un *ou* logique :"
+"`author:Dupont OR author:Dupond`"
+
+#. type: Plain text
+#: en/./users/10_filter.md:107
+msgid ""
+"You don’t have to do anything special to combine multiple negative "
+"operators. Writing `!intitle:'thing1' !intitle:'thing2'` implies AND, see "
+"above. For more pointers on how AND and OR interact with negation, see [this "
+"GitHub comment](https://github.com/FreshRSS/FreshRSS/"
+"issues/3236#issuecomment-891219460). Additional reading: [De Morgan’s laws]"
+"(https://en.wikipedia.org/wiki/De_Morgan%27s_laws)."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:109
+msgid ""
+"Finally, parentheses may be used to express more complex queries, with basic "
+"negation support:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:115
+msgid "`(author:Alice OR intitle:hello) (author:Bob OR intitle:world)`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:115
+msgid "`(author:Alice intitle:hello) OR (author:Bob intitle:world)`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:115
+msgid "`!((author:Alice intitle:hello) OR (author:Bob intitle:world))`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:115
+msgid "`(author:Alice intitle:hello) !(author:Bob intitle:world)`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:115
+msgid "`!(S:1 OR S:2)`"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:117
+#, no-wrap
+msgid "> ℹ️ If you need to search for a parenthesis, it needs to be escaped like `\\(` or `\\)`\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/10_filter.md:118
+#, no-wrap
+msgid "By sorting by date"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:121
+msgid ""
+"You can change the sort order by clicking the toggle button available in the "
+"header."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/10_filter.md:122
+#, no-wrap
+msgid "Store your filters"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:125
+msgid ""
+"Once you came up with your perfect filter, it would be a shame if you need "
+"to recreate it every time you need to use it."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:129
+msgid ""
+"Hopefully, there is a way to bookmark them for later use. We call them "
+"*user queries*. You can create as many as you want, the only limit is how "
+"they will be displayed on your screen."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/10_filter.md:130
+#, no-wrap
+msgid "Bookmark the current query"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:134
+msgid ""
+"Display the user queries drop-down by clicking the button next to the state "
+"buttons. ![User queries drop-down](../img/users/user.queries.drop-down."
+"empty.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:136
+msgid "Then click on the bookmark action."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:138
+msgid "Congratulations, you’re done!"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/10_filter.md:139
+#, fuzzy, no-wrap
+#| msgid "Use bookmarklet"
+msgid "Using a bookmarked query"
+msgstr "Utiliser le « bookmarklet »"
+
+#. type: Plain text
+#: en/./users/10_filter.md:143
+msgid ""
+"Display the user queries drop-down by clicking the button next to the state "
+"buttons. ![User queries drop-down](../img/users/user.queries.drop-down.not."
+"empty.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:145
+msgid ""
+"Then click on the bookmarked query, the previously stored query will be "
+"applied."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:148
+#, no-wrap
+msgid ""
+"> Note that only the query is stored, not the articles.\n"
+"> The results you are seeing now could be different from the results on the day you've created the query.\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:152
+msgid ""
+"Read more: * [Normal, Global and Reader view](./03_Main_view.md) * "
+"[Refreshing the feeds](./09_refreshing_feeds.md)"
+msgstr ""
+
+#, no-wrap
+#~ msgid "Join us on the mailing lists"
+#~ msgstr "Rejoignez-nous sur les listes de mailing"
+
+#~ msgid ""
+#~ "Do you want to ask us some questions? Do you want to discuss with us? "
+#~ "Don’t hesitate to subscribe to our mailing lists!"
+#~ msgstr ""
+#~ "S’il vous manque des informations, n’hésitez pas à fouiller un peu la "
+#~ "documentation ou venir nous poser directement vos questions sur [la "
+#~ "mailing list des développeurs](https://freshrss.org/mailman/listinfo/dev)."
+
+#~ msgid ""
+#~ "The first mailing is destined to generic information, it should be "
+#~ "adapted to users. [Join mailing@freshrss.org](https://freshrss.org/"
+#~ "mailman/listinfo/mailing)."
+#~ msgstr ""
+#~ "Le premier mailing est destiné à l’information générique, il doit être "
+#~ "adapté aux utilisateurs. [Rejoignez mailing@freshrss.org](https://"
+#~ "freshrss.org/mailman/listinfo/mailing)."
+
+#~ msgid ""
+#~ "The second mailing is mainly for developers. [Join dev@freshrss.org]"
+#~ "(https://freshrss.org/mailman/listinfo/dev)"
+#~ msgstr ""
+#~ "Le deuxième mailing s’adresse principalement aux développeurs. [Rejoignez "
+#~ "dev@freshrss.org](https://freshrss.org/mailman/listinfo/dev)"
+
+#~ msgid ""
+#~ "If you want to improve internationalization, please open a new ticket "
+#~ "first and follow the advice from the *Fix a bug* section."
+#~ msgstr ""
+#~ "Si vous voulez améliorer l’internationalisation, ouvrez d’abord un "
+#~ "nouveau ticket et suivez les conseils de la section *Fixer un bogue*."
+
+#~ msgid "Translations are present in the subdirectories of `./app/i18n/`."
+#~ msgstr ""
+#~ "Les traductions sont disponibles dans les sous-répertoires de `./app/i18n/"
+#~ "`."
+
+#~ msgid ""
+#~ "We’re working on a better way to handle internationalization, but don’t "
+#~ "hesitate to suggest any ideas!"
+#~ msgstr ""
+#~ "Nous travaillons sur une meilleure façon de gérer l’internationalisation "
+#~ "mais n’hésitez pas à nous suggérer des idées !"
+
+#, no-wrap
+#~ msgid "console"
+#~ msgstr "console"
+
+#, no-wrap
+#~ msgid "php"
+#~ msgstr "php"
+
+#, no-wrap
+#~ msgid "bash"
+#~ msgstr "bash"
+
+#~ msgid ""
+#~ "On [the mailing lists](https://freshrss.org/announce-of-the-mailing-lists."
+#~ "html)"
+#~ msgstr ""
+#~ "Sur [les listes de diffusion](https://freshrss.org/announce-of-the-"
+#~ "mailing-lists.html)"
+
+#, no-wrap
+#~ msgid "Models"
+#~ msgstr "Modèles"
+
+#, no-wrap
+#~ msgid "Controllers and actions"
+#~ msgstr "ContrĂ´leurs et actions"
+
+#, no-wrap
+#~ msgid "Writing URL"
+#~ msgstr "Écriture des URL"
+
+#, no-wrap
+#~ msgid "Understanding internals"
+#~ msgstr "Comprendres les mécanismes internes"
+
+#, no-wrap
+#~ msgid "Accessing the database"
+#~ msgstr "Accès à la base de données"
+
+#, no-wrap
+#~ msgid "Writing an action and its related view"
+#~ msgstr "Écrire une action et sa vue associée"
+
+#, no-wrap
+#~ msgid "Authentication"
+#~ msgstr "Gestion de l’authentification"
+
+#, no-wrap
+#~ msgid "Logs"
+#~ msgstr "Gestion des logs"
+
+#, no-wrap
+#~ msgid "Understanding basic mechanics (Minz and MVC)"
+#~ msgstr "Comprendre les mécaniques de base (Minz et MVC)"
+
+#, no-wrap
+#~ msgid "**TODO** : move to 02_Minz.md\n"
+#~ msgstr "**TODO** : bouger dans 02_Minz.md\n"
+
+#, no-wrap
+#~ msgid "html"
+#~ msgstr "html"
+
+#~ msgid ""
+#~ "To access these translations, `Minz_Translate` will help us with its "
+#~ "`Minz_Translate::t()` method. As this can be a bit long to type, a "
+#~ "shortcut has been introduced that **must** be used in all circumstances: "
+#~ "`_t()`. Code example:"
+#~ msgstr ""
+#~ "Pour accéder à ces traductions, `Minz_Translate` va nous aider à l’aide "
+#~ "de sa méthode `Minz_Translate::t()`. Comme cela peut être un peu long à "
+#~ "taper, il a été introduit un raccourci qui **doit** être utilisé en "
+#~ "toutes circonstances : `_t()`. Exemple de code :"
+
+#, no-wrap
+#~ msgid ""
+#~ "<p>\n"
+#~ "\t<a href=\"<?= _url('index', 'index') ?>\">\n"
+#~ "\t\t<?= _t('gen.action.back_to_rss_feeds') ?>\n"
+#~ "\t</a>\n"
+#~ "</p>\n"
+#~ msgstr ""
+#~ "<p>\n"
+#~ "\t<a href=\"<?= _url('index', 'index') ?>\">\n"
+#~ "\t\t<?= _t('gen.action.back_to_rss_feeds') ?>\n"
+#~ "\t</a>\n"
+#~ "</p>\n"
+
+#~ msgid ""
+#~ "`type`: Defines the type of your extension. There are two types: `system` "
+#~ "and` user`. We will study this difference right after."
+#~ msgstr ""
+#~ "`type` : définit le type de votre extension. Il existe deux types : "
+#~ "`system` et `user`. Nous étudierons cette différence juste après."
+
+#~ msgid ""
+#~ "This is the recommended method since you can forget about it once it is "
+#~ "configured."
+#~ msgstr ""
+#~ "C’est la méthode recommandée car il n’y a pas besoin d’y penser, elle se "
+#~ "fait toute seule, à la fréquence que vous avez choisi."
+
+#, no-wrap
+#~ msgid "With the actualize_script.php script"
+#~ msgstr "Par le script actualize_script.php"
+
+#, no-wrap
+#~ msgid "cron"
+#~ msgstr "cron"
+
+#, no-wrap
+#~ msgid "No authentication"
+#~ msgstr "Aucune authentification"
+
+#~ msgid ""
+#~ "This is the most straightforward since you have a public instance; there "
+#~ "is nothing special to configure:"
+#~ msgstr ""
+#~ "C’est le cas le plus simple, puisque votre instance est publique, vous "
+#~ "n’avez rien de particulier à préciser :"
+
+#~ msgid ""
+#~ "The URL used in the previous section will now become accessible to "
+#~ "anyone. Therefore you can use the same syntax for the scheduled task."
+#~ msgstr ""
+#~ "L’url précédente devient donc accessible à n’importe qui et vous pouvez "
+#~ "utiliser la tâche cron de la partie précédente."
+
+#, no-wrap
+#~ msgid "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize&token=my-token'\n"
+#~ msgstr "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize&token=mon-token'\n"
+
+#~ msgid ""
+#~ "When using HTTP authentication, the syntax in the two previous sections "
+#~ "is unusable. You’ll need to provide your credentials to the scheduled "
+#~ "task. **Note that this method is highly discouraged since it means that "
+#~ "your credentials will be in plain sight!**"
+#~ msgstr ""
+#~ "Dans ce cas-là, le token et les permissions “anonymes” sont inutilisables "
+#~ "et il vous sera nécessaire d’indiquer vos identifiants dans la tâche "
+#~ "cron. **Notez que cette solution est grandement déconseillée puisqu’elle "
+#~ "implique que vos identifiants seront visibles en clair !**"
+
+#~ msgid "by tag: `#tag`"
+#~ msgstr "par tag: `#tag`"
+
+#, no-wrap
+#~ msgid "Feed management"
+#~ msgstr "Organisation des flux"
+
+#~ msgid ""
+#~ "Available languages are: cz, de, en, es, fr, he, it, ko, nl, oc, pt-br, "
+#~ "ru, tr, zh-cn."
+#~ msgstr ""
+#~ "Les langues disponibles sont : cz, de, en, es, fr, he, it, ko, nl, oc, pt-"
+#~ "br, ru, tr, zh-cn."
+
+#~ msgid "*Blue Lagoon* by **Mister aiR**"
+#~ msgstr "*Blue Lagoon* par **Mister aiR**"
+
+#~ msgid "*Dark* by **AD**"
+#~ msgstr "*Dark* par **AD**"
+
+#~ msgid "*Flat design* by **Marien Fressinaud**"
+#~ msgstr "*Flat design* par **Marien Fressinaud**"
+
+#~ msgid "*Origine* by **Marien Fressinaud**"
+#~ msgstr "*Origine* par **Marien Fressinaud**"
+
+#~ msgid "*Origine-compact* by **Kevin Papst**"
+#~ msgstr "*Origine-compact* par **Kevin Papst**"
+
+#~ msgid "*Pafat* by **Plopoyop**"
+#~ msgstr "*Pafat* par **Plopoyop**"
+
+#~ msgid "*Screwdriver* by **Mister aiR**"
+#~ msgstr "*Screwdriver* par **Mister aiR**"
+
+#~ msgid "*Swage* by **Patrick Crandol**"
+#~ msgstr "*Swage* par **Patrick Crandol**"
+
+#~ msgid "Tested with:"
+#~ msgstr "Testé avec :"
+
+#, no-wrap
+#~ msgid ""
+#~ "* Android\n"
+#~ " * [Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) (Closed source)\n"
+#~ msgstr ""
+#~ "* Android\n"
+#~ " * [Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) (Propriétaire)\n"
+
+#, no-wrap
+#~ msgid ""
+#~ "* iOS\n"
+#~ " * [Fiery Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) (Closed source)\n"
+#~ " * [Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) (Commercial)\n"
+#~ " * [Reeder](https://www.reederapp.com/) (Commercial) (Use its Google Reader API / native FreshRSS option when possible)\n"
+#~ msgstr ""
+#~ "* iOS\n"
+#~ " * [Fiery Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) (Propriétaire)\n"
+#~ " * [Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) (Commercial)\n"
+#~ " * [Reeder](https://www.reederapp.com/) (Commercial) (Connectez-vous plutĂ´t par son option Google Reader API)\n"
+
+#, no-wrap
+#~ msgid ""
+#~ "* MacOS\n"
+#~ " * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial)\n"
+#~ msgstr ""
+#~ "* MacOS\n"
+#~ " * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial)\n"
+
+#, no-wrap
+#~ msgid "json"
+#~ msgstr "json"
+
+#, no-wrap
+#~ msgid "sh"
+#~ msgstr "sh"
+
+#, no-wrap
+#~ msgid ""
+#~ "4. Click on first link “Check full server configuration”:\n"
+#~ "\t* If you get *PASS* then you are done, all is good: you may proceed to step 6.\n"
+#~ "\t* If you get *Bad Request!* or *Not Found*, then your server probably does not accept slashes `/` that are escaped `%2F`. Proceed to step 5.\n"
+#~ "\t* If you get any other error message, proceed to step 5.\n"
+#~ msgstr ""
+#~ "4. Cliquer sur le premier lien “Check full server configuration”:\n"
+#~ "\t* Si vous obtenez `PASS`, tout est bon : passer à l’étape 6.\n"
+#~ "\t* Si vous obtenez *Bad Request!* ou *Not Found*, alors votre serveur ne semble pas accepter les slashs `/` qui sont encodés `%2F`. Passer à l’étape 5.\n"
+#~ "\t* Si vous obtenez un autre message d’erreur, passer à l’étape 5.\n"
+
+#, no-wrap
+#~ msgid ""
+#~ "5. Click on the second link “Check partial server configuration (without `%2F` support)”:\n"
+#~ "\t* If you get `PASS`, then the problem is indeed that your server does not accept slashes `/` that are escaped `%2F`.\n"
+#~ "\t\t* With Apache, remember the directive [`AllowEncodedSlashes On`](http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes)\n"
+#~ "\t\t* Or use a client that does not escape slashes (such as EasyRSS), in which case proceed to step 6.\n"
+#~ "\t* If you get *Service Unavailable!*, then check from step 1 again.\n"
+#~ "\t* With __Apache__:\n"
+#~ "\t\t* If you get *FAIL getallheaders!*, the combination of your PHP version and your Web server does not provide access to [`getallheaders`](http://php.net/getallheaders)\n"
+#~ "\t\t\t* Turn on Apache `mod_setenvif` (often enabled by default), or `mod_rewrite` with the following procedure:\n"
+#~ "\t\t\t\t* Allow [`FileInfo` in `.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride): see the [server setup](../admins/02_Installation.md) again.\n"
+#~ "\t\t\t\t* Enable [`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html):\n"
+#~ "\t\t\t\t\t* With Debian / Ubuntu: `sudo a2enmod rewrite`\n"
+#~ "\t* With __nginx__:\n"
+#~ "\t\t* If you get *Bad Request!*, check your server `PATH_INFO` configuration.\n"
+#~ "\t\t* If you get *File not found!*, check your server `fastcgi_split_path_info`.\n"
+#~ "\t* If you get *FAIL 64-bit or GMP extension!*, then your PHP version does not pass the requirement of being 64-bit and/or have PHP [GMP](http://php.net/gmp) extension.\n"
+#~ "\t\t* The easiest is to add the GMP extension. On Debian / Ubuntu: `sudo apt install php-gmp`\n"
+#~ "\t* Update and try again from step 3.\n"
+#~ msgstr ""
+#~ "5. Cliquer sur le second lien “Check partial server configuration (without `%2F` support)”:\n"
+#~ "\t* Si vous obtenez `PASS`, alors le problème est bien que votre serveur n’accepte pas les slashs `/` qui sont encodés `%2F`.\n"
+#~ "\t\t* Avec Apache, vérifiez la directive [`AllowEncodedSlashes On`](http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes)\n"
+#~ "\t\t* Ou utilisez un client qui n’encode pas les slashs (comme EasyRSS), auquel cas passer à l’étape 6.\n"
+#~ "\t* Si vous obtenez *Service Unavailable!*, retourner à l’étape 6.\n"
+#~ "\t* Avec __Apache__:\n"
+#~ "\t\t* Si vous obtenez *FAIL getallheaders!*, alors la combinaison de votre version de PHP et de votre serveur Web ne permet pas l’accès à [`getallheaders`](http://php.net/getallheaders)\n"
+#~ "\t\t\t* Activer Apache `mod_setenvif` (souvent activé par défault), ou `mod_rewrite` avec la procédure suivante :\n"
+#~ "\t\t\t\t* Autoriser [`FileInfo` dans `.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride) : revoir [l’installation du serveur](01_Installation.md).\n"
+#~ "\t\t\t\t* Activer [`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html) :\n"
+#~ "\t\t\t\t\t* Sur Debian / Ubuntu : `sudo a2enmod rewrite`\n"
+#~ "\t* Avec __nginx__:\n"
+#~ "\t\t* Si vous obtenez *Bad Request!*, vérifier la configuration `PATH_INFO` de votre serveur.\n"
+#~ "\t\t* Si vous obtenez *File not found!*, vérifier la configuration `fastcgi_split_path_info` de votre serveur.\n"
+#~ "\t* Si vous obtenez *FAIL 64-bit or GMP extension!*, alors votre installation PHP soit n’est pas en 64 bit, soit n’a pas l’extension PHP [GMP](http://php.net/gmp) activée.\n"
+#~ "\t\t* Le plus simple est d’activer l’extension GMP. Sur Debian / Ubuntu : `sudo apt install php-gmp`\n"
+#~ "\t* Mettre à jour et retourner à l’étape 3.\n"
+
+#, no-wrap
+#~ msgid ""
+#~ "7. Pick a client supporting a Google Reader-like API. Selection:\n"
+#~ "\t* Android\n"
+#~ "\t\t* [News+](https://github.com/noinnion/newsplus/blob/master/apk/NewsPlus_202.apk) with [News+ Google Reader extension](https://github.com/noinnion/newsplus/tree/master/extensions/GoogleReaderCloneExtension) (Closed source)\n"
+#~ "\t\t* [FeedMe 3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) (Closed source)\n"
+#~ "\t\t* [EasyRSS](https://github.com/Alkarex/EasyRSS) (Open source, [F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/))\n"
+#~ "\t* Linux\n"
+#~ "\t\t* [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Open source)\n"
+#~ "\t* MacOS\n"
+#~ "\t\t* [Vienna RSS](http://www.vienna-rss.com/) (Open source)\n"
+#~ "\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
+#~ "\t* iOS\n"
+#~ "\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
+#~ "\t* Firefox\n"
+#~ "\t\t* [FreshRSS-Notify](https://addons.mozilla.org/firefox/addon/freshrss-notify-webextension/) (Open source)\n"
+#~ msgstr ""
+#~ "7. Vous pouvez maintenant tester sur une application mobile:\n"
+#~ "\t* Android\n"
+#~ "\t\t* [News+](https://github.com/noinnion/newsplus/blob/master/apk/NewsPlus_202.apk) avec [News+ Google Reader extension](https://github.com/noinnion/newsplus/tree/master/extensions/GoogleReaderCloneExtension) (Closed source)\n"
+#~ "\t\t* [FeedMe 3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) (Propriétaire)\n"
+#~ "\t\t* [EasyRSS](https://github.com/Alkarex/EasyRSS) (Libre, [F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/))\n"
+#~ "\t* Linux\n"
+#~ "\t\t* [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Libre)\n"
+#~ "\t* MacOS\n"
+#~ "\t\t* [Vienna RSS](http://www.vienna-rss.com/) (Libre)\n"
+#~ "\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
+#~ "\t* iOS\n"
+#~ "\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
+#~ "\t* Firefox\n"
+#~ "\t\t* [FreshRSS-Notify](https://addons.mozilla.org/firefox/addon/freshrss-notify-webextension/) (Libre)\n"
+
#, fuzzy
#~| msgid ""
#~| "As explained in the [security section](/en/User_documentation/"
diff --git a/docs/i18n/templates/freshrss.pot b/docs/i18n/templates/freshrss.pot
index 69ecee8f2..16bc2bfa7 100644
--- a/docs/i18n/templates/freshrss.pot
+++ b/docs/i18n/templates/freshrss.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: https://github.com/FreshRSS/FreshRSS/issues\n"
-"POT-Creation-Date: 2020-02-29 18:49+0100\n"
+"POT-Creation-Date: 2023-05-11 00:12+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -19,47 +19,21 @@ msgstr ""
#. type: Title ##
#: en/./contributing.md:1
-#, no-wrap
-msgid "Join us on the mailing lists"
-msgstr ""
-
-#. type: Plain text
-#: en/./contributing.md:4
-msgid ""
-"Do you want to ask us some questions? Do you want to discuss with us? Don’t "
-"hesitate to subscribe to our mailing lists!"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./contributing.md:7
-msgid ""
-"The first mailing is destined to generic information, it should be adapted "
-"to users. [Join "
-"mailing@freshrss.org](https://freshrss.org/mailman/listinfo/mailing)."
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./contributing.md:7
-msgid ""
-"The second mailing is mainly for developers. [Join "
-"dev@freshrss.org](https://freshrss.org/mailman/listinfo/dev)"
-msgstr ""
-
-#. type: Title ##
-#: en/./contributing.md:8
-#, no-wrap
+#, markdown-text, no-wrap
msgid "Report a bug"
msgstr ""
#. type: Plain text
-#: en/./contributing.md:11
+#: en/./contributing.md:4
+#, markdown-text
msgid ""
"Have you found a bug? Don’t panic, here are some steps to report it with "
"ease:"
msgstr ""
#. type: Bullet: '1. '
-#: en/./contributing.md:15
+#: en/./contributing.md:8
+#, markdown-text
msgid ""
"Search for it on [the bug "
"tracker](https://github.com/FreshRSS/FreshRSS/issues) (don’t forget to use "
@@ -67,94 +41,116 @@ msgid ""
msgstr ""
#. type: Bullet: '2. '
-#: en/./contributing.md:15
+#: en/./contributing.md:8
+#, markdown-text
msgid ""
"If you find a similar bug, don’t hesitate to post a comment to add more "
"importance to the related ticket."
msgstr ""
#. type: Bullet: '3. '
-#: en/./contributing.md:15
+#: en/./contributing.md:8
+#, markdown-text
msgid ""
"If you didn’t find it, [open a new "
"ticket](https://github.com/FreshRSS/FreshRSS/issues/new)."
msgstr ""
#. type: Plain text
-#: en/./contributing.md:17
+#: en/./contributing.md:10
+#, markdown-text
msgid ""
"If you have to create a new ticket, please try to keep in mind the following "
"advice:"
msgstr ""
#. type: Bullet: '* '
-#: en/./contributing.md:20
+#: en/./contributing.md:13
+#, markdown-text
msgid "Give an explicit title to the ticket so it will be easier to find it later."
msgstr ""
#. type: Bullet: '* '
-#: en/./contributing.md:20
+#: en/./contributing.md:13
+#, markdown-text
msgid ""
"Be as exhaustive as possible in the description: what did you do? What is "
"the bug? What are the steps to reproduce the bug?"
msgstr ""
#. type: Plain text
-#: en/./contributing.md:22
+#: en/./contributing.md:15
+#, markdown-text
msgid "We also need some information:"
msgstr ""
#. type: Bullet: '* '
-#: en/./contributing.md:27
+#: en/./contributing.md:20
+#, markdown-text
msgid "Your FreshRSS version (on the about page or in the `constants.php` file)"
msgstr ""
#. type: Bullet: '* '
-#: en/./contributing.md:27
+#: en/./contributing.md:20
+#, markdown-text
msgid "Your server configuration: the type of hosting and the PHP version"
msgstr ""
#. type: Bullet: '* '
-#: en/./contributing.md:27
+#: en/./contributing.md:20
+#, markdown-text
msgid "Your storage system (SQLite, MySQL, MariaDB, PostgreSQL)"
msgstr ""
#. type: Bullet: '* '
-#: en/./contributing.md:27
+#: en/./contributing.md:20
+#, markdown-text
msgid ""
"If possible, the related logs (PHP logs and FreshRSS logs under "
"`data/users/your_user/log.txt`)"
msgstr ""
+#. type: Plain text
+#: en/./contributing.md:22
+#, markdown-text
+msgid ""
+"For a more detailed guide on writing bug reports, please refer to [the "
+"in-depth guide on reporting bugs](developers/06_Reporting_Bugs)."
+msgstr ""
+
#. type: Title ##
-#: en/./contributing.md:28
-#, no-wrap
+#: en/./contributing.md:23
+#, markdown-text, no-wrap
msgid "Fix a bug"
msgstr ""
#. type: Plain text
-#: en/./contributing.md:31
+#: en/./contributing.md:26
+#, markdown-text
msgid ""
"Would you like to fix a bug? For optimum coordination between collaborators, "
"you should follow these indications:"
msgstr ""
#. type: Bullet: '1. '
-#: en/./contributing.md:36
+#: en/./contributing.md:31
+#, markdown-text
msgid ""
"Be sure the bug is associated with a ticket and indicate that you’ll work on "
"it."
msgstr ""
#. type: Bullet: '2. '
-#: en/./contributing.md:36
+#: en/./contributing.md:31
+#, markdown-text
msgid ""
"[Fork the project "
"repository](https://help.github.com/articles/fork-a-repo/)."
msgstr ""
#. type: Bullet: '3. '
-#: en/./contributing.md:36
+#: en/./contributing.md:31
+#, markdown-text
msgid ""
"[Create a new "
"branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/). "
@@ -164,37 +160,40 @@ msgid ""
msgstr ""
#. type: Bullet: '4. '
-#: en/./contributing.md:36
+#: en/./contributing.md:31
+#, markdown-text
msgid ""
"Make your changes to your fork and [send a pull "
"request](https://help.github.com/articles/using-pull-requests/)."
msgstr ""
#. type: Plain text
-#: en/./contributing.md:38
+#: en/./contributing.md:33
+#, markdown-text
msgid ""
"If you have to write code, please follow [our coding style "
-"recommendations](developers/01_First_steps.md)."
+"recommendations](developers/02_First_steps.md)."
msgstr ""
#. type: Plain text
-#: en/./contributing.md:40
-#, no-wrap
+#: en/./contributing.md:35
+#, markdown-text, no-wrap
msgid ""
"**Tip:** if you’re searching for easy-to-fix bugs, please have a look at the "
-"\"[good first "
-"issue](https://github.com/FreshRSS/FreshRSS/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\" "
+"“[good first "
+"issue](https://github.com/FreshRSS/FreshRSS/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)” "
"ticket label.\n"
msgstr ""
#. type: Title ##
-#: en/./contributing.md:41
-#, no-wrap
+#: en/./contributing.md:36
+#, markdown-text, no-wrap
msgid "Submit an idea"
msgstr ""
#. type: Plain text
-#: en/./contributing.md:44
+#: en/./contributing.md:39
+#, markdown-text
msgid ""
"You have great ideas, yes! Don’t be shy and open [a new "
"ticket](https://github.com/FreshRSS/FreshRSS/issues/new) on our bug tracker "
@@ -203,58 +202,187 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./contributing.md:46
+#: en/./contributing.md:41
+#, markdown-text
msgid "If your idea is nice, we’ll have a look at it."
msgstr ""
#. type: Title ##
-#: en/./contributing.md:47
-#, no-wrap
+#: en/./contributing.md:42
+#, markdown-text, no-wrap
msgid "Contribute to internationalization (i18n)"
msgstr ""
#. type: Plain text
-#: en/./contributing.md:50
+#: en/./contributing.md:45
+#, markdown-text
msgid ""
-"If you want to improve internationalization, please open a new ticket first "
-"and follow the advice from the *Fix a bug* section."
+"Learn how to contribute to translations in [the dedicated "
+"documentation](./internationalization.md)."
+msgstr ""
+
+#. type: Title ##
+#: en/./contributing.md:46
+#, markdown-text, no-wrap
+msgid "Contribute to documentation"
msgstr ""
#. type: Plain text
-#: en/./contributing.md:52
-msgid "Translations are present in the subdirectories of `./app/i18n/`."
+#: en/./contributing.md:49
+#, markdown-text
+msgid ""
+"The documentation needs a lot of improvements in order to be more useful to "
+"new contributors and we are working on it. If you want to give some help, "
+"meet us in the main repositories [docs "
+"directory](https://github.com/FreshRSS/FreshRSS/tree/edge/docs)!"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/01_Index.md:1
+#, markdown-text, no-wrap
+msgid "FreshRSS Development"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_Index.md:3
+#, markdown-text, no-wrap
+msgid "First Steps"
msgstr ""
#. type: Plain text
-#: en/./contributing.md:54
+#: en/./developers/01_Index.md:6
+#, markdown-text
msgid ""
-"We’re working on a better way to handle internationalization, but don’t "
-"hesitate to suggest any ideas!"
+"Start by creating your development environment. A guide to setting up "
+"FreshRSS’s development environment can be found on [the appropriate "
+"page](02_First_steps.md)."
msgstr ""
#. type: Title ##
-#: en/./contributing.md:55
-#, no-wrap
-msgid "Contribute to documentation"
+#: en/./developers/01_Index.md:7
+#, markdown-text, no-wrap
+msgid "After That"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+#, markdown-text
+msgid "[Github Branching and Pushing](02_Github.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+#, markdown-text
+msgid "[Running tests](03_Running_tests.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+#, markdown-text
+msgid "[Creating a pull request](04_Pull_requests.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+#, markdown-text
+msgid "[Releasing a new version](05_Release_new_version.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+#, markdown-text
+msgid "[Reporting bugs](06_Reporting_Bugs.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+#, markdown-text
+msgid "[Fever API](06_Fever_API.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:16
+#, markdown-text
+msgid "[GoogleReader API](06_GoogleReader_API.md)"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_Index.md:17
+#, markdown-text, no-wrap
+msgid "Backend Development"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:22
+#, markdown-text
+msgid "[Making extensions for FreshRSS](03_Backend/05_Extensions.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:22
+#, markdown-text
+msgid "[Database Schema](03_Backend/01_Database_schema.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:22
+#, markdown-text
+msgid "[External libraries](03_Backend/03_External_libraries.md)"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_Index.md:23
+#, markdown-text, no-wrap
+msgid "Frontend Development"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:27
+#, markdown-text
+msgid "[View files](04_Frontend/01_View_files.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:27
+#, markdown-text
+msgid "[Design (Themes/Theming)](04_Frontend/02_Design.md)"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_Index.md:28
+#, markdown-text, no-wrap
+msgid "Namespaces"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/01_Index.md:31
+#, markdown-text
+msgid "[OPML FreshRSS namespace](OPML.md)"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_Index.md:32
+#, markdown-text, no-wrap
+msgid "Minz"
msgstr ""
#. type: Plain text
-#: en/./contributing.md:58
+#: en/./developers/01_Index.md:34
+#, markdown-text
msgid ""
-"The documentation needs a lot of improvements in order to be more useful to "
-"new contributors and we are working on it. If you want to give some help, "
-"meet us in the main repositories [docs "
-"directory](https://github.com/FreshRSS/FreshRSS/tree/edge/docs)!"
+"Minz is the homemade PHP framework used by FreshRSS. More information can be "
+"found [here](Minz/index.md)."
msgstr ""
#. type: Title #
-#: en/./developers/01_First_steps.md:1
-#, no-wrap
+#: en/./developers/02_First_steps.md:1
+#, markdown-text, no-wrap
msgid "Environment configuration (Docker)"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:4
+#: en/./developers/02_First_steps.md:4
+#, markdown-text
msgid ""
"FreshRSS is built with PHP and uses a homemade framework, Minz. The "
"dependencies are directly included in the source code, so you don’t need "
@@ -262,7 +390,8 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:6
+#: en/./developers/02_First_steps.md:6
+#, markdown-text
msgid ""
"There are various ways to configure your development environment. The "
"easiest and most supported method is based on Docker, which is the solution "
@@ -271,14 +400,16 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:8
+#: en/./developers/02_First_steps.md:8
+#, markdown-text
msgid ""
"We assume here that you use a GNU/Linux distribution, capable of running "
"Docker. Otherwise, you’ll have to adapt the commands accordingly."
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:10
+#: en/./developers/02_First_steps.md:10
+#, markdown-text
msgid ""
"The commands that follow have to be executed in a console. They start by `$` "
"when commands need to be executed as normal user, and by `#` when they need "
@@ -289,33 +420,30 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:12
+#: en/./developers/02_First_steps.md:12
+#, markdown-text
msgid ""
"First, you need to install "
"[Docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/)."
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:14
+#: en/./developers/02_First_steps.md:14
+#, markdown-text
msgid "Once you’re done, clone the repository with:"
msgstr ""
-#. type: Code fence info string
-#: en/./developers/01_First_steps.md:15 en/./developers/01_First_steps.md:24 en/./developers/01_First_steps.md:34 en/./developers/01_First_steps.md:42 en/./developers/01_First_steps.md:50 en/./developers/03_Running_tests.md:9 en/./developers/03_Running_tests.md:17 en/./developers/04_Pull_requests.md:23 en/./developers/04_Pull_requests.md:38
-#, no-wrap
-msgid "console"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/01_First_steps.md:15
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:15
#, no-wrap
msgid ""
-"$ git clone https://github.com/FreshRSS/FreshRSS.git\n"
-"$ cd FreshRSS\n"
+"git clone https://github.com/FreshRSS/FreshRSS.git\n"
+"cd FreshRSS\n"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:21
+#: en/./developers/02_First_steps.md:21
+#, markdown-text
msgid ""
"Note that, if you want to contribute, you have to fork the repository first "
"and clone your fork instead of the \"root\" one. Adapt the commands in "
@@ -323,26 +451,28 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:23
+#: en/./developers/02_First_steps.md:23
+#, markdown-text
msgid "Then, the only command you need to know is the following:"
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:24
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:24
#, no-wrap
-msgid "$ make start\n"
+msgid "make start\n"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:29
+#: en/./developers/02_First_steps.md:29
+#, markdown-text
msgid ""
"This might take some time while Docker downloads the image. If your user "
"isn’t in the `docker` group, you’ll need to prepend the command with `sudo`."
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:31
-#, no-wrap
+#: en/./developers/02_First_steps.md:31
+#, markdown-text, no-wrap
msgid ""
"**You can now access FreshRSS at "
"[http://localhost:8080](http://localhost:8080).** Just follow the install "
@@ -350,103 +480,110 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:33
-#, no-wrap
+#: en/./developers/02_First_steps.md:33
+#, markdown-text, no-wrap
msgid ""
"You can stop the containers by typing <kbd>Control</kbd> + <kbd>c</kbd> or "
"with the following command, in another terminal:\n"
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:34
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:34
#, no-wrap
-msgid "$ make stop\n"
+msgid "make stop\n"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:39
+#: en/./developers/02_First_steps.md:39
+#, markdown-text
msgid ""
"If you’re interested in the configuration, the `make` commands are defined "
"in the [`Makefile`](/Makefile)."
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:41
+#: en/./developers/02_First_steps.md:41
+#, markdown-text
msgid ""
"If you need to use a different tag image (default is `alpine`), you can set "
"the `TAG` environment variable:"
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:42
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:42
#, no-wrap
-msgid "$ TAG=arm make start\n"
+msgid "TAG=arm make start\n"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:47
+#: en/./developers/02_First_steps.md:47
+#, markdown-text
msgid ""
"You can find the full list of available tags [on the Docker "
"hub](https://hub.docker.com/r/freshrss/freshrss/tags)."
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:49
+#: en/./developers/02_First_steps.md:49
+#, markdown-text
msgid ""
"If you want to build the Docker image yourself, you can use the following "
"command:"
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:50
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:50
#, no-wrap
msgid ""
-"$ make build\n"
-"$ # or\n"
-"$ TAG=arm make build\n"
+"make build\n"
+"# or\n"
+"TAG=arm make build\n"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:57
+#: en/./developers/02_First_steps.md:57
+#, markdown-text
msgid ""
"The `TAG` variable can be anything (e.g. `local`). You can target a specific "
"architecture by adding `-alpine` or `-arm` at the end of the tag "
"(e.g. `local-arm`)."
msgstr ""
-#. type: Title #
-#: en/./developers/01_First_steps.md:58
-#, no-wrap
+#. type: Title ##
+#: en/./developers/02_First_steps.md:58
+#, markdown-text, no-wrap
msgid "Project architecture"
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:61 en/./developers/03_Backend/02_Minz.md:4 en/./developers/03_Backend/02_Minz.md:8 en/./developers/03_Backend/02_Minz.md:12 en/./developers/03_Backend/02_Minz.md:16 en/./developers/03_Backend/02_Minz.md:20 en/./developers/03_Backend/02_Minz.md:24 en/./developers/03_Backend/02_Minz.md:27 en/./developers/03_Backend/04_Changing_source_code.md:4 en/./developers/03_Backend/04_Changing_source_code.md:8 en/./developers/03_Backend/04_Changing_source_code.md:12 en/./developers/03_Backend/04_Changing_source_code.md:15 en/./developers/03_Backend/05_Extensions.md:342 en/./developers/03_Backend/05_Extensions.md:383 en/./developers/04_Frontend/01_View_files.md:4 en/./developers/04_Frontend/01_View_files.md:8 en/./developers/04_Frontend/01_View_files.md:12 en/./developers/04_Frontend/01_View_files.md:15 en/./developers/04_Frontend/02_Design.md:4 en/./developers/04_Frontend/02_Design.md:8 en/./developers/04_Frontend/02_Design.md:11 en/./users/03_Main_view.md:4 en/./users/03_Main_view.md:8 en/./users/03_Main_view.md:12 en/./users/04_Subscriptions.md:4 en/./users/04_Subscriptions.md:8 en/./users/04_Subscriptions.md:19 en/./users/05_Configuration.md:70 en/./users/05_Configuration.md:74 en/./users/05_Configuration.md:128 en/./users/05_Configuration.md:153 en/./users/05_Configuration.md:157 en/./users/05_Configuration.md:161
-#, no-wrap
-msgid "**TODO**\n"
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:61
+#, markdown-text
+msgid "the PHP framework: [Minz](Minz/index.md)"
msgstr ""
#. type: Title #
-#: en/./developers/01_First_steps.md:62
-#, no-wrap
+#: en/./developers/02_First_steps.md:62 en/./users/05_Configuration.md:178
+#, markdown-text, no-wrap
msgid "Extensions"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:65
+#: en/./developers/02_First_steps.md:65
+#, markdown-text
msgid ""
"If you want to create your own FreshRSS extension, take a look at the "
"[extension documentation](03_Backend/05_Extensions.md)."
msgstr ""
-#. type: Title #
-#: en/./developers/01_First_steps.md:66
-#, no-wrap
+#. type: Title ##
+#: en/./developers/02_First_steps.md:66
+#, markdown-text, no-wrap
msgid "Coding style"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:69
+#: en/./developers/02_First_steps.md:69
+#, markdown-text
msgid ""
"If you want to contribute to the source code, it’s important to follow the "
"project’s coding style. The actual code doesn’t always follow it throughout "
@@ -454,50 +591,277 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:71
+#: en/./developers/02_First_steps.md:71
+#, markdown-text
msgid ""
"Contributions which don’t follow the coding style will be rejected as long "
"as the coding style is not fixed."
msgstr ""
#. type: Title ##
-#: en/./developers/01_First_steps.md:72
+#: en/./developers/02_First_steps.md:72
+#, markdown-text, no-wrap
+msgid "GitHub Actions"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_First_steps.md:76
+#, markdown-text
+msgid ""
+"The code will be checked for every pull request commit on GitHub via [GitHub "
+"Actions](https://github.com/FreshRSS/FreshRSS/actions). See the "
+"configuration file [`tests.yml`](../../../.github/workflows/tests.yml)."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/02_First_steps.md:77
+#, markdown-text, no-wrap
+msgid "Running fixes & tests"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_First_steps.md:80
+#, markdown-text
+msgid ""
+"Tests can be run locally, e.g. by running `make test-all`, and several "
+"problems can be automatically fixed by running `make fix-all`."
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:81
#, no-wrap
-msgid "Spaces, tabs and other whitespace characters"
+msgid ""
+"make fix-all\n"
+"make test-all\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_First_steps.md:87
+#, markdown-text
+msgid ""
+"This requires `make` and `npm` in addition to the FreshRSS requirements. See "
+"below for the precise requirements for a few platforms."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:88
+#, markdown-text, no-wrap
+msgid "Debian / Ubuntu"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_First_steps.md:91
+#, markdown-text, no-wrap
+msgid ""
+"> ℹ️ Also applies to [Microsoft "
+"Windows](https://docs.microsoft.com/windows/wsl/install-win10) thanks to "
+"[WSL](https://ubuntu.com/wsl).\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_First_steps.md:93
+#, markdown-text
+msgid ""
+"Here are the dependencies that need to be manually installed prior to "
+"running the fixes & tests."
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:94
+#, no-wrap
+msgid ""
+"sudo apt update && sudo apt install --no-install-recommends -y make npm "
+"php-cli php-curl php-mbstring php-xml unzip wget\n"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:98
+#, markdown-text, no-wrap
+msgid "Fedora / Red Hat"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:100
+#, no-wrap
+msgid ""
+"yum install -y git make npm php-cli php-curl php-mbstring php-xml php-pdo "
+"unzip wget\n"
msgstr ""
#. type: Title ###
-#: en/./developers/01_First_steps.md:74
+#: en/./developers/02_First_steps.md:104
+#, markdown-text, no-wrap
+msgid "Alpine Linux"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:106
#, no-wrap
+msgid ""
+"apk add git make npm php-cli php-curl php-ctype php-dom php-mbstring "
+"php-openssl php-phar php-simplexml php-xml php-pdo php-tokenizer "
+"php-xmlreader php-xmlwriter unzip wget\n"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:110
+#, markdown-text, no-wrap
+msgid "Partial fixes & tests"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:114
+#, markdown-text
+msgid ""
+"composer-based: `npm run fix && npm test` or see the [`scripts` section of "
+"`composer.json`](../../../composer.json) for individual tests or fixes such "
+"as `composer phpstan`"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:114
+#, markdown-text
+msgid ""
+"npm-based: `npm run fix && npm test` or see the [`scripts` section of "
+"`package.json`](../../../package.json) for individual tests or fixes such as "
+"`npm run rtlcss`"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:115
+#, markdown-text, no-wrap
+msgid "Tests summary"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_First_steps.md:118
+#, markdown-text
+msgid "A short (not complete) summary:"
+msgstr ""
+
+#. type: Title ####
+#: en/./developers/02_First_steps.md:119
+#, markdown-text, no-wrap
+msgid "PHP"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:127
+#, markdown-text
+msgid "Syntax of `php` and `phtml` files is checked."
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:127
+#, markdown-text
+msgid ""
+"translation files (`i18n`) are checked ([more information about i18n "
+"files](internationalization.html))."
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:127
+#, markdown-text
+msgid "unit test (`tests`) are run by [PHPunit](https://phpunit.de/)."
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/02_First_steps.md:127 en/./developers/02_First_steps.md:134
+#: en/./developers/02_First_steps.md:139 en/./developers/02_First_steps.md:144
+#, markdown-text
+msgid "Linter:"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./developers/02_First_steps.md:127 en/./developers/02_First_steps.md:134
+#, markdown-text
+msgid "[PHP_Codesniffer (phpcs)](https://github.com/squizlabs/PHP_CodeSniffer)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./developers/02_First_steps.md:127
+#, markdown-text
+msgid "[PHPstan](https://github.com/phpstan/phpstan)"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:128
+#, markdown-text, no-wrap
+msgid "CSS"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./developers/02_First_steps.md:134
+#, markdown-text
+msgid "via npm `.styleintrc.json`"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./developers/02_First_steps.md:134
+#, markdown-text
+msgid "check that RTL (right-to-left) CSS files match to standard CSS files"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:135
+#, markdown-text, no-wrap
+msgid "JavaScript"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./developers/02_First_steps.md:139
+#, markdown-text
+msgid ""
+"via npm `.styleintrc.json` ([ECMAScript "
+"2017](https://en.wikipedia.org/wiki/ECMAScript#8th_Edition_%E2%80%93_ECMAScript_2017))"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:140
+#, markdown-text, no-wrap
+msgid "Markdown"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./developers/02_First_steps.md:144
+#, markdown-text
+msgid "via npm `.markdownlint.json`"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/02_First_steps.md:145
+#, markdown-text, no-wrap
+msgid "Spaces, tabs and other whitespace characters"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_First_steps.md:147
+#, markdown-text, no-wrap
msgid "Indentation"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:76
+#: en/./developers/02_First_steps.md:150
+#, markdown-text
msgid "Code indentation must use tabs."
msgstr ""
#. type: Title ###
-#: en/./developers/01_First_steps.md:77
-#, no-wrap
+#: en/./developers/02_First_steps.md:151
+#, markdown-text, no-wrap
msgid "Alignment"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:80
+#: en/./developers/02_First_steps.md:154
+#, markdown-text
msgid ""
"Once the code has been correctly indented, it might be useful to align it "
"for ease of reading. In that case, please use spaces."
msgstr ""
-#. type: Code fence info string
-#: en/./developers/01_First_steps.md:81 en/./developers/01_First_steps.md:111 en/./developers/01_First_steps.md:123 en/./developers/01_First_steps.md:158 en/./developers/01_First_steps.md:173 en/./developers/01_First_steps.md:186 en/./developers/01_First_steps.md:196 en/./developers/01_First_steps.md:213 en/./developers/01_First_steps.md:228 en/./developers/03_Backend/05_Extensions.md:47 en/./developers/03_Backend/05_Extensions.md:88 en/./developers/03_Backend/05_Extensions.md:130 en/./developers/03_Backend/05_Extensions.md:149 en/./developers/03_Backend/05_Extensions.md:166 en/./developers/03_Backend/05_Extensions.md:188 en/./developers/03_Backend/05_Extensions.md:225 en/./developers/05_Release_new_version.md:53 en/./users/06_Fever_API.md:107
-#, no-wrap
-msgid "php"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/01_First_steps.md:81
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:155
#, no-wrap
msgid ""
"$result = a_function_with_a_really_long_name($param1, $param2,\n"
@@ -505,33 +869,29 @@ msgid ""
msgstr ""
#. type: Title ###
-#: en/./developers/01_First_steps.md:86
-#, no-wrap
+#: en/./developers/02_First_steps.md:160
+#, markdown-text, no-wrap
msgid "End of line"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:89
+#: en/./developers/02_First_steps.md:163
+#, markdown-text
msgid ""
"The newline character must be a line feed (LF), which is the default line "
"ending on *NIX systems. This character must not follow other white space."
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:91
+#: en/./developers/02_First_steps.md:165
+#, markdown-text
msgid ""
"You can verify if there is any unintended white space at the end of line "
"with the following Git command:"
msgstr ""
-#. type: Code fence info string
-#: en/./developers/01_First_steps.md:92 en/./developers/02_Github.md:80 en/./developers/02_Github.md:85 en/./developers/02_Github.md:90 en/./developers/02_Github.md:96 en/./developers/02_Github.md:102 en/./developers/05_Release_new_version.md:15 en/./developers/05_Release_new_version.md:101
-#, no-wrap
-msgid "bash"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/01_First_steps.md:92
+#. type: Fenced code block (sh)
+#: en/./developers/02_First_steps.md:166
#, no-wrap
msgid ""
"# command to check files before adding them in the Git index\n"
@@ -541,42 +901,45 @@ msgid ""
msgstr ""
#. type: Title ###
-#: en/./developers/01_First_steps.md:99 en/./developers/01_First_steps.md:220
-#, no-wrap
+#: en/./developers/02_First_steps.md:173
+#, markdown-text, no-wrap
msgid "End of file"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:102
+#: en/./developers/02_First_steps.md:176
+#, markdown-text
msgid "Every file must end by an empty line."
msgstr ""
#. type: Title ###
-#: en/./developers/01_First_steps.md:103
-#, no-wrap
+#: en/./developers/02_First_steps.md:177
+#, markdown-text, no-wrap
msgid "Commas, dots and semi-columns"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:106
+#: en/./developers/02_First_steps.md:180
+#, markdown-text
msgid ""
"There should no space before those characters, but there should be one "
"after."
msgstr ""
#. type: Title ###
-#: en/./developers/01_First_steps.md:107 en/./developers/01_First_steps.md:210
-#, no-wrap
+#: en/./developers/02_First_steps.md:181
+#, markdown-text, no-wrap
msgid "Operators"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:110
+#: en/./developers/02_First_steps.md:184
+#, markdown-text
msgid "There should be a space before and after every operator."
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:111
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:185
#, no-wrap
msgid ""
"if ($a == 10) {\n"
@@ -587,13 +950,14 @@ msgid ""
msgstr ""
#. type: Title ###
-#: en/./developers/01_First_steps.md:119
-#, no-wrap
+#: en/./developers/02_First_steps.md:193
+#, markdown-text, no-wrap
msgid "Parentheses"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:122
+#: en/./developers/02_First_steps.md:196
+#, markdown-text
msgid ""
"There should be no spaces in between brackets. There should be no spaces "
"before the opening bracket, except if it’s after a keyword. There shouldn’t "
@@ -601,8 +965,8 @@ msgid ""
"bracket."
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:123
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:197
#, no-wrap
msgid ""
"if ($a == 10) {\n"
@@ -615,29 +979,24 @@ msgid ""
msgstr ""
#. type: Title ###
-#: en/./developers/01_First_steps.md:133
-#, no-wrap
+#: en/./developers/02_First_steps.md:207
+#, markdown-text, no-wrap
msgid "With chained functions"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:136
+#: en/./developers/02_First_steps.md:210
+#, markdown-text
msgid ""
-"It happens most of the time in Javascript files. When there are chained "
-"functions with closures and callback functions, it’s hard to understand the "
+"It happens most of the time in JavaScript files. When there are chained "
+"functions with closures and call-back functions, it’s hard to understand the "
"code if not properly formatted. In those cases, we add a new indent level "
"for the complete instruction and reset the indent for a new instruction on "
"the same level."
msgstr ""
-#. type: Code fence info string
-#: en/./developers/01_First_steps.md:137
-#, no-wrap
-msgid "javascript"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/01_First_steps.md:137
+#. type: Fenced code block (javascript)
+#: en/./developers/02_First_steps.md:211
#, no-wrap
msgid ""
"// First instruction\n"
@@ -655,25 +1014,27 @@ msgid ""
msgstr ""
#. type: Title ##
-#: en/./developers/01_First_steps.md:152
-#, no-wrap
+#: en/./developers/02_First_steps.md:226
+#, markdown-text, no-wrap
msgid "Line length"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:155
+#: en/./developers/02_First_steps.md:229
+#, markdown-text
msgid ""
"Lines should strive to be shorter than 80 characters. However, this limit "
"may be extended to 100 characters when strictly necessary."
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:157
+#: en/./developers/02_First_steps.md:231
+#, markdown-text
msgid "With functions, parameters can be declared on multiple lines."
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:158
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:232
#, no-wrap
msgid ""
"function my_function($param_1, $param_2,\n"
@@ -683,31 +1044,33 @@ msgid ""
msgstr ""
#. type: Title ##
-#: en/./developers/01_First_steps.md:165
-#, no-wrap
+#: en/./developers/02_First_steps.md:239
+#, markdown-text, no-wrap
msgid "Naming"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:168
+#: en/./developers/02_First_steps.md:242
+#, markdown-text
msgid ""
"All code elements (functions, classes, methods and variables) must describe "
"their usage succinctly."
msgstr ""
#. type: Title ###
-#: en/./developers/01_First_steps.md:169
-#, no-wrap
+#: en/./developers/02_First_steps.md:243
+#, markdown-text, no-wrap
msgid "Functions and variables"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:172
+#: en/./developers/02_First_steps.md:246
+#, markdown-text
msgid "Functions and variables must follow the \"snake case\" naming convention."
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:173
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:247
#, no-wrap
msgid ""
"// a function\n"
@@ -719,18 +1082,19 @@ msgid ""
msgstr ""
#. type: Title ###
-#: en/./developers/01_First_steps.md:182
-#, no-wrap
+#: en/./developers/02_First_steps.md:256
+#, markdown-text, no-wrap
msgid "Methods"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:185
+#: en/./developers/02_First_steps.md:259
+#, markdown-text
msgid "Methods must follow the \"lower camel case\" naming convention."
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:186
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:260
#, no-wrap
msgid ""
"private function methodName() {\n"
@@ -739,61 +1103,71 @@ msgid ""
msgstr ""
#. type: Title ###
-#: en/./developers/01_First_steps.md:192
-#, no-wrap
+#: en/./developers/02_First_steps.md:266
+#, markdown-text, no-wrap
msgid "Classes"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:195
+#: en/./developers/02_First_steps.md:269
+#, markdown-text
msgid "Classes must follow the \"upper camel case\" naming convention."
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:196
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:270
#, no-wrap
msgid "abstract class ClassName {}\n"
msgstr ""
#. type: Title ##
-#: en/./developers/01_First_steps.md:200
-#, no-wrap
+#: en/./developers/02_First_steps.md:274
+#, markdown-text, no-wrap
msgid "Encoding"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:203
+#: en/./developers/02_First_steps.md:277
+#, markdown-text
msgid "Files must be encoded with the UTF-8 character set."
msgstr ""
#. type: Title ##
-#: en/./developers/01_First_steps.md:204
-#, no-wrap
+#: en/./developers/02_First_steps.md:278
+#, markdown-text, no-wrap
msgid "PHP compatibility"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:207
+#: en/./developers/02_First_steps.md:281
+#, markdown-text
msgid ""
"Please ensure that your code works with the oldest PHP version officially "
"supported by FreshRSS."
msgstr ""
-#. type: Title ##
-#: en/./developers/01_First_steps.md:208
-#, no-wrap
+#. type: Title ###
+#: en/./developers/02_First_steps.md:282 en/./developers/OPML.md:47
+#, markdown-text, no-wrap
msgid "Miscellaneous"
msgstr ""
+#. type: Title ###
+#: en/./developers/02_First_steps.md:284
+#, markdown-text, no-wrap
+msgid "Operators on multiple lines"
+msgstr ""
+
#. type: Plain text
-#: en/./developers/01_First_steps.md:212
+#: en/./developers/02_First_steps.md:287
+#, markdown-text
msgid ""
"Operators must be at the end of the line if a condition is split over more "
"than one line."
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:213
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:288
#, no-wrap
msgid ""
"if ($a == 10 ||\n"
@@ -802,26 +1176,34 @@ msgid ""
"}\n"
msgstr ""
+#. type: Title ###
+#: en/./developers/02_First_steps.md:295
+#, markdown-text, no-wrap
+msgid "End of PHP file"
+msgstr ""
+
#. type: Plain text
-#: en/./developers/01_First_steps.md:223
+#: en/./developers/02_First_steps.md:298
+#, markdown-text
msgid "If the file contains only PHP code, the PHP closing tag must be omitted."
msgstr ""
#. type: Title ###
-#: en/./developers/01_First_steps.md:224
-#, no-wrap
+#: en/./developers/02_First_steps.md:299
+#, markdown-text, no-wrap
msgid "Arrays"
msgstr ""
#. type: Plain text
-#: en/./developers/01_First_steps.md:227
+#: en/./developers/02_First_steps.md:302
+#, markdown-text
msgid ""
"If an array declaration runs on more than one line, each element must be "
"followed by a comma, including the last one."
msgstr ""
-#. type: Plain text
-#: en/./developers/01_First_steps.md:228
+#. type: Fenced code block (php)
+#: en/./developers/02_First_steps.md:303
#, no-wrap
msgid ""
"$variable = [\n"
@@ -833,341 +1215,84 @@ msgstr ""
#. type: Title #
#: en/./developers/02_Github.md:1
-#, no-wrap
-msgid "Reporting a bug or a suggestion"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/02_Github.md:4
-msgid ""
-"Despite the care given to FreshRSS, it’s still possible that bugs occur. The "
-"project is young and development is dynamic, so it can be corrected "
-"quickly. You might also have a feature in mind that does not yet "
-"exist. Regardless whether your idea seems silly, far-fetched, useless or too "
-"specific, please don’t hesitate to propose it to us! \"Ideas in the air\" "
-"often find an attentive ear. It’s new external perspectives that make the "
-"project evolve the most."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/02_Github.md:6
-msgid ""
-"If you’re convinced that you should be heard, here’s how you can go about "
-"it."
-msgstr ""
-
-#. type: Title ##
-#: en/./developers/02_Github.md:7
-#, no-wrap
-msgid "On GitHub"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/02_Github.md:10
-msgid ""
-"GitHub is the ideal platform to submit your requests. It allows us to "
-"discuss a problem or suggestion with others and it often generates new "
-"ideas. Let’s not neglect this \"social\" aspect!"
-msgstr ""
-
-#. type: Bullet: ' 1. '
-#: en/./developers/02_Github.md:16
-msgid "[Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/issues)"
-msgstr ""
-
-#. type: Bullet: ' 2. '
-#: en/./developers/02_Github.md:16
-msgid ""
-"Start by checking if a similar request hasn’t already been made. If so, "
-"please feel free to add your voice to the request."
-msgstr ""
-
-#. type: Bullet: ' 3. '
-#: en/./developers/02_Github.md:16
-msgid ""
-"If your request is new, [open a new bug "
-"ticket](https://github.com/FreshRSS/FreshRSS/issues/new)"
-msgstr ""
-
-#. type: Bullet: ' 4. '
-#: en/./developers/02_Github.md:16
-msgid ""
-"Finally, write your request. If you’re fluent in English, it’s the preferred "
-"language because it allows for discussion with the largest number of people."
-msgstr ""
-
-#. type: Bullet: ' 5. '
-#: en/./developers/02_Github.md:16
-msgid "Please follow the tips below to make it easier to let your ticket be heard."
-msgstr ""
-
-#. type: Title ##
-#: en/./developers/02_Github.md:17
-#, no-wrap
-msgid "Informal"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/02_Github.md:20
-msgid ""
-"Not everyone likes or uses GitHub for a variety of legitimate reasons. That "
-"is why you can also contact us in a more informal way."
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:26
-msgid ""
-"On [our Mattermost "
-"chat](https://framateam.org/signup_user_complete/?id=e2680d3e3128b9fac8fdb3003b0024ee)"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:26
-msgid ""
-"On [the mailing "
-"lists](https://freshrss.org/announce-of-the-mailing-lists.html)"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:26
-msgid "At events / meetings around Free Software"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:26
-msgid "Over a beer in a bar"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:26
-msgid "Etc."
-msgstr ""
-
-#. type: Title ##
-#: en/./developers/02_Github.md:27
-#, no-wrap
-msgid "Tips"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/02_Github.md:30
-msgid "Here are some tips to help you present your bug report or suggestion:"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid "**Pay attention to spelling**. Even if it’s not always easy, try your best!"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"**Give an explicit title to your request**, even if it’s a bit long. This "
-"not only helps us understand your request, but also to find your ticket "
-"later."
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"**One request = one ticket.** You may have lots of ideas while being afraid "
-"to spam the bug manager: it does’nt matter. It’s better to have a few too "
-"many tickets than too many requests in one. We’ll close and consolidate "
-"requests when possible."
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"If you report a bug, think about **providing us with the FreshRSS logs** "
-"(accessible in the FreshRSS `data/log/` folder) and the **PHP logs** (the "
-"location may vary by distribution, but consider searching in "
-"`/var/log/httpd` or `/var/log/apache`)."
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"If you can’t find the log files, specify it in your ticket so we know you’ve "
-"already searched."
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"Not all bugs require logs, but if you have any doubts, it is better to "
-"provide them to us. Logs are important and very useful for debugging!"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/02_Github.md:39
-msgid ""
-"The logs may reveal confidential information, so **be careful not to "
-"disclose anything sensitive.**"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/02_Github.md:41
-msgid ""
-"In addition, when facing a bug, you’re encouraged to follow this message "
-"format (from the [Sam & Max "
-"website](http://sametmax.com/template-de-demande-daide-en-informatique/):"
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/02_Github.md:42
-#, no-wrap
-msgid "What’s my goal?"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/02_Github.md:45
-msgid "Give the general context of what you were trying to do."
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/02_Github.md:46
-#, no-wrap
-msgid "What have I been trying to do?"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/02_Github.md:49
-msgid "Explain step by step what you have done so that we can reproduce the bug."
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/02_Github.md:50
-#, no-wrap
-msgid "What results have I achieved?"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/02_Github.md:53
-msgid ""
-"The bug: what you see that shouldn’t have happened. Here you can provide the "
-"logs."
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/02_Github.md:54
-#, no-wrap
-msgid "What was the expected result?"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/02_Github.md:57
-msgid "So that we understand what you consider to be the problem."
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/02_Github.md:58
-#, no-wrap
-msgid "What are my circumstances?"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/02_Github.md:61
-msgid "Remember to give the following information if you know it:"
-msgstr ""
-
-#. type: Bullet: ' 1. '
-#: en/./developers/02_Github.md:67
-msgid "Which browser? Which version?"
-msgstr ""
-
-#. type: Bullet: ' 2. '
-#: en/./developers/02_Github.md:67
-msgid "Which server: Apache, Nginx? Which version?"
-msgstr ""
-
-#. type: Bullet: ' 3. '
-#: en/./developers/02_Github.md:67
-msgid "Which version of PHP?"
-msgstr ""
-
-#. type: Bullet: ' 4. '
-#: en/./developers/02_Github.md:67
-msgid "Which database: SQLite, MySQL, MariaDB, PostgreSQL? Which version?"
-msgstr ""
-
-#. type: Bullet: ' 5. '
-#: en/./developers/02_Github.md:67
-msgid "Which distribution runs on the server? And… which version?"
-msgstr ""
-
-#. type: Title #
-#: en/./developers/02_Github.md:68
-#, no-wrap
+#, markdown-text, no-wrap
msgid "Branching"
msgstr ""
#. type: Title ##
-#: en/./developers/02_Github.md:70
-#, no-wrap
+#: en/./developers/02_Github.md:3
+#, markdown-text, no-wrap
msgid "Basic"
msgstr ""
#. type: Plain text
-#: en/./developers/02_Github.md:72
+#: en/./developers/02_Github.md:6
+#, markdown-text
msgid "If you are new to Git, here are some of the resources you might find useful:"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/02_Github.md:77
+#: en/./developers/02_Github.md:11
+#, markdown-text
msgid "[GitHub’s blog post](https://github.com/blog/120-new-to-git)"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/02_Github.md:77
+#: en/./developers/02_Github.md:11
+#, markdown-text
msgid "<http://try.github.com/>"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/02_Github.md:77
+#: en/./developers/02_Github.md:11
+#, markdown-text
msgid "<http://sixrevisions.com/resources/git-tutorials-beginners/>"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/02_Github.md:77
+#: en/./developers/02_Github.md:11
+#, markdown-text
msgid "<http://rogerdudler.github.io/git-guide/>"
msgstr ""
#. type: Title ##
-#: en/./developers/02_Github.md:78
-#, no-wrap
+#: en/./developers/02_Github.md:12
+#, markdown-text, no-wrap
msgid "Getting the latest code from the FreshRSS repository"
msgstr ""
#. type: Plain text
-#: en/./developers/02_Github.md:80
+#: en/./developers/02_Github.md:15
+#, markdown-text
msgid "First you need to add the official repo to your remote repo list:"
msgstr ""
-#. type: Plain text
-#: en/./developers/02_Github.md:80
+#. type: Fenced code block (sh)
+#: en/./developers/02_Github.md:16
#, no-wrap
msgid "git remote add upstream git@github.com:FreshRSS/FreshRSS.git\n"
msgstr ""
#. type: Plain text
-#: en/./developers/02_Github.md:85
+#: en/./developers/02_Github.md:21
+#, markdown-text
msgid "You can verify the remote repo is successfully added by using:"
msgstr ""
-#. type: Plain text
-#: en/./developers/02_Github.md:85
+#. type: Fenced code block (sh)
+#: en/./developers/02_Github.md:22
#, no-wrap
msgid "git remote -v show\n"
msgstr ""
#. type: Plain text
-#: en/./developers/02_Github.md:90
+#: en/./developers/02_Github.md:27
+#, markdown-text
msgid "Now you can pull the latest development code:"
msgstr ""
-#. type: Plain text
-#: en/./developers/02_Github.md:90
+#. type: Fenced code block (sh)
+#: en/./developers/02_Github.md:28
#, no-wrap
msgid ""
"git checkout edge\n"
@@ -1175,25 +1300,25 @@ msgid ""
msgstr ""
#. type: Title ##
-#: en/./developers/02_Github.md:95
-#, no-wrap
+#: en/./developers/02_Github.md:33
+#, markdown-text, no-wrap
msgid "Starting a new development branch"
msgstr ""
-#. type: Plain text
-#: en/./developers/02_Github.md:96
+#. type: Fenced code block (sh)
+#: en/./developers/02_Github.md:35
#, no-wrap
msgid "git checkout -b my-development-branch\n"
msgstr ""
-#. type: Title #
-#: en/./developers/02_Github.md:100
-#, no-wrap
+#. type: Title ##
+#: en/./developers/02_Github.md:39
+#, markdown-text, no-wrap
msgid "Sending a patch"
msgstr ""
-#. type: Plain text
-#: en/./developers/02_Github.md:102
+#. type: Fenced code block (sh)
+#: en/./developers/02_Github.md:41
#, no-wrap
msgid ""
"# Add the changed file, here actualize_script.php\n"
@@ -1207,119 +1332,94 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/02_Github.md:114
+#: en/./developers/02_Github.md:53
+#, markdown-text
msgid "Now you can create a PR based on your branch."
msgstr ""
#. type: Title ##
-#: en/./developers/02_Github.md:115
-#, no-wrap
+#: en/./developers/02_Github.md:54
+#, markdown-text, no-wrap
msgid "How to write a commit message"
msgstr ""
#. type: Plain text
-#: en/./developers/02_Github.md:118
+#: en/./developers/02_Github.md:57
+#, markdown-text
msgid ""
-"A commit message should succintly describe the changes on the first "
+"A commit message should succinctly describe the changes on the first "
"line. For example:"
msgstr ""
#. type: Plain text
-#: en/./developers/02_Github.md:120
-#, no-wrap
+#: en/./developers/02_Github.md:59
+#, markdown-text, no-wrap
msgid "> Fix broken icon\n"
msgstr ""
#. type: Plain text
-#: en/./developers/02_Github.md:122
+#: en/./developers/02_Github.md:61
+#, markdown-text
msgid "If necessary, this can be followed by a blank line and a longer explanation."
msgstr ""
#. type: Plain text
-#: en/./developers/02_Github.md:123
+#: en/./developers/02_Github.md:62
+#, markdown-text
msgid "For further tips, see [here](https://chris.beams.io/posts/git-commit/)."
msgstr ""
#. type: Title #
-#: en/./developers/03_Backend/02_Minz.md:1
-#, no-wrap
-msgid "Models"
-msgstr ""
-
-#. type: Title #
-#: en/./developers/03_Backend/02_Minz.md:5
-#, no-wrap
-msgid "Controllers and actions"
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/03_Backend/02_Minz.md:9 en/./developers/03_Backend/05_Extensions.md:69
-#, no-wrap
-msgid "Views"
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/03_Backend/02_Minz.md:13 en/./developers/03_Backend/05_Extensions.md:39
-#, no-wrap
-msgid "Routing"
-msgstr ""
-
-#. type: Title #
-#: en/./developers/03_Backend/02_Minz.md:17
-#, no-wrap
-msgid "Writing URL"
-msgstr ""
-
-#. type: Title #
-#: en/./developers/03_Backend/02_Minz.md:21 en/./developers/04_Frontend/01_View_files.md:13
-#, no-wrap
-msgid "Internationalisation"
+#: en/./developers/03_Backend/01_Database_schema.md:1
+#, markdown-text, no-wrap
+msgid "Database Schema"
msgstr ""
-#. type: Title #
-#: en/./developers/03_Backend/02_Minz.md:25
-#, no-wrap
-msgid "Understanding internals"
-msgstr ""
-
-#. type: Title #
-#: en/./developers/03_Backend/04_Changing_source_code.md:1
-#, no-wrap
-msgid "Accessing the database"
+#. type: Plain text
+#: en/./developers/03_Backend/01_Database_schema.md:4
+#: en/./developers/03_Backend/05_Extensions.md:169
+#: en/./developers/04_Frontend/01_View_files.md:6
+#: en/./developers/04_Frontend/01_View_files.md:10
+#: en/./developers/04_Frontend/01_View_files.md:14
+#: en/./developers/04_Frontend/01_View_files.md:17
+#: en/./users/05_Configuration.md:185
+#, markdown-text, no-wrap
+msgid "> **TODO**\n"
msgstr ""
-#. type: Title #
-#: en/./developers/03_Backend/04_Changing_source_code.md:5
-#, no-wrap
-msgid "Writing an action and its related view"
+#. type: Title ##
+#: en/./developers/03_Backend/01_Database_schema.md:5
+#, markdown-text, no-wrap
+msgid "See also"
msgstr ""
-#. type: Title #
-#: en/./developers/03_Backend/04_Changing_source_code.md:9
-#, no-wrap
-msgid "Authentication"
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/01_Database_schema.md:7
+#, markdown-text
+msgid "[Database configuration](../../admins/DatabaseConfig.md)"
msgstr ""
#. type: Title #
-#: en/./developers/03_Backend/04_Changing_source_code.md:13
-#, no-wrap
-msgid "Logs"
+#: en/./developers/03_Backend/03_External_libraries.md:1
+#, markdown-text, no-wrap
+msgid "External Libraries"
msgstr ""
#. type: Title #
#: en/./developers/03_Backend/05_Extensions.md:1
-#, no-wrap
+#, markdown-text, no-wrap
msgid "Writing extensions for FreshRSS"
msgstr ""
#. type: Title ##
#: en/./developers/03_Backend/05_Extensions.md:3
-#, no-wrap
+#, markdown-text, no-wrap
msgid "About FreshRSS"
msgstr ""
#. type: Plain text
#: en/./developers/03_Backend/05_Extensions.md:6
+#, markdown-text
msgid ""
"FreshRSS is an RSS / Atom feed aggregator written in PHP dating back to "
"October 2012. The official site is located at "
@@ -1330,32 +1430,37 @@ msgstr ""
#. type: Title ##
#: en/./developers/03_Backend/05_Extensions.md:7
-#, no-wrap
+#, markdown-text, no-wrap
msgid "The problem"
msgstr ""
#. type: Plain text
#: en/./developers/03_Backend/05_Extensions.md:10
+#, markdown-text
msgid "FreshRSS is limited in its technical possibilities by various factors:"
msgstr ""
#. type: Bullet: '* '
#: en/./developers/03_Backend/05_Extensions.md:14
+#, markdown-text
msgid "The number of developers"
msgstr ""
#. type: Bullet: '* '
#: en/./developers/03_Backend/05_Extensions.md:14
+#, markdown-text
msgid "The will to integrate certain changes"
msgstr ""
#. type: Bullet: '* '
#: en/./developers/03_Backend/05_Extensions.md:14
+#, markdown-text
msgid "The level of \"hacking\" required to integrate marginal features"
msgstr ""
#. type: Plain text
#: en/./developers/03_Backend/05_Extensions.md:16
+#, markdown-text
msgid ""
"While the first limitation can, in theory, be lifted by the participation of "
"new contributors to the project, it depends on the willingness of "
@@ -1366,6 +1471,7 @@ msgstr ""
#. type: Plain text
#: en/./developers/03_Backend/05_Extensions.md:18
+#, markdown-text
msgid ""
"Another solution consists of an extension system. By allowing users to write "
"their own extension without taking an interest in the core of the basic "
@@ -1374,595 +1480,100 @@ msgstr ""
#. type: Bullet: '1. '
#: en/./developers/03_Backend/05_Extensions.md:22
+#, markdown-text
msgid "Reducing the amount of source code a new contributor has to take in"
msgstr ""
#. type: Bullet: '2. '
#: en/./developers/03_Backend/05_Extensions.md:22
+#, markdown-text
msgid "Unofficial integration of novelties"
msgstr ""
#. type: Bullet: '3. '
#: en/./developers/03_Backend/05_Extensions.md:22
+#, markdown-text
msgid "No forking or main developer approval required."
msgstr ""
#. type: Plain text
#: en/./developers/03_Backend/05_Extensions.md:24
+#, markdown-text
msgid ""
"Note: it is quite conceivable that the functionalities of an extension can "
"later be officially integrated into the FreshRSS code. Extensions make it "
"easy to propose a proof of concept."
msgstr ""
-#. type: Title ##
+#. type: Title #
#: en/./developers/03_Backend/05_Extensions.md:25
-#, no-wrap
-msgid "Understanding basic mechanics (Minz and MVC)"
+#: en/./developers/Minz/index.md:1
+#, markdown-text, no-wrap
+msgid "Minz Framework"
msgstr ""
#. type: Plain text
#: en/./developers/03_Backend/05_Extensions.md:28
-#, no-wrap
-msgid "**TODO** : move to 02_Minz.md\n"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:30
-msgid ""
-"This data sheet should refer to the official FreshRSS and Minz documentation "
-"(the PHP framework on which FreshRSS is based). Unfortunately, this "
-"documentation does not yet exist. In a few words, here are the main things "
-"you should know. It is not necessary to read all the chapters in this "
-"section if you don’t need to use a feature in your extension (if you don’t "
-"need to translate your extension, no need to know more about the "
-"`Minz_Translate` module for example)."
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:31
-#, no-wrap
-msgid "MVC Architecture"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:34
-msgid ""
-"Minz relies on and imposes an MVC architecture on projects using it. This "
-"architecture consists of three main components:"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:38
-msgid ""
-"The model: this is the base object that we will manipulate. In FreshRSS, "
-"categories, flows and articles are templates. The part of the code that "
-"makes it possible to manipulate them in a database is also part of the model "
-"but is separated from the base model: we speak of DAO (for \"Data Access "
-"Object\"). The templates are stored in a `Models` folder."
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:38
-msgid ""
-"The view: this is what the user sees. The view is therefore simply HTML code "
-"mixed with PHP to display dynamic information. The views are stored in a "
-"`views` folder."
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:38
-msgid ""
-"The controller: this is what makes it possible to link models and "
-"views. Typically, a controller will load templates from the database (like a "
-"list of items) to \"pass\" them to a view for display. Controllers are "
-"stored in a `Controllers` directory."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:42
-msgid ""
-"In order to link a URL to a controller, first you have to go through a "
-"\"routing\" phase. In FreshRSS, this is particularly simple because it "
-"suffices to specify the name of the controller to load into the URL using a "
-"`c` parameter. For example, the address http://exemple.com?c=hello will "
-"execute the code contained in the `hello` controller."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:44
-msgid ""
-"One concept that has not yet been discussed is the \"actions\" system. An "
-"action is executed *on* a controller. Concretely, a controller is "
-"represented by a class and its actions by methods. To execute an action, it "
-"is necessary to specify an `a` parameter in the URL."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:46 en/./developers/03_Backend/05_Extensions.md:165
-msgid "Code example:"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:47
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"class FreshRSS_hello_Controller extends FreshRSS_ActionController {\n"
-"\tpublic function indexAction() {\n"
-"\t\t$this->view->a_variable = 'FooBar';\n"
-"\t}\n"
-"\n"
-"\tpublic function worldAction() {\n"
-"\t\t$this->view->a_variable = 'Hello World!';\n"
-"\t}\n"
-"}\n"
-"\n"
-"?>\n"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:64
-msgid ""
-"When loading the address http://exemple.com?c=hello&a=world, the `world` "
-"action is executed on the `hello` controller."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:66
-msgid ""
-"Note: if `c` or `a` is not specified, the default value for each of these "
-"variables is `index`. So the address http://exemple.com?c=hello will execute "
-"the `index` action of the `hello` controller."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:68
-msgid ""
-"From now on, the `hello/world` naming convention will be used to refer to a "
-"controller/action pair."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:72
-msgid ""
-"Each view is associated with a controller and an action. The view associated "
-"with `hello/world` will be stored in a very specific file: "
-"`views/hello/world. phtml`. This convention is imposed by Minz."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:74
-msgid "As explained above, the views consist of HTML mixed with PHP. Code example:"
-msgstr ""
-
-#. type: Code fence info string
-#: en/./developers/03_Backend/05_Extensions.md:75 en/./developers/03_Backend/05_Extensions.md:120 en/./developers/03_Backend/05_Extensions.md:248 en/./developers/03_Backend/05_Extensions.md:284 en/./developers/03_Backend/05_Extensions.md:351
-#, no-wrap
-msgid "html"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:75
-#, no-wrap
-msgid ""
-"<p>\n"
-"\tThis is a parameter passed from the controller: <?= $this->a_variable ?>\n"
-"</p>\n"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:82
-#, no-wrap
-msgid ""
-"The variable `$this->a_variable` is passed by the controller (see previous "
-"example). The difference is that in the controller it is necessary to pass "
-"`$this->view`, while in the view `$this` suffices.\n"
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:83
-#, no-wrap
-msgid "Working with GET / POST"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:87
-msgid ""
-"It is often necessary to take advantage of parameters passed by GET or "
-"POST. In Minz, these parameters are accessible using the `Minz_Request` "
-"class. Code example:"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:88
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"$default_value = 'foo';\n"
-"$param = Minz_Request::param('bar', $default_value);\n"
-"\n"
-"// Display the value of the parameter `bar` (passed via GET or POST)\n"
-"// or \"foo\" if the parameter does not exist.\n"
-"echo $param;\n"
-"\n"
-"// Sets the value of the `bar` parameter\n"
-"Minz_Request::_param('bar', 'baz');\n"
-"\n"
-"// Will necessarily display \"baz\" since we have just forced its value.\n"
-"// Note that the second parameter (default) is optional.\n"
-"echo Minz_Request::param('bar');\n"
-"\n"
-"?>\n"
+#, markdown-text
+msgid "see [Minz documentation](/docs/en/developers/Minz/index.md)"
msgstr ""
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:109
-msgid ""
-"The `Minz_Request::isPost()` method can be used to execute a piece of code "
-"only if it is a POST request."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:111
-msgid ""
-"Note: it is preferable to use `Minz_Request` only in controllers. It is "
-"likely that you will encounter this method in FreshRSS views, or even in "
-"templates, but be aware that this is **not** good practice."
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:112
-#, no-wrap
-msgid "Access session settings"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:115
-msgid ""
-"The access to session parameters is strangely similar to the GET / POST "
-"parameters but passes through the `Minz_Session` class this time! There is "
-"no example here because you can repeat the previous example by changing all "
-"`Minz_Request` to `Minz_Session`."
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:116
-#, no-wrap
-msgid "Working with URLs"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:119
-msgid ""
-"To take full advantage of the Minz routing system, it is strongly "
-"discouraged to write hard URLs in your code. For example, the following view "
-"should be avoided:"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:120
-#, no-wrap
-msgid ""
-"<p>\n"
-"\tGo to page <a href=\"http://example.com?c=hello&amp;a=world\">Hello "
-"world</a>!\n"
-"</p>\n"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:127
-msgid ""
-"If one day it was decided to use a \"url rewriting\" system to have "
-"addresses in a http://exemple.com/controller/action format, all previous "
-"addresses would become ineffective!"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:129
-msgid ""
-"So use the `Minz_Url` class and its `display()` method "
-"instead. `Minz_Url::display()` takes an array of the following form as its "
-"argument:"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:130
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"$url_array = [\n"
-"\t'c' => 'hello',\n"
-"\t'a' => 'world',\n"
-"\t'params' => [\n"
-"\t\t'foo' => 'bar',\n"
-"\t],\n"
-"];\n"
-"\n"
-"// Show something like .?c=hello&amp;a=world&amp;foo=bar\n"
-"echo Minz_Url::display($url_array);\n"
-"\n"
-"?>\n"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:148
-msgid ""
-"Since this can become a bit tedious to use in the long run, especially in "
-"views, it is preferable to use the `_url()` shortcut:"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:149
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"// Displays the same as above\n"
-"echo _url('hello', 'world', 'foo', 'bar');\n"
-"\n"
-"?>\n"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:159
-msgid ""
-"Note: as a general rule, the shortened form (`_url()`) should be used in "
-"views, while the long form (`Minz_Url::display()`) should be used in "
-"controllers."
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:160
-#, no-wrap
-msgid "Redirections"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:163
-msgid ""
-"It is often necessary to redirect a user to another page. To do so, the "
-"`Minz_Request` class offers another useful method: `forward()`. This method "
-"takes the same URL format as the one seen just before as its argument."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:166
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"$url_array = [\n"
-"\t'c' => 'hello',\n"
-"\t'a' => 'world',\n"
-"];\n"
-"\n"
-"// Tells Minz to redirect the user to the hello / world page.\n"
-"// Note that this is a redirection in the Minz sense of the term, not a "
-"redirection that the browser will have to manage (HTTP code 301 or 302)\n"
-"// The code that follows forward() will thus be executed!\n"
-"Minz_Request::forward($url_array);\n"
-"\n"
-"// To perform a type 302 redirect, add \"true\".\n"
-"// The code that follows will never be executed.\n"
-"Minz_Request::forward($url_array, true);\n"
-"\n"
-"?>\n"
+#. type: Title ##
+#: en/./developers/03_Backend/05_Extensions.md:29
+#, markdown-text, no-wrap
+msgid "Write an extension for FreshRSS"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:187
+#: en/./developers/03_Backend/05_Extensions.md:32
+#, markdown-text
msgid ""
-"It is very common to want display a message to the user while performing a "
-"redirect, to tell the user how the action was carried out (validation of a "
-"form for example). Such a message is passed through a `notification` session "
-"variable (note: we will talk about feedback from now on to avoid confusion "
-"with a notification that can occur at any time). To facilitate this kind of "
-"very frequent action, there are two shortcuts that both perform a 302 "
-"redirect by assigning a feedback message:"
+"Here we are! We’ve talked about the most useful features of Minz and how to "
+"run FreshRSS correctly and it’s about time to address the extensions "
+"themselves."
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:188
-#, no-wrap
+#: en/./developers/03_Backend/05_Extensions.md:34
+#, markdown-text
msgid ""
-"<?php\n"
-"\n"
-"$url_array = [\n"
-"\t'c' => 'hello',\n"
-"\t'a' => 'world',\n"
-"];\n"
-"$feedback_good = 'All went well!';\n"
-"$feedback_bad = 'Oops, something went wrong.';\n"
-"\n"
-"Minz_Request::good($feedback_good, $url_array);\n"
-"\n"
-"// or\n"
-"\n"
-"Minz_Request::bad($feedback_bad, $url_array);\n"
-"\n"
-"?>\n"
+"An extension allows you to easily add functionality to FreshRSS without "
+"having to touch the core of the project directly."
msgstr ""
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:207
-#, no-wrap
-msgid "Translation Management"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:210
-msgid ""
-"It is common (and that’s an understatement) to want to show some text to the "
-"user. In the previous example, for example, we display feedback to the user "
-"based on the result of form validation. The problem is that FreshRSS has "
-"users of different nationalities. It is therefore necessary to be able to "
-"manage different languages in order not to remain confined to English or "
-"French."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:212
-msgid ""
-"The solution is to use the `Minz_Translate` class, which allows dynamic "
-"translation of FreshRSS (or any Minz-based application). Before using this "
-"module, it is necessary to know where to find the strings to be "
-"translated. Each language has its own subdirectory in a parent directory "
-"named `i18n`. For example, English language files are located in "
-"`i18n/fr/`. There are seven different files:"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`admin.php` for anything related to FreshRSS administration"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`conf.php` for configuration"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`feedback.php` contains translations of feedback messages"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`gen.php` stores what is global to FreshRSS (gen for \"general\")"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`index.php` for the main page that lists feeds and the About page"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`install.php` contains strings related FreshRSS installation"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:220
-msgid "`sub.php` for subscription management (sub for \"subscription\")"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:222
-msgid "This organization makes it possible to avoid a single huge translation file."
+#: en/./developers/03_Backend/05_Extensions.md:35
+#, markdown-text, no-wrap
+msgid "Make it work in Docker"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:224
-msgid ""
-"The translation files are quite simple: it’s only a matter of returning a "
-"PHP table containing the translations. As an example, here’s an extract from "
-"`app/i18n/fr/gen.php`:"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:225
-#, no-wrap
-msgid ""
-"<?php\n"
-"\n"
-"return array(\n"
-"\t'action' => [\n"
-"\t\t'actualize' => 'Actualiser',\n"
-"\t\t'back_to_rss_feeds' => '↠Retour à vos flux RSS',\n"
-"\t\t'cancel' => 'Annuler',\n"
-"\t\t'create' => 'Créer',\n"
-"\t\t'disable' => 'Désactiver',\n"
-"\t),\n"
-"\t'freshrss' => array(\n"
-"\t\t'_' => 'FreshRSS',\n"
-"\t\t'about' => 'Ă€ propos de FreshRSS',\n"
-"\t),\n"
-"];\n"
-"\n"
-"?>\n"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:247
-msgid ""
-"To access these translations, `Minz_Translate` will help us with its "
-"`Minz_Translate::t()` method. As this can be a bit long to type, a shortcut "
-"has been introduced that **must** be used in all circumstances: `_t()`. "
-"Code example:"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:248
-#, no-wrap
-msgid ""
-"<p>\n"
-"\t<a href=\"<?= _url('index', 'index') ?>\">\n"
-"\t\t<?= _t('gen.action.back_to_rss_feeds') ?>\n"
-"\t</a>\n"
-"</p>\n"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:257
-msgid ""
-"The string to pass to the `_t()` function consists of a series of "
-"identifiers separated by dots. The first identifier indicates from which "
-"file to extract the translation (in this case, `gen.php`), while the "
-"following ones indicate table entries. Thus `action` is an entry of the main "
-"array and `back_to_rss_feeds` is an entry of the `action` array. This allows "
-"us to further organize our translation files."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:259
+#: en/./developers/03_Backend/05_Extensions.md:38
+#, markdown-text
msgid ""
-"There is a small special case that sometimes makes life easier: the `_` "
-"identifier. This must necessarily be present at the end of the chain and "
-"gives a value to the higher-level identifier. It’s pretty hard to explain "
-"but very simple to understand. In the example given above, a `_` is "
-"associated with the value `FreshRSS`: this means that there is no need to "
-"write `_t('gen.freshrss._')` but `_t('gen.freshrss')` suffices."
-msgstr ""
-
-#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:260
-#, no-wrap
-msgid "Configuration management"
+"When working on an extension, it’s easier to see it working directly in its "
+"environment. With Docker, you can leverage the use of the ```volume``` "
+"option when starting the container. Hopefully, you can use it without "
+"Docker-related knowledge by using the Makefile rule:"
msgstr ""
-#. type: Title ##
-#: en/./developers/03_Backend/05_Extensions.md:262
+#. type: Fenced code block (sh)
+#: en/./developers/03_Backend/05_Extensions.md:38
#, no-wrap
-msgid "Write an extension for FreshRSS"
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:265
-msgid ""
-"Here we are! We’ve talked about the most useful features of Minz and how to "
-"run FreshRSS correctly and it’s about time to address the extensions "
-"themselves."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:267
msgid ""
-"An extension allows you to easily add functionality to FreshRSS without "
-"having to touch the core of the project directly."
+"make start extensions=\"/full/path/to/extension/1 "
+"/full/path/to/extension/2\"\n"
msgstr ""
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:268
-#, no-wrap
+#: en/./developers/03_Backend/05_Extensions.md:42
+#, markdown-text, no-wrap
msgid "Basic files and folders"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:273
+#: en/./developers/03_Backend/05_Extensions.md:47
+#, markdown-text
msgid ""
"The first thing to note is that **all** extensions **must** be located in "
"the `extensions` directory, at the base of the FreshRSS tree. An extension "
@@ -1973,28 +1584,32 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:275
+#: en/./developers/03_Backend/05_Extensions.md:49
+#, markdown-text
msgid ""
"The main directory of an extension must contain at least two **mandatory** "
"files:"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:278
+#: en/./developers/03_Backend/05_Extensions.md:52
+#, markdown-text
msgid ""
"A `metadata.json` file that contains a description of the extension. This "
"file is written in JSON."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:278
+#: en/./developers/03_Backend/05_Extensions.md:52
+#, markdown-text
msgid ""
"An `extension.php` file containing the entry point of the extension (which "
"is a class that inherits Minz_Extension)."
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:282
+#: en/./developers/03_Backend/05_Extensions.md:56
+#, markdown-text
msgid ""
"Please note that there is a not a required link between the directory name "
"of the extension and the name of the class inside `extension.php`, but you "
@@ -2004,14 +1619,15 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:284
+#: en/./developers/03_Backend/05_Extensions.md:58
+#, markdown-text
msgid ""
"In the file `freshrss/extensions/xExtension-HelloWorld/extension.php` you "
"need the structure:"
msgstr ""
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:284
+#. type: Fenced code block (php)
+#: en/./developers/03_Backend/05_Extensions.md:58
#, no-wrap
msgid ""
"class HelloWorldExtension extends Minz_Extension {\n"
@@ -2022,28 +1638,32 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:292
+#: en/./developers/03_Backend/05_Extensions.md:67
+#, markdown-text
msgid ""
"There is an example HelloWorld extension that you can download from [our "
"GitHub repo](https://github.com/FreshRSS/xExtension-HelloWorld)."
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:294
+#: en/./developers/03_Backend/05_Extensions.md:69
+#, markdown-text
msgid ""
"You may also need additional files or subdirectories depending on your "
"needs:"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:300
+#: en/./developers/03_Backend/05_Extensions.md:75
+#, markdown-text
msgid ""
"`configure.phtml` is the file containing the form to parameterize your "
"extension"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:300
+#: en/./developers/03_Backend/05_Extensions.md:75
+#, markdown-text
msgid ""
"A `static/` directory containing CSS and JavaScript files that you will need "
"for your extension (note that if you need to write a lot of CSS it may be "
@@ -2051,38 +1671,43 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:300
+#: en/./developers/03_Backend/05_Extensions.md:75
+#, markdown-text
msgid "A `Controllers` directory containing additional controllers"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:300
+#: en/./developers/03_Backend/05_Extensions.md:75
+#, markdown-text
msgid "An `i18n` directory containing additional translations"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:300
+#: en/./developers/03_Backend/05_Extensions.md:75
+#, markdown-text
msgid ""
-"`layout` and` views` directories to define new views or to overwrite the "
+"`layout` and `views` directories to define new views or to overwrite the "
"current views"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:302
+#: en/./developers/03_Backend/05_Extensions.md:77
+#, markdown-text
msgid ""
"In addition, it is good to have a `LICENSE` file indicating the license "
-"under which your extension is distributed and a` README` file giving a "
+"under which your extension is distributed and a `README` file giving a "
"detailed description of it."
msgstr ""
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:303
-#, no-wrap
+#: en/./developers/03_Backend/05_Extensions.md:78
+#, markdown-text, no-wrap
msgid "The metadata.json file"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:306
+#: en/./developers/03_Backend/05_Extensions.md:81
+#, markdown-text
msgid ""
"The `metadata.json` file defines your extension through a number of "
"important elements. It must contain a valid JSON array containing the "
@@ -2090,187 +1715,200 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:313
+#: en/./developers/03_Backend/05_Extensions.md:89
+#, markdown-text
msgid "`name`: the name of your extension"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:313
+#: en/./developers/03_Backend/05_Extensions.md:89
+#, markdown-text
msgid ""
"`author`: your name, your e-mail address … but there is no specific format "
"to adopt"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:313
+#: en/./developers/03_Backend/05_Extensions.md:89
+#, markdown-text
msgid "`description`: a description of your extension"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:313
+#: en/./developers/03_Backend/05_Extensions.md:89
+#, markdown-text
msgid "`version`: the current version number of the extension"
msgstr ""
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:313
-msgid ""
-"`entrypoint`: Indicates the entry point of your extension. It must match the "
-"name of the class contained in the file `extension.php` without the suffix` "
-"Extension` (so if the entry point is `HelloWorld`, your class will be "
-"called` HelloWorldExtension`)"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:313
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:89
+#, markdown-text, no-wrap
msgid ""
-"`type`: Defines the type of your extension. There are two types: `system` "
-"and` user`. We will study this difference right after."
+"* `entrypoint`: Indicates the entry point of your extension. It must match "
+"the name of the class contained in the file `extension.php` without the "
+"suffix `Extension`\n"
+"(so if the entry point is `HelloWorld`, your class will be called "
+"`HelloWorldExtension`)\n"
+"* `type`: Defines the type of your extension. There are two types: `system` "
+"and `user`. We will study this difference right after.\n"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:315
-msgid "Only the `name` and` entrypoint` fields are required."
+#: en/./developers/03_Backend/05_Extensions.md:91
+#, markdown-text
+msgid "Only the `name` and `entrypoint` fields are required."
msgstr ""
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:316
-#, no-wrap
+#: en/./developers/03_Backend/05_Extensions.md:92
+#, markdown-text, no-wrap
msgid "Choosing between `system` and `user`"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:319
+#: en/./developers/03_Backend/05_Extensions.md:95
+#, markdown-text
msgid ""
-"A __user__ extension can be enabled by some users and not by others "
-"(typically for user preferences)."
+"A *user* extension can be enabled by some users and not by others (typically "
+"for user preferences)."
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:321
-msgid "A __system__ extension in comparison is enabled for every account."
+#: en/./developers/03_Backend/05_Extensions.md:97
+#, markdown-text
+msgid "A *system* extension in comparison is enabled for every account."
msgstr ""
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:322
-#, no-wrap
+#: en/./developers/03_Backend/05_Extensions.md:98
+#, markdown-text, no-wrap
msgid "Writing your own extension.php"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:327
-msgid ""
-"This file is the entry point of your extension. It must contain a specific "
-"class to function. As mentioned above, the name of the class must be your "
-"`entrypoint` suffixed by` Extension` (`HelloWorldExtension` for example). "
-"In addition, this class must be inherited from the `Minz_Extension` class to "
-"benefit from extensions-specific methods."
-msgstr ""
-
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:329
-msgid "Your class will benefit from four methods to redefine:"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:334
+#: en/./developers/03_Backend/05_Extensions.md:102
+#, markdown-text
msgid ""
-"`install()` is called when a user clicks the button to activate your "
-"extension. It allows, for example, to update the database of a user in order "
-"to make it compatible with the extension. It returns `true` if everything "
-"went well or, if not, a string explaining the problem."
+"This file is the core of your extension. It must define some key elements "
+"to be loaded by the extension system:"
msgstr ""
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:334
+#. type: Bullet: '1. '
+#: en/./developers/03_Backend/05_Extensions.md:106
+#, markdown-text
msgid ""
-"`uninstall()` is called when a user clicks the button to disable your "
-"extension. This will allow you to undo the database changes you potentially "
-"made in `install ()`. It returns `true` if everything went well or, if not, "
-"a string explaining the problem."
+"The class name must be the `entrypoint` value defined in the `metadata.json` "
+"file suffixed by `Extension` (if your `entrypoint` value is `HelloWorld`, "
+"your class name will be `HelloWorldExtension`)."
msgstr ""
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:334
+#. type: Bullet: '1. '
+#: en/./developers/03_Backend/05_Extensions.md:106
+#, markdown-text
msgid ""
-"`init()` is called for every page load *if the extension is enabled*. It "
-"will therefore initialize the behavior of the extension. This is the most "
-"important method."
+"The class must extend the `Minz_Extension` abstract class which defines the "
+"core methods and properties of a FreshRSS extension."
msgstr ""
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:334
+#. type: Bullet: '1. '
+#: en/./developers/03_Backend/05_Extensions.md:106
+#, markdown-text
msgid ""
-"`handleConfigureAction()` is called when a user loads the extension "
-"management panel. Specifically, it is called when the "
-"`?c=extension&a=configured&e=name-of-your-extension` URL is loaded. You "
-"should also write here the behavior you want when validating the form in "
-"your `configure.phtml` file."
+"The class must define the `init` method. This method is called **only** if "
+"the extension is loaded. Its purpose is to initialize the extension and its "
+"behavior during every page load."
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:336
+#: en/./developers/03_Backend/05_Extensions.md:111
+#, markdown-text
msgid ""
-"In addition, you will have a number of methods directly inherited from "
-"`Minz_Extension` that you should not redefine:"
+"The `Minz_Extension` abstract class defines a set of methods that can be "
+"overridden to fit your needs: * the `install` method is called when the user "
+"enables the extension in the configuration page. It must return `true` when "
+"successful and a string containing an error message when not. Its purpose is "
+"to prepare FreshRSS for the extension (adding a table to the database, "
+"creating a folder tree, …). * the `uninstall` method is called when the "
+"user disables the extension in the configuration page. It must return `true` "
+"when successful and a string containing an error message when not. Its "
+"purpose is to clean FreshRSS (removing a table from the database, deleting a "
+"folder tree, …). Usually it reverts changes introduced by the `install` "
+"method. * the `handleConfigureAction` method is called when a user loads "
+"the extension configuration panel. It contains the logic to validate and "
+"store the submitted values defined in the `configure.phtml` file."
msgstr ""
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:340
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:113
+#, markdown-text, no-wrap
msgid ""
-"The \"getters\" first: most are explicit enough not to detail them here - "
-"`getName()`, `getEntrypoint()`, `getPath()` (allows you to retrieve the path "
-"to your extension), `getAuthor()`, `getDescription()`, `getVersion()`, "
-"`getType()`."
+"> If your extension code is scattered in different classes, you need to load "
+"their source before using them. Of course you could include the files "
+"manually, but it’s more efficient to load them automatically. To do so, you "
+"just need to define the `autoload` method which will include them when "
+"needed. This method will be registered automatically when the extension is "
+"enabled.\n"
msgstr ""
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:340
-msgid ""
-"`getFileUrl($filename, $type)` will return the URL to a file in the `static` "
-"directory. The first parameter is the name of the file (without `static /`), "
-"the second is the type of file to be used (`css` or` js`)."
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:127
+#, markdown-text, no-wrap
+msgid ""
+"The `Minz_Extension` abstract class defines another set of methods that "
+"should not be overridden:\n"
+"* the `getName`, `getEntrypoint`, `getPath`, `getAuthor`, `getDescription`, "
+"`getVersion`, and `getType` methods return the extension internal "
+"properties. Those properties are extracted from the `metadata.json` file.\n"
+"* the `getFileUrl` returns the URL of the selected file. The file must exist "
+"in the `static` folder of the extension.\n"
+"* the `registerController` method register an extension controller in "
+"FreshRSS. The selected controller must be defined in the extension "
+"*Controllers* folder, its file name must be `\\<name\\>Controller.php`, and "
+"its class name must be `FreshExtension_\\<name\\>_Controller`.\n"
+"* the `registerViews` method registers the extension views in FreshRSS.\n"
+"* the `registerTranslates` method registers the extension translation files "
+"in FreshRSS.\n"
+"* the `registerHook` method registers hook actions in different part of the "
+"application.\n"
+"* the `getSystemConfiguration` method retrieves the extension configuration "
+"for the system.\n"
+"* the `setSystemConfiguration` method stores the extension configuration for "
+"the system.\n"
+"* the `removeSystemConfiguration` method removes the extension configuration "
+"for the system.\n"
+"* the `getUserConfiguration` method retrieves the extension configuration "
+"for the current user.\n"
+"* the `setUserConfiguration` method stores the extension configuration for "
+"the current user.\n"
+"* the `removeUserConfiguration` method removes the extension configuration "
+"for the current user.\n"
msgstr ""
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:340
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:129
+#, markdown-text, no-wrap
msgid ""
-"`registerController($base_name)` will tell Minz to take into account the "
-"given controller in the routing system. The controller must be located in "
-"your `Controllers` directory, the name of the file must be` "
-"<base_name>Controller.php` and the name of the "
-"`FreshExtension_<base_name>_Controller` class."
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:346
-msgid "`registerViews()`"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:346
-msgid "`registerTranslates()`"
-msgstr ""
-
-#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:346
-msgid "`registerHook($hook_name, $hook_function)`"
+"> Note that if you modify the later set of methods, you might break the "
+"extension system. Thus making FreshRSS unusable. So it’s highly recommended "
+"to let those unmodified.\n"
msgstr ""
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:347
-#, no-wrap
+#: en/./developers/03_Backend/05_Extensions.md:130
+#, markdown-text, no-wrap
msgid "The \"hooks\" system"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:350
+#: en/./developers/03_Backend/05_Extensions.md:133
+#, markdown-text
msgid ""
"You can register at the FreshRSS event system in an extensions `init()` "
"method, to manipulate data when some of the core functions are executed."
msgstr ""
-#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:351
+#. type: Fenced code block (html)
+#: en/./developers/03_Backend/05_Extensions.md:134
#, no-wrap
msgid ""
"class HelloWorldExtension extends Minz_Extension\n"
@@ -2287,21 +1925,24 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:365
+#: en/./developers/03_Backend/05_Extensions.md:148
+#, markdown-text
msgid "The following events are available:"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
msgid ""
"`check_url_before_add` (`function($url) -> Url | null`): will be executed "
"every time a URL is added. The URL itself will be passed as parameter. This "
-"way a website known to have feeds which does not advertise it in the header "
+"way a website known to have feeds which doesn’t advertise it in the header "
"can still be automatically supported."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
msgid ""
"`entry_before_display` (`function($entry) -> Entry | null`): will be "
"executed every time an entry is rendered. The entry itself (instance of "
@@ -2309,7 +1950,8 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
msgid ""
"`entry_before_insert` (`function($entry) -> Entry | null`): will be executed "
"when a feed is refreshed and new entries will be imported into the "
@@ -2318,7 +1960,8 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
msgid ""
"`feed_before_actualize` (`function($feed) -> Feed | null`): will be executed "
"when a feed is updated. The feed (instance of FreshRSS\\_Feed) will be "
@@ -2326,7 +1969,8 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
msgid ""
"`feed_before_insert` (`function($feed) -> Feed | null`): will be executed "
"when a new feed is imported into the database. The new feed (instance of "
@@ -2334,65 +1978,98 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
msgid ""
"`freshrss_init` (`function() -> none`): will be executed at the end of the "
"initialization of FreshRSS, useful to initialize components or to do "
-"additional access checks"
+"additional access checks."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
+msgid ""
+"`freshrss_user_maintenance` (`function() -> none`): will be executed for "
+"each user during the `actualize_script`, useful to run some maintenance "
+"tasks on the user."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
+msgid ""
+"`js_vars` (`function($vars = array) -> array | null`): will be executed if "
+"the `jsonVars` in the header will be generated."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
msgid ""
"`menu_admin_entry` (`function() -> string`): add an entry at the end of the "
"\"Administration\" menu, the returned string must be valid HTML (e.g. `<li "
-"class=\"item active\"><a href=\"url\">New entry</a></li>`)"
+"class=\"item active\"><a href=\"url\">New entry</a></li>`)."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
msgid ""
"`menu_configuration_entry` (`function() -> string`): add an entry at the end "
"of the \"Configuration\" menu, the returned string must be valid HTML "
-"(e.g. `<li class=\"item active\"><a href=\"url\">New entry</a></li>`)"
+"(e.g. `<li class=\"item active\"><a href=\"url\">New entry</a></li>`)."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
msgid ""
"`menu_other_entry` (`function() -> string`): add an entry at the end of the "
"header dropdown menu (i.e. after the \"About\" entry), the returned string "
"must be valid HTML (e.g. `<li class=\"item active\"><a href=\"url\">New "
-"entry</a></li>`)"
+"entry</a></li>`)."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
+msgid ""
+"`nav_menu` (`function() -> string`): will be executed if the navigation was "
+"built."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
msgid ""
"`nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** "
-"add documentation"
+"add documentation."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
-msgid "`post_update` (`function(none) -> none`): **TODO** add documentation"
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
+msgid "`post_update` (`function(none) -> none`): **TODO** add documentation."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/03_Backend/05_Extensions.md:378
+#: en/./developers/03_Backend/05_Extensions.md:164
+#, markdown-text
msgid ""
"`simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** "
-"add documentation"
+"add documentation."
msgstr ""
#. type: Title ###
-#: en/./developers/03_Backend/05_Extensions.md:379
-#, no-wrap
+#: en/./developers/03_Backend/05_Extensions.md:165
+#, markdown-text, no-wrap
msgid "Writing your own configure.phtml"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Backend/05_Extensions.md:382
+#: en/./developers/03_Backend/05_Extensions.md:168
+#, markdown-text
msgid ""
"When you want to support user configurations for your extension or simply "
"display some information, you have to create the `configure.phtml` file."
@@ -2400,12 +2077,13 @@ msgstr ""
#. type: Title #
#: en/./developers/03_Running_tests.md:1
-#, no-wrap
+#, markdown-text, no-wrap
msgid "Running tests"
msgstr ""
#. type: Plain text
#: en/./developers/03_Running_tests.md:4
+#, markdown-text
msgid ""
"FreshRSS is tested with [PHPUnit](https://phpunit.de/). No code should be "
"merged in `edge` if the tests don’t pass."
@@ -2413,25 +2091,27 @@ msgstr ""
#. type: Title ##
#: en/./developers/03_Running_tests.md:5
-#, no-wrap
+#, markdown-text, no-wrap
msgid "Locally"
msgstr ""
#. type: Plain text
#: en/./developers/03_Running_tests.md:8
+#, markdown-text
msgid ""
"As a developer, you can run the test suite on your PC easily with `make` "
"commands. You can run the test suite with:"
msgstr ""
-#. type: Plain text
+#. type: Fenced code block (sh)
#: en/./developers/03_Running_tests.md:9
#, no-wrap
-msgid "$ make test\n"
+msgid "make test\n"
msgstr ""
#. type: Plain text
#: en/./developers/03_Running_tests.md:14
+#, markdown-text
msgid ""
"This command downloads the PHPUnit binary and verifies its checksum. If the "
"verification fails, the file is deleted. In this case, you should [open an "
@@ -2441,83 +2121,309 @@ msgstr ""
#. type: Plain text
#: en/./developers/03_Running_tests.md:16
+#, markdown-text
msgid ""
"Then, it executes PHPUnit in a Docker container. If you don’t use Docker, "
"you can run the command directly with:"
msgstr ""
-#. type: Plain text
+#. type: Fenced code block (sh)
#: en/./developers/03_Running_tests.md:17
#, no-wrap
-msgid "$ NO_DOCKER=true make test\n"
+msgid "NO_DOCKER=true make test\n"
msgstr ""
-#. type: Title ##
-#: en/./developers/03_Running_tests.md:21
+#. type: Plain text
+#: en/./developers/03_Running_tests.md:22
+#, markdown-text
+msgid "The linter can be run with a `make` command as well:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/03_Running_tests.md:23
#, no-wrap
-msgid "Travis"
+msgid ""
+"make lint # to execute the linter on the PHP files\n"
+"make lint-fix # or, to fix the errors detected by the linter\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Running_tests.md:29
+#, markdown-text
+msgid ""
+"Similarly to PHPUnit, it downloads a "
+"[PHP\\_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) binary "
+"(i.e. `phpcs` or `phpcbf` depending on the command) and verifies its "
+"checksum."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/03_Running_tests.md:30
+#, markdown-text, no-wrap
+msgid "GitHub Actions for Continuous Integration"
msgstr ""
#. type: Plain text
-#: en/./developers/03_Running_tests.md:24
+#: en/./developers/03_Running_tests.md:35
+#, markdown-text
msgid ""
-"Tests are automatically run when you open a pull request on GitHub. It is "
-"done with [Travis CI](https://travis-ci.org/FreshRSS/FreshRSS/). This is "
-"done to ensure there is no regressions in your code. We cannot merge a PR if "
-"the tests fail so we will ask you to fix bugs before to review your code."
+"Tests are automatically run when you open a pull request on GitHub. They "
+"are performed with [GitHub "
+"Actions](https://github.com/FreshRSS/FreshRSS/actions). This ensures your "
+"code will not introduce some kind of regression. We will not merge a PR if "
+"tests fail so we will ask you to fix any bugs before reviewing your code."
msgstr ""
#. type: Plain text
-#: en/./developers/03_Running_tests.md:25
+#: en/./developers/03_Running_tests.md:37
+#, markdown-text
msgid ""
-"If you’re interested in, you can take a look at [the configuration "
-"file](https://github.com/FreshRSS/FreshRSS/blob/edge/.travis.yml)."
+"If you are interested, you can take a look at [the configuration "
+"file](https://github.com/FreshRSS/FreshRSS/blob/edge/.github/workflows/tests.yml)."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/03_Running_tests.md:38
+#, markdown-text, no-wrap
+msgid "Using feed snapshots"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Running_tests.md:42
+#, markdown-text
+msgid ""
+"As feed data is volatile, it’s better to work with snapshots when debugging "
+"some issues. You can find the description to retrieve a snapshot "
+"[here](06_Reporting_Bugs.md#how-to-provide-feed-data)."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Running_tests.md:46
+#, markdown-text
+msgid ""
+"To serve those snapshots, you can use a mock server. Here we will "
+"demonstrate how to work with [WireMock](https://wiremock.org/) but other "
+"solutions exist. Here are the steps to start using the WireMock mock "
+"server:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Running_tests.md:76
+#, markdown-text, no-wrap
+msgid ""
+"1. Go to the mock server home folder.\n"
+"If you do not have one, you need to create one.\n"
+"1. Inside the mock server home folder, create the ___file_ and _mappings_ "
+"folders.\n"
+"1. Copy or move your snapshots in the ___file_ folder.\n"
+"1. Create the _feed.json_ file in the _mappings_ folder with the following "
+"content:\n"
+"\t```js\n"
+"\t{\n"
+"\t\t\"request\": {\n"
+"\t\t\t\"method\": \"GET\",\n"
+"\t\t\t\"urlPathPattern\": \"/.*\"\n"
+"\t\t},\n"
+"\t\t\"response\": {\n"
+"\t\t\t\"status\": 200,\n"
+"\t\t\t\"bodyFileName\": \"{{request.pathSegments.[0]}}\",\n"
+"\t\t\t\"transformers\": [\"response-template\"],\n"
+"\t\t\t\"headers\": {\n"
+"\t\t\t\t\"Content-Type\": \"application/rss+xml\"\n"
+"\t\t\t}\n"
+"\t\t}\n"
+"\t}\n"
+"\t```\n"
+"1. Launch the containerized server with the following command:\n"
+"\t```bash\n"
+"\t# <PORT> is the port used on the host to communicate with the server\n"
+"\t# <NETWORK> is the name of the docker network used (by default, it’s "
+"freshrss-network)\n"
+"\tdocker run -it --rm -p <PORT>:8080 --name wiremock --network <NETWORK> -v "
+"$PWD:/home/wiremock wiremock/wiremock:latest-alpine "
+"--local-response-templating\n"
+"\t```\n"
+"1. You can access the `<RSS>` mock file directly:\n"
+" * from the host by sending a GET request to "
+"`http://localhost:<PORT>/<RSS>`,\n"
+" * from any container connected on the same network by sending a GET "
+"request to `http://wiremock:8080/<RSS>`.\n"
msgstr ""
#. type: Title #
#: en/./developers/04_Frontend/01_View_files.md:1
-#, no-wrap
+#, markdown-text, no-wrap
+msgid "View files"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/04_Frontend/01_View_files.md:3
+#, markdown-text, no-wrap
msgid "The .phtml files"
msgstr ""
-#. type: Title #
-#: en/./developers/04_Frontend/01_View_files.md:5
-#, no-wrap
+#. type: Title ##
+#: en/./developers/04_Frontend/01_View_files.md:7
+#, markdown-text, no-wrap
msgid "Writing a URL"
msgstr ""
-#. type: Title #
-#: en/./developers/04_Frontend/01_View_files.md:9
-#, no-wrap
+#. type: Title ##
+#: en/./developers/04_Frontend/01_View_files.md:11
+#, markdown-text, no-wrap
msgid "Displaying an icon"
msgstr ""
+#. type: Title ##
+#: en/./developers/04_Frontend/01_View_files.md:15
+#, markdown-text, no-wrap
+msgid "Internationalisation"
+msgstr ""
+
#. type: Title #
#: en/./developers/04_Frontend/02_Design.md:1
-#, no-wrap
+#, markdown-text, no-wrap
+msgid "Writing a new theme"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:4
+#, markdown-text, no-wrap
+msgid ""
+"**Note: Currently personal themes are not officially supported and may be "
+"overwritten when updating. Be sure to keep backups!**\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:6
+#, markdown-text, no-wrap
+msgid ""
+"**As of writing (02-02-2021), support for themes as extensions is under "
+"development.**\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:8
+#, markdown-text
+msgid ""
+"The easiest way to create a theme is by copying and modifying the base theme "
+"(or another of the pre-installed themes). The base theme can be found in "
+"[/p/themes/base-theme](https://github.com/FreshRSS/FreshRSS/tree/edge/p/themes/base-theme). "
+"Themes require:"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/04_Frontend/02_Design.md:13
+#, markdown-text
+msgid "a **metadata.json** file to describe the theme."
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/04_Frontend/02_Design.md:13
+#, markdown-text
+msgid ""
+"a **loader.gif** file to use as a loading icon (assuming .loading’s "
+"background has not been overridden)"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/04_Frontend/02_Design.md:13
+#, markdown-text
+msgid ""
+"an **icons** folder containing .svg, .ico, and .png files to override "
+"existing icons"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./developers/04_Frontend/02_Design.md:13
+#, markdown-text
+msgid ""
+"a **thumbs** folder containing a file, **original.png** that will be used as "
+"the preview for the theme"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:15
+#, markdown-text
+msgid ""
+"\"_frss.css\" is normally added to the metadata file as a fallback for "
+"missing aspects. The file is taken from the base theme. If submitting a pull "
+"request for a theme, please know that [pull request themes must include this "
+"file.](https://github.com/FreshRSS/FreshRSS/pull/2938#issuecomment-624085450)"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/04_Frontend/02_Design.md:16
+#, markdown-text, no-wrap
+msgid "RTL Support"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:19
+#, markdown-text
+msgid ""
+"RTL (right-to-left) support for languages such as Hebrew and Arabic is "
+"handled through CSSJanus. To generate an RTL CSS file from your standard "
+"file, use `make rtl`. Be sure to commit the resulting file "
+"(filename.rtl.css)."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/04_Frontend/02_Design.md:20
+#, markdown-text, no-wrap
+msgid "Overriding icons"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:23
+#, markdown-text
+msgid ""
+"To replace the default icons, add an \"icons\" folder to your theme’s "
+"folder. Use files with the same name as the default icon to override them."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/04_Frontend/02_Design.md:24
+#, markdown-text, no-wrap
msgid "Template file"
msgstr ""
-#. type: Title #
-#: en/./developers/04_Frontend/02_Design.md:5
-#, no-wrap
-msgid "Writing a new theme"
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:27
+#, markdown-text
+msgid "`metadata.json`"
msgstr ""
-#. type: Title #
-#: en/./developers/04_Frontend/02_Design.md:9
+#. type: Fenced code block (json)
+#: en/./developers/04_Frontend/02_Design.md:28
#, no-wrap
-msgid "Overriding icons"
+msgid ""
+"{\n"
+"\t\"name\": \"Theme name\",\n"
+"\t\"author\": \"Theme author\",\n"
+"\t\"description\": \"Theme description\",\n"
+"\t\"version\": 0.1,\n"
+"\t\"files\": [\"_frss.css\", \"file1.css\", \"file2.css\"]\n"
+"}\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Frontend/02_Design.md:38
+#, markdown-text
+msgid ""
+"An example of a css theme file can be found at "
+"[/p/themes/base-theme/base.css](https://github.com/FreshRSS/FreshRSS/blob/edge/p/themes/base-theme/base.css)"
msgstr ""
#. type: Title #
#: en/./developers/04_Pull_requests.md:1
-#, no-wrap
+#, markdown-text, no-wrap
msgid "Opening a pull request"
msgstr ""
#. type: Plain text
#: en/./developers/04_Pull_requests.md:4
+#, markdown-text
msgid ""
"So you want to propose a patch to the community? It’s time to open a [pull "
"request](https://github.com/FreshRSS/FreshRSS/pulls)!"
@@ -2525,6 +2431,7 @@ msgstr ""
#. type: Plain text
#: en/./developers/04_Pull_requests.md:6
+#, markdown-text
msgid ""
"When you open a PR, your message will be prefilled with a message based on "
"[a "
@@ -2536,17 +2443,28 @@ msgstr ""
#. type: Plain text
#: en/./developers/04_Pull_requests.md:8
+#, markdown-text
msgid "The rest of this document explains specific points."
msgstr ""
#. type: Title ##
#: en/./developers/04_Pull_requests.md:9
-#, no-wrap
+#, markdown-text, no-wrap
msgid "How to rebase your branch on `edge`"
msgstr ""
#. type: Plain text
#: en/./developers/04_Pull_requests.md:12
+#, markdown-text, no-wrap
+msgid ""
+"**TODO:** Update this section. With GitHub’s *squash and merge*, rebasing "
+"(and other forms of history rewriting) is more dangerous and annoying "
+"(e.g. breaking review mechanism) than useful.\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/04_Pull_requests.md:14
+#, markdown-text
msgid ""
"Rebasing a branch is useful to make sure your code is based on the most "
"recent version of FreshRSS and there are no conflicts. You have two ways to "
@@ -2554,20 +2472,22 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:14
+#: en/./developers/04_Pull_requests.md:16
+#, markdown-text
msgid ""
"If you have any doubt, please let us know and we’ll help you! We all began "
"with Git one day and it’s not an easy thing to work with."
msgstr ""
#. type: Title ###
-#: en/./developers/04_Pull_requests.md:15
-#, no-wrap
+#: en/./developers/04_Pull_requests.md:17
+#, markdown-text, no-wrap
msgid "Rebasing"
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:18
+#: en/./developers/04_Pull_requests.md:20
+#, markdown-text
msgid ""
"Rebasing is the cleanest method because the Git history will be completely "
"linear and consequently easier to read and navigate. It might also be more "
@@ -2576,7 +2496,8 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:20
+#: en/./developers/04_Pull_requests.md:22
+#, markdown-text
msgid ""
"Note that you should never rebase a branch if someone else is working on "
"it. Otherwise, since it rewrites the history, it can be a real mess to sort "
@@ -2584,35 +2505,38 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:22
+#: en/./developers/04_Pull_requests.md:24
+#, markdown-text
msgid "To rebase a branch:"
msgstr ""
-#. type: Plain text
-#: en/./developers/04_Pull_requests.md:23
+#. type: Fenced code block (sh)
+#: en/./developers/04_Pull_requests.md:25
#, no-wrap
msgid ""
-"$ git checkout edge # go on edge branch\n"
-"$ git pull upstream edge # pull the last version of edge\n"
-"$ git checkout - # go back to your branch\n"
-"$ git rebase edge # rebase your branch on edge\n"
+"git checkout edge # go on edge branch\n"
+"git pull upstream edge # pull the last version of edge\n"
+"git checkout - # go back to your branch\n"
+"git rebase edge # rebase your branch on edge\n"
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:31
+#: en/./developers/04_Pull_requests.md:33
+#, markdown-text
msgid ""
"If you feel confident, you can use `git rebase -i edge` to rewrite your "
"history and make it clearer."
msgstr ""
#. type: Title ###
-#: en/./developers/04_Pull_requests.md:32
-#, no-wrap
+#: en/./developers/04_Pull_requests.md:34
+#, markdown-text, no-wrap
msgid "Merging"
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:35
+#: en/./developers/04_Pull_requests.md:37
+#, markdown-text
msgid ""
"If you prefer, you can simply merge `edge` into your own branch. Conflicts "
"might be easier to resolve, but your Git history will be less "
@@ -2621,28 +2545,30 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:37
+#: en/./developers/04_Pull_requests.md:39
+#, markdown-text
msgid "To merge `edge`:"
msgstr ""
-#. type: Plain text
-#: en/./developers/04_Pull_requests.md:38
+#. type: Fenced code block (sh)
+#: en/./developers/04_Pull_requests.md:40
#, no-wrap
msgid ""
-"$ git checkout edge # go on edge branch\n"
-"$ git pull upstream edge # pull the last version of edge\n"
-"$ git checkout - # go back to your branch\n"
-"$ git merge edge # merge edge into your branch\n"
+"git checkout edge # go on edge branch\n"
+"git pull upstream edge # pull the last version of edge\n"
+"git checkout - # go back to your branch\n"
+"git merge edge # merge edge into your branch\n"
msgstr ""
#. type: Title ##
-#: en/./developers/04_Pull_requests.md:45
-#, no-wrap
+#: en/./developers/04_Pull_requests.md:47
+#, markdown-text, no-wrap
msgid "How to write a Git commit message"
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:48
+#: en/./developers/04_Pull_requests.md:50
+#, markdown-text
msgid ""
"It’s important to have proper commit messages in order to facilitate later "
"debugging, so please read the following advice. Commit messages should "
@@ -2650,22 +2576,25 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:50
+#: en/./developers/04_Pull_requests.md:52
+#, markdown-text
msgid ""
-"The first line should start with a verb (e.g., \"Add\") and explain the "
+"The first line should start with a verb (e.g., “Add”) and explain the "
"objective of the commit in few words. It’s usually less than 50 characters "
"so it remains concise. You can consider this line the subject of your "
"commit. Think of it as the second part of a sentence that starts with the "
-"words \"This commit will.\""
+"words “This commit will.”"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/04_Pull_requests.md:52
+#: en/./developers/04_Pull_requests.md:54
+#, markdown-text
msgid "This commit will *add feature X*"
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:54
+#: en/./developers/04_Pull_requests.md:56
+#, markdown-text
msgid ""
"Then, insert a blank line, and start to write the body. It’s usually wrapped "
"at 72 characters, but you are pretty free in the tone of the message. The "
@@ -2677,27 +2606,30 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:56
+#: en/./developers/04_Pull_requests.md:58
+#, markdown-text
msgid ""
"You also can add references (e.g., the URL to the initial ticket in the bug "
"tracker, or a reference to some forum explaining a point)."
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:58
+#: en/./developers/04_Pull_requests.md:60
+#, markdown-text
msgid ""
"You can find more information about commit messages [on this blog "
"post](https://chris.beams.io/posts/git-commit/)."
msgstr ""
#. type: Title ##
-#: en/./developers/04_Pull_requests.md:59
-#, no-wrap
+#: en/./developers/04_Pull_requests.md:61
+#, markdown-text, no-wrap
msgid "How to write tests"
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:62
+#: en/./developers/04_Pull_requests.md:64
+#, markdown-text
msgid ""
"FreshRSS has few tests for now, but we’re working on it. We added this point "
"to the checklist to help us to write more tests, and we would really "
@@ -2705,34 +2637,38 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:64
+#: en/./developers/04_Pull_requests.md:66
+#, markdown-text
msgid ""
"We use [PHPUnit](https://phpunit.de/) version 7.5 "
"([documentation](https://phpunit.readthedocs.io/en/7.5/))."
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:66
+#: en/./developers/04_Pull_requests.md:68
+#, markdown-text
msgid ""
"You’ll find more information on how to run tests [in this "
"document](03_Running_tests.md)."
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:68
+#: en/./developers/04_Pull_requests.md:70
+#, markdown-text
msgid ""
"Feel free to ask us for assistance. Not everything will be easy to test, so "
"don’t spend too much time on this."
msgstr ""
#. type: Title ##
-#: en/./developers/04_Pull_requests.md:69
-#, no-wrap
+#: en/./developers/04_Pull_requests.md:71
+#, markdown-text, no-wrap
msgid "Why you should write documentation"
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:72
+#: en/./developers/04_Pull_requests.md:74
+#, markdown-text
msgid ""
"A friendly project should have correct and complete documentation, so "
"newcomers don’t have to ask too many questions, and users can find answers "
@@ -2741,7 +2677,8 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/04_Pull_requests.md:73
+#: en/./developers/04_Pull_requests.md:75
+#, markdown-text
msgid ""
"Our documentation can still be improved quite a bit, so you’re very welcome "
"if you want to help."
@@ -2749,33 +2686,35 @@ msgstr ""
#. type: Title #
#: en/./developers/05_Release_new_version.md:1
-#, no-wrap
+#, markdown-text, no-wrap
msgid "Preparing the release"
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:4
+#: en/./developers/05_Release_new_version.md:5
+#, markdown-text
msgid ""
"In order to get as much feedback as possible before a release, it’s "
"preferable to announce it on GitHub by creating a dedicated ticket ([see "
-"examples] "
-"(https://github.com/FreshRSS/FreshRSS/search?utf8=%E2%9C%93&q=Call+for+testing&type=Issues)). "
+"examples](https://github.com/FreshRSS/FreshRSS/search?utf8=%E2%9C%93&q=Call+for+testing&type=Issues)). "
"This should be done **at least one week in advance**."
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:6
+#: en/./developers/05_Release_new_version.md:7
+#, markdown-text
msgid "It’s also recommended to make the announcement on mailing@freshrss.org."
msgstr ""
-#. type: Title #
-#: en/./developers/05_Release_new_version.md:7
-#, no-wrap
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:8
+#, markdown-text, no-wrap
msgid "Check the dev status"
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:10
+#: en/./developers/05_Release_new_version.md:11
+#, markdown-text
msgid ""
"Before releasing a new version of FreshRSS, you must ensure that the code is "
"stable and free of major bugs. Ideally, our tests should be automated and "
@@ -2783,20 +2722,21 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:12
+#: en/./developers/05_Release_new_version.md:13
+#, markdown-text
msgid ""
"You must also **make sure that the CHANGELOG file is up to date** with the "
"updates of the version to be released."
msgstr ""
-#. type: Title #
-#: en/./developers/05_Release_new_version.md:13
-#, no-wrap
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:14
+#, markdown-text, no-wrap
msgid "Git process"
msgstr ""
-#. type: Plain text
-#: en/./developers/05_Release_new_version.md:15
+#. type: Fenced code block (console)
+#: en/./developers/05_Release_new_version.md:16
#, no-wrap
msgid ""
"$ git checkout edge\n"
@@ -2810,45 +2750,48 @@ msgid ""
"$ git push && git push --tags\n"
msgstr ""
-#. type: Title #
-#: en/./developers/05_Release_new_version.md:27
-#, no-wrap
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:28
+#, markdown-text, no-wrap
msgid "Updating `update.freshrss.org`"
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:30
+#: en/./developers/05_Release_new_version.md:31
+#, markdown-text
msgid ""
"It’s important to update update.freshrss.org since this is the default "
"service for automatic FreshRSS updates."
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:32
+#: en/./developers/05_Release_new_version.md:33
+#, markdown-text
msgid ""
"The repository managing the code is located on GitHub: "
-"[FreshRSS/update.freshrss.org] "
-"(https://github.com/FreshRSS/update.freshrss.org/)."
+"[FreshRSS/update.freshrss.org](https://github.com/FreshRSS/update.freshrss.org/)."
msgstr ""
#. type: Title ##
-#: en/./developers/05_Release_new_version.md:33
-#, no-wrap
+#: en/./developers/05_Release_new_version.md:34
+#, markdown-text, no-wrap
msgid "Writing the update script"
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:36
+#: en/./developers/05_Release_new_version.md:37
+#, markdown-text
msgid ""
"The scripts are located in the `./scripts/` directory and must take the form "
"`update_to_x.y.z.z.php`. This directory also contains `update_to_dev.php` "
-"intended for updates of the `edge` branch (this script must not include "
-"code specific to a particular version!) and `update_util.php`, which "
-"contains a list of functions useful for all scripts."
+"intended for updates of the `edge` branch (this script must not include code "
+"specific to a particular version!) and `update_util.php`, which contains a "
+"list of functions useful for all scripts."
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:38
+#: en/./developers/05_Release_new_version.md:39
+#, markdown-text
msgid ""
"In order to write a new script, it’s better to copy/paste the last version "
"or to start from `update_to_dev.php`. The first thing to do is to define the "
@@ -2858,12 +2801,14 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:40
+#: en/./developers/05_Release_new_version.md:41
+#, markdown-text
msgid "There are then 5 functions that have to be executed:"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:46
+#: en/./developers/05_Release_new_version.md:47
+#, markdown-text
msgid ""
"`apply_update()` takes care of saving the directory containing the data, "
"checking its structure, downloading the FreshRSS package, deploying it and "
@@ -2873,28 +2818,32 @@ msgid ""
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:46
+#: en/./developers/05_Release_new_version.md:47
+#, markdown-text
msgid ""
"`need_info_update()` returns `true` if the user must intervene during the "
"update or `false` if not;"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:46
+#: en/./developers/05_Release_new_version.md:47
+#, markdown-text
msgid ""
"`ask_info_update()` displays a form to the user if `need_info_update()` has "
"returned `true`;"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:46
+#: en/./developers/05_Release_new_version.md:47
+#, markdown-text
msgid ""
"`save_info_update()` is responsible for saving the information filled out by "
"the user (from the `ask_info_update()` form);"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:46
+#: en/./developers/05_Release_new_version.md:47
+#, markdown-text
msgid ""
"`do_post_update()` is executed at the end of the update and takes into "
"account the code of the new version (e.g., if the new version changes the "
@@ -2902,13 +2851,14 @@ msgid ""
msgstr ""
#. type: Title ##
-#: en/./developers/05_Release_new_version.md:47
-#, no-wrap
+#: en/./developers/05_Release_new_version.md:48
+#, markdown-text, no-wrap
msgid "Updating the versions file"
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:50
+#: en/./developers/05_Release_new_version.md:51
+#, markdown-text
msgid ""
"Once the script has been written and versioned, it’s necessary to update the "
"`./versions.php' file which contains a mapping table indicating which "
@@ -2916,12 +2866,13 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:52
+#: en/./developers/05_Release_new_version.md:53
+#, markdown-text
msgid "Here’s an example of a `versions.php` file:"
msgstr ""
-#. type: Plain text
-#: en/./developers/05_Release_new_version.md:53
+#. type: Fenced code block (php)
+#: en/./developers/05_Release_new_version.md:54
#, no-wrap
msgid ""
"<?php\n"
@@ -2929,7 +2880,7 @@ msgid ""
"\t// STABLE\n"
"\t'0.8.0' => '1.0.0',\n"
"\t'0.8.1' => '1.0.0',\n"
-"\t'1.0.0' => '1.0.1', // does not exist (yet)\n"
+"\t'1.0.0' => '1.0.1', // doesn’t exist (yet)\n"
"\t// DEV\n"
"\t'1.1.2-dev' => 'dev',\n"
"\t'1.1.3-dev' => 'dev',\n"
@@ -2938,34 +2889,40 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:68
+#: en/./developers/05_Release_new_version.md:69
+#, markdown-text
msgid "And here’s how this table works:"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:74
+#: en/./developers/05_Release_new_version.md:75
+#, markdown-text
msgid "on the left you can find the N version, on the right the N+1 version;"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:74
+#: en/./developers/05_Release_new_version.md:75
+#, markdown-text
msgid "the `x.y.z.z-dev` versions are **all** updated to `edge`;"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:74
+#: en/./developers/05_Release_new_version.md:75
+#, markdown-text
msgid "stable versions are updated to stable versions;"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:74
+#: en/./developers/05_Release_new_version.md:75
+#, markdown-text
msgid ""
"it’s possible to skip several versions at once, provided that the update "
"scripts support it;"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:74
+#: en/./developers/05_Release_new_version.md:75
+#, markdown-text
msgid ""
"it’s advisable to indicate the correspondence of the current version to its "
"potential future version by specifying that this version does not yet "
@@ -2974,20 +2931,22 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:76
+#: en/./developers/05_Release_new_version.md:77
+#, markdown-text
msgid ""
-"It’s **very strongly** recommended to keep this file organized according to "
+"It’s**very strongly** recommended to keep this file organized according to "
"version numbers by separating stable and dev versions."
msgstr ""
#. type: Title ##
-#: en/./developers/05_Release_new_version.md:77
-#, no-wrap
+#: en/./developers/05_Release_new_version.md:78
+#, markdown-text, no-wrap
msgid "Deployment"
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:80
+#: en/./developers/05_Release_new_version.md:81
+#, markdown-text
msgid ""
"Before updating update.freshrss.org, it’s better to test with "
"dev.update.freshrss.org, which corresponds to pre-production. So update "
@@ -2996,76 +2955,85 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:82
+#: en/./developers/05_Release_new_version.md:83
+#, markdown-text
msgid ""
"When you’re satisfied, update update.freshrss.org with the new script, test "
"it again, and then move on."
msgstr ""
-#. type: Title #
-#: en/./developers/05_Release_new_version.md:83
-#, no-wrap
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:84
+#, markdown-text, no-wrap
msgid "Updating the FreshRSS services"
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:86
+#: en/./developers/05_Release_new_version.md:87
+#, markdown-text
msgid "Two services need to be updated immediately after the update."
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:89
+#: en/./developers/05_Release_new_version.md:90
+#, markdown-text
msgid "rss.freshrss.org;"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:89
+#: en/./developers/05_Release_new_version.md:90
+#, markdown-text
msgid "demo.freshrss.org (public login: `demo` / `demodemo`)."
msgstr ""
-#. type: Title #
-#: en/./developers/05_Release_new_version.md:90
-#, no-wrap
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:91
+#, markdown-text, no-wrap
msgid "Publicly announce the release"
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:93
+#: en/./developers/05_Release_new_version.md:94
+#, markdown-text
msgid "When everything’s working, it’s time to announce the release to the world!"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:98
+#: en/./developers/05_Release_new_version.md:99
+#, markdown-text
msgid ""
"on GitHub by creating[a new "
"release](https://github.com/FreshRSS/FreshRSS/releases/new)"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:98
+#: en/./developers/05_Release_new_version.md:99
+#, markdown-text
msgid ""
"on the freshrss.org blog, at least for stable versions (write the article "
"on[FreshRSS/freshrss.org](https://github.com/FreshRSS/freshrss.org))"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:98
+#: en/./developers/05_Release_new_version.md:99
+#, markdown-text
msgid "on Twitter ([@FreshRSS](https://twitter.com/FreshRSS) account)"
msgstr ""
#. type: Bullet: '* '
-#: en/./developers/05_Release_new_version.md:98
+#: en/./developers/05_Release_new_version.md:99
+#, markdown-text
msgid "and on mailing@freshrss.org"
msgstr ""
-#. type: Title #
-#: en/./developers/05_Release_new_version.md:99
-#, no-wrap
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:100
+#, markdown-text, no-wrap
msgid "Starting the next development version"
msgstr ""
-#. type: Plain text
-#: en/./developers/05_Release_new_version.md:101
+#. type: Fenced code block (console)
+#: en/./developers/05_Release_new_version.md:102
#, no-wrap
msgid ""
"$ git checkout edge\n"
@@ -3077,1337 +3045,2947 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./developers/05_Release_new_version.md:110
+#: en/./developers/05_Release_new_version.md:111
+#, markdown-text
msgid ""
"Also remember to update update.freshrss.org so that it takes the current "
"development version into account."
msgstr ""
+#. type: Title #
+#: en/./developers/06_Fever_API.md:1
+#, markdown-text, no-wrap
+msgid "FreshRSS - Fever API implementation"
+msgstr ""
+
#. type: Plain text
-#: en/./index.md:2
-msgid "![FreshRSS logo](img/logo_freshrss.png)"
+#: en/./developers/06_Fever_API.md:5
+#, markdown-text
+msgid ""
+"See [Mobile access](../users/06_Mobile_access.md) for general aspects of API "
+"access. Additionally [page about our Google Reader compatible "
+"API](06_GoogleReader_API.md) for another possibility."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_Fever_API.md:7 en/./developers/06_GoogleReader_API.md:7
+#, markdown-text, no-wrap
+msgid "RSS clients"
msgstr ""
#. type: Plain text
-#: en/./index.md:4
+#: en/./developers/06_Fever_API.md:12
+#, markdown-text
msgid ""
-"FreshRSS is an RSS aggregator and reader. It allows you to read and follow "
-"several news websites at a glance without the need to browse from one "
-"website to another."
+"There are many RSS clients that support the Fever API, but they seem to "
+"understand the Fever API a bit differently. If your favourite client "
+"doesn’t work properly with this API, please create an issue and we’ll have a "
+"look. But we can **only** do that for free clients."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_Fever_API.md:13 en/./developers/06_GoogleReader_API.md:13
+#, markdown-text, no-wrap
+msgid "Usage & Authentication"
msgstr ""
#. type: Plain text
-#: en/./index.md:6
-msgid "FreshRSS has a lot of features including:"
+#: en/./developers/06_Fever_API.md:17 en/./developers/06_GoogleReader_API.md:17
+#, markdown-text
+msgid ""
+"Before you can start using this API, you have to enable and setup API "
+"access, which is [documented here](../users/06_Mobile_access.md), and then "
+"reset the user’s API password."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:19
+#, markdown-text
+msgid ""
+"Then point your mobile application to the `fever.php` address "
+"(e.g. `https://freshrss.example.net/api/fever.php`)."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_Fever_API.md:20 en/./developers/06_GoogleReader_API.md:20
+#, markdown-text, no-wrap
+msgid "Compatible clients"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:31
+#, markdown-text, no-wrap
+msgid ""
+"| App "
+"| Platform | License "
+"|\n"
+"|:----------------------------------------------------------------------------------:|:-------------------:|:--------------------------------------------------------:|\n"
+"|[Fluent Reader](https://hyliu.me/fluent-reader/) "
+"|Windows, Linux, "
+"macOS|[BSD-3-Clause](https://github.com/yang991178/fluent-reader/blob/master/LICENSE)|\n"
+"|[Fluent Reader lite](https://hyliu.me/fluent-reader-lite/) "
+"|Android, iOS "
+"|[BSD-3-Clause](https://github.com/yang991178/fluent-reader-lite)|\n"
+"|[Fiery "
+"Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) "
+"|iOS |Closed Source "
+"|\n"
+"|[Newsflash](https://gitlab.com/news-flash/news_flash_gtk/) "
+"|Linux "
+"|[GPLv3](https://gitlab.com/news-flash/news_flash_gtk/)|\n"
+"|[Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) "
+"|iOS |Closed Source "
+"|\n"
+"|[Reeder](https://www.reederapp.com/) "
+"|iOS |Closed Source "
+"|\n"
+"|[ReadKit](https://apps.apple.com/app/readkit/id588726889) "
+"|macOS |Closed Source "
+"|\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_Fever_API.md:32 en/./index.md:7
+#, markdown-text, no-wrap
+msgid "Features"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:35
+#, markdown-text
+msgid "The following features are implemented:"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:18
-msgid "RSS and Atom aggregation"
+#: en/./developers/06_Fever_API.md:45
+#, markdown-text
+msgid "fetching categories"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:18
-msgid "Mark article as favorite if you liked it or if you want to read it later"
+#: en/./developers/06_Fever_API.md:45
+#, markdown-text
+msgid "fetching feeds"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:18
-msgid "Filter and search functionality helps to easily find articles"
+#: en/./developers/06_Fever_API.md:45
+#, markdown-text
+msgid ""
+"fetching RSS items (new, favorites, unread, by_id, by_feed, by_category, "
+"since)"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:18
-msgid "Statistics to show you the publishing frequency all the websites you follow"
+#: en/./developers/06_Fever_API.md:45
+#, markdown-text
+msgid "fetching favicons"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:18
-msgid "Import/export of your feeds into OPML format"
+#: en/./developers/06_Fever_API.md:45
+#, markdown-text
+msgid "setting read marker for item(s)"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:18
-msgid "Several themes created by the community"
+#: en/./developers/06_Fever_API.md:45
+#, markdown-text
+msgid "setting starred marker for item(s)"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:18
-msgid "\"Google Reader\"-like API to connect Android applications"
+#: en/./developers/06_Fever_API.md:45
+#, markdown-text
+msgid "setting read marker for feed"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:18
-msgid ""
-"The application is \"responsive,\" which means it adapts to small screens so "
-"you can bring articles in your pocket"
+#: en/./developers/06_Fever_API.md:45
+#, markdown-text
+msgid "setting read marker for category"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:45
+#, markdown-text
+msgid "supports FreshRSS extensions, which use the `entry_before_display` hook"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:47
+#, markdown-text
+msgid "The following features are not supported:"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:18
+#: en/./developers/06_Fever_API.md:49
+#, markdown-text
msgid ""
-"Self-hosted: the code is free (under AGPL3 licence), so you can host your "
-"own instance of FreshRSS"
+"**Hot Links** aka **hot** as there is nothing in FreshRSS yet that is "
+"similar or could be used to simulate it."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_Fever_API.md:50
+#, markdown-text, no-wrap
+msgid "Testing and debugging"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:53
+#, markdown-text
+msgid ""
+"If this API does not work as expected in your RSS reader, you can test it "
+"manually with a tool like [Postman](https://www.getpostman.com/)."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:55
+#, markdown-text
+msgid ""
+"Configure a POST request to the URL "
+"<https://freshrss.example.net/api/fever.php?api> which should give you the "
+"result:"
+msgstr ""
+
+#. type: Fenced code block (json)
+#: en/./developers/06_Fever_API.md:55
+#, no-wrap
+msgid ""
+"{\n"
+"\t\"api_version\": 3,\n"
+"\t\"auth\": 0\n"
+"}\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:62
+#, markdown-text
+msgid "Great, the base setup seems to work!"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:65
+#, markdown-text
+msgid ""
+"Now lets try an authenticated call. Fever uses an `api_key`, which is the "
+"MD5 hash of `\"$username:$apiPassword\"`. Assuming the user is `kevin` and "
+"the password `freshrss`, here is a command-line example to compute the "
+"resulting `api_key`"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/06_Fever_API.md:66
+#, no-wrap
+msgid "api_key=`echo -n \"kevin:freshrss\" | md5sum | cut -d' ' -f1`\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:71
+#, markdown-text
+msgid ""
+"Add a body to your POST request encoded as `form-data` and one key named "
+"`api_key` with the value `your-password-hash`:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/06_Fever_API.md:72
+#, no-wrap
+msgid ""
+"curl -s -F \"api_key=$api_key\" "
+"'https://freshrss.example.net/api/fever.php?api'\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:77
+#, markdown-text
+msgid "This should give:"
+msgstr ""
+
+#. type: Fenced code block (json)
+#: en/./developers/06_Fever_API.md:77
+#, no-wrap
+msgid ""
+"{\n"
+"\t\"api_version\": 3,\n"
+"\t\"auth\": 1,\n"
+"\t\"last_refreshed_on_time\": \"1520013061\"\n"
+"}\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:85
+#, markdown-text
+msgid ""
+"Perfect, you’re now authenticated and you can start testing the more "
+"advanced features. To do so, change the URL and append the possible API "
+"actions to your request parameters. Please refer to the [original Fever "
+"documentation](https://feedafever.com/api) for more information."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:87
+#, markdown-text
+msgid "Some basic calls are:"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:18
-msgid "Multi-user, so you can also host for your friends and family"
+#: en/./developers/06_Fever_API.md:97
+#, markdown-text
+msgid "<https://freshrss.example.net/api/fever.php?api&items>"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:18
-msgid "And a lot more!"
+#: en/./developers/06_Fever_API.md:97
+#, markdown-text
+msgid "<https://freshrss.example.net/api/fever.php?api&feeds>"
msgstr ""
-#. type: Plain text
-#: en/./index.md:20
-msgid "This documentation is split into different sections:"
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:97
+#, markdown-text
+msgid "<https://freshrss.example.net/api/fever.php?api&groups>"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:24
-msgid ""
-"[User documentation](./users/02_First_steps.html), where you can discover "
-"all the possibilities offered by FreshRSS"
+#: en/./developers/06_Fever_API.md:97
+#, markdown-text
+msgid "<https://freshrss.example.net/api/fever.php?api&unread_item_ids>"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:24
-msgid ""
-"[Administrator documentation](./admins/01_Index.html) for detailed "
-"installation and maintenance related tasks"
+#: en/./developers/06_Fever_API.md:97
+#, markdown-text
+msgid "<https://freshrss.example.net/api/fever.php?api&saved_item_ids>"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:24
-msgid ""
-"[Developer documentation](./developers/01_First_steps.html) to guide you in "
-"the source code of FreshRSS and to help you if you want to contribute"
+#: en/./developers/06_Fever_API.md:97
+#, markdown-text
+msgid "<https://freshrss.example.net/api/fever.php?api&items&since_id=some_id>"
msgstr ""
#. type: Bullet: '* '
-#: en/./index.md:24
+#: en/./developers/06_Fever_API.md:97
+#, markdown-text
+msgid "<https://freshrss.example.net/api/fever.php?api&items&max_id=some_id>"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:97
+#, markdown-text
+msgid "<https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id>"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_Fever_API.md:97
+#, markdown-text
+msgid "<https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id>"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Fever_API.md:99
+#, markdown-text
msgid ""
-"[Contributor guidelines](./contributing.md) for those who want to help "
-"improve FreshRSS"
+"Replace `some_id` with a real ID from your `freshrss_username_entry` "
+"database."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/06_Fever_API.md:100
+#, markdown-text, no-wrap
+msgid "Debugging"
msgstr ""
#. type: Plain text
-#: en/./users/02_First_steps.md:2
+#: en/./developers/06_Fever_API.md:103
+#, markdown-text
msgid ""
-"Learning how to handle a new application is not always easy. We’ve tried to "
-"make FreshRSS as intuitive as possible, but you might still need a little "
-"help to master the program."
+"If nothing helps and your client is still misbehaving, you can add the "
+"following lines to the beginning of the `fever.api` file to determine the "
+"cause of the problems:"
+msgstr ""
+
+#. type: Fenced code block (php)
+#: en/./developers/06_Fever_API.md:104
+#, no-wrap
+msgid ""
+"file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' "
+". json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);\n"
msgstr ""
#. type: Plain text
-#: en/./users/02_First_steps.md:4
+#: en/./developers/06_Fever_API.md:109
+#, markdown-text
msgid ""
-"This section will guide you to the pages you need to get started. The order "
-"is tailored to newcomers."
+"Then use your RSS client to query the API and afterwards check the file "
+"`fever.log`."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_Fever_API.md:110
+#, markdown-text, no-wrap
+msgid "Credits"
msgstr ""
#. type: Plain text
-#: en/./users/02_First_steps.md:6
+#: en/./developers/06_Fever_API.md:112
+#, markdown-text
msgid ""
-"[After installing the application](../admins/03_Installation.md), the first "
-"step is to add some feeds. You have a few options:"
+"This plugin was inspired by the "
+"[tinytinyrss-fever-plugin](https://github.com/dasmurphy/tinytinyrss-fever-plugin)."
msgstr ""
-#. type: Bullet: '1. '
-#: en/./users/02_First_steps.md:10
-msgid "[Add a feed manually](04_Subscriptions.md#adding-a-feed)"
+#. type: Title #
+#: en/./developers/06_GoogleReader_API.md:1
+#, markdown-text, no-wrap
+msgid "FreshRSS - Google Reader compatible API implementation"
msgstr ""
-#. type: Bullet: '2. '
-#: en/./users/02_First_steps.md:10
-msgid "[Import an OPML or JSON file](04_Subscriptions.md#import-and-export)"
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:4
+#, markdown-text
+msgid ""
+"See [Mobile access](../users/06_Mobile_access.md) for general aspects of API "
+"access."
msgstr ""
-#. type: Bullet: '3. '
-#: en/./users/02_First_steps.md:10
-msgid "[Use the bookmarklet](04_Subscriptions.md#use-bookmarklet)"
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:6
+#, markdown-text
+msgid ""
+"See also the [page about our Fever compatible API](06_Fever_API.md) for "
+"another possibility (less powerful)."
msgstr ""
#. type: Plain text
-#: en/./users/02_First_steps.md:12
+#: en/./developers/06_GoogleReader_API.md:12
+#, markdown-text
msgid ""
-"Once you have added your feeds to FreshRSS, it is time to read them. There "
-"are three availalbe reading modes:"
+"There are many RSS clients that support the Fever API, but they might "
+"understand the API a bit differently. If your favourite client doesn’t work "
+"properly with this API, please create an issue and we’ll have a look. But "
+"we can **only** do that for free clients."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:19
+#, markdown-text
+msgid ""
+"Then point your mobile application to the `greader.php` address "
+"(e.g. `https://freshrss.example.net/api/greader.php`)."
msgstr ""
#. type: Bullet: '1. '
-#: en/./users/02_First_steps.md:16
+#: en/./developers/06_GoogleReader_API.md:24
+#, markdown-text
msgid ""
-"[The normal view](03_Main_view.md#normal-view) enables you to quickly read "
-"new articles"
+"On the same FreshRSS API page, note the address given under “Your API "
+"address”, like `https://freshrss.example.net/api/greader.php`"
msgstr ""
#. type: Bullet: '2. '
-#: en/./users/02_First_steps.md:16
+#: en/./developers/06_GoogleReader_API.md:24
+#, markdown-text
msgid ""
-"[The global view](03_Main_view.md#global-view) shows you an overview of the "
-"status of your feeds in one glance"
+"Type the API address in a client, together with your FreshRSS username, and "
+"the corresponding special API password."
msgstr ""
-#. type: Bullet: '3. '
-#: en/./users/02_First_steps.md:16
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:39
+#, markdown-text, no-wrap
msgid ""
-"[The reader view](03_Main_view.md#reader-view) offers you a comfortable "
-"reading experience"
+"| App "
+"| Platform | License "
+"|\n"
+"|:----------------------------------------------------------------------------------:|:-------------------:|:--------------------------------------------------------:|\n"
+"|[News+](https://github.com/noinnion/newsplus/blob/master/apk/NewsPlus_202.apk) "
+"with [News+ Google Reader "
+"extension](https://github.com/noinnion/newsplus/blob/master/apk/GoogleReaderCloneExtension_101.apk) "
+"|Android|Closed Source (Free), [partially open "
+"source](https://github.com/noinnion/newsplus/blob/master/extensions/GoogleReaderCloneExtension/src/com/noinnion/android/newsplus/extension/google_reader/GoogleReaderClient.java)|\n"
+"|[FeedMe "
+"3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) "
+"|Android |Closed Source (Free) "
+"|\n"
+"|[EasyRSS](https://github.com/Alkarex/EasyRSS) "
+"|Android "
+"|[GPLv3](https://github.com/Alkarex/EasyRSS/blob/master/license.txt) "
+"([F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/))|\n"
+"|[Readrops](https://github.com/readrops/Readrops) |Android "
+"|[GPLv3](https://github.com/readrops/Readrops/blob/develop/LICENSE) "
+"|\n"
+"|[Fluent Reader Lite](https://hyliu.me/fluent-reader-lite/) |Android, iOS "
+"|[BSD-3](https://github.com/yang991178/fluent-reader-lite) "
+"|\n"
+"|[FocusReader](https://play.google.com/store/apps/details?id=allen.town.focus.reader) "
+"|Android |Closed Source(Free) "
+"|\n"
+"|[Newsflash](https://gitlab.com/news-flash/news_flash_gtk/) "
+"|Linux "
+"|[GPLv3](https://gitlab.com/news-flash/news_flash_gtk/) |\n"
+"|[lire](https://lireapp.com/) "
+"|iOS, macOS |Closed Source "
+"|\n"
+"|[Newsboat 2.24+](https://newsboat.org/) |Linux "
+"|[MIT](https://github.com/newsboat/newsboat/blob/master/LICENSE) "
+"|\n"
+"|[Vienna RSS](http://www.vienna-rss.com/) |macOS "
+"|[Apache-2.0](https://github.com/ViennaRSS/vienna-rss/blob/master/LICENCE.md) "
+"|\n"
+"|[Reeder](https://www.reederapp.com/) |macOS, iOS "
+"|Closed Source |\n"
+"|[FreshRSS-Notify](https://addons.mozilla.org/firefox/addon/freshrss-notify-webextension/) "
+"|Firefox |Open Source "
+"|\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:41
+#, markdown-text, no-wrap
+msgid ""
+"> ℹ️ See a [better table of compatible clients in our main "
+"Readme](https://github.com/FreshRSS/FreshRSS/blob/edge/README.md#apis--native-apps).\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_GoogleReader_API.md:42
+#, markdown-text, no-wrap
+msgid "Google Reader compatible API"
msgstr ""
#. type: Plain text
-#: en/./users/02_First_steps.md:18
+#: en/./developers/06_GoogleReader_API.md:45
+#, markdown-text
+msgid "Examples of basic queries:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./developers/06_GoogleReader_API.md:46
+#, no-wrap
msgid ""
-"Now that you’ve mastered basic use, it’s time to configure FreshRSS to "
-"improve your reading experience. It’s highly configurable, so it’s "
-"recommended to play around with them to find a configuration that suits you "
-"well. Here are a few resources to help you improve your daily FreshRSS "
-"experience:"
+"# Initial login, using API password (Email and Passwd can be given either as "
+"GET, or POST - better)\n"
+"curl "
+"'https://freshrss.example.net/api/greader.php/accounts/ClientLogin?Email=alice&Passwd=Abcdef123456'\n"
+"SID=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
+"Auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
+"\n"
+"# Examples of read-only requests\n"
+"curl -s -H \"Authorization:GoogleLogin "
+"auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" "
+"'https://freshrss.example.net/api/greader.php/reader/api/0/subscription/list?output=json'\n"
+"\n"
+"curl -s -H \"Authorization:GoogleLogin "
+"auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" "
+"'https://freshrss.example.net/api/greader.php/reader/api/0/unread-count?output=json'\n"
+"\n"
+"curl -s -H \"Authorization:GoogleLogin "
+"auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" "
+"'https://freshrss.example.net/api/greader.php/reader/api/0/tag/list?output=json'\n"
+"\n"
+"# Retrieve a token for requests making modifications\n"
+"curl -H \"Authorization:GoogleLogin "
+"auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/token'\n"
+"8e6845e089457af25303abc6f53356eb60bdb5f8ZZZZZZZZZZZZZZZZZ\n"
+"\n"
+"# Get articles, piped to jq for easier JSON reading\n"
+"curl -s -H \"Authorization:GoogleLogin "
+"auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" "
+"'https://freshrss.example.net/api/greader.php/reader/api/0/stream/contents/reading-list' "
+"| jq .\n"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/02_First_steps.md:27
-msgid "[Organize your feeds in categories](04_Subscriptions.md#feed-management)"
+#: en/./developers/06_GoogleReader_API.md:73
+#, markdown-text
+msgid ""
+"[Source code of our API "
+"implementation](https://github.com/FreshRSS/FreshRSS/blob/edge/p/api/greader.php)"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/06_GoogleReader_API.md:74
+#, markdown-text, no-wrap
+msgid "API documentation from the original Google Reader"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/02_First_steps.md:27
-msgid "[Change the home page](05_Configuration.md#changing-the-view)"
+#: en/./developers/06_GoogleReader_API.md:81
+#, markdown-text
+msgid ""
+"[By Daniel "
+"Arowser](https://web.archive.org/web/20130710044440/http://undoc.in/api.html) "
+"([source](https://github.com/arowser/google-reader-api))"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/02_First_steps.md:27
-msgid "[Choose the reading options](05_Configuration.md#reading-options)"
+#: en/./developers/06_GoogleReader_API.md:81
+#, markdown-text
+msgid ""
+"[By Martin "
+"Doms](https://web.archive.org/web/20210126115837/https://blog.martindoms.com/2009/10/16/using-the-google-reader-api-part-2/)"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/02_First_steps.md:27
-msgid "[Refresh feeds](03_Main_view.md#refreshing-feeds)"
+#: en/./developers/06_GoogleReader_API.md:81
+#, markdown-text
+msgid ""
+"[By Nick "
+"Bradbury](https://inessential.com/2013/03/14/google_reader_api_documentation)"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/02_First_steps.md:27
+#: en/./developers/06_GoogleReader_API.md:81
+#, markdown-text
msgid ""
-"[Filter articles](03_Main_view.md#filtering-articles) for a fast access to a "
-"selection"
+"[By Niall "
+"Kennedy](https://web.archive.org/web/20170426184845/http://www.niallkennedy.com/blog/2005/12/google-reader-api.html)"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/02_First_steps.md:27
+#: en/./developers/06_GoogleReader_API.md:81
+#, markdown-text
msgid ""
-"[search for an article](03_Main_view.md#with-the-search-field) published some time "
-"ago"
+"[By Mihai "
+"Parparita](https://web.archive.org/web/20140919042419/http://code.google.com/p/google-reader-api/w/list) "
+"([source](https://github.com/mihaip/google-reader-api))"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/06_GoogleReader_API.md:82
+#, markdown-text, no-wrap
+msgid "API documentation from other compatible clients"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/02_First_steps.md:27
-msgid "[Access your feeds on a mobile device](06_Mobile_access.md)"
+#: en/./developers/06_GoogleReader_API.md:89
+#, markdown-text
+msgid "[FeedHQ](https://feedhq.readthedocs.io/en/latest/api/index.html)"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/02_First_steps.md:27
-msgid "[Add some extensions](https://github.com/FreshRSS/Extensions)"
+#: en/./developers/06_GoogleReader_API.md:89
+#, markdown-text
+msgid "[Inoreader](https://www.inoreader.com/developers/)"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/02_First_steps.md:27
-msgid "[Frequently asked questions](07_Frequently_Asked_Questions.md)"
+#: en/./developers/06_GoogleReader_API.md:89
+#, markdown-text
+msgid "[The Old Reader](https://github.com/theoldreader/api)"
msgstr ""
-#. type: Title #
-#: en/./users/03_Main_view.md:1
-#, no-wrap
-msgid "Normal view"
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:89
+#, markdown-text
+msgid "[pyrfeed](http://code.google.com/p/pyrfeed/wiki/GoogleReaderAPI)"
msgstr ""
-#. type: Title #
-#: en/./users/03_Main_view.md:5
-#, no-wrap
-msgid "Global view"
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:89
+#, markdown-text
+msgid "[BazQux](https://github.com/bazqux/bazqux-api)"
msgstr ""
-#. type: Title #
-#: en/./users/03_Main_view.md:9
-#, no-wrap
-msgid "Reader view"
+#. type: Title ###
+#: en/./developers/06_GoogleReader_API.md:90
+#, markdown-text, no-wrap
+msgid "Synchronisation strategy"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_GoogleReader_API.md:94
+#, markdown-text, no-wrap
+msgid ""
+"> ℹ️ If you are maintaining a client or planning to develop a new one, "
+"please read carefully the following pieces of advice,\n"
+"as many clients start by having a very inneficient synchronisation "
+"strategy.\n"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:96
+#, markdown-text
+msgid ""
+"[*Synchronisation recommendation* by "
+"Alkarex](https://github.com/FreshRSS/FreshRSS/issues/2566#issuecomment-541317776)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_GoogleReader_API.md:96
+#, markdown-text
+msgid ""
+"[*The Right Way to Sync* by "
+"BazQux](https://github.com/bazqux/bazqux-api#user-content-the-right-way-to-sync)"
msgstr ""
#. type: Title #
-#: en/./users/03_Main_view.md:13
-#, no-wrap
-msgid "Refreshing feeds"
+#: en/./developers/06_Reporting_Bugs.md:1
+#, markdown-text, no-wrap
+msgid "Reporting a bug or a suggestion"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:16
+#: en/./developers/06_Reporting_Bugs.md:4
+#, markdown-text
msgid ""
-"To take full advantage of FreshRSS, it needs to retrieve new items from the "
-"feeds you have subscribed to. There are several ways to do this."
+"Despite the care given to FreshRSS, it’s still possible that bugs "
+"occur. Development is dynamic, so issues can be corrected quickly. You might "
+"also have a feature in mind that doesn’t yet exist. Regardless whether your "
+"idea seems silly, far-fetched, useless or too specific, please don’t "
+"hesitate to propose it to us! “Ideas in the air” often find an attentive "
+"ear. It’s new external perspectives that make the project evolve the most."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:6
+#, markdown-text
+msgid ""
+"If you’re convinced that you should be heard, here’s how you can go about "
+"it."
msgstr ""
#. type: Title ##
-#: en/./users/03_Main_view.md:17
-#, no-wrap
-msgid "Automatic update"
+#: en/./developers/06_Reporting_Bugs.md:7
+#, markdown-text, no-wrap
+msgid "On GitHub"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:20
+#: en/./developers/06_Reporting_Bugs.md:10
+#, markdown-text
msgid ""
-"This is the recommended method since you can forget about it once it is "
-"configured."
+"GitHub is the ideal platform to submit your requests. It allows us to "
+"discuss a problem or suggestion with others and it often generates new "
+"ideas. Let’s not neglect this “social” aspect!"
msgstr ""
-#. type: Title ###
-#: en/./users/03_Main_view.md:21
-#, no-wrap
-msgid "With the actualize_script.php script"
+#. type: Bullet: '1. '
+#: en/./developers/06_Reporting_Bugs.md:16
+#, markdown-text
+msgid "[Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/issues)"
msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:24
+#. type: Bullet: '2. '
+#: en/./developers/06_Reporting_Bugs.md:16
+#, markdown-text
msgid ""
-"This method is only available if you have access to the scheduled tasks of "
-"the machine on which your FreshRSS instance is installed."
+"Start by checking if a similar request hasn’t already been made. If so, "
+"please feel free to add your voice to the request."
msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:26
+#. type: Bullet: '3. '
+#: en/./developers/06_Reporting_Bugs.md:16
+#, markdown-text
msgid ""
-"The script is named *actualize_script.php* and is located in the *app* "
-"folder. The scheduled task syntax will not be explained here. However, here "
-"is [a quick introduction to "
-"crontab](http://www.adminschoice.com/crontab-quick-reference/) that might "
-"help you."
+"If your request is new, [open a new bug "
+"ticket](https://github.com/FreshRSS/FreshRSS/issues/new)"
msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:28
-msgid "Here is an example to trigger article update every hour."
+#. type: Bullet: '4. '
+#: en/./developers/06_Reporting_Bugs.md:16
+#, markdown-text
+msgid ""
+"Finally, write your request. If you’re fluent in English, it’s the preferred "
+"language because it allows for discussion with the largest number of people."
msgstr ""
-#. type: Code fence info string
-#: en/./users/03_Main_view.md:29 en/./users/03_Main_view.md:61 en/./users/03_Main_view.md:79 en/./users/03_Main_view.md:85 en/./users/03_Main_view.md:93
-#, no-wrap
-msgid "cron"
+#. type: Bullet: '5. '
+#: en/./developers/06_Reporting_Bugs.md:16
+#, markdown-text
+msgid "Please follow the tips below to make it easier to let your ticket be heard."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_Reporting_Bugs.md:17
+#, markdown-text, no-wrap
+msgid "Informal"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:29
-#, no-wrap
+#: en/./developers/06_Reporting_Bugs.md:20
+#, markdown-text
msgid ""
-"0 * * * * php /path/to/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log "
-"2>&1\n"
+"Not everyone likes or uses GitHub for a variety of legitimate reasons. That "
+"is why you can also contact us in a more informal way."
msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:34
-msgid "Special parameters to configure the script - all parameters can be combined:"
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:26
+#, markdown-text
+msgid ""
+"On [our Mattermost "
+"chat](https://framateam.org/signup_user_complete/?id=e2680d3e3128b9fac8fdb3003b0024ee)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:26
+#, markdown-text
+msgid "On [our subreddit](https://www.reddit.com/r/freshrss/)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:26
+#, markdown-text
+msgid "At events / meetings around Free Software"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:26
+#, markdown-text
+msgid "Over a beer in a bar"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:26
+#, markdown-text
+msgid "Etc."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_Reporting_Bugs.md:27
+#, markdown-text, no-wrap
+msgid "Tips"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:38
+#: en/./developers/06_Reporting_Bugs.md:30
+#, markdown-text
+msgid "Here are some tips to help you present your bug report or suggestion:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:41
+#, markdown-text
+msgid "**Pay attention to spelling**. Even if it’s not always easy, try your best!"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:41
+#, markdown-text
msgid ""
-"- Parameter \"force\" "
-"https://freshrss.example.net/i/?c=feed&a=actualize&force=1 If *force* is set "
-"to 1 all feeds will be refreshed at once."
+"**Give an explicit title to your request**, even if it’s a bit long. This "
+"not only helps us understand your request, but also to find your ticket "
+"later."
msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:42
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:41
+#, markdown-text
msgid ""
-"- Parameter \"ajax\" "
-"https://freshrss.example.net/i/?c=feed&a=actualize&ajax=1 Only a status site "
-"is returned and not a complete website. Example: \"OK\""
+"**One request = one ticket.** You may have lots of ideas while being afraid "
+"to spam the bug manager: it doesn’t matter. It’s better to have a few too "
+"many tickets than too many requests in one. We’ll close and consolidate "
+"requests when possible."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/06_Reporting_Bugs.md:41
+#, markdown-text
+msgid ""
+"If you report a bug, think about **providing us with the FreshRSS logs** "
+"(accessible in the FreshRSS `data/log/` folder) and the **PHP logs** (the "
+"location may vary by distribution, but consider searching in "
+"`/var/log/httpd` or `/var/log/apache`)."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/06_Reporting_Bugs.md:41
+#, markdown-text
+msgid ""
+"If you can’t find the log files, specify it in your ticket so we know you’ve "
+"already searched."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/06_Reporting_Bugs.md:41
+#, markdown-text
+msgid ""
+"Not all bugs require logs, but if you have any doubts, it is better to "
+"provide them to us. Logs are important and very useful for debugging!"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/06_Reporting_Bugs.md:41
+#, markdown-text
+msgid ""
+"The logs may reveal confidential information, so **be careful not to "
+"disclose anything sensitive.**"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:46
+#: en/./developers/06_Reporting_Bugs.md:41
+#, markdown-text, no-wrap
msgid ""
-"- Parameter \"maxFeeds\" "
-"https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=30 If *maxFeeds* "
-"is set the configured amount of feeds is refreshed at once. The default "
-"setting is \"10\"."
+"* If you report a feed problem, it will be easier if you could provide a "
+"snapshot of its content in a text file.\n"
+"See [here](#how-to-provide-feed-data) for more information.\n"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:50
+#: en/./developers/06_Reporting_Bugs.md:43
+#, markdown-text
msgid ""
-"- Parameter \"token\" "
-"https://freshrss.example.net/i/?c=feed&a=actualize&token=542345872345734 "
-"Security parameter to prevent unauthorized refreshes. For detailed "
-"Documentation see \"Form authentication\"."
+"In addition, when facing a bug, you’re encouraged to follow this message "
+"format (from the [Sam & Max "
+"website](http://sametmax.com/template-de-demande-daide-en-informatique/):"
msgstr ""
#. type: Title ###
-#: en/./users/03_Main_view.md:51
-#, no-wrap
-msgid "Online cron"
+#: en/./developers/06_Reporting_Bugs.md:44
+#, markdown-text, no-wrap
+msgid "What’s my goal?"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:54
-msgid ""
-"If you do not have access to the installation server scheduled task, you can "
-"still automate the update process."
+#: en/./developers/06_Reporting_Bugs.md:47
+#, markdown-text
+msgid "Give the general context of what you were trying to do."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/06_Reporting_Bugs.md:48
+#, markdown-text, no-wrap
+msgid "What have I been trying to do?"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:56
-msgid ""
-"To do so, you need to create a scheduled task, which need to call a specific "
-"URL: https://freshrss.example.net/i/?c=feed&a=actualize (it could be "
-"different depending on your installation). Depending on your application "
-"authentication method, you need to adapt the scheduled task."
+#: en/./developers/06_Reporting_Bugs.md:51
+#, markdown-text
+msgid "Explain step by step what you have done so that we can reproduce the bug."
msgstr ""
-#. type: Title ####
-#: en/./users/03_Main_view.md:57
-#, no-wrap
-msgid "No authentication"
+#. type: Title ###
+#: en/./developers/06_Reporting_Bugs.md:52
+#, markdown-text, no-wrap
+msgid "What results have I achieved?"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:60
+#: en/./developers/06_Reporting_Bugs.md:55
+#, markdown-text
msgid ""
-"This is the most straightforward since you have a public instance; there is "
-"nothing special to configure:"
+"The bug: what you see that shouldn’t have happened. Here you can provide the "
+"logs."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/06_Reporting_Bugs.md:56
+#, markdown-text, no-wrap
+msgid "What was the expected result?"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:61
-#, no-wrap
-msgid "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
+#: en/./developers/06_Reporting_Bugs.md:59
+#, markdown-text
+msgid "So that we understand what you consider to be the problem."
msgstr ""
#. type: Title ###
-#: en/./users/03_Main_view.md:65
-#, no-wrap
-msgid "Form authentication"
+#: en/./developers/06_Reporting_Bugs.md:60
+#, markdown-text, no-wrap
+msgid "What are my circumstances?"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:68
+#: en/./developers/06_Reporting_Bugs.md:63
+#, markdown-text
+msgid "Remember to give the following information if you know it:"
+msgstr ""
+
+#. type: Bullet: '1. '
+#: en/./developers/06_Reporting_Bugs.md:69
+#, markdown-text
+msgid "Which browser? Which version?"
+msgstr ""
+
+#. type: Bullet: '2. '
+#: en/./developers/06_Reporting_Bugs.md:69
+#, markdown-text
+msgid "Which server: Apache, Nginx? Which version?"
+msgstr ""
+
+#. type: Bullet: '3. '
+#: en/./developers/06_Reporting_Bugs.md:69
+#, markdown-text
+msgid "Which version of PHP?"
+msgstr ""
+
+#. type: Bullet: '4. '
+#: en/./developers/06_Reporting_Bugs.md:69
+#, markdown-text
+msgid "Which database: SQLite, MySQL, MariaDB, PostgreSQL? Which version?"
+msgstr ""
+
+#. type: Bullet: '5. '
+#: en/./developers/06_Reporting_Bugs.md:69
+#, markdown-text
+msgid "Which distribution runs on the server? And… which version?"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/06_Reporting_Bugs.md:70
+#, markdown-text, no-wrap
+msgid "How to provide feed data"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/06_Reporting_Bugs.md:74
+#, markdown-text
msgid ""
-"If you configure the application to allow anonymous reading, you can also "
-"allow anonymous users to update feeds (“Allow anonymous refresh of the "
-"articles”)."
+"If you need us to investigate a feed problem, it will be easier if you "
+"provide a snapshot of the feed data. To do that, you can launch the "
+"following command:"
+msgstr ""
+
+#. type: Fenced code block (bash)
+#: en/./developers/06_Reporting_Bugs.md:75
+#, no-wrap
+msgid "wget <feed url> -O output.rss.txt\n"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:70
-msgid "![Anonymous access configuration](../img/users/anonymous_access.1.png)"
+#: en/./developers/06_Reporting_Bugs.md:78
+#, markdown-text
+msgid "Then you can drag-and-drop the generated file into the issue."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:4
+#, markdown-text
+msgid "Minz is the homemade PHP framework used by FreshRSS."
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:72
+#: en/./developers/Minz/index.md:6
+#, markdown-text
msgid ""
-"The URL used in the previous section will now become accessible to "
-"anyone. Therefore you can use the same syntax for the scheduled task."
+"This data sheet should refer to the official FreshRSS and Minz documentation "
+"(the PHP framework on which FreshRSS is based). Unfortunately, this "
+"documentation does not yet exist. In a few words, here are the main things "
+"you should know. It is not necessary to read all the chapters in this "
+"section if you don’t need to use a feature in your extension (if you don’t "
+"need to translate your extension, no need to know more about the "
+"`Minz_Translate` module for example)."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:7
+#, markdown-text, no-wrap
+msgid "MVC Architecture"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:74
+#: en/./developers/Minz/index.md:10
+#, markdown-text
+msgid ""
+"Minz relies on and imposes an MVC architecture on projects using it. This "
+"architecture consists of three main components:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/Minz/index.md:14
+#, markdown-text
msgid ""
-"You can also configure an authentication token to grant special access on "
-"the server."
+"The model: this is the base object that we will manipulate. In FreshRSS, "
+"categories, flows and articles are templates. The part of the code that "
+"makes it possible to manipulate them in a database is also part of the model "
+"but is separated from the base model: we speak of DAO (for \"Data Access "
+"Object\"). The templates are stored in a `Models` folder."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/Minz/index.md:14
+#, markdown-text
+msgid ""
+"The view: this is what the user sees. The view is therefore simply HTML code "
+"mixed with PHP to display dynamic information. The views are stored in a "
+"`views` folder."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/Minz/index.md:14
+#, markdown-text
+msgid ""
+"The controller: this is what makes it possible to link models and "
+"views. Typically, a controller will load templates from the database (like a "
+"list of items) to \"pass\" them to a view for display. Controllers are "
+"stored in a `Controllers` directory."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:15
+#, markdown-text, no-wrap
+msgid "Routing"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:76
-msgid "![Token configuration](../img/users/token.1.png)"
+#: en/./developers/Minz/index.md:19
+#, markdown-text
+msgid ""
+"In order to link a URL to a controller, first you have to go through a "
+"\"routing\" phase. In FreshRSS, this is particularly simple because it "
+"suffices to specify the name of the controller to load into the URL using a "
+"`c` parameter. For example, the address <http://example.com?c=hello> will "
+"execute the code contained in the `hello` controller."
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:78
-msgid "The scheduled task syntax should look as follows:"
+#: en/./developers/Minz/index.md:21
+#, markdown-text
+msgid ""
+"One concept that has not yet been discussed is the \"actions\" system. An "
+"action is executed *on* a controller. Concretely, a controller is "
+"represented by a class and its actions by methods. To execute an action, it "
+"is necessary to specify an `a` parameter in the URL."
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:79
+#: en/./developers/Minz/index.md:23 en/./developers/Minz/index.md:143
+#, markdown-text
+msgid "Code example:"
+msgstr ""
+
+#. type: Fenced code block (php)
+#: en/./developers/Minz/index.md:24
#, no-wrap
msgid ""
-"0 * * * * curl "
-"'https://freshrss.example.net/i/?c=feed&a=actualize&token=my-token'\n"
+"<?php\n"
+"\n"
+"class FreshRSS_hello_Controller extends FreshRSS_ActionController {\n"
+"\tpublic function indexAction() {\n"
+"\t\t$this->view->a_variable = 'FooBar';\n"
+"\t}\n"
+"\n"
+"\tpublic function worldAction() {\n"
+"\t\t$this->view->a_variable = 'Hello World!';\n"
+"\t}\n"
+"}\n"
+"\n"
+"?>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:41
+#, markdown-text
+msgid ""
+"When loading the address <http://example.com?c=hello&a=world>, the `world` "
+"action is executed on the `hello` controller."
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:84
+#: en/./developers/Minz/index.md:44
+#, markdown-text
msgid ""
-"You can also target a different user by adding their username to the query "
-"string, with `&user=insert-username`:"
+"Note: if `c` or `a` is not specified, the default value for each of these "
+"variables is `index`. So the address <http://example.com?c=hello> will "
+"execute the `index` action of the `hello` controller."
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:85
-#, no-wrap
+#: en/./developers/Minz/index.md:46
+#, markdown-text
msgid ""
-"0 * * * * curl "
-"'https://freshrss.example.net/i/?c=feed&a=actualize&user=someone&token=my-token'\n"
+"From now on, the `hello/world` naming convention will be used to refer to a "
+"controller/action pair."
msgstr ""
-#. type: Title ###
-#: en/./users/03_Main_view.md:89
-#, no-wrap
-msgid "HTTP authentication"
+#. type: Title #
+#: en/./developers/Minz/index.md:47 en/./users/03_Main_view.md:1
+#, markdown-text, no-wrap
+msgid "Views"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:92
+#: en/./developers/Minz/index.md:50
+#, markdown-text
msgid ""
-"When using HTTP authentication, the syntax in the two previous sections is "
-"unusable. You’ll need to provide your credentials to the scheduled "
-"task. **Note that this method is highly discouraged since it means that your "
-"credentials will be in plain sight!**"
+"Each view is associated with a controller and an action. The view associated "
+"with `hello/world` will be stored in a very specific file: "
+"`views/hello/world. phtml`. This convention is imposed by Minz."
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:93
+#: en/./developers/Minz/index.md:52
+#, markdown-text
+msgid "As explained above, the views consist of HTML mixed with PHP. Code example:"
+msgstr ""
+
+#. type: Fenced code block (html)
+#: en/./developers/Minz/index.md:53
#, no-wrap
msgid ""
-"0 * * * * curl -u alice:password123 "
-"'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
+"<p>\n"
+"\tThis is a parameter passed from the controller: <?= $this->a_variable ?>\n"
+"</p>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:60
+#, markdown-text, no-wrap
+msgid ""
+"The variable `$this->a_variable` is passed by the controller (see previous "
+"example). The difference is that in the controller it is necessary to pass "
+"`$this->view`, while in the view `$this` suffices.\n"
msgstr ""
#. type: Title ##
-#: en/./users/03_Main_view.md:97
-#, no-wrap
-msgid "Manual update"
+#: en/./developers/Minz/index.md:61
+#, markdown-text, no-wrap
+msgid "Working with GET / POST"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:100
+#: en/./developers/Minz/index.md:65
+#, markdown-text
msgid ""
-"If you can’t or don’t want to use the automatic method, you can update "
-"manually. There are two methods for updating all or some of the feeds."
+"It is often necessary to take advantage of parameters passed by GET or "
+"POST. In Minz, these parameters are accessible using the `Minz_Request` "
+"class. Code example:"
msgstr ""
-#. type: Title ###
-#: en/./users/03_Main_view.md:101
+#. type: Fenced code block (php)
+#: en/./developers/Minz/index.md:66
#, no-wrap
-msgid "Complete update"
+msgid ""
+"<?php\n"
+"\n"
+"$default_value = 'foo';\n"
+"$param = Minz_Request::paramString('bar') ?: $default_value;\n"
+"\n"
+"// Display the value of the parameter `bar` (passed via GET or POST)\n"
+"// or \"foo\" if the parameter does not exist.\n"
+"echo $param;\n"
+"\n"
+"// Sets the value of the `bar` parameter\n"
+"Minz_Request::_param('bar', 'baz');\n"
+"\n"
+"// Will necessarily display \"baz\" since we have just forced its value.\n"
+"// Note that the second parameter (default) is optional.\n"
+"echo Minz_Request::paramString('bar');\n"
+"\n"
+"?>\n"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:104
+#: en/./developers/Minz/index.md:87
+#, markdown-text
msgid ""
-"This update occurs on all feeds. To trigger it, simply click on the update "
-"link in the navigation menu."
+"The `Minz_Request::isPost()` method can be used to execute a piece of code "
+"only if it is a POST request."
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:106
-msgid "![Navigation menu](../img/users/refresh.1.png)"
+#: en/./developers/Minz/index.md:89
+#, markdown-text
+msgid ""
+"Note: it is preferable to use `Minz_Request` only in controllers. It is "
+"likely that you will encounter this method in FreshRSS views, or even in "
+"templates, but be aware that this is **not** good practice."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:90
+#, markdown-text, no-wrap
+msgid "Access session settings"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:108
+#: en/./developers/Minz/index.md:93
+#, markdown-text
msgid ""
-"When the update starts, a progress bar appears and changes while feeds are "
-"processed."
+"The access to session parameters is strangely similar to the GET / POST "
+"parameters but passes through the `Minz_Session` class this time! There is "
+"no example here because you can repeat the previous example by changing all "
+"`Minz_Request` to `Minz_Session`."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:94
+#, markdown-text, no-wrap
+msgid "Working with URLs"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:110
-msgid "![Progress bar](../img/users/refresh.5.png)"
+#: en/./developers/Minz/index.md:97
+#, markdown-text
+msgid ""
+"To take full advantage of the Minz routing system, it is strongly "
+"discouraged to write hard URLs in your code. For example, the following view "
+"should be avoided:"
msgstr ""
-#. type: Title ###
-#: en/./users/03_Main_view.md:111
+#. type: Fenced code block (html)
+#: en/./developers/Minz/index.md:98
#, no-wrap
-msgid "Partial update"
+msgid ""
+"<p>\n"
+"\tGo to page <a href=\"http://example.com?c=hello&amp;a=world\">Hello "
+"world</a>!\n"
+"</p>\n"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:114
+#: en/./developers/Minz/index.md:105
+#, markdown-text
msgid ""
-"This update occurs on the selected feed only. To trigger it, simply click on "
-"the update link in the feed menu."
+"If one day it was decided to use a \"url rewriting\" system to have "
+"addresses in a <http://example.com/controller/action> format, all previous "
+"addresses would become ineffective!"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:116
-msgid "![Feed menu](../img/users/refresh.2.png)"
+#: en/./developers/Minz/index.md:107
+#, markdown-text
+msgid ""
+"So use the `Minz_Url` class and its `display()` method "
+"instead. `Minz_Url::display()` takes an array of the following form as its "
+"argument:"
msgstr ""
-#. type: Title #
-#: en/./users/03_Main_view.md:117
+#. type: Fenced code block (php)
+#: en/./developers/Minz/index.md:108
#, no-wrap
-msgid "Filtering articles"
+msgid ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"\t'params' => [\n"
+"\t\t'foo' => 'bar',\n"
+"\t],\n"
+"];\n"
+"\n"
+"// Show something like .?c=hello&amp;a=world&amp;foo=bar\n"
+"echo Minz_Url::display($url_array);\n"
+"\n"
+"?>\n"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:120
+#: en/./developers/Minz/index.md:126
+#, markdown-text
msgid ""
-"When the number of articles stored by FreshRSS inevitably grows larger, it’s "
-"important to use efficient filters to display only a subset of the "
-"articles. There are several methods that filter with different "
-"criteria. Usually those methods can be combined."
+"Since this can become a bit tedious to use in the long run, especially in "
+"views, it is preferable to use the `_url()` shortcut:"
msgstr ""
-#. type: Title ##
-#: en/./users/03_Main_view.md:121
+#. type: Fenced code block (php)
+#: en/./developers/Minz/index.md:127
#, no-wrap
-msgid "By category"
+msgid ""
+"<?php\n"
+"\n"
+"// Displays the same as above\n"
+"echo _url('hello', 'world', 'foo', 'bar');\n"
+"\n"
+"?>\n"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:124
+#: en/./developers/Minz/index.md:137
+#, markdown-text
msgid ""
-"This is the easiest method. You only need to click on the category title in "
-"the side panel. There are two special categories at the top of the panel:"
+"Note: as a general rule, the shortened form (`_url()`) should be used in "
+"views, while the long form (`Minz_Url::display()`) should be used in "
+"controllers."
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/03_Main_view.md:127
+#. type: Title ##
+#: en/./developers/Minz/index.md:138
+#, markdown-text, no-wrap
+msgid "Redirections"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/index.md:141
+#, markdown-text
msgid ""
-"*Main feed* displays only articles from feeds marked as available in that "
-"category"
+"It is often necessary to redirect a user to another page. To do so, the "
+"`Minz_Request` class offers another useful method: `forward()`. This method "
+"takes the same URL format as the one seen just before as its argument."
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/03_Main_view.md:127
-msgid "*Favourites* displays only articles marked as favourites"
+#. type: Fenced code block (php)
+#: en/./developers/Minz/index.md:144
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"];\n"
+"\n"
+"// Tells Minz to redirect the user to the hello / world page.\n"
+"// Note that this is a redirection in the Minz sense of the term, not a "
+"redirection that the browser will have to manage (HTTP code 301 or 302)\n"
+"// The code that follows forward() will thus be executed!\n"
+"Minz_Request::forward($url_array);\n"
+"\n"
+"// To perform a type 302 redirect, add \"true\".\n"
+"// The code that follows will never be executed.\n"
+"Minz_Request::forward($url_array, true);\n"
+"\n"
+"?>\n"
msgstr ""
-#. type: Title ##
-#: en/./users/03_Main_view.md:128
+#. type: Plain text
+#: en/./developers/Minz/index.md:165
+#, markdown-text
+msgid ""
+"It is very common to want display a message to the user while performing a "
+"redirect, to tell the user how the action was carried out (validation of a "
+"form for example). Such a message is passed through a `notification` session "
+"variable (note: we will talk about feedback from now on to avoid confusion "
+"with a notification that can occur at any time). To facilitate this kind of "
+"very frequent action, there are two shortcuts that both perform a 302 "
+"redirect by assigning a feedback message:"
+msgstr ""
+
+#. type: Fenced code block (php)
+#: en/./developers/Minz/index.md:166
#, no-wrap
-msgid "By feed"
+msgid ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"];\n"
+"$feedback_good = 'All went well!';\n"
+"$feedback_bad = 'Oops, something went wrong.';\n"
+"\n"
+"Minz_Request::good($feedback_good, $url_array);\n"
+"\n"
+"// or\n"
+"\n"
+"Minz_Request::bad($feedback_bad, $url_array);\n"
+"\n"
+"?>\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/Minz/index.md:185
+#, markdown-text, no-wrap
+msgid "Translation Management"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:131
-msgid "There are several methods to filter articles by feed:"
+#: en/./developers/Minz/index.md:188
+#, markdown-text
+msgid "This part [is explained here](/docs/en/internationalization.md)."
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/03_Main_view.md:136
-msgid "by clicking the feed title in the side panel"
+#. type: Title ##
+#: en/./developers/Minz/index.md:189
+#, markdown-text, no-wrap
+msgid "Migration"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/03_Main_view.md:136
-msgid "by clicking the feed title in the article details"
+#. type: Plain text
+#: en/./developers/Minz/index.md:192
+#, markdown-text
+msgid "Existing documentation includes:"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/03_Main_view.md:136
-msgid "by filtering in the feed options from the side panel"
+#. type: Bullet: '* '
+#: en/./developers/Minz/index.md:193
+#, markdown-text
+msgid "[How to manage migrations](migrations.md)"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/03_Main_view.md:136
-msgid "by filtering in the feed configuration"
+#. type: Title #
+#: en/./developers/Minz/migrations.md:1
+#, markdown-text, no-wrap
+msgid "How to manage migrations with Minz"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:138
-msgid "![Feed filter](../img/users/feed.filter.1.png)"
+#: en/./developers/Minz/migrations.md:4
+#, markdown-text
+msgid ""
+"Migrations are the way to modify the database or the structure of files "
+"under the `data/` path."
msgstr ""
#. type: Title ##
-#: en/./users/03_Main_view.md:139
+#: en/./developers/Minz/migrations.md:5
+#, markdown-text, no-wrap
+msgid "How to write a migration?"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:8
+#, markdown-text
+msgid "Migrations are placed under the `app/migrations` folder."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:10
+#, markdown-text
+msgid ""
+"Good practice is to prepend the filename by the current date and explain "
+"what does the migration do in few words "
+"(e.g. `2020_01_11_CreateFooTable.php`)."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:12
+#, markdown-text
+msgid ""
+"The files must contain a class which name starts with `FreshRSS_Migration_`, "
+"followed by the basename of the file "
+"(e.g. `FreshRSS_Migration_2020_01_11_CreateFooTable`)."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:14
+#, markdown-text
+msgid ""
+"The class must declare a `migrate` static function. It must return `true` or "
+"a string to indicate the migration is applied, or `false` otherwise. It can "
+"also raise an exception: the message will be used to detail the error."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:16
+#, markdown-text
+msgid "Example:"
+msgstr ""
+
+#. type: Fenced code block (php)
+#: en/./developers/Minz/migrations.md:17
#, no-wrap
-msgid "By status"
+msgid ""
+"// File: app/migrations/2020_01_11_CreateFooTable.php\n"
+"class FreshRSS_Migration_2020_01_11_CreateFooTable {\n"
+"\tpublic static function migrate() {\n"
+"\t\t$pdo = new Minz_PdoSqlite('sqlite:/some/path/db.sqlite');\n"
+"\t\t$result = $pdo->exec('CREATE TABLE foos (bar TEXT)');\n"
+"\t\tif ($result === false) {\n"
+"\t\t\t$error = $pdo->errorInfo();\n"
+"\t\t\traise Exception('Error in SQL statement: ' . $error[2]);\n"
+"\t\t}\n"
+"\n"
+"\t\treturn true;\n"
+"\t}\n"
+"}\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/Minz/migrations.md:33
+#, markdown-text, no-wrap
+msgid "How to apply migrations?"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:142
+#: en/./developers/Minz/migrations.md:36
+#, markdown-text
+msgid "They are automatically applied one by one when a user accesses FreshRSS."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/Minz/migrations.md:38
+#, markdown-text
msgid ""
-"Each article has two attributes that can be combined. The first attribute "
-"indicates whether or not the article has been read. The second attribute "
-"indicates if the article was marked as favorite or not."
+"Before being applied, migrations are sorted by filenames (see the "
+"[`strnatcmp`](https://php.net/strnatcmp) function). Already applied "
+"migrations are skipped (the list can be found in the "
+"`data/applied_migrations.txt` file)."
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:144
+#: en/./developers/Minz/migrations.md:39
+#, markdown-text
msgid ""
-"In version 0.7, attribute filters are available in the article display "
-"dropdown list. With this version, it’s not possible to combine filters. For "
-"instance, it’s not possible to display only read and favorite articles."
+"To ensure migrations are not applied several times if two users access "
+"FreshRSS at the same time, a folder named `data/applied_migrations.txt.lock` "
+"is created, then deleted at the end of the process."
+msgstr ""
+
+#. type: Title #
+#: en/./developers/OPML.md:1
+#, markdown-text, no-wrap
+msgid "OPML in FreshRSS"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:146
-msgid "![Attribute filters in 0.7](../img/users/status.filter.0.7.png)"
+#: en/./developers/OPML.md:4
+#, markdown-text
+msgid ""
+"FreshRSS supports the [OPML](https://en.wikipedia.org/wiki/OPML) format to "
+"export and import lists of RSS/Atom feeds in a standard way, compatible with "
+"several other RSS aggregators."
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:148
+#: en/./developers/OPML.md:7
+#, markdown-text
msgid ""
-"Starting with version 0.8, all attribute filters are visible as toggle "
-"icons. They can be combined. As any combination is possible, some have the "
-"same result. For instance, the result for all filters selected is the same "
-"as no filter selected."
+"However, FreshRSS also supports several additional features not covered by "
+"the basic OPML specification. Luckily, the [OPML "
+"specification](http://opml.org/spec2.opml) allows extensions:"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:150
-msgid "![Attribute filters in 0.8](../img/users/status.filter.0.8.png)"
+#: en/./developers/OPML.md:9
+#, markdown-text, no-wrap
+msgid ""
+"> *An OPML file may contain elements and attributes not described on this "
+"page, only if those elements are defined in a namespace.*\n"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:152
-msgid "By default, this filter displays only unread articles"
+#: en/./developers/OPML.md:11
+#, markdown-text
+msgid "and:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/OPML.md:13
+#, markdown-text, no-wrap
+msgid ""
+"> *OPML can also be extended by the addition of new values for the type "
+"attribute.*\n"
msgstr ""
#. type: Title ##
-#: en/./users/03_Main_view.md:153
-#, no-wrap
-msgid "By content"
+#: en/./developers/OPML.md:14
+#, markdown-text, no-wrap
+msgid "FreshRSS OPML extension"
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:156
+#: en/./developers/OPML.md:17
+#, markdown-text
msgid ""
-"It is possible to filter articles by their content by inputting a string in "
-"the search field."
+"FreshRSS uses the XML namespace <https://freshrss.org/opml> to export/import "
+"extended information not covered by the basic OPML specification."
msgstr ""
-#. type: Title ##
-#: en/./users/03_Main_view.md:157
-#, no-wrap
-msgid "With the search field"
+#. type: Plain text
+#: en/./developers/OPML.md:19
+#, markdown-text
+msgid ""
+"The list of the custom FreshRSS attributes can be seen in [the source "
+"code](https://github.com/FreshRSS/FreshRSS/blob/edge/app/views/helpers/export/opml.phtml), "
+"and here is an overview:"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/OPML.md:20
+#, markdown-text, no-wrap
+msgid "HTML+XPath or XML+XPath"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:23
+#, markdown-text
+msgid ""
+"`<outline type=\"HTML+XPath\" ...`: Additional type of source, which is not "
+"RSS/Atom, but HTML Web Scraping using "
+"[XPath](https://www.w3.org/TR/xpath-10/) 1.0."
msgstr ""
#. type: Plain text
-#: en/./users/03_Main_view.md:160
-msgid "You can use the search field to further refine results:"
+#: en/./developers/OPML.md:25
+#, markdown-text, no-wrap
+msgid ""
+"> ℹ️ [XPath 1.0](https://en.wikipedia.org/wiki/XPath) is a standard query "
+"language, which FreshRSS supports to enable [Web "
+"scraping](https://en.wikipedia.org/wiki/Web_scraping).\n"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/03_Main_view.md:199
-msgid "by author: `author:name` or `author:'composed name'`"
+#: en/./developers/OPML.md:27
+#, markdown-text
+msgid ""
+"`<outline type=\"XML+XPath\" ...`: Same than `HTML+XPath` but using an XML "
+"parser."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/OPML.md:29
+#, markdown-text
+msgid ""
+"The following attributes are using similar naming conventions than "
+"[RSS-Bridge](https://rss-bridge.github.io/rss-bridge/Bridge_API/XPathAbstract.html)."
msgstr ""
#. type: Bullet: '* '
-#: en/./users/03_Main_view.md:199
-msgid "by title: `intitle:keyword` or `intitle:'composed keyword'`"
+#: en/./developers/OPML.md:46
+#, markdown-text
+msgid ""
+"`frss:xPathItem`: XPath expression for extracting the feed items from the "
+"source page."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:46
+#, markdown-text
+msgid "Example: `//div[@class=\"news-item\"]`"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/03_Main_view.md:199
-msgid "by URL: `inurl:keyword` or `inurl:'composed keyword'`"
+#: en/./developers/OPML.md:46
+#, markdown-text
+msgid ""
+"`frss:xPathItemTitle`: XPath expression for extracting the item’s title from "
+"the item context."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:46
+#, markdown-text
+msgid "Example: `descendant::h2`"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/03_Main_view.md:199
-msgid "by tag: `#tag`"
+#: en/./developers/OPML.md:46
+#, markdown-text
+msgid ""
+"`frss:xPathItemContent`: XPath expression for extracting an item’s content "
+"from the item context."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:46
+#, markdown-text
+msgid "Example: `.`"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/03_Main_view.md:199
-msgid "by free-text: `keyword` or `'composed keyword'`"
+#: en/./developers/OPML.md:46
+#, markdown-text
+msgid ""
+"`frss:xPathItemUri`: XPath expression for extracting an item link from the "
+"item context."
msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:199
-#, no-wrap
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:46
+#, markdown-text
+msgid "Example: `descendant::a/@href`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+#, markdown-text
msgid ""
-"* by date of discovery, using the [ISO 8601 time interval "
-"format](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals): "
-"`date:<date-interval>`\n"
-"\t* From a specific day, or month, or year:\n"
-"\t\t* `date:2014-03-30`\n"
-"\t\t* `date:2014-03` or `date:201403`\n"
-"\t\t* `date:2014`\n"
-"\t* From a specific time of a given day:\n"
-"\t\t* `date:2014-05-30T13`\n"
-"\t\t* `date:2014-05-30T13:30`\n"
-"\t* Between two given dates:\n"
-"\t\t* `date:2014-02/2014-04`\n"
-"\t\t* `date:2014-02--2014-04`\n"
-"\t\t* `date:2014-02/04`\n"
-"\t\t* `date:2014-02-03/05`\n"
-"\t\t* `date:2014-02-03T22:00/22:15`\n"
-"\t\t* `date:2014-02-03T22:00/15`\n"
-"\t* After a given date:\n"
-"\t\t* `date:2014-03/`\n"
-"\t* Before a given date:\n"
-"\t\t* `date:/2014-03`\n"
-"\t* For a specific duration after a given date:\n"
-"\t\t* `date:2014-03/P1W`\n"
-"\t* For a specific duration before a given date:\n"
-"\t\t* `date:P1W/2014-05-25T23:59:59`\n"
-"\t* For the past duration before now (the trailing slash is optional):\n"
-"\t\t* `date:P1Y/` or `date:P1Y` (past year)\n"
-"\t\t* `date:P2M/` (past two months)\n"
-"\t\t* `date:P3W/` (past three weeks)\n"
-"\t\t* `date:P4D/` (past four days)\n"
-"\t\t* `date:PT5H/` (past five hours)\n"
-"\t\t* `date:PT30M/` (past thirty minutes)\n"
-"\t\t* `date:PT90S/` (past ninety seconds)\n"
-"\t\t* `date:P1DT1H/` (past one day and one hour)\n"
-"* by date of publication, using the same format: `pubdate:<date-interval>`\n"
-msgstr ""
-
-#. type: Plain text
-#: en/./users/03_Main_view.md:201
-msgid "Be careful not to enter a space between the operator and the search value."
+"`frss:xPathItemAuthor`: XPath expression for extracting an item author from "
+"the item context."
msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:204
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:46
+#, markdown-text
+msgid "Example: `\"Anonymous\"`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+#, markdown-text
msgid ""
-"Some operators can be used negatively, to exclude articles, with the same "
-"syntax as above, but prefixed by a `!` or `-`: `-author:name`, "
-"`-intitle:keyword`, `-inurl:keyword`, `-#tag`, `!keyword`."
+"`frss:xPathItemTimestamp`: XPath expression for extracting an item timestamp "
+"from the item context. The result will be parsed by "
+"[`strtotime()`](https://php.net/strtotime)."
msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:206
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+#, markdown-text
msgid ""
-"It is also possible to combine keywords to create a more precise filter. For "
-"example, you can enter multiple instances of `author:`, `intitle:`, "
-"`inurl:`, `#`, and free-text."
+"`frss:xPathItemTimeFormat`: Date/Time format to parse the timestamp, "
+"according to "
+"[`DateTime::createFromFormat()`](https://php.net/datetime.createfromformat)."
msgstr ""
-#. type: Plain text
-#: en/./users/03_Main_view.md:208
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+#, markdown-text
msgid ""
-"Combining several search criteria implies a logical *and*, but the keyword ` "
-"OR ` can be used to combine several search criteria with a logical *or* "
-"instead: `author:Dupont OR author:Dupond`"
+"`frss:xPathItemThumbnail`: XPath expression for extracting an item’s "
+"thumbnail (image) URL from the item context."
msgstr ""
-#. type: Title #
-#: en/./users/04_Subscriptions.md:1
-#, no-wrap
-msgid "Adding a feed"
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:46
+#, markdown-text
+msgid "Example: `descendant::img/@src`"
msgstr ""
-#. type: Title #
-#: en/./users/04_Subscriptions.md:5
-#, no-wrap
-msgid "Import and export"
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+#, markdown-text
+msgid ""
+"`frss:xPathItemCategories`: XPath expression for extracting a list of "
+"categories (tags) from the item context."
msgstr ""
-#. type: Title #
-#: en/./users/04_Subscriptions.md:9
-#, no-wrap
-msgid "Use bookmarklet"
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:46
+#, markdown-text
+msgid ""
+"`frss:xPathItemUid`: XPath expression for extracting an item’s unique ID "
+"from the item context. If left empty, a hash is computed automatically."
msgstr ""
-#. type: Plain text
-#: en/./users/04_Subscriptions.md:12
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:54
+#, markdown-text
msgid ""
-"Bookmarklets are little scripts that you can execute to perform various "
-"tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds."
+"`frss:cssFullContent`: [CSS "
+"Selector](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors) to "
+"enable the download and extraction of the matching HTML section of each "
+"articles’ Web address."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:54
+#, markdown-text
+msgid "Example: `div.main, .summary`"
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/04_Subscriptions.md:16
-msgid "Open \"Subscriptions management\"."
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:54
+#, markdown-text
+msgid ""
+"`frss:cssFullContentFilter`: [CSS "
+"Selector](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors) to "
+"remove the matching HTML elements from the full content retrieved by "
+"`frss:cssFullContent`."
msgstr ""
-#. type: Bullet: ' 2. '
-#: en/./users/04_Subscriptions.md:16
-msgid "Click on \"Subscription tools\"."
+#. type: Bullet: ' * '
+#: en/./developers/OPML.md:54
+#, markdown-text
+msgid "Example: `.footer, .aside`"
msgstr ""
-#. type: Bullet: ' 3. '
-#: en/./users/04_Subscriptions.md:16
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:54
+#, markdown-text
msgid ""
-"Drag the \"Subscribe\" button to your bookmark toolbar or right click and "
-"choose your browser’s \"Bookmark link\" action."
+"`frss:filtersActionRead`: List (separated by a new line) of search queries "
+"to automatically mark a new article as read."
msgstr ""
-#. type: Title #
-#: en/./users/04_Subscriptions.md:17
-#, no-wrap
-msgid "Feed management"
+#. type: Title ###
+#: en/./developers/OPML.md:55
+#, markdown-text, no-wrap
+msgid "Dynamic OPML (reading lists)"
msgstr ""
-#. type: Title #
-#: en/./users/05_Configuration.md:2
-#, no-wrap
-msgid "Display"
+#. type: Bullet: '* '
+#: en/./developers/OPML.md:58
+#, markdown-text
+msgid ""
+"`frss:opmlUrl`: If non-empty, indicates that this outline (category) should "
+"be dynamically populated from a remote OPML at the specified URL."
msgstr ""
-#. type: Title ##
-#: en/./users/05_Configuration.md:4
-#, no-wrap
-msgid "Language"
+#. type: Title ###
+#: en/./developers/OPML.md:59
+#, markdown-text, no-wrap
+msgid "Example"
+msgstr ""
+
+#. type: Fenced code block (xml)
+#: en/./developers/OPML.md:61
+#, no-wrap
+msgid ""
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<opml version=\"2.0\">\n"
+"\t<head>\n"
+"\t\t<title>FreshRSS OPML extension example</title>\n"
+"\t</head>\n"
+"\t<body>\n"
+"\t\t<outline xmlns:frss=\"https://freshrss.org/opml\"\n"
+"\t\t\ttext=\"Example\"\n"
+"\t\t\ttype=\"HTML+XPath\"\n"
+"\t\t\txmlUrl=\"https://www.example.net/page.html\"\n"
+"\t\t\thtmlUrl=\"https://www.example.net/page.html\"\n"
+"\t\t\tdescription=\"Example of Web scraping\"\n"
+"\t\t\tfrss:xPathItem=\"//a[contains(@href, "
+"'/interesting/')]/ancestor::article\"\n"
+"\t\t\tfrss:xPathItemTitle=\"descendant::h2\"\n"
+"\t\t\tfrss:xPathItemContent=\".\"\n"
+"\t\t\tfrss:xPathItemUri=\"descendant::a[string-length(@href)&gt;0]/@href\"\n"
+"\t\t\tfrss:xPathItemThumbnail=\"descendant::img/@src\"\n"
+"\t\t\tfrss:cssFullContent=\"article\"\n"
+"\t\t\tfrss:filtersActionRead=\"intitle:⚡️ OR intitle:🔥&#10;something\"\n"
+"\t\t/>\n"
+"\t</body>\n"
+"</opml>\n"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:9
-msgid ""
-"FreshRSS is currently available in 14 languages. After confirming your "
-"choice, the interface will be displayed in your preferred language. "
-"Depending on the language chosen, parts of the interface may not be not "
-"translated yet. If you’re willing to help translate the missing bits or "
-"would like to add a new language, please take a look at how you can "
-"[contribute to the "
-"project](../contributing.md#contribute-to-internationalization-i18n)."
+#: en/./index.md:2
+#, markdown-text
+msgid "![FreshRSS logo](img/logo_freshrss.png)"
+msgstr ""
+
+#. type: Title #
+#: en/./index.md:3
+#, markdown-text, no-wrap
+msgid "FreshRSS manual (English)"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:11
+#: en/./index.md:6
+#, markdown-text
msgid ""
-"Some parts of FreshRSS aren’t translated and aren’t intended to be "
-"translated either. For now, this includes the logs visible in the "
-"application as well as the log generated by automatic update scripts."
+"FreshRSS is an RSS aggregator and reader. It allows you to read and follow "
+"several news websites at a glance without the need to browse from one "
+"website to another."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:13
+#: en/./index.md:10
+#, markdown-text
+msgid "FreshRSS has a lot of features including:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
+msgid "RSS and Atom aggregation"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
+msgid "Mark article as favorite if you liked it or if you want to read it later"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
+msgid "Filter and search functionality helps to easily find articles"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
+msgid "Statistics to show you the publishing frequency all the websites you follow"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
+msgid "Import/export of your feeds into OPML format"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
+msgid "Several themes created by the community"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
+msgid "Several extensions created by the community"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
+msgid "\"Google Reader\"-like API to connect Android applications"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
+msgid ""
+"The application is \"responsive,\" which means it adapts to small screens so "
+"you can bring articles in your pocket"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
msgid ""
-"Available languages are: cz, de, en, es, fr, he, it, ko, nl, oc, pt-br, ru, "
-"tr, zh-cn."
+"Self-hosted: the code is free (under AGPL3 licence), so you can host your "
+"own instance of FreshRSS"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
+msgid "Multi-user, so you can also host for your friends and family"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
+msgid "share article links with a bunch of services"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+#, markdown-text
+msgid "And a lot more!"
msgstr ""
#. type: Title ##
-#: en/./users/05_Configuration.md:14
-#, no-wrap
-msgid "Theme"
+#: en/./index.md:25
+#, markdown-text, no-wrap
+msgid "Manual Chapters"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:17
+#: en/./index.md:28
+#, markdown-text
+msgid "This documentation is split into different sections:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:33
+#, markdown-text
msgid ""
-"There’s no accounting for tastes, which is why FreshRSS offers eight "
-"official themes:"
+"[User documentation](./users/02_First_steps.md), where you can discover all "
+"the possibilities offered by FreshRSS"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Blue Lagoon* by **Mister aiR**"
+#. type: Bullet: '* '
+#: en/./index.md:33
+#, markdown-text
+msgid ""
+"[Administrator documentation](./admins/01_Index.md) for detailed "
+"installation and maintenance related tasks"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Dark* by **AD**"
+#. type: Bullet: '* '
+#: en/./index.md:33
+#, markdown-text
+msgid ""
+"[Developer documentation](./developers/01_Index.md) to guide you in the "
+"source code of FreshRSS and to help you if you want to contribute"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Flat design* by **Marien Fressinaud**"
+#. type: Bullet: '* '
+#: en/./index.md:33
+#, markdown-text
+msgid ""
+"[Contributor guidelines](./contributing.md) for those who want to help "
+"improve FreshRSS"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Origine* by **Marien Fressinaud**"
+#. type: Title ##
+#: en/./index.md:34
+#, markdown-text, no-wrap
+msgid "Demo"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Origine-compact* by **Kevin Papst**"
+#. type: Plain text
+#: en/./index.md:37
+#, markdown-text
+msgid ""
+"The official demo of FreshRSS is available under "
+"[https://demo.freshrss.org/](https://demo.freshrss.org/)."
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Pafat* by **Plopoyop**"
+#. type: Plain text
+#: en/./index.md:39
+#, markdown-text
+msgid "Login credentials:"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Screwdriver* by **Mister aiR**"
+#. type: Bullet: '* '
+#: en/./index.md:42
+#, markdown-text
+msgid "Username: demo"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:26
-msgid "*Swage* by **Patrick Crandol**"
+#. type: Bullet: '* '
+#: en/./index.md:42
+#, markdown-text
+msgid "Password: demodemo"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:28
+#: en/./index.md:44
+#, markdown-text
msgid ""
-"If you can’t find any themes you like, it’s always possible to [create your "
-"own](../developers/04_Frontend/02_Design.md)."
+"Another chance to try out, but not official supported by FreshRSS: The "
+"application is listed on Softaculous "
+"[https://www.softaculous.com/apps/rss/FreshRSS](https://www.softaculous.com/apps/rss/FreshRSS)."
+msgstr ""
+
+#. type: Title ##
+#: en/./index.md:45
+#, markdown-text, no-wrap
+msgid "Licence"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:30
+#: en/./index.md:47
+#, markdown-text
+msgid "FreshRSS is licensed under the GNU Affero General Public License v3.0."
+msgstr ""
+
+#. type: Title #
+#: en/./internationalization.md:1
+#, markdown-text, no-wrap
+msgid "Contributing to internationalization (i18n)"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:4
+#, markdown-text
msgid ""
-"To select a theme, simply scroll through the themes and select one that "
-"strikes your fancy. After confirmation, the theme will be applied to the "
-"interface."
+"Thanks to our contributors, FreshRSS is translated into [more than 20 "
+"languages](./users/05_Configuration.md#language). This section will explain "
+"the basics of internationalization in FreshRSS, from translating the "
+"application to your own language to making a specific change."
msgstr ""
#. type: Title ##
-#: en/./users/05_Configuration.md:31
-#, no-wrap
-msgid "Content width"
+#: en/./internationalization.md:5
+#, markdown-text, no-wrap
+msgid "Overview"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:34
+#: en/./internationalization.md:8
+#, markdown-text
msgid ""
-"Some people prefer short lines of text, while others prefer to maximize the "
-"available screen space. To satisfy the maximum number of people, it’s "
-"possible to customize the width of the displayed content. There are four "
-"settings available:"
+"It is common (and that’s an understatement) to want to show some text to the "
+"user. The problem is that FreshRSS has users of different nationalities. It "
+"is therefore necessary to be able to manage different languages in order not "
+"to remain confined to English or French."
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:39
-msgid "**Fine** displays content up to a maximum width of 550 pixels"
+#. type: Plain text
+#: en/./internationalization.md:10
+#, markdown-text
+msgid ""
+"The solution is to use the `Minz_Translate` module, which allows dynamic "
+"translation of FreshRSS. Before using this module, it is necessary to know "
+"where to find the strings to be translated. Each language has its own "
+"subdirectory in a parent directory named `app/i18n/`. For example, English "
+"language files are located in [`app/i18n/en/`](/app/i18n/en/). There are "
+"seven different files:"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:39
-msgid "**Medium** displays content up to a maximum width of 800 pixels"
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+#, markdown-text
+msgid "`admin.php` for anything related to FreshRSS administration"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:39
-msgid "**Large** displays content up to a maximum width of 1000 pixels"
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+#, markdown-text
+msgid "`conf.php` for configuration"
msgstr ""
-#. type: Bullet: ' * '
-#: en/./users/05_Configuration.md:39
-msgid "**No limit** displays the content on 100% of the available space"
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+#, markdown-text
+msgid "`feedback.php` contains translations of feedback messages"
msgstr ""
-#. type: Title ##
-#: en/./users/05_Configuration.md:40
-#, no-wrap
-msgid "Article icons"
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+#, markdown-text
+msgid "`gen.php` stores what is global to FreshRSS (`gen` stands for “general”)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+#, markdown-text
+msgid "`index.php` for the main page that lists feeds and the About page"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+#, markdown-text
+msgid "`install.php` contains strings related to the installation"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+#, markdown-text
+msgid "`sub.php` for subscription management (`sub` stands for “subscription”)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./internationalization.md:19
+#, markdown-text
+msgid "`user.php` contains some strings related to the User model"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:43
-msgid "Please note that this section only affects normal view."
+#: en/./internationalization.md:21
+#, markdown-text
+msgid "This organization makes it possible to avoid a single huge translation file."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:45
-msgid "![Article icons configuration](../img/users/configuration.article.icons.png)"
+#: en/./internationalization.md:23
+#, markdown-text
+msgid ""
+"The translation files are quite simple: it’s only a matter of returning a "
+"PHP array containing the translations. As an example, here’s an extract from "
+"[`app/i18n/fr/gen.php`](/app/i18n/fr/gen.php):"
+msgstr ""
+
+#. type: Fenced code block (php)
+#: en/./internationalization.md:24
+#, no-wrap
+msgid ""
+"<?php\n"
+"return array(\n"
+"\t'action' => [\n"
+"\t\t'actualize' => 'Actualiser',\n"
+"\t\t'back_to_rss_feeds' => '↠Retour à vos flux RSS',\n"
+"\t\t'cancel' => 'Annuler',\n"
+"\t\t'create' => 'Créer',\n"
+"\t\t'disable' => 'Désactiver',\n"
+"\t),\n"
+"\t'freshrss' => array(\n"
+"\t\t'_' => 'FreshRSS',\n"
+"\t\t'about' => 'Ă€ propos de FreshRSS',\n"
+"\t),\n"
+"\t// ...\n"
+");\n"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:48
+#: en/./internationalization.md:43
+#, markdown-text
msgid ""
-"Each article is rendered with a header (top line) and a footer (bottom "
-"line). In that section, you can choose what will be displayed in those."
+"Each value can be referenced by a key: it consists of a series of "
+"identifiers separated by dots. The first identifier indicates from which "
+"file to extract the translation, while the following ones indicate array "
+"entries. Thus, the `gen.freshrss.about` key is referencing the `about` entry "
+"from the `freshrss` entry which is part of the main array returned by the "
+"`gen.php` file. This allows us to further organize our translation files."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:52
+#: en/./internationalization.md:45
+#, markdown-text
msgid ""
-"If you disable every item in the top line, you’ll still be able to see it "
-"since it contains the feed name and the article title. But if you do the "
-"same thing for the bottom line, it will be empty."
+"You should not have to write the array by yourself and we provide several "
+"commands to ease the manipulation of these files. Let’s see some common use "
+"cases."
msgstr ""
#. type: Title ##
-#: en/./users/05_Configuration.md:53
+#: en/./internationalization.md:46
+#, markdown-text, no-wrap
+msgid "Add support for a new language"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:49
+#, markdown-text
+msgid ""
+"If you want to add support for a language which isn’t supported by FreshRSS "
+"yet, you can run this command:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:50
#, no-wrap
-msgid "HTML5 notification timout"
+msgid "make i18n-add-language lang=[your language code]\n"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:56
+#: en/./internationalization.md:55
+#, markdown-text
msgid ""
-"After automatically updating the feeds, FreshRSS can pop up a notification "
-"using the HTML5 notification API."
+"You must replace `[your language code]` by the language tag of your "
+"language. It must follow the [IETF BCP 47 "
+"standard](https://en.wikipedia.org/wiki/IETF_language_tag). For instance, "
+"English is `en` and French is `fr`. You can target a specific region with a "
+"subtag, for instance `pt-br` for Brazilian Portuguese. If you’re not sure of "
+"the code, Wikipedia might be a good start to find it or you can ask us for "
+"help too."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:58
-msgid "The duration of this notification can be set. By default, the value is 0."
+#: en/./internationalization.md:57
+#, markdown-text
+msgid ""
+"The command will create a new subfolder under `app/i18n/` and copy the "
+"strings from the reference language (i.e. English). It will also mark all "
+"the translations with a special tag represented by a comment: `// TODO - "
+"Translation`. We’ll see in the next section how to translate the strings."
msgstr ""
#. type: Title ##
-#: en/./users/05_Configuration.md:59
-#, no-wrap
-msgid "Show the navigation button"
+#: en/./internationalization.md:58
+#, markdown-text, no-wrap
+msgid "Translate the interface"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:62
+#: en/./internationalization.md:61
+#, markdown-text
msgid ""
-"By default, FreshRSS displays buttons to ease the article navigation when "
-"browsing on mobile. The drawback is that they eat up some precious space."
+"You might have noticed some strings are not yet translated from English even "
+"though you’ve selected a different language. This is because we mostly speak "
+"English or French and it’s pretty difficult to us to speak all the different "
+"languages!"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:64
+#: en/./internationalization.md:63
+#, markdown-text
msgid ""
-"![navigation button "
-"configuration](../img/users/configuration.navigation.button.png)"
+"To update a string, you just have to open its file, find the string, and "
+"change it (without removing the quotes around it!) You might want to remove "
+"the comment at the end of the line, but you should prefer to use the "
+"following command:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:64
+#, no-wrap
+msgid "make i18n-format\n"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:66
+#: en/./internationalization.md:69
+#, markdown-text
msgid ""
-"If you don’t use those buttons because you never browse on mobile or because "
-"you browse with gestures, you can disable them from the interface."
+"It will remove the comments on the lines that you’ve changed, and will "
+"reformat the file correctly. If you’ve made any mistakes, it will fix them "
+"automatically or it will tell you it can’t (well… the command will "
+"dramatically fail without any damage, don’t worry)."
msgstr ""
-#. type: Title #
-#: en/./users/05_Configuration.md:67
+#. type: Plain text
+#: en/./internationalization.md:71
+#, markdown-text
+msgid ""
+"The strings to translate can be easily found in the translations files "
+"thanks to the tag we spoke about at the end of the previous section. Indeed, "
+"it indicates to our tools that the strings are not translated yet. This "
+"means you can find them with Git. For instance for the Greek language:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:72
#, no-wrap
-msgid "Reading"
+msgid "git grep TODO app/i18n/he\n"
msgstr ""
#. type: Title ##
-#: en/./users/05_Configuration.md:71 en/./users/05_Configuration.md:154
+#: en/./internationalization.md:76
+#, markdown-text, no-wrap
+msgid "Acknowledge a false-positive"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:79
+#, markdown-text
+msgid ""
+"Our tool detects if a string needs to be translated if it equals to the "
+"English version. For instance, the word “version” is the same in English and "
+"French. Thus, our tool would mark the French word to be translated. This is, "
+"in fact, the case for the `index.about.version` key. This case is considered "
+"as a false-positive because the word _is_ actually translated. To aknowledge "
+"such translations, you can run:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:80
#, no-wrap
-msgid "Archival"
+msgid "make i18n-ignore-key lang=fr key=index.about.version\n"
msgstr ""
-#. type: Title #
-#: en/./users/05_Configuration.md:75
+#. type: Plain text
+#: en/./internationalization.md:85
+#, markdown-text
+msgid ""
+"This command adds an IGNORE comment on the translation so the key can be "
+"considered as translated."
+msgstr ""
+
+#. type: Title ##
+#: en/./internationalization.md:86
+#, markdown-text, no-wrap
+msgid "Add/remove/update a key"
+msgstr ""
+
+#. type: Plain text
+#: en/./internationalization.md:89
+#, markdown-text
+msgid ""
+"If you’re developing a new part of the application, you might want to "
+"declare a new translation key. Your first impulse would be to add the key to "
+"each file manually: don’t do that, it’s very painful. We provide another "
+"command:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:90
#, no-wrap
-msgid "Sharing"
+msgid "make i18n-add-key key=the.key.to.add value='Your string in English'\n"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:78
-msgid "To make your life easier, you can share articles straight from FreshRSS."
+#: en/./internationalization.md:95
+#, markdown-text
+msgid ""
+"This adds the key to all the files. It’ll be in English, waiting for other "
+"translators."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:80
+#: en/./internationalization.md:97
+#, markdown-text
msgid ""
-"At the moment, FreshRSS supports 18 sharing methods, ranging from "
-"self-hosted services (Shaarli, etc.) to proprietary services (Facebook, "
-"etc.)."
+"Conversely, you may want to remove a key that is no longer used in the "
+"application with:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:98
+#, no-wrap
+msgid "make i18n-remove-key key=the.key.to.remove\n"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:83
+#: en/./internationalization.md:103
+#, markdown-text
msgid ""
-"By default, the sharing list is empty. ![Sharing "
-"configuration](../img/users/configuration.sharing.png)"
+"Finally, if the English version of a string needs to be changed, you need to "
+"consider two cases. If the change doesn’t impact the meaning of the "
+"sentence, and therefore other languages don’t need to change (e.g. to fix a "
+"typo), you should make the change manually in the file. In any other case, "
+"you should use the following command:"
+msgstr ""
+
+#. type: Fenced code block (sh)
+#: en/./internationalization.md:104
+#, no-wrap
+msgid ""
+"make i18n-update-key key=the.key.to.change value='The new string in "
+"English'\n"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:85
-msgid "To add a new item to the list, please follow the following simple steps:"
+#: en/./internationalization.md:109
+#, markdown-text
+msgid "The key will simply be removed and added back with the new value."
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:90
-msgid "Select the desired sharing method in the drop-down list."
+#. type: Title ##
+#: en/./internationalization.md:110
+#, markdown-text, no-wrap
+msgid "How to access a translation programmatically"
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:90
-msgid "Press the ```âśš``` button to add it to the list."
+#. type: Plain text
+#: en/./internationalization.md:113
+#, markdown-text
+msgid ""
+"To access these translations, you must use the `_t()` function (which is a "
+"shortcut for `Minz_Translate::t()`). Code example:"
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:90
+#. type: Fenced code block (html)
+#: en/./internationalization.md:114
+#, no-wrap
msgid ""
-"Configure the method in the list. All names can be modified in the "
-"display. Some methods need the sharing URL to be able to work properly (ex: "
-"Shaarli)."
+"<p>\n"
+"\t<?= _t('gen.freshrss.about') ?>\n"
+"</p>\n"
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:90 en/./users/05_Configuration.md:95
-msgid "Submit your changes."
+#. type: Plain text
+#: en/./internationalization.md:121
+#, markdown-text
+msgid ""
+"The function expects a translation key, but there’s a special case that "
+"sometimes makes life easier: the `_` identifier. This must necessarily be "
+"present at the end of the chain and gives a value to the higher-level "
+"identifier. It’s pretty hard to explain but very simple to understand. In "
+"the example given above, an `_` is associated with the value `FreshRSS`: "
+"this means that there is no need to write `_t('gen.freshrss._')` but "
+"`_t('gen.freshrss')` suffices."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:92
-msgid "To remove an item from the list, follow those simple steps:"
+#: en/./internationalization.md:123
+#, markdown-text
+msgid ""
+"`_t()` can take any number of variables. The variables will then be replaced "
+"in the translation if it contains some “conversion specifications” (usually "
+"`%s` or `%d`). You can learn more about these specifications in the "
+"[`sprintf()` PHP function "
+"documentation](https://www.php.net/manual/function.sprintf)."
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:95
-msgid "Press the ```❌``` button next to the share method you want to remove."
+#. type: Plain text
+#: en/./internationalization.md:125
+#, markdown-text, no-wrap
+msgid ""
+"For instance, the English translation for `gen.auth.keep_logged_in` is `Keep "
+"me logged in <small>(%s days)</small>`. It means this translation expects a "
+"string to be passed as an argument to the `t()` function (well, it should be "
+"a `%d` because we want a number here, but it doesn’t matter). For "
+"instance:\n"
msgstr ""
-#. type: Title #
-#: en/./users/05_Configuration.md:96
+#. type: Fenced code block (php)
+#: en/./internationalization.md:126
#, no-wrap
-msgid "Shortcuts"
+msgid ""
+"<label>\n"
+"\t<input type=\"checkbox\" name=\"keep_logged_in\" />\n"
+"\t<?= _t('gen.auth.keep_logged_in', 30) ?>\n"
+"</label>\n"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:100
+#: en/./users/02_First_steps.md:2
+#, markdown-text
msgid ""
-"To ease the use of the application, FreshRSS comes with a lot of predefined "
-"keyboard shortcuts. They allow actions to improve the user experience with "
-"a keyboard."
+"Learning how to handle a new application is not always easy. We’ve tried to "
+"make FreshRSS as intuitive as possible, but you might still need a little "
+"help to master the program."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:102
+#: en/./users/02_First_steps.md:4
+#, markdown-text
msgid ""
-"Of course, if you’re not satisfied with the key mapping, you can change you "
-"configuration to fit your needs."
+"This section will guide you to the pages you need to get started. The order "
+"is tailored to newcomers."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:104
-msgid "There are 4 types of shortcuts:"
+#: en/./users/02_First_steps.md:6
+#, markdown-text
+msgid ""
+"[After installing the application](../admins/03_Installation.md), the first "
+"step is to add some feeds. You have a few options:"
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:109
-msgid "Views: they allow switching views with ease."
+#. type: Bullet: '1. '
+#: en/./users/02_First_steps.md:10
+#, markdown-text
+msgid "[Add a feed manually](04_Subscriptions.md#adding-a-feed)"
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:109
-msgid "Navigation: they allow navigation through articles, feeds, and categories."
+#. type: Bullet: '2. '
+#: en/./users/02_First_steps.md:10
+#, markdown-text
+msgid "[Import an OPML or JSON file](04_Subscriptions.md#import-and-export)"
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:109
+#. type: Bullet: '3. '
+#: en/./users/02_First_steps.md:10
+#, markdown-text
+msgid "[Use the bookmarklet](04_Subscriptions.md#use-bookmarklet)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/02_First_steps.md:12
+#, markdown-text
msgid ""
-"Article actions: they allow interactions with an article, like sharing or "
-"opening it on the original web-site."
+"Once you have added your feeds to FreshRSS, it is time to read them. There "
+"are three available reading modes:"
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:109
+#. type: Bullet: '1. '
+#: en/./users/02_First_steps.md:16
+#, markdown-text
msgid ""
-"Other actions: they allow other interactions with the application, like "
-"opening the user queries menu or accessing the documentation."
+"[The normal view](03_Main_view.md#normal-view) enables you to quickly read "
+"new articles"
msgstr ""
-#. type: Plain text
-#: en/./users/05_Configuration.md:112
+#. type: Bullet: '2. '
+#: en/./users/02_First_steps.md:16
+#, markdown-text
msgid ""
-"It’s worth noting that the share article action has two levels. Once you "
-"press the shortcut, a menu containing all the share options opens. To "
-"choose one share option, you need to select it by its number. When there is "
-"only one option, it’s selected automatically though."
+"[The global view](03_Main_view.md#global-view) shows you an overview of the "
+"status of your feeds in one glance"
msgstr ""
-#. type: Plain text
-#: en/./users/05_Configuration.md:114
-msgid "The same process applies to the user queries."
+#. type: Bullet: '3. '
+#: en/./users/02_First_steps.md:16
+#, markdown-text
+msgid ""
+"[The reader view](03_Main_view.md#reader-view) offers you a comfortable "
+"reading experience"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:117
+#: en/./users/02_First_steps.md:18
+#, markdown-text
msgid ""
-"Be aware that there is no validation on the selected shortcuts. This means "
-"that if you assign a shortcut to more than one action, you’ll end up with "
-"some unexpected behavior."
+"Now that you’ve mastered basic use, it’s time to configure FreshRSS to "
+"improve your reading experience. It’s highly configurable, so it’s "
+"recommended to play around with them to find a configuration that suits you "
+"well. Here are a few resources to help you improve your daily FreshRSS "
+"experience:"
msgstr ""
-#. type: Title #
-#: en/./users/05_Configuration.md:118
-#, no-wrap
-msgid "User queries"
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+#, markdown-text
+msgid "[Organize your feeds in categories](04_Subscriptions.md#feed-management)"
msgstr ""
-#. type: Plain text
-#: en/./users/05_Configuration.md:122
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+#, markdown-text
+msgid "[Change the home page](05_Configuration.md#changing-the-view)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+#, markdown-text
+msgid "[Choose the reading options](05_Configuration.md#reading-options)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+#, markdown-text
+msgid "[Refresh feeds](09_refreshing_feeds.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+#, markdown-text
+msgid "[Filter articles](10_filter.md) for a fast access to a selection"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+#, markdown-text
msgid ""
-"You can configure your [user queries](./03_Main_view.md) in that "
-"section. There is not much to say here as it is pretty straightforward. You "
-"can only change user query titles or drop them."
+"[search for an article](10_filter.md#with-the-search-field) published some "
+"time ago"
msgstr ""
-#. type: Plain text
-#: en/./users/05_Configuration.md:124
-msgid "At the moment, there is no helper to build a user query from here."
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+#, markdown-text
+msgid "[Access your feeds on a mobile device](06_Mobile_access.md)"
msgstr ""
-#. type: Title #
-#: en/./users/05_Configuration.md:125
-#, no-wrap
-msgid "Users"
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+#, markdown-text
+msgid "[Add some extensions](https://github.com/FreshRSS/Extensions)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+#, markdown-text
+msgid "[Frequently asked questions](07_Frequently_Asked_Questions.md)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:4
+#, markdown-text
+msgid "FreshRSS has three primary viewing modes: Normal, Global, and Reader view."
msgstr ""
#. type: Title ##
-#: en/./users/05_Configuration.md:129
-#, no-wrap
-msgid "Authentication methods"
+#: en/./users/03_Main_view.md:5
+#, markdown-text, no-wrap
+msgid "Normal view"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:8
+#, markdown-text
+msgid ""
+"Normal view will allow you to view articles in a compressed view. They can "
+"be separated by category or individual feed, or viewed in the \"main "
+"stream\" containing all feeds. Clicking a feed in the sidebar (mobile users "
+"will need to click the folder icon to open it) will open that feed’s view."
msgstr ""
#. type: Title ###
-#: en/./users/05_Configuration.md:131
-#, no-wrap
-msgid "HTTP Authentication (Apache)"
+#: en/./users/03_Main_view.md:9
+#, markdown-text, no-wrap
+msgid "Article List"
msgstr ""
-#. type: Bullet: ' 1. '
-#: en/./users/05_Configuration.md:137
-msgid "User control is based on the `.htaccess` file."
+#. type: Plain text
+#: en/./users/03_Main_view.md:18
+#, markdown-text
+msgid ""
+"By default, the normal view includes six items per article. From left to "
+"right: * **Read status:** An envelope icon to show if the article has been "
+"read or not. Closed envelopes are unread, open envelopes are read. Clicking "
+"on the icon will toggle the read status. * **Favourite status:** A star "
+"icon to show if the article has been favourited or not. Filled stars are "
+"favourited, empty stars are not. Clicking on the icon will toggle the "
+"favourite status. * **Feed name:** The name of the feed that the article is "
+"from. Clicking the feed name will move to that feed’s view in normal view. "
+"* **Article title:** The title of the article. Clicking will open the "
+"article for viewing within FreshRSS. * **Article date/time:** The time the "
+"article was posted. * **Link to original article:** A globe icon that can "
+"be clicked to go to the article on the original website."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/03_Main_view.md:19
+#, markdown-text, no-wrap
+msgid "Normal View Sidebar"
msgstr ""
-#. type: Bullet: ' 2. '
-#: en/./users/05_Configuration.md:137
+#. type: Plain text
+#: en/./users/03_Main_view.md:28
+#, markdown-text
msgid ""
-"It is best practice to place the `.htaccess` file in the `./i/` subdirectory "
-"so the API and other third party services can work."
+"Clicking the gear icon next to an individual feed will display additional "
+"options for that feed. * **Filter:** Run the defined filter to mark "
+"articles as read * **Statistics:** View statistics about the feed * **See "
+"website:** Open the feed’s website in another tab * **Manage:** Configure "
+"the feed * **Actualize:** Force-update the feed * **Mark as read:** Mark all "
+"items in the feed as read"
msgstr ""
-#. type: Bullet: ' 3. '
-#: en/./users/05_Configuration.md:137
+#. type: Title ##
+#: en/./users/03_Main_view.md:29
+#, markdown-text, no-wrap
+msgid "Global view"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:32
+#, markdown-text
msgid ""
-"If you want to limit all access to registered users only, place the file in "
-"the FreshRSS directory itself or in a parent directory. Note that WebSub and "
-"API will not work!"
+"Global view allows quick views of feed’s statuses at once. Feeds and "
+"categories are shown with the number of unread articles next to "
+"them. Clicking a feed’s name will open it in a view similar to normal view."
msgstr ""
-#. type: Bullet: ' 4. '
-#: en/./users/05_Configuration.md:137
-msgid "Example `.htaccess` file for a user \"marie\":"
+#. type: Title ##
+#: en/./users/03_Main_view.md:33
+#, markdown-text, no-wrap
+msgid "Reader view"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:138
-#, no-wrap
+#: en/./users/03_Main_view.md:36
+#, markdown-text
msgid ""
-"AuthUserFile /home/marie/repertoire/.htpasswd\n"
-"AuthGroupFile /dev/null\n"
-"AuthName \"Chez Marie\"\n"
-"AuthType Basic\n"
-"Require user marie\n"
+"Reader view will display a feed will all articles already open for "
+"reading. Feeds can be switched by clicking the folder icon at the top to "
+"bring up the category/feed sidebar."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:147
+#: en/./users/03_Main_view.md:40
+#, markdown-text
msgid ""
-"More information can be found in the [Apache "
-"documentation](http://httpd.apache.org/docs/trunk/howto/auth.html#gettingitworking)."
+"Read more: * [Refreshing the feeds](./09_refreshing_feeds.md) * [Filter the "
+"feeds and search](./10_filter.md)"
msgstr ""
#. type: Title #
-#: en/./users/05_Configuration.md:148
-#, no-wrap
+#: en/./users/04_Subscriptions.md:1
+#, markdown-text, no-wrap
+msgid "Adding a feed"
+msgstr ""
+
+#. type: Bullet: '1. '
+#: en/./users/04_Subscriptions.md:10
+#, markdown-text
+msgid ""
+"To add a feed, copy the URL of its RSS or Atom file (for instance, the "
+"Framablog RSS URL is `https://framablog.org/feed/`). FreshRSS is able to "
+"automatically find the address of the feed for websites that are declaring "
+"it in a standard way."
+msgstr ""
+
+#. type: Bullet: '2. '
+#: en/./users/04_Subscriptions.md:10
+#, markdown-text
+msgid "In FreshRSS, click the \"**+**\" button next to “Subscriptions management”."
+msgstr ""
+
+#. type: Bullet: '3. '
+#: en/./users/04_Subscriptions.md:10
+#, markdown-text
+msgid "Paste the URL in the “Feed URL” field."
+msgstr ""
+
+#. type: Bullet: '4. '
+#: en/./users/04_Subscriptions.md:10
+#, markdown-text
+msgid ""
+"(optional): You can select the category for your feed. By default, it will "
+"be in “Uncategorized”."
+msgstr ""
+
+#. type: Bullet: '5. '
+#: en/./users/04_Subscriptions.md:10
+#, markdown-text
+msgid ""
+"(optional): If the subscription requires credentials, you can enter them in "
+"the \"HTTP username\" and \"HTTP password\" fields."
+msgstr ""
+
+#. type: Bullet: '6. '
+#: en/./users/04_Subscriptions.md:10
+#, markdown-text
+msgid "(optional): You can set a timeout for the feed request."
+msgstr ""
+
+#. type: Bullet: '7. '
+#: en/./users/04_Subscriptions.md:10
+#, markdown-text
+msgid ""
+"(optional): You can choose to ignore SSL certificate errors (such as with "
+"self-signed certificates) by setting \"Verify SSL security\" to \"No\". This "
+"is not recommended, and it is better to either add the root certificate to "
+"the FreshRSS server or to fix the SSL certificate problems on the feed "
+"hosting server."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/04_Subscriptions.md:11
+#, markdown-text, no-wrap
msgid "Subscription management"
msgstr ""
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:14
+#, markdown-text
+msgid ""
+"The \"Subscription management\" submenu allows categories and feeds to be "
+"configured. Feeds can be moved between categories by drag-and-drop, or in "
+"the individual feed’s settings. Hovering over a feed/category will cause a "
+"gear icon to appear. Clicking the icon will bring up the settings for that "
+"item."
+msgstr ""
+
#. type: Title ##
-#: en/./users/05_Configuration.md:150
-#, no-wrap
+#: en/./users/04_Subscriptions.md:15
+#, markdown-text, no-wrap
+msgid "Category Settings"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/04_Subscriptions.md:17
+#, markdown-text, no-wrap
msgid "Information"
msgstr ""
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:21
+#, markdown-text
+msgid "**Title:** Name of category"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:21
+#, markdown-text
+msgid ""
+"**Display position:** Defines the order of categories. Lower numbers get "
+"priority, non-numbered items come last, and equally numbered items will sort "
+"by alphabetical order."
+msgstr ""
+
#. type: Title ##
-#: en/./users/05_Configuration.md:158
-#, no-wrap
-msgid "Login"
+#: en/./users/04_Subscriptions.md:22 en/./users/05_Configuration.md:115
+#, markdown-text, no-wrap
+msgid "Archiving"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:25
+#, markdown-text
+msgid ""
+"If \"Purge Policy\" has \"By default\" selected, then the [default purge "
+"policy](./05_Configuration.md) is used and the other options are not "
+"displayed. Category options will override the default policy, but they will "
+"not override feed-specific options."
msgstr ""
#. type: Title ##
-#: en/./users/05_Configuration.md:162
-#, no-wrap
-msgid "Advanced"
+#: en/./users/04_Subscriptions.md:26
+#, markdown-text, no-wrap
+msgid "Feed Settings"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:29
+#, markdown-text
+msgid ""
+"These fields will be auto-filled when adding a feed, but they can be "
+"modified later. **Visibility** will define if the feed is displayed in the "
+"main feed, only in specific categories, or not at all."
+msgstr ""
+
+#. type: Title #
+#: en/./users/04_Subscriptions.md:30 en/./users/05_Configuration.md:113
+#, markdown-text, no-wrap
+msgid "Archival"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:33
+#, markdown-text
+msgid ""
+"This section will let you override the default settings for feed archiving "
+"and update frequency."
msgstr ""
#. type: Title ###
-#: en/./users/05_Configuration.md:164
-#, no-wrap
-msgid "Retrieve a truncated stream from within FreshRSS"
+#: en/./users/04_Subscriptions.md:34
+#, markdown-text, no-wrap
+msgid "Login"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:167
+#: en/./users/04_Subscriptions.md:37
+#, markdown-text
+msgid ""
+"Some feeds require a username/password submitted over HTTP. These usually "
+"aren’t needed for feeds."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/04_Subscriptions.md:38
+#, markdown-text, no-wrap
+msgid "Advanced"
+msgstr ""
+
+#. type: Title ####
+#: en/./users/04_Subscriptions.md:40
+#, markdown-text, no-wrap
+msgid "Retrieve a truncated feed from within FreshRSS"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:43
+#, markdown-text
msgid ""
-"This question comes up regularly, so we will try to clarify how one can "
+"This question comes up regularly, so we’ll try to clarify how one can "
"retrieve a truncated RSS feed with FreshRSS. Please note that the process is "
"absolutely not user friendly, but it works. :)"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:169
+#: en/./users/04_Subscriptions.md:45
+#, markdown-text
msgid ""
"Please be aware that this way you’ll generate much more traffic to the "
"originating sites, and they might block you accordingly. FreshRSS "
@@ -4416,34 +5994,35 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:171
+#: en/./users/04_Subscriptions.md:47
+#, markdown-text
msgid ""
-"What’s meant by \"CSS path of articles on the original site\" actually "
-"corresponds to the \"path\" consisting of IDs and classes (which in HTML, "
-"matches the id and class attributes) to retrieve only the interesting part "
-"that corresponds to the article. Ideally, this path starts with an id (which "
-"is unique to the page)."
+"The \"Article CSS selector on original website\" corresponds to the \"path\" "
+"consisting of IDs and classes (which in HTML, matches the id and class "
+"attributes) to retrieve only the interesting part that corresponds to the "
+"article. Ideally, this path starts with an id (which is unique to the "
+"page). The basics are explained "
+"[here](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors)."
msgstr ""
-#. type: Title ####
-#: en/./users/05_Configuration.md:172
-#, no-wrap
+#. type: Title #####
+#: en/./users/04_Subscriptions.md:48
+#, markdown-text, no-wrap
msgid "Example: Rue89"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:175
+#: en/./users/04_Subscriptions.md:52
+#, markdown-text
msgid ""
"To find this path, you have to go to the address of one of the truncated "
-"articles (for example, "
-"http://www.rue89.com/2013/10/15/prof-maths-jai-atteint-lextase-dihn-pedagogie-inversee-246635). "
-"You look have to look for the \"block\" of HTML that corresponds to article "
-"content (in the source code!)."
+"articles. You look have to look for the \"block\" of HTML that corresponds "
+"to article content (in the source code!)."
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:177
-#, no-wrap
+#: en/./users/04_Subscriptions.md:54
+#, markdown-text, no-wrap
msgid ""
"Here we find that the block that encompasses nothing but the content of the "
"article is ```<div class=\"content clearfix\">```. We’ll only use the "
@@ -4453,623 +6032,1158 @@ msgid ""
".content```.\n"
msgstr ""
-#. type: Title ####
-#: en/./users/05_Configuration.md:178
-#, no-wrap
+#. type: Title #####
+#: en/./users/04_Subscriptions.md:55
+#, markdown-text, no-wrap
msgid ""
"Add the corresponding classes to the article CSS path on the feed "
-"configuration page. Examples:"
+"configuration page"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:58
+#, markdown-text
+msgid "Examples:"
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/05_Configuration.md:184
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:63
+#, markdown-text
msgid "Rue89: ```#article .content```"
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/05_Configuration.md:184
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:63
+#, markdown-text
msgid "PCINpact: ```#actu_content```"
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/05_Configuration.md:184
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:63
+#, markdown-text
msgid "Lesnumériques: ```article#body div.text.clearfix```"
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/05_Configuration.md:184
+#. type: Bullet: '* '
+#: en/./users/04_Subscriptions.md:63
+#, markdown-text
msgid "Phoronix: ```#main .content```"
msgstr ""
-#. type: Title ###
-#: en/./users/05_Configuration.md:185
+#. type: Title #####
+#: en/./users/04_Subscriptions.md:64
+#, markdown-text, no-wrap
+msgid "Combining CSS Classes"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:67
+#, markdown-text
+msgid ""
+"Let’s say we have an article which contains ads, and we do not want to have "
+"those ads retrieved by FreshRSS. Example HTML:"
+msgstr ""
+
+#. type: Fenced code block (html)
+#: en/./users/04_Subscriptions.md:68
#, no-wrap
-msgid "Retrieve a truncated stream with external tools"
+msgid ""
+"<div id=\"article\">\n"
+"<h2>wanted</h2>\n"
+"<p class=\"content\">wanted content</p>\n"
+"<p class=\"ad\">unwanted content</p>\n"
+"<h2>wanted</h2>\n"
+"<p class=\"content\">wanted content</p>\n"
+"<h2>wanted</h2>\n"
+"<p class=\"ad\">unwanted content</p>\n"
+"<p class=\"content\">wanted content</p>\n"
+"</div>\n"
msgstr ""
#. type: Plain text
-#: en/./users/05_Configuration.md:188
-msgid "Complimentary tools can be used to retrieve full article content, such as:"
+#: en/./users/04_Subscriptions.md:82
+#, markdown-text
+msgid ""
+"In this case it’s possible to combine multiple CSS selectors with a comma: "
+"```#article p.content, #article h2```"
+msgstr ""
+
+#. type: Title ####
+#: en/./users/04_Subscriptions.md:83
+#, markdown-text, no-wrap
+msgid "Retrieve a truncated feed with external tools"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:86
+#, markdown-text
+msgid "Complementary tools can be used to retrieve full article content, such as:"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/05_Configuration.md:190
+#: en/./users/04_Subscriptions.md:89
+#, markdown-text
msgid "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/05_Configuration.md:190
+#: en/./users/04_Subscriptions.md:89
+#, markdown-text
msgid "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)"
msgstr ""
-#. type: Title #
-#: en/./users/06_Fever_API.md:1
-#, no-wrap
-msgid "FreshRSS - Fever API implementation"
+#. type: Title ###
+#: en/./users/04_Subscriptions.md:90
+#, markdown-text, no-wrap
+msgid "Filter"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:5
+#: en/./users/04_Subscriptions.md:93
+#, markdown-text
msgid ""
-"See the [page about our Google Reader compatible API](06_Mobile_access.md) "
-"for another possibility and general aspects of API access."
+"Articles can be automatically marked as read based on some search terms. See "
+"[filtering](./10_filter.md) for more information on how to create these "
+"filters."
msgstr ""
#. type: Title ##
-#: en/./users/06_Fever_API.md:6
-#, no-wrap
-msgid "RSS clients"
+#: en/./users/04_Subscriptions.md:94
+#, markdown-text, no-wrap
+msgid "Import / export"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:11
+#: en/./users/04_Subscriptions.md:97
+#, markdown-text
msgid ""
-"There are many RSS clients that support the Fever API, but they seem to "
-"understand the Fever API a bit differently. If your favourite client "
-"does not work properly with this API, please create an issue and we will have a "
-"look. But we can **only** do that for free clients."
+"See [SQLite export/import]( "
+"https://github.com/FreshRSS/FreshRSS/tree/edge/cli) as an alternative."
msgstr ""
-#. type: Title ###
-#: en/./users/06_Fever_API.md:12
-#, no-wrap
-msgid "Usage & Authentication"
+#. type: Title ##
+#: en/./users/04_Subscriptions.md:98
+#, markdown-text, no-wrap
+msgid "Export"
+msgstr ""
+
+#. type: Bullet: '1. '
+#: en/./users/04_Subscriptions.md:108
+#, markdown-text
+msgid "To export your list of feeds, go to “Subscriptions management”."
+msgstr ""
+
+#. type: Bullet: '2. '
+#: en/./users/04_Subscriptions.md:108
+#, markdown-text
+msgid "Click on “Import / export”"
+msgstr ""
+
+#. type: Bullet: '3. '
+#: en/./users/04_Subscriptions.md:108
+#, markdown-text
+msgid "You can select for your export:"
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/04_Subscriptions.md:108
+#, markdown-text
+msgid "the list of feeds"
+msgstr ""
+
+#. type: Bullet: ' 2. '
+#: en/./users/04_Subscriptions.md:108
+#, markdown-text
+msgid "labelled articles"
+msgstr ""
+
+#. type: Bullet: ' 3. '
+#: en/./users/04_Subscriptions.md:108
+#, markdown-text
+msgid "favourite articles"
+msgstr ""
+
+#. type: Bullet: ' 4. '
+#: en/./users/04_Subscriptions.md:108
+#, markdown-text
+msgid ""
+"and finally, you can select feeds you want to export (by default, all feeds "
+"are selected)"
+msgstr ""
+
+#. type: Bullet: '4. '
+#: en/./users/04_Subscriptions.md:108
+#, markdown-text
+msgid "Click on “export”."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/04_Subscriptions.md:109
+#, markdown-text, no-wrap
+msgid "Import"
+msgstr ""
+
+#. type: Bullet: '1. '
+#: en/./users/04_Subscriptions.md:114
+#, markdown-text
+msgid "Go to the page “Import / export”."
+msgstr ""
+
+#. type: Bullet: '2. '
+#: en/./users/04_Subscriptions.md:114
+#, markdown-text
+msgid "Click on “Browse” and select your OPML or archive file on your computer."
+msgstr ""
+
+#. type: Bullet: '3. '
+#: en/./users/04_Subscriptions.md:114
+#, markdown-text
+msgid "Click on “Import”"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:16
+#: en/./users/04_Subscriptions.md:122
+#, markdown-text, no-wrap
msgid ""
-"Before you can start using this API, you have to enable and setup API "
-"access, which is [documented "
-"here](https://freshrss.github.io/FreshRSS/en/users/06_Mobile_access.html), "
-"and then reset the user’s API password."
+"> **Important**: you can not import directly a list of feeds from a text "
+"file.\n"
+"> You need to convert it beforehand to _OPML_.\n"
+"> Here is some tools you could use :\n"
+">\n"
+"> * [Pandoc](https://pandoc.org/) available for most systems,\n"
+"> * [OPML generator](https://opml-gen.ovh/) available online,\n"
+"> * [txt2opml](https://alterfiles.com/convert/txt/opml) available online.\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/04_Subscriptions.md:123
+#, markdown-text, no-wrap
+msgid "Use bookmarklet"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:18
+#: en/./users/04_Subscriptions.md:126
+#, markdown-text
msgid ""
-"Then point your mobile application to the `fever.php` address "
-"(e.g. `https://freshrss.example.net/api/fever.php`)."
+"Bookmarklets are little scripts that you can execute to perform various "
+"tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds."
+msgstr ""
+
+#. type: Bullet: '1. '
+#: en/./users/04_Subscriptions.md:129
+#, markdown-text
+msgid "Open “Subscriptions management”."
+msgstr ""
+
+#. type: Bullet: '2. '
+#: en/./users/04_Subscriptions.md:129
+#, markdown-text
+msgid "Click on “Subscription tools”."
+msgstr ""
+
+#. type: Bullet: '3. '
+#: en/./users/04_Subscriptions.md:129
+#, markdown-text
+msgid ""
+"Drag the “Subscribe” button to your bookmark toolbar or right click and "
+"choose your browser’s “Bookmark link” action."
msgstr ""
#. type: Title #
-#: en/./users/06_Fever_API.md:19 en/./users/06_Mobile_access.md:44
-#, no-wrap
-msgid "Compatible clients"
+#: en/./users/05_Configuration.md:2
+#, markdown-text, no-wrap
+msgid "Display"
msgstr ""
-#. type: Plain text
-#: en/./users/06_Fever_API.md:22
-msgid "Tested with:"
+#. type: Title ##
+#: en/./users/05_Configuration.md:4
+#, markdown-text, no-wrap
+msgid "Language"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:25
-#, no-wrap
+#: en/./users/05_Configuration.md:9
+#, markdown-text
msgid ""
-"* Android\n"
-" * "
-"[Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) "
-"(Closed source)\n"
+"FreshRSS is currently available in 22 languages. After confirming your "
+"choice, the interface will be displayed in your preferred language. "
+"Depending on the language chosen, parts of the interface may not be not "
+"translated yet. If you’re willing to help translate the missing bits or "
+"would like to add a new language, please take a look at how you can "
+"[contribute to the "
+"project](../contributing.md#contribute-to-internationalization-i18n)."
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:30
-#, no-wrap
+#: en/./users/05_Configuration.md:11
+#, markdown-text
msgid ""
-"* iOS\n"
-" * [Fiery "
-"Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) "
-"(Closed source)\n"
-" * [Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) "
-"(Commercial)\n"
-" * [Reeder](https://www.reederapp.com/) (Commercial) (Use its Google Reader "
-"API / native FreshRSS option when possible)\n"
+"Some parts of FreshRSS are not translated and are not intended to be "
+"translated either. For now, this includes the logs visible in the "
+"application as well as the log generated by automatic update scripts."
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:33
-#, no-wrap
-msgid ""
-"* MacOS\n"
-" * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial)\n"
+#: en/./users/05_Configuration.md:13
+#, markdown-text
+msgid "Available languages are:"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:38
+#, markdown-text, no-wrap
+msgid ""
+"| Language (English name) | Language (Endonym) | Ordered by language code "
+"(ISO-639-1) |\n"
+"|:------------------------|:-----------------------|:-------------------------------------|\n"
+"| Czech | Čeština | cz "
+"|\n"
+"| German | Deutsch | de "
+"|\n"
+"| Greek | Ελληνικά | el "
+"|\n"
+"| English | English | en "
+"|\n"
+"| English (United States) | English (United States) | en-us "
+"|\n"
+"| Spanish | Español | es "
+"|\n"
+"| French | Français | fr "
+"|\n"
+"| Hebrew | עברית | he "
+"|\n"
+"| Indonesian | Bahasa Indonesia | id "
+"|\n"
+"| Italian | Italiano | it "
+"|\n"
+"| Japanease | 日本語 | ja "
+"|\n"
+"| Korean | 한국어 | ko "
+"|\n"
+"| Latvian | Latviešu | lv "
+"|\n"
+"| Dutch | Nederlands | nl "
+"|\n"
+"| Occitan | Occitan | oc "
+"|\n"
+"| Polish | Polski | pl "
+"|\n"
+"| Brazilian Portuguese | PortuguĂŞs (Brasil) | pt-br "
+"|\n"
+"| Russian | Đ ŃŃŃкий | ru "
+"|\n"
+"| Slovak | SlovenÄŤina | sk "
+"|\n"
+"| Turkish | Türkçe | tr "
+"|\n"
+"| Chinese (Simplified, People’s Republic of China) | 简体中文 | zh-cn "
+"|\n"
+"| Chinese (Traditional, Taiwan) | 正體中文 | zh-tw "
+"|\n"
msgstr ""
#. type: Title ##
-#: en/./users/06_Fever_API.md:35
-#, no-wrap
-msgid "Features"
+#: en/./users/05_Configuration.md:39
+#, markdown-text, no-wrap
+msgid "Theme"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:38
-msgid "The following features are implemented:"
+#: en/./users/05_Configuration.md:42
+#, markdown-text
+msgid ""
+"There’s no accounting for tastes, which is why FreshRSS offers 13 official "
+"themes:"
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "fetching categories"
+#. type: Plain text
+#: en/./users/05_Configuration.md:58
+#, markdown-text, no-wrap
+msgid ""
+"| Theme | designed by | Notes "
+"|\n"
+"|:--------------|:-------------------------------------------------------|:--------------------------------------------------------------|\n"
+"| Alternative Dark | Ghost | |\n"
+"| Ansum | Thomas Guesnon | |\n"
+"| Blue Lagoon |Mister aiR | No longer supported. Will be removed with "
+"FreshRSS V1.22.0 |\n"
+"| Dark | AD | |\n"
+"| Dark pink | Miicat_47 | |\n"
+"| Flat design | Marien Fressinaud | |\n"
+"| Mapco | Thomas Guesnon | |\n"
+"| Nord theme | joelchrono12 | |\n"
+"| Origine | Marien Fressinaud | (default theme) |\n"
+"| Origine-compact | Kevin Papst | |\n"
+"| Pafat | Plopoyop | |\n"
+"| Screwdriver | Mister aiR | No longer supported. Will be removed with "
+"FreshRSS V1.22.0 |\n"
+"| Swage | Patrick Crandol | |\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:60
+#, markdown-text
+msgid ""
+"If you can’t find any themes you like, it’s always possible to [create your "
+"own](../developers/04_Frontend/02_Design.md)."
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "fetching feeds"
+#. type: Plain text
+#: en/./users/05_Configuration.md:62
+#, markdown-text
+msgid ""
+"To select a theme, simply scroll through the themes and select one that "
+"strikes your fancy. After confirmation, the theme will be applied to the "
+"interface."
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
+#. type: Title ##
+#: en/./users/05_Configuration.md:63
+#, markdown-text, no-wrap
+msgid "Content width"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:66
+#, markdown-text
msgid ""
-"fetching RSS items (new, favorites, unread, by_id, by_feed, by_category, "
-"since)"
+"Some people prefer short lines of text, while others prefer to maximize the "
+"available screen space. To satisfy the maximum number of people, it’s "
+"possible to customize the width of the displayed content. There are four "
+"settings available:"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "fetching favicons"
+#: en/./users/05_Configuration.md:71
+#, markdown-text
+msgid "**Fine** displays content up to a maximum width of 550 pixels"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "setting read marker for item(s)"
+#: en/./users/05_Configuration.md:71
+#, markdown-text
+msgid "**Medium** displays content up to a maximum width of 800 pixels"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "setting starred marker for item(s)"
+#: en/./users/05_Configuration.md:71
+#, markdown-text
+msgid "**Large** displays content up to a maximum width of 1000 pixels"
msgstr ""
#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "setting read marker for feed"
+#: en/./users/05_Configuration.md:71
+#, markdown-text
+msgid "**No limit** displays the content on 100% of the available space"
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "setting read marker for category"
+#. type: Title ##
+#: en/./users/05_Configuration.md:72
+#, markdown-text, no-wrap
+msgid "Article icons"
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:48
-msgid "supports FreshRSS extensions, which use the `entry_before_display` hook"
+#. type: Plain text
+#: en/./users/05_Configuration.md:75
+#, markdown-text
+msgid "Please note that this section only affects normal view."
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:50
-msgid "The following features are not supported:"
+#: en/./users/05_Configuration.md:77
+#, markdown-text
+msgid "![Article icons configuration](../img/users/configuration.article.icons.png)"
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:52
+#. type: Plain text
+#: en/./users/05_Configuration.md:80
+#, markdown-text
msgid ""
-"**Hot Links** aka **hot** as there is nothing in FreshRSS yet that is "
-"similar or could be used to simulate it."
+"Each article is rendered with a header (top line) and a footer (bottom "
+"line). In that section, you can choose what will be displayed in those."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:84
+#, markdown-text
+msgid ""
+"If you disable every item in the top line, you’ll still be able to see it "
+"since it contains the feed name and the article title. But if you do the "
+"same thing for the bottom line, it will be empty."
msgstr ""
#. type: Title ##
-#: en/./users/06_Fever_API.md:53
-#, no-wrap
-msgid "Testing and debugging"
+#: en/./users/05_Configuration.md:85
+#, markdown-text, no-wrap
+msgid "HTML5 notification timeout"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:56
+#: en/./users/05_Configuration.md:88
+#, markdown-text
msgid ""
-"If this API does not work as expected in your RSS reader, you can test it "
-"manually with a tool like [Postman](https://www.getpostman.com/)."
+"After automatically updating the feeds, FreshRSS can pop up a notification "
+"using the HTML5 notification API."
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:58
+#: en/./users/05_Configuration.md:90
+#, markdown-text
+msgid "The duration of this notification can be set. By default, the value is 0."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:91
+#, markdown-text, no-wrap
+msgid "Show the navigation button"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:94
+#, markdown-text
msgid ""
-"Configure a POST request to the URL "
-"https://freshrss.example.net/api/fever.php?api which should give you the "
-"result:"
+"By default, FreshRSS displays buttons to ease the article navigation when "
+"browsing on mobile. The drawback is that they eat up some precious space."
msgstr ""
-#. type: Code fence info string
-#: en/./users/06_Fever_API.md:58 en/./users/06_Fever_API.md:80
-#, no-wrap
-msgid "json"
+#. type: Plain text
+#: en/./users/05_Configuration.md:96
+#, markdown-text
+msgid ""
+"![navigation button "
+"configuration](../img/users/configuration.navigation.button.png)"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:58
-#, no-wrap
+#: en/./users/05_Configuration.md:98
+#, markdown-text
msgid ""
-"{\n"
-"\t\"api_version\": 3,\n"
-"\t\"auth\": 0\n"
-"}\n"
+"If you don’t use those buttons because you never browse on mobile or because "
+"you browse with gestures, you can disable them from the interface."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:99
+#, markdown-text, no-wrap
+msgid "Reading"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:101
+#, markdown-text, no-wrap
+msgid "Number of articles per page"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:65
-msgid "Great, the base setup seems to work!"
+#: en/./users/05_Configuration.md:104
+#, markdown-text
+msgid ""
+"This setting defines the number of articles to display at once before "
+"needing to load more. In normal and reading view, more articles are loaded "
+"automatically. In global view, a button will appear at the bottom of the "
+"list."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:105
+#, markdown-text, no-wrap
+msgid "Articles to display"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:68
+#: en/./users/05_Configuration.md:108
+#, markdown-text
msgid ""
-"Now lets try an authenticated call. Fever uses an `api_key`, which is the "
-"MD5 hash of `\"$username:$apiPassword\"`. Assuming the user is `kevin` and "
-"the password `freshrss`, here is a command-line example to compute the "
-"resulting `api_key`"
+"The status of articles to display when loading FreshRSS. \"Adjust showing\" "
+"will display only unread articles by default, but will display all articles "
+"when there are no unread articles to show."
msgstr ""
-#. type: Code fence info string
-#: en/./users/06_Fever_API.md:69 en/./users/06_Fever_API.md:75 en/./users/06_Mobile_access.md:69 en/./users/07_Frequently_Asked_Questions.md:37 en/./users/07_Frequently_Asked_Questions.md:45
-#, no-wrap
-msgid "sh"
+#. type: Title ##
+#: en/./users/05_Configuration.md:109
+#, markdown-text, no-wrap
+msgid "Use “lazy load” mode to load images"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:69
-#, no-wrap
-msgid "api_key=`echo -n \"kevin:freshrss\" | md5sum | cut -d' ' -f1`\n"
+#: en/./users/05_Configuration.md:112
+#, markdown-text
+msgid ""
+"This will set images to load as they are viewed. This can save data, but "
+"will can cause images to load in later."
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:74
+#: en/./users/05_Configuration.md:118
+#, markdown-text
msgid ""
-"Add a body to your POST request encoded as `form-data` and one key named "
-"`api_key` with the value `your-password-hash`:"
+"These are the global options for fetching and retaining articles from "
+"feeds. They can be overridden by individual feed’s settings."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:119
+#, markdown-text, no-wrap
+msgid "Maintenance"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:75
-#, no-wrap
+#: en/./users/05_Configuration.md:122
+#, markdown-text
msgid ""
-"curl -s -F \"api_key=$api_key\" "
-"'https://freshrss.example.net/api/fever.php?api'\n"
+"This allows for purging/optimizing the current user’s articles in the "
+"database."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:123
+#, markdown-text, no-wrap
+msgid "Sharing"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:80
-msgid "This should give:"
+#: en/./users/05_Configuration.md:126
+#, markdown-text
+msgid "To make your life easier, you can share articles straight from FreshRSS."
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:80
-#, no-wrap
+#: en/./users/05_Configuration.md:128
+#, markdown-text
msgid ""
-"{\n"
-"\t\"api_version\": 3,\n"
-"\t\"auth\": 1,\n"
-"\t\"last_refreshed_on_time\": \"1520013061\"\n"
-"}\n"
+"At the moment, FreshRSS supports [20+ sharing "
+"services](08_sharing_services.md), ranging from self-hosted services "
+"(Shaarli, etc.) to proprietary services (Facebook, etc.)."
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:88
+#: en/./users/05_Configuration.md:131
+#, markdown-text
msgid ""
-"Perfect, you’re now authenticated and you can start testing the more "
-"advanced features. To do so, change the URL and append the possible API "
-"actions to your request parameters. Please refer to the [original Fever "
-"documentation](https://feedafever.com/api) for more information."
+"By default, the sharing list is empty. ![Sharing "
+"configuration](../img/users/configuration.sharing.png)"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:90
-msgid "Some basic calls are:"
+#: en/./users/05_Configuration.md:133
+#, markdown-text
+msgid "To add a new item to the list, please follow the following simple steps:"
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&items"
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:138
+#, markdown-text
+msgid "Select the desired sharing method in the drop-down list."
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&feeds"
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:138
+#, markdown-text
+msgid "Press the ```âśš``` button to add it to the list."
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&groups"
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:138
+#, markdown-text
+msgid ""
+"Configure the method in the list. All names can be modified in the "
+"display. Some methods need the sharing URL to be able to work properly (ex: "
+"Shaarli)."
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&unread_item_ids"
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:138 en/./users/05_Configuration.md:143
+#, markdown-text
+msgid "Submit your changes."
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&saved_item_ids"
+#. type: Plain text
+#: en/./users/05_Configuration.md:140
+#, markdown-text
+msgid "To remove an item from the list, follow those simple steps:"
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&items&since_id=some_id"
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:143
+#, markdown-text
+msgid "Press the ```❌``` button next to the share method you want to remove."
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&items&max_id=some_id"
+#. type: Title #
+#: en/./users/05_Configuration.md:145
+#, markdown-text, no-wrap
+msgid "Shortcuts"
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id"
+#. type: Plain text
+#: en/./users/05_Configuration.md:149
+#, markdown-text
+msgid ""
+"To ease the use of the application, FreshRSS comes with a lot of predefined "
+"keyboard shortcuts. They allow actions to improve the user experience with "
+"a keyboard."
msgstr ""
-#. type: Bullet: '* '
-#: en/./users/06_Fever_API.md:100
-msgid "https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id"
+#. type: Plain text
+#: en/./users/05_Configuration.md:151
+#, markdown-text
+msgid ""
+"Of course, if you’re not satisfied with the key mapping, you can change you "
+"configuration to fit your needs."
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:102
+#: en/./users/05_Configuration.md:153
+#, markdown-text
+msgid "There are 4 types of shortcuts:"
+msgstr ""
+
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:158
+#, markdown-text
+msgid "Views: they allow switching views with ease."
+msgstr ""
+
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:158
+#, markdown-text
+msgid "Navigation: they allow navigation through articles, feeds, and categories."
+msgstr ""
+
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:158
+#, markdown-text
msgid ""
-"Replace `some_id` with a real ID from your `freshrss_username_entry` "
-"database."
+"Article actions: they allow interactions with an article, like sharing or "
+"opening it on the original web-site."
msgstr ""
-#. type: Title ###
-#: en/./users/06_Fever_API.md:103
-#, no-wrap
-msgid "Debugging"
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:158
+#, markdown-text
+msgid ""
+"Other actions: they allow other interactions with the application, like "
+"opening the user queries menu or accessing the documentation."
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:106
+#: en/./users/05_Configuration.md:161
+#, markdown-text
msgid ""
-"If nothing helps and your client is still misbehaving, you can add the "
-"following lines to the beginning of the `fever.api` file to determine the "
-"cause of the problems:"
+"It’s worth noting that the share article action has two levels. Once you "
+"press the shortcut, a menu containing all the share options opens. To "
+"choose one share option, you need to select it by its number. When there is "
+"only one option, it’s selected automatically though."
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:107
-#, no-wrap
+#: en/./users/05_Configuration.md:163
+#, markdown-text
+msgid "The same process applies to the user queries."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:166
+#, markdown-text
msgid ""
-"file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' "
-". json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);\n"
+"Be aware that there is no validation on the selected shortcuts. This means "
+"that if you assign a shortcut to more than one action, you’ll end up with "
+"some unexpected behavior."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:167
+#, markdown-text, no-wrap
+msgid "User queries"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:112
+#: en/./users/05_Configuration.md:171
+#, markdown-text
msgid ""
-"Then use your RSS client to query the API and afterwards check the file "
-"`fever.log`."
+"You can configure your [user queries](./03_Main_view.md) in that "
+"section. There is not much to say here as it is pretty straightforward. You "
+"can only change user query titles or drop them."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:173
+#, markdown-text
+msgid "At the moment, there is no helper to build a user query from here."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:174
+#, markdown-text, no-wrap
+msgid "Profile"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:177
+#, markdown-text
+msgid ""
+"You can change your email address or password here. The authentication token "
+"is required for accessing the aggregated RSS feed for a user. A blank token "
+"will disable accessing the RSS feed without being logged in."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:181
+#, markdown-text
+msgid ""
+"Extensions can be managed from this menu. Note that while extensions can be "
+"removed from the web interface, they cannot be added from it."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:182
+#, markdown-text, no-wrap
+msgid "Users"
msgstr ""
#. type: Title ##
-#: en/./users/06_Fever_API.md:113
+#: en/./users/05_Configuration.md:186
+#, markdown-text, no-wrap
+msgid "Authentication methods"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/05_Configuration.md:188
+#, markdown-text, no-wrap
+msgid "HTTP Authentication (Apache)"
+msgstr ""
+
+#. type: Bullet: '1. '
+#: en/./users/05_Configuration.md:194
+#, markdown-text
+msgid "User control is based on the `.htaccess` file."
+msgstr ""
+
+#. type: Bullet: '2. '
+#: en/./users/05_Configuration.md:194
+#, markdown-text
+msgid ""
+"It is best practice to place the `.htaccess` file in the `./i/` subdirectory "
+"so the API and other third party services can work."
+msgstr ""
+
+#. type: Bullet: '3. '
+#: en/./users/05_Configuration.md:194
+#, markdown-text
+msgid ""
+"If you want to limit all access to registered users only, place the file in "
+"the FreshRSS directory itself or in a parent directory. Note that WebSub and "
+"API will not work!"
+msgstr ""
+
+#. type: Bullet: '4. '
+#: en/./users/05_Configuration.md:194
+#, markdown-text
+msgid "Example `.htaccess` file for a user \"marie\":"
+msgstr ""
+
+#. type: Fenced code block (apache)
+#: en/./users/05_Configuration.md:195
#, no-wrap
-msgid "Credits"
+msgid ""
+"AuthUserFile /home/marie/repertoire/.htpasswd\n"
+"AuthGroupFile /dev/null\n"
+"AuthName \"Chez Marie\"\n"
+"AuthType Basic\n"
+"Require user marie\n"
msgstr ""
#. type: Plain text
-#: en/./users/06_Fever_API.md:115
+#: en/./users/05_Configuration.md:204
+#, markdown-text
msgid ""
-"This plugin was inspired by the "
-"[tinytinyrss-fever-plugin](https://github.com/dasmurphy/tinytinyrss-fever-plugin)."
+"More information can be found in the [Apache "
+"documentation](http://httpd.apache.org/docs/trunk/howto/auth.html#gettingitworking)."
msgstr ""
#. type: Plain text
#: en/./users/06_Mobile_access.md:2
+#, markdown-text
msgid ""
"This page assumes you have completed the [server "
-"setup](../admins/02_Installation.md)."
+"setup](../admins/03_Installation.md)."
msgstr ""
#. type: Title #
#: en/./users/06_Mobile_access.md:3
-#, no-wrap
+#, markdown-text, no-wrap
+msgid "Mobile Access"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Mobile_access.md:6
+#, markdown-text
+msgid "You can access FreshRSS on mobile devices via browser and via mobile apps."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/06_Mobile_access.md:8
+#, markdown-text, no-wrap
+msgid "Access via Browser"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Mobile_access.md:11
+#, markdown-text
+msgid ""
+"The FreshRSS user interface is optimized for both small and large "
+"screens. The content will fit nicely on small mobile device screens as well."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/06_Mobile_access.md:13
+#, markdown-text, no-wrap
+msgid "Access via Mobile App"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Mobile_access.md:16
+#, markdown-text
+msgid ""
+"FreshRSS supports access from mobile / native apps for Linux, Android, iOS, "
+"Windows and macOS, via two distinct APIs: Google Reader API (best), and "
+"Fever API (limited features and less efficient)."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Mobile_access.md:18
+#, markdown-text
+msgid ""
+"A list of known apps is available on the [FreshRSS GitHub "
+"page](https://github.com/FreshRSS/FreshRSS#apis--native-apps)."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/06_Mobile_access.md:20
+#, markdown-text, no-wrap
msgid "Enable the API in FreshRSS"
msgstr ""
#. type: Bullet: '1. '
-#: en/./users/06_Mobile_access.md:9
+#: en/./users/06_Mobile_access.md:26
+#, markdown-text
msgid ""
"Under the section “Authentication”, enable the option “Allow API access "
"(required for mobile apps)”."
msgstr ""
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:9
-#, no-wrap
+#. type: Bullet: '2. '
+#: en/./users/06_Mobile_access.md:26
+#, markdown-text
+msgid ""
+"Under the section “Profile”, fill-in the field “API password (e.g., for "
+"mobile apps)”."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:26
+#, markdown-text
+msgid "Every user must define an API password."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:26
+#, markdown-text
msgid ""
-"2. Under the section “Profile”, fill-in the field “API password (e.g., for "
-"mobile apps)”.\n"
-"\t* Every user must define an API password.\n"
-"\t* The reason for an API-specific password is that it may be used in less "
-"safe situations than the main password, and does not grant access to as many "
-"things.\n"
+"The reason for an API-specific password is that it may be used in less safe "
+"situations than the main password, and does not grant access to as many "
+"things."
msgstr ""
#. type: Plain text
-#: en/./users/06_Mobile_access.md:12
+#: en/./users/06_Mobile_access.md:29
+#, markdown-text
msgid ""
-"The rest of this page is about the Google Reader compatible API. See the "
-"[page about the Fever compatible API](06_Fever_API.md) for another "
-"possibility."
+"See the [page about the Google Reader compatible "
+"API](../developers/06_GoogleReader_API.md) for more details. See the [page "
+"about the Fever compatible API](../developers/06_Fever_API.md) for more "
+"details."
msgstr ""
-#. type: Title #
-#: en/./users/06_Mobile_access.md:14
-#, no-wrap
+#. type: Title ###
+#: en/./users/06_Mobile_access.md:31
+#, markdown-text, no-wrap
msgid "Testing"
msgstr ""
-#. type: Bullet: '3. '
-#: en/./users/06_Mobile_access.md:21
+#. type: Bullet: '1. '
+#: en/./users/06_Mobile_access.md:38
+#, markdown-text
msgid ""
"Under the section “Profile”, click on the link like "
"`https://rss.example.net/api/` next to the field “API password”."
msgstr ""
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:21
-#, no-wrap
+#. type: Bullet: '2. '
+#: en/./users/06_Mobile_access.md:38
+#, markdown-text
+msgid "Click on first link “Check full server configuration”:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:38
+#, markdown-text
+msgid "If you get *PASS* then you are done; all is well."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:38
+#, markdown-text
msgid ""
-"4. Click on first link “Check full server configuration”:\n"
-"\t* If you get *PASS* then you are done, all is good: you may proceed to "
-"step 6.\n"
-"\t* If you get *Bad Request!* or *Not Found*, then your server probably does "
-"not accept slashes `/` that are escaped `%2F`. Proceed to step 5.\n"
-"\t* If you get any other error message, proceed to step 5.\n"
+"If you get *Bad Request!* or *Not Found*, then your server probably does not "
+"accept slashes `/` that are escaped `%2F`, see the next section \"Fix server "
+"configuration\"."
msgstr ""
-#. type: Title #
-#: en/./users/06_Mobile_access.md:23
-#, no-wrap
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:38
+#, markdown-text
+msgid ""
+"If you receive any other error message, see the next section “Fix server "
+"configuration”."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/06_Mobile_access.md:39
+#, markdown-text, no-wrap
msgid "Fix server configuration"
msgstr ""
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:42
-#, no-wrap
+#. type: Bullet: '* '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
msgid ""
-"5. Click on the second link “Check partial server configuration (without "
-"`%2F` support)”:\n"
-"\t* If you get `PASS`, then the problem is indeed that your server does not "
-"accept slashes `/` that are escaped `%2F`.\n"
-"\t\t* With Apache, remember the directive [`AllowEncodedSlashes "
-"On`](http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes)\n"
-"\t\t* Or use a client that does not escape slashes (such as EasyRSS), in "
-"which case proceed to step 6.\n"
-"\t* If you get *Service Unavailable!*, then check from step 1 again.\n"
-"\t* With __Apache__:\n"
-"\t\t* If you get *FAIL getallheaders!*, the combination of your PHP version "
-"and your Web server does not provide access to "
-"[`getallheaders`](http://php.net/getallheaders)\n"
-"\t\t\t* Turn on Apache `mod_setenvif` (often enabled by default), or "
-"`mod_rewrite` with the following procedure:\n"
-"\t\t\t\t* Allow [`FileInfo` in "
-"`.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride): "
-"see the [server setup](../admins/02_Installation.md) again.\n"
-"\t\t\t\t* Enable "
-"[`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html):\n"
-"\t\t\t\t\t* With Debian / Ubuntu: `sudo a2enmod rewrite`\n"
-"\t* With __nginx__:\n"
-"\t\t* If you get *Bad Request!*, check your server `PATH_INFO` "
-"configuration.\n"
-"\t\t* If you get *File not found!*, check your server "
-"`fastcgi_split_path_info`.\n"
-"\t* If you get *FAIL 64-bit or GMP extension!*, then your PHP version does "
-"not pass the requirement of being 64-bit and/or have PHP "
-"[GMP](http://php.net/gmp) extension.\n"
-"\t\t* The easiest is to add the GMP extension. On Debian / Ubuntu: `sudo apt "
-"install php-gmp`\n"
-"\t* Update and try again from step 3.\n"
-msgstr ""
-
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:48
-#, no-wrap
+"Click on the second link “Check partial server configuration (without `%2F` "
+"support)”:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
msgid ""
-"6. On the same FreshRSS API page, note the address given under “Your API "
-"address”, like `https://freshrss.example.net/api/greader.php`\n"
-"\t* Type the API address in a client, together with your FreshRSS username, "
-"and the corresponding special API password.\n"
+"If you get `PASS`, then the problem is indeed that your server does not "
+"accept slashes `/` that are escaped `%2F`."
msgstr ""
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:63
-#, no-wrap
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
msgid ""
-"7. Pick a client supporting a Google Reader-like API. Selection:\n"
-"\t* Android\n"
-"\t\t* "
-"[News+](https://github.com/noinnion/newsplus/blob/master/apk/NewsPlus_202.apk) "
-"with [News+ Google Reader "
-"extension](https://github.com/noinnion/newsplus/tree/master/extensions/GoogleReaderCloneExtension) "
-"(Closed source)\n"
-"\t\t* [FeedMe "
-"3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) "
-"(Closed source)\n"
-"\t\t* [EasyRSS](https://github.com/Alkarex/EasyRSS) (Open source, "
-"[F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/))\n"
-"\t* Linux\n"
-"\t\t* [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Open "
-"source)\n"
-"\t* MacOS\n"
-"\t\t* [Vienna RSS](http://www.vienna-rss.com/) (Open source)\n"
-"\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
-"\t* iOS\n"
-"\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
-"\t* Firefox\n"
-"\t\t* "
-"[FreshRSS-Notify](https://addons.mozilla.org/firefox/addon/freshrss-notify-webextension/) "
-"(Open source)\n"
+"With Apache, remember the directive [`AllowEncodedSlashes "
+"On`](http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes)"
msgstr ""
-#. type: Title #
-#: en/./users/06_Mobile_access.md:65
-#, no-wrap
-msgid "Google Reader compatible API"
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid ""
+"Or use a client that does not escape slashes (such as EasyRSS) ([`check "
+"client list`](https://github.com/FreshRSS/FreshRSS#apis--native-apps))."
msgstr ""
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:68
-msgid "Examples of basic queries:"
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid ""
+"If you get *Service Unavailable!*, then check the preceding section “Enable "
+"the API in FreshRSS” again."
msgstr ""
-#. type: Plain text
-#: en/./users/06_Mobile_access.md:69
-#, no-wrap
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid "With __Apache__:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
msgid ""
-"# Initial login, using API password (Email and Passwd can be given either as "
-"GET, or POST - better)\n"
-"curl "
-"'https://freshrss.example.net/api/greader.php/accounts/ClientLogin?Email=alice&Passwd=Abcdef123456'\n"
-"SID=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
-"Auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
-"\n"
-"# Examples of read-only requests\n"
-"curl -s -H \"Authorization:GoogleLogin "
-"auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" "
-"'https://freshrss.example.net/api/greader.php/reader/api/0/subscription/list?output=json'\n"
-"\n"
-"curl -s -H \"Authorization:GoogleLogin "
-"auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" "
-"'https://freshrss.example.net/api/greader.php/reader/api/0/unread-count?output=json'\n"
-"\n"
-"curl -s -H \"Authorization:GoogleLogin "
-"auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" "
-"'https://freshrss.example.net/api/greader.php/reader/api/0/tag/list?output=json'\n"
-"\n"
-"# Retrieve a token for requests making modifications\n"
-"curl -H \"Authorization:GoogleLogin "
-"auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" 'https://freshrss.example.net/api/greader.php/reader/api/0/token'\n"
-"8e6845e089457af25303abc6f53356eb60bdb5f8ZZZZZZZZZZZZZZZZZ\n"
-"\n"
-"# Get articles, piped to jq for easier JSON reading\n"
-"curl -s -H \"Authorization:GoogleLogin "
-"auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
-" "
-"'https://freshrss.example.net/api/greader.php/reader/api/0/stream/contents/reading-list' "
-"| jq .\n"
+"If you get *FAIL getallheaders!*, the combination of your PHP version and "
+"your Web server does not provide access to "
+"[`getallheaders`](http://php.net/getallheaders)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid ""
+"Turn on Apache `mod_setenvif` (often enabled by default), or `mod_rewrite` "
+"with the following procedure:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid ""
+"Allow [`FileInfo` in "
+"`.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride): "
+"see the [server setup](../admins/03_Installation.md) again."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid ""
+"Enable "
+"[`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html):"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid "With Debian / Ubuntu: `sudo a2enmod rewrite`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid "With __nginx__:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid "If you get *Bad Request!*, check your server `PATH_INFO` configuration."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid "If you get *File not found!*, check your server `fastcgi_split_path_info`."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid ""
+"If you get *FAIL 64-bit or GMP extension!*, then your PHP version does not "
+"pass the requirement of being 64-bit and/or have PHP "
+"[GMP](http://php.net/gmp) extension."
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid ""
+"The easiest is to add the GMP extension. On Debian / Ubuntu: `sudo apt "
+"install php-gmp`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/06_Mobile_access.md:57
+#, markdown-text
+msgid "Update and try again from the preceding section “Testing”."
msgstr ""
#. type: Plain text
#: en/./users/07_Frequently_Asked_Questions.md:2
+#, markdown-text
msgid ""
"We may not have answered all of your questions in the previous sections. The "
"FAQ contains some questions that have not been answered elsewhere."
@@ -5077,17 +7191,19 @@ msgstr ""
#. type: Title ##
#: en/./users/07_Frequently_Asked_Questions.md:3
-#, no-wrap
+#, markdown-text, no-wrap
msgid "What is `/i` at the end of the application URL?"
msgstr ""
#. type: Plain text
#: en/./users/07_Frequently_Asked_Questions.md:6
+#, markdown-text
msgid "Of course, ```/i``` has a purpose! It’s used for performance and usability:"
msgstr ""
#. type: Bullet: '* '
#: en/./users/07_Frequently_Asked_Questions.md:11
+#, markdown-text
msgid ""
"It allows for serving icons, images, styles and scripts without "
"cookies. Without that trick, those files would be downloaded more often, "
@@ -5097,6 +7213,7 @@ msgstr ""
#. type: Bullet: '* '
#: en/./users/07_Frequently_Asked_Questions.md:11
+#, markdown-text
msgid ""
"The ```./p/``` public root can be served without any HTTP access "
"restrictions. Whereas it could be implemented in ```./p/i/```."
@@ -5104,6 +7221,7 @@ msgstr ""
#. type: Bullet: '* '
#: en/./users/07_Frequently_Asked_Questions.md:11
+#, markdown-text
msgid ""
"It avoids problems while serving public resources like ```favicon.ico```, "
"```robots.txt```, etc."
@@ -5111,6 +7229,7 @@ msgstr ""
#. type: Bullet: '* '
#: en/./users/07_Frequently_Asked_Questions.md:11
+#, markdown-text
msgid ""
"It allows the logo to be displayed instead of a white page while hitting a "
"restriction or a delay during the loading process."
@@ -5118,12 +7237,13 @@ msgstr ""
#. type: Title ##
#: en/./users/07_Frequently_Asked_Questions.md:12
-#, no-wrap
+#, markdown-text, no-wrap
msgid "Why is `robots.txt` located in a sub-folder?"
msgstr ""
#. type: Plain text
#: en/./users/07_Frequently_Asked_Questions.md:15
+#, markdown-text
msgid ""
"To increase security, FreshRSS is hosted in two sections. The first section "
"is public (the `./p` folder) and the second section is private (everything "
@@ -5131,29 +7251,31 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:17
+#: en/./users/07_Frequently_Asked_Questions.md:18
+#, markdown-text
msgid ""
-"As explained in the [security "
-"section](/en/User_documentation/Installation/Security), it’s highly "
-"recommended to make only the public section available at the domain "
-"level. With that configuration, `./p` is the root folder for "
-"http://demo.freshrss.org/, thus making `robots.txt` available at the root of "
-"the application."
+"As explained in the [security section](../admins/09_AccessControl.html), "
+"it’s highly recommended to make only the public section available at the "
+"domain level. With that configuration, `./p` is the root folder for "
+"<https://demo.freshrss.org/>, thus making `robots.txt` available at the root "
+"of the application."
msgstr ""
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:19
+#: en/./users/07_Frequently_Asked_Questions.md:20
+#, markdown-text
msgid "The same principle applies to `favicon.ico` and `.htaccess`."
msgstr ""
#. type: Title ##
-#: en/./users/07_Frequently_Asked_Questions.md:20
-#, no-wrap
+#: en/./users/07_Frequently_Asked_Questions.md:21
+#, markdown-text, no-wrap
msgid "Why do I have errors while registering a feed?"
msgstr ""
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:26
+#: en/./users/07_Frequently_Asked_Questions.md:27
+#, markdown-text
msgid ""
"There can be different origins for that problem. The feed syntax can be "
"invalid, it can be unrecognized by the SimplePie library, the hosting server "
@@ -5162,7 +7284,8 @@ msgid ""
msgstr ""
#. type: Bullet: '1. '
-#: en/./users/07_Frequently_Asked_Questions.md:30
+#: en/./users/07_Frequently_Asked_Questions.md:31
+#, markdown-text
msgid ""
"__Verify if the feed syntax is valid__ with the [W3C on-line "
"tool](https://validator.w3.org/feed/ \"RSS and Atom feed validator\"). If "
@@ -5170,7 +7293,8 @@ msgid ""
msgstr ""
#. type: Bullet: '1. '
-#: en/./users/07_Frequently_Asked_Questions.md:30
+#: en/./users/07_Frequently_Asked_Questions.md:31
+#, markdown-text
msgid ""
"__Verify SimplePie validation__ with the [SimplePie on-line "
"tool](https://simplepie.org/demo/ \"SimplePie official demo\"). If it’s not "
@@ -5178,7 +7302,8 @@ msgid ""
msgstr ""
#. type: Bullet: '1. '
-#: en/./users/07_Frequently_Asked_Questions.md:30
+#: en/./users/07_Frequently_Asked_Questions.md:31
+#, markdown-text
msgid ""
"__Verify FreshRSS integration__ with the [demo](https://demo.freshrss.org "
"\"FreshRSS official demo\"). If it’s not working, you need to [create an "
@@ -5188,13 +7313,14 @@ msgid ""
msgstr ""
#. type: Title ##
-#: en/./users/07_Frequently_Asked_Questions.md:31
-#, no-wrap
+#: en/./users/07_Frequently_Asked_Questions.md:32
+#, markdown-text, no-wrap
msgid "How can you change a forgotten password?"
msgstr ""
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:35
+#: en/./users/07_Frequently_Asked_Questions.md:36
+#, markdown-text
msgid ""
"Since the [1.10.0](https://github.com/FreshRSS/FreshRSS/releases/tag/1.10.0) "
"release, admins can change user passwords directly from the interface. This "
@@ -5203,7 +7329,8 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:37
+#: en/./users/07_Frequently_Asked_Questions.md:38
+#, markdown-text
msgid ""
"Since the [1.8.0](https://github.com/FreshRSS/FreshRSS/releases/tag/1.8.0) "
"release, admins can change user passwords using a terminal. It worth "
@@ -5211,38 +7338,40 @@ msgid ""
"the following command:"
msgstr ""
-#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:37
+#. type: Fenced code block (sh)
+#: en/./users/07_Frequently_Asked_Questions.md:39
#, no-wrap
msgid "./cli/update_user.php --user <username> --password <password>\n"
msgstr ""
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:41
+#: en/./users/07_Frequently_Asked_Questions.md:44
+#, markdown-text
msgid ""
"For more information on that matter, please refer to the [dedicated "
-"documentation](../../cli/README.md)."
+"documentation](https://github.com/FreshRSS/FreshRSS/blob/edge/cli/README.md)."
msgstr ""
#. type: Title ##
-#: en/./users/07_Frequently_Asked_Questions.md:42
-#, no-wrap
+#: en/./users/07_Frequently_Asked_Questions.md:45
+#, markdown-text, no-wrap
msgid "Permissions under SELinux"
msgstr ""
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:45
+#: en/./users/07_Frequently_Asked_Questions.md:48
+#, markdown-text
msgid ""
"Some Linux distribution, like Fedora or RedHat Enterprise Linux, have "
"SELinux enabled. This acts similar to a firewall application, so that "
"applications can’t write or modify files under certain conditions. While "
-"installing FreshRSS, step 2 can fail if the httpd process cannot write to "
+"installing FreshRSS, step 2 can fail if the httpd process can’t write to "
"some data sub-directories. The following command should be executed as root "
"to fix this problem:"
msgstr ""
-#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:45
+#. type: Fenced code block (sh)
+#: en/./users/07_Frequently_Asked_Questions.md:49
#, no-wrap
msgid ""
"semanage fcontext -a -t httpd_sys_rw_content_t "
@@ -5251,13 +7380,14 @@ msgid ""
msgstr ""
#. type: Title ##
-#: en/./users/07_Frequently_Asked_Questions.md:50
-#, no-wrap
+#: en/./users/07_Frequently_Asked_Questions.md:54
+#, markdown-text, no-wrap
msgid "Why do I have a blank page while trying to configure the sharing options?"
msgstr ""
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:53
+#: en/./users/07_Frequently_Asked_Questions.md:57
+#, markdown-text
msgid ""
"The `sharing` word in the URL is a trigger word for some ad-blocker "
"rules. Starting with version 1.16, `sharing` has been replaced by "
@@ -5266,7 +7396,8 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:55
+#: en/./users/07_Frequently_Asked_Questions.md:59
+#, markdown-text
msgid ""
"If you are using a version prior to 1.16, you can disable your ad-blocker "
"for FreshRSS or you can add a rule to allow the `sharing` page to be "
@@ -5274,21 +7405,1360 @@ msgid ""
msgstr ""
#. type: Plain text
-#: en/./users/07_Frequently_Asked_Questions.md:57
+#: en/./users/07_Frequently_Asked_Questions.md:61
+#, markdown-text
msgid "Examples with _uBlock_:"
msgstr ""
-#. type: Bullet: '- '
-#: en/./users/07_Frequently_Asked_Questions.md:59
+#. type: Bullet: '* '
+#: en/./users/07_Frequently_Asked_Questions.md:64
+#, markdown-text
msgid ""
"Whitelist your FreshRSS instance by adding it in _uBlock > Open the "
"dashboard > Whitelist_."
msgstr ""
-#. type: Bullet: '- '
-#: en/./users/07_Frequently_Asked_Questions.md:59
+#. type: Bullet: '* '
+#: en/./users/07_Frequently_Asked_Questions.md:64
+#, markdown-text
msgid ""
"Authorize your FreshRSS instance to call `sharing` configuration page by "
"adding the rule `*sharing,domain=~yourdomain.com` in _uBlock > Open the "
"dashboard > My filters_"
msgstr ""
+
+#. type: Title ##
+#: en/./users/07_Frequently_Asked_Questions.md:65
+#, markdown-text, no-wrap
+msgid "Problems with firewalls"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:68
+#, markdown-text
+msgid ""
+"If you have the error \"Blast! This feed has encountered a problem. Please "
+"verify that it is always reachable then update it.\", it might be because of "
+"a firewall misconfiguration."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:70
+#, markdown-text
+msgid "To identify the problem, here are the steps to follow:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/07_Frequently_Asked_Questions.md:73
+#, markdown-text
+msgid ""
+"step 1: Try to reach the feed locally to discard a problem with the feed "
+"itself. You can use your browser to this purpose."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/07_Frequently_Asked_Questions.md:73
+#, markdown-text
+msgid ""
+"step 2: Try to reach the feed from the host in which FreshRSS is "
+"installed. Something like `time curl -v "
+"'https://github.com/FreshRSS/FreshRSS/commits/edge.atom'` should make the "
+"deal. If you are running FreshRSS within a Docker container, then you can "
+"check connectivity from within the container itself with something similar "
+"to `sudo docker exec freshrss php -r "
+"\"readfile('https://github.com/FreshRSS/FreshRSS/commits/edge.atom');\"`. If "
+"none of this works, then it might be a problem with your firewall."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:75
+#, markdown-text
+msgid ""
+"Then to fix it, you need to do check your firewall configuration and ensure "
+"that you are not blocking connections to IPs and/or ports in which your "
+"feeds are located. If using iptables and you are blocking inbound "
+"connections to ports 80/443, check that the rules are properly configured "
+"and you are not also blocking outbound connections to the very same ports."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:76
+#, markdown-text
+msgid ""
+"For example, when using the firewall provided by Synology, you can block "
+"traffic for certain applications (i.e., ports). One could think that these "
+"rules would be applied only to incoming connections but specifying * for the "
+"originating host of the requests will also include your local networks. To "
+"deal with this issue, you will have to add exceptions for your local "
+"networks to be able to access those ports with a higher priority than the "
+"one blocking incoming connections. This could be similar for other frontends "
+"to iptables. Please check the following discussion about a [similar "
+"issue](https://www.reddit.com/r/synology/comments/8fo2sj/ds918_firewall_blocking_outgoing_traffic_from/)."
+msgstr ""
+
+#. type: Title #
+#: en/./users/08_sharing_services.md:1
+#, markdown-text, no-wrap
+msgid "Sharing Services"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:4
+#, markdown-text
+msgid "FreshRSS has the option to share links with a bunch of services."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/08_sharing_services.md:5
+#, markdown-text, no-wrap
+msgid "Available Services: Simple Sharing"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:12
+#, markdown-text, no-wrap
+msgid ""
+"| Service | Short description | "
+"Notes |\n"
+"|:--------------|:-------------------------------------------------------|:--------------------------------------------------------------|\n"
+"| Clipboard | Copy article link into the operation system clipboard | "
+"|\n"
+"| Email | Open the email app to send the article link | "
+"|\n"
+"| Print | Open browser’s print dialog to print out the article | "
+"|\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/08_sharing_services.md:13
+#, markdown-text, no-wrap
+msgid "Available Services: Hosted Services"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:39
+#, markdown-text, no-wrap
+msgid ""
+"| Service | Short description | "
+"Links | Notes "
+"|\n"
+"|:------------------|:-----------------------------------------------------|:-------------------------------------------------|:--------------------------------------------------------------|\n"
+"| Blogotext | A little more than a lightweight SQLite Blog-Engine. | "
+"[GitHub](https://github.com/BlogoText/blogotext) | Deprecated since FreshRSS "
+"V1.20.0 (2022). Will be deleted in 2023 (scheduled to FreshRSS V1.22.0) |\n"
+"| Buffer | Buffer.com is a social media management platform for "
+"scheduling, publishing, and analyzing content. | "
+"[Website](https://buffer.com) ||\n"
+"| Diaspora* | The online social world where you are in control | "
+"[Website](https://diasporafoundation.org/), "
+"[Wikipedia](https://en.wikipedia.org/wiki/Diaspora_(social_network)) | |\n"
+"| Facebook | Worldwide social network (by Meta Platforms) | "
+"[Website](https://facebook.com), "
+"[Wikipedia](https://en.wikipedia.org/wiki/Facebook)\n"
+"| GNU social | Social communication software for both public and "
+"private communications | [Website](https://gnu.io/social/) | |\n"
+"| Journal du hacker | Le Journal du hacker s'inspire directement du site "
+"anglophone Hacker News | [Website](https://www.journalduhacker.net/) |\n"
+"| Known based sites | Its robust open source framework can be used to build "
+"fully-fledged community sites, or a blog for a single user. | "
+"[Website](https://withknown.com/) | |\n"
+"| Lemmy | Selfhosted social link aggregation and discussion "
+"platform | [Website](https://join-lemmy.org/) | |\n"
+"| Linkding | Selfhosted bookmark service | "
+"[Website](https://github.com/sissbruecker/linkding) | |\n"
+"| LinkedIn | Business and employment-oriented online service | "
+"[Website](https://www.linkedin.com/), "
+"[Wikipedia](https://en.wikipedia.org/wiki/LinkedIn)| |\n"
+"| Mastodon | Self-hosted social networking & microblogging services "
+"| [Website](https://joinmastodon.org/), "
+"[Wikipedia](https://en.wikipedia.org/wiki/Mastodon_(software)) | |\n"
+"| Movim | A powerful web frontend for XMPP | "
+"[Website](https://movim.eu/) | |\n"
+"| Pinboard | Social Bookmarking for Introverts | "
+"[Website](https://pinboard.in/) | |\n"
+"| Pinterest | Is an image sharing and social media service designed "
+"to enable saving and discovery of information| "
+"[Website](https://pinterest.com/), "
+"[Wikipedia](https://en.wikipedia.org/wiki/Pinterest) | |\n"
+"| Pocket | Social bookmarking (previous \"Read it Later\", owned "
+"by Mozilla) | [Website](https://getpocket.com), "
+"[Wikipedia](https://en.wikipedia.org/wiki/Pocket_(service)) | |\n"
+"| Raindrop.io | All-in-one bookmark manager | "
+"[Website](https://raindrop.io/)| |\n"
+"| Reddit | A network of communities where people can dive into "
+"their interests, hobbies and passions| [Website](https://www.reddit.com/), "
+"[Wikipedia](https://en.wikipedia.org/wiki/Reddit)| |\n"
+"| Shaarli | Self-hosted minimalist bookmark manager and link "
+"sharing service | [Website](https://shaarli.readthedocs.io/) | |\n"
+"| Twitter | Microblogging social network | "
+"[Website](https://twitter.com), "
+"[Wikipedia](https://de.wikipedia.org/wiki/Twitter) | |\n"
+"| wallabag | Save and classify articles. Read them later. Freely | "
+"[Website](https://www.wallabag.org) | Compatible to version 1 and 2\n"
+"| Whatsapp | Instant messaging and voice-over-IP service owned by "
+"Meta Platforms| [Website](https://www.whatsapp.com), "
+"[Wikipedia](https://en.wikipedia.org/wiki/WhatsApp) | |\n"
+"| XING | Career-oriented social networking site, operated by "
+"New Work SE | [Website](https://www.xing.com/), "
+"[Wikipedia](https://en.wikipedia.org/wiki/XING) | |\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/08_sharing_services.md:40
+#, markdown-text, no-wrap
+msgid "Configuration"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:43
+#, markdown-text
+msgid ""
+"Select the needed sharing services in the configuration menu (Configuration "
+"/ Sharing)."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/08_sharing_services.md:44
+#, markdown-text, no-wrap
+msgid "Usage"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:47
+#, markdown-text
+msgid ""
+"Activate the sharing menu in configuration menu (Configuration / "
+"Display). It is only available for the bottom line."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:49
+#, markdown-text
+msgid "The menu with the selected services is available in the footer of article."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/08_sharing_services.md:50
+#, markdown-text, no-wrap
+msgid "Add More Sharing Services"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/08_sharing_services.md:52
+#, markdown-text
+msgid ""
+"Please open a new issue on "
+"[GitHub](https://github.com/FreshRSS/FreshRSS/issues) and support us with "
+"information."
+msgstr ""
+
+#. type: Title #
+#: en/./users/09_refreshing_feeds.md:1
+#, markdown-text, no-wrap
+msgid "Refreshing feeds"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:4
+#, markdown-text
+msgid ""
+"To take full advantage of FreshRSS, it needs to retrieve new items from the "
+"feeds you have subscribed to. There are several ways to do this:"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./users/09_refreshing_feeds.md:17
+#, markdown-text
+msgid "[Manual update](#manual-update)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+#, markdown-text
+msgid "[Complete update](#complete-update)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+#, markdown-text
+msgid "[Partial update](#partial-update)"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./users/09_refreshing_feeds.md:17
+#, markdown-text
+msgid "[Automatic update with cron](#automatic-update-with-cron)"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./users/09_refreshing_feeds.md:17
+#, markdown-text
+msgid "[Online cron](#online-cron)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+#, markdown-text
+msgid "[For Form Authentication](#for-form-authentication)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+#, markdown-text
+msgid "[For HTTP authentication](#for-http-authentication)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+#, markdown-text
+msgid "[For No authentication None](#for-no-authentication-none)"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./users/09_refreshing_feeds.md:17
+#, markdown-text
+msgid ""
+"[Feed configuration of “Do not automatically refresh more often "
+"than”](#feed-configuration-of-do-not-automatically-refresh-more-often-than)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+#, markdown-text
+msgid "[Background](#background)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+#, markdown-text
+msgid "[Default value](#default-value)"
+msgstr ""
+
+#. type: Bullet: ' - '
+#: en/./users/09_refreshing_feeds.md:17
+#, markdown-text
+msgid "[Individual feed configuration](#individual-feed-configuration)"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/09_refreshing_feeds.md:18
+#, markdown-text, no-wrap
+msgid "Manual update"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:21
+#, markdown-text
+msgid ""
+"If you can’t or don’t want to use the automatic method, you can update "
+"manually. There are two methods for updating all or some of the feeds."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:22
+#, markdown-text, no-wrap
+msgid "Complete update"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:25
+#, markdown-text
+msgid ""
+"This update occurs on all feeds. To trigger it, simply click on the update "
+"link in the navigation menu."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:27
+#, markdown-text
+msgid "![Navigation menu](../img/users/refresh.1.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:29
+#, markdown-text
+msgid ""
+"When the update starts, a progress bar appears and changes while feeds are "
+"processed."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:31
+#, markdown-text
+msgid "![Progress bar](../img/users/refresh.5.png)"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:32
+#, markdown-text, no-wrap
+msgid "Partial update"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:35
+#, markdown-text
+msgid ""
+"This update occurs on the selected feed only. To trigger it, simply click on "
+"the update link in the feed menu."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:37
+#, markdown-text
+msgid "![Feed menu](../img/users/refresh.2.png)"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/09_refreshing_feeds.md:38
+#, markdown-text, no-wrap
+msgid "Automatic update with cron"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:41
+#, markdown-text
+msgid "This is the recommended method."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:43
+#, markdown-text
+msgid ""
+"This method is only available if you have access to the scheduled tasks of "
+"the machine on which your FreshRSS instance is installed."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:45
+#, markdown-text
+msgid ""
+"The script is named *actualize_script.php* and is located in the *app* "
+"folder. The scheduled task syntax will not be explained here. However, here "
+"is [a quick introduction to "
+"crontab](http://www.adminschoice.com/crontab-quick-reference/) that might "
+"help you."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:47
+#, markdown-text
+msgid "Here is an example to trigger article update every hour."
+msgstr ""
+
+#. type: Fenced code block (cron)
+#: en/./users/09_refreshing_feeds.md:48
+#, no-wrap
+msgid ""
+"0 * * * * php /path/to/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log "
+"2>&1\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/09_refreshing_feeds.md:52
+#, markdown-text, no-wrap
+msgid "Online cron"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:55
+#, markdown-text
+msgid ""
+"If you do not have access to the installation server scheduled task, you can "
+"still automate the update process."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:58
+#, markdown-text
+msgid ""
+"To do so, you need to create a scheduled task, which need to call a specific "
+"URL: <https://freshrss.example.net/i/?c=feed&a=actualize> (it could be "
+"different depending on your installation). Depending on your application "
+"authentication method, you need to adapt the scheduled task."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:60
+#, markdown-text
+msgid "Special parameters to configure the script - all parameters can be combined:"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:64
+#, markdown-text
+msgid ""
+"- Parameter \"force\" "
+"<https://freshrss.example.net/i/?c=feed&a=actualize&force=1> If *force* is "
+"set to 1 all feeds will be refreshed at once."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:68
+#, markdown-text
+msgid ""
+"- Parameter \"ajax\" "
+"<https://freshrss.example.net/i/?c=feed&a=actualize&ajax=1> Only a status "
+"site is returned and not a complete website. Example: \"OK\""
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:72
+#, markdown-text
+msgid ""
+"- Parameter \"maxFeeds\" "
+"<https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=30> If "
+"*maxFeeds* is set the configured amount of feeds is refreshed at once. The "
+"default setting is \"10\"."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:76
+#, markdown-text
+msgid ""
+"- Parameter \"token\" "
+"<https://freshrss.example.net/i/?c=feed&a=actualize&token=542345872345734> "
+"Security parameter to prevent unauthorized refreshes. For detailed "
+"Documentation see \"Form authentication\"."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:77
+#, markdown-text, no-wrap
+msgid "For Form Authentication"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:80
+#, markdown-text
+msgid ""
+"If your FreshRSS instance is using Form Authentication, you can configure an "
+"authentication token to grant access to the online cron."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:82
+#, markdown-text
+msgid "![Token configuration](../img/users/token.1.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:84
+#, markdown-text
+msgid ""
+"You can target a specific user by adding their username to the query string, "
+"with `&user=insert-username`:"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:86
+#, markdown-text
+msgid "The scheduled task syntax should look as follows:"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:88
+#, markdown-text
+msgid "<https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=10&ajax=1&user=someone&token=my-token>"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:90
+#, markdown-text
+msgid ""
+"Alternatively, but not recommended, if you configure the application to "
+"allow anonymous reading, you can also allow anonymous users to update feeds "
+"(“Allow anonymous refresh of the articles”), and that does not require a "
+"token."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:92
+#, markdown-text
+msgid "![Anonymous access configuration](../img/users/anonymous_access.1.png)"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:93
+#, markdown-text, no-wrap
+msgid "For HTTP authentication"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:96
+#, markdown-text
+msgid ""
+"If your FreshRSS instance is using HTTP authentication, you’ll need to "
+"provide your credentials to the scheduled task."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:98
+#, markdown-text, no-wrap
+msgid ""
+"**Note:** This method is discouraged as your credentials are stored in plain "
+"text.\n"
+msgstr ""
+
+#. type: Fenced code block (cron)
+#: en/./users/09_refreshing_feeds.md:99
+#, no-wrap
+msgid ""
+"0 * * * * curl -u alice:password123 "
+"'https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=10&ajax=1&user=alice'\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:104
+#, markdown-text
+msgid "On some systems, that syntax might also work:"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:106
+#, markdown-text
+msgid "<https://alice:password123@freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=10&ajax=1&user=alice>"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:107
+#, markdown-text, no-wrap
+msgid "For No authentication (None)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:110
+#, markdown-text
+msgid ""
+"If your FreshRSS instance uses no authentication (public instance, default "
+"user):"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:112
+#, markdown-text
+msgid "<https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=10&ajax=1>"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/09_refreshing_feeds.md:113
+#, markdown-text, no-wrap
+msgid "Feed configuration of “Do not automatically refresh more often than”"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:115
+#, markdown-text, no-wrap
+msgid "Background"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:118
+#, markdown-text
+msgid ""
+"FreshRSS does not, by design, supports pull refreshes at frequencies higher "
+"than once every 15 minutes. But FreshRSS supports instant push (WebSub)."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:120
+#, markdown-text
+msgid ""
+"FreshRSS is part of an RSS ecosystem. A typical reaction that we have seen "
+"from several servers is to simply ban by, IP, user-agent, or to remove their "
+"RSS feed altogether. Bad user behaviours affect the larger community."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:121
+#, markdown-text, no-wrap
+msgid "Default value"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:124
+#, markdown-text, no-wrap
+msgid ""
+"The default value of “Do not automatically refresh more often than” is set "
+"in Configuration -> Archiving.\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:126
+#, markdown-text
+msgid ""
+"The lowest global/default purposely cannot be set faster than every 20 "
+"minutes, to avoid wasting resources and make sure the RSS ecosystem remains "
+"sane."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/09_refreshing_feeds.md:127
+#, markdown-text, no-wrap
+msgid "Individual feed configuration"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:130
+#, markdown-text
+msgid "Under the settings for individual feeds, you can go down to 15min."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/09_refreshing_feeds.md:134
+#, markdown-text
+msgid ""
+"Read more: - [Normal, Global and Reader view](./03_Main_view.md) - [Filter "
+"the feeds and search](./10_filter.md)"
+msgstr ""
+
+#. type: Title #
+#: en/./users/10_filter.md:2
+#, markdown-text, no-wrap
+msgid "Filtering articles"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/10_filter.md:4
+#, markdown-text, no-wrap
+msgid "Purpose"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:7
+#, markdown-text
+msgid ""
+"When the number of articles stored by FreshRSS inevitably grows larger, it’s "
+"important to use efficient filters to display only a subset of the "
+"articles. There are several methods that filter with different "
+"criteria. Usually those methods can be combined."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/10_filter.md:8
+#, markdown-text, no-wrap
+msgid "By category"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:11
+#, markdown-text
+msgid ""
+"This is the easiest method. You only need to click on the category title in "
+"the side panel. There are two special categories at the top of the panel:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:14
+#, markdown-text
+msgid ""
+"*Main feed* displays only articles from feeds marked as available in that "
+"category"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:14
+#, markdown-text
+msgid "*Favourites* displays only articles marked as favourites"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/10_filter.md:15
+#, markdown-text, no-wrap
+msgid "By feed"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:18
+#, markdown-text
+msgid "There are several methods to filter articles by feed:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:23
+#, markdown-text
+msgid "by clicking the feed title in the side panel"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:23
+#, markdown-text
+msgid "by clicking the feed title in the article details"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:23
+#, markdown-text
+msgid "by filtering in the feed options from the side panel"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:23
+#, markdown-text
+msgid "by filtering in the feed configuration"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:25
+#, markdown-text
+msgid "![Feed filter](../img/users/feed.filter.1.png)"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/10_filter.md:26
+#, markdown-text, no-wrap
+msgid "By status"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:29
+#, markdown-text
+msgid ""
+"Each article has two attributes that can be combined. The first attribute "
+"indicates whether or not the article has been read. The second attribute "
+"indicates if the article was marked as favorite or not."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:31
+#, markdown-text
+msgid ""
+"In version 0.7, attribute filters are available in the article display "
+"dropdown list. With this version, it’s not possible to combine filters. For "
+"instance, it’s not possible to display only read and favorite articles."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:33
+#, markdown-text
+msgid "![Attribute filters in 0.7](../img/users/status.filter.0.7.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:35
+#, markdown-text
+msgid ""
+"Starting with version 0.8, all attribute filters are visible as toggle "
+"icons. They can be combined. As any combination is possible, some have the "
+"same result. For instance, the result for all filters selected is the same "
+"as no filter selected."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:37
+#, markdown-text
+msgid "![Attribute filters in 0.8](../img/users/status.filter.0.8.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:39
+#, markdown-text
+msgid "By default, this filter displays only unread articles"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/10_filter.md:40
+#, markdown-text, no-wrap
+msgid "By content"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:43
+#, markdown-text
+msgid ""
+"It is possible to filter articles by their content by inputting a string in "
+"the search field."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/10_filter.md:44
+#, markdown-text, no-wrap
+msgid "With the search field"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:47
+#, markdown-text
+msgid "You can use the search field to further refine results:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "by feed ID: `f:123` or multiple feed IDs (*or*): `f:123,234,345`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "by author: `author:name` or `author:'composed name'`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "by title: `intitle:keyword` or `intitle:'composed keyword'`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "by URL: `inurl:keyword` or `inurl:'composed keyword'`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "by tag: `#tag` or `#tag+with+whitespace`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "by free-text: `keyword` or `'composed keyword'`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid ""
+"by date of discovery, using the [ISO 8601 time interval "
+"format](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals): "
+"`date:<date-interval>`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "From a specific day, or month, or year:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014-03-30`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014-03` or `date:201403`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "From a specific time of a given day:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014-05-30T13`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014-05-30T13:30`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "Between two given dates:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014-02/2014-04`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014-02--2014-04`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014-02/04`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014-02-03/05`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014-02-03T22:00/22:15`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014-02-03T22:00/15`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "After a given date:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014-03/`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "Before a given date:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:/2014-03`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "For a specific duration after a given date:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:2014-03/P1W`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "For a specific duration before a given date:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:P1W/2014-05-25T23:59:59`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "For the past duration before now (the trailing slash is optional):"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:P1Y/` or `date:P1Y` (past year)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:P2M/` (past two months)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:P3W/` (past three weeks)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:P4D/` (past four days)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:PT5H/` (past five hours)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:PT30M/` (past thirty minutes)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:PT90S/` (past ninety seconds)"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "`date:P1DT1H/` (past one day and one hour)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid "by date of publication, using the same format: `pubdate:<date-interval>`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid ""
+"by custom label ID `L:12` or multiple label IDs: `L:12,13,14` or with any "
+"label: `L:*`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid ""
+"by custom label name `label:label`, `label:\"my label\"` or any label name "
+"from a list (*or*): `labels:\"my label,my other label\"`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid ""
+"by several label names (*and*): `label:\"my label\" label:\"my other "
+"label\"`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid ""
+"by entry (article) ID: `e:1639310674957894` or multiple entry IDs (*or*): "
+"`e:1639310674957894,1639310674957893`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid ""
+"by user query (saved search) name: `search:myQuery`, `search:\"My query\"` "
+"or saved search ID: `S:3`"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/10_filter.md:93
+#, markdown-text
+msgid ""
+"internally, those references are replaced by the corresponding user query in "
+"the search expression"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:95
+#, markdown-text
+msgid "Be careful not to enter a space between the operator and the search value."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:98
+#, markdown-text
+msgid ""
+"Some operators can be used negatively, to exclude articles, with the same "
+"syntax as above, but prefixed by a `!` or `-`: `!f:234`, `-author:name`, "
+"`-intitle:keyword`, `-inurl:keyword`, `-#tag`, `!keyword`, `!date:2019`, "
+"`!date:P1W`, `!pubdate:P3d/`."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:101
+#, markdown-text
+msgid ""
+"It is also possible to combine keywords to create a more precise filter. "
+"For example, you can enter multiple instances of `f:`, `author:`, "
+"`intitle:`, `inurl:`, `#`, and free-text."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:104
+#, markdown-text
+msgid ""
+"Combining several search criteria implies a logical *and*, but the keyword ` "
+"OR ` can be used to combine several search criteria with a logical *or* "
+"instead: `author:Dupont OR author:Dupond`"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:107
+#, markdown-text
+msgid ""
+"You don’t have to do anything special to combine multiple negative "
+"operators. Writing `!intitle:'thing1' !intitle:'thing2'` implies AND, see "
+"above. For more pointers on how AND and OR interact with negation, see [this "
+"GitHub "
+"comment](https://github.com/FreshRSS/FreshRSS/issues/3236#issuecomment-891219460). "
+"Additional reading: [De Morgan’s "
+"laws](https://en.wikipedia.org/wiki/De_Morgan%27s_laws)."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:109
+#, markdown-text
+msgid ""
+"Finally, parentheses may be used to express more complex queries, with basic "
+"negation support:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:115
+#, markdown-text
+msgid "`(author:Alice OR intitle:hello) (author:Bob OR intitle:world)`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:115
+#, markdown-text
+msgid "`(author:Alice intitle:hello) OR (author:Bob intitle:world)`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:115
+#, markdown-text
+msgid "`!((author:Alice intitle:hello) OR (author:Bob intitle:world))`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:115
+#, markdown-text
+msgid "`(author:Alice intitle:hello) !(author:Bob intitle:world)`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/10_filter.md:115
+#, markdown-text
+msgid "`!(S:1 OR S:2)`"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:117
+#, markdown-text, no-wrap
+msgid ""
+"> ℹ️ If you need to search for a parenthesis, it needs to be escaped like "
+"`\\(` or `\\)`\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/10_filter.md:118
+#, markdown-text, no-wrap
+msgid "By sorting by date"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:121
+#, markdown-text
+msgid ""
+"You can change the sort order by clicking the toggle button available in the "
+"header."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/10_filter.md:122
+#, markdown-text, no-wrap
+msgid "Store your filters"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:125
+#, markdown-text
+msgid ""
+"Once you came up with your perfect filter, it would be a shame if you need "
+"to recreate it every time you need to use it."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:129
+#, markdown-text
+msgid ""
+"Hopefully, there is a way to bookmark them for later use. We call them "
+"*user queries*. You can create as many as you want, the only limit is how "
+"they will be displayed on your screen."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/10_filter.md:130
+#, markdown-text, no-wrap
+msgid "Bookmark the current query"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:134
+#, markdown-text
+msgid ""
+"Display the user queries drop-down by clicking the button next to the state "
+"buttons. ![User queries "
+"drop-down](../img/users/user.queries.drop-down.empty.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:136
+#, markdown-text
+msgid "Then click on the bookmark action."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:138
+#, markdown-text
+msgid "Congratulations, you’re done!"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/10_filter.md:139
+#, markdown-text, no-wrap
+msgid "Using a bookmarked query"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:143
+#, markdown-text
+msgid ""
+"Display the user queries drop-down by clicking the button next to the state "
+"buttons. ![User queries "
+"drop-down](../img/users/user.queries.drop-down.not.empty.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:145
+#, markdown-text
+msgid ""
+"Then click on the bookmarked query, the previously stored query will be "
+"applied."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:148
+#, markdown-text, no-wrap
+msgid ""
+"> Note that only the query is stored, not the articles.\n"
+"> The results you are seeing now could be different from the results on the "
+"day you've created the query.\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/10_filter.md:152
+#, markdown-text
+msgid ""
+"Read more: * [Normal, Global and Reader view](./03_Main_view.md) * "
+"[Refreshing the feeds](./09_refreshing_feeds.md)"
+msgstr ""
diff --git a/docs/po4a.conf b/docs/po4a.conf
index 1edda33fa..f5522e973 100644
--- a/docs/po4a.conf
+++ b/docs/po4a.conf
@@ -3,23 +3,31 @@
[po4a_langs] fr
[po4a_paths] i18n/templates/freshrss.pot $lang:i18n/freshrss.$lang.po
[type: text] en/./contributing.md $lang:$lang/./contributing.md opt:"-o markdown" opt:"-M utf-8"
-[type: text] en/./developers/01_First_steps.md $lang:$lang/./developers/01_First_steps.md opt:"-o markdown" opt:"-M utf-8"
+[type: text] en/./developers/01_Index.md $lang:$lang/./developers/01_Index.md opt:"-o markdown" opt:"-M utf-8"
+[type: text] en/./developers/02_First_steps.md $lang:$lang/./developers/02_First_steps.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./developers/02_Github.md $lang:$lang/./developers/02_Github.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./developers/03_Backend/01_Database_schema.md $lang:$lang/./developers/03_Backend/01_Database_schema.md opt:"-o markdown" opt:"-M utf-8"
-[type: text] en/./developers/03_Backend/02_Minz.md $lang:$lang/./developers/03_Backend/02_Minz.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./developers/03_Backend/03_External_libraries.md $lang:$lang/./developers/03_Backend/03_External_libraries.md opt:"-o markdown" opt:"-M utf-8"
-[type: text] en/./developers/03_Backend/04_Changing_source_code.md $lang:$lang/./developers/03_Backend/04_Changing_source_code.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./developers/03_Backend/05_Extensions.md $lang:$lang/./developers/03_Backend/05_Extensions.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./developers/03_Running_tests.md $lang:$lang/./developers/03_Running_tests.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./developers/04_Frontend/01_View_files.md $lang:$lang/./developers/04_Frontend/01_View_files.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./developers/04_Frontend/02_Design.md $lang:$lang/./developers/04_Frontend/02_Design.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./developers/04_Pull_requests.md $lang:$lang/./developers/04_Pull_requests.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./developers/05_Release_new_version.md $lang:$lang/./developers/05_Release_new_version.md opt:"-o markdown" opt:"-M utf-8"
+[type: text] en/./developers/06_Fever_API.md $lang:$lang/./developers/06_Fever_API.md opt:"-o markdown" opt:"-M utf-8"
+[type: text] en/./developers/06_GoogleReader_API.md $lang:$lang/./developers/06_GoogleReader_API.md opt:"-o markdown" opt:"-M utf-8"
+[type: text] en/./developers/06_Reporting_Bugs.md $lang:$lang/./developers/06_Reporting_Bugs.md opt:"-o markdown" opt:"-M utf-8"
+[type: text] en/./developers/Minz/index.md $lang:$lang/./developers/Minz/index.md opt:"-o markdown" opt:"-M utf-8"
+[type: text] en/./developers/Minz/migrations.md $lang:$lang/./developers/Minz/migrations.md opt:"-o markdown" opt:"-M utf-8"
+[type: text] en/./developers/OPML.md $lang:$lang/./developers/OPML.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./index.md $lang:$lang/./index.md opt:"-o markdown" opt:"-M utf-8"
+[type: text] en/./internationalization.md $lang:$lang/./internationalization.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./users/02_First_steps.md $lang:$lang/./users/02_First_steps.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./users/03_Main_view.md $lang:$lang/./users/03_Main_view.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./users/04_Subscriptions.md $lang:$lang/./users/04_Subscriptions.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./users/05_Configuration.md $lang:$lang/./users/05_Configuration.md opt:"-o markdown" opt:"-M utf-8"
-[type: text] en/./users/06_Fever_API.md $lang:$lang/./users/06_Fever_API.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./users/06_Mobile_access.md $lang:$lang/./users/06_Mobile_access.md opt:"-o markdown" opt:"-M utf-8"
[type: text] en/./users/07_Frequently_Asked_Questions.md $lang:$lang/./users/07_Frequently_Asked_Questions.md opt:"-o markdown" opt:"-M utf-8"
+[type: text] en/./users/08_sharing_services.md $lang:$lang/./users/08_sharing_services.md opt:"-o markdown" opt:"-M utf-8"
+[type: text] en/./users/09_refreshing_feeds.md $lang:$lang/./users/09_refreshing_feeds.md opt:"-o markdown" opt:"-M utf-8"
+[type: text] en/./users/10_filter.md $lang:$lang/./users/10_filter.md opt:"-o markdown" opt:"-M utf-8"