From 2343f0ded14ac6970575c23e4de34e536241b623 Mon Sep 17 00:00:00 2001 From: maTh Date: Thu, 11 May 2023 08:32:19 +0200 Subject: Docs: delete 04_Changing_source_code.md (#5391) * delete 04_Changing_source_code.md * make pot --------- Co-authored-by: Alexandre Alapetite --- docs/en/developers/01_Index.md | 1 - .../03_Backend/04_Changing_source_code.md | 17 - .../03_Backend/04_Changing_source_code.md | 17 - docs/i18n/freshrss.fr.po | 11545 ++++++++++++------- docs/i18n/templates/freshrss.pot | 9314 ++++++++++----- docs/po4a.conf | 16 +- 6 files changed, 13788 insertions(+), 7122 deletions(-) delete mode 100644 docs/en/developers/03_Backend/04_Changing_source_code.md delete mode 100644 docs/fr/developers/03_Backend/04_Changing_source_code.md (limited to 'docs') 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 \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 Control + c or with the following command, in another terminal:\n" msgstr "Vous pouvez arrêter les conteneurs en tapant Control + c 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,151 +647,327 @@ msgstr "" "tant que les corrections nécessaires ne sont pas appliquées." #. type: Title ## -#: en/./developers/01_First_steps.md:72 -#, 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:72 #, no-wrap -msgid "Indentation" -msgstr "Indentation" +msgid "GitHub Actions" +msgstr "" #. type: Plain text -#: en/./developers/01_First_steps.md:76 -msgid "Code indentation must use tabs." +#: 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 "" -"L’indentation du code doit être faite impérativement avec des tabulations." -#. type: Title ### -#: en/./developers/01_First_steps.md:77 +#. type: Title ## +#: en/./developers/02_First_steps.md:77 #, no-wrap -msgid "Alignment" -msgstr "Alignement" +msgid "Running fixes & tests" +msgstr "" #. type: Plain text -#: en/./developers/01_First_steps.md:80 +#: en/./developers/02_First_steps.md:80 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." +"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 "" -"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 +#. type: Fenced code block (sh) +#: en/./developers/02_First_steps.md:81 #, no-wrap -msgid "php" -msgstr "php" +msgid "" +"make fix-all\n" +"make test-all\n" +msgstr "" #. type: Plain text -#: en/./developers/01_First_steps.md:81 -#, no-wrap +#: en/./developers/02_First_steps.md:87 msgid "" -"$result = a_function_with_a_really_long_name($param1, $param2,\n" -" $param3, $param4);\n" +"This requires `make` and `npm` in addition to the FreshRSS requirements. See " +"below for the precise requirements for a few platforms." msgstr "" -"$resultat = une_fonction_avec_un_nom_long($param1, $param2,\n" -" $param3, $param4);\n" #. type: Title ### -#: en/./developers/01_First_steps.md:86 +#: en/./developers/02_First_steps.md:88 #, no-wrap -msgid "End of line" -msgstr "Fin de ligne" +msgid "Debian / Ubuntu" +msgstr "" #. type: Plain text -#: en/./developers/01_First_steps.md:89 -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." +#: 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 "" -"Le caractère de fin de ligne doit être un saut de ligne (LF) qui est le " -"caractère de fin de ligne des systèmes *NIX. Ce caractère ne doit pas être " -"précédé par des caractères blanc." #. type: Plain text -#: en/./developers/01_First_steps.md:91 +#: en/./developers/02_First_steps.md:93 msgid "" -"You can verify if there is any unintended white space at the end of line " -"with the following Git command:" +"Here are the dependencies that need to be manually installed prior to " +"running the fixes & tests." 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 +#. type: Fenced code block (sh) +#: en/./developers/02_First_steps.md:94 #, no-wrap -msgid "bash" -msgstr "bash" +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: Plain text -#: en/./developers/01_First_steps.md:92 +#. type: Title ### +#: en/./developers/02_First_steps.md:98 #, no-wrap -msgid "" -"# command to check files before adding them in the Git index\n" -"git diff --check\n" -"# command to check files after adding them in the Git index\n" -"git diff --check --cached\n" +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 "" -"# commande à lancer avant l’ajout des fichiers dans l’index\n" -"git diff --check\n" -"# commande à lancer après l’ajout des fichiers dans l’index mais avant le commit\n" -"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:104 #, no-wrap -msgid "End of file" -msgstr "Fin de fichier" +msgid "Alpine Linux" +msgstr "" -#. type: Plain text -#: en/./developers/01_First_steps.md:102 -msgid "Every file must end by an empty line." -msgstr "Chaque fichier doit se terminer par une ligne vide." +#. 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/01_First_steps.md:103 +#: en/./developers/02_First_steps.md:110 #, no-wrap -msgid "Commas, dots and semi-columns" -msgstr "Le cas de la virgule, du point et du point-virgule" +msgid "Partial fixes & tests" +msgstr "" -#. type: Plain text -#: en/./developers/01_First_steps.md:106 +#. type: Bullet: '- ' +#: en/./developers/02_First_steps.md:114 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." +"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/01_First_steps.md:107 en/./developers/01_First_steps.md:210 +#: en/./developers/02_First_steps.md:115 #, no-wrap -msgid "Operators" -msgstr "Le cas des opérateurs" +msgid "Tests summary" +msgstr "" #. type: Plain text -#: en/./developers/01_First_steps.md:110 -msgid "There should be a space before and after every operator." -msgstr "Chaque opérateur est entouré d’espaces." +#: 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/02_First_steps.md:147 +#, no-wrap +msgid "Indentation" +msgstr "Indentation" + +#. type: Plain text +#: 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/02_First_steps.md:151 +#, no-wrap +msgid "Alignment" +msgstr "Alignement" + +#. type: Plain text +#: 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." +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: 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" +" $param3, $param4);\n" +msgstr "" +"$resultat = une_fonction_avec_un_nom_long($param1, $param2,\n" +" $param3, $param4);\n" + +#. type: Title ### +#: en/./developers/02_First_steps.md:160 +#, no-wrap +msgid "End of line" +msgstr "Fin de ligne" + +#. type: Plain text +#: 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." +msgstr "" +"Le caractère de fin de ligne doit être un saut de ligne (LF) qui est le " +"caractère de fin de ligne des systèmes *NIX. Ce caractère ne doit pas être " +"précédé par des caractères blanc." + +#. type: Plain text +#: 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:" +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: 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" +"git diff --check\n" +"# command to check files after adding them in the Git index\n" +"git diff --check --cached\n" +msgstr "" +"# commande à lancer avant l’ajout des fichiers dans l’index\n" +"git diff --check\n" +"# commande à lancer après l’ajout des fichiers dans l’index mais avant le commit\n" +"git diff --check --cached\n" + +#. type: Title ### +#: en/./developers/02_First_steps.md:173 +#, no-wrap +msgid "End of file" +msgstr "Fin de fichier" + +#. type: Plain text +#: 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/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/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/02_First_steps.md:181 +#, no-wrap +msgid "Operators" +msgstr "Le cas des opérateurs" #. type: Plain text -#: en/./developers/01_First_steps.md:111 +#: 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: 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,1259 +1313,4226 @@ 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" +msgid "Branching" +msgstr "Système de branches" -#. 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: Title ## +#: en/./developers/02_Github.md:3 +#, no-wrap +msgid "Basic" +msgstr "Élémentaire" #. 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." +"If you are new to Git, here are some of the resources you might find useful:" msgstr "" -"Si vous êtes convaincus qu’il faut vous faire entendre, voici la marche à " -"suivre." +"Si vous êtes novice dans Git, voici quelques ressources qui pourraient vous " +"être utiles :" + +#. type: Bullet: '* ' +#: 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:11 +msgid "" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/02_Github.md:11 +msgid "" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/02_Github.md:11 +msgid "" +msgstr "" #. type: Title ## -#: en/./developers/02_Github.md:7 +#: en/./developers/02_Github.md:12 #, no-wrap -msgid "On GitHub" -msgstr "Sur GitHub" +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: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!" +#: en/./developers/02_Github.md:15 +msgid "First you need to add the official repo to your remote repo list:" 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 » !" +"Vous devez avant tout ajouter le repo officiel à votre liste de repo remote :" -#. type: Bullet: ' 1. ' +#. type: Fenced code block (sh) #: 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)" +#, 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: 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." +#. type: Plain text +#: en/./developers/02_Github.md:21 +msgid "You can verify the remote repo is successfully added by using:" 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." +"Vous pouvez vérifier que le repo remote a été ajouté avec succès en " +"utilisant :" -#. type: Bullet: ' 3. ' -#: en/./developers/02_Github.md:16 +#. 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:27 +msgid "Now you can pull the latest development code:" +msgstr "Vous pouvez maintenant pull le dernier code de développement :" + +#. type: Fenced code block (sh) +#: en/./developers/02_Github.md:28 +#, no-wrap msgid "" -"If your request is new, [open a new bug ticket](https://github.com/FreshRSS/" -"FreshRSS/issues/new)" +"git checkout edge\n" +"git pull upstream edge\n" 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." +"git checkout edge\n" +"git pull upstream edge\n" #. type: Title ## -#: en/./developers/02_Github.md:17 +#: en/./developers/02_Github.md:33 #, no-wrap -msgid "Informal" -msgstr "De façon informelle" +msgid "Starting a new development branch" +msgstr "Lancer une nouvelle branche de développement" -#. 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: 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: 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: Title ## +#: en/./developers/02_Github.md:39 +#, no-wrap +msgid "Sending a patch" +msgstr "Proposer un patch" -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:26 +#. type: Fenced code block (sh) +#: en/./developers/02_Github.md:41 +#, no-wrap msgid "" -"On [the mailing lists](https://freshrss.org/announce-of-the-mailing-lists." -"html)" +"# Add the changed file, here actualize_script.php\n" +"git add app/actualize_script.php\n" +"# Commit the change and write a proper commit message\n" +"git commit\n" +"# Double check all looks well\n" +"git show\n" +"# Push it to your fork\n" +"git push\n" 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" +"# Ajoutez le fichier modifié, ici actualize_script.php\n" +"git add app/actualize_script.php\n" +"# Commitez le changement et écrivez un message de commit approprié.\n" +"git commit\n" +"# Vérifiez deux fois que tout a l’air d’aller bien\n" +"git show\n" +"# Poussez les changements sur ton fork\n" +"git push\n" -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:26 -msgid "Etc." -msgstr "Etc." +#. type: Plain text +#: 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:27 +#: en/./developers/02_Github.md:54 #, no-wrap -msgid "Tips" -msgstr "Conseils" +msgid "How to write a commit message" +msgstr "Comment écrire un message de commit" #. 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 +#: en/./developers/02_Github.md:57 +#, fuzzy +#| msgid "" +#| "A commit message should succintly describe the changes on the first line. " +#| "For example:" msgid "" -"**Pay attention to spelling**. Even if it’s not always easy, try your best!" +"A commit message should succinctly describe the changes on the first line. " +"For example:" msgstr "" -"**Faites attention à l’orthographe.** même si ce n’est pas toujours facile, " -"faites votre maximum. ;)" +"Un message de commit devrait décrire succinctement les changements sur la " +"première ligne. Par exemple :" -#. 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: Plain text +#: en/./developers/02_Github.md:59 +#, no-wrap +msgid "> Fix broken icon\n" +msgstr "> Fixe une icône cassée\n" -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:39 +#. type: Plain text +#: en/./developers/02_Github.md:61 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." +"If necessary, this can be followed by a blank line and a longer explanation." 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." +"Si nécessaire, une ligne blanche et une explication plus longue peuvent le " +"suivre." -#. 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`)." +#. type: Plain text +#: en/./developers/02_Github.md:62 +msgid "For further tips, see [here](https://chris.beams.io/posts/git-commit/)." 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'')." +"Pour d’autres conseils, voir [ici](https://chris.beams.io/posts/git-commit/)." -#. 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." +#. type: Title # +#: en/./developers/03_Backend/01_Database_schema.md:1 +#, no-wrap +msgid "Database Schema" 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!" +#. 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/01_Database_schema.md:5 +#, no-wrap +msgid "See also" 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.**" +#: en/./developers/03_Backend/01_Database_schema.md:7 +msgid "[Database configuration](../../admins/DatabaseConfig.md)" 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/):" +#. type: Title # +#: en/./developers/03_Backend/03_External_libraries.md:1 +#, no-wrap +msgid "External Libraries" 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 +#. type: Title # +#: en/./developers/03_Backend/05_Extensions.md:1 #, 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." +msgid "Writing extensions for FreshRSS" +msgstr "Écriture d’extensions pour FreshRSS" -#. type: Title ### -#: en/./developers/02_Github.md:46 +#. type: Title ## +#: en/./developers/03_Backend/05_Extensions.md:3 #, no-wrap -msgid "What have I been trying to do?" -msgstr "Qu’est-ce que j’ai essayé de faire ?" +msgid "About FreshRSS" +msgstr "Présentation de FreshRSS" #. type: Plain text -#: en/./developers/02_Github.md:49 +#: en/./developers/03_Backend/05_Extensions.md:6 msgid "" -"Explain step by step what you have done so that we can reproduce the bug." +"FreshRSS is an RSS / Atom feed aggregator written in PHP dating back to " +"October 2012. The official site is located at [freshrss.org](https://" +"freshrss.org) and the official repository is hosted on Github: [github.com/" +"FreshRSS/FreshRSS](https://github.com/FreshRSS/FreshRSS)." msgstr "" -"Expliquez pas à pas ce que vous avez fait afin que nous puissions reproduire " -"le bug." +"FreshRSS est un agrégateur de flux RSS / Atom écrit en PHP depuis octobre " +"2012. Le site officiel est situé à l’adresse [freshrss.org](https://freshrss." +"org) et son dépot Git est hébergé par Github : [github.com/FreshRSS/FreshRSS]" +"(https://github.com/FreshRSS/FreshRSS)." -#. type: Title ### -#: en/./developers/02_Github.md:50 +#. type: Title ## +#: en/./developers/03_Backend/05_Extensions.md:7 #, no-wrap -msgid "What results have I achieved?" -msgstr "Quels résultats ai-je obtenus ?" +msgid "The problem" +msgstr "Problème à résoudre" #. 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." +#: en/./developers/03_Backend/05_Extensions.md:10 +msgid "FreshRSS is limited in its technical possibilities by various factors:" msgstr "" -"Le bug : ce que vous voyez qui n’aurez pas dû se passer. Ici vous pouvez " -"fournir les logs." +"FreshRSS est limité dans ses possibilités techniques par différents " +"facteurs :" -#. type: Title ### -#: en/./developers/02_Github.md:54 -#, no-wrap -msgid "What was the expected result?" -msgstr "Quel était le résultat attendu ?" +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:14 +msgid "The number of developers" +msgstr "La disponibilité des développeurs principaux ;" -#. 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: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:14 +msgid "The will to integrate certain changes" +msgstr "La volonté d’intégrer certains changements ;" -#. type: Title ### -#: en/./developers/02_Github.md:58 -#, no-wrap -msgid "What are my circumstances?" -msgstr "Quelle est ma situation ?" +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:14 +msgid "The level of \"hacking\" required to integrate marginal features" +msgstr "" +"Le niveau de « hack » nécessaire pour intégrer des fonctionnalités à la " +"marge." #. 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 :" +#: en/./developers/03_Backend/05_Extensions.md:16 +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 " +"contributors to take an interest in the source code of the entire project. " +"In order to remove the other two limitations, most of the time it will be " +"necessary to create a \"fork\"." +msgstr "" +"Si la première limitation peut, en théorie, être levée par la participation " +"de nouveaux contributeurs au projet, elle est en réalité conditionnée par la " +"volonté des contributeurs à s’intéresser au code source du projet en entier. " +"Afin de lever les deux autres limitations quant à elles, il faudra la " +"plupart du temps passer par un « à-coté » souvent synonyme de « fork »." -#. type: Bullet: ' 1. ' -#: en/./developers/02_Github.md:67 -msgid "Which browser? Which version?" -msgstr "Quel navigateur ? Quelle version ?" +#. type: Plain text +#: en/./developers/03_Backend/05_Extensions.md:18 +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 " +"software, we allow for:" +msgstr "" +"Une autre solution consiste à passer par un système d’extensions. En " +"permettant à des utilisateurs d’écrire leur propre extension sans avoir à " +"s’intéresser au cœur même du logiciel de base, on permet :" -#. 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: '1. ' +#: en/./developers/03_Backend/05_Extensions.md:22 +msgid "Reducing the amount of source code a new contributor has to take in" +msgstr "" +"De réduire la quantité de code source à assimiler pour un nouveau " +"contributeur ;" -#. type: Bullet: ' 3. ' -#: en/./developers/02_Github.md:67 -msgid "Which version of PHP?" -msgstr "Quelle version de PHP ?" +#. type: Bullet: '2. ' +#: en/./developers/03_Backend/05_Extensions.md:22 +msgid "Unofficial integration of novelties" +msgstr "De permettre d’intégrer des nouveautés de façon non-officielles ;" -#. type: Bullet: ' 4. ' -#: en/./developers/02_Github.md:67 -msgid "Which database: SQLite, MySQL, MariaDB, PostgreSQL? Which version?" +#. type: Bullet: '3. ' +#: en/./developers/03_Backend/05_Extensions.md:22 +msgid "No forking or main developer approval required." msgstr "" -"Quelle base de données : SQLite, MySQL, MariaDB, PostgreSQL ? Quelle " -"version ?" +"De se passer des développeurs principaux pour d’éventuelles améliorations " +"sans passer par la case « fork »." -#. 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: Plain text +#: en/./developers/03_Backend/05_Extensions.md:24 +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 "" +"Note : il est tout à fait imaginable que les fonctionnalités d’une extension " +"puissent par la suite être intégrées dans le code initial de FreshRSS de " +"façon officielle. Cela permet de proposer un « proof of concept » assez " +"facilement." #. type: Title # -#: en/./developers/02_Github.md:68 +#: en/./developers/03_Backend/05_Extensions.md:25 +#: en/./developers/Minz/index.md:1 #, no-wrap -msgid "Branching" -msgstr "Système de branches" +msgid "Minz Framework" +msgstr "" + +#. type: Plain text +#: en/./developers/03_Backend/05_Extensions.md:28 +msgid "see [Minz documentation](/docs/en/developers/Minz/index.md)" +msgstr "" #. type: Title ## -#: en/./developers/02_Github.md:70 +#: en/./developers/03_Backend/05_Extensions.md:29 #, no-wrap -msgid "Basic" -msgstr "Élémentaire" +msgid "Write an extension for FreshRSS" +msgstr "Écrire une extension pour FreshRSS" #. type: Plain text -#: en/./developers/02_Github.md:72 +#: en/./developers/03_Backend/05_Extensions.md:32 msgid "" -"If you are new to Git, here are some of the resources you might find useful:" +"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 "" -"Si vous êtes novice dans Git, voici quelques ressources qui pourraient vous " -"être utiles :" - -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:77 -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 -msgid "" -msgstr "" - -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:77 -msgid "" -msgstr "" +"Nous y voilà ! Nous avons abordé les fonctionnalités les plus utiles de Minz " +"et qui permettent de faire tourner FreshRSS correctement et il est plus que " +"temps d’aborder les extensions en elles-même." -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:77 -msgid "" -msgstr "" +#. type: Plain text +#: 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." +msgstr "" +"Une extension permet donc d’ajouter des fonctionnalités facilement à " +"FreshRSS sans avoir à toucher au cœur du projet directement." -#. type: Title ## -#: en/./developers/02_Github.md:78 +#. type: Title ### +#: en/./developers/03_Backend/05_Extensions.md:35 #, no-wrap -msgid "Getting the latest code from the FreshRSS repository" -msgstr "Obtenir le dernier code du répertoire FreshRSS" +msgid "Make it work in Docker" +msgstr "" #. type: Plain text -#: en/./developers/02_Github.md:80 -msgid "First you need to add the official repo to your remote repo list:" +#: 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 "" -"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/03_Backend/05_Extensions.md:38 #, 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 -msgid "You can verify the remote repo is successfully added by using:" +msgid "make start extensions=\"/full/path/to/extension/1 /full/path/to/extension/2\"\n" 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: Title ### +#: en/./developers/03_Backend/05_Extensions.md:42 #, no-wrap -msgid "git remote -v show\n" -msgstr "git remote -v show\n" +msgid "Basic files and folders" +msgstr "Les fichiers et répertoires de base" #. type: Plain text -#: en/./developers/02_Github.md:90 -msgid "Now you can pull the latest development code:" -msgstr "Vous pouvez maintenant pull le dernier code de développement :" +#: 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 " +"is a directory containing a set of mandatory (and optional) files and " +"subdirectories. The convention requires that the main directory name be " +"preceded by an \"x\" to indicate that it is not an extension included by " +"default in FreshRSS." +msgstr "" +"La première chose à noter est que **toutes** les extensions **doivent** se " +"situer dans le répertoire `extensions`, à la base de l’arborescence de " +"FreshRSS. Une extension est un répertoire contenant un ensemble de fichiers " +"et sous-répertoires obligatoires ou facultatifs. La convention veut que l’on " +"précède le nom du répertoire principal par un « x » pour indiquer qu’il ne " +"s’agit pas d’une extension incluse par défaut dans FreshRSS." #. type: Plain text -#: en/./developers/02_Github.md:90 -#, no-wrap +#: en/./developers/03_Backend/05_Extensions.md:49 msgid "" -"git checkout edge\n" -"git pull upstream edge\n" +"The main directory of an extension must contain at least two **mandatory** " +"files:" msgstr "" -"git checkout edge\n" -"git pull upstream edge\n" - -#. type: Title ## -#: en/./developers/02_Github.md:95 -#, no-wrap -msgid "Starting a new development branch" -msgstr "Lancer une nouvelle branche de développement" +"Le répertoire principal d’une extension doit comporter au moins deux " +"fichiers **obligatoire** :" -#. type: Plain text -#: en/./developers/02_Github.md:96 -#, no-wrap -msgid "git checkout -b my-development-branch\n" -msgstr "git checkout -b mon-branch-developpement\n" +#. type: Bullet: '* ' +#: 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." +msgstr "" +"Un fichier `metadata.json` qui contient une description de l’extension. Ce " +"fichier est écrit en JSON ;" -#. type: Title # -#: en/./developers/02_Github.md:100 -#, no-wrap -msgid "Sending a patch" -msgstr "Proposer un patch" +#. type: Bullet: '* ' +#: 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/02_Github.md:102 -#, no-wrap +#: en/./developers/03_Backend/05_Extensions.md:56 msgid "" -"# Add the changed file, here actualize_script.php\n" -"git add app/actualize_script.php\n" -"# Commit the change and write a proper commit message\n" -"git commit\n" -"# Double check all looks well\n" -"git show\n" -"# Push it to your fork\n" -"git push\n" +"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 " +"should follow our best practice: If you want to write a `HelloWorld` " +"extension, the directory name should be `xExtension-HelloWorld` and the base " +"class name `HelloWorldExtension`." msgstr "" -"# Ajoutez le fichier modifié, ici actualize_script.php\n" -"git add app/actualize_script.php\n" -"# Commitez le changement et écrivez un message de commit approprié.\n" -"git commit\n" -"# Vérifiez deux fois que tout a l’air d’aller bien\n" -"git show\n" -"# Poussez les changements sur ton fork\n" -"git push\n" #. type: Plain text -#: en/./developers/02_Github.md:114 -msgid "Now you can create a PR based on your branch." -msgstr "Vous pouvez maintenant créer une PR en fonction de votre branche." +#: en/./developers/03_Backend/05_Extensions.md:58 +msgid "" +"In the file `freshrss/extensions/xExtension-HelloWorld/extension.php` you " +"need the structure:" +msgstr "" -#. type: Title ## -#: en/./developers/02_Github.md:115 +#. type: Fenced code block (php) +#: en/./developers/03_Backend/05_Extensions.md:58 #, 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 msgid "" -"A commit message should succintly describe the changes on the first line. " -"For example:" +"class HelloWorldExtension extends Minz_Extension {\n" +"\tpublic function init() {\n" +"\t\t// your code here\n" +"\t}\n" +"}\n" 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 -#, no-wrap -msgid "> Fix broken icon\n" -msgstr "> Fixe une icône cassée\n" +#: 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/02_Github.md:122 +#: en/./developers/03_Backend/05_Extensions.md:69 msgid "" -"If necessary, this can be followed by a blank line and a longer explanation." +"You may also need additional files or subdirectories depending on your needs:" msgstr "" -"Si nécessaire, une ligne blanche et une explication plus longue peuvent le " -"suivre." -#. type: Plain text -#: en/./developers/02_Github.md:123 -msgid "For further tips, see [here](https://chris.beams.io/posts/git-commit/)." +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:75 +msgid "" +"`configure.phtml` is the file containing the form to parameterize your " +"extension" msgstr "" -"Pour d’autres conseils, voir [ici](https://chris.beams.io/posts/git-commit/)." +"`configure.phtml` est le fichier contenant le formulaire pour paramétrer " +"votre extension" -#. type: Title # -#: en/./developers/03_Backend/02_Minz.md:1 -#, no-wrap -msgid "Models" -msgstr "Modèles" +#. type: Bullet: '* ' +#: 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 " +"more interesting to write a complete theme)" +msgstr "" -#. type: Title # -#: en/./developers/03_Backend/02_Minz.md:5 -#, no-wrap -msgid "Controllers and actions" -msgstr "Contrôleurs et actions" +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:75 +msgid "A `Controllers` directory containing additional controllers" +msgstr "" -#. 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: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:75 +msgid "An `i18n` directory containing additional translations" +msgstr "" -#. 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: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:75 +msgid "" +"`layout` and `views` directories to define new views or to overwrite the " +"current views" +msgstr "" -#. type: Title # -#: en/./developers/03_Backend/02_Minz.md:17 -#, no-wrap -msgid "Writing URL" -msgstr "Écriture des URL" +#. type: Plain text +#: 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 " +"detailed description of it." +msgstr "" -#. type: Title # -#: en/./developers/03_Backend/02_Minz.md:21 -#: en/./developers/04_Frontend/01_View_files.md:13 +#. type: Title ### +#: en/./developers/03_Backend/05_Extensions.md:78 #, no-wrap -msgid "Internationalisation" -msgstr "Internationalisation" +msgid "The metadata.json file" +msgstr "" -#. type: Title # -#: en/./developers/03_Backend/02_Minz.md:25 -#, no-wrap -msgid "Understanding internals" -msgstr "Comprendres les mécanismes internes" +#. type: Plain text +#: 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 " +"following entries:" +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: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:89 +msgid "`name`: the name of your extension" +msgstr "`name` : le nom de votre extension ;" -#. type: Title # -#: en/./developers/03_Backend/04_Changing_source_code.md:5 -#, no-wrap -msgid "Writing an action and its related view" -msgstr "Écrire une action et sa vue associée" +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:89 +msgid "" +"`author`: your name, your e-mail address … but there is no specific format " +"to adopt" +msgstr "" +"`author` : votre nom, éventuellement votre adresse mail mais il n’y a pas de " +"format spécifique à adopter ;" -#. 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/05_Extensions.md:89 +msgid "`description`: a description of your extension" +msgstr "`description` : une description de votre extension ;" -#. type: Title # -#: en/./developers/03_Backend/04_Changing_source_code.md:13 -#, no-wrap -msgid "Logs" -msgstr "Gestion des logs" +#. type: Bullet: '* ' +#: 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: Title # -#: en/./developers/03_Backend/05_Extensions.md:1 -#, no-wrap -msgid "Writing extensions for FreshRSS" -msgstr "Écriture d’extensions pour FreshRSS" +#. 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 "" +"* `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: Title ## -#: en/./developers/03_Backend/05_Extensions.md:3 +#. type: Plain text +#: 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:92 #, no-wrap -msgid "About FreshRSS" -msgstr "Présentation de FreshRSS" +msgid "Choosing between `system` and `user`" +msgstr "Choisir entre extension « system » ou « user »" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:6 +#: en/./developers/03_Backend/05_Extensions.md:95 msgid "" -"FreshRSS is an RSS / Atom feed aggregator written in PHP dating back to " -"October 2012. The official site is located at [freshrss.org](https://" -"freshrss.org) and the official repository is hosted on Github: [github.com/" -"FreshRSS/FreshRSS](https://github.com/FreshRSS/FreshRSS)." +"A *user* extension can be enabled by some users and not by others (typically " +"for user preferences)." msgstr "" -"FreshRSS est un agrégateur de flux RSS / Atom écrit en PHP depuis octobre " -"2012. Le site officiel est situé à l’adresse [freshrss.org](https://freshrss." -"org) et son dépot Git est hébergé par Github : [github.com/FreshRSS/FreshRSS]" -"(https://github.com/FreshRSS/FreshRSS)." - -#. type: Title ## -#: en/./developers/03_Backend/05_Extensions.md:7 -#, no-wrap -msgid "The problem" -msgstr "Problème à résoudre" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:10 -msgid "FreshRSS is limited in its technical possibilities by various factors:" +#: en/./developers/03_Backend/05_Extensions.md:97 +msgid "A *system* extension in comparison is enabled for every account." msgstr "" -"FreshRSS est limité dans ses possibilités techniques par différents " -"facteurs :" - -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:14 -msgid "The number of developers" -msgstr "La disponibilité des développeurs principaux ;" - -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:14 -msgid "The will to integrate certain changes" -msgstr "La volonté d’intégrer certains changements ;" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:14 -msgid "The level of \"hacking\" required to integrate marginal features" +#. type: Title ### +#: en/./developers/03_Backend/05_Extensions.md:98 +#, no-wrap +msgid "Writing your own extension.php" msgstr "" -"Le niveau de « hack » nécessaire pour intégrer des fonctionnalités à la " -"marge." #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:16 +#: en/./developers/03_Backend/05_Extensions.md:102 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 " -"contributors to take an interest in the source code of the entire project. " -"In order to remove the other two limitations, most of the time it will be " -"necessary to create a \"fork\"." +"This file is the core of your extension. It must define some key elements " +"to be loaded by the extension system:" msgstr "" -"Si la première limitation peut, en théorie, être levée par la participation " -"de nouveaux contributeurs au projet, elle est en réalité conditionnée par la " -"volonté des contributeurs à s’intéresser au code source du projet en entier. " -"Afin de lever les deux autres limitations quant à elles, il faudra la " -"plupart du temps passer par un « à-coté » souvent synonyme de « fork »." -#. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:18 +#. 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 "" -"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 " -"software, we allow for:" +"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 "" -"Une autre solution consiste à passer par un système d’extensions. En " -"permettant à des utilisateurs d’écrire leur propre extension sans avoir à " -"s’intéresser au cœur même du logiciel de base, on permet :" +"`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: '1. ' -#: en/./developers/03_Backend/05_Extensions.md:22 -msgid "Reducing the amount of source code a new contributor has to take in" +#: en/./developers/03_Backend/05_Extensions.md:106 +msgid "" +"The class must extend the `Minz_Extension` abstract class which defines the " +"core methods and properties of a FreshRSS extension." msgstr "" -"De réduire la quantité de code source à assimiler pour un nouveau " -"contributeur ;" - -#. type: Bullet: '2. ' -#: en/./developers/03_Backend/05_Extensions.md:22 -msgid "Unofficial integration of novelties" -msgstr "De permettre d’intégrer des nouveautés de façon non-officielles ;" -#. type: Bullet: '3. ' -#: en/./developers/03_Backend/05_Extensions.md:22 -msgid "No forking or main developer approval required." +#. type: Bullet: '1. ' +#: en/./developers/03_Backend/05_Extensions.md:106 +msgid "" +"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 "" -"De se passer des développeurs principaux pour d’éventuelles améliorations " -"sans passer par la case « fork »." #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:24 +#: en/./developers/03_Backend/05_Extensions.md:111 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." +"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 "" -"Note : il est tout à fait imaginable que les fonctionnalités d’une extension " -"puissent par la suite être intégrées dans le code initial de FreshRSS de " -"façon officielle. Cela permet de proposer un « proof of concept » assez " -"facilement." -#. type: Title ## -#: en/./developers/03_Backend/05_Extensions.md:25 +#. type: Plain text +#: en/./developers/03_Backend/05_Extensions.md:113 #, no-wrap -msgid "Understanding basic mechanics (Minz and MVC)" -msgstr "Comprendre les mécaniques de base (Minz et MVC)" +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: Plain text -#: en/./developers/03_Backend/05_Extensions.md:28 +#: en/./developers/03_Backend/05_Extensions.md:127 #, no-wrap -msgid "**TODO** : move to 02_Minz.md\n" -msgstr "**TODO** : bouger dans 02_Minz.md\n" +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 `\\Controller.php`, and its class name must be `FreshExtension_\\_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: 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)." +#: 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 "" -"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 +#: en/./developers/03_Backend/05_Extensions.md:130 #, no-wrap -msgid "MVC Architecture" -msgstr "Architecture MVC" +msgid "The \"hooks\" system" +msgstr "Le système « hooks »" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:34 +#: en/./developers/03_Backend/05_Extensions.md:133 msgid "" -"Minz relies on and imposes an MVC architecture on projects using it. This " -"architecture consists of three main components:" +"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 "" -"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 +#. type: Fenced code block (html) +#: en/./developers/03_Backend/05_Extensions.md:134 +#, no-wrap 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." +"class HelloWorldExtension extends Minz_Extension\n" +"{\n" +"\tpublic function init() {\n" +"\t\t$this->registerHook('entry_before_display', array($this, 'renderEntry'));\n" +"\t}\n" +"\tpublic function renderEntry($entry) {\n" +"\t\t$entry->_content('

Hello World

' . $entry->content());\n" +"\t\treturn $entry;\n" +"\t}\n" +"}\n" +msgstr "" + +#. type: Plain text +#: en/./developers/03_Backend/05_Extensions.md:148 +msgid "The following events are available:" 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 +#: en/./developers/03_Backend/05_Extensions.md:164 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." +"`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 doesn’t advertise it in the header " +"can still be automatically supported." 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 +#: en/./developers/03_Backend/05_Extensions.md:164 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." +"`entry_before_display` (`function($entry) -> Entry | null`): will be " +"executed every time an entry is rendered. The entry itself (instance of " +"FreshRSS\\_Entry) will be passed as parameter." 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 +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 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." +"`entry_before_insert` (`function($entry) -> Entry | null`): will be executed " +"when a feed is refreshed and new entries will be imported into the database. " +"The new entry (instance of FreshRSS\\_Entry) will be passed as parameter." 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 +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 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." +"`feed_before_actualize` (`function($feed) -> Feed | null`): will be executed " +"when a feed is updated. The feed (instance of FreshRSS\\_Feed) will be " +"passed as parameter." 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 +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 msgid "" -"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" +"`feed_before_insert` (`function($feed) -> Feed | null`): will be executed " +"when a new feed is imported into the database. The new feed (instance of " +"FreshRSS\\_Feed) will be passed as parameter." msgstr "" -"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 +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 msgid "" -"When loading the address http://exemple.com?c=hello&a=world, the `world` " -"action is executed on the `hello` controller." +"`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." 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 +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 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." +"`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 "" -"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 +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 msgid "" -"From now on, the `hello/world` naming convention will be used to refer to a " -"controller/action pair." +"`js_vars` (`function($vars = array) -> array | null`): will be executed if " +"the `jsonVars` in the header will be generated." 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 +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 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." +"`menu_admin_entry` (`function() -> string`): add an entry at the end of the " +"\"Administration\" menu, the returned string must be valid HTML (e.g. `
  • New entry
  • `)." 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 +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 msgid "" -"As explained above, the views consist of HTML mixed with PHP. Code example:" +"`menu_configuration_entry` (`function() -> string`): add an entry at the end " +"of the \"Configuration\" menu, the returned string must be valid HTML (e.g. " +"`
  • New entry
  • `)." 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 +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 msgid "" -"

    \n" -"\tThis is a parameter passed from the controller: a_variable ?>\n" -"

    \n" +"`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. `
  • New " +"entry
  • `)." msgstr "" -"

    \n" -"\tPhrase passée en paramètre : a_variable ?>\n" -"

    \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 +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 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:" +"`nav_menu` (`function() -> string`): will be executed if the navigation was " +"built." 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 +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 msgid "" -"\n" +"`nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** " +"add documentation." msgstr "" -"\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." +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 +msgid "`post_update` (`function(none) -> none`): **TODO** add documentation." 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 +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:164 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." +"`simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** " +"add documentation." 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 +#: en/./developers/03_Backend/05_Extensions.md:165 #, no-wrap -msgid "Access session settings" -msgstr "Accéder aux paramètres de session" +msgid "Writing your own configure.phtml" +msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:115 +#: en/./developers/03_Backend/05_Extensions.md:168 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`." +"When you want to support user configurations for your extension or simply " +"display some information, you have to create the `configure.phtml` file." 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 +#. type: Title # +#: en/./developers/03_Running_tests.md:1 #, no-wrap -msgid "Working with URLs" -msgstr "Gestion des URL" +msgid "Running tests" +msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:119 +#: en/./developers/03_Running_tests.md:4 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:" +"FreshRSS is tested with [PHPUnit](https://phpunit.de/). No code should be " +"merged in `edge` if the tests don’t pass." 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 +#. type: Title ## +#: en/./developers/03_Running_tests.md:5 #, no-wrap -msgid "" -"

    \n" -"\tGo to page Hello world!\n" -"

    \n" +msgid "Locally" msgstr "" -"

    \n" -"\tAccéder à la page Hello world!\n" -"

    \n" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:127 +#: en/./developers/03_Running_tests.md:8 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!" +"As a developer, you can run the test suite on your PC easily with `make` " +"commands. You can run the test suite with:" 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 "" +#. type: Fenced code block (sh) +#: en/./developers/03_Running_tests.md:9 +#, fuzzy, no-wrap +#| msgid "$ make stop\n" +msgid "make test\n" +msgstr "$ make stop\n" + +#. type: Plain text +#: en/./developers/03_Running_tests.md:14 +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 " +"issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues/new) to let " +"maintainers know about the problem." +msgstr "" + +#. type: Plain text +#: en/./developers/03_Running_tests.md:16 +msgid "" +"Then, it executes PHPUnit in a Docker container. If you don’t use Docker, " +"you can run the command directly with:" +msgstr "" + +#. 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" +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:30 +#, no-wrap +msgid "GitHub Actions for Continuous Integration" +msgstr "" + +#. type: Plain text +#: en/./developers/03_Running_tests.md:35 +msgid "" +"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:37 +#, fuzzy +#| msgid "" +#| "If your request is new, [open a new bug ticket](https://github.com/" +#| "FreshRSS/FreshRSS/issues/new)" +msgid "" +"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# is the port used on the host to communicate with the server\n" +"\t# is the name of the docker network used (by default, it’s freshrss-network)\n" +"\tdocker run -it --rm -p :8080 --name wiremock --network -v $PWD:/home/wiremock wiremock/wiremock:latest-alpine --local-response-templating\n" +"\t```\n" +"1. You can access the `` mock file directly:\n" +" * from the host by sending a GET request to `http://localhost:/`,\n" +" * from any container connected on the same network by sending a GET request to `http://wiremock:8080/`.\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:7 +#, no-wrap +msgid "Writing a URL" +msgstr "Écrire une URL" + +#. 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/01_View_files.md:15 +#, no-wrap +msgid "Internationalisation" +msgstr "Internationalisation" + +#. type: Title # +#: en/./developers/04_Frontend/02_Design.md:1 +#, no-wrap +msgid "Writing a new theme" +msgstr "Écrire un nouveau thème" + +#. 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 +msgid "Opening a pull request" +msgstr "" + +#. type: Plain text +#: en/./developers/04_Pull_requests.md:4 +#, fuzzy +#| msgid "" +#| "[Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/" +#| "issues)" +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)!" +msgstr "" +"[Rendez-vous sur le gestionnaire de tickets de bugs](https://github.com/" +"FreshRSS/FreshRSS/issues)" + +#. type: Plain text +#: en/./developers/04_Pull_requests.md:6 +msgid "" +"When you open a PR, your message will be prefilled with a message based on " +"[a template](https://github.com/FreshRSS/FreshRSS/blob/edge/docs/" +"pull_request_template.md). It contains a checklist to make sure you didn’t " +"forget anything. It is very important to verify you did everything mentioned " +"so documentation is up-to-date, the commit history stays clear and the code " +"is always stable." +msgstr "" + +#. type: Plain text +#: en/./developers/04_Pull_requests.md:8 +msgid "The rest of this document explains specific points." +msgstr "" + +#. type: Title ## +#: en/./developers/04_Pull_requests.md:9 +#, no-wrap +msgid "How to rebase your branch on `edge`" +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 " +"do that." +msgstr "" + +#. type: Plain text +#: 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:17 +#, no-wrap +msgid "Rebasing" +msgstr "" + +#. type: Plain text +#: 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 " +"difficult if you’re not at ease with Git since conflicts are harder to " +"resolve." +msgstr "" + +#. type: Plain text +#: 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 " +"out." +msgstr "" + +#. type: Plain text +#: en/./developers/04_Pull_requests.md:24 +msgid "To rebase a branch:" +msgstr "" + +#. 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" +msgstr "" + +#. type: Plain text +#: 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:34 +#, fuzzy, no-wrap +#| msgid "Debugging" +msgid "Merging" +msgstr "Déboguer" + +#. type: Plain text +#: 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. " +"Don’t worry, we will take care of it before merging your PR back into `edge`." +msgstr "" + +#. type: Plain text +#: en/./developers/04_Pull_requests.md:39 +msgid "To merge `edge`:" +msgstr "" + +#. 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" +msgstr "" + +#. type: Title ## +#: 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: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 " +"explain the choices made in the past (the “why?”)" +msgstr "" + +#. type: Plain text +#: en/./developers/04_Pull_requests.md:52 +msgid "" +"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.”" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/04_Pull_requests.md:54 +msgid "This commit will *add feature X*" +msgstr "" + +#. type: Plain text +#: 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 " +"body is the place where you can clarify the context of your patch. For " +"instance, you can explain what you were doing when you identified a bug, or " +"the problem you had before your patch. Providing this information helps " +"other developers understand why a specific choice was made, especially when " +"a patch introduces a bug that is identified months later." +msgstr "" + +#. type: Plain text +#: 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:60 +#, fuzzy +#| msgid "" +#| "For further tips, see [here](https://chris.beams.io/posts/git-commit/)." +msgid "" +"You can find more information about commit messages [on this blog post]" +"(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/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: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 " +"appreciate it if you wrote a test that ensures your patch is working." +msgstr "" + +#. type: Plain text +#: 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: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: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: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: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 " +"to their problems. The documentation should not be written “later” or " +"chances are it’ll never be." +msgstr "" + +#. type: Plain text +#: 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." +msgstr "" + +#. type: Title # +#: en/./developers/05_Release_new_version.md:1 +#, no-wrap +msgid "Preparing the release" +msgstr "Préparer la sortie" + +#. type: Plain text +#: 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**." +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**." + +#. type: Plain text +#: 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: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: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 " +"executed before any publication." +msgstr "" +"Avant de sortir une nouvelle version de FreshRSS, il faut vous assurer que " +"le code est stable et ne présente pas de bugs majeurs. Idéalement, il " +"faudrait que nos tests soient automatisés et exécutés avant toute " +"publication." + +#. type: Plain text +#: 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." +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:14 +#, no-wrap +msgid "Git process" +msgstr "Processus Git" + +#. type: Fenced code block (console) +#: en/./developers/05_Release_new_version.md:16 +#, no-wrap +msgid "" +"$ git checkout edge\n" +"$ git pull\n" +"$ vim constants.php\n" +"# Update version number x.y.y.z of FRESHRSS_VERSION\n" +"$ git commit -a\n" +"Version x.y.z\n" +"$ git tag -a x.y.z\n" +"Version x.y.z\n" +"$ git push && git push --tags\n" +msgstr "" +"$ git checkout edge\n" +"$ git pull\n" +"$ vim constants.php\n" +"# Mettre à jour le numéro de version x.y.z de FRESHRSS_VERSION\n" +"$ git commit -a\n" +"Version x.y.z\n" +"$ git tag -a x.y.z\n" +"Version x.y.z\n" +"$ git push && git push --tags\n" + +#. 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:31 +msgid "" +"It’s important to update update.freshrss.org since this is the default " +"service for automatic FreshRSS updates." +msgstr "" +"Il est important de mettre à jour update.freshrss.org puisqu’il s’agit du " +"service par défaut gérant les mises à jour automatiques de FreshRSS." + +#. type: Plain text +#: 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/)." +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: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: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." +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." + +#. type: Plain text +#: 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 " +"URL from which the FreshRSS package will be downloaded (`PACKAGE_URL`). The " +"URL is in the form of `https://codeload.github.com/FreshRSS/FreshRSS/zip/x.y." +"z`." +msgstr "" +"Afin d’écrire un nouveau script, il est préférable de copier / coller celui " +"de la dernière version ou de partir de `update_to_dev.php`. La première " +"chose à faire est de définir l’URL à partir de laquelle sera téléchargée le " +"package FreshRSS (`PACKAGE_URL`). L’URL est de la forme `https://codeload." +"github.com/FreshRSS/FreshRSS/zip/x.y.z`." + +#. type: Plain text +#: 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:47 +msgid "" +"`apply_update()` takes care of saving the directory containing the data, " +"checking its structure, downloading the FreshRSS package, deploying it and " +"cleaning it all up. This function is pre-filled but adjustments can be made " +"if necessary (e.g., reorganization of the `./data` structure). It returns " +"`true` if no problem has occurred or a string indicating a problem;" +msgstr "" +"`apply_update()` qui se charge de sauvegarder le répertoire contenant les " +"données, de vérifier sa structure, de télécharger le package FreshRSS, de le " +"déployer et de tout nettoyer. Cette fonction est pré-remplie mais des " +"ajustements peuvent être faits si besoin est (ex. réorganisation de la " +"structure de `./data`). Elle retourne `true` si aucun problème n’est survenu " +"ou une chaîne de caractères indiquant un soucis ;" + +#. type: Bullet: '* ' +#: 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;" +msgstr "" +"`need_info_update()` retourne `true` si l’utilisateur doit intervenir durant " +"la mise à jour ou `false` sinon ;" + +#. type: Bullet: '* ' +#: 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`;" +msgstr "" +"`ask_info_update()` affiche un formulaire à l’utilisateur si " +"`need_info_update()` a retourné `true` ;" + +#. type: Bullet: '* ' +#: 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);" +msgstr "" +"`save_info_update()` est chargée de sauvegarder les informations renseignées " +"par l’utilisateur (issues du formulaire de `ask_info_update()`) ;" + +#. type: Bullet: '* ' +#: 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 " +"`Minz_Configuration` object, you will benefit from these improvements)." +msgstr "" +"`do_post_update()` est exécutée à la fin de la mise à jour et prend en " +"compte le code de la nouvelle version (ex. si la nouvelle version modifie " +"l’objet `Minz_Configuration`, vous bénéficierez de ces améliorations)." + +#. type: Title ## +#: 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: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 " +"versions are updated to which other versions." +msgstr "" +"Lorsque le script a été écrit et versionné, il est nécessaire de mettre à " +"jour le fichier `./versions.php` qui contient une table de correspondances " +"indiquant quelles versions sont mises à jour vers quelles autres versions." + +#. type: Plain text +#: 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: Fenced code block (php) +#: en/./developers/05_Release_new_version.md:54 +#, no-wrap +msgid "" +" '1.0.0',\n" +"\t'0.8.1' => '1.0.0',\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" +"\t'1.1.4-dev' => 'dev',\n" +");\n" +msgstr "" +" '1.0.0',\n" +"\t'0.8.1' => '1.0.0',\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" +"\t'1.1.4-dev' => 'dev',\n" +");\n" + +#. type: Plain text +#: 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: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: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: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:75 +msgid "" +"it’s possible to skip several versions at once, provided that the update " +"scripts support it;" +msgstr "" +"il est possible de sauter plusieurs versions d’un coup à condition que les " +"scripts de mise à jour le prennent en charge ;" + +#. type: Bullet: '* ' +#: 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. " +"As long as the corresponding script does not exist, nothing will happen." +msgstr "" +"il est conseillé d’indiquer la correspondance de la version courante vers sa " +"potentielle future version en précisant que cette version n’existe pas " +"encore. Tant que le script correspondant n’existera pas, rien ne se passera." + +#. type: Plain text +#: 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 " +"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:78 +#, no-wrap +msgid "Deployment" +msgstr "Déploiement" + +#. type: Plain text +#: 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." +"freshrss.org and change the `FRESHRSS_UPDATE_WEBSITE` URL of your FreshRSS " +"instance. Start the update and check that it’s running correctly." +msgstr "" +"Avant de mettre à jour update.freshrss.org, il est préférable de tester avec " +"dev.update.freshrss.org qui correspond à la pré-production. Mettez donc à " +"jour dev.update.freshrss.org et changez l’URL `FRESHRSS_UPDATE_WEBSITE` de " +"votre instance FreshRSS. Lancez la mise à jour et vérifiez que celle-ci se " +"déroule correctement." + +#. type: Plain text +#: 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." +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:84 +#, no-wrap +msgid "Updating the FreshRSS services" +msgstr "Mise à jour des services FreshRSS" + +#. type: Plain text +#: 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:90 +msgid "rss.freshrss.org;" +msgstr "rss.freshrss.org ;" + +#. type: Bullet: '* ' +#: 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:91 +#, no-wrap +msgid "Publicly announce the release" +msgstr "Annoncer publiquement la sortie" + +#. type: Plain text +#: 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:99 +msgid "" +"on GitHub by creating[a new release](https://github.com/FreshRSS/FreshRSS/" +"releases/new)" +msgstr "" +"sur GitHub en créant [une nouvelle release](https://github.com/FreshRSS/" +"FreshRSS/releases/new) ;" + +#. type: Bullet: '* ' +#: 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))" +msgstr "" +"sur le blog de freshrss.org au minimum pour les versions stables (écrire " +"l’article sur [FreshRSS/freshrss.org](https://github.com/FreshRSS/freshrss." +"org))." + +#. type: Bullet: '* ' +#: 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:99 +msgid "and on mailing@freshrss.org" +msgstr "et sur mailing@freshrss.org ;" + +#. 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: Fenced code block (console) +#: en/./developers/05_Release_new_version.md:102 +#, no-wrap +msgid "" +"$ git checkout edge\n" +"$ vim constants.php\n" +"# Update the FRESHRSS_VERSION\n" +"$ vim CHANGELOG.md\n" +"# Prepare the changelog for the next version\n" +"$ git add CHANGELOG.md && git commit && git push\n" +msgstr "" +"$ git checkout edge\n" +"$ vim constants.php\n" +"# Mettre à jour le numéro de version de FRESHRSS_VERSION\n" +"$ vim CHANGELOG.md\n" +"# Préparer la section pour la prochaine version\n" +"$ git add CHANGELOG.md && git commit && git push\n" + +#. type: Plain text +#: 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." +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 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 "" +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 "" +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 "" +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 "" +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 "" +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 "" +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 "" +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 "" +"" +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 "" +"" +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 -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 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 "" +"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 "" +"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 , 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 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 "" +"

    \n" +"\tThis is a parameter passed from the controller: a_variable ?>\n" +"

    \n" +msgstr "" +"

    \n" +"\tPhrase passée en paramètre : a_variable ?>\n" +"

    \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 "" +#| "\n" +msgid "" +"\n" +msgstr "" +"\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 "" +"

    \n" +"\tGo to page Hello world!\n" +"

    \n" +msgstr "" +"

    \n" +"\tAccéder à la page Hello world!\n" +"

    \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 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 :" +"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 "" +" 'hello',\n" +"\t'a' => 'world',\n" +"\t'params' => [\n" +"\t\t'foo' => 'bar',\n" +"\t],\n" +"];\n" +"\n" +"// Show something like .?c=hello&a=world&foo=bar\n" +"echo Minz_Url::display($url_array);\n" +"\n" +"?>\n" +msgstr "" +" 'hello',\n" +"\t'a' => 'world',\n" +"\t'params' => [\n" +"\t\t'foo' => 'bar',\n" +"\t],\n" +"];\n" +"\n" +"// Affichera quelque chose comme .?c=hello&a=world&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 "" +"\n" +msgstr "" +"\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 "" +" '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 "" +" '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 "" +" '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 "" +" '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 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 "" +"` ℹ️ [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 "" +"` 'hello',\n" -"\t'a' => 'world',\n" -"\t'params' => [\n" -"\t\t'foo' => 'bar',\n" -"\t],\n" -"];\n" -"\n" -"// Show something like .?c=hello&a=world&foo=bar\n" -"echo Minz_Url::display($url_array);\n" -"\n" -"?>\n" +"`frss:opmlUrl`: If non-empty, indicates that this outline (category) should " +"be dynamically populated from a remote OPML at the specified URL." msgstr "" -" 'hello',\n" -"\t'a' => 'world',\n" -"\t'params' => [\n" -"\t\t'foo' => 'bar',\n" -"\t],\n" -"];\n" -"\n" -"// Affichera quelque chose comme .?c=hello&a=world&foo=bar\n" -"echo Minz_Url::display($url_array);\n" -"\n" -"?>\n" -#. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:148 +#. 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 "" +"\n" +"\n" +"\t\n" +"\t\tFreshRSS OPML extension example\n" +"\t\n" +"\t\n" +"\t\t\n" +"\t\n" +"\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: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 " +"website to another." +msgstr "" +"FreshRSS est un agrégateur et lecteur de flux RSS. Il permet de regrouper " +"l’actualité de plusieurs sites différents dans un endroit unique pour que " +"vous puissiez la lire sans devoir aller de site en site." + +#. type: Plain text +#: 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:24 +msgid "RSS and Atom aggregation" +msgstr "Agrégation des flux RSS et Atom." + +#. type: Bullet: '* ' +#: en/./index.md:24 +msgid "" +"Mark article as favorite if you liked it or if you want to read it later" +msgstr "" +"Utilisez les favoris pour marquer les articles qui vous ont plu ou que vous " +"souhaitez lire plus tard." + +#. type: Bullet: '* ' +#: 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:24 +msgid "" +"Statistics to show you the publishing frequency all the websites you follow" +msgstr "" +"Les statistiques permettent de savoir en un coup d’œil quels sont les sites " +"qui publient le plus, ou à l’inverse, le moins." + +#. type: Bullet: '* ' +#: 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:24 +msgid "Several themes created by the community" +msgstr "Multi-thèmes pour changer l’habillage de FreshRSS." + +#. type: Bullet: '* ' +#: 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:24 +msgid "" +"The application is \"responsive,\" which means it adapts to small screens so " +"you can bring articles in your pocket" +msgstr "" +"« *Responsive design* » : l’application s’adapte aux petits écrans pour " +"emporter FreshRSS dans votre poche." + +#. type: Bullet: '* ' +#: en/./index.md:24 +msgid "" +"Self-hosted: the code is free (under AGPL3 licence), so you can host your " +"own instance of FreshRSS" +msgstr "" +"Auto-hébergeable : le code source est libre (AGPL3) et vous pouvez donc " +"l’héberger sur votre propre serveur." + +#. type: Bullet: '* ' +#: 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: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:28 +msgid "This documentation is split into different sections:" +msgstr "Cette documentation est divisée en plusieurs parties :" + +#. type: Bullet: '* ' +#: 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.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:33 +#, fuzzy +#| msgid "" +#| "[Administrator documentation](./admins/01_Index.html) for detailed " +#| "installation and maintenance related tasks" +msgid "" +"[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: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_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:33 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:" +"[Contributor guidelines](./contributing.md) for those who want to help " +"improve FreshRSS" 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()` :" +"Le [guide de contribution](./contributing.md) pour nous aider à développer " +"FreshRSS." -#. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:149 +#. type: Title ## +#: en/./index.md:34 #, no-wrap -msgid "" -"\n" +msgid "Demo" msgstr "" -"\n" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:159 +#: en/./index.md:37 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." +"The official demo of FreshRSS is available under [https://demo.freshrss.org/]" +"(https://demo.freshrss.org/)." 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/./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/./developers/03_Backend/05_Extensions.md:163 +#: en/./index.md:44 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." +"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 "" -"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 +#. type: Title ## +#: en/./index.md:45 #, no-wrap -msgid "" -" '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" +msgid "Licence" msgstr "" -" '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:" +#: en/./index.md:47 +msgid "FreshRSS is licensed under the GNU Affero General Public License v3.0." 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: 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/./developers/03_Backend/05_Extensions.md:188 -#, no-wrap +#: en/./internationalization.md:4 msgid "" -" '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" +"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 "" -" '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: Title ## +#: en/./internationalization.md:5 +#, fuzzy, no-wrap +#| msgid "Reader view" +msgid "Overview" +msgstr "La vue lecture" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:210 +#: 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. 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." +"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 " @@ -2331,13 +5542,21 @@ msgstr "" "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 " +#: 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 " @@ -2348,47 +5567,62 @@ msgstr "" "Français sont situés dans `i18n/fr/`. Il existe sept fichiers différents :" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:220 +#: 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/./developers/03_Backend/05_Extensions.md:220 +#: en/./internationalization.md:19 msgid "`conf.php` for configuration" msgstr "`conf.php` pour l’aspect configuration ;" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:220 +#: 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/./developers/03_Backend/05_Extensions.md:220 -msgid "`gen.php` stores what is global to FreshRSS (gen for \"general\")" +#: 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/./developers/03_Backend/05_Extensions.md:220 +#: 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/./developers/03_Backend/05_Extensions.md:220 -msgid "`install.php` contains strings related FreshRSS installation" +#: 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/./developers/03_Backend/05_Extensions.md:220 -msgid "`sub.php` for subscription management (sub for \"subscription\")" +#: 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/./developers/03_Backend/05_Extensions.md:222 +#: en/./internationalization.md:21 msgid "" "This organization makes it possible to avoid a single huge translation file." msgstr "" @@ -2396,22 +5630,44 @@ msgstr "" "traduction." #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:224 +#: 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 table containing the translations. As an example, here’s an extract from " -"`app/i18n/fr/gen.php`:" +"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: Plain text -#: en/./developers/03_Backend/05_Extensions.md:225 -#, no-wrap +#. type: Fenced code block (php) +#: en/./internationalization.md:24 +#, fuzzy, no-wrap +#| msgid "" +#| " [\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 "" " [\n" "\t\t'actualize' => 'Actualiser',\n" @@ -2424,9 +5680,8 @@ msgid "" "\t\t'_' => 'FreshRSS',\n" "\t\t'about' => 'À propos de FreshRSS',\n" "\t),\n" -"];\n" -"\n" -"?>\n" +"\t// ...\n" +");\n" msgstr "" "\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 "" -"

    \n" -"\t\">\n" -"\t\t\n" -"\t\n" -"

    \n" -msgstr "" -"

    \n" -"\t\">\n" -"\t\t\n" -"\t\n" -"

    \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 " +#: 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 (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." +"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 " @@ -2494,3872 +5728,3861 @@ msgstr "" "traduction." #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:259 +#: en/./internationalization.md:45 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." +"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 "" -"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/./internationalization.md:46 #, 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 -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." +msgid "Add support for a new language" msgstr "" -"Nous y voilà ! Nous avons abordé les fonctionnalités les plus utiles de Minz " -"et qui permettent de faire tourner FreshRSS correctement et il est plus que " -"temps d’aborder les extensions en elles-même." #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:267 +#: en/./internationalization.md:49 msgid "" -"An extension allows you to easily add functionality to FreshRSS without " -"having to touch the core of the project directly." +"If you want to add support for a language which isn’t supported by FreshRSS " +"yet, you can run this command:" msgstr "" -"Une extension permet donc d’ajouter des fonctionnalités facilement à " -"FreshRSS sans avoir à toucher au cœur du projet directement." -#. type: Title ### -#: en/./developers/03_Backend/05_Extensions.md:268 +#. type: Fenced code block (sh) +#: en/./internationalization.md:50 #, no-wrap -msgid "Basic files and folders" -msgstr "Les fichiers et répertoires de base" +msgid "make i18n-add-language lang=[your language code]\n" +msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:273 +#: en/./internationalization.md:55 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 " -"is a directory containing a set of mandatory (and optional) files and " -"subdirectories. The convention requires that the main directory name be " -"preceded by an \"x\" to indicate that it is not an extension included by " -"default in FreshRSS." +"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 "" -"La première chose à noter est que **toutes** les extensions **doivent** se " -"situer dans le répertoire `extensions`, à la base de l’arborescence de " -"FreshRSS. Une extension est un répertoire contenant un ensemble de fichiers " -"et sous-répertoires obligatoires ou facultatifs. La convention veut que l’on " -"précède le nom du répertoire principal par un « x » pour indiquer qu’il ne " -"s’agit pas d’une extension incluse par défaut dans FreshRSS." #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:275 +#: en/./internationalization.md:57 msgid "" -"The main directory of an extension must contain at least two **mandatory** " -"files:" +"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 "" -"Le répertoire principal d’une extension doit comporter au moins deux " -"fichiers **obligatoire** :" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:278 -msgid "" -"A `metadata.json` file that contains a description of the extension. This " -"file is written in JSON." +#. type: Title ## +#: en/./internationalization.md:58 +#, no-wrap +msgid "Translate the interface" msgstr "" -"Un fichier `metadata.json` qui contient une description de l’extension. Ce " -"fichier est écrit en JSON ;" - -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:278 -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/./internationalization.md:61 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 " -"should follow our best practice: If you want to write a `HelloWorld` " -"extension, the directory name should be `xExtension-HelloWorld` and the base " -"class name `HelloWorldExtension`." +"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/./developers/03_Backend/05_Extensions.md:284 +#: en/./internationalization.md:63 msgid "" -"In the file `freshrss/extensions/xExtension-HelloWorld/extension.php` you " -"need the structure:" +"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: Plain text -#: en/./developers/03_Backend/05_Extensions.md:284 +#. type: Fenced code block (sh) +#: en/./internationalization.md:64 #, no-wrap -msgid "" -"class HelloWorldExtension extends Minz_Extension {\n" -"\tpublic function init() {\n" -"\t\t// your code here\n" -"\t}\n" -"}\n" +msgid "make i18n-format\n" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:292 +#: en/./internationalization.md:69 msgid "" -"There is an example HelloWorld extension that you can download from [our " -"GitHub repo](https://github.com/FreshRSS/xExtension-HelloWorld)." +"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/./developers/03_Backend/05_Extensions.md:294 +#: en/./internationalization.md:71 msgid "" -"You may also need additional files or subdirectories depending on your needs:" +"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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:300 -msgid "" -"`configure.phtml` is the file containing the form to parameterize your " -"extension" +#. type: Fenced code block (sh) +#: en/./internationalization.md:72 +#, no-wrap +msgid "git grep TODO app/i18n/he\n" msgstr "" -"`configure.phtml` est le fichier contenant le formulaire pour paramétrer " -"votre extension" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:300 -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 " -"more interesting to write a complete theme)" +#. type: Title ## +#: en/./internationalization.md:76 +#, no-wrap +msgid "Acknowledge a false-positive" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:300 -msgid "A `Controllers` directory containing additional controllers" +#. 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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:300 -msgid "An `i18n` directory containing additional translations" +#. 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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:300 +#. type: Plain text +#: en/./internationalization.md:85 msgid "" -"`layout` and` views` directories to define new views or to overwrite the " -"current views" +"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/./developers/03_Backend/05_Extensions.md:302 +#: en/./internationalization.md:89 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 " -"detailed description of it." +"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: Title ### -#: en/./developers/03_Backend/05_Extensions.md:303 +#. type: Fenced code block (sh) +#: en/./internationalization.md:90 #, no-wrap -msgid "The metadata.json file" +msgid "make i18n-add-key key=the.key.to.add value='Your string in English'\n" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:306 +#: en/./internationalization.md:95 msgid "" -"The `metadata.json` file defines your extension through a number of " -"important elements. It must contain a valid JSON array containing the " -"following entries:" +"This adds the key to all the files. It’ll be in English, waiting for other " +"translators." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:313 -msgid "`name`: the name of your extension" -msgstr "`name` : le nom de votre extension ;" +#. 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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:313 +#. 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 "" -"`author`: your name, your e-mail address … but there is no specific format " -"to adopt" +"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 "" -"`author` : votre nom, éventuellement votre adresse mail mais il n’y a pas de " -"format spécifique à adopter ;" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:313 -msgid "`description`: a description of your extension" -msgstr "`description` : une description de votre extension ;" +#. 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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:313 -msgid "`version`: the current version number of the extension" -msgstr "`version` : le numéro de version actuel de l’extension ;" +#. type: Plain text +#: en/./internationalization.md:109 +msgid "The key will simply be removed and added back with the new value." +msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:313 +#. type: Title ## +#: en/./internationalization.md:110 +#, no-wrap +msgid "How to access a translation programmatically" +msgstr "" + +#. type: Plain text +#: en/./internationalization.md:113 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`)" +"To access these translations, you must use the `_t()` function (which is a " +"shortcut for `Minz_Translate::t()`). Code example:" 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: Fenced code block (html) +#: en/./internationalization.md:114 +#, no-wrap msgid "" -"`type`: Defines the type of your extension. There are two types: `system` " -"and` user`. We will study this difference right after." +"

    \n" +"\t\n" +"

    \n" msgstr "" -"`type` : définit le type de votre extension. Il existe deux types : `system` " -"et `user`. Nous étudierons cette différence juste après." #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:315 -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 -#, no-wrap -msgid "Choosing between `system` and `user`" -msgstr "Choisir entre extension « system » ou « user »" +#: 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/./developers/03_Backend/05_Extensions.md:319 +#: en/./internationalization.md:123 msgid "" -"A __user__ extension can be enabled by some users and not by others " -"(typically for user preferences)." +"`_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/./developers/03_Backend/05_Extensions.md:321 -msgid "A __system__ extension in comparison is enabled for every account." +#: en/./internationalization.md:125 +#, no-wrap +msgid "For instance, the English translation for `gen.auth.keep_logged_in` is `Keep me logged in (%s days)`. 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/./developers/03_Backend/05_Extensions.md:322 +#. type: Fenced code block (php) +#: en/./internationalization.md:126 #, no-wrap -msgid "Writing your own extension.php" +msgid "" +"\n" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:327 +#: en/./users/02_First_steps.md:2 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." +"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 "" +"Découvrir un nouveau logiciel n’est pas toujours facile. Si nous avons voulu " +"FreshRSS le plus intuitif possible, vous aurez peut-être besoin d’un coup de " +"main pour le maîtriser." #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:329 -msgid "Your class will benefit from four methods to redefine:" +#: en/./users/02_First_steps.md:4 +msgid "" +"This section will guide you to the pages you need to get started. The order " +"is tailored to newcomers." msgstr "" +"Cette section se propose de vous aider dans la prise en main de l’outil. Il " +"ne s’agit que de liens menant vers les autres pages de la documentation mais " +"ordonnées dans un ordre spécifique aux nouveaux arrivants." -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:334 +#. type: Plain text +#: en/./users/02_First_steps.md:6 +msgid "" +"[After installing the application](../admins/03_Installation.md), the first " +"step is to add some feeds. You have a few options:" +msgstr "" +"[Après l’installation](../../en/admins/03_Installation.md), la première " +"chose à faire est d’ajouter un ou plusieurs sites à suivre. Pour cela " +"plusieurs choix s’offrent à vous :" + +#. type: Bullet: '1. ' +#: en/./users/02_First_steps.md:10 +msgid "[Add a feed manually](04_Subscriptions.md#adding-a-feed)" +msgstr "[Ajouter un flux manuellement](04_Subscriptions.md#ajouter-un-flux)" + +#. type: Bullet: '2. ' +#: en/./users/02_First_steps.md:10 +msgid "[Import an OPML or JSON file](04_Subscriptions.md#import-and-export)" +msgstr "" +"[Importer un fichier OPML ou JSON](04_Subscriptions.md#import-et-export)" + +#. type: Bullet: '3. ' +#: en/./users/02_First_steps.md:10 +msgid "[Use the bookmarklet](04_Subscriptions.md#use-bookmarklet)" +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 "" -"`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." +"Once you have added your feeds to FreshRSS, it is time to read them. There " +"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 :" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:334 +#. type: Bullet: '1. ' +#: en/./users/02_First_steps.md:16 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 normal view](03_Main_view.md#normal-view) enables you to quickly read " +"new articles" msgstr "" +"[La vue normale](03_Main_view.md#la-vue-normale) qui permet de voir et de " +"lire rapidement les nouveaux articles" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:334 +#. type: Bullet: '2. ' +#: en/./users/02_First_steps.md:16 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 global view](03_Main_view.md#global-view) shows you an overview of the " +"status of your feeds in one glance" msgstr "" +"[La vue globale](03_Main_view.md#la-vue-globale) est destinée à vous offrir " +"un panorama de l’état de vos flux" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:334 +#. type: Bullet: '3. ' +#: en/./users/02_First_steps.md:16 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 reader view](03_Main_view.md#reader-view) offers you a comfortable " +"reading experience" msgstr "" +"[La vue lecture](03_Main_view.md#la-vue-lecture) est pensée pour vous offrir " +"un meilleur confort de lecture" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:336 +#: en/./users/02_First_steps.md:18 msgid "" -"In addition, you will have a number of methods directly inherited from " -"`Minz_Extension` that you should not redefine:" +"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 "" +"Bien, vous maitrisez maintenant la vue que vous préférez ? Il est temps de " +"vous offrir un peu plus de confort de lecture. FreshRSS est grandement " +"configurable et c’est à vous de trouver la configuration qui vous conviendra " +"le plus. Voici tout de même quelques pistes pour améliorer votre quotidien " +"sur FreshRSS :" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:340 +#: en/./users/02_First_steps.md:27 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()`." +"[Organize your feeds in categories](04_Subscriptions.md#feed-management)" msgstr "" +"[Rangez vos flux dans des catégories](04_Subscriptions." +"md#organisation_des_flux)" #. 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`)." +#: en/./users/02_First_steps.md:27 +msgid "[Change the home page](05_Configuration.md#changing-the-view)" msgstr "" +"[Configurez votre page d’accueil](05_Configuration.md#personnaliser-la-vue)" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:340 -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` " -"Controller.php` and the name of the " -"`FreshExtension__Controller` class." +#: en/./users/02_First_steps.md:27 +msgid "[Choose the reading options](05_Configuration.md#reading-options)" msgstr "" +"[Configurez vos options de lecture](05_Configuration.md#options-de-lecture)" + +#. type: Bullet: '* ' +#: en/./users/02_First_steps.md:27 +#, 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/./developers/03_Backend/05_Extensions.md:346 -msgid "`registerViews()`" +#: en/./users/02_First_steps.md:27 +#, 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/./developers/03_Backend/05_Extensions.md:346 -msgid "`registerTranslates()`" +#: 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](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" + +#. type: Bullet: '* ' +#: en/./users/02_First_steps.md:27 +msgid "[Access your feeds on a mobile device](06_Mobile_access.md)" +msgstr "[Accédez à vos flux même sur mobile](06_Mobile_access.md)" + +#. type: Bullet: '* ' +#: en/./users/02_First_steps.md:27 +msgid "[Add some extensions](https://github.com/FreshRSS/Extensions)" +msgstr "[Ajoutez quelques extensions](https://github.com/FreshRSS/Extensions)" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:346 -msgid "`registerHook($hook_name, $hook_function)`" +#: en/./users/02_First_steps.md:27 +msgid "[Frequently asked questions](07_Frequently_Asked_Questions.md)" +msgstr "[Foire aux questions](07_Frequently_Asked_Questions.md)" + +#. type: Plain text +#: en/./users/03_Main_view.md:4 +msgid "" +"FreshRSS has three primary viewing modes: Normal, Global, and Reader view." +msgstr "" + +#. type: Title ## +#: en/./users/03_Main_view.md:5 +#, no-wrap +msgid "Normal view" +msgstr "La vue normale" + +#. type: Plain text +#: en/./users/03_Main_view.md:8 +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/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:18 +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 +#, 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 "" +"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: Title ### -#: en/./developers/03_Backend/05_Extensions.md:347 +#. type: Title ## +#: en/./users/03_Main_view.md:29 #, no-wrap -msgid "The \"hooks\" system" -msgstr "Le système « hooks »" +msgid "Global view" +msgstr "La vue globale" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:350 +#: en/./users/03_Main_view.md:32 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." +"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/./developers/03_Backend/05_Extensions.md:351 +#. type: Title ## +#: en/./users/03_Main_view.md:33 #, no-wrap -msgid "" -"class HelloWorldExtension extends Minz_Extension\n" -"{\n" -"\tpublic function init() {\n" -"\t\t$this->registerHook('entry_before_display', array($this, 'renderEntry'));\n" -"\t}\n" -"\tpublic function renderEntry($entry) {\n" -"\t\t$entry->_content('

    Hello World

    ' . $entry->content());\n" -"\t\treturn $entry;\n" -"\t}\n" -"}\n" -msgstr "" +msgid "Reader view" +msgstr "La vue lecture" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:365 -msgid "The following events are available:" +#: en/./users/03_Main_view.md:36 +msgid "" +"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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Plain text +#: en/./users/03_Main_view.md:40 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 doesn’t advertise it in the header " -"can still be automatically supported." +"Read more: * [Refreshing the feeds](./09_refreshing_feeds.md) * [Filter the " +"feeds and search](./10_filter.md)" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Title # +#: en/./users/04_Subscriptions.md:1 +#, no-wrap +msgid "Adding a feed" +msgstr "Ajouter un flux" + +#. type: Bullet: '1. ' +#: en/./users/04_Subscriptions.md:10 msgid "" -"`entry_before_display` (`function($entry) -> Entry | null`): will be " -"executed every time an entry is rendered. The entry itself (instance of " -"FreshRSS\\_Entry) will be passed as parameter." +"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: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Bullet: '2. ' +#: en/./users/04_Subscriptions.md:10 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. " -"The new entry (instance of FreshRSS\\_Entry) will be passed as parameter." +"In FreshRSS, click the \"**+**\" button next to “Subscriptions management”." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 -msgid "" -"`feed_before_actualize` (`function($feed) -> Feed | null`): will be executed " -"when a feed is updated. The feed (instance of FreshRSS\\_Feed) will be " -"passed as parameter." +#. type: Bullet: '3. ' +#: en/./users/04_Subscriptions.md:10 +msgid "Paste the URL in the “Feed URL” field." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Bullet: '4. ' +#: en/./users/04_Subscriptions.md:10 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 " -"FreshRSS\\_Feed) will be passed as parameter." +"(optional): You can select the category for your feed. By default, it will " +"be in “Uncategorized”." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Bullet: '5. ' +#: en/./users/04_Subscriptions.md:10 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" +"(optional): If the subscription requires credentials, you can enter them in " +"the \"HTTP username\" and \"HTTP password\" fields." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 -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. `
  • New entry
  • `)" +#. type: Bullet: '6. ' +#: en/./users/04_Subscriptions.md:10 +msgid "(optional): You can set a timeout for the feed request." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Bullet: '7. ' +#: en/./users/04_Subscriptions.md:10 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. " -"`
  • New entry
  • `)" +"(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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Title ## +#: en/./users/04_Subscriptions.md:11 +#, no-wrap +msgid "Subscription management" +msgstr "Gestion des flux" + +#. type: Plain text +#: en/./users/04_Subscriptions.md:14 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. `
  • New " -"entry
  • `)" +"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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 -msgid "" -"`nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** " -"add documentation" +#. type: Title ## +#: en/./users/04_Subscriptions.md:15 +#, no-wrap +msgid "Category Settings" msgstr "" +#. type: Title ### +#: en/./users/04_Subscriptions.md:17 +#, no-wrap +msgid "Information" +msgstr "Informations" + #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 -msgid "`post_update` (`function(none) -> none`): **TODO** add documentation" +#: en/./users/04_Subscriptions.md:21 +msgid "**Title:** Name of category" msgstr "" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#: en/./users/04_Subscriptions.md:21 msgid "" -"`simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** " -"add documentation" +"**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/./developers/03_Backend/05_Extensions.md:379 -#, no-wrap -msgid "Writing your own configure.phtml" -msgstr "" +#. type: Title ## +#: 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/./developers/03_Backend/05_Extensions.md:382 +#: en/./users/04_Subscriptions.md:25 msgid "" -"When you want to support user configurations for your extension or simply " -"display some information, you have to create the `configure.phtml` file." +"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/./developers/03_Running_tests.md:1 +#. type: Title ## +#: en/./users/04_Subscriptions.md:26 #, no-wrap -msgid "Running tests" +msgid "Feed Settings" msgstr "" #. type: Plain text -#: en/./developers/03_Running_tests.md:4 +#: en/./users/04_Subscriptions.md:29 msgid "" -"FreshRSS is tested with [PHPUnit](https://phpunit.de/). No code should be " -"merged in `edge` if the tests don’t pass." +"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/./developers/03_Running_tests.md:5 +#. type: Title # +#: en/./users/04_Subscriptions.md:30 en/./users/05_Configuration.md:113 #, no-wrap -msgid "Locally" -msgstr "" +msgid "Archival" +msgstr "Archivage" #. type: Plain text -#: en/./developers/03_Running_tests.md:8 +#: en/./users/04_Subscriptions.md:33 msgid "" -"As a developer, you can run the test suite on your PC easily with `make` " -"commands. You can run the test suite with:" +"This section will let you override the default settings for feed archiving " +"and update frequency." msgstr "" -#. type: Plain text -#: en/./developers/03_Running_tests.md:9 -#, fuzzy, no-wrap -#| msgid "$ make stop\n" -msgid "$ make test\n" -msgstr "$ make stop\n" +#. type: Title ### +#: en/./users/04_Subscriptions.md:34 +#, no-wrap +msgid "Login" +msgstr "Identification" #. type: Plain text -#: en/./developers/03_Running_tests.md:14 +#: en/./users/04_Subscriptions.md:37 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 " -"issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues/new) to let " -"maintainers know about the problem." +"Some feeds require a username/password submitted over HTTP. These usually " +"aren’t needed for feeds." msgstr "" -#. type: Plain text -#: en/./developers/03_Running_tests.md:16 -msgid "" -"Then, it executes PHPUnit in a Docker container. If you don’t use Docker, " -"you can run the command directly with:" -msgstr "" +#. type: Title ### +#: en/./users/04_Subscriptions.md:38 +#, no-wrap +msgid "Advanced" +msgstr "Avancé" -#. type: Plain text -#: en/./developers/03_Running_tests.md:17 +#. type: Title #### +#: en/./users/04_Subscriptions.md:40 #, fuzzy, no-wrap -#| msgid "$ make stop\n" -msgid "$ NO_DOCKER=true make test\n" -msgstr "$ make stop\n" +#| 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: Title ## -#: en/./developers/03_Running_tests.md:21 -#, no-wrap -msgid "Travis" +#. type: Plain text +#: 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 "" +"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 "" +"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/./developers/03_Running_tests.md:24 +#: en/./users/04_Subscriptions.md:45 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." +"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/./developers/03_Running_tests.md:25 +#: en/./users/04_Subscriptions.md:47 #, 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)." +#| "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 "" -"Si votre demande est nouvelle, [ouvrez un nouveau ticket de bug](https://" -"github.com/FreshRSS/FreshRSS/issues/new)" - -#. type: Title # -#: en/./developers/04_Frontend/01_View_files.md:1 -#, no-wrap -msgid "The .phtml files" -msgstr "Les fichiers .phtml" - -#. type: Title # -#: en/./developers/04_Frontend/01_View_files.md:5 -#, no-wrap -msgid "Writing a URL" -msgstr "Écrire une URL" - -#. type: Title # -#: en/./developers/04_Frontend/01_View_files.md:9 -#, no-wrap -msgid "Displaying an icon" -msgstr "Afficher une icône" - -#. type: Title # -#: en/./developers/04_Frontend/02_Design.md:1 -#, no-wrap -msgid "Template file" -msgstr "Fichier modèle" - -#. type: Title # -#: en/./developers/04_Frontend/02_Design.md:5 -#, no-wrap -msgid "Writing a new theme" -msgstr "Écrire un nouveau thème" - -#. type: Title # -#: en/./developers/04_Frontend/02_Design.md:9 -#, no-wrap -msgid "Overriding icons" -msgstr "Surcharger les icônes" +"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: Title # -#: en/./developers/04_Pull_requests.md:1 +#. type: Title ##### +#: en/./users/04_Subscriptions.md:48 #, no-wrap -msgid "Opening a pull request" -msgstr "" +msgid "Example: Rue89" +msgstr "Exemple : Rue89" #. type: Plain text -#: en/./developers/04_Pull_requests.md:4 +#: en/./users/04_Subscriptions.md:52 #, fuzzy #| msgid "" -#| "[Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/" -#| "issues)" +#| "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 "" -"So you want to propose a patch to the community? It’s time to open a [pull " -"request](https://github.com/FreshRSS/FreshRSS/pulls)!" +"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 "" -"[Rendez-vous sur le gestionnaire de tickets de bugs](https://github.com/" -"FreshRSS/FreshRSS/issues)" +"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/./developers/04_Pull_requests.md:6 -msgid "" -"When you open a PR, your message will be prefilled with a message based on " -"[a template](https://github.com/FreshRSS/FreshRSS/blob/edge/docs/" -"pull_request_template.md). It contains a checklist to make sure you didn’t " -"forget anything. It is very important to verify you did everything mentioned " -"so documentation is up-to-date, the commit history stays clear and the code " -"is always stable." -msgstr "" +#: en/./users/04_Subscriptions.md:54 +#, no-wrap +msgid "Here we find that the block that encompasses nothing but the content of the article is ```
    ```. 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 ```
    ``` 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 ```
    ```. 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 ```
    ``` et c’est parfait ! Le chemin sera donc ```#article .content```.\n" + +#. 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: Plain text -#: en/./developers/04_Pull_requests.md:8 -msgid "The rest of this document explains specific points." -msgstr "" +#: en/./users/04_Subscriptions.md:58 +#, fuzzy +#| msgid "Example: Rue89" +msgid "Examples:" +msgstr "Exemple : Rue89" + +#. type: Bullet: '* ' +#: en/./users/04_Subscriptions.md:63 +msgid "Rue89: ```#article .content```" +msgstr "Rue89 : ```#article .content```" -#. type: Title ## -#: en/./developers/04_Pull_requests.md:9 -#, no-wrap -msgid "How to rebase your branch on `edge`" -msgstr "" +#. type: Bullet: '* ' +#: en/./users/04_Subscriptions.md:63 +msgid "PCINpact: ```#actu_content```" +msgstr "PCINpact : ```#actu_content```" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:12 -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 " -"do that." -msgstr "" +#. 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/./developers/04_Pull_requests.md:14 -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: Bullet: '* ' +#: en/./users/04_Subscriptions.md:63 +msgid "Phoronix: ```#main .content```" +msgstr "Phoronix : ```#main .content```" -#. type: Title ### -#: en/./developers/04_Pull_requests.md:15 +#. type: Title ##### +#: en/./users/04_Subscriptions.md:64 #, no-wrap -msgid "Rebasing" -msgstr "" - -#. type: Plain text -#: en/./developers/04_Pull_requests.md:18 -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 " -"difficult if you’re not at ease with Git since conflicts are harder to " -"resolve." +msgid "Combining CSS Classes" msgstr "" #. type: Plain text -#: en/./developers/04_Pull_requests.md:20 +#: en/./users/04_Subscriptions.md:67 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 " -"out." -msgstr "" - -#. type: Plain text -#: en/./developers/04_Pull_requests.md:22 -msgid "To rebase a branch:" +"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: Plain text -#: en/./developers/04_Pull_requests.md:23 +#. type: Fenced code block (html) +#: en/./users/04_Subscriptions.md:68 #, 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" +"
    \n" +"

    wanted

    \n" +"

    wanted content

    \n" +"

    unwanted content

    \n" +"

    wanted

    \n" +"

    wanted content

    \n" +"

    wanted

    \n" +"

    unwanted content

    \n" +"

    wanted content

    \n" +"
    \n" msgstr "" #. type: Plain text -#: en/./developers/04_Pull_requests.md:31 +#: en/./users/04_Subscriptions.md:82 msgid "" -"If you feel confident, you can use `git rebase -i edge` to rewrite your " -"history and make it clearer." +"In this case it’s possible to combine multiple CSS selectors with a comma: " +"```#article p.content, #article h2```" msgstr "" -#. type: Title ### -#: en/./developers/04_Pull_requests.md:32 +#. type: Title #### +#: en/./users/04_Subscriptions.md:83 #, fuzzy, no-wrap -#| msgid "Debugging" -msgid "Merging" -msgstr "Déboguer" +#| 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/./developers/04_Pull_requests.md:35 +#: en/./users/04_Subscriptions.md:86 +#, fuzzy +#| msgid "" +#| "Complimentary tools can be used to retrieve full article content, such as:" 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. " -"Don’t worry, we will take care of it before merging your PR back into `edge`." +"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/./developers/04_Pull_requests.md:37 -msgid "To merge `edge`:" +#. 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/./developers/04_Pull_requests.md:38 -#, no-wrap +#: en/./users/04_Subscriptions.md:93 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" +"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/./developers/04_Pull_requests.md:45 +#: en/./users/04_Subscriptions.md:94 #, 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" +#| msgid "Import and export" +msgid "Import / export" +msgstr "Import et export" #. type: Plain text -#: en/./developers/04_Pull_requests.md:48 +#: en/./users/04_Subscriptions.md:97 msgid "" -"It’s important to have proper commit messages in order to facilitate later " -"debugging, so please read the following advice. Commit messages should " -"explain the choices made in the past (the “why?”)" +"See [SQLite export/import]( https://github.com/FreshRSS/FreshRSS/tree/edge/" +"cli) as an alternative." msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:50 -msgid "" -"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.\"" +#. type: Title ## +#: en/./users/04_Subscriptions.md:98 +#, no-wrap +msgid "Export" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/04_Pull_requests.md:52 -msgid "This commit will *add feature X*" +#. type: Bullet: '1. ' +#: en/./users/04_Subscriptions.md:108 +msgid "To export your list of feeds, go to “Subscriptions management”." msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:54 -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 " -"body is the place where you can clarify the context of your patch. For " -"instance, you can explain what you were doing when you identified a bug, or " -"the problem you had before your patch. Providing this information helps " -"other developers understand why a specific choice was made, especially when " -"a patch introduces a bug that is identified months later." +#. type: Bullet: '2. ' +#: en/./users/04_Subscriptions.md:108 +msgid "Click on “Import / export”" msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:56 -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)." +#. type: Bullet: '3. ' +#: en/./users/04_Subscriptions.md:108 +msgid "You can select for your export:" msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:58 -#, fuzzy -#| msgid "" -#| "For further tips, see [here](https://chris.beams.io/posts/git-commit/)." -msgid "" -"You can find more information about commit messages [on this blog post]" -"(https://chris.beams.io/posts/git-commit/)." +#. type: Bullet: ' 1. ' +#: en/./users/04_Subscriptions.md:108 +msgid "the list of feeds" msgstr "" -"Pour d’autres conseils, voir [ici](https://chris.beams.io/posts/git-commit/)." - -#. type: Title ## -#: en/./developers/04_Pull_requests.md:59 -#, 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 -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 " -"appreciate it if you wrote a test that ensures your patch is working." -msgstr "" +#. type: Bullet: ' 2. ' +#: en/./users/04_Subscriptions.md:108 +#, fuzzy +#| msgid "Filtering articles" +msgid "labelled articles" +msgstr "Filtrer les articles" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:64 -msgid "" -"We use [PHPUnit](https://phpunit.de/) version 7.5 ([documentation](https://" -"phpunit.readthedocs.io/en/7.5/))." -msgstr "" +#. type: Bullet: ' 3. ' +#: en/./users/04_Subscriptions.md:108 +#, fuzzy +#| msgid "Filtering articles" +msgid "favourite articles" +msgstr "Filtrer les articles" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:66 +#. type: Bullet: ' 4. ' +#: en/./users/04_Subscriptions.md:108 msgid "" -"You’ll find more information on how to run tests [in this document]" -"(03_Running_tests.md)." +"and finally, you can select feeds you want to export (by default, all feeds " +"are selected)" msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:68 -msgid "" -"Feel free to ask us for assistance. Not everything will be easy to test, so " -"don’t spend too much time on this." +#. type: Bullet: '4. ' +#: en/./users/04_Subscriptions.md:108 +msgid "Click on “export”." msgstr "" #. type: Title ## -#: en/./developers/04_Pull_requests.md:69 -#, fuzzy, no-wrap -#| msgid "Contribute to documentation" -msgid "Why you should write documentation" -msgstr "Contribuer à la documentation" +#: en/./users/04_Subscriptions.md:109 +#, no-wrap +msgid "Import" +msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:72 -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 " -"to their problems. The documentation should not be written “later” or " -"chances are it’ll never be." +#. type: Bullet: '1. ' +#: en/./users/04_Subscriptions.md:114 +msgid "Go to the page “Import / export”." msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:73 +#. type: Bullet: '2. ' +#: en/./users/04_Subscriptions.md:114 msgid "" -"Our documentation can still be improved quite a bit, so you’re very welcome " -"if you want to help." +"Click on “Browse” and select your OPML or archive file on your computer." msgstr "" -#. type: Title # -#: en/./developers/05_Release_new_version.md:1 -#, no-wrap -msgid "Preparing the release" -msgstr "Préparer la sortie" +#. type: Bullet: '3. ' +#: en/./users/04_Subscriptions.md:114 +msgid "Click on “Import”" +msgstr "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:4 +#: en/./users/04_Subscriptions.md:122 +#, no-wrap 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**." +"> **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 "" -"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**." - -#. type: Plain text -#: en/./developers/05_Release_new_version.md:6 -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/./users/04_Subscriptions.md:123 #, no-wrap -msgid "Check the dev status" -msgstr "S’assurer de l’état de dev" +msgid "Use bookmarklet" +msgstr "Utiliser le « bookmarklet »" #. type: Plain text -#: en/./developers/05_Release_new_version.md:10 +#: en/./users/04_Subscriptions.md:126 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 " -"executed before any publication." +"Bookmarklets are little scripts that you can execute to perform various " +"tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds." msgstr "" -"Avant de sortir une nouvelle version de FreshRSS, il faut vous assurer que " -"le code est stable et ne présente pas de bugs majeurs. Idéalement, il " -"faudrait que nos tests soient automatisés et exécutés avant toute " -"publication." +"Les « bookmarklets » sont de petits scripts que vous pouvez exécuter pour " +"effectuer des tâches diverses et variées. FreshRSS offre un signet " +"( « bookmark » ) pour s’abonner aux fils de nouvelles." -#. type: Plain text -#: en/./developers/05_Release_new_version.md:12 -msgid "" -"You must also **make sure that the CHANGELOG file is up to date** with the " -"updates of the version to be released." -msgstr "" -"Il faut aussi **vous assurer que le fichier CHANGELOG est à jour** avec les " -"mises à jour de la version à sortir." +#. type: Bullet: '1. ' +#: en/./users/04_Subscriptions.md:129 +#, fuzzy +#| msgid "Open \"Subscriptions management\"." +msgid "Open “Subscriptions management”." +msgstr "Ouvrez \"Gestion des abonnements\"." -#. type: Title # -#: en/./developers/05_Release_new_version.md:13 -#, no-wrap -msgid "Git process" -msgstr "Processus Git" +#. 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: Plain text -#: en/./developers/05_Release_new_version.md:15 -#, no-wrap +#. 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 "" -"$ git checkout edge\n" -"$ git pull\n" -"$ vim constants.php\n" -"# Update version number x.y.y.z of FRESHRSS_VERSION\n" -"$ git commit -a\n" -"Version x.y.z\n" -"$ git tag -a x.y.z\n" -"Version x.y.z\n" -"$ git push && git push --tags\n" +"Drag the “Subscribe” button to your bookmark toolbar or right click and " +"choose your browser’s “Bookmark link” action." msgstr "" -"$ git checkout edge\n" -"$ git pull\n" -"$ vim constants.php\n" -"# Mettre à jour le numéro de version x.y.z de FRESHRSS_VERSION\n" -"$ git commit -a\n" -"Version x.y.z\n" -"$ git tag -a x.y.z\n" -"Version x.y.z\n" -"$ git push && git push --tags\n" +"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/./developers/05_Release_new_version.md:27 +#: en/./users/05_Configuration.md:2 +#, no-wrap +msgid "Display" +msgstr "Personnaliser la vue" + +#. type: Title ## +#: en/./users/05_Configuration.md:4 #, no-wrap -msgid "Updating `update.freshrss.org`" -msgstr "Mise à jour de update.freshrss.org" +msgid "Language" +msgstr "Langue" #. type: Plain text -#: en/./developers/05_Release_new_version.md:30 -msgid "" -"It’s important to update update.freshrss.org since this is the default " -"service for automatic FreshRSS updates." +#: en/./users/05_Configuration.md:9 +#, 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 " +"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 "" -"Il est important de mettre à jour update.freshrss.org puisqu’il s’agit du " -"service par défaut gérant les mises à jour automatiques de FreshRSS." +"À l’heure actuelle, FreshRSS est disponible en 13 langues. Après validation " +"de ce choix, l’interface sera affichée dans la langue choisie, même si " +"certaines parties de l’interface peuvent ne pas encore avoir été traduites. " +"Si vous voulez aider à la traduction, regardez comment vous pouvez " +"[contribuer au projet](../contributing.md#contribute-to-internationalization-" +"i18n)." #. type: Plain text -#: en/./developers/05_Release_new_version.md:32 +#: 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 "" -"The repository managing the code is located on GitHub: [FreshRSS/update." -"freshrss.org] (https://github.com/FreshRSS/update.freshrss.org/)." +"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 "" +"Il y a des parties de FreshRSS qui ne sont pas traduites et qui n’ont pas " +"vocation à l’être. Pour le moment, les logs visibles dans l’application " +"ainsi que celle générées par le script de mise à jour automatique en font " +"partie." + +#. type: Plain text +#: en/./users/05_Configuration.md:13 +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 "" -"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/./users/05_Configuration.md:39 #, no-wrap -msgid "Writing the update script" -msgstr "Écriture du script de mise à jour" +msgid "Theme" +msgstr "Thème" #. type: Plain text -#: en/./developers/05_Release_new_version.md:36 +#: en/./users/05_Configuration.md:42 +#, fuzzy +#| msgid "" +#| "There’s no accounting for tastes, which is why FreshRSS offers eight " +#| "official themes:" 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." +"There’s no accounting for tastes, which is why FreshRSS offers 13 official " +"themes:" 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." +"Les goûts et les couleurs, ça ne se discute pas. C’est pourquoi FreshRSS " +"propose huit thèmes officiels :" #. type: Plain text -#: en/./developers/05_Release_new_version.md:38 +#: en/./users/05_Configuration.md:58 +#, no-wrap 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 " -"URL from which the FreshRSS package will be downloaded (`PACKAGE_URL`). The " -"URL is in the form of `https://codeload.github.com/FreshRSS/FreshRSS/zip/x.y." -"z`." +"| 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 "" -"Afin d’écrire un nouveau script, il est préférable de copier / coller celui " -"de la dernière version ou de partir de `update_to_dev.php`. La première " -"chose à faire est de définir l’URL à partir de laquelle sera téléchargée le " -"package FreshRSS (`PACKAGE_URL`). L’URL est de la forme `https://codeload." -"github.com/FreshRSS/FreshRSS/zip/x.y.z`." #. type: Plain text -#: en/./developers/05_Release_new_version.md:40 -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/./users/05_Configuration.md:60 msgid "" -"`apply_update()` takes care of saving the directory containing the data, " -"checking its structure, downloading the FreshRSS package, deploying it and " -"cleaning it all up. This function is pre-filled but adjustments can be made " -"if necessary (e.g., reorganization of the `./data` structure). It returns " -"`true` if no problem has occurred or a string indicating a problem;" +"If you can’t find any themes you like, it’s always possible to [create your " +"own](../developers/04_Frontend/02_Design.md)." msgstr "" -"`apply_update()` qui se charge de sauvegarder le répertoire contenant les " -"données, de vérifier sa structure, de télécharger le package FreshRSS, de le " -"déployer et de tout nettoyer. Cette fonction est pré-remplie mais des " -"ajustements peuvent être faits si besoin est (ex. réorganisation de la " -"structure de `./data`). Elle retourne `true` si aucun problème n’est survenu " -"ou une chaîne de caractères indiquant un soucis ;" +"Si aucun de ceux proposés ne convient, il est toujours possible de [créer " +"son propre thème](../developers/04_Frontend/02_Design.md)." -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:46 +#. type: Plain text +#: en/./users/05_Configuration.md:62 msgid "" -"`need_info_update()` returns `true` if the user must intervene during the " -"update or `false` if not;" +"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 "" -"`need_info_update()` retourne `true` si l’utilisateur doit intervenir durant " -"la mise à jour ou `false` sinon ;" +"Pour sélectionner un thème, il suffit de faire défiler les thèmes jusqu’à " +"l’apparition du thème choisi. Après validation, le thème sera appliqué à " +"l’interface." -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:46 +#. type: Title ## +#: en/./users/05_Configuration.md:63 +#, no-wrap +msgid "Content width" +msgstr "Largeur du contenu" + +#. type: Plain text +#: en/./users/05_Configuration.md:66 msgid "" -"`ask_info_update()` displays a form to the user if `need_info_update()` has " -"returned `true`;" +"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 "" -"`ask_info_update()` affiche un formulaire à l’utilisateur si " -"`need_info_update()` a retourné `true` ;" +"Il y en a qui préfère des lignes de texte courtes, d’autres qui préfèrent " +"maximiser l’espace disponible sur l’écran. Pour satisfaire le maximum de " +"personne, il est possible de choisir la largeur du contenu affiché. Il y a " +"quatre réglages disponibles :" #. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:46 -msgid "" -"`save_info_update()` is responsible for saving the information filled out by " -"the user (from the `ask_info_update()` form);" -msgstr "" -"`save_info_update()` est chargée de sauvegarder les informations renseignées " -"par l’utilisateur (issues du formulaire de `ask_info_update()`) ;" +#: 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/./developers/05_Release_new_version.md:46 -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 " -"`Minz_Configuration` object, you will benefit from these improvements)." +#: 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: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:71 +msgid "**No limit** displays the content on 100% of the available space" msgstr "" -"`do_post_update()` est exécutée à la fin de la mise à jour et prend en " -"compte le code de la nouvelle version (ex. si la nouvelle version modifie " -"l’objet `Minz_Configuration`, vous bénéficierez de ces améliorations)." +"**Pas de limite** qui affiche le contenu sur 100% de la place disponible" #. type: Title ## -#: en/./developers/05_Release_new_version.md:47 +#: en/./users/05_Configuration.md:72 #, no-wrap -msgid "Updating the versions file" -msgstr "Mise à jour du fichier de versions" +msgid "Article icons" +msgstr "Icônes d’article" #. type: Plain text -#: en/./developers/05_Release_new_version.md:50 -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 " -"versions are updated to which other versions." -msgstr "" -"Lorsque le script a été écrit et versionné, il est nécessaire de mettre à " -"jour le fichier `./versions.php` qui contient une table de correspondances " -"indiquant quelles versions sont mises à jour vers quelles autres versions." +#: 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/./developers/05_Release_new_version.md:52 -msgid "Here’s an example of a `versions.php` file:" -msgstr "Voici un exemple de fichier `versions.php` :" +#: en/./users/05_Configuration.md:77 +msgid "" +"![Article icons configuration](../img/users/configuration.article.icons.png)" +msgstr "" +"![Configuration des icônes d’article](../img/users/configuration.article." +"icons.png)" #. type: Plain text -#: en/./developers/05_Release_new_version.md:53 -#, no-wrap +#: en/./users/05_Configuration.md:80 msgid "" -" '1.0.0',\n" -"\t'0.8.1' => '1.0.0',\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" -"\t'1.1.4-dev' => 'dev',\n" -");\n" +"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 "" -" '1.0.0',\n" -"\t'0.8.1' => '1.0.0',\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" -"\t'1.1.4-dev' => 'dev',\n" -");\n" +"Chaque article est rendu avec un en-tête (ligne supérieure) et un pied de " +"page (ligne inférieure). Dans cette section, vous pouvez choisir ce qui sera " +"affiché dans ceux-ci." #. type: Plain text -#: en/./developers/05_Release_new_version.md:68 -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 -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 -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 -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/./users/05_Configuration.md:84 msgid "" -"it’s possible to skip several versions at once, provided that the update " -"scripts support it;" +"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 "" -"il est possible de sauter plusieurs versions d’un coup à condition que les " -"scripts de mise à jour le prennent en charge ;" +"Si vous désactivez tous les éléments de la ligne supérieure, vous pourrez " +"toujours les voir, puisqu’il contient le nom du flux et le titre de " +"l’article. Mais si vous faites le même chose pour la ligne inférieure, elle " +"sera vide." -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:74 +#. type: Title ## +#: 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:88 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. " -"As long as the corresponding script does not exist, nothing will happen." +"After automatically updating the feeds, FreshRSS can pop up a notification " +"using the HTML5 notification API." msgstr "" -"il est conseillé d’indiquer la correspondance de la version courante vers sa " -"potentielle future version en précisant que cette version n’existe pas " -"encore. Tant que le script correspondant n’existera pas, rien ne se passera." +"Après la mise à jour automatique des flux, FreshRSS utilise l’API de " +"notification de HTML5 pour avertir de l’arrivée de nouveaux articles." #. type: Plain text -#: en/./developers/05_Release_new_version.md:76 +#: en/./users/05_Configuration.md:90 msgid "" -"It’s **very strongly** recommended to keep this file organized according to " -"version numbers by separating stable and dev versions." +"The duration of this notification can be set. By default, the value is 0." 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." +"Il est possible de régler la durée d’affichage de cette notification. Par " +"défaut, la valeur est 0." #. type: Title ## -#: en/./developers/05_Release_new_version.md:77 +#: en/./users/05_Configuration.md:91 #, no-wrap -msgid "Deployment" -msgstr "Déploiement" +msgid "Show the navigation button" +msgstr "" + +#. type: Plain text +#: 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/./developers/05_Release_new_version.md:80 +#: en/./users/05_Configuration.md:96 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." -"freshrss.org and change the `FRESHRSS_UPDATE_WEBSITE` URL of your FreshRSS " -"instance. Start the update and check that it’s running correctly." +"![navigation button configuration](../img/users/configuration.navigation." +"button.png)" msgstr "" -"Avant de mettre à jour update.freshrss.org, il est préférable de tester avec " -"dev.update.freshrss.org qui correspond à la pré-production. Mettez donc à " -"jour dev.update.freshrss.org et changez l’URL `FRESHRSS_UPDATE_WEBSITE` de " -"votre instance FreshRSS. Lancez la mise à jour et vérifiez que celle-ci se " -"déroule correctement." #. type: Plain text -#: en/./developers/05_Release_new_version.md:82 +#: en/./users/05_Configuration.md:98 msgid "" -"When you’re satisfied, update update.freshrss.org with the new script, test " -"it again, and then move on." +"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 "" -"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 +#: en/./users/05_Configuration.md:99 #, no-wrap -msgid "Updating the FreshRSS services" -msgstr "Mise à jour des services FreshRSS" +msgid "Reading" +msgstr "" + +#. type: Title ## +#: en/./users/05_Configuration.md:101 +#, no-wrap +msgid "Number of articles per page" +msgstr "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:86 -msgid "Two services need to be updated immediately after the update." +#: 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 "" -"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 -msgid "rss.freshrss.org;" -msgstr "rss.freshrss.org ;" +#. type: Title ## +#: en/./users/05_Configuration.md:105 +#, fuzzy, no-wrap +#| msgid "Article icons" +msgid "Articles to display" +msgstr "Icônes d’article" -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:89 -msgid "demo.freshrss.org (public login: `demo` / `demodemo`)." -msgstr "demo.freshrss.org (identifiants publics : `demo` / `demodemo`)." +#. 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/./developers/05_Release_new_version.md:90 +#. type: Title ## +#: en/./users/05_Configuration.md:109 #, no-wrap -msgid "Publicly announce the release" -msgstr "Annoncer publiquement la sortie" +msgid "Use “lazy load” mode to load images" +msgstr "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:93 +#: en/./users/05_Configuration.md:112 msgid "" -"When everything’s working, it’s time to announce the release to the world!" +"This will set images to load as they are viewed. This can save data, but " +"will can cause images to load in later." msgstr "" -"Lorsque tout fonctionne, il est temps d’annoncer la sortie au monde entier !" -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:98 +#. type: Plain text +#: en/./users/05_Configuration.md:118 msgid "" -"on GitHub by creating[a new release](https://github.com/FreshRSS/FreshRSS/" -"releases/new)" +"These are the global options for fetching and retaining articles from feeds. " +"They can be overridden by individual feed’s settings." msgstr "" -"sur GitHub en créant [une nouvelle release](https://github.com/FreshRSS/" -"FreshRSS/releases/new) ;" -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:98 -msgid "" -"on the freshrss.org blog, at least for stable versions (write the article " -"on[FreshRSS/freshrss.org](https://github.com/FreshRSS/freshrss.org))" +#. type: Title ## +#: en/./users/05_Configuration.md:119 +#, no-wrap +msgid "Maintenance" msgstr "" -"sur le blog de freshrss.org au minimum pour les versions stables (écrire " -"l’article sur [FreshRSS/freshrss.org](https://github.com/FreshRSS/freshrss." -"org))." -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:98 -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 -msgid "and on mailing@freshrss.org" -msgstr "et sur mailing@freshrss.org ;" +#. 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/./developers/05_Release_new_version.md:99 +#: en/./users/05_Configuration.md:123 #, no-wrap -msgid "Starting the next development version" -msgstr "Lancer la prochaine version de développement" +msgid "Sharing" +msgstr "Partage" #. type: Plain text -#: en/./developers/05_Release_new_version.md:101 -#, no-wrap +#: en/./users/05_Configuration.md:126 msgid "" -"$ git checkout edge\n" -"$ vim constants.php\n" -"# Update the FRESHRSS_VERSION\n" -"$ vim CHANGELOG.md\n" -"# Prepare the changelog for the next version\n" -"$ git add CHANGELOG.md && git commit && git push\n" +"To make your life easier, you can share articles straight from FreshRSS." msgstr "" -"$ git checkout edge\n" -"$ vim constants.php\n" -"# Mettre à jour le numéro de version de FRESHRSS_VERSION\n" -"$ vim CHANGELOG.md\n" -"# Préparer la section pour la prochaine version\n" -"$ git add CHANGELOG.md && git commit && git push\n" +"Pour vous faciliter la vie, vous pouvez partager des articles directement " +"via FreshRSS." #. type: Plain text -#: en/./developers/05_Release_new_version.md:110 +#: en/./users/05_Configuration.md:128 msgid "" -"Also remember to update update.freshrss.org so that it takes the current " -"development version into account." +"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 "" -"Pensez aussi à mettre à jour update.freshrss.org pour qu’il prenne en compte " -"la version de développement actuelle." #. type: Plain text -#: en/./index.md:2 -msgid "![FreshRSS logo](img/logo_freshrss.png)" -msgstr "![Logo de FreshRSS](img/logo_freshrss.png)" +#: 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/./index.md:4 +#: en/./users/05_Configuration.md:133 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." +"To add a new item to the list, please follow the following simple steps:" msgstr "" -"FreshRSS est un agrégateur et lecteur de flux RSS. Il permet de regrouper " -"l’actualité de plusieurs sites différents dans un endroit unique pour que " -"vous puissiez la lire sans devoir aller de site en site." +"Pour ajouter un nouvel élément à la liste, veuillez suivre les étapes " +"simples ci-dessous :" -#. type: Plain text -#: en/./index.md:6 -msgid "FreshRSS has a lot of features including:" +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:138 +msgid "Select the desired sharing method in the drop-down list." msgstr "" -"FreshRSS a été conçu comme un agrégateur puissant et propose des tas de " -"fonctionnalités :" -#. type: Bullet: '* ' -#: en/./index.md:18 -msgid "RSS and Atom aggregation" -msgstr "Agrégation des flux RSS et Atom." +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:138 +msgid "Press the ```✚``` button to add it to the list." +msgstr "" -#. type: Bullet: '* ' -#: en/./index.md:18 +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:138 msgid "" -"Mark article as favorite if you liked it or if you want to read it later" +"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 "" -"Utilisez les favoris pour marquer les articles qui vous ont plu ou que vous " -"souhaitez lire plus tard." -#. type: Bullet: '* ' -#: en/./index.md:18 -msgid "Filter and search functionality helps to easily find articles" +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:138 en/./users/05_Configuration.md:143 +msgid "Submit your changes." 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 -msgid "" -"Statistics to show you the publishing frequency all the websites you follow" +#. type: Plain text +#: en/./users/05_Configuration.md:140 +msgid "To remove an item from the list, follow those simple steps:" msgstr "" -"Les statistiques permettent de savoir en un coup d’œil quels sont les sites " -"qui publient le plus, ou à l’inverse, le moins." - -#. type: Bullet: '* ' -#: en/./index.md:18 -msgid "Import/export of your feeds into OPML format" -msgstr "Importation / exportation des flux au format OPML." -#. type: Bullet: '* ' -#: en/./index.md:18 -msgid "Several themes created by the community" -msgstr "Multi-thèmes pour changer l’habillage de FreshRSS." +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:143 +msgid "Press the ```❌``` button next to the share method you want to remove." +msgstr "" -#. type: Bullet: '* ' -#: en/./index.md:18 -msgid "\"Google Reader\"-like API to connect Android applications" -msgstr "API Google Reader pour pouvoir y brancher des applications Android." +#. type: Title # +#: en/./users/05_Configuration.md:145 +#, no-wrap +msgid "Shortcuts" +msgstr "Raccourcis" -#. type: Bullet: '* ' -#: en/./index.md:18 +#. type: Plain text +#: en/./users/05_Configuration.md:149 msgid "" -"The application is \"responsive,\" which means it adapts to small screens so " -"you can bring articles in your pocket" +"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 "" -"« *Responsive design* » : l’application s’adapte aux petits écrans pour " -"emporter FreshRSS dans votre poche." -#. type: Bullet: '* ' -#: en/./index.md:18 +#. type: Plain text +#: en/./users/05_Configuration.md:151 msgid "" -"Self-hosted: the code is free (under AGPL3 licence), so you can host your " -"own instance of FreshRSS" -msgstr "" -"Auto-hébergeable : le code source est libre (AGPL3) et vous pouvez donc " -"l’héberger sur votre propre serveur." - -#. type: Bullet: '* ' -#: en/./index.md:18 -msgid "Multi-user, so you can also host for your friends and family" +"Of course, if you’re not satisfied with the key mapping, you can change you " +"configuration to fit your needs." msgstr "" -"Multi-utilisateurs pour héberger plusieurs personnes sur une même " -"installation." - -#. type: Bullet: '* ' -#: en/./index.md:18 -msgid "And a lot more!" -msgstr "Et bien d’autres !" #. type: Plain text -#: en/./index.md:20 -msgid "This documentation is split into different sections:" -msgstr "Cette documentation est divisée en plusieurs parties :" +#: en/./users/05_Configuration.md:153 +msgid "There are 4 types of shortcuts:" +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" +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:158 +msgid "Views: they allow switching views with ease." msgstr "" -"La [documentation utilisateurs](./users/02_First_steps.md) pour découvrir " -"les fonctionnalités de FreshRSS." -#. type: Bullet: '* ' -#: en/./index.md:24 +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:158 msgid "" -"[Administrator documentation](./admins/01_Index.html) for detailed " -"installation and maintenance related tasks" +"Navigation: they allow navigation through articles, feeds, and categories." 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 +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:158 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" +"Article actions: they allow interactions with an article, like sharing or " +"opening it on the original web-site." 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 +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:158 msgid "" -"[Contributor guidelines](./contributing.md) for those who want to help " -"improve FreshRSS" +"Other actions: they allow other interactions with the application, like " +"opening the user queries menu or accessing the documentation." msgstr "" -"Le [guide de contribution](./contributing.md) pour nous aider à développer " -"FreshRSS." #. type: Plain text -#: en/./users/02_First_steps.md:2 +#: en/./users/05_Configuration.md:161 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." +"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 "" -"Découvrir un nouveau logiciel n’est pas toujours facile. Si nous avons voulu " -"FreshRSS le plus intuitif possible, vous aurez peut-être besoin d’un coup de " -"main pour le maîtriser." #. type: Plain text -#: en/./users/02_First_steps.md:4 -msgid "" -"This section will guide you to the pages you need to get started. The order " -"is tailored to newcomers." +#: en/./users/05_Configuration.md:163 +msgid "The same process applies to the user queries." msgstr "" -"Cette section se propose de vous aider dans la prise en main de l’outil. Il " -"ne s’agit que de liens menant vers les autres pages de la documentation mais " -"ordonnées dans un ordre spécifique aux nouveaux arrivants." #. type: Plain text -#: en/./users/02_First_steps.md:6 +#: en/./users/05_Configuration.md:166 msgid "" -"[After installing the application](../admins/03_Installation.md), the first " -"step is to add some feeds. You have a few options:" +"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 "" -"[Après l’installation](../../en/admins/03_Installation.md), la première " -"chose à faire est d’ajouter un ou plusieurs sites à suivre. Pour cela " -"plusieurs choix s’offrent à vous :" - -#. type: Bullet: '1. ' -#: en/./users/02_First_steps.md:10 -msgid "[Add a feed manually](04_Subscriptions.md#adding-a-feed)" -msgstr "[Ajouter un flux manuellement](04_Subscriptions.md#ajouter-un-flux)" -#. type: Bullet: '2. ' -#: en/./users/02_First_steps.md:10 -msgid "[Import an OPML or JSON file](04_Subscriptions.md#import-and-export)" +#. type: Title # +#: en/./users/05_Configuration.md:167 +#, no-wrap +msgid "User queries" msgstr "" -"[Importer un fichier OPML ou JSON](04_Subscriptions.md#import-et-export)" - -#. type: Bullet: '3. ' -#: en/./users/02_First_steps.md:10 -msgid "[Use the bookmarklet](04_Subscriptions.md#use-bookmarklet)" -msgstr "[Utiliser le bookmark dédié](04_Subscriptions.md#utiliser-le-bookmark)" #. type: Plain text -#: en/./users/02_First_steps.md:12 +#: en/./users/05_Configuration.md:171 msgid "" -"Once you have added your feeds to FreshRSS, it is time to read them. There " -"are three availalbe reading modes:" +"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 "" -"Une fois que vous avez ajouté vos flux à FreshRSS, il est temps de les lire. " -"Pour cela, trois modes de lecture s’offrent à vous :" -#. type: Bullet: '1. ' -#: en/./users/02_First_steps.md:16 -msgid "" -"[The normal view](03_Main_view.md#normal-view) enables you to quickly read " -"new articles" +#. type: Plain text +#: en/./users/05_Configuration.md:173 +msgid "At the moment, there is no helper to build a user query from here." msgstr "" -"[La vue normale](03_Main_view.md#la-vue-normale) qui permet de voir et de " -"lire rapidement les nouveaux articles" -#. type: Bullet: '2. ' -#: en/./users/02_First_steps.md:16 -msgid "" -"[The global view](03_Main_view.md#global-view) shows you an overview of the " -"status of your feeds in one glance" +#. type: Title # +#: en/./users/05_Configuration.md:174 +#, no-wrap +msgid "Profile" msgstr "" -"[La vue globale](03_Main_view.md#la-vue-globale) est destinée à vous offrir " -"un panorama de l’état de vos flux" -#. type: Bullet: '3. ' -#: en/./users/02_First_steps.md:16 +#. type: Plain text +#: en/./users/05_Configuration.md:177 msgid "" -"[The reader view](03_Main_view.md#reader-view) offers you a comfortable " -"reading experience" +"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 "" -"[La vue lecture](03_Main_view.md#la-vue-lecture) est pensée pour vous offrir " -"un meilleur confort de lecture" #. type: Plain text -#: en/./users/02_First_steps.md:18 +#: en/./users/05_Configuration.md:181 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:" +"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 "" -"Bien, vous maitrisez maintenant la vue que vous préférez ? Il est temps de " -"vous offrir un peu plus de confort de lecture. FreshRSS est grandement " -"configurable et c’est à vous de trouver la configuration qui vous conviendra " -"le plus. Voici tout de même quelques pistes pour améliorer votre quotidien " -"sur FreshRSS :" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "" -"[Organize your feeds in categories](04_Subscriptions.md#feed-management)" +#. type: Title # +#: en/./users/05_Configuration.md:182 +#, no-wrap +msgid "Users" msgstr "" -"[Rangez vos flux dans des catégories](04_Subscriptions." -"md#organisation_des_flux)" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Change the home page](05_Configuration.md#changing-the-view)" +#. type: Title ## +#: en/./users/05_Configuration.md:186 +#, no-wrap +msgid "Authentication methods" msgstr "" -"[Configurez votre page d’accueil](05_Configuration.md#personnaliser-la-vue)" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Choose the reading options](05_Configuration.md#reading-options)" +#. type: Title ### +#: en/./users/05_Configuration.md:188 +#, no-wrap +msgid "HTTP Authentication (Apache)" msgstr "" -"[Configurez vos options de lecture](05_Configuration.md#options-de-lecture)" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Refresh feeds](03_Main_view.md#refreshing-feeds)" -msgstr "[Mettez à jour vos flux](03_Main_view.md#rafraichir-les-flux)" +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:194 +msgid "User control is based on the `.htaccess` file." +msgstr "" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 +#. type: Bullet: '2. ' +#: en/./users/05_Configuration.md:194 msgid "" -"[Filter articles](03_Main_view.md#filtering-articles) for a fast access to a " -"selection" +"It is best practice to place the `.htaccess` file in the `./i/` subdirectory " +"so the API and other third party services can work." 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 +#. type: Bullet: '3. ' +#: en/./users/05_Configuration.md:194 msgid "" -"[search for an article](03_Main_view.md#with-the-search-field) published some time " -"ago" +"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 "" -"[Retrouvez un article](03_Main_view.md#rechercher-des-articles) qui a été " -"publié il y a quelques jours ou mois" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Access your feeds on a mobile device](06_Mobile_access.md)" -msgstr "[Accédez à vos flux même sur mobile](06_Mobile_access.md)" +#. type: Bullet: '4. ' +#: en/./users/05_Configuration.md:194 +msgid "Example `.htaccess` file for a user \"marie\":" +msgstr "" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Add some extensions](https://github.com/FreshRSS/Extensions)" -msgstr "[Ajoutez quelques extensions](https://github.com/FreshRSS/Extensions)" +#. type: Fenced code block (apache) +#: en/./users/05_Configuration.md:195 +#, no-wrap +msgid "" +"AuthUserFile /home/marie/repertoire/.htpasswd\n" +"AuthGroupFile /dev/null\n" +"AuthName \"Chez Marie\"\n" +"AuthType Basic\n" +"Require user marie\n" +msgstr "" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Frequently asked questions](07_Frequently_Asked_Questions.md)" -msgstr "[Foire aux questions](07_Frequently_Asked_Questions.md)" +#. type: Plain text +#: 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)." +msgstr "" +"Plus d’informations dans [la documentation d’Apache.](http://httpd.apache." +"org/docs/trunk/howto/auth.html#gettingitworking)" -#. type: Title # -#: en/./users/03_Main_view.md:1 -#, no-wrap -msgid "Normal view" -msgstr "La vue normale" +#. type: Plain text +#: en/./users/06_Mobile_access.md:2 +#, fuzzy +#| msgid "" +#| "This page assumes you have completed the [server setup](../" +#| "admins/02_Installation.md)." +msgid "" +"This page assumes you have completed the [server setup](../" +"admins/03_Installation.md)." +msgstr "" +"Cette page suppose que vous ayez fini [l’installation du serveur]" +"(01_Installation.md)." #. type: Title # -#: en/./users/03_Main_view.md:5 +#: en/./users/06_Mobile_access.md:3 #, no-wrap -msgid "Global view" -msgstr "La vue globale" +msgid "Mobile Access" +msgstr "" -#. type: Title # -#: en/./users/03_Main_view.md:9 -#, no-wrap -msgid "Reader view" -msgstr "La vue lecture" +#. type: Plain text +#: en/./users/06_Mobile_access.md:6 +msgid "" +"You can access FreshRSS on mobile devices via browser and via mobile apps." +msgstr "" -#. type: Title # -#: en/./users/03_Main_view.md:13 +#. type: Title ## +#: en/./users/06_Mobile_access.md:8 #, no-wrap -msgid "Refreshing feeds" -msgstr "Rafraîchir les flux" +msgid "Access via Browser" +msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:16 +#: en/./users/06_Mobile_access.md:11 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." +"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 "" -"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/06_Mobile_access.md:13 #, no-wrap -msgid "Automatic update" -msgstr "Mise à jour automatique" +msgid "Access via Mobile App" +msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:20 +#: en/./users/06_Mobile_access.md:16 msgid "" -"This is the recommended method since you can forget about it once it is " -"configured." +"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 +msgid "" +"A list of known apps is available on the [FreshRSS GitHub page](https://" +"github.com/FreshRSS/FreshRSS#apis--native-apps)." 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 +#: en/./users/06_Mobile_access.md:20 #, no-wrap -msgid "With the actualize_script.php script" -msgstr "Par le script actualize_script.php" +msgid "Enable the API in FreshRSS" +msgstr "Activer l’API dans FreshRSS" -#. type: Plain text -#: en/./users/03_Main_view.md:24 +#. type: Bullet: '1. ' +#: en/./users/06_Mobile_access.md:26 msgid "" -"This method is only available if you have access to the scheduled tasks of " -"the machine on which your FreshRSS instance is installed." +"Under the section “Authentication”, enable the option “Allow API access " +"(required for mobile apps)”." 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." +"Dans la section “Authentification”, cocher l’option “Autoriser l’accès par " +"API (nécessaire pour les applis mobiles)”." -#. type: Plain text -#: en/./users/03_Main_view.md:26 +#. 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 "" -"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." +"Under the section “Profile”, fill-in the field “API password (e.g., for " +"mobile apps)”." 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." +"Dans la section “Authentification”, cocher l’option “Autoriser l’accès par " +"API (nécessaire pour les applis mobiles)”." -#. type: Plain text -#: en/./users/03_Main_view.md:28 -msgid "Here is an example to trigger article update every hour." +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:26 +msgid "Every user must define an API password." 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: 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/03_Main_view.md:29 +#: 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 "" +"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 "" +"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:31 #, 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" +msgid "Testing" +msgstr "Tester" -#. type: Plain text -#: en/./users/03_Main_view.md:34 +#. type: Bullet: '1. ' +#: en/./users/06_Mobile_access.md:38 msgid "" -"Special parameters to configure the script - all parameters can be combined:" +"Under the section “Profile”, click on the link like `https://rss.example.net/" +"api/` next to the field “API password”." msgstr "" -"« Paramètres de configuration du script; Ils sont utilisables " -"simultanément : »" +"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/03_Main_view.md:38 -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." +#. type: Bullet: '2. ' +#: en/./users/06_Mobile_access.md:38 +msgid "Click on first link “Check full server configuration”:" 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\"" +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:38 +msgid "If you get *PASS* then you are done; all is well." msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:46 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:38 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 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: Plain text -#: en/./users/03_Main_view.md:50 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:38 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" -"\"." +"If you receive any other error message, see the next section “Fix server " +"configuration”." msgstr "" #. type: Title ### -#: en/./users/03_Main_view.md:51 +#: en/./users/06_Mobile_access.md:39 #, no-wrap -msgid "Online cron" -msgstr "" +msgid "Fix server configuration" +msgstr "Déboguer la configuration du serveur" -#. type: Plain text -#: en/./users/03_Main_view.md:54 +#. type: Bullet: '* ' +#: en/./users/06_Mobile_access.md:57 msgid "" -"If you do not have access to the installation server scheduled task, you can " -"still automate the update process." +"Click on the second link “Check partial server configuration (without `%2F` " +"support)”:" msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:56 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 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." +"If you get `PASS`, then the problem is indeed that your server does not " +"accept slashes `/` that are escaped `%2F`." msgstr "" -#. type: Title #### -#: en/./users/03_Main_view.md:57 -#, no-wrap -msgid "No authentication" -msgstr "Aucune authentification" - -#. type: Plain text -#: en/./users/03_Main_view.md:60 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 msgid "" -"This is the most straightforward since you have a public instance; there is " -"nothing special to configure:" +"With Apache, remember the directive [`AllowEncodedSlashes On`](http://httpd." +"apache.org/docs/trunk/mod/core.html#allowencodedslashes)" 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: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +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/03_Main_view.md:68 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 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 get *Service Unavailable!*, then check the preceding section “Enable " +"the API in FreshRSS” again." 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: ' * ' +#: en/./users/06_Mobile_access.md:57 +msgid "With __Apache__:" 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: ' * ' +#: en/./users/06_Mobile_access.md:57 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." +"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 "" -"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 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 msgid "" -"You can also configure an authentication token to grant special access on " -"the server." +"Turn on Apache `mod_setenvif` (often enabled by default), or `mod_rewrite` " +"with the following procedure:" 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 -#, 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" -#. type: Plain text -#: en/./users/03_Main_view.md:84 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 msgid "" -"You can also target a different user by adding their username to the query " -"string, with `&user=insert-username`:" +"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: Plain text -#: en/./users/03_Main_view.md:85 -#, 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" - -#. type: Title ### -#: en/./users/03_Main_view.md:89 -#, no-wrap -msgid "HTTP authentication" -msgstr "Authentification HTTP" - -#. type: Plain text -#: en/./users/03_Main_view.md:92 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 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!**" +"Enable [`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite." +"html):" 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: Title ## -#: en/./users/03_Main_view.md:97 -#, no-wrap -msgid "Manual update" -msgstr "Mise à jour manuelle" +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +msgid "With Debian / Ubuntu: `sudo a2enmod rewrite`" +msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:100 -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." +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +msgid "With __nginx__:" 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 -#, no-wrap -msgid "Complete update" -msgstr "Mise à jour complète" +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +msgid "If you get *Bad Request!*, check your server `PATH_INFO` configuration." +msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:104 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 msgid "" -"This update occurs on all feeds. To trigger it, simply click on the update " -"link in the navigation menu." +"If you get *File not found!*, check your server `fastcgi_split_path_info`." 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: Plain text -#: en/./users/03_Main_view.md:108 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 msgid "" -"When the update starts, a progress bar appears and changes while feeds are " -"processed." +"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 "" -"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 -#, no-wrap -msgid "Partial update" -msgstr "Mise à jour partielle" -#. type: Plain text -#: en/./users/03_Main_view.md:114 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 msgid "" -"This update occurs on the selected feed only. To trigger it, simply click on " -"the update link in the feed menu." +"The easiest is to add the GMP extension. On Debian / Ubuntu: `sudo apt " +"install php-gmp`" 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 -#, no-wrap -msgid "Filtering articles" -msgstr "Filtrer les articles" +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +msgid "Update and try again from the preceding section “Testing”." +msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:120 +#: en/./users/07_Frequently_Asked_Questions.md:2 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." +"We may not have answered all of your questions in the previous sections. The " +"FAQ contains some questions that have not been answered elsewhere." 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." +"Il est possible que nous n’ayons pas répondu à toutes vos questions dans les " +"parties précédentes. La FAQ regroupe certaines interrogations qui n’ont pas " +"trouvé leur réponse ailleurs." #. type: Title ## -#: en/./users/03_Main_view.md:121 +#: en/./users/07_Frequently_Asked_Questions.md:3 #, no-wrap -msgid "By category" -msgstr "Par catégorie" +msgid "What is `/i` at the end of the application URL?" +msgstr "C’est quoi ce `/i` à la fin de l’URL ?" #. type: Plain text -#: en/./users/03_Main_view.md:124 +#: en/./users/07_Frequently_Asked_Questions.md:6 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:" +"Of course, ```/i``` has a purpose! It’s used for performance and usability:" 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 :" +"Bien entendu, le ```/i``` n’est pas là pour faire joli ! Il s’agit d’une " +"question de performances et de praticité :" -#. type: Bullet: ' * ' -#: en/./users/03_Main_view.md:127 +#. type: Bullet: '* ' +#: en/./users/07_Frequently_Asked_Questions.md:11 msgid "" -"*Main feed* displays only articles from feeds marked as available in that " -"category" +"It allows for serving icons, images, styles and scripts without cookies. " +"Without that trick, those files would be downloaded more often, especially " +"when form authentication is used. Also, HTTP requests would be heavier." msgstr "" -"*Flux principal* qui affiche uniquement les articles des flux marqués comme " -"visible dans cette catégorie" +"Cela permet de servir les icônes, images, styles, scripts sans cookie. Sans " +"cela, ces fichiers seraient souvent re-téléchargés, en particulier lorsque " +"le formulaire de connexion est utilisé. De plus, les requêtes vers ces " +"ressources seraient plus lourdes." -#. type: Bullet: ' * ' -#: en/./users/03_Main_view.md:127 -msgid "*Favourites* displays only articles marked as favourites" +#. type: Bullet: '* ' +#: en/./users/07_Frequently_Asked_Questions.md:11 +msgid "" +"The ```./p/``` public root can be served without any HTTP access " +"restrictions. Whereas it could be implemented in ```./p/i/```." msgstr "" -"*Favoris* qui affiche uniquement les articles, tous flux confondus, marqués " -"comme favoris" - -#. type: Title ## -#: en/./users/03_Main_view.md:128 -#, no-wrap -msgid "By feed" -msgstr "Par flux" - -#. 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: 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: 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/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/03_Main_view.md:136 -msgid "by filtering in the feed configuration" -msgstr "en filtrant dans la configuration du flux" - -#. 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: Title ## -#: en/./users/03_Main_view.md:139 -#, no-wrap -msgid "By status" -msgstr "Par statut" +"La racine publique ```./p/``` peut être servie sans restriction d’accès HTTP " +"(qui peut avantageusement être mise en place dans ```./p/i/```)." -#. type: Plain text -#: en/./users/03_Main_view.md:142 +#. type: Bullet: '* ' +#: en/./users/07_Frequently_Asked_Questions.md:11 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." +"It avoids problems while serving public resources like ```favicon.ico```, " +"```robots.txt```, etc." 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." +"Cela permet d’éviter des problèmes pour des fichiers qui doivent être " +"publics pour bien fonctionner, comme ```favicon.ico```, ```robots.txt```, " +"etc." -#. type: Plain text -#: en/./users/03_Main_view.md:144 +#. type: Bullet: '* ' +#: en/./users/07_Frequently_Asked_Questions.md:11 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." +"It allows the logo to be displayed instead of a white page while hitting a " +"restriction or a delay during the loading process." 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." +"Cela permet aussi d’avoir un logo FreshRSS plutôt qu’une page blanche pour " +"accueillir l’utilisateur par exemple dans le cas de la restriction d’accès " +"HTTP ou lors de l’attente du chargement plus lourd du reste de l’interface." -#. type: Plain text -#: en/./users/03_Main_view.md:146 -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: Title ## +#: en/./users/07_Frequently_Asked_Questions.md:12 +#, no-wrap +msgid "Why is `robots.txt` located in a sub-folder?" +msgstr "Pourquoi le ```robots.txt``` se trouve dans un sous-répertoire ?" #. type: Plain text -#: en/./users/03_Main_view.md:148 -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." +#: en/./users/07_Frequently_Asked_Questions.md:15 +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 " +"else). Therefore the `robots.txt` file is located in the `./p` sub-folder." msgstr "" +"Afin d’améliorer la sécurité, FreshRSS est découpé en deux parties : une " +"partie publique (le répertoire ```./p```) et une partie privée (tout le " +"reste !). Le ```robots.txt``` se trouve donc dans le sous-répertoire ```./" +"p```." #. type: Plain text -#: en/./users/03_Main_view.md:150 -msgid "![Attribute filters in 0.8](../img/users/status.filter.0.8.png)" +#: 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 " +", 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 " +"sous-répertoire afin que seule la partie publique ne soit accessible par un " +"navigateur web. De cette manière https://demo.freshrss.org/ pointe vers le " +"répertoire ```./p``` et le ```robots.txt``` se trouve bien à la racine du " +"site : https://demo.freshrss.org/robots.txt." #. type: Plain text -#: en/./users/03_Main_view.md:152 -msgid "By default, this filter displays only unread articles" +#: 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/03_Main_view.md:153 +#: en/./users/07_Frequently_Asked_Questions.md:21 #, no-wrap -msgid "By content" -msgstr "" +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/03_Main_view.md:156 +#: en/./users/07_Frequently_Asked_Questions.md:27 msgid "" -"It is possible to filter articles by their content by inputting a string in " -"the search field." +"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 " +"can be the root of the problem, or FreshRSS can be buggy. The first step is " +"to identify what causes the problem. Here are the steps to follow:" msgstr "" +"Il peut y avoir différentes origines à ce problème. Le flux peut avoir une " +"syntaxe invalide, il peut ne pas être reconnu par la bibliothèque SimplePie, " +"l’hébergement peut avoir des problèmes, FreshRSS peut être boggué. Il faut " +"dans un premier temps déterminer la cause du problème.Voici la liste des " +"étapes à suivre pour la déterminer :" -#. type: Title ## -#: en/./users/03_Main_view.md:157 -#, no-wrap -msgid "With the search field" -msgstr "Grâce au champ de recherche" - -#. 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/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, " +"there’s nothing we can do." 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: '* ' -#: 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: '* ' -#: 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: '* ' -#: en/./users/03_Main_view.md:199 -msgid "by tag: `#tag`" -msgstr "par tag: `#tag`" - -#. 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é'`" +"__Vérifier la validité du flux__ grâce à l’[outil en ligne du W3C](https://" +"validator.w3.org/feed/ \"Validateur en ligne de flux RSS et Atom\"). Si ça " +"ne fonctionne pas, nous ne pouvons rien faire." -#. 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:`\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:`\n" -msgstr "" - -#. type: Plain text -#: en/./users/03_Main_view.md:201 +#. type: Bullet: '1. ' +#: en/./users/07_Frequently_Asked_Questions.md:31 msgid "" -"Be careful not to enter a space between the operator and the search value." +"__Verify SimplePie validation__ with the [SimplePie on-line tool](https://" +"simplepie.org/demo/ \"SimplePie official demo\"). If it’s not recognized, " +"there’s nothing we can do." msgstr "" -"Attention à ne pas introduire d’espace entre l’opérateur et la valeur " -"recherchée." +"__Vérifier la reconnaissance par SimplePie__ grâce à l’[outil en ligne de " +"SimplePie](https://simplepie.org/demo/ \"Démo officielle de SimplePie\"). Si " +"ça ne fonctionne pas, nous ne pouvons rien faire." -#. type: Plain text -#: en/./users/03_Main_view.md:204 +#. type: Bullet: '1. ' +#: en/./users/07_Frequently_Asked_Questions.md:31 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`." +"__Verify FreshRSS integration__ with the [demo](https://demo.freshrss.org " +"\"FreshRSS official demo\"). If it’s not working, you need to [create an " +"issue on Github](https://github.com/FreshRSS/FreshRSS/issues/new \"Create an " +"issue for FreshRSS\") so we can have a look at it. If it’s working, there’s " +"probably something fishy with the hosting server." 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`." +"__Vérifier l’intégration dans FreshRSS__ grâce à la [démo](https://demo." +"freshrss.org \"Démo officielle de FreshRSS\"). Si ça ne fonctionne pas, il " +"faut [créer un ticket sur Github](https://github.com/FreshRSS/FreshRSS/" +"issues/new \"Créer un ticket pour FreshRSS\") pour que l’on puisse regarder " +"ce qui se passe. Si ça fonctionne, il y a probablement un problème avec " +"l’hébergement." + +#. type: Title ## +#: 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/03_Main_view.md:206 +#: en/./users/07_Frequently_Asked_Questions.md:36 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." +"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 " +"interface is available under ```Administration → Manage users```. Select a " +"user, enter a password, and validate." 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." +"Depuis la version [1.10.0](https://github.com/FreshRSS/FreshRSS/releases/" +"tag/1.10.0), l’administrateur peut modifier le mot de passe d’un utilisateur " +"depuis l’interface. Cette interface est disponible dans le menu " +"```Administration → Gestion des utilisateurs```. Il suffit de sélectionner " +"l’utilisateur, de saisir un mot de passe et de valider." #. type: Plain text -#: en/./users/03_Main_view.md:208 +#: en/./users/07_Frequently_Asked_Questions.md:38 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`" +"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 " +"mentioning that you must have access to PHP CLI. Open a terminal, and type " +"the following command:" 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: Title # -#: en/./users/04_Subscriptions.md:5 -#, no-wrap -msgid "Import and export" -msgstr "Import et export" +"Depuis la version [1.8.0](https://github.com/FreshRSS/FreshRSS/releases/" +"tag/1.8.0), l’administrateur peut modifier le mot de passe d’un utilisateur " +"depuis un terminal. Il est bon de noter que celui-ci doit avoir un accès à " +"PHP en ligne de commande. Pour cela, il suffit d’ouvrir son terminal et de " +"saisir la commande suivante :" -#. type: Title # -#: en/./users/04_Subscriptions.md:9 +#. type: Fenced code block (sh) +#: en/./users/07_Frequently_Asked_Questions.md:39 #, no-wrap -msgid "Use bookmarklet" -msgstr "Utiliser le « bookmarklet »" +msgid "./cli/update_user.php --user --password \n" +msgstr "" +"./cli/update_user.php --user --password \n" +"\n" #. type: Plain text -#: en/./users/04_Subscriptions.md:12 +#: 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 "" -"Bookmarklets are little scripts that you can execute to perform various " -"tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds." +"For more information on that matter, please refer to the [dedicated " +"documentation](https://github.com/FreshRSS/FreshRSS/blob/edge/cli/README.md)." msgstr "" -"Les « bookmarklets » sont de petits scripts que vous pouvez exécuter pour " -"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\"." -msgstr "Ouvrez \"Gestion des abonnements\"." +"Pour plus d’information à ce sujet, il existe la [documentation dédiée]" +"(../../cli/README.md)." -#. type: Bullet: ' 2. ' -#: en/./users/04_Subscriptions.md:16 -msgid "Click on \"Subscription tools\"." -msgstr "Cliquez sur \"Outils d’abonnement\"." +#. type: Title ## +#: en/./users/07_Frequently_Asked_Questions.md:45 +#, no-wrap +msgid "Permissions under SELinux" +msgstr "Gérer les permissions sous SELinux" -#. type: Bullet: ' 3. ' -#: en/./users/04_Subscriptions.md:16 +#. type: Plain text +#: 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 "" -"Drag the \"Subscribe\" button to your bookmark toolbar or right click and " -"choose your browser’s \"Bookmark link\" action." +"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 can’t write to " +"some data sub-directories. The following command should be executed as root " +"to fix this problem:" 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" +"Certaines distributions Linux comme Fedora ou RedHat Enterprise Linux (RHEL) " +"activent par défaut le système SELinux. Celui-ci permet de gérer des " +"permissions au niveau des processus. Lors de l’installation de FreshRSS, " +"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: Title # -#: en/./users/05_Configuration.md:2 +#. type: Fenced code block (sh) +#: en/./users/07_Frequently_Asked_Questions.md:49 #, no-wrap -msgid "Display" -msgstr "Personnaliser la vue" +msgid "" +"semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/FreshRSS/data(/.*)?'\n" +"restorecon -Rv /usr/share/FreshRSS/data\n" +msgstr "" +"semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/FreshRSS/data(/.*)?'\n" +"restorecon -Rv /usr/share/FreshRSS/data\n" #. type: Title ## -#: en/./users/05_Configuration.md:4 +#: en/./users/07_Frequently_Asked_Questions.md:54 #, no-wrap -msgid "Language" -msgstr "Langue" +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/05_Configuration.md:9 +#: en/./users/07_Frequently_Asked_Questions.md:57 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)." +"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 " +"the faulty URL while keeping the exact same wording throughout the " +"application." msgstr "" -"À l’heure actuelle, FreshRSS est disponible en 13 langues. Après validation " -"de ce choix, l’interface sera affichée dans la langue choisie, même si " -"certaines parties de l’interface peuvent ne pas encore avoir été traduites. " -"Si vous voulez aider à la traduction, regardez comment vous pouvez " -"[contribuer au projet](../contributing.md#contribute-to-internationalization-" -"i18n)." +"Le mot `sharing` dans l’URL est un mot déclencheur pour certaines règles des " +"bloqueurs de publicités. À partir de la version 1.16, `sharing` a été " +"remplacé par `integration` dans l’URL posant problème tout en conservant " +"exactement la même dénomination à travers l’application." #. type: Plain text -#: en/./users/05_Configuration.md:11 +#: en/./users/07_Frequently_Asked_Questions.md:59 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." +"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 " +"accessed." msgstr "" -"Il y a des parties de FreshRSS qui ne sont pas traduites et qui n’ont pas " -"vocation à l’être. Pour le moment, les logs visibles dans l’application " -"ainsi que celle générées par le script de mise à jour automatique en font " -"partie." +"Si vous utilisez une version antérieure à 1.16, vous pouvez désactiver votre " +"bloqueur de publicité pour FreshRSS ou vous pouvez ajouter une règle pour " +"permettre la consultation de la page de configuration « partage »." #. type: Plain text -#: en/./users/05_Configuration.md:13 +#: 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:64 +msgid "" +"Whitelist your FreshRSS instance by adding it in _uBlock > Open the " +"dashboard > Whitelist_." +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:64 msgid "" -"Available languages are: cz, de, en, es, fr, he, it, ko, nl, oc, pt-br, ru, " -"tr, zh-cn." +"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 "" -"Les langues disponibles sont : cz, de, en, es, fr, he, it, ko, nl, oc, pt-" -"br, ru, tr, zh-cn." +"Autorisez votre instance FreshRSS à appeler la page de configuration " +"`sharing` en ajoutant la règle `*sharing,domain=~votredomaine.com` dans " +"_uBlock > Ouvrir le fichier tableau de bord > Mes filtres_" #. type: Title ## -#: en/./users/05_Configuration.md:14 +#: en/./users/07_Frequently_Asked_Questions.md:65 #, no-wrap -msgid "Theme" -msgstr "Thème" +msgid "Problems with firewalls" +msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:17 +#: en/./users/07_Frequently_Asked_Questions.md:68 msgid "" -"There’s no accounting for tastes, which is why FreshRSS offers eight " -"official themes:" +"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 "" -"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: 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/05_Configuration.md:26 -msgid "*Swage* by **Patrick Crandol**" -msgstr "*Swage* par **Patrick Crandol**" +#. 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: Plain text -#: en/./users/05_Configuration.md:28 +#. type: Bullet: '* ' +#: en/./users/07_Frequently_Asked_Questions.md:73 msgid "" -"If you can’t find any themes you like, it’s always possible to [create your " -"own](../developers/04_Frontend/02_Design.md)." +"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 "" -"Si aucun de ceux proposés ne convient, il est toujours possible de [créer " -"son propre thème](../developers/04_Frontend/02_Design.md)." #. type: Plain text -#: en/./users/05_Configuration.md:30 +#: en/./users/07_Frequently_Asked_Questions.md:75 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." +"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 "" -"Pour sélectionner un thème, il suffit de faire défiler les thèmes jusqu’à " -"l’apparition du thème choisi. Après validation, le thème sera appliqué à " -"l’interface." - -#. type: Title ## -#: en/./users/05_Configuration.md:31 -#, no-wrap -msgid "Content width" -msgstr "Largeur du contenu" #. type: Plain text -#: en/./users/05_Configuration.md:34 +#: en/./users/07_Frequently_Asked_Questions.md:76 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:" +"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 "" -"Il y en a qui préfère des lignes de texte courtes, d’autres qui préfèrent " -"maximiser l’espace disponible sur l’écran. Pour satisfaire le maximum de " -"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 -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 -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 -msgid "**Large** displays content up to a maximum width of 1000 pixels" -msgstr "**Large** qui affiche le contenu jusqu’à 1000 pixels" +#. type: Title # +#: en/./users/08_sharing_services.md:1 +#, fuzzy, no-wrap +#| msgid "Sharing" +msgid "Sharing Services" +msgstr "Partage" -#. type: Bullet: ' * ' -#: en/./users/05_Configuration.md:39 -msgid "**No limit** displays the content on 100% of the available space" +#. type: Plain text +#: en/./users/08_sharing_services.md:4 +msgid "FreshRSS has the option to share links with a bunch of services." msgstr "" -"**Pas de limite** qui affiche le contenu sur 100% de la place disponible" #. type: Title ## -#: en/./users/05_Configuration.md:40 +#: en/./users/08_sharing_services.md:5 #, no-wrap -msgid "Article icons" -msgstr "Icônes d’article" - -#. type: Plain text -#: en/./users/05_Configuration.md:43 -msgid "Please note that this section only affects normal view." -msgstr "Veuillez noter que cette section n’affecte que la vue normale." +msgid "Available Services: Simple Sharing" +msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:45 +#: en/./users/08_sharing_services.md:12 +#, no-wrap msgid "" -"![Article icons configuration](../img/users/configuration.article.icons.png)" +"| 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 "" -"![Configuration des icônes d’article](../img/users/configuration.article." -"icons.png)" #. type: Plain text -#: en/./users/05_Configuration.md:48 +#: en/./users/08_sharing_services.md:39 +#, no-wrap 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." +"| 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 "" -"Chaque article est rendu avec un en-tête (ligne supérieure) et un pied de " -"page (ligne inférieure). Dans cette section, vous pouvez choisir ce qui sera " -"affiché dans ceux-ci." + +#. 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/05_Configuration.md:52 +#: en/./users/08_sharing_services.md:43 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." +"Select the needed sharing services in the configuration menu " +"(Configuration / Sharing)." msgstr "" -"Si vous désactivez tous les éléments de la ligne supérieure, vous pourrez " -"toujours les voir, puisqu’il contient le nom du flux et le titre de " -"l’article. Mais si vous faites le même chose pour la ligne inférieure, elle " -"sera vide." #. type: Title ## -#: en/./users/05_Configuration.md:53 +#: en/./users/08_sharing_services.md:44 #, no-wrap -msgid "HTML5 notification timout" -msgstr "Temps d’affichage de la notification HTML5" +msgid "Usage" +msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:56 +#: en/./users/08_sharing_services.md:47 msgid "" -"After automatically updating the feeds, FreshRSS can pop up a notification " -"using the HTML5 notification API." +"Activate the sharing menu in configuration menu (Configuration / Display). " +"It is only available for the bottom line." msgstr "" -"Après la mise à jour automatique des flux, FreshRSS utilise l’API de " -"notification de HTML5 pour avertir de l’arrivée de nouveaux articles." #. type: Plain text -#: en/./users/05_Configuration.md:58 +#: en/./users/08_sharing_services.md:49 msgid "" -"The duration of this notification can be set. By default, the value is 0." +"The menu with the selected services is available in the footer of article." msgstr "" -"Il est possible de régler la durée d’affichage de cette notification. Par " -"défaut, la valeur est 0." #. type: Title ## -#: en/./users/05_Configuration.md:59 +#: en/./users/08_sharing_services.md:50 #, no-wrap -msgid "Show the navigation button" +msgid "Add More Sharing Services" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:62 +#: 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 "" -"By default, FreshRSS displays buttons to ease the article navigation when " -"browsing on mobile. The drawback is that they eat up some precious space." +"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: Plain text -#: en/./users/05_Configuration.md:64 -msgid "" -"![navigation button configuration](../img/users/configuration.navigation." -"button.png)" -msgstr "" +#. type: Title # +#: en/./users/09_refreshing_feeds.md:1 +#, no-wrap +msgid "Refreshing feeds" +msgstr "Rafraîchir les flux" #. type: Plain text -#: en/./users/05_Configuration.md:66 +#: 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 "" -"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." +"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: Title # -#: en/./users/05_Configuration.md:67 -#, no-wrap -msgid "Reading" +#. type: Bullet: '- ' +#: en/./users/09_refreshing_feeds.md:17 +msgid "[Manual update](#manual-update)" msgstr "" -#. type: Title ## -#: en/./users/05_Configuration.md:71 en/./users/05_Configuration.md:154 -#, no-wrap -msgid "Archival" -msgstr "Archivage" - -#. type: Title # -#: en/./users/05_Configuration.md:75 -#, no-wrap -msgid "Sharing" -msgstr "Partage" +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +#, fuzzy +#| msgid "Complete update" +msgid "[Complete update](#complete-update)" +msgstr "Mise à jour complète" -#. type: Plain text -#: en/./users/05_Configuration.md:78 -msgid "" -"To make your life easier, you can share articles straight from FreshRSS." +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +msgid "[Partial update](#partial-update)" msgstr "" -"Pour vous faciliter la vie, vous pouvez partager des articles directement " -"via FreshRSS." -#. type: Plain text -#: en/./users/05_Configuration.md:80 -msgid "" -"At the moment, FreshRSS supports 18 sharing methods, ranging from self-" -"hosted services (Shaarli, etc.) to proprietary services (Facebook, etc.)." +#. type: Bullet: '- ' +#: en/./users/09_refreshing_feeds.md:17 +msgid "[Automatic update with cron](#automatic-update-with-cron)" msgstr "" -#. type: Plain text -#: en/./users/05_Configuration.md:83 -msgid "" -"By default, the sharing list is empty. ![Sharing configuration](../img/" -"users/configuration.sharing.png)" +#. type: Bullet: '- ' +#: en/./users/09_refreshing_feeds.md:17 +msgid "[Online cron](#online-cron)" 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:" +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +msgid "[For Form Authentication](#for-form-authentication)" 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 -msgid "Select the desired sharing method in the drop-down list." +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +msgid "[For HTTP authentication](#for-http-authentication)" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:90 -msgid "Press the ```✚``` button to add it to the list." +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +msgid "[For No authentication None](#for-no-authentication-none)" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:90 +#. type: Bullet: '- ' +#: en/./users/09_refreshing_feeds.md:17 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)." +"[Feed configuration of “Do not automatically refresh more often than”](#feed-" +"configuration-of-do-not-automatically-refresh-more-often-than)" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:90 en/./users/05_Configuration.md:95 -msgid "Submit your changes." +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +msgid "[Background](#background)" msgstr "" -#. type: Plain text -#: en/./users/05_Configuration.md:92 -msgid "To remove an item from the list, follow those simple steps:" +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +msgid "[Default value](#default-value)" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:95 -msgid "Press the ```❌``` button next to the share method you want to remove." +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +msgid "[Individual feed configuration](#individual-feed-configuration)" msgstr "" -#. type: Title # -#: en/./users/05_Configuration.md:96 +#. type: Title ## +#: en/./users/09_refreshing_feeds.md:18 #, no-wrap -msgid "Shortcuts" -msgstr "Raccourcis" +msgid "Manual update" +msgstr "Mise à jour manuelle" #. type: Plain text -#: en/./users/05_Configuration.md:100 +#: en/./users/09_refreshing_feeds.md:21 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." +"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/05_Configuration.md:102 +#: en/./users/09_refreshing_feeds.md:25 msgid "" -"Of course, if you’re not satisfied with the key mapping, you can change you " -"configuration to fit your needs." +"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/05_Configuration.md:104 -msgid "There are 4 types of shortcuts:" -msgstr "" - -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:109 -msgid "Views: they allow switching views with ease." -msgstr "" +#: 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: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:109 +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:29 msgid "" -"Navigation: they allow navigation through articles, feeds, and categories." +"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: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:109 -msgid "" -"Article actions: they allow interactions with an article, like sharing or " -"opening it on the original web-site." -msgstr "" +#. 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: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:109 -msgid "" -"Other actions: they allow other interactions with the application, like " -"opening the user queries menu or accessing the documentation." -msgstr "" +#. type: Title ### +#: en/./users/09_refreshing_feeds.md:32 +#, no-wrap +msgid "Partial update" +msgstr "Mise à jour partielle" #. type: Plain text -#: en/./users/05_Configuration.md:112 +#: en/./users/09_refreshing_feeds.md:35 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." +"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/05_Configuration.md:114 -msgid "The same process applies to the user queries." +#: en/./users/09_refreshing_feeds.md:41 +msgid "This is the recommended method." msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:117 +#: en/./users/09_refreshing_feeds.md:43 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." -msgstr "" - -#. type: Title # -#: en/./users/05_Configuration.md:118 -#, no-wrap -msgid "User queries" +"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/05_Configuration.md:122 +#: en/./users/09_refreshing_feeds.md:45 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." +"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/05_Configuration.md:124 -msgid "At the moment, there is no helper to build a user query from here." +#: 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: Title # -#: en/./users/05_Configuration.md:125 +#. type: Fenced code block (cron) +#: en/./users/09_refreshing_feeds.md:48 #, no-wrap -msgid "Users" -msgstr "" +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/05_Configuration.md:129 +#: en/./users/09_refreshing_feeds.md:52 #, no-wrap -msgid "Authentication methods" +msgid "Online cron" msgstr "" -#. type: Title ### -#: en/./users/05_Configuration.md:131 -#, no-wrap -msgid "HTTP Authentication (Apache)" +#. 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: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:137 -msgid "User control is based on the `.htaccess` file." +#. 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: (it could be " +"different depending on your installation). Depending on your application " +"authentication method, you need to adapt the scheduled task." msgstr "" -#. type: Bullet: ' 2. ' -#: en/./users/05_Configuration.md:137 +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:60 msgid "" -"It is best practice to place the `.htaccess` file in the `./i/` subdirectory " -"so the API and other third party services can work." +"Special parameters to configure the script - all parameters can be combined:" msgstr "" +"« Paramètres de configuration du script; Ils sont utilisables " +"simultanément : »" -#. type: Bullet: ' 3. ' -#: en/./users/05_Configuration.md:137 +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:64 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!" +"- Parameter \"force\" If *force* is set to 1 all feeds will be " +"refreshed at once." msgstr "" -#. type: Bullet: ' 4. ' -#: en/./users/05_Configuration.md:137 -msgid "Example `.htaccess` file for a user \"marie\":" +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:68 +msgid "" +"- Parameter \"ajax\" Only a status site is returned and not a complete " +"website. Example: \"OK\"" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:138 -#, no-wrap +#: en/./users/09_refreshing_feeds.md:72 msgid "" -"AuthUserFile /home/marie/repertoire/.htpasswd\n" -"AuthGroupFile /dev/null\n" -"AuthName \"Chez Marie\"\n" -"AuthType Basic\n" -"Require user marie\n" +"- Parameter \"maxFeeds\" If *maxFeeds* is set the configured amount " +"of feeds is refreshed at once. The default setting is \"10\"." msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:147 +#: en/./users/09_refreshing_feeds.md:76 msgid "" -"More information can be found in the [Apache documentation](http://httpd." -"apache.org/docs/trunk/howto/auth.html#gettingitworking)." +"- Parameter \"token\" Security parameter to prevent " +"unauthorized refreshes. For detailed Documentation see \"Form " +"authentication\"." 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/09_refreshing_feeds.md:77 +#, fuzzy, no-wrap +#| msgid "Form authentication" +msgid "For Form Authentication" +msgstr "Authentification par formulaire" -#. type: Title ## -#: en/./users/05_Configuration.md:150 -#, no-wrap -msgid "Information" -msgstr "Informations" +#. 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: Title ## -#: en/./users/05_Configuration.md:158 -#, no-wrap -msgid "Login" -msgstr "Identification" +#. 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: Title ## -#: en/./users/05_Configuration.md:162 -#, no-wrap -msgid "Advanced" -msgstr "Avancé" +#. 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: 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/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/05_Configuration.md:167 +#: 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 "" -"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. :)" +"0 * * * * curl 'https://freshrss.exemple.net/i/?" +"c=feed&a=actualize&user=quelquun&token=mon-token'\n" #. type: Plain text -#: en/./users/05_Configuration.md:169 +#: 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 "" -"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!" +"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 "" -"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 !" +"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/05_Configuration.md:171 -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)." +#: en/./users/09_refreshing_feeds.md:92 +msgid "![Anonymous access configuration](../img/users/anonymous_access.1.png)" 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)." +"![Configuration de l’accès anonymes](../img/users/anonymous_access.1.png)" -#. type: Title #### -#: en/./users/05_Configuration.md:172 -#, no-wrap -msgid "Example: Rue89" -msgstr "Exemple : Rue89" +#. 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/05_Configuration.md:175 +#: en/./users/09_refreshing_feeds.md:96 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!)." +"If your FreshRSS instance is using HTTP authentication, you’ll need to " +"provide your credentials to the scheduled task." 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 ```
    ```. 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 ```
    ``` 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 ```
    ```. 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 ```
    ``` et c’est parfait ! Le chemin sera donc ```#article .content```.\n" - -#. type: Title #### -#: en/./users/05_Configuration.md:178 +#: en/./users/09_refreshing_feeds.md:98 #, 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```" +msgid "**Note:** This method is discouraged as your credentials are stored in plain text.\n" +msgstr "" -#. type: Bullet: '* ' -#: en/./users/05_Configuration.md:184 -msgid "PCINpact: ```#actu_content```" -msgstr "PCINpact : ```#actu_content```" +#. 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: Bullet: '* ' -#: en/./users/05_Configuration.md:184 -msgid "Lesnumériques: ```article#body div.text.clearfix```" -msgstr "Lesnumériques : ```article#body div.text.clearfix```" +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:104 +msgid "On some systems, that syntax might also work:" +msgstr "" -#. type: Bullet: '* ' -#: en/./users/05_Configuration.md:184 -msgid "Phoronix: ```#main .content```" -msgstr "Phoronix : ```#main .content```" +#. 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 "" +"" +msgstr "" +"0 * * * * curl -u alice:motdepasse123 'https://freshrss.exemple.net/i/?" +"c=feed&a=actualize'\n" #. 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" +#: 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/05_Configuration.md:188 +#: en/./users/09_refreshing_feeds.md:110 msgid "" -"Complimentary tools can be used to retrieve full article content, such as:" +"If your FreshRSS instance uses no authentication (public instance, default " +"user):" 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: Plain text +#: en/./users/09_refreshing_feeds.md:112 +#, fuzzy +#| msgid "" +#| "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'\n" +msgid "" +msgstr "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'\n" -#. 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/09_refreshing_feeds.md:113 +#, no-wrap +msgid "Feed configuration of “Do not automatically refresh more often than”" +msgstr "" -#. type: Title # -#: en/./users/06_Fever_API.md:1 +#. type: Title ### +#: en/./users/09_refreshing_feeds.md:115 #, no-wrap -msgid "FreshRSS - Fever API implementation" -msgstr "FreshRSS - API compatible Fever" +msgid "Background" +msgstr "" #. type: Plain text -#: en/./users/06_Fever_API.md:5 +#: en/./users/09_refreshing_feeds.md:118 msgid "" -"See the [page about our Google Reader compatible API](06_Mobile_access.md) " -"for another possibility and general aspects of API access." +"FreshRSS does not, by design, supports pull refreshes at frequencies higher " +"than once every 15 minutes. But FreshRSS supports instant push (WebSub)." 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 -#, no-wrap -msgid "RSS clients" -msgstr "Clients compatibles" #. type: Plain text -#: en/./users/06_Fever_API.md:11 +#: en/./users/09_refreshing_feeds.md:120 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." +"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 "" -"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 +#: en/./users/09_refreshing_feeds.md:121 #, no-wrap -msgid "Usage & Authentication" -msgstr "Utilisation et authentification" +msgid "Default value" +msgstr "" #. type: Plain text -#: en/./users/06_Fever_API.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." +#: 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 "" -"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/09_refreshing_feeds.md:126 msgid "" -"Then point your mobile application to the `fever.php` address (e.g. `https://" -"freshrss.example.net/api/fever.php`)." +"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 "" -"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: 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/06_Fever_API.md:22 -msgid "Tested with:" -msgstr "Testé avec :" +#: 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/06_Fever_API.md:25 -#, no-wrap +#: en/./users/09_refreshing_feeds.md:134 msgid "" -"* Android\n" -" * [Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) (Closed source)\n" +"Read more: - [Normal, Global and Reader view](./03_Main_view.md) - [Filter " +"the feeds and search](./10_filter.md)" msgstr "" -"* Android\n" -" * [Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) (Propriétaire)\n" -#. type: Plain text -#: en/./users/06_Fever_API.md:30 +#. 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 "" -"* 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" +msgid "Purpose" 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" #. type: Plain text -#: en/./users/06_Fever_API.md:33 -#, no-wrap +#: en/./users/10_filter.md:7 msgid "" -"* MacOS\n" -" * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial)\n" +"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 "" -"* MacOS\n" -" * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial)\n" +"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/06_Fever_API.md:35 +#: en/./users/10_filter.md:8 #, no-wrap -msgid "Features" -msgstr "Fonctionnalités" +msgid "By category" +msgstr "Par catégorie" #. 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" +#: 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/06_Fever_API.md:48 +#: en/./users/10_filter.md:14 msgid "" -"fetching RSS items (new, favorites, unread, by_id, by_feed, by_category, " -"since)" +"*Main feed* displays only articles from feeds marked as available in that " +"category" msgstr "" -"récupération des entrées (new, favorites, unread, by_id, by_feed, " -"by_category,since)" +"*Flux principal* qui affiche uniquement les articles des flux marqués comme " +"visible dans cette catégorie" #. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:48 -msgid "fetching favicons" -msgstr "récupération des favicons" +#: 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: Bullet: '* ' -#: en/./users/06_Fever_API.md:48 -msgid "setting read marker for item(s)" -msgstr "marquage des entrées comme lues" +#. 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/06_Fever_API.md:48 -msgid "setting starred marker for item(s)" -msgstr "marquage des entrées comme favoris" +#: 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/06_Fever_API.md:48 -msgid "setting read marker for feed" -msgstr "marquage d’un flux comme lu" +#: 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/06_Fever_API.md:48 -msgid "setting read marker for category" -msgstr "marquage d’une catégorie comme lue" +#: 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/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`" +#: 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/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 -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." +#: 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/06_Fever_API.md:53 +#: en/./users/10_filter.md:26 #, no-wrap -msgid "Testing and debugging" -msgstr "Tester et déboguer" +msgid "By status" +msgstr "Par statut" #. type: Plain text -#: en/./users/06_Fever_API.md:56 +#: en/./users/10_filter.md:29 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/)." +"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 "" -"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/)." +"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/06_Fever_API.md:58 +#: en/./users/10_filter.md:31 msgid "" -"Configure a POST request to the URL https://freshrss.example.net/api/fever." -"php?api which should give you the result:" +"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 "" -"Envoyer une requête POST à l’adresse https://freshrss.example.net/api/fever." -"php?api devrait vous renvoyer le résultat suivant :" +"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: 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/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/06_Fever_API.md:58 -#, no-wrap +#: en/./users/10_filter.md:35 msgid "" -"{\n" -"\t\"api_version\": 3,\n" -"\t\"auth\": 0\n" -"}\n" +"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 "" -"{\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 !" +#: 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/06_Fever_API.md:68 -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`" +#: en/./users/10_filter.md:39 +msgid "By default, this filter displays only unread articles" 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 +#. type: Title ## +#: en/./users/10_filter.md:40 #, 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" +msgid "By content" +msgstr "" #. type: Plain text -#: en/./users/06_Fever_API.md:74 +#: en/./users/10_filter.md:43 msgid "" -"Add a body to your POST request encoded as `form-data` and one key named " -"`api_key` with the value `your-password-hash`:" +"It is possible to filter articles by their content by inputting a string in " +"the search field." 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/10_filter.md:44 #, 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 "With the search field" +msgstr "Grâce au champ de recherche" #. type: Plain text -#: en/./users/06_Fever_API.md:80 -#, no-wrap -msgid "" -"{\n" -"\t\"api_version\": 3,\n" -"\t\"auth\": 1,\n" -"\t\"last_refreshed_on_time\": \"1520013061\"\n" -"}\n" +#: en/./users/10_filter.md:47 +msgid "You can use the search field to further refine results:" msgstr "" -"{\n" -"\t\"api_version\": 3,\n" -"\t\"auth\": 1,\n" -"\t\"last_refreshed_on_time\": \"1520013061\"\n" -"}\n" +"Il est possible d’utiliser le champ de recherche pour raffiner les " +"résultats :" -#. type: Plain text -#: en/./users/06_Fever_API.md:88 -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." +#. type: Bullet: '* ' +#: en/./users/10_filter.md:93 +msgid "by feed ID: `f:123` or multiple feed IDs (*or*): `f:123,234,345`" 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" +#: 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/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" +#: 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/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" +#: 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/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" +#: en/./users/10_filter.md:93 +msgid "by tag: `#tag` or `#tag+with+whitespace`" +msgstr "" #. 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" +#: 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/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" +#: 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:`" +msgstr "" -#. 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/10_filter.md:93 +msgid "From a specific day, or month, or year:" +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: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:2014-03-30`" 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 -msgid "" -"https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:2014-03` or `date:201403`" 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 -msgid "" -"Replace `some_id` with a real ID from your `freshrss_username_entry` " -"database." +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:2014`" 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/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: Plain text -#: en/./users/06_Fever_API.md:106 -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:" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "After a given date:" 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: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:2014-03/`" +msgstr "" -#. type: Plain text -#: en/./users/06_Fever_API.md:112 -msgid "" -"Then use your RSS client to query the API and afterwards check the file " -"`fever.log`." +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "Before a given date:" 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: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:/2014-03`" +msgstr "" -#. type: Plain text -#: en/./users/06_Fever_API.md:115 -msgid "" -"This plugin was inspired by the [tinytinyrss-fever-plugin](https://github." -"com/dasmurphy/tinytinyrss-fever-plugin)." +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "For a specific duration after a given date:" 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 -msgid "" -"This page assumes you have completed the [server setup](../" -"admins/02_Installation.md)." +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:2014-03/P1W`" 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/10_filter.md:93 +msgid "For a specific duration before a given date:" +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/10_filter.md:93 +msgid "`date:P1W/2014-05-25T23:59:59`" 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/10_filter.md:93 +msgid "For the past duration before now (the trailing slash is optional):" 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 -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." +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:P1Y/` or `date:P1Y` (past year)" 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: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:P2M/` (past two months)" +msgstr "" -#. type: Bullet: '3. ' -#: en/./users/06_Mobile_access.md:21 -msgid "" -"Under the section “Profile”, click on the link like `https://rss.example.net/" -"api/` next to the field “API password”." +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:P3W/` (past three weeks)" 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 -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" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:P4D/` (past four days)" 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: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:PT5H/` (past five hours)" +msgstr "" -#. 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: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:PT30M/` (past thirty minutes)" +msgstr "" -#. type: Title # -#: en/./users/06_Mobile_access.md:65 -#, no-wrap -msgid "Google Reader compatible API" -msgstr "API compatible Google Reader" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:PT90S/` (past ninety seconds)" +msgstr "" -#. type: Plain text -#: en/./users/06_Mobile_access.md:68 -msgid "Examples of basic queries:" -msgstr "Exemples de requêtes simples :" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +msgid "`date:P1DT1H/` (past one day and one hour)" +msgstr "" -#. type: Plain text -#: en/./users/06_Mobile_access.md:69 -#, no-wrap +#. type: Bullet: '* ' +#: en/./users/10_filter.md:93 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" +"by date of publication, using the same format: `pubdate:`" 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 +#. type: Bullet: '* ' +#: en/./users/10_filter.md:93 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." +"by custom label ID `L:12` or multiple label IDs: `L:12,13,14` or with any " +"label: `L:*`" msgstr "" -"Il est possible que nous n’ayons pas répondu à toutes vos questions dans les " -"parties précédentes. La FAQ regroupe certaines interrogations qui n’ont pas " -"trouvé leur réponse ailleurs." - -#. type: Title ## -#: en/./users/07_Frequently_Asked_Questions.md:3 -#, no-wrap -msgid "What is `/i` at the end of the application URL?" -msgstr "C’est quoi ce `/i` à la fin de l’URL ?" -#. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:6 +#. type: Bullet: '* ' +#: en/./users/10_filter.md:93 msgid "" -"Of course, ```/i``` has a purpose! It’s used for performance and usability:" +"by custom label name `label:label`, `label:\"my label\"` or any label name " +"from a list (*or*): `labels:\"my label,my other label\"`" msgstr "" -"Bien entendu, le ```/i``` n’est pas là pour faire joli ! Il s’agit d’une " -"question de performances et de praticité :" #. type: Bullet: '* ' -#: en/./users/07_Frequently_Asked_Questions.md:11 +#: en/./users/10_filter.md:93 msgid "" -"It allows for serving icons, images, styles and scripts without cookies. " -"Without that trick, those files would be downloaded more often, especially " -"when form authentication is used. Also, HTTP requests would be heavier." +"by several label names (*and*): `label:\"my label\" label:\"my other label\"`" msgstr "" -"Cela permet de servir les icônes, images, styles, scripts sans cookie. Sans " -"cela, ces fichiers seraient souvent re-téléchargés, en particulier lorsque " -"le formulaire de connexion est utilisé. De plus, les requêtes vers ces " -"ressources seraient plus lourdes." #. type: Bullet: '* ' -#: en/./users/07_Frequently_Asked_Questions.md:11 +#: en/./users/10_filter.md:93 msgid "" -"The ```./p/``` public root can be served without any HTTP access " -"restrictions. Whereas it could be implemented in ```./p/i/```." +"by entry (article) ID: `e:1639310674957894` or multiple entry IDs (*or*): " +"`e:1639310674957894,1639310674957893`" msgstr "" -"La racine publique ```./p/``` peut être servie sans restriction d’accès HTTP " -"(qui peut avantageusement être mise en place dans ```./p/i/```)." #. type: Bullet: '* ' -#: en/./users/07_Frequently_Asked_Questions.md:11 +#: en/./users/10_filter.md:93 msgid "" -"It avoids problems while serving public resources like ```favicon.ico```, " -"```robots.txt```, etc." +"by user query (saved search) name: `search:myQuery`, `search:\"My query\"` " +"or saved search ID: `S:3`" msgstr "" -"Cela permet d’éviter des problèmes pour des fichiers qui doivent être " -"publics pour bien fonctionner, comme ```favicon.ico```, ```robots.txt```, " -"etc." -#. type: Bullet: '* ' -#: en/./users/07_Frequently_Asked_Questions.md:11 +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 msgid "" -"It allows the logo to be displayed instead of a white page while hitting a " -"restriction or a delay during the loading process." +"internally, those references are replaced by the corresponding user query in " +"the search expression" msgstr "" -"Cela permet aussi d’avoir un logo FreshRSS plutôt qu’une page blanche pour " -"accueillir l’utilisateur par exemple dans le cas de la restriction d’accès " -"HTTP ou lors de l’attente du chargement plus lourd du reste de l’interface." -#. type: Title ## -#: en/./users/07_Frequently_Asked_Questions.md:12 -#, no-wrap -msgid "Why is `robots.txt` located in a sub-folder?" -msgstr "Pourquoi le ```robots.txt``` se trouve dans un sous-répertoire ?" +#. 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/07_Frequently_Asked_Questions.md:15 +#: 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 "" -"To increase security, FreshRSS is hosted in two sections. The first section " -"is public (the `./p` folder) and the second section is private (everything " -"else). Therefore the `robots.txt` file is located in the `./p` sub-folder." +"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 "" -"Afin d’améliorer la sécurité, FreshRSS est découpé en deux parties : une " -"partie publique (le répertoire ```./p```) et une partie privée (tout le " -"reste !). Le ```robots.txt``` se trouve donc dans le sous-répertoire ```./" -"p```." +"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/07_Frequently_Asked_Questions.md:17 +#: 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 "" -"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." +"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 "" -"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 " -"sous-répertoire afin que seule la partie publique ne soit accessible par un " -"navigateur web. De cette manière https://demo.freshrss.org/ pointe vers le " -"répertoire ```./p``` et le ```robots.txt``` se trouve bien à la racine du " -"site : https://demo.freshrss.org/robots.txt." +"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/07_Frequently_Asked_Questions.md:19 -msgid "The same principle applies to `favicon.ico` and `.htaccess`." +#: 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 "" -"L’explication est la même pour les fichiers ```favicon.ico``` et ```." -"htaccess```." +"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/07_Frequently_Asked_Questions.md:20 -#, 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/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/07_Frequently_Asked_Questions.md:26 +#: en/./users/10_filter.md:109 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 " -"can be the root of the problem, or FreshRSS can be buggy. The first step is " -"to identify what causes the problem. Here are the steps to follow:" +"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 "" -"Il peut y avoir différentes origines à ce problème. Le flux peut avoir une " -"syntaxe invalide, il peut ne pas être reconnu par la bibliothèque SimplePie, " -"l’hébergement peut avoir des problèmes, FreshRSS peut être boggué. Il faut " -"dans un premier temps déterminer la cause du problème.Voici la liste des " -"étapes à suivre pour la déterminer :" -#. type: Bullet: '1. ' -#: en/./users/07_Frequently_Asked_Questions.md:30 -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, " -"there’s nothing we can do." +#. 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 "" -"__Vérifier la validité du flux__ grâce à l’[outil en ligne du W3C](https://" -"validator.w3.org/feed/ \"Validateur en ligne de flux RSS et Atom\"). Si ça " -"ne fonctionne pas, nous ne pouvons rien faire." -#. type: Bullet: '1. ' -#: en/./users/07_Frequently_Asked_Questions.md:30 -msgid "" -"__Verify SimplePie validation__ with the [SimplePie on-line tool](https://" -"simplepie.org/demo/ \"SimplePie official demo\"). If it’s not recognized, " -"there’s nothing we can do." +#. type: Title ## +#: en/./users/10_filter.md:118 +#, no-wrap +msgid "By sorting by date" msgstr "" -"__Vérifier la reconnaissance par SimplePie__ grâce à l’[outil en ligne de " -"SimplePie](https://simplepie.org/demo/ \"Démo officielle de SimplePie\"). Si " -"ça ne fonctionne pas, nous ne pouvons rien faire." -#. type: Bullet: '1. ' -#: en/./users/07_Frequently_Asked_Questions.md:30 +#. type: Plain text +#: en/./users/10_filter.md:121 msgid "" -"__Verify FreshRSS integration__ with the [demo](https://demo.freshrss.org " -"\"FreshRSS official demo\"). If it’s not working, you need to [create an " -"issue on Github](https://github.com/FreshRSS/FreshRSS/issues/new \"Create an " -"issue for FreshRSS\") so we can have a look at it. If it’s working, there’s " -"probably something fishy with the hosting server." +"You can change the sort order by clicking the toggle button available in the " +"header." msgstr "" -"__Vérifier l’intégration dans FreshRSS__ grâce à la [démo](https://demo." -"freshrss.org \"Démo officielle de FreshRSS\"). Si ça ne fonctionne pas, il " -"faut [créer un ticket sur Github](https://github.com/FreshRSS/FreshRSS/" -"issues/new \"Créer un ticket pour FreshRSS\") pour que l’on puisse regarder " -"ce qui se passe. Si ça fonctionne, il y a probablement un problème avec " -"l’hébergement." #. type: Title ## -#: en/./users/07_Frequently_Asked_Questions.md:31 +#: en/./users/10_filter.md:122 #, no-wrap -msgid "How can you change a forgotten password?" -msgstr "Comment changer un mot de passe oublié ?" +msgid "Store your filters" +msgstr "" #. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:35 +#: en/./users/10_filter.md:125 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 " -"interface is available under ```Administration → Manage users```. Select a " -"user, enter a password, and validate." +"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 "" -"Depuis la version [1.10.0](https://github.com/FreshRSS/FreshRSS/releases/" -"tag/1.10.0), l’administrateur peut modifier le mot de passe d’un utilisateur " -"depuis l’interface. Cette interface est disponible dans le menu " -"```Administration → Gestion des utilisateurs```. Il suffit de sélectionner " -"l’utilisateur, de saisir un mot de passe et de valider." #. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:37 +#: en/./users/10_filter.md:129 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 " -"mentioning that you must have access to PHP CLI. Open a terminal, and type " -"the following command:" +"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 "" -"Depuis la version [1.8.0](https://github.com/FreshRSS/FreshRSS/releases/" -"tag/1.8.0), l’administrateur peut modifier le mot de passe d’un utilisateur " -"depuis un terminal. Il est bon de noter que celui-ci doit avoir un accès à " -"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: Title ### +#: en/./users/10_filter.md:130 #, no-wrap -msgid "./cli/update_user.php --user --password \n" +msgid "Bookmark the current query" msgstr "" -"./cli/update_user.php --user --password \n" -"\n" #. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:41 +#: en/./users/10_filter.md:134 msgid "" -"For more information on that matter, please refer to the [dedicated " -"documentation](../../cli/README.md)." +"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 "" -"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 -#, no-wrap -msgid "Permissions under SELinux" -msgstr "Gérer les permissions sous SELinux" #. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:45 -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:" +#: en/./users/10_filter.md:136 +msgid "Then click on the bookmark action." msgstr "" -"Certaines distributions Linux comme Fedora ou RedHat Enterprise Linux (RHEL) " -"activent par défaut le système SELinux. Celui-ci permet de gérer des " -"permissions au niveau des processus. Lors de l’installation de FreshRSS, " -"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 -#, no-wrap -msgid "" -"semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/FreshRSS/data(/.*)?'\n" -"restorecon -Rv /usr/share/FreshRSS/data\n" +#: en/./users/10_filter.md:138 +msgid "Congratulations, you’re done!" msgstr "" -"semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/FreshRSS/data(/.*)?'\n" -"restorecon -Rv /usr/share/FreshRSS/data\n" -#. type: Title ## -#: en/./users/07_Frequently_Asked_Questions.md:50 -#, 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: 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/07_Frequently_Asked_Questions.md:53 +#: en/./users/10_filter.md:143 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 " -"the faulty URL while keeping the exact same wording throughout the " -"application." +"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 "" -"Le mot `sharing` dans l’URL est un mot déclencheur pour certaines règles des " -"bloqueurs de publicités. À partir de la version 1.16, `sharing` a été " -"remplacé par `integration` dans l’URL posant problème tout en conservant " -"exactement la même dénomination à travers l’application." #. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:55 +#: en/./users/10_filter.md:145 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 " -"accessed." +"Then click on the bookmarked query, the previously stored query will be " +"applied." msgstr "" -"Si vous utilisez une version antérieure à 1.16, vous pouvez désactiver votre " -"bloqueur de publicité pour FreshRSS ou vous pouvez ajouter une règle pour " -"permettre la consultation de la page de configuration « partage »." #. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:57 -msgid "Examples with _uBlock_:" -msgstr "Exemples avec _uBlock_ :" - -#. type: Bullet: '- ' -#: en/./users/07_Frequently_Asked_Questions.md:59 +#: en/./users/10_filter.md:148 +#, no-wrap msgid "" -"Whitelist your FreshRSS instance by adding it in _uBlock > Open the " -"dashboard > Whitelist_." +"> 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 "" -"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: Plain text +#: en/./users/10_filter.md:152 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_" +"Read more: * [Normal, Global and Reader view](./03_Main_view.md) * " +"[Refreshing the feeds](./09_refreshing_feeds.md)" msgstr "" -"Autorisez votre instance FreshRSS à appeler la page de configuration " -"`sharing` en ajoutant la règle `*sharing,domain=~votredomaine.com` dans " -"_uBlock > Ouvrir le fichier tableau de bord > Mes filtres_" + +#, 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 "" +#~ "

    \n" +#~ "\t\">\n" +#~ "\t\t\n" +#~ "\t\n" +#~ "

    \n" +#~ msgstr "" +#~ "

    \n" +#~ "\t\">\n" +#~ "\t\t\n" +#~ "\t\n" +#~ "

    \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 "" 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 \n" "Language-Team: LANGUAGE \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 Control + c 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,192 +591,414 @@ 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 -#, no-wrap -msgid "Spaces, tabs and other whitespace characters" -msgstr "" - -#. type: Title ### -#: en/./developers/01_First_steps.md:74 -#, no-wrap -msgid "Indentation" +#: en/./developers/02_First_steps.md:72 +#, markdown-text, no-wrap +msgid "GitHub Actions" msgstr "" #. type: Plain text -#: en/./developers/01_First_steps.md:76 -msgid "Code indentation must use tabs." +#: 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/01_First_steps.md:77 -#, no-wrap -msgid "Alignment" +#. type: Title ## +#: en/./developers/02_First_steps.md:77 +#, markdown-text, no-wrap +msgid "Running fixes & tests" msgstr "" #. type: Plain text -#: en/./developers/01_First_steps.md:80 +#: en/./developers/02_First_steps.md:80 +#, 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." +"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: 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 +#. type: Fenced code block (sh) +#: en/./developers/02_First_steps.md:81 #, no-wrap -msgid "php" +msgid "" +"make fix-all\n" +"make test-all\n" msgstr "" #. type: Plain text -#: en/./developers/01_First_steps.md:81 -#, no-wrap +#: en/./developers/02_First_steps.md:87 +#, markdown-text msgid "" -"$result = a_function_with_a_really_long_name($param1, $param2,\n" -" $param3, $param4);\n" +"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/01_First_steps.md:86 -#, no-wrap -msgid "End of line" +#: en/./developers/02_First_steps.md:88 +#, markdown-text, no-wrap +msgid "Debian / Ubuntu" msgstr "" #. type: Plain text -#: en/./developers/01_First_steps.md:89 +#: en/./developers/02_First_steps.md:91 +#, markdown-text, no-wrap 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." +"> ℹ️ 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/01_First_steps.md:91 +#: en/./developers/02_First_steps.md:93 +#, markdown-text msgid "" -"You can verify if there is any unintended white space at the end of line " -"with the following Git command:" +"Here are the dependencies that need to be manually installed prior to " +"running the fixes & tests." 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 +#. type: Fenced code block (sh) +#: en/./developers/02_First_steps.md:94 #, no-wrap -msgid "bash" +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: Plain text -#: en/./developers/01_First_steps.md:92 +#. 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 "" -"# command to check files before adding them in the Git index\n" -"git diff --check\n" -"# command to check files after adding them in the Git index\n" -"git diff --check --cached\n" +"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:99 en/./developers/01_First_steps.md:220 -#, no-wrap -msgid "End of file" +#: en/./developers/02_First_steps.md:104 +#, markdown-text, no-wrap +msgid "Alpine Linux" msgstr "" -#. type: Plain text -#: en/./developers/01_First_steps.md:102 -msgid "Every file must end by an empty line." +#. 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/01_First_steps.md:103 -#, no-wrap -msgid "Commas, dots and semi-columns" +#: en/./developers/02_First_steps.md:110 +#, markdown-text, no-wrap +msgid "Partial fixes & tests" msgstr "" -#. type: Plain text -#: en/./developers/01_First_steps.md:106 +#. type: Bullet: '- ' +#: en/./developers/02_First_steps.md:114 +#, markdown-text msgid "" -"There should no space before those characters, but there should be one " -"after." +"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/01_First_steps.md:107 en/./developers/01_First_steps.md:210 -#, no-wrap -msgid "Operators" +#: en/./developers/02_First_steps.md:115 +#, markdown-text, no-wrap +msgid "Tests summary" msgstr "" #. type: Plain text -#: en/./developers/01_First_steps.md:110 -msgid "There should be a space before and after every operator." +#: en/./developers/02_First_steps.md:118 +#, markdown-text +msgid "A short (not complete) summary:" msgstr "" -#. type: Plain text -#: en/./developers/01_First_steps.md:111 -#, no-wrap +#. 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 "" -"if ($a == 10) {\n" -"\t// do something\n" -"}\n" -"\n" -"echo $a ? 1 : 0;\n" +"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/01_First_steps.md:119 -#, no-wrap -msgid "Parentheses" +#: en/./developers/02_First_steps.md:128 +#, markdown-text, no-wrap +msgid "CSS" msgstr "" -#. type: Plain text -#: en/./developers/01_First_steps.md:122 -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 " -"be any spaces after the closing bracket, except if it’s followed by a curly " -"bracket." +#. type: Bullet: ' - ' +#: en/./developers/02_First_steps.md:134 +#, markdown-text +msgid "via npm `.styleintrc.json`" msgstr "" -#. type: Plain text -#: en/./developers/01_First_steps.md:123 -#, no-wrap -msgid "" -"if ($a == 10) {\n" -"\t// do something\n" -"}\n" -"\n" -"if ((int)$a == 10) {\n" -"\t// do something\n" -"}\n" +#. 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/01_First_steps.md:133 -#, no-wrap -msgid "With chained functions" +#: en/./developers/02_First_steps.md:135 +#, markdown-text, no-wrap +msgid "JavaScript" msgstr "" -#. type: Plain text -#: en/./developers/01_First_steps.md:136 +#. type: Bullet: ' - ' +#: en/./developers/02_First_steps.md:139 +#, 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 " -"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." +"via npm `.styleintrc.json` ([ECMAScript " +"2017](https://en.wikipedia.org/wiki/ECMAScript#8th_Edition_%E2%80%93_ECMAScript_2017))" msgstr "" -#. type: Code fence info string -#: en/./developers/01_First_steps.md:137 -#, no-wrap -msgid "javascript" +#. type: Title ### +#: en/./developers/02_First_steps.md:140 +#, markdown-text, no-wrap +msgid "Markdown" msgstr "" -#. type: Plain text -#: en/./developers/01_First_steps.md:137 -#, no-wrap -msgid "" +#. 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/02_First_steps.md:150 +#, markdown-text +msgid "Code indentation must use tabs." +msgstr "" + +#. type: Title ### +#: en/./developers/02_First_steps.md:151 +#, markdown-text, no-wrap +msgid "Alignment" +msgstr "" + +#. type: Plain text +#: 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: 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" +" $param3, $param4);\n" +msgstr "" + +#. type: Title ### +#: en/./developers/02_First_steps.md:160 +#, markdown-text, no-wrap +msgid "End of line" +msgstr "" + +#. type: Plain text +#: 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/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: 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" +"git diff --check\n" +"# command to check files after adding them in the Git index\n" +"git diff --check --cached\n" +msgstr "" + +#. type: Title ### +#: en/./developers/02_First_steps.md:173 +#, markdown-text, no-wrap +msgid "End of file" +msgstr "" + +#. type: Plain text +#: en/./developers/02_First_steps.md:176 +#, markdown-text +msgid "Every file must end by an empty line." +msgstr "" + +#. type: Title ### +#: en/./developers/02_First_steps.md:177 +#, markdown-text, no-wrap +msgid "Commas, dots and semi-columns" +msgstr "" + +#. type: Plain text +#: 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/02_First_steps.md:181 +#, markdown-text, no-wrap +msgid "Operators" +msgstr "" + +#. type: Plain text +#: en/./developers/02_First_steps.md:184 +#, markdown-text +msgid "There should be a space before and after every operator." +msgstr "" + +#. type: Fenced code block (php) +#: en/./developers/02_First_steps.md:185 +#, no-wrap +msgid "" +"if ($a == 10) {\n" +"\t// do something\n" +"}\n" +"\n" +"echo $a ? 1 : 0;\n" +msgstr "" + +#. type: Title ### +#: en/./developers/02_First_steps.md:193 +#, markdown-text, no-wrap +msgid "Parentheses" +msgstr "" + +#. type: Plain text +#: 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 " +"be any spaces after the closing bracket, except if it’s followed by a curly " +"bracket." +msgstr "" + +#. type: Fenced code block (php) +#: en/./developers/02_First_steps.md:197 +#, no-wrap +msgid "" +"if ($a == 10) {\n" +"\t// do something\n" +"}\n" +"\n" +"if ((int)$a == 10) {\n" +"\t// do something\n" +"}\n" +msgstr "" + +#. type: Title ### +#: en/./developers/02_First_steps.md:207 +#, markdown-text, no-wrap +msgid "With chained functions" +msgstr "" + +#. type: Plain text +#: 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 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: Fenced code block (javascript) +#: en/./developers/02_First_steps.md:211 +#, no-wrap +msgid "" "// First instruction\n" "shortcut.add(shortcuts.mark_read, function () {\n" "\t\t//...\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,582 +1215,2858 @@ msgstr "" #. type: Title # #: en/./developers/02_Github.md:1 -#, no-wrap -msgid "Reporting a bug or a suggestion" +#, markdown-text, no-wrap +msgid "Branching" 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." +#. type: Title ## +#: en/./developers/02_Github.md:3 +#, markdown-text, no-wrap +msgid "Basic" 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." +#, markdown-text +msgid "If you are new to Git, here are some of the resources you might find useful:" msgstr "" -#. type: Title ## -#: en/./developers/02_Github.md:7 -#, no-wrap -msgid "On GitHub" +#. type: Bullet: '* ' +#: en/./developers/02_Github.md:11 +#, markdown-text +msgid "[GitHub’s blog post](https://github.com/blog/120-new-to-git)" 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!" +#. type: Bullet: '* ' +#: en/./developers/02_Github.md:11 +#, markdown-text +msgid "" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./developers/02_Github.md:16 -msgid "[Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/issues)" +#. type: Bullet: '* ' +#: en/./developers/02_Github.md:11 +#, markdown-text +msgid "" 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." +#. type: Bullet: '* ' +#: en/./developers/02_Github.md:11 +#, markdown-text +msgid "" 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)" +#. type: Title ## +#: en/./developers/02_Github.md:12 +#, markdown-text, no-wrap +msgid "Getting the latest code from the FreshRSS repository" 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." +#. type: Plain text +#: en/./developers/02_Github.md:15 +#, markdown-text +msgid "First you need to add the official repo to your remote repo list:" msgstr "" -#. type: Bullet: ' 5. ' +#. type: Fenced code block (sh) #: 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" +msgid "git remote add upstream git@github.com:FreshRSS/FreshRSS.git\n" 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." +#: en/./developers/02_Github.md:21 +#, markdown-text +msgid "You can verify the remote repo is successfully added by using:" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:26 -msgid "" -"On [our Mattermost " -"chat](https://framateam.org/signup_user_complete/?id=e2680d3e3128b9fac8fdb3003b0024ee)" +#. type: Fenced code block (sh) +#: en/./developers/02_Github.md:22 +#, no-wrap +msgid "git remote -v show\n" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:26 -msgid "" -"On [the mailing " -"lists](https://freshrss.org/announce-of-the-mailing-lists.html)" +#. type: Plain text +#: en/./developers/02_Github.md:27 +#, markdown-text +msgid "Now you can pull the latest development code:" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:26 -msgid "At events / meetings around Free Software" +#. type: Fenced code block (sh) +#: en/./developers/02_Github.md:28 +#, no-wrap +msgid "" +"git checkout edge\n" +"git pull upstream edge\n" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:26 -msgid "Over a beer in a bar" +#. type: Title ## +#: en/./developers/02_Github.md:33 +#, markdown-text, no-wrap +msgid "Starting a new development branch" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:26 -msgid "Etc." +#. 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:27 +#: en/./developers/02_Github.md:39 +#, markdown-text, no-wrap +msgid "Sending a patch" +msgstr "" + +#. type: Fenced code block (sh) +#: en/./developers/02_Github.md:41 #, no-wrap -msgid "Tips" +msgid "" +"# Add the changed file, here actualize_script.php\n" +"git add app/actualize_script.php\n" +"# Commit the change and write a proper commit message\n" +"git commit\n" +"# Double check all looks well\n" +"git show\n" +"# Push it to your fork\n" +"git push\n" msgstr "" #. type: Plain text -#: en/./developers/02_Github.md:30 -msgid "Here are some tips to help you present your bug report or suggestion:" +#: en/./developers/02_Github.md:53 +#, markdown-text +msgid "Now you can create a PR based on your branch." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:39 -msgid "**Pay attention to spelling**. Even if it’s not always easy, try your best!" +#. type: Title ## +#: en/./developers/02_Github.md:54 +#, markdown-text, no-wrap +msgid "How to write a commit message" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:39 +#. type: Plain text +#: en/./developers/02_Github.md:57 +#, markdown-text 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." +"A commit message should succinctly describe the changes on the first " +"line. For example:" +msgstr "" + +#. type: Plain text +#: en/./developers/02_Github.md:59 +#, markdown-text, no-wrap +msgid "> Fix broken icon\n" +msgstr "" + +#. type: Plain text +#: 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:62 +#, markdown-text +msgid "For further tips, see [here](https://chris.beams.io/posts/git-commit/)." +msgstr "" + +#. type: Title # +#: en/./developers/03_Backend/01_Database_schema.md:1 +#, markdown-text, no-wrap +msgid "Database Schema" +msgstr "" + +#. 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/01_Database_schema.md:5 +#, markdown-text, no-wrap +msgid "See also" msgstr "" #. type: Bullet: '* ' -#: en/./developers/02_Github.md:39 +#: en/./developers/03_Backend/01_Database_schema.md:7 +#, markdown-text +msgid "[Database configuration](../../admins/DatabaseConfig.md)" +msgstr "" + +#. type: Title # +#: 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 +#, markdown-text, no-wrap +msgid "Writing extensions for FreshRSS" +msgstr "" + +#. type: Title ## +#: en/./developers/03_Backend/05_Extensions.md:3 +#, markdown-text, no-wrap +msgid "About FreshRSS" +msgstr "" + +#. type: Plain text +#: en/./developers/03_Backend/05_Extensions.md:6 +#, markdown-text 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." +"FreshRSS is an RSS / Atom feed aggregator written in PHP dating back to " +"October 2012. The official site is located at " +"[freshrss.org](https://freshrss.org) and the official repository is hosted " +"on Github: " +"[github.com/FreshRSS/FreshRSS](https://github.com/FreshRSS/FreshRSS)." +msgstr "" + +#. type: Title ## +#: en/./developers/03_Backend/05_Extensions.md:7 +#, 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/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`)." +#: en/./developers/03_Backend/05_Extensions.md:14 +#, markdown-text +msgid "The number of developers" msgstr "" #. type: Bullet: '* ' -#: en/./developers/02_Github.md:39 +#: 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 "" -"If you can’t find the log files, specify it in your ticket so we know you’ve " -"already searched." +"While the first limitation can, in theory, be lifted by the participation of " +"new contributors to the project, it depends on the willingness of " +"contributors to take an interest in the source code of the entire " +"project. In order to remove the other two limitations, most of the time it " +"will be necessary to create a \"fork\"." +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 " +"software, we allow for:" +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 # +#: en/./developers/03_Backend/05_Extensions.md:25 +#: 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 +#, markdown-text +msgid "see [Minz documentation](/docs/en/developers/Minz/index.md)" +msgstr "" + +#. 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:32 +#, markdown-text +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:34 +#, markdown-text +msgid "" +"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:35 +#, markdown-text, no-wrap +msgid "Make it work in Docker" +msgstr "" + +#. type: Plain text +#: en/./developers/03_Backend/05_Extensions.md:38 +#, markdown-text +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 +#, markdown-text, no-wrap +msgid "Basic files and folders" +msgstr "" + +#. type: Plain text +#: 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 " +"is a directory containing a set of mandatory (and optional) files and " +"subdirectories. The convention requires that the main directory name be " +"preceded by an \"x\" to indicate that it is not an extension included by " +"default in FreshRSS." +msgstr "" + +#. type: Plain text +#: 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/02_Github.md:39 +#: en/./developers/03_Backend/05_Extensions.md:52 +#, 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!" +"A `metadata.json` file that contains a description of the extension. This " +"file is written in JSON." msgstr "" #. type: Bullet: '* ' -#: en/./developers/02_Github.md:39 +#: en/./developers/03_Backend/05_Extensions.md:52 +#, markdown-text msgid "" -"The logs may reveal confidential information, so **be careful not to " -"disclose anything sensitive.**" +"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/02_Github.md:41 +#: en/./developers/03_Backend/05_Extensions.md:56 +#, markdown-text 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/):" +"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 " +"should follow our best practice: If you want to write a `HelloWorld` " +"extension, the directory name should be `xExtension-HelloWorld` and the base " +"class name `HelloWorldExtension`." msgstr "" -#. type: Title ### -#: en/./developers/02_Github.md:42 +#. type: Plain text +#: 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: Fenced code block (php) +#: en/./developers/03_Backend/05_Extensions.md:58 #, no-wrap -msgid "What’s my goal?" +msgid "" +"class HelloWorldExtension extends Minz_Extension {\n" +"\tpublic function init() {\n" +"\t\t// your code here\n" +"\t}\n" +"}\n" +msgstr "" + +#. type: Plain text +#: 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: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: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: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 " +"more interesting to write a complete theme)" +msgstr "" + +#. type: Bullet: '* ' +#: 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:75 +#, markdown-text +msgid "An `i18n` directory containing additional translations" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:75 +#, markdown-text +msgid "" +"`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: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 " +"detailed description of it." +msgstr "" + +#. type: Title ### +#: 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: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 " +"following entries:" +msgstr "" + +#. type: Bullet: '* ' +#: 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: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:89 +#, markdown-text +msgid "`description`: a description of your extension" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/03_Backend/05_Extensions.md:89 +#, markdown-text +msgid "`version`: the current version number of the extension" +msgstr "" + +#. type: Plain text +#: en/./developers/03_Backend/05_Extensions.md:89 +#, markdown-text, 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`\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:91 +#, markdown-text +msgid "Only the `name` and `entrypoint` fields are required." +msgstr "" + +#. type: Title ### +#: 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:95 +#, markdown-text +msgid "" +"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:97 +#, markdown-text +msgid "A *system* extension in comparison is enabled for every account." +msgstr "" + +#. type: Title ### +#: 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:102 +#, markdown-text +msgid "" +"This file is the core of your extension. It must define some key elements " +"to be loaded by the extension system:" +msgstr "" + +#. type: Bullet: '1. ' +#: en/./developers/03_Backend/05_Extensions.md:106 +#, markdown-text +msgid "" +"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: '1. ' +#: en/./developers/03_Backend/05_Extensions.md:106 +#, markdown-text +msgid "" +"The class must extend the `Minz_Extension` abstract class which defines the " +"core methods and properties of a FreshRSS extension." +msgstr "" + +#. type: Bullet: '1. ' +#: en/./developers/03_Backend/05_Extensions.md:106 +#, markdown-text +msgid "" +"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:111 +#, markdown-text +msgid "" +"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: Plain text +#: en/./developers/03_Backend/05_Extensions.md:113 +#, markdown-text, 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: 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 `\\Controller.php`, and " +"its class name must be `FreshExtension_\\_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: Plain text +#: en/./developers/03_Backend/05_Extensions.md:129 +#, markdown-text, 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:130 +#, markdown-text, no-wrap +msgid "The \"hooks\" system" +msgstr "" + +#. type: Plain text +#: 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: Fenced code block (html) +#: en/./developers/03_Backend/05_Extensions.md:134 +#, no-wrap +msgid "" +"class HelloWorldExtension extends Minz_Extension\n" +"{\n" +"\tpublic function init() {\n" +"\t\t$this->registerHook('entry_before_display', array($this, " +"'renderEntry'));\n" +"\t}\n" +"\tpublic function renderEntry($entry) {\n" +"\t\t$entry->_content('

    Hello World

    ' . $entry->content());\n" +"\t\treturn $entry;\n" +"\t}\n" +"}\n" +msgstr "" + +#. type: Plain text +#: 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: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 doesn’t advertise it in the header " +"can still be automatically supported." +msgstr "" + +#. type: Bullet: '* ' +#: 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 " +"FreshRSS\\_Entry) will be passed as parameter." +msgstr "" + +#. type: Bullet: '* ' +#: 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 " +"database. The new entry (instance of FreshRSS\\_Entry) will be passed as " +"parameter." +msgstr "" + +#. type: Bullet: '* ' +#: 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 " +"passed as parameter." +msgstr "" + +#. type: Bullet: '* ' +#: 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 " +"FreshRSS\\_Feed) will be passed as parameter." +msgstr "" + +#. type: Bullet: '* ' +#: 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." +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: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. `
  • New entry
  • `)." +msgstr "" + +#. type: Bullet: '* ' +#: 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. `
  • New entry
  • `)." +msgstr "" + +#. type: Bullet: '* ' +#: 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. `
  • New " +"entry
  • `)." +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:164 +#, markdown-text +msgid "" +"`nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** " +"add documentation." +msgstr "" + +#. type: Bullet: '* ' +#: 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:164 +#, markdown-text +msgid "" +"`simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** " +"add documentation." +msgstr "" + +#. type: Title ### +#: 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: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." +msgstr "" + +#. type: Title # +#: en/./developers/03_Running_tests.md:1 +#, 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." +msgstr "" + +#. type: Title ## +#: en/./developers/03_Running_tests.md:5 +#, 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: Fenced code block (sh) +#: en/./developers/03_Running_tests.md:9 +#, no-wrap +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 " +"issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues/new) to let " +"maintainers know about the problem." +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: Fenced code block (sh) +#: en/./developers/03_Running_tests.md:17 +#, no-wrap +msgid "NO_DOCKER=true make test\n" +msgstr "" + +#. 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 "" +"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:35 +#, markdown-text +msgid "" +"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:37 +#, markdown-text +msgid "" +"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# is the port used on the host to communicate with the server\n" +"\t# is the name of the docker network used (by default, it’s " +"freshrss-network)\n" +"\tdocker run -it --rm -p :8080 --name wiremock --network -v " +"$PWD:/home/wiremock wiremock/wiremock:latest-alpine " +"--local-response-templating\n" +"\t```\n" +"1. You can access the `` mock file directly:\n" +" * from the host by sending a GET request to " +"`http://localhost:/`,\n" +" * from any container connected on the same network by sending a GET " +"request to `http://wiremock:8080/`.\n" +msgstr "" + +#. type: Title # +#: en/./developers/04_Frontend/01_View_files.md:1 +#, 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:7 +#, markdown-text, no-wrap +msgid "Writing a URL" +msgstr "" + +#. 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 +#, 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: Plain text +#: en/./developers/04_Frontend/02_Design.md:27 +#, markdown-text +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 +#, 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 +#, 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)!" +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 " +"template](https://github.com/FreshRSS/FreshRSS/blob/edge/docs/pull_request_template.md). " +"It contains a checklist to make sure you didn’t forget anything. It is very " +"important to verify you did everything mentioned so documentation is " +"up-to-date, the commit history stays clear and the code is always stable." +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 +#, 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 " +"do that." +msgstr "" + +#. type: Plain text +#: 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:17 +#, markdown-text, no-wrap +msgid "Rebasing" +msgstr "" + +#. type: Plain text +#: 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 " +"difficult if you’re not at ease with Git since conflicts are harder to " +"resolve." +msgstr "" + +#. type: Plain text +#: 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 " +"it out." +msgstr "" + +#. type: Plain text +#: en/./developers/04_Pull_requests.md:24 +#, markdown-text +msgid "To rebase a branch:" +msgstr "" + +#. 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" +msgstr "" + +#. type: Plain text +#: 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:34 +#, markdown-text, no-wrap +msgid "Merging" +msgstr "" + +#. type: Plain text +#: 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 " +"readable. Don’t worry, we will take care of it before merging your PR back " +"into `edge`." +msgstr "" + +#. type: Plain text +#: en/./developers/04_Pull_requests.md:39 +#, markdown-text +msgid "To merge `edge`:" +msgstr "" + +#. 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" +msgstr "" + +#. type: Title ## +#: 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: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 " +"explain the choices made in the past (the “why?”)" +msgstr "" + +#. type: Plain text +#: en/./developers/04_Pull_requests.md:52 +#, markdown-text +msgid "" +"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.”" +msgstr "" + +#. type: Bullet: '* ' +#: 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: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 " +"body is the place where you can clarify the context of your patch. For " +"instance, you can explain what you were doing when you identified a bug, or " +"the problem you had before your patch. Providing this information helps " +"other developers understand why a specific choice was made, especially when " +"a patch introduces a bug that is identified months later." +msgstr "" + +#. type: Plain text +#: 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: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:61 +#, markdown-text, no-wrap +msgid "How to write tests" +msgstr "" + +#. type: Plain text +#: 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 " +"appreciate it if you wrote a test that ensures your patch is working." +msgstr "" + +#. type: Plain text +#: 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: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: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:71 +#, markdown-text, no-wrap +msgid "Why you should write documentation" +msgstr "" + +#. type: Plain text +#: 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 " +"to their problems. The documentation should not be written “later” or " +"chances are it’ll never be." +msgstr "" + +#. type: Plain text +#: 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." +msgstr "" + +#. type: Title # +#: en/./developers/05_Release_new_version.md:1 +#, markdown-text, no-wrap +msgid "Preparing the release" +msgstr "" + +#. type: Plain text +#: 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)). " +"This should be done **at least one week in advance**." +msgstr "" + +#. type: Plain text +#: 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:8 +#, markdown-text, no-wrap +msgid "Check the dev status" +msgstr "" + +#. type: Plain text +#: 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 " +"executed before any publication." +msgstr "" + +#. type: Plain text +#: 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:14 +#, markdown-text, no-wrap +msgid "Git process" +msgstr "" + +#. type: Fenced code block (console) +#: en/./developers/05_Release_new_version.md:16 +#, no-wrap +msgid "" +"$ git checkout edge\n" +"$ git pull\n" +"$ vim constants.php\n" +"# Update version number x.y.y.z of FRESHRSS_VERSION\n" +"$ git commit -a\n" +"Version x.y.z\n" +"$ git tag -a x.y.z\n" +"Version x.y.z\n" +"$ git push && git push --tags\n" +msgstr "" + +#. 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: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:33 +#, markdown-text +msgid "" +"The repository managing the code is located on GitHub: " +"[FreshRSS/update.freshrss.org](https://github.com/FreshRSS/update.freshrss.org/)." +msgstr "" + +#. type: Title ## +#: 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: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." +msgstr "" + +#. type: Plain text +#: 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 " +"URL from which the FreshRSS package will be downloaded (`PACKAGE_URL`). The " +"URL is in the form of " +"`https://codeload.github.com/FreshRSS/FreshRSS/zip/x.y.z`." +msgstr "" + +#. type: Plain text +#: 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: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 " +"cleaning it all up. This function is pre-filled but adjustments can be made " +"if necessary (e.g., reorganization of the `./data` structure). It returns " +"`true` if no problem has occurred or a string indicating a problem;" +msgstr "" + +#. type: Bullet: '* ' +#: 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: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: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: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 " +"`Minz_Configuration` object, you will benefit from these improvements)." +msgstr "" + +#. type: Title ## +#: 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: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 " +"versions are updated to which other versions." +msgstr "" + +#. type: Plain text +#: en/./developers/05_Release_new_version.md:53 +#, markdown-text +msgid "Here’s an example of a `versions.php` file:" +msgstr "" + +#. type: Fenced code block (php) +#: en/./developers/05_Release_new_version.md:54 +#, no-wrap +msgid "" +" '1.0.0',\n" +"\t'0.8.1' => '1.0.0',\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" +"\t'1.1.4-dev' => 'dev',\n" +");\n" +msgstr "" + +#. type: Plain text +#: 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: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: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:75 +#, markdown-text +msgid "stable versions are updated to stable versions;" +msgstr "" + +#. type: Bullet: '* ' +#: 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: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 " +"exist. As long as the corresponding script does not exist, nothing will " +"happen." +msgstr "" + +#. type: Plain text +#: en/./developers/05_Release_new_version.md:77 +#, markdown-text +msgid "" +"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:78 +#, markdown-text, no-wrap +msgid "Deployment" +msgstr "" + +#. type: Plain text +#: 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 " +"dev.update.freshrss.org and change the `FRESHRSS_UPDATE_WEBSITE` URL of your " +"FreshRSS instance. Start the update and check that it’s running correctly." +msgstr "" + +#. type: Plain text +#: 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:84 +#, markdown-text, no-wrap +msgid "Updating the FreshRSS services" +msgstr "" + +#. type: Plain text +#: 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:90 +#, markdown-text +msgid "rss.freshrss.org;" +msgstr "" + +#. type: Bullet: '* ' +#: 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:91 +#, markdown-text, no-wrap +msgid "Publicly announce the release" +msgstr "" + +#. type: Plain text +#: 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: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: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:99 +#, markdown-text +msgid "on Twitter ([@FreshRSS](https://twitter.com/FreshRSS) account)" +msgstr "" + +#. type: Bullet: '* ' +#: 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:100 +#, markdown-text, no-wrap +msgid "Starting the next development version" +msgstr "" + +#. type: Fenced code block (console) +#: en/./developers/05_Release_new_version.md:102 +#, no-wrap +msgid "" +"$ git checkout edge\n" +"$ vim constants.php\n" +"# Update the FRESHRSS_VERSION\n" +"$ vim CHANGELOG.md\n" +"# Prepare the changelog for the next version\n" +"$ git add CHANGELOG.md && git commit && git push\n" +msgstr "" + +#. type: Plain text +#: 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/./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/./developers/06_Fever_API.md:12 +#, 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 " +"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/./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/./developers/06_Fever_API.md:45 +#, markdown-text +msgid "fetching categories" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/06_Fever_API.md:45 +#, markdown-text +msgid "fetching feeds" +msgstr "" + +#. type: Bullet: '* ' +#: 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/./developers/06_Fever_API.md:45 +#, markdown-text +msgid "fetching favicons" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/06_Fever_API.md:45 +#, markdown-text +msgid "setting read marker for item(s)" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/06_Fever_API.md:45 +#, markdown-text +msgid "setting starred marker for item(s)" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/06_Fever_API.md:45 +#, markdown-text +msgid "setting read marker for feed" +msgstr "" + +#. type: Bullet: '* ' +#: 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/./developers/06_Fever_API.md:49 +#, markdown-text +msgid "" +"**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 " +" 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/./developers/06_Fever_API.md:97 +#, markdown-text +msgid "" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/06_Fever_API.md:97 +#, markdown-text +msgid "" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/06_Fever_API.md:97 +#, markdown-text +msgid "" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/06_Fever_API.md:97 +#, markdown-text +msgid "" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/06_Fever_API.md:97 +#, markdown-text +msgid "" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/06_Fever_API.md:97 +#, markdown-text +msgid "" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/06_Fever_API.md:97 +#, markdown-text +msgid "" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/06_Fever_API.md:97 +#, markdown-text +msgid "" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/06_Fever_API.md:97 +#, markdown-text +msgid "" +msgstr "" + +#. type: Plain text +#: en/./developers/06_Fever_API.md:99 +#, markdown-text +msgid "" +"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/./developers/06_Fever_API.md:103 +#, 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:" +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/./developers/06_Fever_API.md:109 +#, markdown-text +msgid "" +"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/./developers/06_Fever_API.md:112 +#, markdown-text +msgid "" +"This plugin was inspired by the " +"[tinytinyrss-fever-plugin](https://github.com/dasmurphy/tinytinyrss-fever-plugin)." +msgstr "" + +#. type: Title # +#: en/./developers/06_GoogleReader_API.md:1 +#, markdown-text, no-wrap +msgid "FreshRSS - Google Reader compatible API implementation" +msgstr "" + +#. 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: 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/./developers/06_GoogleReader_API.md:12 +#, markdown-text +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 "" + +#. 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/./developers/06_GoogleReader_API.md:24 +#, markdown-text +msgid "" +"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/./developers/06_GoogleReader_API.md:24 +#, markdown-text +msgid "" +"Type the API address in a client, together with your FreshRSS username, and " +"the corresponding special API password." +msgstr "" + +#. type: Plain text +#: en/./developers/06_GoogleReader_API.md:39 +#, markdown-text, 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 +#, 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/./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 "" +"# 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: Plain text -#: en/./developers/02_Github.md:45 -msgid "Give the general context of what you were trying to do." +#. type: Bullet: '* ' +#: 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/02_Github.md:46 -#, no-wrap -msgid "What have I been trying to do?" +#: en/./developers/06_GoogleReader_API.md:74 +#, markdown-text, no-wrap +msgid "API documentation from the original Google Reader" 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." +#. type: Bullet: '* ' +#: 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: Title ### -#: en/./developers/02_Github.md:50 -#, no-wrap -msgid "What results have I achieved?" +#. type: Bullet: '* ' +#: 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: Plain text -#: en/./developers/02_Github.md:53 +#. type: Bullet: '* ' +#: en/./developers/06_GoogleReader_API.md:81 +#, markdown-text msgid "" -"The bug: what you see that shouldn’t have happened. Here you can provide the " -"logs." +"[By Nick " +"Bradbury](https://inessential.com/2013/03/14/google_reader_api_documentation)" msgstr "" -#. type: Title ### -#: en/./developers/02_Github.md:54 -#, no-wrap -msgid "What was the expected result?" +#. type: Bullet: '* ' +#: en/./developers/06_GoogleReader_API.md:81 +#, markdown-text +msgid "" +"[By Niall " +"Kennedy](https://web.archive.org/web/20170426184845/http://www.niallkennedy.com/blog/2005/12/google-reader-api.html)" msgstr "" -#. type: Plain text -#: en/./developers/02_Github.md:57 -msgid "So that we understand what you consider to be the problem." +#. type: Bullet: '* ' +#: en/./developers/06_GoogleReader_API.md:81 +#, markdown-text +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/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:" +#: en/./developers/06_GoogleReader_API.md:82 +#, markdown-text, no-wrap +msgid "API documentation from other compatible clients" 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?" +#. type: Bullet: '* ' +#: en/./developers/06_GoogleReader_API.md:89 +#, markdown-text +msgid "[FeedHQ](https://feedhq.readthedocs.io/en/latest/api/index.html)" msgstr "" -#. type: Bullet: ' 3. ' -#: en/./developers/02_Github.md:67 -msgid "Which version of PHP?" +#. type: Bullet: '* ' +#: en/./developers/06_GoogleReader_API.md:89 +#, markdown-text +msgid "[Inoreader](https://www.inoreader.com/developers/)" msgstr "" -#. type: Bullet: ' 4. ' -#: en/./developers/02_Github.md:67 -msgid "Which database: SQLite, MySQL, MariaDB, PostgreSQL? Which version?" +#. type: Bullet: '* ' +#: en/./developers/06_GoogleReader_API.md:89 +#, markdown-text +msgid "[The Old Reader](https://github.com/theoldreader/api)" msgstr "" -#. type: Bullet: ' 5. ' -#: en/./developers/02_Github.md:67 -msgid "Which distribution runs on the server? And… which version?" +#. 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/./developers/02_Github.md:68 -#, no-wrap -msgid "Branching" +#. type: Bullet: '* ' +#: en/./developers/06_GoogleReader_API.md:89 +#, markdown-text +msgid "[BazQux](https://github.com/bazqux/bazqux-api)" msgstr "" -#. type: Title ## -#: en/./developers/02_Github.md:70 -#, no-wrap -msgid "Basic" +#. type: Title ### +#: en/./developers/06_GoogleReader_API.md:90 +#, markdown-text, no-wrap +msgid "Synchronisation strategy" msgstr "" #. type: Plain text -#: en/./developers/02_Github.md:72 -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 -msgid "[GitHub’s blog post](https://github.com/blog/120-new-to-git)" -msgstr "" - -#. type: Bullet: '* ' -#: en/./developers/02_Github.md:77 -msgid "" +#: 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/02_Github.md:77 -msgid "" +#: 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/02_Github.md:77 -msgid "" -msgstr "" - -#. type: Title ## -#: en/./developers/02_Github.md:78 -#, no-wrap -msgid "Getting the latest code from the FreshRSS repository" -msgstr "" - -#. type: Plain text -#: en/./developers/02_Github.md:80 -msgid "First you need to add the official repo to your remote repo list:" +#: 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: Plain text -#: en/./developers/02_Github.md:80 -#, no-wrap -msgid "git remote add upstream git@github.com:FreshRSS/FreshRSS.git\n" +#. type: Title # +#: en/./developers/06_Reporting_Bugs.md:1 +#, markdown-text, no-wrap +msgid "Reporting a bug or a suggestion" msgstr "" #. type: Plain text -#: en/./developers/02_Github.md:85 -msgid "You can verify the remote repo is successfully added by using:" +#: en/./developers/06_Reporting_Bugs.md:4 +#, markdown-text +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 "" #. type: Plain text -#: en/./developers/02_Github.md:85 -#, no-wrap -msgid "git remote -v show\n" +#: 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: Plain text -#: en/./developers/02_Github.md:90 -msgid "Now you can pull the latest development code:" +#. type: Title ## +#: en/./developers/06_Reporting_Bugs.md:7 +#, markdown-text, no-wrap +msgid "On GitHub" msgstr "" #. type: Plain text -#: en/./developers/02_Github.md:90 -#, no-wrap +#: en/./developers/06_Reporting_Bugs.md:10 +#, markdown-text msgid "" -"git checkout edge\n" -"git pull upstream edge\n" +"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/./developers/02_Github.md:95 -#, no-wrap -msgid "Starting a new development branch" +#. 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/./developers/02_Github.md:96 -#, no-wrap -msgid "git checkout -b my-development-branch\n" +#. type: Bullet: '2. ' +#: en/./developers/06_Reporting_Bugs.md:16 +#, markdown-text +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: Title # -#: en/./developers/02_Github.md:100 -#, no-wrap -msgid "Sending a patch" +#. type: Bullet: '3. ' +#: en/./developers/06_Reporting_Bugs.md:16 +#, markdown-text +msgid "" +"If your request is new, [open a new bug " +"ticket](https://github.com/FreshRSS/FreshRSS/issues/new)" msgstr "" -#. type: Plain text -#: en/./developers/02_Github.md:102 -#, no-wrap +#. type: Bullet: '4. ' +#: en/./developers/06_Reporting_Bugs.md:16 +#, markdown-text msgid "" -"# Add the changed file, here actualize_script.php\n" -"git add app/actualize_script.php\n" -"# Commit the change and write a proper commit message\n" -"git commit\n" -"# Double check all looks well\n" -"git show\n" -"# Push it to your fork\n" -"git push\n" +"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: Plain text -#: en/./developers/02_Github.md:114 -msgid "Now you can create a PR based on your branch." +#. 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/02_Github.md:115 -#, no-wrap -msgid "How to write a commit message" +#: en/./developers/06_Reporting_Bugs.md:17 +#, markdown-text, no-wrap +msgid "Informal" msgstr "" #. type: Plain text -#: en/./developers/02_Github.md:118 +#: en/./developers/06_Reporting_Bugs.md:20 +#, markdown-text msgid "" -"A commit message should succintly describe the changes on the first " -"line. For example:" +"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/./developers/02_Github.md:120 -#, no-wrap -msgid "> Fix broken icon\n" +#. 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: Plain text -#: en/./developers/02_Github.md:122 -msgid "If necessary, this can be followed by a blank line and a longer explanation." +#. type: Bullet: '* ' +#: en/./developers/06_Reporting_Bugs.md:26 +#, markdown-text +msgid "On [our subreddit](https://www.reddit.com/r/freshrss/)" msgstr "" -#. type: Plain text -#: en/./developers/02_Github.md:123 -msgid "For further tips, see [here](https://chris.beams.io/posts/git-commit/)." +#. type: Bullet: '* ' +#: en/./developers/06_Reporting_Bugs.md:26 +#, markdown-text +msgid "At events / meetings around Free Software" msgstr "" -#. type: Title # -#: en/./developers/03_Backend/02_Minz.md:1 -#, no-wrap -msgid "Models" +#. type: Bullet: '* ' +#: en/./developers/06_Reporting_Bugs.md:26 +#, markdown-text +msgid "Over a beer in a bar" msgstr "" -#. type: Title # -#: en/./developers/03_Backend/02_Minz.md:5 -#, no-wrap -msgid "Controllers and actions" +#. type: Bullet: '* ' +#: en/./developers/06_Reporting_Bugs.md:26 +#, markdown-text +msgid "Etc." msgstr "" -#. type: Title ### -#: en/./developers/03_Backend/02_Minz.md:9 en/./developers/03_Backend/05_Extensions.md:69 -#, no-wrap -msgid "Views" +#. type: Title ## +#: en/./developers/06_Reporting_Bugs.md:27 +#, markdown-text, no-wrap +msgid "Tips" msgstr "" -#. type: Title ### -#: en/./developers/03_Backend/02_Minz.md:13 en/./developers/03_Backend/05_Extensions.md:39 -#, no-wrap -msgid "Routing" +#. type: Plain text +#: 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: Title # -#: en/./developers/03_Backend/02_Minz.md:17 -#, no-wrap -msgid "Writing URL" +#. 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: Title # -#: en/./developers/03_Backend/02_Minz.md:21 en/./developers/04_Frontend/01_View_files.md:13 -#, no-wrap -msgid "Internationalisation" +#. type: Bullet: '* ' +#: en/./developers/06_Reporting_Bugs.md:41 +#, markdown-text +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: Title # -#: en/./developers/03_Backend/02_Minz.md:25 -#, no-wrap -msgid "Understanding internals" +#. type: Bullet: '* ' +#: en/./developers/06_Reporting_Bugs.md:41 +#, markdown-text +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 "" -#. type: Title # -#: en/./developers/03_Backend/04_Changing_source_code.md:1 -#, no-wrap -msgid "Accessing the database" +#. 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: Title # -#: en/./developers/03_Backend/04_Changing_source_code.md:5 -#, no-wrap -msgid "Writing an action and its related view" +#. 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: Title # -#: en/./developers/03_Backend/04_Changing_source_code.md:9 -#, no-wrap -msgid "Authentication" +#. 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: Title # -#: en/./developers/03_Backend/04_Changing_source_code.md:13 -#, no-wrap -msgid "Logs" +#. 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: Title # -#: en/./developers/03_Backend/05_Extensions.md:1 -#, no-wrap -msgid "Writing extensions for FreshRSS" +#. type: Plain text +#: en/./developers/06_Reporting_Bugs.md:41 +#, markdown-text, 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: Title ## -#: en/./developers/03_Backend/05_Extensions.md:3 -#, no-wrap -msgid "About FreshRSS" +#. type: Plain text +#: en/./developers/06_Reporting_Bugs.md:43 +#, markdown-text +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/06_Reporting_Bugs.md:44 +#, markdown-text, no-wrap +msgid "What’s my goal?" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:6 -msgid "" -"FreshRSS is an RSS / Atom feed aggregator written in PHP dating back to " -"October 2012. The official site is located at " -"[freshrss.org](https://freshrss.org) and the official repository is hosted " -"on Github: " -"[github.com/FreshRSS/FreshRSS](https://github.com/FreshRSS/FreshRSS)." +#: 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/03_Backend/05_Extensions.md:7 -#, no-wrap -msgid "The problem" +#. 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/./developers/03_Backend/05_Extensions.md:10 -msgid "FreshRSS is limited in its technical possibilities by various factors:" +#: 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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:14 -msgid "The number of developers" +#. type: Title ### +#: en/./developers/06_Reporting_Bugs.md:52 +#, markdown-text, no-wrap +msgid "What results have I achieved?" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:14 -msgid "The will to integrate certain changes" +#. type: Plain text +#: en/./developers/06_Reporting_Bugs.md:55 +#, markdown-text +msgid "" +"The bug: what you see that shouldn’t have happened. Here you can provide the " +"logs." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:14 -msgid "The level of \"hacking\" required to integrate marginal features" +#. type: Title ### +#: en/./developers/06_Reporting_Bugs.md:56 +#, markdown-text, no-wrap +msgid "What was the expected result?" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:16 -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 " -"contributors to take an interest in the source code of the entire " -"project. In order to remove the other two limitations, most of the time it " -"will be necessary to create a \"fork\"." +#: 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/./developers/06_Reporting_Bugs.md:60 +#, markdown-text, no-wrap +msgid "What are my circumstances?" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:18 -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 " -"software, we allow for:" +#: 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/03_Backend/05_Extensions.md:22 -msgid "Reducing the amount of source code a new contributor has to take in" +#: en/./developers/06_Reporting_Bugs.md:69 +#, markdown-text +msgid "Which browser? Which version?" msgstr "" #. type: Bullet: '2. ' -#: en/./developers/03_Backend/05_Extensions.md:22 -msgid "Unofficial integration of novelties" +#: en/./developers/06_Reporting_Bugs.md:69 +#, markdown-text +msgid "Which server: Apache, Nginx? Which version?" msgstr "" #. type: Bullet: '3. ' -#: en/./developers/03_Backend/05_Extensions.md:22 -msgid "No forking or main developer approval required." +#: 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/03_Backend/05_Extensions.md:24 +#: en/./developers/06_Reporting_Bugs.md:74 +#, 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." +"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: Title ## -#: en/./developers/03_Backend/05_Extensions.md:25 +#. type: Fenced code block (bash) +#: en/./developers/06_Reporting_Bugs.md:75 #, no-wrap -msgid "Understanding basic mechanics (Minz and MVC)" +msgid "wget -O output.rss.txt\n" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:28 -#, no-wrap -msgid "**TODO** : move to 02_Minz.md\n" +#: 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/./developers/03_Backend/05_Extensions.md:30 +#: en/./developers/Minz/index.md:6 +#, markdown-text msgid "" "This data sheet should refer to the official FreshRSS and Minz documentation " "(the PHP framework on which FreshRSS is based). Unfortunately, this " @@ -1419,21 +4077,23 @@ msgid "" "`Minz_Translate` module for example)." msgstr "" -#. type: Title ### -#: en/./developers/03_Backend/05_Extensions.md:31 -#, no-wrap +#. type: Title ## +#: en/./developers/Minz/index.md:7 +#, markdown-text, no-wrap msgid "MVC Architecture" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:34 +#: 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/03_Backend/05_Extensions.md:38 +#: en/./developers/Minz/index.md:14 +#, markdown-text 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 " @@ -1443,7 +4103,8 @@ msgid "" msgstr "" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:38 +#: 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 " @@ -1451,7 +4112,8 @@ msgid "" msgstr "" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:38 +#: 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 " @@ -1459,18 +4121,26 @@ msgid "" "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/./developers/03_Backend/05_Extensions.md:42 +#: 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://exemple.com?c=hello will " +"`c` parameter. For example, the address will " "execute the code contained in the `hello` controller." msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:44 +#: 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 " @@ -1479,12 +4149,13 @@ msgid "" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:46 en/./developers/03_Backend/05_Extensions.md:165 +#: en/./developers/Minz/index.md:23 en/./developers/Minz/index.md:143 +#, markdown-text msgid "Code example:" msgstr "" -#. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:47 +#. type: Fenced code block (php) +#: en/./developers/Minz/index.md:24 #, no-wrap msgid "" ", the `world` " "action is executed on the `hello` controller." msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:66 +#: en/./developers/Minz/index.md:44 +#, markdown-text 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." +"variables is `index`. So the address will " +"execute the `index` action of the `hello` controller." msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:68 +#: en/./developers/Minz/index.md:46 +#, markdown-text msgid "" "From now on, the `hello/world` naming convention will be used to refer to a " "controller/action pair." msgstr "" +#. 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/./developers/03_Backend/05_Extensions.md:72 +#: en/./developers/Minz/index.md:50 +#, markdown-text 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: " @@ -1533,18 +4214,13 @@ msgid "" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:74 +#: en/./developers/Minz/index.md:52 +#, markdown-text 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 +#. type: Fenced code block (html) +#: en/./developers/Minz/index.md:53 #, no-wrap msgid "" "

    \n" @@ -1553,36 +4229,37 @@ msgid "" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:82 -#, no-wrap +#: 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/./developers/03_Backend/05_Extensions.md:83 -#, no-wrap +#. type: Title ## +#: en/./developers/Minz/index.md:61 +#, markdown-text, no-wrap msgid "Working with GET / POST" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:87 +#: en/./developers/Minz/index.md:65 +#, markdown-text 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 +#. type: Fenced code block (php) +#: en/./developers/Minz/index.md:66 #, no-wrap msgid "" "\n" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:109 +#: en/./developers/Minz/index.md:87 +#, markdown-text 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 +#: 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/03_Backend/05_Extensions.md:112 -#, no-wrap +#. type: Title ## +#: en/./developers/Minz/index.md:90 +#, markdown-text, no-wrap msgid "Access session settings" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:115 +#: en/./developers/Minz/index.md:93 +#, markdown-text 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 " @@ -1628,22 +4308,23 @@ msgid "" "`Minz_Request` to `Minz_Session`." msgstr "" -#. type: Title ### -#: en/./developers/03_Backend/05_Extensions.md:116 -#, no-wrap +#. type: Title ## +#: en/./developers/Minz/index.md:94 +#, markdown-text, no-wrap msgid "Working with URLs" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:119 +#: 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: Plain text -#: en/./developers/03_Backend/05_Extensions.md:120 +#. type: Fenced code block (html) +#: en/./developers/Minz/index.md:98 #, no-wrap msgid "" "

    \n" @@ -1653,23 +4334,25 @@ msgid "" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:127 +#: en/./developers/Minz/index.md:105 +#, markdown-text 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 in a format, all previous " "addresses would become ineffective!" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:129 +#: 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: Plain text -#: en/./developers/03_Backend/05_Extensions.md:130 +#. type: Fenced code block (php) +#: en/./developers/Minz/index.md:108 #, no-wrap msgid "" "\n" msgstr "" -#. type: Title ### -#: en/./developers/03_Backend/05_Extensions.md:207 -#, no-wrap -msgid "Translation Management" +#. type: Title ## +#: en/./developers/Minz/index.md:185 +#, markdown-text, no-wrap +msgid "Translation Management" +msgstr "" + +#. type: Plain text +#: en/./developers/Minz/index.md:188 +#, markdown-text +msgid "This part [is explained here](/docs/en/internationalization.md)." +msgstr "" + +#. type: Title ## +#: en/./developers/Minz/index.md:189 +#, markdown-text, no-wrap +msgid "Migration" +msgstr "" + +#. type: Plain text +#: en/./developers/Minz/index.md:192 +#, markdown-text +msgid "Existing documentation includes:" +msgstr "" + +#. type: Bullet: '* ' +#: en/./developers/Minz/index.md:193 +#, markdown-text +msgid "[How to manage migrations](migrations.md)" +msgstr "" + +#. type: Title # +#: en/./developers/Minz/migrations.md:1 +#, markdown-text, no-wrap +msgid "How to manage migrations with Minz" +msgstr "" + +#. type: Plain text +#: 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/./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 "" +"// 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/./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 "" +"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 +#, markdown-text +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 +#, markdown-text, no-wrap +msgid "OPML in FreshRSS" +msgstr "" + +#. type: Plain text +#: 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/./developers/OPML.md:7 +#, markdown-text +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 +#, 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/./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/./developers/OPML.md:14 +#, markdown-text, no-wrap +msgid "FreshRSS OPML extension" +msgstr "" + +#. type: Plain text +#: en/./developers/OPML.md:17 +#, markdown-text +msgid "" +"FreshRSS uses the XML namespace to export/import " +"extended information not covered by the basic OPML specification." +msgstr "" + +#. 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 "" +"` ℹ️ [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 +#, markdown-text +msgid "" +"` [\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: Title ### +#: en/./developers/OPML.md:55 +#, markdown-text, no-wrap +msgid "Dynamic OPML (reading lists)" msgstr "" -#. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:247 +#. type: Bullet: '* ' +#: en/./developers/OPML.md:58 +#, markdown-text 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:" +"`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 +#, markdown-text, no-wrap +msgid "Example" +msgstr "" + +#. type: Fenced code block (xml) +#: en/./developers/OPML.md:61 +#, no-wrap +msgid "" +"\n" +"\n" +"\t\n" +"\t\tFreshRSS OPML extension example\n" +"\t\n" +"\t\n" +"\t\t\n" +"\t\n" +"\n" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:248 -#, no-wrap -msgid "" -"

    \n" -"\t\">\n" -"\t\t\n" -"\t\n" -"

    \n" +#: 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/./developers/03_Backend/05_Extensions.md:257 +#: en/./index.md:6 +#, markdown-text 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." +"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/./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/./index.md:10 +#, markdown-text +msgid "FreshRSS has a lot of features including:" msgstr "" -#. type: Title ### -#: en/./developers/03_Backend/05_Extensions.md:260 -#, no-wrap -msgid "Configuration management" +#. type: Bullet: '* ' +#: en/./index.md:24 +#, markdown-text +msgid "RSS and Atom aggregation" msgstr "" -#. type: Title ## -#: en/./developers/03_Backend/05_Extensions.md:262 -#, no-wrap -msgid "Write an extension for FreshRSS" +#. 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: Plain text -#: en/./developers/03_Backend/05_Extensions.md:265 +#. 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 "" -"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." +"The application is \"responsive,\" which means it adapts to small screens so " +"you can bring articles in your pocket" msgstr "" -#. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:267 +#. type: Bullet: '* ' +#: en/./index.md:24 +#, markdown-text msgid "" -"An extension allows you to easily add functionality to FreshRSS without " -"having to touch the core of the project directly." +"Self-hosted: the code is free (under AGPL3 licence), so you can host your " +"own instance of FreshRSS" msgstr "" -#. type: Title ### -#: en/./developers/03_Backend/05_Extensions.md:268 -#, no-wrap -msgid "Basic files and folders" +#. type: Bullet: '* ' +#: en/./index.md:24 +#, markdown-text +msgid "Multi-user, so you can also host for your friends and family" msgstr "" -#. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:273 -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 " -"is a directory containing a set of mandatory (and optional) files and " -"subdirectories. The convention requires that the main directory name be " -"preceded by an \"x\" to indicate that it is not an extension included by " -"default in FreshRSS." +#. 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/./index.md:25 +#, markdown-text, no-wrap +msgid "Manual Chapters" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:275 -msgid "" -"The main directory of an extension must contain at least two **mandatory** " -"files:" +#: en/./index.md:28 +#, markdown-text +msgid "This documentation is split into different sections:" msgstr "" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:278 +#: en/./index.md:33 +#, markdown-text msgid "" -"A `metadata.json` file that contains a description of the extension. This " -"file is written in JSON." +"[User documentation](./users/02_First_steps.md), where you can discover all " +"the possibilities offered by FreshRSS" msgstr "" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:278 +#: en/./index.md:33 +#, markdown-text msgid "" -"An `extension.php` file containing the entry point of the extension (which " -"is a class that inherits Minz_Extension)." +"[Administrator documentation](./admins/01_Index.md) for detailed " +"installation and maintenance related tasks" msgstr "" -#. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:282 +#. type: Bullet: '* ' +#: en/./index.md:33 +#, 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 " -"should follow our best practice: If you want to write a `HelloWorld` " -"extension, the directory name should be `xExtension-HelloWorld` and the base " -"class name `HelloWorldExtension`." +"[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: Plain text -#: en/./developers/03_Backend/05_Extensions.md:284 +#. type: Bullet: '* ' +#: en/./index.md:33 +#, markdown-text msgid "" -"In the file `freshrss/extensions/xExtension-HelloWorld/extension.php` you " -"need the structure:" +"[Contributor guidelines](./contributing.md) for those who want to help " +"improve FreshRSS" msgstr "" -#. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:284 -#, no-wrap -msgid "" -"class HelloWorldExtension extends Minz_Extension {\n" -"\tpublic function init() {\n" -"\t\t// your code here\n" -"\t}\n" -"}\n" +#. type: Title ## +#: en/./index.md:34 +#, markdown-text, no-wrap +msgid "Demo" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:292 +#: en/./index.md:37 +#, markdown-text msgid "" -"There is an example HelloWorld extension that you can download from [our " -"GitHub repo](https://github.com/FreshRSS/xExtension-HelloWorld)." +"The official demo of FreshRSS is available under " +"[https://demo.freshrss.org/](https://demo.freshrss.org/)." msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:294 -msgid "" -"You may also need additional files or subdirectories depending on your " -"needs:" +#: en/./index.md:39 +#, markdown-text +msgid "Login credentials:" msgstr "" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:300 -msgid "" -"`configure.phtml` is the file containing the form to parameterize your " -"extension" +#: en/./index.md:42 +#, markdown-text +msgid "Username: demo" msgstr "" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:300 +#: en/./index.md:42 +#, markdown-text +msgid "Password: demodemo" +msgstr "" + +#. type: Plain text +#: en/./index.md:44 +#, 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 " -"more interesting to write a complete theme)" +"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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:300 -msgid "A `Controllers` directory containing additional controllers" +#. type: Title ## +#: en/./index.md:45 +#, markdown-text, no-wrap +msgid "Licence" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:300 -msgid "An `i18n` directory containing additional translations" +#. type: Plain text +#: en/./index.md:47 +#, markdown-text +msgid "FreshRSS is licensed under the GNU Affero General Public License v3.0." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:300 -msgid "" -"`layout` and` views` directories to define new views or to overwrite the " -"current views" +#. type: Title # +#: en/./internationalization.md:1 +#, markdown-text, no-wrap +msgid "Contributing to internationalization (i18n)" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:302 +#: en/./internationalization.md:4 +#, 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 " -"detailed description of it." +"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/./developers/03_Backend/05_Extensions.md:303 -#, no-wrap -msgid "The metadata.json file" +#. type: Title ## +#: en/./internationalization.md:5 +#, markdown-text, no-wrap +msgid "Overview" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:306 +#: en/./internationalization.md:8 +#, 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 " -"following entries:" +"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: 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/./developers/03_Backend/05_Extensions.md:313 -msgid "`name`: the name of your extension" +#: en/./internationalization.md:19 +#, markdown-text +msgid "`admin.php` for anything related to FreshRSS administration" msgstr "" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:313 -msgid "" -"`author`: your name, your e-mail address … but there is no specific format " -"to adopt" +#: en/./internationalization.md:19 +#, markdown-text +msgid "`conf.php` for configuration" msgstr "" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:313 -msgid "`description`: a description of your extension" +#: en/./internationalization.md:19 +#, markdown-text +msgid "`feedback.php` contains translations of feedback messages" msgstr "" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:313 -msgid "`version`: the current version number of the extension" +#: en/./internationalization.md:19 +#, markdown-text +msgid "`gen.php` stores what is global to FreshRSS (`gen` stands for “general”)" 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`)" +#: en/./internationalization.md:19 +#, markdown-text +msgid "`index.php` for the main page that lists feeds and the About page" msgstr "" #. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:313 -msgid "" -"`type`: Defines the type of your extension. There are two types: `system` " -"and` user`. We will study this difference right after." +#: 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/./developers/03_Backend/05_Extensions.md:315 -msgid "Only the `name` and` entrypoint` fields are required." +#: en/./internationalization.md:21 +#, markdown-text +msgid "This organization makes it possible to avoid a single huge translation file." msgstr "" -#. type: Title ### -#: en/./developers/03_Backend/05_Extensions.md:316 +#. type: Plain text +#: 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 "Choosing between `system` and `user`" +msgid "" +" [\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/./developers/03_Backend/05_Extensions.md:319 +#: en/./internationalization.md:43 +#, markdown-text msgid "" -"A __user__ extension can be enabled by some users and not by others " -"(typically for user preferences)." +"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/./developers/03_Backend/05_Extensions.md:321 -msgid "A __system__ extension in comparison is enabled for every account." +#: en/./internationalization.md:45 +#, markdown-text +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/./developers/03_Backend/05_Extensions.md:322 -#, no-wrap -msgid "Writing your own extension.php" +#. type: Title ## +#: en/./internationalization.md:46 +#, markdown-text, no-wrap +msgid "Add support for a new language" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:327 +#: en/./internationalization.md:49 +#, markdown-text 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." +"If you want to add support for a language which isn’t supported by FreshRSS " +"yet, you can run this command:" msgstr "" -#. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:329 -msgid "Your class will benefit from four methods to redefine:" +#. type: Fenced code block (sh) +#: en/./internationalization.md:50 +#, no-wrap +msgid "make i18n-add-language lang=[your language code]\n" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:334 +#. type: Plain text +#: en/./internationalization.md:55 +#, 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." +"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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:334 +#. type: Plain text +#: en/./internationalization.md:57 +#, 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 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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:334 -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." +#. type: Title ## +#: en/./internationalization.md:58 +#, markdown-text, no-wrap +msgid "Translate the interface" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:334 +#. type: Plain text +#: en/./internationalization.md:61 +#, 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." +"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/./developers/03_Backend/05_Extensions.md:336 +#: en/./internationalization.md:63 +#, markdown-text msgid "" -"In addition, you will have a number of methods directly inherited from " -"`Minz_Extension` that you should not redefine:" +"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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:340 -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()`." +#. type: Fenced code block (sh) +#: en/./internationalization.md:64 +#, no-wrap +msgid "make i18n-format\n" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:340 +#. type: Plain text +#: en/./internationalization.md:69 +#, markdown-text 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`)." +"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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:340 +#. type: Plain text +#: en/./internationalization.md:71 +#, markdown-text 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` " -"Controller.php` and the name of the " -"`FreshExtension__Controller` class." +"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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:346 -msgid "`registerViews()`" +#. type: Fenced code block (sh) +#: en/./internationalization.md:72 +#, no-wrap +msgid "git grep TODO app/i18n/he\n" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:346 -msgid "`registerTranslates()`" +#. type: Title ## +#: en/./internationalization.md:76 +#, markdown-text, no-wrap +msgid "Acknowledge a false-positive" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:346 -msgid "`registerHook($hook_name, $hook_function)`" +#. 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: Title ### -#: en/./developers/03_Backend/05_Extensions.md:347 +#. type: Fenced code block (sh) +#: en/./internationalization.md:80 #, no-wrap -msgid "The \"hooks\" system" +msgid "make i18n-ignore-key lang=fr key=index.about.version\n" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:350 +#: en/./internationalization.md:85 +#, 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." +"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/./developers/03_Backend/05_Extensions.md:351 -#, no-wrap +#: en/./internationalization.md:89 +#, markdown-text msgid "" -"class HelloWorldExtension extends Minz_Extension\n" -"{\n" -"\tpublic function init() {\n" -"\t\t$this->registerHook('entry_before_display', array($this, " -"'renderEntry'));\n" -"\t}\n" -"\tpublic function renderEntry($entry) {\n" -"\t\t$entry->_content('

    Hello World

    ' . $entry->content());\n" -"\t\treturn $entry;\n" -"\t}\n" -"}\n" +"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: Plain text -#: en/./developers/03_Backend/05_Extensions.md:365 -msgid "The following events are available:" +#. 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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Plain text +#: en/./internationalization.md:95 +#, 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 " -"can still be automatically supported." +"This adds the key to all the files. It’ll be in English, waiting for other " +"translators." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Plain text +#: en/./internationalization.md:97 +#, markdown-text msgid "" -"`entry_before_display` (`function($entry) -> Entry | null`): will be " -"executed every time an entry is rendered. The entry itself (instance of " -"FreshRSS\\_Entry) will be passed as parameter." +"Conversely, you may want to remove a key that is no longer used in the " +"application with:" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 -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. The new entry (instance of FreshRSS\\_Entry) will be passed as " -"parameter." +#. type: Fenced code block (sh) +#: en/./internationalization.md:98 +#, no-wrap +msgid "make i18n-remove-key key=the.key.to.remove\n" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Plain text +#: en/./internationalization.md:103 +#, 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 " -"passed as parameter." +"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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Fenced code block (sh) +#: en/./internationalization.md:104 +#, no-wrap 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 " -"FreshRSS\\_Feed) will be passed as parameter." +"make i18n-update-key key=the.key.to.change value='The new string in " +"English'\n" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 -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" +#. type: Plain text +#: en/./internationalization.md:109 +#, markdown-text +msgid "The key will simply be removed and added back with the new value." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 -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. `
  • New entry
  • `)" +#. type: Title ## +#: en/./internationalization.md:110 +#, markdown-text, no-wrap +msgid "How to access a translation programmatically" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Plain text +#: en/./internationalization.md:113 +#, 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. `
  • New entry
  • `)" +"To access these translations, you must use the `_t()` function (which is a " +"shortcut for `Minz_Translate::t()`). Code example:" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Fenced code block (html) +#: en/./internationalization.md:114 +#, no-wrap 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. `
  • New " -"entry
  • `)" +"

    \n" +"\t\n" +"

    \n" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Plain text +#: en/./internationalization.md:121 +#, markdown-text msgid "" -"`nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** " -"add documentation" +"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: Bullet: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 -msgid "`post_update` (`function(none) -> none`): **TODO** add documentation" +#. type: Plain text +#: 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: '* ' -#: en/./developers/03_Backend/05_Extensions.md:378 +#. type: Plain text +#: en/./internationalization.md:125 +#, markdown-text, no-wrap msgid "" -"`simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** " -"add documentation" +"For instance, the English translation for `gen.auth.keep_logged_in` is `Keep " +"me logged in (%s days)`. 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/./developers/03_Backend/05_Extensions.md:379 +#. type: Fenced code block (php) +#: en/./internationalization.md:126 #, no-wrap -msgid "Writing your own configure.phtml" +msgid "" +"\n" msgstr "" #. type: Plain text -#: en/./developers/03_Backend/05_Extensions.md:382 +#: en/./users/02_First_steps.md:2 +#, 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." +"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: Title # -#: en/./developers/03_Running_tests.md:1 -#, no-wrap -msgid "Running tests" +#. type: Plain text +#: en/./users/02_First_steps.md:4 +#, markdown-text +msgid "" +"This section will guide you to the pages you need to get started. The order " +"is tailored to newcomers." msgstr "" #. type: Plain text -#: en/./developers/03_Running_tests.md:4 +#: en/./users/02_First_steps.md:6 +#, markdown-text msgid "" -"FreshRSS is tested with [PHPUnit](https://phpunit.de/). No code should be " -"merged in `edge` if the tests don’t pass." +"[After installing the application](../admins/03_Installation.md), the first " +"step is to add some feeds. You have a few options:" msgstr "" -#. type: Title ## -#: en/./developers/03_Running_tests.md:5 -#, no-wrap -msgid "Locally" +#. 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: Plain text -#: en/./developers/03_Running_tests.md:8 -msgid "" -"As a developer, you can run the test suite on your PC easily with `make` " -"commands. You can run the test suite with:" +#. 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: Plain text -#: en/./developers/03_Running_tests.md:9 -#, no-wrap -msgid "$ make test\n" +#. 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/./developers/03_Running_tests.md:14 +#: en/./users/02_First_steps.md:12 +#, 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 " -"issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues/new) to let " -"maintainers know about the problem." +"Once you have added your feeds to FreshRSS, it is time to read them. There " +"are three available reading modes:" msgstr "" -#. type: Plain text -#: en/./developers/03_Running_tests.md:16 +#. type: Bullet: '1. ' +#: en/./users/02_First_steps.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 -#: en/./developers/03_Running_tests.md:17 -#, no-wrap -msgid "$ NO_DOCKER=true make test\n" +"[The normal view](03_Main_view.md#normal-view) enables you to quickly read " +"new articles" msgstr "" -#. type: Title ## -#: en/./developers/03_Running_tests.md:21 -#, no-wrap -msgid "Travis" +#. type: Bullet: '2. ' +#: en/./users/02_First_steps.md:16 +#, 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" msgstr "" -#. type: Plain text -#: en/./developers/03_Running_tests.md:24 +#. type: Bullet: '3. ' +#: en/./users/02_First_steps.md:16 +#, 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." +"[The reader view](03_Main_view.md#reader-view) offers you a comfortable " +"reading experience" msgstr "" #. type: Plain text -#: en/./developers/03_Running_tests.md:25 +#: en/./users/02_First_steps.md:18 +#, 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)." +"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/./developers/04_Frontend/01_View_files.md:1 -#, no-wrap -msgid "The .phtml files" +#. type: Bullet: '* ' +#: en/./users/02_First_steps.md:27 +#, markdown-text +msgid "[Organize your feeds in categories](04_Subscriptions.md#feed-management)" msgstr "" -#. type: Title # -#: en/./developers/04_Frontend/01_View_files.md:5 -#, no-wrap -msgid "Writing a URL" +#. type: Bullet: '* ' +#: en/./users/02_First_steps.md:27 +#, markdown-text +msgid "[Change the home page](05_Configuration.md#changing-the-view)" msgstr "" -#. type: Title # -#: en/./developers/04_Frontend/01_View_files.md:9 -#, no-wrap -msgid "Displaying an icon" +#. type: Bullet: '* ' +#: en/./users/02_First_steps.md:27 +#, markdown-text +msgid "[Choose the reading options](05_Configuration.md#reading-options)" msgstr "" -#. type: Title # -#: en/./developers/04_Frontend/02_Design.md:1 -#, no-wrap -msgid "Template file" +#. type: Bullet: '* ' +#: en/./users/02_First_steps.md:27 +#, markdown-text +msgid "[Refresh feeds](09_refreshing_feeds.md)" msgstr "" -#. type: Title # -#: en/./developers/04_Frontend/02_Design.md:5 -#, no-wrap -msgid "Writing a new theme" +#. 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: Title # -#: en/./developers/04_Frontend/02_Design.md:9 -#, no-wrap -msgid "Overriding icons" +#. type: Bullet: '* ' +#: en/./users/02_First_steps.md:27 +#, markdown-text +msgid "" +"[search for an article](10_filter.md#with-the-search-field) published some " +"time ago" msgstr "" -#. type: Title # -#: en/./developers/04_Pull_requests.md:1 -#, no-wrap -msgid "Opening a pull request" +#. 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: Plain text -#: en/./developers/04_Pull_requests.md:4 -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)!" +#. type: Bullet: '* ' +#: en/./users/02_First_steps.md:27 +#, markdown-text +msgid "[Add some extensions](https://github.com/FreshRSS/Extensions)" msgstr "" - -#. type: Plain text -#: en/./developers/04_Pull_requests.md:6 -msgid "" -"When you open a PR, your message will be prefilled with a message based on " -"[a " -"template](https://github.com/FreshRSS/FreshRSS/blob/edge/docs/pull_request_template.md). " -"It contains a checklist to make sure you didn’t forget anything. It is very " -"important to verify you did everything mentioned so documentation is " -"up-to-date, the commit history stays clear and the code is always stable." + +#. 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/./developers/04_Pull_requests.md:8 -msgid "The rest of this document explains specific points." +#: 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/./developers/04_Pull_requests.md:9 -#, no-wrap -msgid "How to rebase your branch on `edge`" +#: en/./users/03_Main_view.md:5 +#, markdown-text, no-wrap +msgid "Normal view" msgstr "" #. type: Plain text -#: en/./developers/04_Pull_requests.md:12 +#: en/./users/03_Main_view.md:8 +#, 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 " -"do that." +"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/03_Main_view.md:9 +#, markdown-text, no-wrap +msgid "Article List" msgstr "" #. type: Plain text -#: en/./developers/04_Pull_requests.md:14 +#: en/./users/03_Main_view.md:18 +#, 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." +"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/./developers/04_Pull_requests.md:15 -#, no-wrap -msgid "Rebasing" +#: en/./users/03_Main_view.md:19 +#, markdown-text, no-wrap +msgid "Normal View Sidebar" msgstr "" #. type: Plain text -#: en/./developers/04_Pull_requests.md:18 +#: en/./users/03_Main_view.md:28 +#, 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 " -"difficult if you’re not at ease with Git since conflicts are harder to " -"resolve." +"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: Title ## +#: en/./users/03_Main_view.md:29 +#, markdown-text, no-wrap +msgid "Global view" msgstr "" #. type: Plain text -#: en/./developers/04_Pull_requests.md:20 +#: en/./users/03_Main_view.md:32 +#, 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 " -"it out." +"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/./developers/04_Pull_requests.md:22 -msgid "To rebase a branch:" +#. type: Title ## +#: en/./users/03_Main_view.md:33 +#, markdown-text, no-wrap +msgid "Reader view" msgstr "" #. type: Plain text -#: en/./developers/04_Pull_requests.md:23 -#, no-wrap +#: en/./users/03_Main_view.md:36 +#, markdown-text 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" +"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/./developers/04_Pull_requests.md:31 +#: en/./users/03_Main_view.md:40 +#, markdown-text msgid "" -"If you feel confident, you can use `git rebase -i edge` to rewrite your " -"history and make it clearer." +"Read more: * [Refreshing the feeds](./09_refreshing_feeds.md) * [Filter the " +"feeds and search](./10_filter.md)" msgstr "" -#. type: Title ### -#: en/./developers/04_Pull_requests.md:32 -#, no-wrap -msgid "Merging" +#. type: Title # +#: en/./users/04_Subscriptions.md:1 +#, markdown-text, no-wrap +msgid "Adding a feed" msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:35 +#. type: Bullet: '1. ' +#: en/./users/04_Subscriptions.md:10 +#, 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 " -"readable. Don’t worry, we will take care of it before merging your PR back " -"into `edge`." -msgstr "" - -#. type: Plain text -#: en/./developers/04_Pull_requests.md:37 -msgid "To merge `edge`:" +"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/./developers/04_Pull_requests.md:38 -#, 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" +#. type: Bullet: '2. ' +#: en/./users/04_Subscriptions.md:10 +#, markdown-text +msgid "In FreshRSS, click the \"**+**\" button next to “Subscriptions management”." msgstr "" -#. type: Title ## -#: en/./developers/04_Pull_requests.md:45 -#, no-wrap -msgid "How to write a Git commit message" +#. type: Bullet: '3. ' +#: en/./users/04_Subscriptions.md:10 +#, markdown-text +msgid "Paste the URL in the “Feed URL” field." msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:48 +#. type: Bullet: '4. ' +#: en/./users/04_Subscriptions.md:10 +#, 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 " -"explain the choices made in the past (the “why?”)" +"(optional): You can select the category for your feed. By default, it will " +"be in “Uncategorized”." msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:50 +#. type: Bullet: '5. ' +#: en/./users/04_Subscriptions.md:10 +#, markdown-text msgid "" -"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.\"" +"(optional): If the subscription requires credentials, you can enter them in " +"the \"HTTP username\" and \"HTTP password\" fields." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/04_Pull_requests.md:52 -msgid "This commit will *add feature X*" +#. type: Bullet: '6. ' +#: en/./users/04_Subscriptions.md:10 +#, markdown-text +msgid "(optional): You can set a timeout for the feed request." msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:54 +#. type: Bullet: '7. ' +#: en/./users/04_Subscriptions.md:10 +#, 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 " -"body is the place where you can clarify the context of your patch. For " -"instance, you can explain what you were doing when you identified a bug, or " -"the problem you had before your patch. Providing this information helps " -"other developers understand why a specific choice was made, especially when " -"a patch introduces a bug that is identified months later." +"(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: Plain text -#: en/./developers/04_Pull_requests.md:56 -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)." +#. type: Title ## +#: en/./users/04_Subscriptions.md:11 +#, markdown-text, no-wrap +msgid "Subscription management" msgstr "" #. type: Plain text -#: en/./developers/04_Pull_requests.md:58 +#: en/./users/04_Subscriptions.md:14 +#, markdown-text msgid "" -"You can find more information about commit messages [on this blog " -"post](https://chris.beams.io/posts/git-commit/)." +"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/./developers/04_Pull_requests.md:59 -#, no-wrap -msgid "How to write tests" -msgstr "" - -#. type: Plain text -#: en/./developers/04_Pull_requests.md:62 -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 " -"appreciate it if you wrote a test that ensures your patch is working." +#: en/./users/04_Subscriptions.md:15 +#, markdown-text, no-wrap +msgid "Category Settings" msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:64 -msgid "" -"We use [PHPUnit](https://phpunit.de/) version 7.5 " -"([documentation](https://phpunit.readthedocs.io/en/7.5/))." +#. type: Title ### +#: en/./users/04_Subscriptions.md:17 +#, markdown-text, no-wrap +msgid "Information" msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:66 -msgid "" -"You’ll find more information on how to run tests [in this " -"document](03_Running_tests.md)." +#. type: Bullet: '* ' +#: en/./users/04_Subscriptions.md:21 +#, markdown-text +msgid "**Title:** Name of category" msgstr "" -#. type: Plain text -#: en/./developers/04_Pull_requests.md:68 +#. type: Bullet: '* ' +#: en/./users/04_Subscriptions.md:21 +#, 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." +"**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/./developers/04_Pull_requests.md:69 -#, no-wrap -msgid "Why you should write documentation" +#: en/./users/04_Subscriptions.md:22 en/./users/05_Configuration.md:115 +#, markdown-text, no-wrap +msgid "Archiving" msgstr "" #. type: Plain text -#: en/./developers/04_Pull_requests.md:72 +#: en/./users/04_Subscriptions.md:25 +#, 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 " -"to their problems. The documentation should not be written “later” or " -"chances are it’ll never be." +"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/04_Subscriptions.md:26 +#, markdown-text, no-wrap +msgid "Feed Settings" msgstr "" #. type: Plain text -#: en/./developers/04_Pull_requests.md:73 +#: en/./users/04_Subscriptions.md:29 +#, markdown-text msgid "" -"Our documentation can still be improved quite a bit, so you’re very welcome " -"if you want to help." +"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/./developers/05_Release_new_version.md:1 -#, no-wrap -msgid "Preparing the release" +#: en/./users/04_Subscriptions.md:30 en/./users/05_Configuration.md:113 +#, markdown-text, no-wrap +msgid "Archival" msgstr "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:4 +#: en/./users/04_Subscriptions.md:33 +#, 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)). " -"This should be done **at least one week in advance**." -msgstr "" - -#. type: Plain text -#: en/./developers/05_Release_new_version.md:6 -msgid "It’s also recommended to make the announcement on mailing@freshrss.org." +"This section will let you override the default settings for feed archiving " +"and update frequency." msgstr "" -#. type: Title # -#: en/./developers/05_Release_new_version.md:7 -#, no-wrap -msgid "Check the dev status" +#. type: Title ### +#: en/./users/04_Subscriptions.md:34 +#, markdown-text, no-wrap +msgid "Login" msgstr "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:10 +#: en/./users/04_Subscriptions.md:37 +#, 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 " -"executed before any publication." +"Some feeds require a username/password submitted over HTTP. These usually " +"aren’t needed for feeds." msgstr "" -#. type: Plain text -#: en/./developers/05_Release_new_version.md:12 -msgid "" -"You must also **make sure that the CHANGELOG file is up to date** with the " -"updates of the version to be released." +#. type: Title ### +#: en/./users/04_Subscriptions.md:38 +#, markdown-text, no-wrap +msgid "Advanced" msgstr "" -#. type: Title # -#: en/./developers/05_Release_new_version.md:13 -#, no-wrap -msgid "Git process" +#. 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/./developers/05_Release_new_version.md:15 -#, no-wrap +#: en/./users/04_Subscriptions.md:43 +#, markdown-text msgid "" -"$ git checkout edge\n" -"$ git pull\n" -"$ vim constants.php\n" -"# Update version number x.y.y.z of FRESHRSS_VERSION\n" -"$ git commit -a\n" -"Version x.y.z\n" -"$ git tag -a x.y.z\n" -"Version x.y.z\n" -"$ git push && git push --tags\n" -msgstr "" - -#. type: Title # -#: en/./developers/05_Release_new_version.md:27 -#, no-wrap -msgid "Updating `update.freshrss.org`" +"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/./developers/05_Release_new_version.md:30 +#: en/./users/04_Subscriptions.md:45 +#, markdown-text msgid "" -"It’s important to update update.freshrss.org since this is the default " -"service for automatic FreshRSS updates." +"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 "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:32 +#: en/./users/04_Subscriptions.md:47 +#, markdown-text msgid "" -"The repository managing the code is located on GitHub: " -"[FreshRSS/update.freshrss.org] " -"(https://github.com/FreshRSS/update.freshrss.org/)." +"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/./developers/05_Release_new_version.md:33 -#, no-wrap -msgid "Writing the update script" +#. type: Title ##### +#: en/./users/04_Subscriptions.md:48 +#, markdown-text, no-wrap +msgid "Example: Rue89" msgstr "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:36 +#: en/./users/04_Subscriptions.md:52 +#, 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." +"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 "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:38 +#: en/./users/04_Subscriptions.md:54 +#, markdown-text, no-wrap 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 " -"URL from which the FreshRSS package will be downloaded (`PACKAGE_URL`). The " -"URL is in the form of " -"`https://codeload.github.com/FreshRSS/FreshRSS/zip/x.y.z`." +"Here we find that the block that encompasses nothing but the content of the " +"article is ```
    ```. 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 ```
    ``` and that’s perfect! The path will be ```#article " +".content```.\n" msgstr "" -#. type: Plain text -#: en/./developers/05_Release_new_version.md:40 -msgid "There are then 5 functions that have to be executed:" +#. 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" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:46 -msgid "" -"`apply_update()` takes care of saving the directory containing the data, " -"checking its structure, downloading the FreshRSS package, deploying it and " -"cleaning it all up. This function is pre-filled but adjustments can be made " -"if necessary (e.g., reorganization of the `./data` structure). It returns " -"`true` if no problem has occurred or a string indicating a problem;" +#. type: Plain text +#: en/./users/04_Subscriptions.md:58 +#, markdown-text +msgid "Examples:" msgstr "" #. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:46 -msgid "" -"`need_info_update()` returns `true` if the user must intervene during the " -"update or `false` if not;" +#: en/./users/04_Subscriptions.md:63 +#, markdown-text +msgid "Rue89: ```#article .content```" msgstr "" #. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:46 -msgid "" -"`ask_info_update()` displays a form to the user if `need_info_update()` has " -"returned `true`;" +#: en/./users/04_Subscriptions.md:63 +#, markdown-text +msgid "PCINpact: ```#actu_content```" msgstr "" #. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:46 -msgid "" -"`save_info_update()` is responsible for saving the information filled out by " -"the user (from the `ask_info_update()` form);" +#: en/./users/04_Subscriptions.md:63 +#, markdown-text +msgid "Lesnumériques: ```article#body div.text.clearfix```" msgstr "" #. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:46 -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 " -"`Minz_Configuration` object, you will benefit from these improvements)." +#: en/./users/04_Subscriptions.md:63 +#, markdown-text +msgid "Phoronix: ```#main .content```" msgstr "" -#. type: Title ## -#: en/./developers/05_Release_new_version.md:47 -#, no-wrap -msgid "Updating the versions file" +#. type: Title ##### +#: en/./users/04_Subscriptions.md:64 +#, markdown-text, no-wrap +msgid "Combining CSS Classes" msgstr "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:50 +#: en/./users/04_Subscriptions.md:67 +#, 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 " -"versions are updated to which other versions." -msgstr "" - -#. type: Plain text -#: en/./developers/05_Release_new_version.md:52 -msgid "Here’s an example of a `versions.php` file:" +"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: Plain text -#: en/./developers/05_Release_new_version.md:53 +#. type: Fenced code block (html) +#: en/./users/04_Subscriptions.md:68 #, no-wrap msgid "" -" '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// DEV\n" -"\t'1.1.2-dev' => 'dev',\n" -"\t'1.1.3-dev' => 'dev',\n" -"\t'1.1.4-dev' => 'dev',\n" -");\n" +"
    \n" +"

    wanted

    \n" +"

    wanted content

    \n" +"

    unwanted content

    \n" +"

    wanted

    \n" +"

    wanted content

    \n" +"

    wanted

    \n" +"

    unwanted content

    \n" +"

    wanted content

    \n" +"
    \n" msgstr "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:68 -msgid "And here’s how this table works:" +#: 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: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:74 -msgid "on the left you can find the N version, on the right the N+1 version;" +#. type: Title #### +#: en/./users/04_Subscriptions.md:83 +#, markdown-text, no-wrap +msgid "Retrieve a truncated feed with external tools" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:74 -msgid "the `x.y.z.z-dev` versions are **all** updated to `edge`;" +#. 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/./developers/05_Release_new_version.md:74 -msgid "stable versions are updated to stable versions;" +#: en/./users/04_Subscriptions.md:89 +#, markdown-text +msgid "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)" msgstr "" #. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:74 -msgid "" -"it’s possible to skip several versions at once, provided that the update " -"scripts support it;" +#: en/./users/04_Subscriptions.md:89 +#, markdown-text +msgid "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:74 -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. As long as the corresponding script does not exist, nothing will " -"happen." +#. type: Title ### +#: en/./users/04_Subscriptions.md:90 +#, markdown-text, no-wrap +msgid "Filter" msgstr "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:76 +#: en/./users/04_Subscriptions.md:93 +#, markdown-text msgid "" -"It’s **very strongly** recommended to keep this file organized according to " -"version numbers by separating stable and dev versions." +"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/./developers/05_Release_new_version.md:77 -#, no-wrap -msgid "Deployment" +#: en/./users/04_Subscriptions.md:94 +#, markdown-text, no-wrap +msgid "Import / export" msgstr "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:80 +#: en/./users/04_Subscriptions.md:97 +#, 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 " -"dev.update.freshrss.org and change the `FRESHRSS_UPDATE_WEBSITE` URL of your " -"FreshRSS instance. Start the update and check that it’s running correctly." +"See [SQLite export/import]( " +"https://github.com/FreshRSS/FreshRSS/tree/edge/cli) as an alternative." msgstr "" -#. type: Plain text -#: en/./developers/05_Release_new_version.md:82 -msgid "" -"When you’re satisfied, update update.freshrss.org with the new script, test " -"it again, and then move on." +#. type: Title ## +#: en/./users/04_Subscriptions.md:98 +#, markdown-text, no-wrap +msgid "Export" msgstr "" -#. type: Title # -#: en/./developers/05_Release_new_version.md:83 -#, no-wrap -msgid "Updating the FreshRSS services" +#. type: Bullet: '1. ' +#: en/./users/04_Subscriptions.md:108 +#, markdown-text +msgid "To export your list of feeds, go to “Subscriptions management”." msgstr "" -#. type: Plain text -#: en/./developers/05_Release_new_version.md:86 -msgid "Two services need to be updated immediately after the update." +#. type: Bullet: '2. ' +#: en/./users/04_Subscriptions.md:108 +#, markdown-text +msgid "Click on “Import / export”" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:89 -msgid "rss.freshrss.org;" +#. type: Bullet: '3. ' +#: en/./users/04_Subscriptions.md:108 +#, markdown-text +msgid "You can select for your export:" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:89 -msgid "demo.freshrss.org (public login: `demo` / `demodemo`)." +#. type: Bullet: ' 1. ' +#: en/./users/04_Subscriptions.md:108 +#, markdown-text +msgid "the list of feeds" msgstr "" -#. type: Title # -#: en/./developers/05_Release_new_version.md:90 -#, no-wrap -msgid "Publicly announce the release" +#. type: Bullet: ' 2. ' +#: en/./users/04_Subscriptions.md:108 +#, markdown-text +msgid "labelled articles" msgstr "" -#. type: Plain text -#: en/./developers/05_Release_new_version.md:93 -msgid "When everything’s working, it’s time to announce the release to the world!" +#. type: Bullet: ' 3. ' +#: en/./users/04_Subscriptions.md:108 +#, markdown-text +msgid "favourite articles" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:98 +#. type: Bullet: ' 4. ' +#: en/./users/04_Subscriptions.md:108 +#, markdown-text msgid "" -"on GitHub by creating[a new " -"release](https://github.com/FreshRSS/FreshRSS/releases/new)" +"and finally, you can select feeds you want to export (by default, all feeds " +"are selected)" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:98 -msgid "" -"on the freshrss.org blog, at least for stable versions (write the article " -"on[FreshRSS/freshrss.org](https://github.com/FreshRSS/freshrss.org))" +#. type: Bullet: '4. ' +#: en/./users/04_Subscriptions.md:108 +#, markdown-text +msgid "Click on “export”." msgstr "" -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:98 -msgid "on Twitter ([@FreshRSS](https://twitter.com/FreshRSS) account)" +#. type: Title ## +#: en/./users/04_Subscriptions.md:109 +#, markdown-text, no-wrap +msgid "Import" msgstr "" -#. type: Bullet: '* ' -#: en/./developers/05_Release_new_version.md:98 -msgid "and on mailing@freshrss.org" +#. type: Bullet: '1. ' +#: en/./users/04_Subscriptions.md:114 +#, markdown-text +msgid "Go to the page “Import / export”." msgstr "" -#. type: Title # -#: en/./developers/05_Release_new_version.md:99 -#, no-wrap -msgid "Starting the next development version" +#. 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: Plain text -#: en/./developers/05_Release_new_version.md:101 -#, no-wrap -msgid "" -"$ git checkout edge\n" -"$ vim constants.php\n" -"# Update the FRESHRSS_VERSION\n" -"$ vim CHANGELOG.md\n" -"# Prepare the changelog for the next version\n" -"$ git add CHANGELOG.md && git commit && git push\n" +#. type: Bullet: '3. ' +#: en/./users/04_Subscriptions.md:114 +#, markdown-text +msgid "Click on “Import”" msgstr "" #. type: Plain text -#: en/./developers/05_Release_new_version.md:110 +#: en/./users/04_Subscriptions.md:122 +#, markdown-text, no-wrap msgid "" -"Also remember to update update.freshrss.org so that it takes the current " -"development version into account." +"> **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: Plain text -#: en/./index.md:2 -msgid "![FreshRSS logo](img/logo_freshrss.png)" +#. type: Title ## +#: en/./users/04_Subscriptions.md:123 +#, markdown-text, no-wrap +msgid "Use bookmarklet" msgstr "" #. type: Plain text -#: en/./index.md:4 +#: en/./users/04_Subscriptions.md:126 +#, 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." +"Bookmarklets are little scripts that you can execute to perform various " +"tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds." msgstr "" -#. type: Plain text -#: en/./index.md:6 -msgid "FreshRSS has a lot of features including:" +#. type: Bullet: '1. ' +#: en/./users/04_Subscriptions.md:129 +#, markdown-text +msgid "Open “Subscriptions management”." msgstr "" -#. type: Bullet: '* ' -#: en/./index.md:18 -msgid "RSS and Atom aggregation" +#. type: Bullet: '2. ' +#: en/./users/04_Subscriptions.md:129 +#, markdown-text +msgid "Click on “Subscription tools”." msgstr "" -#. type: Bullet: '* ' -#: en/./index.md:18 -msgid "Mark article as favorite if you liked it or if you want to read it later" +#. 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: Bullet: '* ' -#: en/./index.md:18 -msgid "Filter and search functionality helps to easily find articles" +#. type: Title # +#: en/./users/05_Configuration.md:2 +#, markdown-text, no-wrap +msgid "Display" msgstr "" -#. type: Bullet: '* ' -#: en/./index.md:18 -msgid "Statistics to show you the publishing frequency all the websites you follow" +#. type: Title ## +#: en/./users/05_Configuration.md:4 +#, markdown-text, no-wrap +msgid "Language" msgstr "" -#. type: Bullet: '* ' -#: en/./index.md:18 -msgid "Import/export of your feeds into OPML format" +#. type: Plain text +#: en/./users/05_Configuration.md:9 +#, markdown-text +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 " +"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: Bullet: '* ' -#: en/./index.md:18 -msgid "Several themes created by the community" +#. type: Plain text +#: en/./users/05_Configuration.md:11 +#, markdown-text +msgid "" +"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: Bullet: '* ' -#: en/./index.md:18 -msgid "\"Google Reader\"-like API to connect Android applications" +#. type: Plain text +#: 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: Bullet: '* ' -#: en/./index.md:18 +#. type: Title ## +#: en/./users/05_Configuration.md:39 +#, markdown-text, no-wrap +msgid "Theme" +msgstr "" + +#. type: Plain text +#: en/./users/05_Configuration.md:42 +#, markdown-text msgid "" -"The application is \"responsive,\" which means it adapts to small screens so " -"you can bring articles in your pocket" +"There’s no accounting for tastes, which is why FreshRSS offers 13 official " +"themes:" msgstr "" -#. type: Bullet: '* ' -#: en/./index.md:18 +#. 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 "" -"Self-hosted: the code is free (under AGPL3 licence), so you can host your " -"own instance of FreshRSS" +"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/./index.md:18 -msgid "Multi-user, so you can also host for your friends and family" +#. 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/./index.md:18 -msgid "And a lot more!" +#. type: Title ## +#: en/./users/05_Configuration.md:63 +#, markdown-text, no-wrap +msgid "Content width" msgstr "" #. type: Plain text -#: en/./index.md:20 -msgid "This documentation is split into different sections:" +#: en/./users/05_Configuration.md:66 +#, 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:" 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/./users/05_Configuration.md:71 +#, markdown-text +msgid "**Fine** displays content up to a maximum width of 550 pixels" msgstr "" #. type: Bullet: '* ' -#: en/./index.md:24 -msgid "" -"[Administrator documentation](./admins/01_Index.html) for detailed " -"installation and maintenance related tasks" +#: en/./users/05_Configuration.md:71 +#, markdown-text +msgid "**Medium** displays content up to a maximum width of 800 pixels" 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/./users/05_Configuration.md:71 +#, markdown-text +msgid "**Large** displays content up to a maximum width of 1000 pixels" msgstr "" #. type: Bullet: '* ' -#: en/./index.md:24 -msgid "" -"[Contributor guidelines](./contributing.md) for those who want to help " -"improve FreshRSS" +#: en/./users/05_Configuration.md:71 +#, markdown-text +msgid "**No limit** displays the content on 100% of the available space" +msgstr "" + +#. type: Title ## +#: en/./users/05_Configuration.md:72 +#, markdown-text, no-wrap +msgid "Article icons" msgstr "" #. type: Plain text -#: en/./users/02_First_steps.md:2 +#: en/./users/05_Configuration.md:75 +#, markdown-text +msgid "Please note that this section only affects normal view." +msgstr "" + +#. type: Plain text +#: en/./users/05_Configuration.md:77 +#, markdown-text +msgid "![Article icons configuration](../img/users/configuration.article.icons.png)" +msgstr "" + +#. type: Plain text +#: en/./users/05_Configuration.md:80 +#, 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." +"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/02_First_steps.md:4 +#: en/./users/05_Configuration.md:84 +#, markdown-text msgid "" -"This section will guide you to the pages you need to get started. The order " -"is tailored to newcomers." +"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/05_Configuration.md:85 +#, markdown-text, no-wrap +msgid "HTML5 notification timeout" msgstr "" #. type: Plain text -#: en/./users/02_First_steps.md:6 +#: en/./users/05_Configuration.md:88 +#, markdown-text msgid "" -"[After installing the application](../admins/03_Installation.md), the first " -"step is to add some feeds. You have a few options:" +"After automatically updating the feeds, FreshRSS can pop up a notification " +"using the HTML5 notification API." msgstr "" -#. type: Bullet: '1. ' -#: en/./users/02_First_steps.md:10 -msgid "[Add a feed manually](04_Subscriptions.md#adding-a-feed)" +#. type: Plain text +#: 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: Bullet: '2. ' -#: en/./users/02_First_steps.md:10 -msgid "[Import an OPML or JSON file](04_Subscriptions.md#import-and-export)" +#. type: Title ## +#: en/./users/05_Configuration.md:91 +#, markdown-text, no-wrap +msgid "Show the navigation button" msgstr "" -#. type: Bullet: '3. ' -#: en/./users/02_First_steps.md:10 -msgid "[Use the bookmarklet](04_Subscriptions.md#use-bookmarklet)" +#. type: Plain text +#: en/./users/05_Configuration.md:94 +#, 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." msgstr "" #. type: Plain text -#: en/./users/02_First_steps.md:12 +#: en/./users/05_Configuration.md:96 +#, markdown-text msgid "" -"Once you have added your feeds to FreshRSS, it is time to read them. There " -"are three availalbe reading modes:" +"![navigation button " +"configuration](../img/users/configuration.navigation.button.png)" msgstr "" -#. type: Bullet: '1. ' -#: en/./users/02_First_steps.md:16 +#. type: Plain text +#: en/./users/05_Configuration.md:98 +#, markdown-text msgid "" -"[The normal view](03_Main_view.md#normal-view) enables you to quickly read " -"new articles" +"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: Bullet: '2. ' -#: en/./users/02_First_steps.md:16 -msgid "" -"[The global view](03_Main_view.md#global-view) shows you an overview of the " -"status of your feeds in one glance" +#. type: Title # +#: en/./users/05_Configuration.md:99 +#, markdown-text, no-wrap +msgid "Reading" msgstr "" -#. type: Bullet: '3. ' -#: en/./users/02_First_steps.md:16 -msgid "" -"[The reader view](03_Main_view.md#reader-view) offers you a comfortable " -"reading experience" +#. type: Title ## +#: en/./users/05_Configuration.md:101 +#, markdown-text, no-wrap +msgid "Number of articles per page" msgstr "" #. type: Plain text -#: en/./users/02_First_steps.md:18 +#: en/./users/05_Configuration.md:104 +#, markdown-text 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:" +"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: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Organize your feeds in categories](04_Subscriptions.md#feed-management)" +#. type: Title ## +#: en/./users/05_Configuration.md:105 +#, markdown-text, no-wrap +msgid "Articles to display" msgstr "" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Change the home page](05_Configuration.md#changing-the-view)" +#. type: Plain text +#: en/./users/05_Configuration.md:108 +#, markdown-text +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: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Choose the reading options](05_Configuration.md#reading-options)" +#. type: Title ## +#: en/./users/05_Configuration.md:109 +#, markdown-text, no-wrap +msgid "Use “lazy load” mode to load images" msgstr "" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Refresh feeds](03_Main_view.md#refreshing-feeds)" +#. type: Plain text +#: 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: Bullet: '* ' -#: en/./users/02_First_steps.md:27 +#. type: Plain text +#: en/./users/05_Configuration.md:118 +#, markdown-text msgid "" -"[Filter articles](03_Main_view.md#filtering-articles) for a fast access to a " -"selection" +"These are the global options for fetching and retaining articles from " +"feeds. They can be overridden by individual feed’s settings." msgstr "" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 +#. type: Title ## +#: en/./users/05_Configuration.md:119 +#, markdown-text, no-wrap +msgid "Maintenance" +msgstr "" + +#. type: Plain text +#: en/./users/05_Configuration.md:122 +#, markdown-text msgid "" -"[search for an article](03_Main_view.md#with-the-search-field) published some time " -"ago" +"This allows for purging/optimizing the current user’s articles in the " +"database." msgstr "" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Access your feeds on a mobile device](06_Mobile_access.md)" +#. type: Title # +#: en/./users/05_Configuration.md:123 +#, markdown-text, no-wrap +msgid "Sharing" msgstr "" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Add some extensions](https://github.com/FreshRSS/Extensions)" +#. type: Plain text +#: en/./users/05_Configuration.md:126 +#, markdown-text +msgid "To make your life easier, you can share articles straight from FreshRSS." msgstr "" -#. type: Bullet: '* ' -#: en/./users/02_First_steps.md:27 -msgid "[Frequently asked questions](07_Frequently_Asked_Questions.md)" +#. type: Plain text +#: en/./users/05_Configuration.md:128 +#, markdown-text +msgid "" +"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: Title # -#: en/./users/03_Main_view.md:1 -#, no-wrap -msgid "Normal view" +#. type: Plain text +#: en/./users/05_Configuration.md:131 +#, markdown-text +msgid "" +"By default, the sharing list is empty. ![Sharing " +"configuration](../img/users/configuration.sharing.png)" msgstr "" -#. type: Title # -#: en/./users/03_Main_view.md:5 -#, no-wrap -msgid "Global view" +#. type: Plain text +#: 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: Title # -#: en/./users/03_Main_view.md:9 -#, no-wrap -msgid "Reader view" +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:138 +#, markdown-text +msgid "Select the desired sharing method in the drop-down list." msgstr "" -#. type: Title # -#: en/./users/03_Main_view.md:13 -#, no-wrap -msgid "Refreshing feeds" +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:138 +#, markdown-text +msgid "Press the ```✚``` button to add it to the list." msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:16 +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:138 +#, 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." +"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: Title ## -#: en/./users/03_Main_view.md:17 -#, no-wrap -msgid "Automatic update" +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:138 en/./users/05_Configuration.md:143 +#, markdown-text +msgid "Submit your changes." msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:20 -msgid "" -"This is the recommended method since you can forget about it once it is " -"configured." +#: en/./users/05_Configuration.md:140 +#, markdown-text +msgid "To remove an item from the list, follow those simple steps:" msgstr "" -#. type: Title ### -#: en/./users/03_Main_view.md:21 -#, no-wrap -msgid "With the actualize_script.php script" +#. 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: Title # +#: en/./users/05_Configuration.md:145 +#, markdown-text, no-wrap +msgid "Shortcuts" msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:24 +#: en/./users/05_Configuration.md:149 +#, 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." +"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: Plain text -#: en/./users/03_Main_view.md:26 +#: en/./users/05_Configuration.md:151 +#, 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." +"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/03_Main_view.md:28 -msgid "Here is an example to trigger article update every hour." +#: en/./users/05_Configuration.md:153 +#, markdown-text +msgid "There are 4 types of shortcuts:" 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: '1. ' +#: en/./users/05_Configuration.md:158 +#, markdown-text +msgid "Views: they allow switching views with ease." msgstr "" -#. type: Plain text -#: 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" +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:158 +#, markdown-text +msgid "Navigation: they allow navigation through articles, feeds, and categories." 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: '1. ' +#: en/./users/05_Configuration.md:158 +#, markdown-text +msgid "" +"Article actions: they allow interactions with an article, like sharing or " +"opening it on the original web-site." msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:38 +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:158 +#, 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." +"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/03_Main_view.md:42 +#: en/./users/05_Configuration.md:161 +#, 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\"" +"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/03_Main_view.md:46 -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\"." +#: en/./users/05_Configuration.md:163 +#, markdown-text +msgid "The same process applies to the user queries." msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:50 +#: en/./users/05_Configuration.md:166 +#, 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\"." +"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/03_Main_view.md:51 -#, no-wrap -msgid "Online cron" +#. type: Title # +#: en/./users/05_Configuration.md:167 +#, markdown-text, no-wrap +msgid "User queries" msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:54 +#: en/./users/05_Configuration.md:171 +#, markdown-text msgid "" -"If you do not have access to the installation server scheduled task, you can " -"still automate the update process." +"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/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/./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/03_Main_view.md:57 -#, no-wrap -msgid "No authentication" +#. type: Title # +#: en/./users/05_Configuration.md:174 +#, markdown-text, no-wrap +msgid "Profile" msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:60 +#: en/./users/05_Configuration.md:177 +#, markdown-text msgid "" -"This is the most straightforward since you have a public instance; there is " -"nothing special to configure:" +"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/03_Main_view.md:61 -#, no-wrap -msgid "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'\n" +#: 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/03_Main_view.md:65 -#, no-wrap -msgid "Form authentication" +#. type: Title # +#: en/./users/05_Configuration.md:182 +#, markdown-text, no-wrap +msgid "Users" msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:68 -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”)." +#. type: Title ## +#: en/./users/05_Configuration.md:186 +#, markdown-text, no-wrap +msgid "Authentication methods" msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:70 -msgid "![Anonymous access configuration](../img/users/anonymous_access.1.png)" +#. type: Title ### +#: en/./users/05_Configuration.md:188 +#, markdown-text, no-wrap +msgid "HTTP Authentication (Apache)" msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:72 -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." +#. type: Bullet: '1. ' +#: en/./users/05_Configuration.md:194 +#, markdown-text +msgid "User control is based on the `.htaccess` file." msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:74 +#. type: Bullet: '2. ' +#: en/./users/05_Configuration.md:194 +#, markdown-text msgid "" -"You can also configure an authentication token to grant special access on " -"the server." +"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: Plain text -#: en/./users/03_Main_view.md:76 -msgid "![Token configuration](../img/users/token.1.png)" +#. 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: Plain text -#: en/./users/03_Main_view.md:78 -msgid "The scheduled task syntax should look as follows:" +#. type: Bullet: '4. ' +#: en/./users/05_Configuration.md:194 +#, markdown-text +msgid "Example `.htaccess` file for a user \"marie\":" msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:79 +#. type: Fenced code block (apache) +#: en/./users/05_Configuration.md:195 #, no-wrap msgid "" -"0 * * * * curl " -"'https://freshrss.example.net/i/?c=feed&a=actualize&token=my-token'\n" +"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/03_Main_view.md:84 +#: en/./users/05_Configuration.md:204 +#, markdown-text msgid "" -"You can also target a different user by adding their username to the query " -"string, with `&user=insert-username`:" +"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/03_Main_view.md:85 -#, no-wrap +#: en/./users/06_Mobile_access.md:2 +#, markdown-text msgid "" -"0 * * * * curl " -"'https://freshrss.example.net/i/?c=feed&a=actualize&user=someone&token=my-token'\n" -msgstr "" - -#. type: Title ### -#: en/./users/03_Main_view.md:89 -#, no-wrap -msgid "HTTP authentication" +"This page assumes you have completed the [server " +"setup](../admins/03_Installation.md)." msgstr "" -#. 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: Title # +#: en/./users/06_Mobile_access.md:3 +#, markdown-text, no-wrap +msgid "Mobile Access" msgstr "" #. 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" +#: 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/03_Main_view.md:97 -#, no-wrap -msgid "Manual update" +#: en/./users/06_Mobile_access.md:8 +#, markdown-text, no-wrap +msgid "Access via Browser" msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:100 +#: en/./users/06_Mobile_access.md:11 +#, 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." +"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/03_Main_view.md:101 -#, no-wrap -msgid "Complete update" +#. type: Title ## +#: en/./users/06_Mobile_access.md:13 +#, markdown-text, no-wrap +msgid "Access via Mobile App" msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:104 +#: en/./users/06_Mobile_access.md:16 +#, markdown-text msgid "" -"This update occurs on all feeds. To trigger it, simply click on the update " -"link in the navigation menu." +"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/03_Main_view.md:106 -msgid "![Navigation menu](../img/users/refresh.1.png)" +#: 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: Plain text -#: en/./users/03_Main_view.md:108 +#. 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:26 +#, markdown-text msgid "" -"When the update starts, a progress bar appears and changes while feeds are " -"processed." +"Under the section “Authentication”, enable the option “Allow API access " +"(required for mobile apps)”." msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:110 -msgid "![Progress bar](../img/users/refresh.5.png)" +#. 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: Title ### -#: en/./users/03_Main_view.md:111 -#, no-wrap -msgid "Partial update" +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:26 +#, markdown-text +msgid "Every user must define an API password." msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:114 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:26 +#, markdown-text msgid "" -"This update occurs on the selected feed only. To trigger it, simply click on " -"the update link in the feed menu." +"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/03_Main_view.md:116 -msgid "![Feed menu](../img/users/refresh.2.png)" +#: en/./users/06_Mobile_access.md:29 +#, markdown-text +msgid "" +"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/03_Main_view.md:117 -#, no-wrap -msgid "Filtering articles" +#. type: Title ### +#: en/./users/06_Mobile_access.md:31 +#, markdown-text, no-wrap +msgid "Testing" msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:120 +#. type: Bullet: '1. ' +#: en/./users/06_Mobile_access.md:38 +#, 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." +"Under the section “Profile”, click on the link like " +"`https://rss.example.net/api/` next to the field “API password”." msgstr "" -#. type: Title ## -#: en/./users/03_Main_view.md:121 -#, no-wrap -msgid "By category" +#. type: Bullet: '2. ' +#: en/./users/06_Mobile_access.md:38 +#, markdown-text +msgid "Click on first link “Check full server configuration”:" msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:124 +#. 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 "" -"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:" +"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: Bullet: ' * ' -#: en/./users/03_Main_view.md:127 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:38 +#, markdown-text msgid "" -"*Main feed* displays only articles from feeds marked as available in that " -"category" +"If you receive any other error message, see the next section “Fix server " +"configuration”." msgstr "" -#. type: Bullet: ' * ' -#: en/./users/03_Main_view.md:127 -msgid "*Favourites* displays only articles marked as favourites" +#. type: Title ### +#: en/./users/06_Mobile_access.md:39 +#, markdown-text, no-wrap +msgid "Fix server configuration" msgstr "" -#. type: Title ## -#: en/./users/03_Main_view.md:128 -#, no-wrap -msgid "By feed" +#. type: Bullet: '* ' +#: en/./users/06_Mobile_access.md:57 +#, markdown-text +msgid "" +"Click on the second link “Check partial server configuration (without `%2F` " +"support)”:" msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:131 -msgid "There are several methods to filter articles by feed:" +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +#, markdown-text +msgid "" +"If you get `PASS`, then the problem is indeed that your server does not " +"accept slashes `/` that are escaped `%2F`." msgstr "" -#. type: Bullet: ' * ' -#: en/./users/03_Main_view.md:136 -msgid "by clicking the feed title in the side panel" +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +#, markdown-text +msgid "" +"With Apache, remember the directive [`AllowEncodedSlashes " +"On`](http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes)" msgstr "" -#. type: Bullet: ' * ' -#: en/./users/03_Main_view.md:136 -msgid "by clicking the feed title in the article details" +#. 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: Bullet: ' * ' -#: en/./users/03_Main_view.md:136 -msgid "by filtering in the feed options from the side panel" +#. 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: Bullet: ' * ' -#: en/./users/03_Main_view.md:136 -msgid "by filtering in the feed configuration" +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +#, markdown-text +msgid "With __Apache__:" msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:138 -msgid "![Feed filter](../img/users/feed.filter.1.png)" +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +#, markdown-text +msgid "" +"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: Title ## -#: en/./users/03_Main_view.md:139 -#, no-wrap -msgid "By status" +#. 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: Plain text -#: en/./users/03_Main_view.md:142 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +#, 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." +"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: Plain text -#: en/./users/03_Main_view.md:144 +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +#, 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." +"Enable " +"[`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html):" msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:146 -msgid "![Attribute filters in 0.7](../img/users/status.filter.0.7.png)" +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +#, markdown-text +msgid "With Debian / Ubuntu: `sudo a2enmod rewrite`" msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:148 -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." +#. type: Bullet: ' * ' +#: en/./users/06_Mobile_access.md:57 +#, markdown-text +msgid "With __nginx__:" msgstr "" -#. 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/06_Mobile_access.md:57 +#, markdown-text +msgid "If you get *Bad Request!*, check your server `PATH_INFO` configuration." msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:152 -msgid "By default, this filter displays only unread articles" +#. 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: Title ## -#: en/./users/03_Main_view.md:153 -#, no-wrap -msgid "By content" +#. 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/03_Main_view.md:156 +#: en/./users/07_Frequently_Asked_Questions.md:2 +#, markdown-text msgid "" -"It is possible to filter articles by their content by inputting a string in " -"the search field." +"We may not have answered all of your questions in the previous sections. The " +"FAQ contains some questions that have not been answered elsewhere." msgstr "" #. type: Title ## -#: en/./users/03_Main_view.md:157 -#, no-wrap -msgid "With the search field" +#: en/./users/07_Frequently_Asked_Questions.md:3 +#, markdown-text, no-wrap +msgid "What is `/i` at the end of the application URL?" msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:160 -msgid "You can use the search field to further refine results:" +#: 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/03_Main_view.md:199 -msgid "by author: `author:name` or `author:'composed name'`" +#: 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, " +"especially when form authentication is used. Also, HTTP requests would be " +"heavier." msgstr "" #. type: Bullet: '* ' -#: en/./users/03_Main_view.md:199 -msgid "by title: `intitle:keyword` or `intitle:'composed keyword'`" +#: 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/```." msgstr "" #. type: Bullet: '* ' -#: en/./users/03_Main_view.md:199 -msgid "by URL: `inurl:keyword` or `inurl:'composed keyword'`" +#: en/./users/07_Frequently_Asked_Questions.md:11 +#, markdown-text +msgid "" +"It avoids problems while serving public resources like ```favicon.ico```, " +"```robots.txt```, etc." msgstr "" #. type: Bullet: '* ' -#: en/./users/03_Main_view.md:199 -msgid "by tag: `#tag`" +#: 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." msgstr "" -#. type: Bullet: '* ' -#: en/./users/03_Main_view.md:199 -msgid "by free-text: `keyword` or `'composed keyword'`" +#. type: Title ## +#: en/./users/07_Frequently_Asked_Questions.md:12 +#, markdown-text, no-wrap +msgid "Why is `robots.txt` located in a sub-folder?" msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:199 -#, no-wrap +#: en/./users/07_Frequently_Asked_Questions.md:15 +#, markdown-text msgid "" -"* by date of discovery, using the [ISO 8601 time interval " -"format](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals): " -"`date:`\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:`\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." +"To increase security, FreshRSS is hosted in two sections. The first section " +"is public (the `./p` folder) and the second section is private (everything " +"else). Therefore the `robots.txt` file is located in the `./p` sub-folder." msgstr "" #. type: Plain text -#: en/./users/03_Main_view.md:204 +#: en/./users/07_Frequently_Asked_Questions.md:18 +#, 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`." +"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 " +", thus making `robots.txt` available at the root " +"of the application." msgstr "" #. 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." +#: en/./users/07_Frequently_Asked_Questions.md:20 +#, markdown-text +msgid "The same principle applies to `favicon.ico` and `.htaccess`." msgstr "" -#. type: Plain text -#: en/./users/03_Main_view.md:208 -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`" +#. type: Title ## +#: en/./users/07_Frequently_Asked_Questions.md:21 +#, markdown-text, no-wrap +msgid "Why do I have errors while registering a feed?" msgstr "" -#. type: Title # -#: en/./users/04_Subscriptions.md:1 -#, no-wrap -msgid "Adding a feed" +#. type: Plain text +#: 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 " +"can be the root of the problem, or FreshRSS can be buggy. The first step is " +"to identify what causes the problem. Here are the steps to follow:" msgstr "" -#. type: Title # -#: en/./users/04_Subscriptions.md:5 -#, no-wrap -msgid "Import and export" +#. type: Bullet: '1. ' +#: 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 " +"it’s not valid, there’s nothing we can do." msgstr "" -#. type: Title # -#: en/./users/04_Subscriptions.md:9 -#, no-wrap -msgid "Use bookmarklet" +#. type: Bullet: '1. ' +#: 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 " +"recognized, there’s nothing we can do." msgstr "" -#. type: Plain text -#: en/./users/04_Subscriptions.md:12 +#. type: Bullet: '1. ' +#: en/./users/07_Frequently_Asked_Questions.md:31 +#, markdown-text msgid "" -"Bookmarklets are little scripts that you can execute to perform various " -"tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds." +"__Verify FreshRSS integration__ with the [demo](https://demo.freshrss.org " +"\"FreshRSS official demo\"). If it’s not working, you need to [create an " +"issue on Github](https://github.com/FreshRSS/FreshRSS/issues/new \"Create an " +"issue for FreshRSS\") so we can have a look at it. If it’s working, there’s " +"probably something fishy with the hosting server." msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/04_Subscriptions.md:16 -msgid "Open \"Subscriptions management\"." +#. type: Title ## +#: en/./users/07_Frequently_Asked_Questions.md:32 +#, markdown-text, no-wrap +msgid "How can you change a forgotten password?" msgstr "" -#. type: Bullet: ' 2. ' -#: en/./users/04_Subscriptions.md:16 -msgid "Click on \"Subscription tools\"." +#. type: Plain text +#: 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 " +"interface is available under ```Administration → Manage users```. Select a " +"user, enter a password, and validate." msgstr "" -#. type: Bullet: ' 3. ' -#: en/./users/04_Subscriptions.md:16 +#. type: Plain text +#: en/./users/07_Frequently_Asked_Questions.md:38 +#, markdown-text msgid "" -"Drag the \"Subscribe\" button to your bookmark toolbar or right click and " -"choose your browser’s \"Bookmark link\" action." +"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 " +"mentioning that you must have access to PHP CLI. Open a terminal, and type " +"the following command:" msgstr "" -#. type: Title # -#: en/./users/04_Subscriptions.md:17 +#. type: Fenced code block (sh) +#: en/./users/07_Frequently_Asked_Questions.md:39 #, no-wrap -msgid "Feed management" +msgid "./cli/update_user.php --user --password \n" msgstr "" -#. type: Title # -#: en/./users/05_Configuration.md:2 -#, no-wrap -msgid "Display" +#. type: Plain text +#: en/./users/07_Frequently_Asked_Questions.md:44 +#, markdown-text +msgid "" +"For more information on that matter, please refer to the [dedicated " +"documentation](https://github.com/FreshRSS/FreshRSS/blob/edge/cli/README.md)." msgstr "" #. type: Title ## -#: en/./users/05_Configuration.md:4 -#, no-wrap -msgid "Language" -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/./users/07_Frequently_Asked_Questions.md:45 +#, markdown-text, no-wrap +msgid "Permissions under SELinux" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:11 +#: en/./users/07_Frequently_Asked_Questions.md:48 +#, 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." +"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 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/05_Configuration.md:13 +#. type: Fenced code block (sh) +#: en/./users/07_Frequently_Asked_Questions.md:49 +#, no-wrap msgid "" -"Available languages are: cz, de, en, es, fr, he, it, ko, nl, oc, pt-br, ru, " -"tr, zh-cn." +"semanage fcontext -a -t httpd_sys_rw_content_t " +"'/usr/share/FreshRSS/data(/.*)?'\n" +"restorecon -Rv /usr/share/FreshRSS/data\n" msgstr "" #. type: Title ## -#: en/./users/05_Configuration.md:14 -#, no-wrap -msgid "Theme" +#: 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/05_Configuration.md:17 +#: en/./users/07_Frequently_Asked_Questions.md:57 +#, markdown-text msgid "" -"There’s no accounting for tastes, which is why FreshRSS offers eight " -"official themes:" +"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 the faulty URL while keeping the exact same wording " +"throughout the application." msgstr "" -#. type: Bullet: ' * ' -#: en/./users/05_Configuration.md:26 -msgid "*Blue Lagoon* by **Mister aiR**" +#. type: Plain text +#: 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 " +"accessed." msgstr "" -#. type: Bullet: ' * ' -#: en/./users/05_Configuration.md:26 -msgid "*Dark* by **AD**" +#. type: Plain text +#: en/./users/07_Frequently_Asked_Questions.md:61 +#, markdown-text +msgid "Examples with _uBlock_:" msgstr "" -#. type: Bullet: ' * ' -#: en/./users/05_Configuration.md:26 -msgid "*Flat design* by **Marien Fressinaud**" +#. 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/05_Configuration.md:26 -msgid "*Origine* by **Marien Fressinaud**" +#. 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: Bullet: ' * ' -#: en/./users/05_Configuration.md:26 -msgid "*Origine-compact* by **Kevin Papst**" +#. type: Title ## +#: en/./users/07_Frequently_Asked_Questions.md:65 +#, markdown-text, no-wrap +msgid "Problems with firewalls" msgstr "" -#. type: Bullet: ' * ' -#: en/./users/05_Configuration.md:26 -msgid "*Pafat* by **Plopoyop**" +#. 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: Bullet: ' * ' -#: en/./users/05_Configuration.md:26 -msgid "*Screwdriver* by **Mister aiR**" +#. 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/05_Configuration.md:26 -msgid "*Swage* by **Patrick Crandol**" +#. 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: Plain text -#: en/./users/05_Configuration.md:28 +#. type: Bullet: '* ' +#: en/./users/07_Frequently_Asked_Questions.md:73 +#, 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)." +"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/05_Configuration.md:30 +#: en/./users/07_Frequently_Asked_Questions.md:75 +#, 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: Title ## -#: en/./users/05_Configuration.md:31 -#, no-wrap -msgid "Content width" +"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/05_Configuration.md:34 +#: en/./users/07_Frequently_Asked_Questions.md:76 +#, 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:" -msgstr "" - -#. type: Bullet: ' * ' -#: en/./users/05_Configuration.md:39 -msgid "**Fine** displays content up to a maximum width of 550 pixels" -msgstr "" - -#. type: Bullet: ' * ' -#: en/./users/05_Configuration.md:39 -msgid "**Medium** displays content up to a maximum width of 800 pixels" +"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: Bullet: ' * ' -#: en/./users/05_Configuration.md:39 -msgid "**Large** displays content up to a maximum width of 1000 pixels" +#. type: Title # +#: en/./users/08_sharing_services.md:1 +#, markdown-text, no-wrap +msgid "Sharing Services" msgstr "" -#. type: Bullet: ' * ' -#: en/./users/05_Configuration.md:39 -msgid "**No limit** displays the content on 100% of the available space" +#. 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/05_Configuration.md:40 -#, no-wrap -msgid "Article icons" +#: en/./users/08_sharing_services.md:5 +#, markdown-text, no-wrap +msgid "Available Services: Simple Sharing" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:43 -msgid "Please note that this section only affects normal view." +#: 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: Plain text -#: en/./users/05_Configuration.md:45 -msgid "![Article icons configuration](../img/users/configuration.article.icons.png)" +#. 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: Plain text -#: en/./users/05_Configuration.md:48 -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." +#. type: Title ## +#: en/./users/08_sharing_services.md:40 +#, markdown-text, no-wrap +msgid "Configuration" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:52 +#: en/./users/08_sharing_services.md:43 +#, 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." +"Select the needed sharing services in the configuration menu (Configuration " +"/ Sharing)." msgstr "" #. type: Title ## -#: en/./users/05_Configuration.md:53 -#, no-wrap -msgid "HTML5 notification timout" +#: en/./users/08_sharing_services.md:44 +#, markdown-text, no-wrap +msgid "Usage" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:56 +#: en/./users/08_sharing_services.md:47 +#, markdown-text msgid "" -"After automatically updating the feeds, FreshRSS can pop up a notification " -"using the HTML5 notification API." +"Activate the sharing menu in configuration menu (Configuration / " +"Display). It is only available for the bottom line." 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/./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/05_Configuration.md:59 -#, no-wrap -msgid "Show the navigation button" +#: en/./users/08_sharing_services.md:50 +#, markdown-text, no-wrap +msgid "Add More Sharing Services" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:62 +#: en/./users/08_sharing_services.md:52 +#, 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." +"Please open a new issue on " +"[GitHub](https://github.com/FreshRSS/FreshRSS/issues) and support us with " +"information." msgstr "" -#. type: Plain text -#: en/./users/05_Configuration.md:64 -msgid "" -"![navigation button " -"configuration](../img/users/configuration.navigation.button.png)" +#. type: Title # +#: en/./users/09_refreshing_feeds.md:1 +#, markdown-text, no-wrap +msgid "Refreshing feeds" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:66 +#: en/./users/09_refreshing_feeds.md:4 +#, 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." -msgstr "" - -#. type: Title # -#: en/./users/05_Configuration.md:67 -#, no-wrap -msgid "Reading" +"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: Title ## -#: en/./users/05_Configuration.md:71 en/./users/05_Configuration.md:154 -#, no-wrap -msgid "Archival" +#. type: Bullet: '- ' +#: en/./users/09_refreshing_feeds.md:17 +#, markdown-text +msgid "[Manual update](#manual-update)" msgstr "" -#. type: Title # -#: en/./users/05_Configuration.md:75 -#, no-wrap -msgid "Sharing" +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +#, markdown-text +msgid "[Complete update](#complete-update)" msgstr "" -#. type: Plain text -#: en/./users/05_Configuration.md:78 -msgid "To make your life easier, you can share articles straight from FreshRSS." +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +#, markdown-text +msgid "[Partial update](#partial-update)" msgstr "" -#. type: Plain text -#: en/./users/05_Configuration.md:80 -msgid "" -"At the moment, FreshRSS supports 18 sharing methods, ranging from " -"self-hosted services (Shaarli, etc.) to proprietary services (Facebook, " -"etc.)." +#. type: Bullet: '- ' +#: en/./users/09_refreshing_feeds.md:17 +#, markdown-text +msgid "[Automatic update with cron](#automatic-update-with-cron)" msgstr "" -#. type: Plain text -#: en/./users/05_Configuration.md:83 -msgid "" -"By default, the sharing list is empty. ![Sharing " -"configuration](../img/users/configuration.sharing.png)" +#. type: Bullet: '- ' +#: en/./users/09_refreshing_feeds.md:17 +#, markdown-text +msgid "[Online cron](#online-cron)" 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:" +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +#, markdown-text +msgid "[For Form Authentication](#for-form-authentication)" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:90 -msgid "Select the desired sharing method in the drop-down list." +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +#, markdown-text +msgid "[For HTTP authentication](#for-http-authentication)" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:90 -msgid "Press the ```✚``` button to add it to the list." +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +#, markdown-text +msgid "[For No authentication None](#for-no-authentication-none)" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:90 +#. type: Bullet: '- ' +#: en/./users/09_refreshing_feeds.md:17 +#, 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)." +"[Feed configuration of “Do not automatically refresh more often " +"than”](#feed-configuration-of-do-not-automatically-refresh-more-often-than)" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:90 en/./users/05_Configuration.md:95 -msgid "Submit your changes." +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +#, markdown-text +msgid "[Background](#background)" msgstr "" -#. type: Plain text -#: en/./users/05_Configuration.md:92 -msgid "To remove an item from the list, follow those simple steps:" +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +#, markdown-text +msgid "[Default value](#default-value)" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:95 -msgid "Press the ```❌``` button next to the share method you want to remove." +#. type: Bullet: ' - ' +#: en/./users/09_refreshing_feeds.md:17 +#, markdown-text +msgid "[Individual feed configuration](#individual-feed-configuration)" msgstr "" -#. type: Title # -#: en/./users/05_Configuration.md:96 -#, no-wrap -msgid "Shortcuts" +#. type: Title ## +#: en/./users/09_refreshing_feeds.md:18 +#, markdown-text, no-wrap +msgid "Manual update" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:100 +#: en/./users/09_refreshing_feeds.md:21 +#, 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." +"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/05_Configuration.md:102 +#: en/./users/09_refreshing_feeds.md:25 +#, markdown-text msgid "" -"Of course, if you’re not satisfied with the key mapping, you can change you " -"configuration to fit your needs." +"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/05_Configuration.md:104 -msgid "There are 4 types of shortcuts:" +#: en/./users/09_refreshing_feeds.md:27 +#, markdown-text +msgid "![Navigation menu](../img/users/refresh.1.png)" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:109 -msgid "Views: they allow switching views with ease." +#. 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: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:109 -msgid "Navigation: they allow navigation through articles, feeds, and categories." +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:31 +#, markdown-text +msgid "![Progress bar](../img/users/refresh.5.png)" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:109 -msgid "" -"Article actions: they allow interactions with an article, like sharing or " -"opening it on the original web-site." +#. type: Title ### +#: en/./users/09_refreshing_feeds.md:32 +#, markdown-text, no-wrap +msgid "Partial update" msgstr "" -#. type: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:109 +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:35 +#, markdown-text msgid "" -"Other actions: they allow other interactions with the application, like " -"opening the user queries menu or accessing the documentation." +"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/05_Configuration.md:112 -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." +#: en/./users/09_refreshing_feeds.md:37 +#, markdown-text +msgid "![Feed menu](../img/users/refresh.2.png)" msgstr "" -#. type: Plain text -#: en/./users/05_Configuration.md:114 -msgid "The same process applies to the user queries." +#. type: Title ## +#: en/./users/09_refreshing_feeds.md:38 +#, markdown-text, no-wrap +msgid "Automatic update with cron" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:117 -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." +#: en/./users/09_refreshing_feeds.md:41 +#, markdown-text +msgid "This is the recommended method." msgstr "" -#. type: Title # -#: en/./users/05_Configuration.md:118 -#, no-wrap -msgid "User queries" +#. 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/05_Configuration.md:122 +#: en/./users/09_refreshing_feeds.md:45 +#, 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." +"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/05_Configuration.md:124 -msgid "At the moment, there is no helper to build a user query from here." +#: en/./users/09_refreshing_feeds.md:47 +#, markdown-text +msgid "Here is an example to trigger article update every hour." msgstr "" -#. type: Title # -#: en/./users/05_Configuration.md:125 +#. type: Fenced code block (cron) +#: en/./users/09_refreshing_feeds.md:48 #, no-wrap -msgid "Users" +msgid "" +"0 * * * * php /path/to/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log " +"2>&1\n" msgstr "" #. type: Title ## -#: en/./users/05_Configuration.md:129 -#, no-wrap -msgid "Authentication methods" +#: en/./users/09_refreshing_feeds.md:52 +#, markdown-text, no-wrap +msgid "Online cron" msgstr "" -#. type: Title ### -#: en/./users/05_Configuration.md:131 -#, no-wrap -msgid "HTTP Authentication (Apache)" +#. 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: Bullet: ' 1. ' -#: en/./users/05_Configuration.md:137 -msgid "User control is based on the `.htaccess` file." +#. 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: (it could be " +"different depending on your installation). Depending on your application " +"authentication method, you need to adapt the scheduled task." msgstr "" -#. type: Bullet: ' 2. ' -#: en/./users/05_Configuration.md:137 -msgid "" -"It is best practice to place the `.htaccess` file in the `./i/` subdirectory " -"so the API and other third party services can work." +#. 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: Bullet: ' 3. ' -#: en/./users/05_Configuration.md:137 +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:64 +#, 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!" +"- Parameter \"force\" " +" If *force* is " +"set to 1 all feeds will be refreshed at once." msgstr "" -#. type: Bullet: ' 4. ' -#: en/./users/05_Configuration.md:137 -msgid "Example `.htaccess` file for a user \"marie\":" +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:68 +#, markdown-text +msgid "" +"- Parameter \"ajax\" " +" Only a status " +"site is returned and not a complete website. Example: \"OK\"" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:138 -#, no-wrap +#: en/./users/09_refreshing_feeds.md:72 +#, markdown-text msgid "" -"AuthUserFile /home/marie/repertoire/.htpasswd\n" -"AuthGroupFile /dev/null\n" -"AuthName \"Chez Marie\"\n" -"AuthType Basic\n" -"Require user marie\n" +"- Parameter \"maxFeeds\" " +" If " +"*maxFeeds* is set the configured amount of feeds is refreshed at once. The " +"default setting is \"10\"." msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:147 +#: en/./users/09_refreshing_feeds.md:76 +#, markdown-text msgid "" -"More information can be found in the [Apache " -"documentation](http://httpd.apache.org/docs/trunk/howto/auth.html#gettingitworking)." +"- Parameter \"token\" " +" " +"Security parameter to prevent unauthorized refreshes. For detailed " +"Documentation see \"Form authentication\"." msgstr "" -#. type: Title # -#: en/./users/05_Configuration.md:148 -#, no-wrap -msgid "Subscription management" +#. type: Title ### +#: en/./users/09_refreshing_feeds.md:77 +#, markdown-text, no-wrap +msgid "For Form Authentication" msgstr "" -#. type: Title ## -#: en/./users/05_Configuration.md:150 -#, no-wrap -msgid "Information" +#. 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: Title ## -#: en/./users/05_Configuration.md:158 -#, no-wrap -msgid "Login" +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:82 +#, markdown-text +msgid "![Token configuration](../img/users/token.1.png)" msgstr "" -#. type: Title ## -#: en/./users/05_Configuration.md:162 -#, no-wrap -msgid "Advanced" +#. 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: Title ### -#: en/./users/05_Configuration.md:164 -#, no-wrap -msgid "Retrieve a truncated stream from within FreshRSS" +#. 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/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. :)" +#: en/./users/09_refreshing_feeds.md:88 +#, markdown-text +msgid "" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:169 +#: en/./users/09_refreshing_feeds.md:90 +#, 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 " -"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!" +"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/05_Configuration.md:171 -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)." +#: en/./users/09_refreshing_feeds.md:92 +#, markdown-text +msgid "![Anonymous access configuration](../img/users/anonymous_access.1.png)" msgstr "" -#. type: Title #### -#: en/./users/05_Configuration.md:172 -#, no-wrap -msgid "Example: Rue89" +#. type: Title ### +#: en/./users/09_refreshing_feeds.md:93 +#, markdown-text, no-wrap +msgid "For HTTP authentication" msgstr "" #. type: Plain text -#: en/./users/05_Configuration.md:175 +#: en/./users/09_refreshing_feeds.md:96 +#, 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!)." +"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/05_Configuration.md:177 -#, no-wrap +#: en/./users/09_refreshing_feeds.md:98 +#, markdown-text, no-wrap msgid "" -"Here we find that the block that encompasses nothing but the content of the " -"article is ```
    ```. 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 ```
    ``` and that’s perfect! The path will be ```#article " -".content```.\n" +"**Note:** This method is discouraged as your credentials are stored in plain " +"text.\n" msgstr "" -#. type: Title #### -#: en/./users/05_Configuration.md:178 +#. type: Fenced code block (cron) +#: en/./users/09_refreshing_feeds.md:99 #, no-wrap msgid "" -"Add the corresponding classes to the article CSS path on the feed " -"configuration page. Examples:" -msgstr "" - -#. type: Bullet: '* ' -#: en/./users/05_Configuration.md:184 -msgid "Rue89: ```#article .content```" -msgstr "" - -#. type: Bullet: '* ' -#: en/./users/05_Configuration.md:184 -msgid "PCINpact: ```#actu_content```" +"0 * * * * curl -u alice:password123 " +"'https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=10&ajax=1&user=alice'\n" msgstr "" -#. type: Bullet: '* ' -#: en/./users/05_Configuration.md:184 -msgid "Lesnumériques: ```article#body div.text.clearfix```" +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:104 +#, markdown-text +msgid "On some systems, that syntax might also work:" msgstr "" -#. type: Bullet: '* ' -#: en/./users/05_Configuration.md:184 -msgid "Phoronix: ```#main .content```" +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:106 +#, markdown-text +msgid "" msgstr "" #. type: Title ### -#: en/./users/05_Configuration.md:185 -#, no-wrap -msgid "Retrieve a truncated stream with external tools" +#: en/./users/09_refreshing_feeds.md:107 +#, markdown-text, no-wrap +msgid "For No authentication (None)" 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/09_refreshing_feeds.md:110 +#, markdown-text +msgid "" +"If your FreshRSS instance uses no authentication (public instance, default " +"user):" msgstr "" -#. type: Bullet: '* ' -#: en/./users/05_Configuration.md:190 -msgid "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)" +#. type: Plain text +#: en/./users/09_refreshing_feeds.md:112 +#, markdown-text +msgid "" msgstr "" -#. type: Bullet: '* ' -#: en/./users/05_Configuration.md:190 -msgid "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)" +#. 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/06_Fever_API.md:1 -#, no-wrap -msgid "FreshRSS - Fever API implementation" +#. type: Title ### +#: en/./users/09_refreshing_feeds.md:115 +#, markdown-text, no-wrap +msgid "Background" msgstr "" #. type: Plain text -#: en/./users/06_Fever_API.md:5 +#: en/./users/09_refreshing_feeds.md:118 +#, 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." -msgstr "" - -#. type: Title ## -#: en/./users/06_Fever_API.md:6 -#, no-wrap -msgid "RSS clients" +"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/06_Fever_API.md:11 +#: en/./users/09_refreshing_feeds.md:120 +#, 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." +"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/06_Fever_API.md:12 -#, no-wrap -msgid "Usage & Authentication" +#: en/./users/09_refreshing_feeds.md:121 +#, markdown-text, no-wrap +msgid "Default value" msgstr "" #. type: Plain text -#: en/./users/06_Fever_API.md:16 +#: en/./users/09_refreshing_feeds.md:124 +#, 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." +"The default value of “Do not automatically refresh more often than” is set " +"in Configuration -> Archiving.\n" msgstr "" #. type: Plain text -#: en/./users/06_Fever_API.md:18 +#: en/./users/09_refreshing_feeds.md:126 +#, markdown-text msgid "" -"Then point your mobile application to the `fever.php` address " -"(e.g. `https://freshrss.example.net/api/fever.php`)." +"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/06_Fever_API.md:19 en/./users/06_Mobile_access.md:44 -#, no-wrap -msgid "Compatible clients" +#. type: Title ### +#: en/./users/09_refreshing_feeds.md:127 +#, markdown-text, no-wrap +msgid "Individual feed configuration" msgstr "" #. type: Plain text -#: en/./users/06_Fever_API.md:22 -msgid "Tested with:" +#: 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/06_Fever_API.md:25 -#, no-wrap +#: en/./users/09_refreshing_feeds.md:134 +#, markdown-text msgid "" -"* Android\n" -" * " -"[Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) " -"(Closed source)\n" +"Read more: - [Normal, Global and Reader view](./03_Main_view.md) - [Filter " +"the feeds and search](./10_filter.md)" msgstr "" -#. type: Plain text -#: en/./users/06_Fever_API.md:30 -#, 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" +#. 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/06_Fever_API.md:33 -#, no-wrap +#: en/./users/10_filter.md:7 +#, markdown-text msgid "" -"* MacOS\n" -" * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial)\n" +"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/06_Fever_API.md:35 -#, no-wrap -msgid "Features" +#: en/./users/10_filter.md:8 +#, markdown-text, no-wrap +msgid "By category" msgstr "" #. type: Plain text -#: en/./users/06_Fever_API.md:38 -msgid "The following features are implemented:" -msgstr "" - -#. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:48 -msgid "fetching categories" +#: 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/06_Fever_API.md:48 -msgid "fetching feeds" +#: 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/06_Fever_API.md:48 -msgid "" -"fetching RSS items (new, favorites, unread, by_id, by_feed, by_category, " -"since)" +#: en/./users/10_filter.md:14 +#, markdown-text +msgid "*Favourites* displays only articles marked as favourites" msgstr "" -#. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:48 -msgid "fetching favicons" +#. type: Title ## +#: en/./users/10_filter.md:15 +#, markdown-text, no-wrap +msgid "By feed" msgstr "" -#. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:48 -msgid "setting read marker for item(s)" +#. 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/06_Fever_API.md:48 -msgid "setting starred marker for item(s)" +#: en/./users/10_filter.md:23 +#, markdown-text +msgid "by clicking the feed title in the side panel" msgstr "" #. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:48 -msgid "setting read marker for feed" +#: en/./users/10_filter.md:23 +#, markdown-text +msgid "by clicking the feed title in the article details" msgstr "" #. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:48 -msgid "setting read marker for category" +#: en/./users/10_filter.md:23 +#, markdown-text +msgid "by filtering in the feed options from the side panel" msgstr "" #. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:48 -msgid "supports FreshRSS extensions, which use the `entry_before_display` hook" +#: en/./users/10_filter.md:23 +#, markdown-text +msgid "by filtering in the feed configuration" msgstr "" #. type: Plain text -#: en/./users/06_Fever_API.md:50 -msgid "The following features are not supported:" -msgstr "" - -#. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:52 -msgid "" -"**Hot Links** aka **hot** as there is nothing in FreshRSS yet that is " -"similar or could be used to simulate it." +#: en/./users/10_filter.md:25 +#, markdown-text +msgid "![Feed filter](../img/users/feed.filter.1.png)" msgstr "" #. type: Title ## -#: en/./users/06_Fever_API.md:53 -#, no-wrap -msgid "Testing and debugging" +#: en/./users/10_filter.md:26 +#, markdown-text, no-wrap +msgid "By status" msgstr "" #. type: Plain text -#: en/./users/06_Fever_API.md:56 +#: en/./users/10_filter.md:29 +#, 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/)." +"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/06_Fever_API.md:58 +#: en/./users/10_filter.md:31 +#, markdown-text msgid "" -"Configure a POST request to the URL " -"https://freshrss.example.net/api/fever.php?api which should give you the " -"result:" +"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: 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/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/06_Fever_API.md:58 -#, no-wrap +#: en/./users/10_filter.md:35 +#, markdown-text msgid "" -"{\n" -"\t\"api_version\": 3,\n" -"\t\"auth\": 0\n" -"}\n" +"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/06_Fever_API.md:65 -msgid "Great, the base setup seems to work!" +#: 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/06_Fever_API.md:68 -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: 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" +#: en/./users/10_filter.md:39 +#, markdown-text +msgid "By default, this filter displays only unread articles" 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" +#. type: Title ## +#: en/./users/10_filter.md:40 +#, markdown-text, no-wrap +msgid "By content" msgstr "" #. type: Plain text -#: en/./users/06_Fever_API.md:74 +#: en/./users/10_filter.md:43 +#, 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`:" +"It is possible to filter articles by their content by inputting a string in " +"the search field." msgstr "" -#. type: Plain text -#: en/./users/06_Fever_API.md:75 -#, no-wrap -msgid "" -"curl -s -F \"api_key=$api_key\" " -"'https://freshrss.example.net/api/fever.php?api'\n" +#. type: Title ## +#: en/./users/10_filter.md:44 +#, markdown-text, no-wrap +msgid "With the search field" msgstr "" #. type: Plain text -#: en/./users/06_Fever_API.md:80 -msgid "This should give:" +#: en/./users/10_filter.md:47 +#, markdown-text +msgid "You can use the search field to further refine results:" msgstr "" -#. type: Plain text -#: en/./users/06_Fever_API.md:80 -#, no-wrap -msgid "" -"{\n" -"\t\"api_version\": 3,\n" -"\t\"auth\": 1,\n" -"\t\"last_refreshed_on_time\": \"1520013061\"\n" -"}\n" +#. 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: Plain text -#: en/./users/06_Fever_API.md:88 -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." +#. type: Bullet: '* ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "by author: `author:name` or `author:'composed name'`" msgstr "" -#. type: Plain text -#: en/./users/06_Fever_API.md:90 -msgid "Some basic calls are:" +#. type: Bullet: '* ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "by title: `intitle:keyword` or `intitle:'composed keyword'`" msgstr "" #. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:100 -msgid "https://freshrss.example.net/api/fever.php?api&items" +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "by URL: `inurl:keyword` or `inurl:'composed keyword'`" msgstr "" #. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:100 -msgid "https://freshrss.example.net/api/fever.php?api&feeds" +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "by tag: `#tag` or `#tag+with+whitespace`" msgstr "" #. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:100 -msgid "https://freshrss.example.net/api/fever.php?api&groups" +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "by free-text: `keyword` or `'composed keyword'`" msgstr "" #. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:100 -msgid "https://freshrss.example.net/api/fever.php?api&unread_item_ids" +#: 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:`" msgstr "" -#. type: Bullet: '* ' -#: en/./users/06_Fever_API.md:100 -msgid "https://freshrss.example.net/api/fever.php?api&saved_item_ids" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "From a specific day, or month, or year:" 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: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:2014-03-30`" 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: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:2014-03` or `date:201403`" 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: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:2014`" 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: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "From a specific time of a given day:" msgstr "" -#. type: Plain text -#: en/./users/06_Fever_API.md:102 -msgid "" -"Replace `some_id` with a real ID from your `freshrss_username_entry` " -"database." +#. 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: Title ### -#: en/./users/06_Fever_API.md:103 -#, no-wrap -msgid "Debugging" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:2014-02--2014-04`" msgstr "" -#. type: Plain text -#: en/./users/06_Fever_API.md:106 -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:" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:2014-02/04`" msgstr "" -#. 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" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:2014-02-03/05`" msgstr "" -#. type: Plain text -#: en/./users/06_Fever_API.md:112 -msgid "" -"Then use your RSS client to query the API and afterwards check the file " -"`fever.log`." +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:2014-02-03T22:00/22:15`" msgstr "" -#. type: Title ## -#: en/./users/06_Fever_API.md:113 -#, no-wrap -msgid "Credits" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:2014-02-03T22:00/15`" msgstr "" -#. type: Plain text -#: en/./users/06_Fever_API.md:115 -msgid "" -"This plugin was inspired by the " -"[tinytinyrss-fever-plugin](https://github.com/dasmurphy/tinytinyrss-fever-plugin)." +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "After a given date:" msgstr "" -#. type: Plain text -#: en/./users/06_Mobile_access.md:2 -msgid "" -"This page assumes you have completed the [server " -"setup](../admins/02_Installation.md)." +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:2014-03/`" msgstr "" -#. type: Title # -#: en/./users/06_Mobile_access.md:3 -#, no-wrap -msgid "Enable the API in FreshRSS" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "Before a given date:" 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/10_filter.md:93 +#, markdown-text +msgid "`date:/2014-03`" msgstr "" -#. 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/10_filter.md:93 +#, markdown-text +msgid "For a specific duration after a given date:" msgstr "" -#. type: Plain text -#: en/./users/06_Mobile_access.md:12 -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." +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:2014-03/P1W`" msgstr "" -#. type: Title # -#: en/./users/06_Mobile_access.md:14 -#, no-wrap -msgid "Testing" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "For a specific duration before a given date:" msgstr "" -#. type: Bullet: '3. ' -#: en/./users/06_Mobile_access.md:21 -msgid "" -"Under the section “Profile”, click on the link like " -"`https://rss.example.net/api/` next to the field “API password”." +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:P1W/2014-05-25T23:59:59`" msgstr "" -#. type: Plain text -#: en/./users/06_Mobile_access.md:21 -#, 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" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "For the past duration before now (the trailing slash is optional):" msgstr "" -#. type: Title # -#: en/./users/06_Mobile_access.md:23 -#, no-wrap -msgid "Fix server configuration" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:P1Y/` or `date:P1Y` (past year)" msgstr "" -#. 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 "" - -#. 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" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:P2M/` (past two months)" msgstr "" -#. 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" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:P3W/` (past three weeks)" msgstr "" -#. type: Title # -#: en/./users/06_Mobile_access.md:65 -#, no-wrap -msgid "Google Reader compatible API" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:P4D/` (past four days)" msgstr "" -#. type: Plain text -#: en/./users/06_Mobile_access.md:68 -msgid "Examples of basic queries:" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:PT5H/` (past five hours)" msgstr "" -#. 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/10_filter.md:93 +#, markdown-text +msgid "`date:PT30M/` (past thirty minutes)" msgstr "" -#. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:2 -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." +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:PT90S/` (past ninety seconds)" msgstr "" -#. type: Title ## -#: en/./users/07_Frequently_Asked_Questions.md:3 -#, no-wrap -msgid "What is `/i` at the end of the application URL?" +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "`date:P1DT1H/` (past one day and one hour)" msgstr "" -#. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:6 -msgid "Of course, ```/i``` has a purpose! It’s used for performance and usability:" +#. type: Bullet: '* ' +#: en/./users/10_filter.md:93 +#, markdown-text +msgid "by date of publication, using the same format: `pubdate:`" msgstr "" #. type: Bullet: '* ' -#: en/./users/07_Frequently_Asked_Questions.md:11 +#: en/./users/10_filter.md:93 +#, markdown-text msgid "" -"It allows for serving icons, images, styles and scripts without " -"cookies. Without that trick, those files would be downloaded more often, " -"especially when form authentication is used. Also, HTTP requests would be " -"heavier." +"by custom label ID `L:12` or multiple label IDs: `L:12,13,14` or with any " +"label: `L:*`" msgstr "" #. type: Bullet: '* ' -#: en/./users/07_Frequently_Asked_Questions.md:11 +#: en/./users/10_filter.md:93 +#, markdown-text msgid "" -"The ```./p/``` public root can be served without any HTTP access " -"restrictions. Whereas it could be implemented in ```./p/i/```." +"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/07_Frequently_Asked_Questions.md:11 +#: en/./users/10_filter.md:93 +#, markdown-text msgid "" -"It avoids problems while serving public resources like ```favicon.ico```, " -"```robots.txt```, etc." +"by several label names (*and*): `label:\"my label\" label:\"my other " +"label\"`" msgstr "" #. type: Bullet: '* ' -#: en/./users/07_Frequently_Asked_Questions.md:11 +#: en/./users/10_filter.md:93 +#, 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." +"by entry (article) ID: `e:1639310674957894` or multiple entry IDs (*or*): " +"`e:1639310674957894,1639310674957893`" msgstr "" -#. type: Title ## -#: en/./users/07_Frequently_Asked_Questions.md:12 -#, no-wrap -msgid "Why is `robots.txt` located in a sub-folder?" +#. 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: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:15 +#. type: Bullet: ' * ' +#: en/./users/10_filter.md:93 +#, 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 " -"else). Therefore the `robots.txt` file is located in the `./p` sub-folder." +"internally, those references are replaced by the corresponding user query in " +"the search expression" msgstr "" #. 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/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/07_Frequently_Asked_Questions.md:19 -msgid "The same principle applies to `favicon.ico` and `.htaccess`." +#: 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: Title ## -#: en/./users/07_Frequently_Asked_Questions.md:20 -#, no-wrap -msgid "Why do I have errors while registering a feed?" +#. 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/07_Frequently_Asked_Questions.md:26 +#: en/./users/10_filter.md:104 +#, 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 " -"can be the root of the problem, or FreshRSS can be buggy. The first step is " -"to identify what causes the problem. Here are the steps to follow:" +"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: Bullet: '1. ' -#: en/./users/07_Frequently_Asked_Questions.md:30 +#. type: Plain text +#: en/./users/10_filter.md:107 +#, 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 " -"it’s not valid, there’s nothing we can do." +"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: Bullet: '1. ' -#: en/./users/07_Frequently_Asked_Questions.md:30 +#. type: Plain text +#: en/./users/10_filter.md:109 +#, markdown-text msgid "" -"__Verify SimplePie validation__ with the [SimplePie on-line " -"tool](https://simplepie.org/demo/ \"SimplePie official demo\"). If it’s not " -"recognized, there’s nothing we can do." +"Finally, parentheses may be used to express more complex queries, with basic " +"negation support:" msgstr "" -#. type: Bullet: '1. ' -#: en/./users/07_Frequently_Asked_Questions.md:30 -msgid "" -"__Verify FreshRSS integration__ with the [demo](https://demo.freshrss.org " -"\"FreshRSS official demo\"). If it’s not working, you need to [create an " -"issue on Github](https://github.com/FreshRSS/FreshRSS/issues/new \"Create an " -"issue for FreshRSS\") so we can have a look at it. If it’s working, there’s " -"probably something fishy with the hosting server." +#. type: Bullet: '* ' +#: en/./users/10_filter.md:115 +#, markdown-text +msgid "`(author:Alice OR intitle:hello) (author:Bob OR intitle:world)`" msgstr "" -#. type: Title ## -#: en/./users/07_Frequently_Asked_Questions.md:31 -#, no-wrap -msgid "How can you change a forgotten password?" +#. type: Bullet: '* ' +#: en/./users/10_filter.md:115 +#, markdown-text +msgid "`(author:Alice intitle:hello) OR (author:Bob intitle:world)`" msgstr "" -#. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:35 -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 " -"interface is available under ```Administration → Manage users```. Select a " -"user, enter a password, and validate." +#. 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/07_Frequently_Asked_Questions.md:37 +#: en/./users/10_filter.md:117 +#, markdown-text, no-wrap 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 " -"mentioning that you must have access to PHP CLI. Open a terminal, and type " -"the following command:" +"> ℹ️ If you need to search for a parenthesis, it needs to be escaped like " +"`\\(` or `\\)`\n" msgstr "" -#. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:37 -#, no-wrap -msgid "./cli/update_user.php --user --password \n" +#. type: Title ## +#: en/./users/10_filter.md:118 +#, markdown-text, no-wrap +msgid "By sorting by date" msgstr "" #. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:41 +#: en/./users/10_filter.md:121 +#, markdown-text msgid "" -"For more information on that matter, please refer to the [dedicated " -"documentation](../../cli/README.md)." +"You can change the sort order by clicking the toggle button available in the " +"header." msgstr "" #. type: Title ## -#: en/./users/07_Frequently_Asked_Questions.md:42 -#, no-wrap -msgid "Permissions under SELinux" +#: en/./users/10_filter.md:122 +#, markdown-text, no-wrap +msgid "Store your filters" msgstr "" #. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:45 +#: en/./users/10_filter.md:125 +#, 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 " -"some data sub-directories. The following command should be executed as root " -"to fix this problem:" +"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/07_Frequently_Asked_Questions.md:45 -#, no-wrap +#: en/./users/10_filter.md:129 +#, markdown-text msgid "" -"semanage fcontext -a -t httpd_sys_rw_content_t " -"'/usr/share/FreshRSS/data(/.*)?'\n" -"restorecon -Rv /usr/share/FreshRSS/data\n" +"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/07_Frequently_Asked_Questions.md:50 -#, no-wrap -msgid "Why do I have a blank page while trying to configure the sharing options?" +#. type: Title ### +#: en/./users/10_filter.md:130 +#, markdown-text, no-wrap +msgid "Bookmark the current query" msgstr "" #. type: Plain text -#: en/./users/07_Frequently_Asked_Questions.md:53 +#: en/./users/10_filter.md:134 +#, 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 " -"`integration` in the faulty URL while keeping the exact same wording " -"throughout the application." +"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/07_Frequently_Asked_Questions.md:55 +#: en/./users/10_filter.md:143 +#, 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 " -"accessed." +"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/07_Frequently_Asked_Questions.md:57 -msgid "Examples with _uBlock_:" +#: en/./users/10_filter.md:145 +#, markdown-text +msgid "" +"Then click on the bookmarked query, the previously stored query will be " +"applied." msgstr "" -#. type: Bullet: '- ' -#: en/./users/07_Frequently_Asked_Questions.md:59 +#. type: Plain text +#: en/./users/10_filter.md:148 +#, markdown-text, no-wrap msgid "" -"Whitelist your FreshRSS instance by adding it in _uBlock > Open the " -"dashboard > Whitelist_." +"> 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: Bullet: '- ' -#: en/./users/07_Frequently_Asked_Questions.md:59 +#. type: Plain text +#: en/./users/10_filter.md:152 +#, 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_" +"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" -- cgit v1.2.3