diff options
| author | 2019-12-03 22:37:40 +0100 | |
|---|---|---|
| committer | 2019-12-03 22:37:40 +0100 | |
| commit | 705318aa39a605a4d869db588f6cffb12019a611 (patch) | |
| tree | 36383dfee24999f9928957621b655e67b20714b7 /docs/en | |
| parent | 0de7e84380dff5222e6728aacbbb42abaac51dd9 (diff) | |
Translate docs with po4a (#2590)
* [i18n] Add docs po4a script
* Add proof of concept
* Add a few more translations
* Hush ShellCheck and shfmt
* Make that list po4a-friendly
* drat, this document could've probably been auto-generated
* Definitive proof that it's translated from French ;-)
* Add some brand spanking new French translation
* More translation
* Mostly finish that config page
* Fix up FAQ
* More contributing
* Dev first steps
* Let's ignore that admin stuff at the very least for now
* Translate release new version, make French the source first and copy all translations
Then replace French with English in the source.
Much quicker than any alternative route.
* And add the English translation
* Minor stylistic leftover from French
* Most of first steps
* Forgot the extensions
* Use po4a 0.56 to get rid of way too many newlines
* Fix up those newlines
* No point linking to Firefox integration anymore from the new user guide
* Start on main view
* A bunch of main view stuff
* More main view
* And some subscriptions before going to bed
* First steps for devs
* More dev first steps
* Incomplete French → English dev/GH translation
Because I need to ask about that mailing list thing
* Fix typo in docs/en/developers/02_Github.md
* Translate & complete devs/github to English
* Fix up most of extensions
* Is that supposed to be a non-breaking space? Let's see
* Match up some users/mobile access
* More users/mobile access
* Add fresh French translation to Fever API
* Fix typo
* Match frontend todo thingies
* Fix a typo
* Some extensions strings
* Remove Fx subscription service from the docs
Cf. https://github.com/FreshRSS/FreshRSS/pull/2606
* Add translation for https://github.com/FreshRSS/FreshRSS/pull/2643
* fix typo as per https://github.com/FreshRSS/FreshRSS/pull/2643#discussion_r345433009
* Add some more French translations
* Update French translation as per @aledeg comment https://github.com/FreshRSS/FreshRSS/pull/2590#discussion_r345465909
* Translate some of the meaningless stuff
* Translate the rest of contributing.md to French
* Fix conflicts
* Translate Docker first steps to French
* Update with change from #2665
* Add @aledeg corrections
* Overlooked a couple @aledeg corrections thanks to GitHub autohide
* Latest @aledeg suggestions
Diffstat (limited to 'docs/en')
| -rw-r--r-- | docs/en/contributing.md | 38 | ||||
| -rw-r--r-- | docs/en/developers/01_First_steps.md | 52 | ||||
| -rw-r--r-- | docs/en/developers/02_Github.md | 118 | ||||
| -rw-r--r-- | docs/en/developers/03_Backend/05_Extensions.md | 108 | ||||
| -rw-r--r-- | docs/en/developers/05_Release_new_version.md | 112 | ||||
| -rw-r--r-- | docs/en/index.md | 22 | ||||
| -rw-r--r-- | docs/en/users/02_First_steps.md | 15 | ||||
| -rw-r--r-- | docs/en/users/03_Main_view.md | 38 | ||||
| -rw-r--r-- | docs/en/users/04_Subscriptions.md | 22 | ||||
| -rw-r--r-- | docs/en/users/05_Configuration.md | 62 | ||||
| -rw-r--r-- | docs/en/users/06_Fever_API.md | 77 | ||||
| -rw-r--r-- | docs/en/users/06_Mobile_access.md | 2 | ||||
| -rw-r--r-- | docs/en/users/07_Frequently_Asked_Questions.md | 34 |
13 files changed, 452 insertions, 248 deletions
diff --git a/docs/en/contributing.md b/docs/en/contributing.md index 870e0c14f..b06680e02 100644 --- a/docs/en/contributing.md +++ b/docs/en/contributing.md @@ -2,39 +2,41 @@ Do you want to ask us some questions? Do you want to discuss with us? Don't hesitate to subscribe to our mailing lists! -- The first mailing is destined to generic information, it should be adapted to users. [Join mailing@freshrss.org](https://freshrss.org/mailman/listinfo/mailing). -- The second mailing is mainly for developers. [Join dev@freshrss.org](https://freshrss.org/mailman/listinfo/dev) +* The first mailing is destined to generic information, it should be adapted to users. [Join mailing@freshrss.org](https://freshrss.org/mailman/listinfo/mailing). +* The second mailing is mainly for developers. [Join dev@freshrss.org](https://freshrss.org/mailman/listinfo/dev) ## Report a bug -You found a bug? Don't panic, here are some steps to report it easily: +Have you found a bug? Don't panic, here are some steps to report it with ease: 1. Search for it on [the bug tracker](https://github.com/FreshRSS/FreshRSS/issues) (don't forget to use the search bar). 2. If you find a similar bug, don't hesitate to post a comment to add more importance to the related ticket. 3. If you didn't find it, [open a new ticket](https://github.com/FreshRSS/FreshRSS/issues/new). -If you have to create a new ticket, try to apply the following advices: +If you have to create a new ticket, please try to keep in mind the following advice: -- Give an explicit title to the ticket so it will be easier to find it later. -- Be as exhaustive as possible in the description: what did you do? What is the bug? What are the steps to reproduce the bug? -- We also need some information: - + Your FreshRSS version (on about page or `constants.php` file) - + Your server configuration: type of hosting, PHP version - + Your storage system (SQLite, MySQL, MariaDB, PostgreSQL) - + If possible, the related logs (PHP logs and FreshRSS logs under `data/users/your_user/log.txt`) +* Give an explicit title to the ticket so it will be easier to find it later. +* Be as exhaustive as possible in the description: what did you do? What is the bug? What are the steps to reproduce the bug? + +We also need some information: + +* Your FreshRSS version (on the about page or in the `constants.php` file) +* Your server configuration: the type of hosting and the PHP version +* Your storage system (SQLite, MySQL, MariaDB, PostgreSQL) +* If possible, the related logs (PHP logs and FreshRSS logs under `data/users/your_user/log.txt`) ## Fix a bug -Did you want to fix a bug? To keep a great coordination between collaborators, you will have to follow these indications: +Would you like to fix a bug? For optimum coordination between collaborators, you should follow these indications: -1. Be sure the bug is associated to a ticket and say you work on it. -2. [Fork this project repository](https://help.github.com/articles/fork-a-repo/). -3. [Create a new branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/). The name of the branch must be explicit and being prefixed by the related ticket id. For instance, `783-contributing-file` to fix [ticket #783](https://github.com/FreshRSS/FreshRSS/issues/783). +1. Be sure the bug is associated with a ticket and indicate that you'll work on it. +2. [Fork the project repository](https://help.github.com/articles/fork-a-repo/). +3. [Create a new branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/). The name of the branch should be clear, and ideally prefixed by the related ticket id. For instance, `783-contributing-file` to fix [ticket #783](https://github.com/FreshRSS/FreshRSS/issues/783). 4. Make your changes to your fork and [send a pull request](https://help.github.com/articles/using-pull-requests/) on the **dev branch**. If you have to write code, please follow [our coding style recommendations](developers/01_First_steps.md). -**Tip:** if you are searching for easy-to-fix bugs, 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. +**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. ## Submit an idea @@ -44,11 +46,11 @@ If your idea is nice, we'll have a look at it. ## Contribute to internationalization (i18n) -If you want to improve internationalization, please open a new ticket first and follow indications from « Fix a bug » section. +If you want to improve internationalization, please open a new ticket first and follow the advice from the *Fix a bug* section. Translations are present in the subdirectories of `./app/i18n/`. -We are working on a better way to handle internationalization but don't hesitate to suggest any idea! +We're working on a better way to handle internationalization, but don't hesitate to suggest any ideas! ## Contribute to documentation diff --git a/docs/en/developers/01_First_steps.md b/docs/en/developers/01_First_steps.md index 28c249be4..6c6177aec 100644 --- a/docs/en/developers/01_First_steps.md +++ b/docs/en/developers/01_First_steps.md @@ -45,7 +45,7 @@ $ TAG=dev-arm make start You can find the full list of available tags [on the Docker hub](https://hub.docker.com/r/freshrss/freshrss/tags). -You might want to rebuild the Docker image locally. You can do it with: +If you want to build the Docker image yourself, you can use the following command: ```console $ make build @@ -65,18 +65,18 @@ If you want to create your own FreshRSS extension, take a look at the [extension # Coding style -If you want to contribute to the source code, it is important to follow the project coding style. The actual code does not follow it throughout the project, but every time we have an opportunity, we should fix it. +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 the project, but we should fix it every time an opportunity presents itself. -Contributions which do not follow the coding style will be rejected as long as the coding style is not fixed. +Contributions which don't follow the coding style will be rejected as long as the coding style is not fixed. -## Spaces, tabs and white spaces +## Spaces, tabs and other whitespace characters -### Indent -Code indent must use tabs. +### Indentation +Code indentation must use tabs. ### Alignment -Once the code is indented, it might be useful to align it to ease the reading. In that case, use spaces. +Once the code has been correctly indented, it might be useful to align it for ease of reading. In that case, please use spaces. ```php $result = a_function_with_a_really_long_name($param1, $param2, @@ -85,9 +85,9 @@ $result = a_function_with_a_really_long_name($param1, $param2, ### End of line -The end of line character must be a line feed (LF) which is a default end of line on *NIX systems. This character must not follow other white spaces. +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. -It is possible to verify if there is white spaces before the end of line, with the following Git command: +You can verify if there is any unintended white space at the end of line with the following Git command: ```bash # command to check files before adding them in the Git index @@ -100,13 +100,13 @@ git diff --check --cached Every file must end by an empty line. -### With commas, dots and semi-columns +### Commas, dots and semi-columns -There is no space before those characters but there is one after. +There should no space before those characters, but there should be one after. -### With operators +### Operators -There is a space before and after every operator. +There should be a space before and after every operator. ```php if ($a == 10) { @@ -116,9 +116,9 @@ if ($a == 10) { echo $a ? 1 : 0; ``` -### With brackets +### Parentheses -There is no spaces in the brackets. There is no space before the opening bracket except if it is after a keyword. There is no space after the closing bracket except if it is followed by a curly bracket. +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. ```php if ($a == 10) { @@ -132,7 +132,7 @@ if ((int)$a == 10) { ### With chained functions -It happens most of the time in Javascript files. When there is chained functions, closures and callback functions, it is 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. +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. ```javascript // First instruction @@ -151,9 +151,9 @@ shortcut.add("shift+" + shortcuts.mark_read, function () { ## Line length -Lines should be shorter than 80 characters. However, in some case, it is possible to extend that limit to 100 characters. +Lines should strive to be shorter than 80 characters. However, this limit may be extended to 100 characters when strictly necessary. -With functions, parameters can be declared on different lines. +With functions, parameters can be declared on multiple lines. ```php function my_function($param_1, $param_2, @@ -164,11 +164,11 @@ function my_function($param_1, $param_2, ## Naming -All the code elements (functions, classes, methods and variables) must describe their usage in concise way. +All code elements (functions, classes, methods and variables) must describe their usage succinctly. ### Functions and variables -They must follow the "snake case" convention. +Functions and variables must follow the "snake case" naming convention. ```php // a function @@ -181,7 +181,7 @@ $variable_name; ### Methods -They must follow the "lower camel case" convention. +Methods must follow the "lower camel case" naming convention. ```php private function methodName() { @@ -191,7 +191,7 @@ private function methodName() { ### Classes -They must follow the "upper camel case" convention. +Classes must follow the "upper camel case" naming convention. ```php abstract class ClassName {} @@ -199,16 +199,16 @@ abstract class ClassName {} ## Encoding -Files must be encoded with UTF-8 character set. +Files must be encoded with the UTF-8 character set. ## PHP compatibility -Ensure that your code is working with a PHP version as old as what FreshRSS officially supports. +Please ensure that your code works with the oldest PHP version officially supported by FreshRSS. ## Miscellaneous ### Operators -They must be at the end of the line if a condition runs on more than one line. +Operators must be at the end of the line if a condition is split over more than one line. ```php if ($a == 10 || @@ -223,7 +223,7 @@ If the file contains only PHP code, the PHP closing tag must be omitted. ### Arrays -If an array declaration runs on more than one line, each element must be followed by a comma even the last one. +If an array declaration runs on more than one line, each element must be followed by a comma, including the last one. ```php $variable = [ diff --git a/docs/en/developers/02_Github.md b/docs/en/developers/02_Github.md index c16a6d040..a1677d2af 100644 --- a/docs/en/developers/02_Github.md +++ b/docs/en/developers/02_Github.md @@ -1,11 +1,123 @@ # Reporting a bug or a suggestion -**TODO** +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. + +If you're convinced that you should be heard, here's how you can go about it. + +## On GitHub + +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! + + 1. [Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/issues) + 2. Start by checking if a similar request hasn't already been made. If so, please feel free to add your voice to the request. + 3. If your request is new, [open a new bug ticket](https://github.com/FreshRSS/FreshRSS/issues/new) + 4. 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. + 5. Please follow the tips below to make it easier to let your ticket be heard. + +## Informal + +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. + +* On [our Mattermost chat](https://framateam.org/signup_user_complete/?id=e2680d3e3128b9fac8fdb3003b0024ee) +* On [the mailing lists](https://freshrss.org/announce-of-the-mailing-lists.html) +* At events / meetings around Free Software +* Over a beer in a bar +* Etc. + +## Tips + +Here are some tips to help you present your bug report or suggestion: + + +* **Pay attention to spelling**. Even if it's not always easy, try your best! +* **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. +* **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 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`). +* If you can't find the log files, specify it in your ticket so we know you've already searched. +* 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! +* The logs may reveal confidential information, so **be careful not to disclose anything sensitive.** + +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/): + +### What's my goal? + +Give the general context of what you were trying to do. + +### What have I been trying to do? + +Explain step by step what you have done so that we can reproduce the bug. + +### What results have I achieved? + +The bug: what you see that shouldn't have happened. Here you can provide the logs. + +### What was the expected result? + +So that we understand what you consider to be the problem. + +### What are my circumstances? + +Remember to give the following information if you know it: + + 1. Which browser? Which version? + 2. Which server: Apache, Nginx? Which version? + 3. Which version of PHP? + 4. Which database: SQLite, MySQL, MariaDB, PostgreSQL? Which version? + 5. Which distribution runs on the server? And... which version? # Branching -**TODO** +## Basic +If you are new to Git, here are some of the resources you might find useful: + +* [GitHub's blog post](https://github.com/blog/120-new-to-git) +* <http://try.github.com/> +* <http://sixrevisions.com/resources/git-tutorials-beginners/> +* <http://rogerdudler.github.io/git-guide/> + +## Getting the latest code from the FreshRSS repository +First you need to add the official repo to your remote repo list: +```bash +git remote add upstream git@github.com:FreshRSS/FreshRSS.git +``` + +You can verify the remote repo is successfully added by using: +```bash +git remote -v show +``` + +Now you can pull the latest development code: +```bash +git checkout dev +git pull upstream dev +``` + +## Starting a new development branch +```bash +git checkout -b my-development-branch +``` # Sending a patch -**TODO** +```bash +# Add the changed file, here actualize_script.php +git add app/actualize_script.php +# Commit the change and write a proper commit message +git commit +# Double check all looks well +git show +# Push it to your fork +git push +``` + +Now you can create a PR based on your branch. Please make sure to file it against the `dev` branch! + +## How to write a commit message + +A commit message should succintly describe the changes on the first line. For example: + +> Fix broken icon + +If necessary, this can be followed by a blank line and a longer explanation. + +For further tips, see [here](https://chris.beams.io/posts/git-commit/). diff --git a/docs/en/developers/03_Backend/05_Extensions.md b/docs/en/developers/03_Backend/05_Extensions.md index 4610e4b90..3977faae6 100644 --- a/docs/en/developers/03_Backend/05_Extensions.md +++ b/docs/en/developers/03_Backend/05_Extensions.md @@ -2,9 +2,9 @@ ## About FreshRSS -FreshRSS is an RSS / Atom feeds aggregator written in PHP since October 2012. The official site is located at [freshrss.org](https://freshrss.org) and its repository is hosted by Github: [github.com/FreshRSS/FreshRSS](https://github.com/FreshRSS/FreshRSS). +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). -## Problem to solve +## The problem FreshRSS is limited in its technical possibilities by various factors: @@ -18,7 +18,7 @@ Another solution consists of an extension system. By allowing users to write the 1. Reducing the amount of source code a new contributor has to take in 2. Unofficial integration of novelties -3. No necessity of forking or main developer approvement. +3. No forking or main developer approval required. 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. @@ -30,10 +30,10 @@ This data sheet should refer to the official FreshRSS and Minz documentation (th ### MVC Architecture -Minz relies on and imposes an MVC architecture for projects using it. This architecture consists of three main components: +Minz relies on and imposes an MVC architecture on projects using it. This architecture consists of three main components: * 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. -* 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 an `views` folder. +* 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. * 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. ### Routing @@ -64,7 +64,7 @@ When loading the address http://exemple.com?c=hello&a=world, the `world` action 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. -Later, the `hello/world` convention will be used to refer to a controller/action pair. +From now on, the `hello/world` naming convention will be used to refer to a controller/action pair. ### Views @@ -123,7 +123,7 @@ To take full advantage of the Minz routing system, it is strongly discouraged to </p> ``` -Should it be decided one day to use a "url rewriting" system to have addresses in a http://exemple.com/controller/action format, all previous addresses would become ineffective! +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! So use the `Minz_Url` class and its `display()` method instead. `Minz_Url::display()` takes an array of the following form as its argument: @@ -144,7 +144,7 @@ echo Minz_Url::display($url_array); ?> ``` -Since this can become a bit tedious to use in the long run, especially in views, it is preferable to use the `_url()' shortcut: +Since this can become a bit tedious to use in the long run, especially in views, it is preferable to use the `_url()` shortcut: ```php <?php @@ -192,8 +192,8 @@ $url_array = [ 'c' => 'hello', 'a' => 'world', ]; -$feedback_good = 'Tout s\'est bien passé !'; -$feedback_bad = 'Oups, quelque chose n\'a pas marché.'; +$feedback_good = 'All went well!'; +$feedback_bad = 'Oops, something went wrong.'; Minz_Request::good($feedback_good, $url_array); @@ -210,17 +210,17 @@ It is common (and that's an understatement) to want to show some text to the use 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: -- `admin.php` for anything related to FreshRSS administration -- `conf.php` for configuration -- `feedback.php` contains translations of feedback messages -- `gen.php` stores what is global to FreshRSS (gen for "general") -- `index.php` for the main page that lists feeds and the About page -- `install.php` contains strings related FreshRSS installation -- `sub.php` for subscription management (sub for "subscription") +* `admin.php` for anything related to FreshRSS administration +* `conf.php` for configuration +* `feedback.php` contains translations of feedback messages +* `gen.php` stores what is global to FreshRSS (gen for "general") +* `index.php` for the main page that lists feeds and the About page +* `install.php` contains strings related FreshRSS installation +* `sub.php` for subscription management (sub for "subscription") This organization makes it possible to avoid a single huge translation file. -The translation files are quite simple: it is only a matter of returning a PHP table containing the translations. Extract from `app/i18n/en/gen.php`: +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 <?php @@ -263,7 +263,7 @@ There is a small special case that sometimes makes life easier: the `_` identifi 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. -An extension allows you to add functionality easily to FreshRSS without having to touch the core of the project directly. +An extension allows you to easily add functionality to FreshRSS without having to touch the core of the project directly. ### Basic files and folders @@ -273,8 +273,8 @@ The convention requires that the main directory name be preceded by an "x" to in The main directory of an extension must contain at least two **mandatory** files: -- A `metadata.json` file that contains a description of the extension. This file is written in JSON. -- An `extension.php` file containing the entry point of the extension (which is a class that inherits Minz_Extension). +* A `metadata.json` file that contains a description of the extension. This file is written in JSON. +* An `extension.php` file containing the entry point of the extension (which is a class that inherits Minz_Extension). 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: @@ -292,11 +292,11 @@ There is an example HelloWorld extension that you can download from [our GitHub You may also need additional files or subdirectories depending on your needs: -- `configure.phtml` is the file containing the form to parameterize your extension -- 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) -- A `Controllers` directory containing additional controllers -- An `i18n` directory containing additional translations -- `layout` and` views` directories to define new views or to overwrite the current views +* `configure.phtml` is the file containing the form to parameterize your extension +* 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) +* A `Controllers` directory containing additional controllers +* An `i18n` directory containing additional translations +* `layout` and` views` directories to define new views or to overwrite the current views 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. @@ -304,16 +304,16 @@ In addition, it is good to have a `LICENSE` file indicating the license under wh The `metadata.json` file defines your extension through a number of important elements. It must contain a valid JSON array containing the following entries: -- `name` : the name of your extension -- `author` : your name, your e-mail address ... but there is no specific format to adopt -- `description` : a description of your extension -- `version` : the current version number of the extension -- `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`) -- `type` : Defines the type of your extension. There are two types: `system` and` user`. We will study this difference right after. +* `name`: the name of your extension +* `author`: your name, your e-mail address ... but there is no specific format to adopt +* `description`: a description of your extension +* `version`: the current version number of the extension +* `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`) +* `type`: Defines the type of your extension. There are two types: `system` and` user`. We will study this difference right after. Only the `name` and` entrypoint` fields are required. -### Choose between « system » or « user » +### Choosing between `system` and `user` A __user__ extension can be enabled by some users and not by others (typically for user preferences). @@ -327,24 +327,24 @@ In addition, this class must be inherited from the `Minz_Extension` class to ben Your class will benefit from four methods to redefine: -- `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. -- `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. -- `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. -- `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. +* `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. +* `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. +* `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. +* `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. In addition, you will have a number of methods directly inherited from `Minz_Extension` that you should not redefine: -- 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()`. -- `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`). -- `registerController($base_name)` will tell Minz to take into account the given controller in the routing system. The controller must be located in your `Controllers` directory, the name of the file must be` <base_name>Controller.php` and the name of the `FreshExtension_<base_name>_Controller` class. +* The "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()`. +* `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`). +* `registerController($base_name)` will tell Minz to take into account the given controller in the routing system. The controller must be located in your `Controllers` directory, the name of the file must be` <base_name>Controller.php` and the name of the `FreshExtension_<base_name>_Controller` class. **TODO** -- `registerViews()` -- `registerTranslates()` -- `registerHook($hook_name, $hook_function)` +* `registerViews()` +* `registerTranslates()` +* `registerHook($hook_name, $hook_function)` -### The « hooks » system +### The "hooks" system You can register at the FreshRSS event system in an extensions `init()` method, to manipulate data when some of the core functions are executed. @@ -363,16 +363,16 @@ class HelloWorldExtension extends Minz_Extension The following events are available: -- `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. -- `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. -- `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. -- `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 -- `menu_admin_entry` (`function() -> string`): add an entry at the end of the "Administration" menu, the returned string must be valid HTML (e.g. `<li class="item active"><a href="url">New entry</a></li>`) -- `menu_configuration_entry` (`function() -> string`): add an entry at the end of the "Configuration" menu, the returned string must be valid HTML (e.g. `<li class="item active"><a href="url">New entry</a></li>`) -- `menu_other_entry` (`function() -> string`): add an entry at the end of the header dropdown menu (i.e. after the "About" entry), the returned string must be valid HTML (e.g. `<li class="item active"><a href="url">New entry</a></li>`) -- `nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** add documentation -- `post_update` (`function(none) -> none`): **TODO** add documentation -- `simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** add documentation +* `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. +* `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. +* `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. +* `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 +* `menu_admin_entry` (`function() -> string`): add an entry at the end of the "Administration" menu, the returned string must be valid HTML (e.g. `<li class="item active"><a href="url">New entry</a></li>`) +* `menu_configuration_entry` (`function() -> string`): add an entry at the end of the "Configuration" menu, the returned string must be valid HTML (e.g. `<li class="item active"><a href="url">New entry</a></li>`) +* `menu_other_entry` (`function() -> string`): add an entry at the end of the header dropdown menu (i.e. after the "About" entry), the returned string must be valid HTML (e.g. `<li class="item active"><a href="url">New entry</a></li>`) +* `nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** add documentation +* `post_update` (`function(none) -> none`): **TODO** add documentation +* `simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** add documentation ### Writing your own configure.phtml diff --git a/docs/en/developers/05_Release_new_version.md b/docs/en/developers/05_Release_new_version.md index e1a23c8ba..d8e3026f3 100644 --- a/docs/en/developers/05_Release_new_version.md +++ b/docs/en/developers/05_Release_new_version.md @@ -1 +1,111 @@ -**TODO** +# Preparing the release + +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**. + +It's also recommended to make the announcement on mailing@freshrss.org. + +# Check the dev status + +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. + +You must also **make sure that the CHANGELOG file is up to date** in the dev branch with the updates of the version(s) to be released. + +# Git process + +```bash +$ git checkout master +$ git pull +$ git merge --ff dev +$ vim constants.php +# Update version number x.y.y.z of FRESHRSS_VERSION +$ git commit -a +Version x.y.z +$ git tag -a x.y.z +Version x.y.z +$ git push && git push --tags +``` + +# Updating `update.freshrss.org` + +It's important to update update.freshrss.org since this is the default service for automatic FreshRSS updates. + +The repository managing the code is located on GitHub: [FreshRSS/update.freshrss.org] (https://github.com/FreshRSS/update.freshrss.org/). + +## Writing the update script + +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 dev 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. + +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`. + +There are then 5 functions that have to be executed: + +* `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; +* `need_info_update()` returns `true` if the user must intervene during the update or `false` if not; +* `ask_info_update()` displays a form to the user if `need_info_update()` has returned `true`; +* `save_info_update()` is responsible for saving the information filled out by the user (from the `ask_info_update()` form); +* `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). + +## Updating the versions file + +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. + +Here's an example of a `versions.php` file: + +```php +<?php +return array( + // STABLE + '0.8.0' => '1.0.0', + '0.8.1' => '1.0.0', + '1.0.0' => '1.0.1', // doesn't exist (yet) + // DEV + '1.1.2-dev' => 'dev', + '1.1.3-dev' => 'dev', + '1.1.4-dev' => 'dev', +); +``` + +And here's how this table works: + +* on the left you can find the N version, on the right the N+1 version; +* the `x.y.z.z-dev` versions are **all** updated to `dev`; +* stable versions are updated to stable versions; +* it's possible to skip several versions at once, provided that the update scripts support it; +* 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. + +It's **very strongly** recommended to keep this file organized according to version numbers by separating stable and dev versions. + +## Deployment + +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. + +When you're satisfied, update update.freshrss.org with the new script, test it again, and then move on. + +# Updating the FreshRSS services + +Two services need to be updated immediately after the update. + +* rss.freshrss.org; +* demo.freshrss.org (public login: `demo` / `demodemo`). + +# Publicly announce the release + +When everything's working, it's time to announce the release to the world! + +* on GitHub by creating[a new release](https://github.com/FreshRSS/FreshRSS/releases/new) +* on the freshrss.org blog, at least for stable versions (write the article on[FreshRSS/freshrss.org](https://github.com/FreshRSS/freshrss.org)) +* on Twitter ([@FreshRSS](https://twitter.com/FreshRSS) account) +* and on mailing@freshrss.org + +# Starting the next development version + +```bash +$ git checkout dev +$ vim constants.php +# Update the FRESHRSS_VERSION +$ vim CHANGELOG.md +# Prepare the changelog for the next version +$ git add CHANGELOG.md && git commit && git push +``` + +Also remember to update update.freshrss.org so that it takes the current development version into account. diff --git a/docs/en/index.md b/docs/en/index.md index 1aaa6a586..0534891b5 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -4,17 +4,17 @@ FreshRSS is an RSS aggregator and reader. It allows you to read and follow sever FreshRSS has a lot of features including: -- RSS and Atom aggregation -- Mark article as favorite if you liked it or if you want to read it later -- Filter and search functionality helps to easily find articles -- Statistics to show you the publishing frequency all the websites you follow -- Import/export of your feeds into OPML format -- Several themes created by the community -- "Google Reader"-like API to connect Android applications -- The application is "responsive," which means it adapts to small screens so you can bring articles in your pocket -- Self-hosted: the code is free (under AGPL3 licence), so you can host your own instance of FreshRSS -- Multi-user, so you can also host for your friends and family -- And a lot more! +* RSS and Atom aggregation +* Mark article as favorite if you liked it or if you want to read it later +* Filter and search functionality helps to easily find articles +* Statistics to show you the publishing frequency all the websites you follow +* Import/export of your feeds into OPML format +* Several themes created by the community +* "Google Reader"-like API to connect Android applications +* The application is "responsive," which means it adapts to small screens so you can bring articles in your pocket +* Self-hosted: the code is free (under AGPL3 licence), so you can host your own instance of FreshRSS +* Multi-user, so you can also host for your friends and family +* And a lot more! This documentation is split into different sections: diff --git a/docs/en/users/02_First_steps.md b/docs/en/users/02_First_steps.md index 6bebb124a..5490147d8 100644 --- a/docs/en/users/02_First_steps.md +++ b/docs/en/users/02_First_steps.md @@ -1,21 +1,20 @@ -Learning how to handle a new application is not always easy. We build FreshRSS to be intuitive, but you will need some guidance to get your hand on it. +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. -This section guides you to the pages you need as a new comer. +This section will guide you to the pages you need to get started. The order is tailored to newcomers. [After installing the application](../admins/03_Installation.md), the first step is to add some feeds. You have a few options: 1. [Add a feed manually](04_Subscriptions.md#adding-a-feed) 2. [Import an OPML or JSON file](04_Subscriptions.md#import-and-export) 3. [Use the bookmarklet](04_Subscriptions.md#use-bookmarklet) -4. [Firefox integration](04_Subscriptions.md#firefox-subscription-service) -Once you have added your feeds to FreshRSS, it is time to read them. You have access to three reading modes: +Once you have added your feeds to FreshRSS, it is time to read them. There are three availalbe reading modes: -1. [The normal view](03_Main_view.md#normal-view) which allows you to display and read quickly new articles -2. [The global view](03_Main_view.md#global-view) which allows you to see in one glance the status of your feeds -3. [The reader view](03_Main_view.md#reader-view) which allows you to have a nice reading experience. +1. [The normal view](03_Main_view.md#normal-view) enables you to quickly read new articles +2. [The global view](03_Main_view.md#global-view) shows you an overview of the status of your feeds in one glance +3. [The reader view](03_Main_view.md#reader-view) offers you a comfortable reading experience -Now that you know the basic usages, it is time to configure FreshRSS to improve your reading experience. It has a lot of options, so play with them to find your perfect configuration. However, here is few resources to help you: +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: * [Organize your feeds in categories](04_Subscriptions.md#feed-management) * [Change the home page](05_Configuration.md#changing-the-view) diff --git a/docs/en/users/03_Main_view.md b/docs/en/users/03_Main_view.md index c6c3e3b50..7259d756e 100644 --- a/docs/en/users/03_Main_view.md +++ b/docs/en/users/03_Main_view.md @@ -12,7 +12,7 @@ # Refreshing feeds -To use FreshRSS at its full potential, it needs to grab subscribed feeds new articles. To do so, you have several methods available. +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. ## Automatic update @@ -20,7 +20,7 @@ This is the recommended method since you can forget about it once it is configur ### With the actualize_script.php script -This method is available only if you have access to the installation server scheduled tasks. +This method is only available if you have access to the scheduled tasks of the machine on which your FreshRSS instance is installed. 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. @@ -68,13 +68,13 @@ If you configure the application to allow anonymous reading, you can also allow  -The URL used in the previous section becomes accessible and therefore, you can use the same syntax for the scheduled task. +The URL used in the previous section will now become accessible to anyone. Therefore you can use the same syntax for the scheduled task. -You can also configure an authentication token to grant a special right on the server. +You can also configure an authentication token to grant special access on the server.  -The scheduled task syntax to use will be the following: +The scheduled task syntax should look as follows: ```cron 0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize&token=my-token' @@ -88,7 +88,7 @@ You can also target a different user by adding their username to the query strin ### HTTP authentication -In that case, the syntax in the two previous section are unusable. It means that you 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!** +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!** ```cron 0 * * * * curl -u alice:password123 'https://freshrss.example.net/i/?c=feed&a=actualize' @@ -96,11 +96,11 @@ In that case, the syntax in the two previous section are unusable. It means that ## Manual update -If you cannot or do not want to use the automatic methods, you can make it manually. There is two ways, the partial or the complete update. +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. ### Complete update -This update occurs on all feeds. To trigger it, you need to click on the navigation menu update link. +This update occurs on all feeds. To trigger it, simply click on the update link in the navigation menu.  @@ -110,24 +110,24 @@ When the update starts, a progress bar appears and changes while feeds are proce ### Partial update -This update occurs on the selected feed only. To trigger it, you need to click on the feed menu update link. +This update occurs on the selected feed only. To trigger it, simply click on the update link in the feed menu.  # Filtering articles -While the number of articles stored by FreshRSS increase, it is important to have efficient filters to display only a subset of the articles. There is several methods with different criterion. Most of the time, those methods can be combined. +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. ## By category -This is the easiest method. You only need to click on the category title in the side panel. There are two special categories on top of that panel: +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: - * *Main feed* which displays only articles from feeds marked as available in that category - * *Favourites* which displays only articles marked as favourites + * *Main feed* displays only articles from feeds marked as available in that category + * *Favourites* displays only articles marked as favourites ## By feed -There is several methods to filter articles by feed: +There are several methods to filter articles by feed: * by clicking the feed title in the side panel * by clicking the feed title in the article details @@ -138,9 +138,9 @@ There is several methods to filter articles by feed: ## By status -Each article has two attributes, which can be combined. The first attribute indicates if the article was read or not. The second attribute indicates if the article was marked as favorite or not. +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. -With version 0.7, attribute filters are available in the article display dropdown list. With this version, it is not possible to combine those filters. For instance, it is not possible to display only read and favourite articles. +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.  @@ -156,7 +156,7 @@ It is possible to filter articles by their content by inputting a string in the ## With the search field -It is possible to use the search field to further refine results: +You can use the search field to further refine results: * by author: `author:name` or `author:'composed name'` * by title: `intitle:keyword` or `intitle:'composed keyword'` @@ -197,12 +197,12 @@ It is possible to use the search field to further refine results: * `date:P1DT1H/` (past one day and one hour) * by date of publication, using the same format: `pubdate:<date-interval>` -Beware that there is no space between the operator and the value. +Be careful not to enter a space between the operator and the search value. 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`. -It is also possible to combine operators to have a very sharp filter, and it is allowed to have multiple instances of `author:`, `intitle:`, `inurl:`, `#`, and free-text. +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. 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` diff --git a/docs/en/users/04_Subscriptions.md b/docs/en/users/04_Subscriptions.md index 4b40f691a..be8efe0a6 100644 --- a/docs/en/users/04_Subscriptions.md +++ b/docs/en/users/04_Subscriptions.md @@ -8,7 +8,7 @@ # Use bookmarklet -Bookmarklets are little scripts that you can execute to perform useful or frivolous tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds. +Bookmarklets are little scripts that you can execute to perform various tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds. 1. Open "Subscriptions management". 2. Click on "Subscription tools". @@ -17,23 +17,3 @@ Bookmarklets are little scripts that you can execute to perform useful or frivol # Feed management **TODO** - -# Firefox subscription service - -NB: From version 63 and onwards Firefox has removed the ability to add your own subscription services that aren't standalone programs. This makes it impossible to add FreshRSS to the feed preview/subscription page, though this page is set to be removed from version 64 anyway (see [bugzilla](https://bugzilla.mozilla.org/show_bug.cgi?id=1477667)). You can use the bookmarklet mentioned above for an easy way to subscribe to feeds. - -If you're using a version pre-63 you can manually add your FreshRSS app to the list of Firefox subscription services, which enables you to subscribe to sites which provide a feed link using the Firefox built-in "Subscribe" button. An in-depth process is described in the [official documentation](https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox) but you can use the following steps: - - 1. Open about:config in Firefox - - 2. Search for "browser.contentHandlers.types." and note the highest number following the returned strings (ie if yo see browser.contentHandlers.types.1.something up to browser.contentHandlers.types.5.somethingelse etc. the highest number is 5). Your contentHandler will have to have a free number so just pick one higher than currently registered (you would chose six in above example). - - 3. You will have to add three new strings to your about config (replace %NUMBER% with the number from previous step and example.com with your installation address): - - | Preference name | Value | Note | - | -------------------------------------------- | ---------------------------------------------------------- | --------------------------------------------------------- | - | browser.contentHandlers.types.%NUMBER%.title | **FreshRSS** | Use any name you would like (ie. "My feeds") | - | browser.contentHandlers.types.%NUMBER%.type | **application/vnd.mozilla.maybe.feed** | Do not change this value! | - | browser.contentHandlers.types.%NUMBER%.uri | **http://EXAMPLE.COM/FreshRss/i?c=feed&a=add&url_rss=%s** | Replace base url with yours and switch to https (if used) | - - 4. Restart Firefox and you can subscribe to sites with the Firefox built-in "Subscribe" button. Just select the name you set under the first Preference name from the dropdown (you can also make it default with the checbox) and you will be redirected to FreshRSS subscription settings (you must be logged in). diff --git a/docs/en/users/05_Configuration.md b/docs/en/users/05_Configuration.md index f635f9d5e..767ed2be4 100644 --- a/docs/en/users/05_Configuration.md +++ b/docs/en/users/05_Configuration.md @@ -3,17 +3,17 @@ ## Language -At the moment, FreshRSS is available in 13 languages. After you confirm your choice, the interface will be displayed in the chosen language. -Depending on the chosen language, there might be parts of the interface that are still not translated. If you're willing to help translating -the missing bits or add a new language, please check how you can [contribute to the project](../contributing.md#contribute-to-internationalization-i18n). +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). -There are parts of FreshRSS that are not translated and are not intended to be translated. For now, the logs visible in the application as well as the one generated by automatic update scripts are part of it. +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. Available languages are: cz, de, en, es, fr, he, it, kr, nl, oc, pt-br, ru, tr, zh-cn. ## Theme -In matters of taste and color, there can be no disputes. This is why FreshRSS offers eight official themes: +There's no accounting for tastes, which is why FreshRSS offers eight official themes: * *Blue Lagoon* by **Mister aiR** * *Dark* by **AD** @@ -22,24 +22,24 @@ In matters of taste and color, there can be no disputes. This is why FreshRSS of * *Origine-compact* by **Kevin Papst** * *Pafat* by **Plopoyop** * *Screwdriver* by **Mister aiR** - * *Swage* par **Patrick Crandol** + * *Swage* by **Patrick Crandol** -If none of these are suitable for you, it is always possible to [create your own](../developers/04_Frontend/02_Design.md). +If you can't find any themes you like, it's always possible to [create your own](../developers/04_Frontend/02_Design.md). 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. ## Content width -There are some who prefer short lines of text while others prefer to maximize the available screen space. To satisfy the maximum number of people it is possible to choose the width of the displayed content. There are four settings available: +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: - * **Fine** which displays content up to 550 pixels - * **Medium** which displays content up to 800 pixels - * **Large** which displays content up to 1000 pixels - * **No limit** which displays the content on 100% of the available space + * **Fine** displays content up to a maximum width of 550 pixels + * **Medium** displays content up to a maximum width of 800 pixels + * **Large** displays content up to a maximum width of 1000 pixels + * **No limit** displays the content on 100% of the available space ## Article icons -It worth noting that this section only has effects in normal view. +Please note that this section only affects normal view.  @@ -47,12 +47,12 @@ 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. If you disable every item in the top line, you'll still be able to see it since -there is the feed name and the article title. But if you do the same thing for +it contains the feed name and the article title. But if you do the same thing for the bottom line, it will be empty. ## HTML5 notification timout -After the automatic updates of the feeds, FreshRSS uses the HTML5 notification API to notify of the arrival of new articles. +After automatically updating the feeds, FreshRSS can pop up a notification using the HTML5 notification API. The duration of this notification can be set. By default, the value is 0. @@ -68,29 +68,29 @@ If you don't use those buttons because you never browse on mobile or because you **TODO** -# Archiving +# Archival **TODO** # Sharing -To make your life easier, you can share directly an article within FreshRSS. +To make your life easier, you can share articles straight from FreshRSS. -At the moment, FreshRSS supports 15 sharing methods ranging from self-hosted services (Shaarli, etc.) to proprietary services (Facebook, etc.). +At the moment, FreshRSS supports 18 sharing methods, ranging from self-hosted services (Shaarli, etc.) to proprietary services (Facebook, etc.). By default, the sharing list is empty.  -To add a new item in the list, follow those simple steps: +To add a new item to the list, please follow the following simple steps: - 1. Select the share method in the drop-down. - 1. Press the ```✚``` sign to add it to the list. - 1. Configure the method in the list. All method names can be modified in the display. Some methods need the sharing URL to be able to work properly (ex: Shaarli). + 1. Select the desired sharing method in the drop-down list. + 1. Press the ```✚``` button to add it to the list. + 1. 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). 1. Submit your changes. To remove an item from the list, follow those simple steps: - 1. Press the ```❌``` sign next to the share method you want to remove. + 1. Press the ```❌``` button next to the share method you want to remove. 1. Submit your changes. # Shortcuts @@ -151,7 +151,7 @@ More information can be found in the [Apache documentation](http://httpd.apache. **TODO** -## Archivage +## Archival **TODO** @@ -163,24 +163,24 @@ More information can be found in the [Apache documentation](http://httpd.apache. ### Retrieve a truncated stream from within FreshRSS -The question comes up regularly, so we will try to clarify here how one can retrieve a truncated RSS feed with FreshRSS. Please note that the process is absolutely not "user friendly", but it works :) +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. :) -Also know that this way you are generating much more traffic to the originating sites and that they might block you accordingly. The performance of FreshRSS is also negatively affected because you have to fetch the full article content one by one. So it's a feature to use sparingly! +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! -What is 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). +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). #### Example: Rue89 -To find this path, you must 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 must then look for the "block" of HTML corresponding to the content of the article (in the source code!). +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!). -We find here that the block that encompasses only the content of the article is ```<div class="content clearfix">```. We will only use the ".content" class here. Nevertheless, as said above, it is best to start the path with an id. If we go back to the parent block, this is the block ```<div id="article">``` and that's perfect! The path will be ```#article .content```. +Here we find that the block that encompasses nothing but the content of the article is ```<div class="content clearfix">```. We'll only use the `.content` class here. Nevertheless, as said above, it's best to start the path with an id. If we go back to the parent block, we find ```<div id="article">``` and that's perfect! The path will be ```#article .content```. -#### Add the corresponding classes to the articles CSS path on the feed configuration page. Examples: +#### Add the corresponding classes to the article CSS path on the feed configuration page. Examples: * Rue89: ```#article .content``` * PCINpact: ```#actu_content``` * Lesnumériques: ```article#body div.text.clearfix``` -* Phoronix : ```#main .content``` +* Phoronix: ```#main .content``` ### Retrieve a truncated stream with external tools diff --git a/docs/en/users/06_Fever_API.md b/docs/en/users/06_Fever_API.md index b1cf6cb21..5da090872 100644 --- a/docs/en/users/06_Fever_API.md +++ b/docs/en/users/06_Fever_API.md @@ -5,51 +5,52 @@ and general aspects of API access. ## RSS clients -There are many RSS clients existing supporting Fever APIs but they seem to understand the Fever API a bit differently. -If your favourite client does not work properly with this API, create an issue and we will have a look. +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. ### Usage & Authentication -Before you can start to use 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 re-set the user’s API password. +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. -Then point your mobile application to the URL of `fever.php` (e.g. `https://freshrss.example.net/api/fever.php`). +Then point your mobile application to the `fever.php` address (e.g. `https://freshrss.example.net/api/fever.php`). -## Compatibility +## Compatible clients Tested with: -- Android - - [Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) (Closed source) +* Android + * [Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) (Closed source) -- iOS - - [Fiery Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) (Closed source) - - [Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) (Commercial) - - [Reeder](https://www.reederapp.com/) (Commercial) (Use its Google Reader API / native FreshRSS option when possible) +* iOS + * [Fiery Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) (Closed source) + * [Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) (Commercial) + * [Reeder](https://www.reederapp.com/) (Commercial) (Use its Google Reader API / native FreshRSS option when possible) -- MacOS - - [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial) +* MacOS + * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial) ## Features -Following features are implemented: +The following features are implemented: -- fetching categories -- fetching feeds -- fetching RSS items (new, favorites, unread, by_id, by_feed, by_category, since) -- fetching favicons -- setting read marker for item(s) -- setting starred marker for item(s) -- setting read marker for feed -- setting read marker for category -- supports FreshRSS extensions, which use the `entry_before_display` hook +* fetching categories +* fetching feeds +* fetching RSS items (new, favorites, unread, by_id, by_feed, by_category, since) +* fetching favicons +* setting read marker for item(s) +* setting starred marker for item(s) +* setting read marker for feed +* setting read marker for category +* supports FreshRSS extensions, which use the `entry_before_display` hook -Following features are not supported: -- **Hot Links** aka **hot** as there is nothing in FreshRSS yet that is similar or could be used to simulate it +The following features are not supported: -## Testing and error search +* **Hot Links** aka **hot** as there is nothing in FreshRSS yet that is similar or could be used to simulate it. + +## Testing and debugging 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/). @@ -83,25 +84,25 @@ This should give: "last_refreshed_on_time": "1520013061" } ``` -Perfect, you are authenticated and can now start testing the more advanced features. Therefor change the URL and append the possible API actions to your request parameters. Check the [original Fever documentation](https://feedafever.com/api) for more information. +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. Some basic calls are: -- https://freshrss.example.net/api/fever.php?api&items -- https://freshrss.example.net/api/fever.php?api&feeds -- https://freshrss.example.net/api/fever.php?api&groups -- https://freshrss.example.net/api/fever.php?api&unread_item_ids -- https://freshrss.example.net/api/fever.php?api&saved_item_ids -- https://freshrss.example.net/api/fever.php?api&items&since_id=some_id -- https://freshrss.example.net/api/fever.php?api&items&max_id=some_id -- https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id -- https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id +* https://freshrss.example.net/api/fever.php?api&items +* https://freshrss.example.net/api/fever.php?api&feeds +* https://freshrss.example.net/api/fever.php?api&groups +* https://freshrss.example.net/api/fever.php?api&unread_item_ids +* https://freshrss.example.net/api/fever.php?api&saved_item_ids +* https://freshrss.example.net/api/fever.php?api&items&since_id=some_id +* https://freshrss.example.net/api/fever.php?api&items&max_id=some_id +* https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id +* https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id Replace `some_id` with a real ID from your `freshrss_username_entry` database. ### Debugging -If nothing helps and your clients still misbehaves, add these lines to the start of `fever.api`: +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: ```php file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' . json_encode($_REQUEST) . PHP_EOL, FILE_APPEND); diff --git a/docs/en/users/06_Mobile_access.md b/docs/en/users/06_Mobile_access.md index f5f1520e9..195663f36 100644 --- a/docs/en/users/06_Mobile_access.md +++ b/docs/en/users/06_Mobile_access.md @@ -44,7 +44,7 @@ See the [page about the Fever compatible API](06_Fever_API.md) for another possi # Compatible clients 6. On the same FreshRSS API page, note the address given under “Your API address”, like `https://freshrss.example.net/api/greader.php` - * You will type it in a client, together with your FreshRSS username, and the corresponding special API password. + * Type the API address in a client, together with your FreshRSS username, and the corresponding special API password. 7. Pick a client supporting a Google Reader-like API. Selection: * Android diff --git a/docs/en/users/07_Frequently_Asked_Questions.md b/docs/en/users/07_Frequently_Asked_Questions.md index 577931572..757b2528a 100644 --- a/docs/en/users/07_Frequently_Asked_Questions.md +++ b/docs/en/users/07_Frequently_Asked_Questions.md @@ -1,47 +1,47 @@ We may not have answered all of your questions in the previous sections. The FAQ contains some questions that have not been answered elsewhere. -## What is /i at the end of the application URL? +## What is `/i` at the end of the application URL? -Of course, ```/i``` has a purpose! We used it for performance and usability: +Of course, ```/i``` has a purpose! It's used for performance and usability: * 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. -* ```./p/``` public root can be served without any HTTP access restrictions. Whereas it could be implemented in ```./p/i/```. +* The ```./p/``` public root can be served without any HTTP access restrictions. Whereas it could be implemented in ```./p/i/```. * It avoids problems while serving public resources like ```favicon.ico```, ```robots.txt```, etc. * It allows the logo to be displayed instead of a white page while hitting a restriction or a delay during the loading process. -## Why robots.txt is located in a sub-folder? +## Why is `robots.txt` located in a sub-folder? -To increase security, FreshRSS is hosted in two sections. The first section is public (```./p``` folder) and the second section is private (everything else). Therefore the ```robots.txt``` file is located in ```./p``` sub-folder. +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. -As explained in the [security section](/en/User_documentation/Installation/Security), it is highly recommended to make only the public section available at the domain level. With that configuration, ```./p``` is the root folder for https://demo.freshrss.org/, thus making ```robots.txt``` available at the root of the application. +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. -The same rule applies for ```favicon.ico``` and ```.htaccess```. +The same principle applies to `favicon.ico` and `.htaccess`. ## Why do I have errors while registering a feed? 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, FreshRSS can be buggy. +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: -1. __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 is not valid, there is nothing we can do. -1. __Verify SimplePie validation__ with the [SimplePie on-line tool](https://simplepie.org/demo/ "SimplePie official demo"). If it is not recognized, there is nothing we can do. -1. __Verify FreshRSS integration__ with the [demo](https://demo.freshrss.org "FreshRSS official demo"). If it is 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 is working, there is probably something fishy with the hosting server. +1. __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. +1. __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. +1. __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. -## How to change a forgotten password? +## How can you change a forgotten password? -Since [1.10.0](https://github.com/FreshRSS/FreshRSS/releases/tag/1.10.0) release, admins are able to change user passwords directly from the interface. This interface is available under ```Administration → Manage users```. +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. -Since [1.8.0](https://github.com/FreshRSS/FreshRSS/releases/tag/1.8.0) release, admins are able to change user passwords using a terminal. It worth mentioning that it must have access to PHP CLI. Open a terminal, and type the following command: +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: ```sh ./cli/update_user.php --user <username> --password <password> ``` -For more information on that matter, there is a [dedicated documentation](../../cli/README.md). +For more information on that matter, please refer to the [dedicated documentation](../../cli/README.md). ## Permissions under SELinux -Some Linux distribution like Fedora or RedHat Enterprise Linux have SELinux system enabled. This acts like a firewall application, so all applications cannot write/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 : +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: ```sh semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/FreshRSS/data(/.*)?' restorecon -Rv /usr/share/FreshRSS/data @@ -49,7 +49,7 @@ restorecon -Rv /usr/share/FreshRSS/data ## Why do I have a blank page while trying to configure the sharing options? -The `sharing` word in the URL is a trigger word for some an-blocker rules. Starting at version 1.16, `sharing` has been replaced by `integration` in the faulty URL while keeping the exact same wording through out the application. +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. 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. |
