aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2019-12-18 09:26:17 +0100
committerGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2019-12-18 09:26:17 +0100
commit2b1f8e67f76672a5b1b0a1b0403d81dbee364c58 (patch)
treeab3142289e260111c686e740b9f4214453a0a84c
parent90c7292326538522a5df97b3f0a847b8a28f759f (diff)
parent82851d2039f619f1b2558e06b04a9e47fceeea54 (diff)
Merge branch 'dev'
This is the end of the `dev` branch. Good bye old friend!
-rw-r--r--CHANGELOG.md4
-rw-r--r--CREDITS.md1
-rw-r--r--Makefile71
-rw-r--r--README.fr.md21
-rw-r--r--README.md13
-rw-r--r--app/Controllers/apiController.php47
-rwxr-xr-xapp/Controllers/feedController.php12
-rwxr-xr-xapp/Controllers/javascriptController.php2
-rw-r--r--app/Controllers/userController.php133
-rw-r--r--app/FreshRSS.php1
-rw-r--r--app/Models/FeedDAO.php33
-rw-r--r--app/Models/FeedDAOSQLite.php1
-rw-r--r--app/Models/Share.php18
-rw-r--r--app/Utils/feverUtil.php80
-rw-r--r--app/Utils/passwordUtil.php27
-rw-r--r--app/i18n/cz/admin.php56
-rw-r--r--app/i18n/cz/conf.php91
-rw-r--r--app/i18n/cz/feedback.php36
-rw-r--r--app/i18n/cz/gen.php104
-rw-r--r--app/i18n/cz/index.php20
-rw-r--r--app/i18n/cz/install.php16
-rw-r--r--app/i18n/cz/sub.php64
-rw-r--r--app/i18n/cz/user.php42
-rw-r--r--app/i18n/de/admin.php34
-rw-r--r--app/i18n/de/conf.php65
-rw-r--r--app/i18n/de/feedback.php28
-rw-r--r--app/i18n/de/gen.php104
-rw-r--r--app/i18n/de/index.php22
-rw-r--r--app/i18n/de/install.php14
-rw-r--r--app/i18n/de/sub.php34
-rw-r--r--app/i18n/de/user.php42
-rw-r--r--app/i18n/en/admin.php26
-rw-r--r--app/i18n/en/conf.php31
-rw-r--r--app/i18n/en/feedback.php28
-rw-r--r--app/i18n/en/gen.php15
-rw-r--r--app/i18n/en/index.php12
-rw-r--r--app/i18n/en/install.php12
-rw-r--r--app/i18n/en/sub.php12
-rw-r--r--app/i18n/en/user.php12
-rwxr-xr-xapp/i18n/es/admin.php56
-rwxr-xr-xapp/i18n/es/conf.php85
-rwxr-xr-xapp/i18n/es/feedback.php36
-rwxr-xr-xapp/i18n/es/gen.php100
-rwxr-xr-xapp/i18n/es/index.php20
-rwxr-xr-xapp/i18n/es/install.php16
-rwxr-xr-xapp/i18n/es/sub.php56
-rw-r--r--app/i18n/es/user.php42
-rw-r--r--app/i18n/fr/admin.php30
-rw-r--r--app/i18n/fr/conf.php33
-rw-r--r--app/i18n/fr/feedback.php28
-rw-r--r--app/i18n/fr/gen.php26
-rw-r--r--app/i18n/fr/index.php12
-rw-r--r--app/i18n/fr/install.php12
-rw-r--r--app/i18n/fr/sub.php14
-rw-r--r--app/i18n/fr/user.php14
-rw-r--r--app/i18n/he/admin.php150
-rw-r--r--app/i18n/he/conf.php105
-rw-r--r--app/i18n/he/feedback.php82
-rw-r--r--app/i18n/he/gen.php170
-rw-r--r--app/i18n/he/index.php20
-rw-r--r--app/i18n/he/install.php56
-rw-r--r--app/i18n/he/sub.php62
-rw-r--r--app/i18n/he/user.php42
-rw-r--r--app/i18n/it/admin.php56
-rw-r--r--app/i18n/it/conf.php87
-rw-r--r--app/i18n/it/feedback.php36
-rw-r--r--app/i18n/it/gen.php110
-rw-r--r--app/i18n/it/index.php24
-rw-r--r--app/i18n/it/install.php22
-rw-r--r--app/i18n/it/sub.php64
-rw-r--r--app/i18n/it/user.php42
-rw-r--r--app/i18n/kr/admin.php28
-rw-r--r--app/i18n/kr/conf.php43
-rw-r--r--app/i18n/kr/feedback.php28
-rw-r--r--app/i18n/kr/gen.php30
-rw-r--r--app/i18n/kr/index.php12
-rw-r--r--app/i18n/kr/install.php14
-rw-r--r--app/i18n/kr/sub.php20
-rw-r--r--app/i18n/kr/user.php42
-rw-r--r--app/i18n/nl/admin.php28
-rw-r--r--app/i18n/nl/conf.php31
-rw-r--r--app/i18n/nl/feedback.php30
-rw-r--r--app/i18n/nl/gen.php30
-rw-r--r--app/i18n/nl/index.php14
-rw-r--r--app/i18n/nl/install.php14
-rw-r--r--app/i18n/nl/sub.php14
-rw-r--r--app/i18n/nl/user.php12
-rw-r--r--app/i18n/oc/admin.php24
-rw-r--r--app/i18n/oc/conf.php32
-rw-r--r--app/i18n/oc/feedback.php30
-rw-r--r--app/i18n/oc/gen.php26
-rw-r--r--app/i18n/oc/index.php16
-rw-r--r--app/i18n/oc/install.php12
-rw-r--r--app/i18n/oc/sub.php16
-rw-r--r--app/i18n/oc/user.php12
-rw-r--r--app/i18n/pt-br/admin.php56
-rw-r--r--app/i18n/pt-br/conf.php87
-rw-r--r--app/i18n/pt-br/feedback.php40
-rw-r--r--app/i18n/pt-br/gen.php100
-rw-r--r--app/i18n/pt-br/index.php24
-rw-r--r--app/i18n/pt-br/install.php18
-rw-r--r--app/i18n/pt-br/sub.php58
-rw-r--r--app/i18n/pt-br/user.php42
-rw-r--r--app/i18n/ru/admin.php60
-rw-r--r--app/i18n/ru/conf.php305
-rw-r--r--app/i18n/ru/feedback.php148
-rw-r--r--app/i18n/ru/gen.php344
-rw-r--r--app/i18n/ru/index.php104
-rw-r--r--app/i18n/ru/install.php30
-rw-r--r--app/i18n/ru/sub.php148
-rw-r--r--app/i18n/ru/user.php42
-rw-r--r--app/i18n/sk/admin.php25
-rw-r--r--app/i18n/sk/conf.php35
-rw-r--r--app/i18n/sk/feedback.php28
-rw-r--r--app/i18n/sk/gen.php44
-rw-r--r--app/i18n/sk/index.php12
-rw-r--r--app/i18n/sk/install.php12
-rw-r--r--app/i18n/sk/sub.php19
-rw-r--r--app/i18n/sk/user.php42
-rw-r--r--app/i18n/tr/admin.php52
-rw-r--r--app/i18n/tr/conf.php91
-rw-r--r--app/i18n/tr/feedback.php36
-rw-r--r--app/i18n/tr/gen.php100
-rw-r--r--app/i18n/tr/index.php26
-rw-r--r--app/i18n/tr/install.php18
-rw-r--r--app/i18n/tr/sub.php56
-rw-r--r--app/i18n/tr/user.php42
-rw-r--r--app/i18n/zh-cn/admin.php26
-rw-r--r--app/i18n/zh-cn/conf.php43
-rw-r--r--app/i18n/zh-cn/feedback.php28
-rw-r--r--app/i18n/zh-cn/gen.php32
-rw-r--r--app/i18n/zh-cn/index.php12
-rw-r--r--app/i18n/zh-cn/install.php12
-rw-r--r--app/i18n/zh-cn/sub.php20
-rw-r--r--app/i18n/zh-cn/user.php42
-rw-r--r--app/install.php1
-rw-r--r--app/shares.php6
-rw-r--r--app/views/helpers/index/normal/entry_bottom.phtml2
-rw-r--r--app/views/user/details.phtml65
-rw-r--r--app/views/user/manage.phtml89
-rw-r--r--app/views/user/profile.phtml37
-rw-r--r--cli/README.md2
-rw-r--r--cli/_update-or-create-user.php3
-rw-r--r--cli/check.translation.php7
-rwxr-xr-xcli/create-user.php1
-rw-r--r--cli/i18n/I18nData.php159
-rw-r--r--cli/i18n/I18nFile.php14
-rw-r--r--cli/i18n/I18nFileInterface.php2
-rw-r--r--cli/i18n/I18nIgnoreFile.php7
-rw-r--r--cli/i18n/ignore/en.php20
-rw-r--r--cli/i18n/ignore/fr.php9
-rw-r--r--cli/i18n/ignore/kr.php4
-rw-r--r--cli/i18n/ignore/nl.php12
-rw-r--r--cli/i18n/ignore/oc.php8
-rw-r--r--cli/i18n/ignore/sk.php18
-rw-r--r--cli/i18n/ignore/zh-cn.php4
-rw-r--r--cli/manipulate.translation.php47
-rwxr-xr-xcli/translation-update.sh38
-rwxr-xr-xcli/update-user.php1
-rw-r--r--constants.php2
-rw-r--r--docs/en/admins/02_Prerequisites.md8
-rw-r--r--docs/en/admins/07_LinuxUpdate.md64
-rw-r--r--docs/en/contributing.md40
-rw-r--r--docs/en/developers/01_First_steps.md60
-rw-r--r--docs/en/developers/02_Github.md118
-rw-r--r--docs/en/developers/03_Backend/05_Extensions.md108
-rw-r--r--docs/en/developers/05_Release_new_version.md111
-rw-r--r--docs/en/index.md22
-rw-r--r--docs/en/users/02_First_steps.md15
-rw-r--r--docs/en/users/03_Main_view.md38
-rw-r--r--docs/en/users/04_Subscriptions.md22
-rw-r--r--docs/en/users/05_Configuration.md62
-rw-r--r--docs/en/users/06_Fever_API.md77
-rw-r--r--docs/en/users/06_Mobile_access.md2
-rw-r--r--docs/en/users/07_Frequently_Asked_Questions.md34
-rw-r--r--docs/fr/contributing.md92
-rw-r--r--docs/fr/developers/01_First_steps.md147
-rw-r--r--docs/fr/developers/02_Github.md169
-rw-r--r--docs/fr/developers/03_Backend/02_Minz.md14
-rw-r--r--docs/fr/developers/03_Backend/04_Changing_source_code.md8
-rw-r--r--docs/fr/developers/03_Backend/05_Extensions.md472
-rw-r--r--docs/fr/developers/04_Frontend/01_View_files.md8
-rw-r--r--docs/fr/developers/04_Frontend/02_Design.md6
-rw-r--r--docs/fr/developers/05_Release_new_version.md108
-rw-r--r--docs/fr/index.md47
-rw-r--r--docs/fr/users/02_First_steps.md53
-rw-r--r--docs/fr/users/03_Main_view.md216
-rw-r--r--docs/fr/users/04_Subscriptions.md16
-rw-r--r--docs/fr/users/05_Configuration.md203
-rw-r--r--docs/fr/users/06_Fever_API.md144
-rw-r--r--docs/fr/users/06_Mobile_access.md64
-rw-r--r--docs/fr/users/07_Frequently_Asked_Questions.md126
-rw-r--r--docs/i18n/freshrss.fr.po6248
-rw-r--r--docs/i18n/templates/freshrss.pot4964
-rw-r--r--docs/po4a.conf23
-rw-r--r--lib/Minz/ExtensionManager.php8
-rw-r--r--lib/Minz/Helper.php11
-rw-r--r--lib/Minz/Request.php195
-rw-r--r--lib/SimplePie/SimplePie.php4
-rw-r--r--lib/SimplePie/SimplePie/Locator.php2
-rw-r--r--lib/SimplePie/SimplePie/Parse/Date.php39
-rw-r--r--p/scripts/main.js44
202 files changed, 17022 insertions, 3857 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 52659a5dd..4e35cd3d5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
# FreshRSS changelog
+## 20XX-XX-XX FreshRSS 1.15.4-dev
+
+
+
## 2019-11-22 FreshRSS 1.15.3
* Bug fixing (regressions from 1.15.x)
diff --git a/CREDITS.md b/CREDITS.md
index d52d3c72c..0ce7a35a1 100644
--- a/CREDITS.md
+++ b/CREDITS.md
@@ -68,6 +68,7 @@ People are sorted by name so please keep this order.
* [Quentin Dufour](https://github.com/superboum): [contributions](https://github.com/FreshRSS/documentation/commits?author=superboum), [Web](http://quentin.dufour.io/)
* [Quentin Pagès](https://github.com/Quenty31): [contributions](https://github.com/FreshRSS/documentation/commits?author=Quenty31)
* [Ramón Cutanda](https://github.com/rcutanda): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:rcutanda)
+* [Rezad](https://github.com/rezad1393): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:rezad1393)
* [Robert Kaussow](https://github.com/xoxys): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:xoxys), [Web](https://geeklabor.de/)
* [rocka](https://github.com/rocka): [contributions](https://github.com/FreshRSS/FreshRss/commits/dev?author=rocka)
* [romibi](https://github.com/romibi): [contributions](https://github.com/FreshRSS/FreshRSS/commits/dev?author=romibi)
diff --git a/Makefile b/Makefile
index 2d11116b7..dcb547c7d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,11 @@
.DEFAULT_GOAL := help
ifndef TAG
- TAG=dev-alpine
+ TAG=alpine
endif
PORT ?= 8080
+PHP := $(shell sh -c 'which php')
ifeq ($(findstring alpine,$(TAG)),alpine)
DOCKERFILE=Dockerfile-Alpine
@@ -14,20 +15,23 @@ else
DOCKERFILE=Dockerfile
endif
+############
+## Docker ##
+############
.PHONY: build
build: ## Build a Docker image
docker build \
--pull \
--tag freshrss/freshrss:$(TAG) \
- -f Docker/$(DOCKERFILE) .
+ --file Docker/$(DOCKERFILE) .
.PHONY: start
start: ## Start the development environment (use Docker)
docker run \
--rm \
- -v $(shell pwd):/var/www/FreshRSS:z \
- -p $(PORT):80 \
- -e FRESHRSS_ENV=development \
+ --volume $(shell pwd):/var/www/FreshRSS:z \
+ --publish $(PORT):80 \
+ --env FRESHRSS_ENV=development \
--name freshrss-dev \
freshrss/freshrss:$(TAG)
@@ -35,6 +39,61 @@ start: ## Start the development environment (use Docker)
stop: ## Stop FreshRSS container if any
docker stop freshrss-dev
+##########
+## I18N ##
+##########
+.PHONY: i18n-format
+i18n-format: ## Format I18N files
+ @$(PHP) ./cli/manipulate.translation.php -a format
+ @echo Files formatted.
+
+.PHONY: i18n-add-language
+i18n-add-language: ## Add a new supported language
+ifndef lang
+ @echo To add a new language, you need to provide one in the "lang" variable.
+ @exit 10
+endif
+ @$(PHP) ./cli/manipulate.translation.php -a add -l $(lang)
+ @echo Language added.
+
+.PHONY: i18n-add-key
+i18n-add-key: ## Add a translation key to all supported languages
+ifndef key
+ @echo To add a key, you need to provide one in the "key" variable.
+ @exit 10
+endif
+ifndef value
+ @echo To add a key, you need to provide its value in the "value" variable.
+ @exit 10
+endif
+ @$(PHP) ./cli/manipulate.translation.php -a add -k $(key) -v "$(value)"
+ @echo Key added.
+
+.PHONY: i18n-remove-key
+i18n-remove-key: ## Remove a translation key from all supported languages
+ifndef key
+ @echo To remove a key, you need to provide one in the "key" variable.
+ @exit 10
+endif
+ @$(PHP) ./cli/manipulate.translation.php -a delete -k $(key)
+ @echo Key removed.
+
+.PHONY: i18n-ignore-key
+i18n-ignore-key: ## Ignore a translation key for the selected language
+ifndef lang
+ @echo To ignore a key, you need to provide a language in the "lang" variable.
+ @exit 10
+endif
+ifndef key
+ @echo To ignore a key, you need to provide one in the "key" variable.
+ @exit 10
+endif
+ @$(PHP) ./cli/manipulate.translation.php -a ignore -k $(key) -l $(lang)
+ @echo Key ignored.
+
+##########
+## HELP ##
+##########
.PHONY: help
help:
- @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
+ @grep --extended-regexp '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
diff --git a/README.fr.md b/README.fr.md
index 889b72380..0479fa5b2 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -32,10 +32,10 @@ FreshRSS n’est fourni avec aucune garantie.
![Capture d’écran de FreshRSS](docs/img/FreshRSS-screenshot.png)
# [Documentation](https://freshrss.github.io/FreshRSS/fr/)
-* La [documentation utilisateurs](https://freshrss.github.io/FreshRSS/fr/users/02_First_steps.md) pour découvrir les fonctionnalités de FreshRSS.
-* La [documentation administrateurs](https://freshrss.github.io/FreshRSS/fr/users/01_Installation.md) pour l’installation et la maintenance de FreshRSS.
-* La [documentation développeurs](https://freshrss.github.io/FreshRSS/fr/developers/01_First_steps.md) pour savoir comment contribuer et mieux comprendre le code source de FreshRSS.
-* Le [guide de contribution](https://freshrss.github.io/FreshRSS/fr/contributing.md) pour nous aider à développer FreshRSS.
+* La [documentation utilisateurs](https://freshrss.github.io/FreshRSS/fr/users/02_First_steps.html) pour découvrir les fonctionnalités de FreshRSS.
+* La [documentation administrateurs](https://freshrss.github.io/FreshRSS/fr/users/01_Installation.html) pour l’installation et la maintenance de FreshRSS.
+* La [documentation développeurs](https://freshrss.github.io/FreshRSS/fr/developers/01_First_steps.html) pour savoir comment contribuer et mieux comprendre le code source de FreshRSS.
+* Le [guide de contribution](https://freshrss.github.io/FreshRSS/fr/contributing.html) pour nous aider à développer FreshRSS.
# Prérequis
* Un navigateur Web récent tel que Firefox / IceCat, Internet Explorer 11 / Edge (sauf certains détails), Chromium / Chrome, Opera, Safari.
@@ -50,11 +50,10 @@ FreshRSS n’est fourni avec aucune garantie.
# Téléchargement
-Voir la [liste des versions](../../releases).
-## À propos des branches
-* Utilisez [la branche master](https://github.com/FreshRSS/FreshRSS/tree/master/) si vous souhaitez des versions moins fréquentes et stables.
-* Utilisez [la branche dev](https://github.com/FreshRSS/FreshRSS/tree/dev) si vous vouler une publication continue (rolling release) avec les dernières nouveautés, ou bien aider à tester ou développer la future version stable.
+Si vous préférez que votre FreshRSS soit stable, vous devriez télécharger la dernière version. De nouvelles versions sont publiées tous les 2 ou 3 mois. Voir la [liste des versions](https://github.com/FreshRSS/FreshRSS/releases).
+
+Si vous voulez une publication continue (rolling release) avec les dernières nouveautés, ou bien aider à tester ou développer la future version stable, vous pouvez utiliser [la branche master](https://github.com/FreshRSS/FreshRSS/tree/master/).
# [Installation](https://freshrss.github.io/FreshRSS/fr/users/01_Installation.html)
@@ -74,7 +73,7 @@ Voir la [liste des versions](../../releases).
6. Des paramètres de configuration avancés peuvent être vus dans [config.default.php](config.default.php) et modifiés dans `data/config.php`.
7. Avec Apache, activer [`AllowEncodedSlashes`](https://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes) pour une meilleure compatibilité avec les clients mobiles.
-Plus d’informations sur l’installation et la configuration serveur peuvent être trouvées dans [notre documentation](https://freshrss.github.io/FreshRSS/fr/users/01_Installation.md).
+Plus d’informations sur l’installation et la configuration serveur peuvent être trouvées dans [notre documentation](https://freshrss.github.io/FreshRSS/fr/users/01_Installation.html).
### Exemple d’installation complète sur Linux Debian/Ubuntu
```sh
@@ -97,8 +96,8 @@ sudo apt-get install git
sudo git clone https://github.com/FreshRSS/FreshRSS.git
cd FreshRSS
-# Si vous souhaitez utiliser la branche développement de FreshRSS
-sudo git checkout -b dev origin/dev
+# Si vous souhaitez utiliser la dernière version stable de FreshRSS
+sudo git checkout $(git describe --tags --abbrev=0)
# Mettre les droits d’accès pour le serveur Web
sudo chown -R :www-data . && sudo chmod -R g+r . && sudo chmod -R g+w ./data/
diff --git a/README.md b/README.md
index 54bc54c30..8d7774237 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,7 @@ FreshRSS comes with absolutely no warranty.
* [User documentation](https://freshrss.github.io/FreshRSS/en/users/02_First_steps.html), where you can discover all the possibilities offered by FreshRSS
* [Administrator documentation](https://freshrss.github.io/FreshRSS/en/admins/01_Index.html) for detailed installation and maintenance related tasks
* [Developer documentation](https://freshrss.github.io/FreshRSS/en/developers/01_First_steps.html) to guide you in the source code of FreshRSS and to help you if you want to contribute
-* [Contributor guidelines](https://freshrss.github.io/FreshRSS/en/contributing.md) for those who want to help improve FreshRSS
+* [Contributor guidelines](https://freshrss.github.io/FreshRSS/en/contributing.html) for those who want to help improve FreshRSS
# Requirements
* A recent browser like Firefox / IceCat, Internet Explorer 11 / Edge (minus a few details), Chromium / Chrome, Opera, Safari.
@@ -50,14 +50,13 @@ FreshRSS comes with absolutely no warranty.
# Releases
-See the [list of releases](../../releases).
-## About branches
-* Use [the master branch](https://github.com/FreshRSS/FreshRSS/tree/master/) if you need less frequent stable versions.
-* Use [the dev branch](https://github.com/FreshRSS/FreshRSS/tree/dev) if you want a rolling release with the newest features, or help testing or developing the next stable version.
+The latest stable release can be found [here](https://github.com/FreshRSS/FreshRSS/releases/latest). New versions are released every two to three months.
+If you want a rolling release with the newest features, or want to help testing or developing the next stable version, you can use [the `master` branch](https://github.com/FreshRSS/FreshRSS/tree/master/).
-# [Installation](https://freshrss.github.io/FreshRSS/en/admins/02_Installation.html)
+
+# [Installation](https://freshrss.github.io/FreshRSS/en/admins/03_Installation.html)
## Automated install
* [![Docker](https://www.docker.com/sites/default/files/horizontal.png)](./Docker/)
@@ -74,7 +73,7 @@ See the [list of releases](../../releases).
6. Advanced configuration settings can be found in [config.default.php](config.default.php) and modified in `data/config.php`.
7. When using Apache, enable [`AllowEncodedSlashes`](https://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes) for better compatibility with mobile clients.
-More detailed information about installation and server configuration can be found in [our documentation](https://freshrss.github.io/FreshRSS/en/admins/02_Installation.html).
+More detailed information about installation and server configuration can be found in [our documentation](https://freshrss.github.io/FreshRSS/en/admins/03_Installation.html).
## Advice
* For better security, expose only the `./p/` folder to the Web.
diff --git a/app/Controllers/apiController.php b/app/Controllers/apiController.php
new file mode 100644
index 000000000..d096ba83f
--- /dev/null
+++ b/app/Controllers/apiController.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * This controller manage API-related features.
+ */
+class FreshRSS_api_Controller extends Minz_ActionController {
+ /**
+ * This action updates the user API password.
+ *
+ * Parameter is:
+ * - apiPasswordPlain: the new user password
+ */
+ public function updatePasswordAction() {
+ if (!FreshRSS_Auth::hasAccess()) {
+ Minz_Error::error(403);
+ }
+
+ $return_url = array('c' => 'user', 'a' => 'profile');
+
+ if (!Minz_Request::isPost()) {
+ Minz_Request::forward($return_url, true);
+ }
+
+ $apiPasswordPlain = Minz_Request::param('apiPasswordPlain', '', true);
+ if ($apiPasswordPlain == '') {
+ Minz_Request::forward($return_url, true);
+ }
+
+ $username = Minz_Session::param('currentUser');
+ $userConfig = FreshRSS_Context::$user_conf;
+
+ $apiPasswordHash = FreshRSS_password_Util::hash($apiPasswordPlain);
+ $userConfig->apiPasswordHash = $apiPasswordHash;
+
+ $feverKey = FreshRSS_fever_Util::updateKey($username, $apiPasswordPlain);
+ if (!$feverKey) {
+ Minz_Request::bad(_t('feedback.api.password.failed'), $return_url);
+ }
+
+ $userConfig->feverKey = $feverKey;
+ if ($userConfig->save()) {
+ Minz_Request::good(_t('feedback.api.password.updated'), $return_url);
+ } else {
+ Minz_Request::bad(_t('feedback.api.password.failed'), $return_url);
+ }
+ }
+}
diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php
index 3eb2316b8..d395f76d0 100755
--- a/app/Controllers/feedController.php
+++ b/app/Controllers/feedController.php
@@ -47,6 +47,12 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
$url = trim($url);
+ /** @var $url */
+ $url = Minz_ExtensionManager::callHook('check_url_before_add', $url);
+ if (null === $url) {
+ throw new FreshRSS_FeedNotAdded_Exception($url, $title);
+ }
+
$cat = null;
if ($new_cat_name != '') {
$new_cat_id = $catDAO->addCategory(array('name' => $new_cat_name));
@@ -274,6 +280,12 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
$updated_feeds = 0;
$nb_new_articles = 0;
foreach ($feeds as $feed) {
+ /** @var FreshRSS_Feed $feed */
+ $feed = Minz_ExtensionManager::callHook('feed_before_actualize', $feed);
+ if (null === $feed) {
+ continue;
+ }
+
$url = $feed->url(); //For detection of HTTP 301
$pubSubHubbubEnabled = $pubsubhubbubEnabledGeneral && $feed->pubSubHubbubEnabled();
diff --git a/app/Controllers/javascriptController.php b/app/Controllers/javascriptController.php
index c84e5483b..b22e2c127 100755
--- a/app/Controllers/javascriptController.php
+++ b/app/Controllers/javascriptController.php
@@ -47,7 +47,7 @@ class FreshRSS_javascript_Controller extends Minz_ActionController {
Minz_Log::notice('Nonce failure due to invalid username!');
}
//Failure: Return random data.
- $this->view->salt1 = sprintf('$2a$%02d$', FreshRSS_user_Controller::BCRYPT_COST);
+ $this->view->salt1 = sprintf('$2a$%02d$', FreshRSS_password_Util::BCRYPT_COST);
$alphabet = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for ($i = 22; $i > 0; $i--) {
$this->view->salt1 .= $alphabet[mt_rand(0, 63)];
diff --git a/app/Controllers/userController.php b/app/Controllers/userController.php
index 5209edc84..7d3c010c4 100644
--- a/app/Controllers/userController.php
+++ b/app/Controllers/userController.php
@@ -4,17 +4,6 @@
* Controller to handle user actions.
*/
class FreshRSS_user_Controller extends Minz_ActionController {
- // Will also have to be computed client side on mobile devices,
- // so do not use a too high cost
- const BCRYPT_COST = 9;
-
- public static function hashPassword($passwordPlain) {
- $passwordHash = password_hash($passwordPlain, PASSWORD_BCRYPT, array('cost' => self::BCRYPT_COST));
- $passwordPlain = '';
- $passwordHash = preg_replace('/^\$2[xy]\$/', '\$2a\$', $passwordHash); //Compatibility with bcrypt.js
- return $passwordHash == '' ? '' : $passwordHash;
- }
-
/**
* The username is also used as folder name, file name, and part of SQL table name.
* '_' is a reserved internal username.
@@ -25,15 +14,7 @@ class FreshRSS_user_Controller extends Minz_ActionController {
return preg_match('/^' . self::USERNAME_PATTERN . '$/', $username) === 1;
}
- public static function deleteFeverKey($username) {
- $userConfig = get_user_configuration($username);
- if ($userConfig !== null && ctype_xdigit($userConfig->feverKey)) {
- return @unlink(DATA_PATH . '/fever/.key-' . sha1(FreshRSS_Context::$system_conf->salt) . '-' . $userConfig->feverKey . '.txt');
- }
- return false;
- }
-
- public static function updateUser($user, $email, $passwordPlain, $apiPasswordPlain, $userConfigUpdated = array()) {
+ public static function updateUser($user, $email, $passwordPlain, $userConfigUpdated = array()) {
$userConfig = get_user_configuration($user);
if ($userConfig === null) {
return false;
@@ -51,33 +32,10 @@ class FreshRSS_user_Controller extends Minz_ActionController {
}
if ($passwordPlain != '') {
- $passwordHash = self::hashPassword($passwordPlain);
+ $passwordHash = FreshRSS_password_Util::hash($passwordPlain);
$userConfig->passwordHash = $passwordHash;
}
- if ($apiPasswordPlain != '') {
- $apiPasswordHash = self::hashPassword($apiPasswordPlain);
- $userConfig->apiPasswordHash = $apiPasswordHash;
-
- $feverPath = DATA_PATH . '/fever/';
-
- if (!file_exists($feverPath)) {
- @mkdir($feverPath, 0770, true);
- }
-
- if (!is_writable($feverPath)) {
- Minz_Log::error("Could not save Fever API credentials. The directory does not have write access.");
- } else {
- self::deleteFeverKey($user);
- $userConfig->feverKey = strtolower(md5("{$user}:{$apiPasswordPlain}"));
- $ok = file_put_contents($feverPath . '.key-' . sha1(FreshRSS_Context::$system_conf->salt) . '-' . $userConfig->feverKey . '.txt', $user) !== false;
-
- if (!$ok) {
- Minz_Log::warning('Could not save Fever API credentials. Unknown error.', ADMIN_LOG);
- }
- }
- }
-
if (is_array($userConfigUpdated)) {
foreach ($userConfigUpdated as $configName => $configValue) {
if ($configValue !== null) {
@@ -100,10 +58,8 @@ class FreshRSS_user_Controller extends Minz_ActionController {
Minz_Request::_param('newPasswordPlain'); //Discard plain-text password ASAP
$_POST['newPasswordPlain'] = '';
- $apiPasswordPlain = Minz_Request::param('apiPasswordPlain', '', true);
-
$username = Minz_Request::param('username');
- $ok = self::updateUser($username, null, $passwordPlain, $apiPasswordPlain, array(
+ $ok = self::updateUser($username, null, $passwordPlain, array(
'token' => Minz_Request::param('token', null),
));
@@ -118,7 +74,6 @@ class FreshRSS_user_Controller extends Minz_ActionController {
Minz_Request::bad(_t('feedback.user.updated.error', $username),
array('c' => 'user', 'a' => 'manage'));
}
-
}
}
@@ -130,7 +85,7 @@ class FreshRSS_user_Controller extends Minz_ActionController {
Minz_Error::error(403);
}
- $email_not_verified = FreshRSS_Context::$user_conf->email_validation_token !== '';
+ $email_not_verified = FreshRSS_Context::$user_conf->email_validation_token != '';
$this->view->disable_aside = false;
if ($email_not_verified) {
$this->view->_layout('simple');
@@ -151,8 +106,6 @@ class FreshRSS_user_Controller extends Minz_ActionController {
Minz_Request::_param('newPasswordPlain'); //Discard plain-text password ASAP
$_POST['newPasswordPlain'] = '';
- $apiPasswordPlain = Minz_Request::param('apiPasswordPlain', '', true);
-
if ($system_conf->force_email_validation && empty($email)) {
Minz_Request::bad(
_t('user.email.feedback.required'),
@@ -171,7 +124,6 @@ class FreshRSS_user_Controller extends Minz_ActionController {
Minz_Session::param('currentUser'),
$email,
$passwordPlain,
- $apiPasswordPlain,
array(
'token' => Minz_Request::param('token', null),
)
@@ -194,6 +146,23 @@ class FreshRSS_user_Controller extends Minz_ActionController {
}
}
+ public function purgeAction() {
+ if (!FreshRSS_Auth::hasAccess('admin')) {
+ Minz_Error::error(403);
+ }
+
+ if (Minz_Request::isPost()) {
+ $username = Minz_Request::param('username');
+
+ if (!FreshRSS_UserDAO::exists($username)) {
+ Minz_Error::error(404);
+ }
+
+ $feedDAO = FreshRSS_Factory::createFeedDao($username);
+ $feedDAO->purge();
+ }
+ }
+
/**
* This action displays the user management page.
*/
@@ -204,22 +173,26 @@ class FreshRSS_user_Controller extends Minz_ActionController {
Minz_View::prependTitle(_t('admin.user.title') . ' · ');
+ if (Minz_Request::isPost()) {
+ $action = Minz_Request::param('action');
+ if ('delete' === $action) {
+ $this->deleteAction();
+ } elseif ('update' === $action) {
+ $this->updateAction();
+ } elseif ('purge' === $action) {
+ $this->purgeAction();
+ }
+ }
+
$this->view->show_email_field = FreshRSS_Context::$system_conf->force_email_validation;
$this->view->current_user = Minz_Request::param('u');
- $this->view->nb_articles = 0;
- $this->view->size_user = 0;
- if ($this->view->current_user) {
- // Get information about the current user.
- $entryDAO = FreshRSS_Factory::createEntryDao($this->view->current_user);
- $this->view->nb_articles = $entryDAO->count();
-
- $databaseDAO = FreshRSS_Factory::createDatabaseDAO($this->view->current_user);
- $this->view->size_user = $databaseDAO->size();
+ foreach (listUsers() as $user) {
+ $this->view->users[$user] = $this->retrieveUserDetails($user);
}
}
- public static function createUser($new_user_name, $email, $passwordPlain, $apiPasswordPlain = '', $userConfigOverride = [], $insertDefaultFeeds = true) {
+ public static function createUser($new_user_name, $email, $passwordPlain, $userConfigOverride = [], $insertDefaultFeeds = true) {
$userConfig = [];
$customUserConfigPath = join_path(DATA_PATH, 'config-user.custom.php');
@@ -271,7 +244,7 @@ class FreshRSS_user_Controller extends Minz_ActionController {
}
}
- $ok &= self::updateUser($new_user_name, $email, $passwordPlain, $apiPasswordPlain);
+ $ok &= self::updateUser($new_user_name, $email, $passwordPlain);
}
return $ok;
}
@@ -326,7 +299,7 @@ class FreshRSS_user_Controller extends Minz_ActionController {
);
}
- $ok = self::createUser($new_user_name, $email, $passwordPlain, '', array('language' => $new_user_language));
+ $ok = self::createUser($new_user_name, $email, $passwordPlain, array('language' => $new_user_language));
Minz_Request::_param('new_user_passwordPlain'); //Discard plain-text password ASAP
$_POST['new_user_passwordPlain'] = '';
invalidateHttpCache();
@@ -366,7 +339,7 @@ class FreshRSS_user_Controller extends Minz_ActionController {
$user_data = join_path(DATA_PATH, 'users', $username);
$ok &= is_dir($user_data);
if ($ok) {
- self::deleteFeverKey($username);
+ FreshRSS_fever_Util::deleteKey($username);
$oldUserDAO = FreshRSS_Factory::createUserDao($username);
$ok &= $oldUserDAO->deleteUser();
$ok &= recursive_unlink($user_data);
@@ -542,4 +515,34 @@ class FreshRSS_user_Controller extends Minz_ActionController {
Minz_Request::forward($redirect_url, true);
}
+
+ public function detailsAction() {
+ if (!FreshRSS_Auth::hasAccess('admin')) {
+ Minz_Error::error(403);
+ }
+
+ $username = Minz_Request::param('username');
+ if (!FreshRSS_UserDAO::exists($username)) {
+ Minz_Error::error(404);
+ }
+
+ $this->view->username = $username;
+ $this->view->details = $this->retrieveUserDetails($username);
+ }
+
+ private function retrieveUserDetails($username) {
+ $feedDAO = FreshRSS_Factory::createFeedDao($username);
+ $entryDAO = FreshRSS_Factory::createEntryDao($username);
+ $databaseDAO = FreshRSS_Factory::createDatabaseDAO($username);
+
+ $userConfiguration = get_user_configuration($username);
+
+ return array(
+ 'feed_count' => $feedDAO->count(),
+ 'article_count' => $entryDAO->count(),
+ 'database_size' => $databaseDAO->size(),
+ 'language' => $userConfiguration->language,
+ 'mail_login' => $userConfiguration->mail_login,
+ );
+ }
}
diff --git a/app/FreshRSS.php b/app/FreshRSS.php
index d472a2147..8d079b268 100644
--- a/app/FreshRSS.php
+++ b/app/FreshRSS.php
@@ -155,6 +155,7 @@ class FreshRSS extends Minz_FrontController {
Minz_Request::is('user', 'profile') ||
Minz_Request::is('user', 'delete') ||
Minz_Request::is('auth', 'logout') ||
+ Minz_Request::is('feed', 'actualize') ||
Minz_Request::is('javascript', 'nonce')
);
if ($email_not_verified && !$action_is_allowed) {
diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php
index 2bff50d52..417b37773 100644
--- a/app/Models/FeedDAO.php
+++ b/app/Models/FeedDAO.php
@@ -421,6 +421,29 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
return $affected;
}
+ public function purge() {
+ $sql = 'DELETE FROM `_entry`';
+ $stm = $this->pdo->prepare($sql);
+ $this->pdo->beginTransaction();
+ if (!($stm && $stm->execute())) {
+ $info = $stm == null ? $this->pdo->errorInfo() : $stm->errorInfo();
+ Minz_Log::error('SQL error truncate: ' . $info[2]);
+ $this->pdo->rollBack();
+ return false;
+ }
+
+ $sql = 'UPDATE `_feed` SET `cache_nbEntries` = 0, `cache_nbUnreads` = 0';
+ $stm = $this->pdo->prepare($sql);
+ if (!($stm && $stm->execute())) {
+ $info = $stm == null ? $this->pdo->errorInfo() : $stm->errorInfo();
+ Minz_Log::error('SQL error truncate: ' . $info[2]);
+ $this->pdo->rollBack();
+ return false;
+ }
+
+ $this->pdo->commit();
+ }
+
public static function daoToFeed($listDAO, $catID = null) {
$list = array();
@@ -481,4 +504,14 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
$stm->execute(array(':new_value' => -3600, ':old_value' => -1));
}
}
+
+ public function count() {
+ $sql = 'SELECT COUNT(e.id) AS count FROM `_feed` e';
+ $stm = $this->pdo->query($sql);
+ if ($stm == false) {
+ return false;
+ }
+ $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0);
+ return isset($res[0]) ? $res[0] : 0;
+ }
}
diff --git a/app/Models/FeedDAOSQLite.php b/app/Models/FeedDAOSQLite.php
index 0f685867a..397b69941 100644
--- a/app/Models/FeedDAOSQLite.php
+++ b/app/Models/FeedDAOSQLite.php
@@ -13,5 +13,4 @@ class FreshRSS_FeedDAOSQLite extends FreshRSS_FeedDAO {
}
return false;
}
-
}
diff --git a/app/Models/Share.php b/app/Models/Share.php
index 7378b30df..cf9966a4b 100644
--- a/app/Models/Share.php
+++ b/app/Models/Share.php
@@ -76,6 +76,7 @@ class FreshRSS_Share {
private $help_url = '';
private $custom_name = null;
private $base_url = null;
+ private $id = null;
private $title = null;
private $link = null;
private $method = 'GET';
@@ -118,12 +119,13 @@ class FreshRSS_Share {
/**
* Update a FreshRSS_Share object with information from an array.
* @param $options is a list of informations to update where keys should be
- * in this list: name, url, title, link.
+ * in this list: name, url, id, title, link.
*/
public function update($options) {
$available_options = array(
'name' => 'custom_name',
'url' => 'base_url',
+ 'id' => 'id',
'title' => 'title',
'link' => 'link',
'method' => 'method',
@@ -196,11 +198,13 @@ class FreshRSS_Share {
*/
public function url() {
$matches = array(
+ '~ID~',
'~URL~',
'~TITLE~',
'~LINK~',
);
$replaces = array(
+ $this->id(),
$this->base_url,
$this->title(),
$this->link(),
@@ -209,6 +213,18 @@ class FreshRSS_Share {
}
/**
+ * Return the id.
+ * @param $raw true if we should get the id without transformations.
+ */
+ public function id($raw = false) {
+ if ($raw) {
+ return $this->id;
+ }
+
+ return $this->transform($this->id, $this->getTransform('id'));
+ }
+
+ /**
* Return the title.
* @param $raw true if we should get the title without transformations.
*/
diff --git a/app/Utils/feverUtil.php b/app/Utils/feverUtil.php
new file mode 100644
index 000000000..83921943c
--- /dev/null
+++ b/app/Utils/feverUtil.php
@@ -0,0 +1,80 @@
+<?php
+
+class FreshRSS_fever_Util {
+ const FEVER_PATH = DATA_PATH . '/fever';
+
+ /**
+ * Make sure the fever path exists and is writable.
+ *
+ * @return boolean true if the path is writable, else false.
+ */
+ public static function checkFeverPath() {
+ if (!file_exists(self::FEVER_PATH)) {
+ @mkdir(self::FEVER_PATH, 0770, true);
+ }
+
+ $ok = is_writable(self::FEVER_PATH);
+ if (!$ok) {
+ Minz_Log::error("Could not save Fever API credentials. The directory does not have write access.");
+ }
+ return $ok;
+ }
+
+ /**
+ * Return the corresponding path for a fever key.
+ *
+ * @param string
+ * @return string
+ */
+ public static function getKeyPath($feverKey) {
+ $salt = sha1(FreshRSS_Context::$system_conf->salt);
+ return self::FEVER_PATH . '/.key-' . $salt . '-' . $feverKey . '.txt';
+ }
+
+ /**
+ * Update the fever key of a user.
+ *
+ * @param string
+ * @param string
+ * @return string the Fever key, or false if the update failed
+ */
+ public static function updateKey($username, $passwordPlain) {
+ $ok = self::checkFeverPath();
+ if (!$ok) {
+ return false;
+ }
+
+ self::deleteKey($username);
+
+ $feverKey = strtolower(md5("{$username}:{$passwordPlain}"));
+ $feverKeyPath = self::getKeyPath($feverKey);
+ $res = file_put_contents($feverKeyPath, $username);
+ if ($res !== false) {
+ return $feverKey;
+ } else {
+ Minz_Log::warning('Could not save Fever API credentials. Unknown error.', ADMIN_LOG);
+ return false;
+ }
+ }
+
+ /**
+ * Delete the Fever key of a user.
+ *
+ * @param string
+ * @return boolean true if the deletion succeeded, else false.
+ */
+ public static function deleteKey($username) {
+ $userConfig = get_user_configuration($username);
+ if ($userConfig === null) {
+ return false;
+ }
+
+ $feverKey = $userConfig->feverKey;
+ if (!ctype_xdigit($feverKey)) {
+ return false;
+ }
+
+ $feverKeyPath = self::getKeyPath($feverKey);
+ return @unlink($feverKeyPath);
+ }
+}
diff --git a/app/Utils/passwordUtil.php b/app/Utils/passwordUtil.php
new file mode 100644
index 000000000..fd71d4b72
--- /dev/null
+++ b/app/Utils/passwordUtil.php
@@ -0,0 +1,27 @@
+<?php
+
+class FreshRSS_password_Util {
+ // Will also have to be computed client side on mobile devices,
+ // so do not use a too high cost
+ const BCRYPT_COST = 9;
+
+ /**
+ * Return a hash of a plain password, using BCRYPT
+ *
+ * @param string
+ * @return string
+ */
+ public static function hash($passwordPlain) {
+ $passwordHash = password_hash(
+ $passwordPlain,
+ PASSWORD_BCRYPT,
+ array('cost' => self::BCRYPT_COST)
+ );
+ $passwordPlain = '';
+
+ // Compatibility with bcrypt.js
+ $passwordHash = preg_replace('/^\$2[xy]\$/', '\$2a\$', $passwordHash);
+
+ return $passwordHash == '' ? '' : $passwordHash;
+ }
+}
diff --git a/app/i18n/cz/admin.php b/app/i18n/cz/admin.php
index a2a509560..18f7520a7 100644
--- a/app/i18n/cz/admin.php
+++ b/app/i18n/cz/admin.php
@@ -67,8 +67,8 @@ return array(
'ok' => 'Máte rozšíření JSON.',
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
'nok' => 'Nemáte framework Minz.',
@@ -83,9 +83,9 @@ return array(
'ok' => 'Máte PDO a alespoň jeden z podporovaných ovladačů (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'PHP instalace',
'nok' => 'Vaše verze PHP je %s, ale FreshRSS vyžaduje alespoň verzi %s.',
'ok' => 'Vaše verze PHP je %s a je kompatibilní s FreshRSS.',
+ '_' => 'PHP instalace',
),
'tables' => array(
'nok' => 'V databázi chybí jedna nevo více tabulek.',
@@ -106,26 +106,25 @@ return array(
),
),
'extensions' => array(
- 'author' => 'Author', //TODO - Translation
- 'community' => 'Available community extensions', //TODO - Translation
- 'description' => 'Description', //TODO - Translation
+ 'author' => 'Author', // TODO - Translation
+ 'community' => 'Available community extensions', // TODO - Translation
+ 'description' => 'Description', // TODO - Translation
'disabled' => 'Vypnuto',
'empty_list' => 'Není naistalováno žádné rozšíření',
'enabled' => 'Zapnuto',
- 'latest' => 'Installed', //TODO - Translation
- 'name' => 'Name', //TODO - Translation
+ 'latest' => 'Installed', // TODO - Translation
+ 'name' => 'Name', // TODO - Translation
'no_configure_view' => 'Toto rozšíření nemá žádné možnosti nastavení.',
'system' => array(
- '_' => 'Systémová rozšíření',
'no_rights' => 'Systémová rozšíření (na ně nemáte oprávnění)',
+ '_' => 'Systémová rozšíření',
),
'title' => 'Rozšíření',
- 'update' => 'Update available', //TODO - Translation
+ 'update' => 'Update available', // TODO - Translation
'user' => 'Uživatelská rozšíření',
- 'version' => 'Version', //TODO - Translation
+ 'version' => 'Version', // TODO - Translation
),
'stats' => array(
- '_' => 'Statistika',
'all_feeds' => 'Všechny kanály',
'category' => 'Kategorie',
'entry_count' => 'Počet článků',
@@ -155,46 +154,53 @@ return array(
'status_unread' => 'Nepřečtené',
'title' => 'Statistika',
'top_feed' => 'Top ten kanálů',
+ '_' => 'Statistika',
),
'system' => array(
- '_' => 'System configuration', //TODO - Translation
- 'auto-update-url' => 'Auto-update server URL', //TODO - Translation
+ 'auto-update-url' => 'Auto-update server URL', // TODO - Translation
'cookie-duration' => array(
- 'help' => 'in seconds', //TODO - Translation
- 'number' => 'Duration to keep logged in', //TODO - Translation
+ 'help' => 'in seconds', // TODO - Translation
+ 'number' => 'Duration to keep logged in', // TODO - Translation
),
- 'force_email_validation' => 'Force email addresses validation', //TODO - Translation
- 'instance-name' => 'Instance name', //TODO - Translation
- 'max-categories' => 'Categories per user limit', //TODO - Translation
- 'max-feeds' => 'Feeds per user limit', //TODO - Translation
+ 'force_email_validation' => 'Force email addresses validation', // TODO - Translation
+ 'instance-name' => 'Instance name', // TODO - Translation
+ 'max-categories' => 'Categories per user limit', // TODO - Translation
+ 'max-feeds' => 'Feeds per user limit', // TODO - Translation
'registration' => array(
'help' => '0 znamená žádná omezení účtu',
'number' => 'Maximální počet účtů',
),
+ '_' => 'System configuration', // TODO - Translation
),
'update' => array(
- '_' => 'Aktualizace systému',
'apply' => 'Použít',
'check' => 'Zkontrolovat aktualizace',
'current_version' => 'Vaše instalace FreshRSS je verze %s.',
'last' => 'Poslední kontrola: %s',
'none' => 'Žádné nové aktualizace',
'title' => 'Aktualizovat systém',
+ '_' => 'Aktualizace systému',
),
'user' => array(
'articles_and_size' => '%s článků (%s)',
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => 'Vytvořit nového uživatele',
- 'delete_users' => 'Delete user', //TODO - Translation
+ 'database_size' => 'Database size', // TODO - Translation
+ 'delete_users' => 'Delete user', // TODO - Translation
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => 'Jazyk',
+ 'list' => 'User list', // TODO - Translation
'number' => 'Zatím je vytvořen %d účet',
'numbers' => 'Zatím je vytvořeno %d účtů',
'password_form' => 'Heslo<br /><small>(pro přihlášení webovým formulářem)</small>',
'password_format' => 'Alespoň 7 znaků',
- 'selected' => 'Selected user', //TODO - Translation
+ 'selected' => 'Selected user', // TODO - Translation
'title' => 'Správa uživatelů',
- 'update_users' => 'Update user', //TODO - Translation
- 'user_list' => 'Seznam uživatelů',
+ 'update_users' => 'Update user', // TODO - Translation
'username' => 'Přihlašovací jméno',
'users' => 'Uživatelé',
+ 'user_list' => 'Seznam uživatelů',
),
);
diff --git a/app/i18n/cz/conf.php b/app/i18n/cz/conf.php
index 056e895a7..08139d244 100644
--- a/app/i18n/cz/conf.php
+++ b/app/i18n/cz/conf.php
@@ -2,34 +2,33 @@
return array(
'archiving' => array(
- '_' => 'Archivace',
'delete_after' => 'Smazat články starší než',
- 'exception' => 'Purge exception', //TODO - Translation
+ 'exception' => 'Purge exception', // TODO - Translation
'help' => 'Více možností je dostupných v nastavení jednotlivých kanálů',
- 'keep_favourites' => 'Never delete favourites', //TODO - Translation
+ 'keep_favourites' => 'Never delete favourites', // TODO - Translation
+ 'keep_labels' => 'Never delete labels', // TODO - Translation
+ 'keep_max' => 'Maximum number of articles to keep', // TODO - Translation
'keep_min_by_feed' => 'Zachovat tento minimální počet článků v každém kanálu',
- 'keep_labels' => 'Never delete labels', //TODO - Translation
- 'keep_unreads' => 'Never delete unreads', //TODO - Translation
- 'maintenance' => 'Maintenance', //TODO - Translation
+ 'keep_period' => 'Maximum age of articles to keep', // TODO - Translation
+ 'keep_unreads' => 'Never delete unreads', // TODO - Translation
+ 'maintenance' => 'Maintenance', // TODO - Translation
'optimize' => 'Optimalizovat databázi',
'optimize_help' => 'Občasná údržba zmenší velikost databáze',
- 'policy' => 'Purge policy', //TODO - Translation
- 'policy_warning' => 'If no purge policy is selected, every article will be kept.', //TODO - Translation
+ 'policy' => 'Purge policy', // TODO - Translation
+ 'policy_warning' => 'If no purge policy is selected, every article will be kept.', // TODO - Translation
'purge_now' => 'Vyčistit nyní',
- 'keep_max' => 'Maximum number of articles to keep', //TODO - Translation
- 'keep_period' => 'Maximum age of articles to keep', //TODO - Translation
'title' => 'Archivace',
'ttl' => 'Neaktualizovat častěji než',
+ '_' => 'Archivace',
),
'display' => array(
- '_' => 'Zobrazení',
'icon' => array(
'bottom_line' => 'Spodní řádek',
+ 'display_authors' => 'Authors', // TODO - Translation
'entry' => 'Ikony článků',
'publication_date' => 'Datum vydání',
- 'related_tags' => 'Související tagy', //TODO - Translation
+ 'related_tags' => 'Související tagy',
'sharing' => 'Sdílení',
- 'display_authors' => 'Authors', //TODO - Translation
'top_line' => 'Horní řádek',
),
'language' => 'Jazyk',
@@ -37,7 +36,7 @@ return array(
'seconds' => 'sekund (0 znamená žádný timeout)',
'timeout' => 'Timeout HTML5 notifikací',
),
- 'show_nav_buttons' => 'Show the navigation buttons', //TODO - Translation
+ 'show_nav_buttons' => 'Show the navigation buttons', // TODO - Translation
'theme' => 'Vzhled',
'title' => 'Zobrazení',
'width' => array(
@@ -47,34 +46,35 @@ return array(
'no_limit' => 'Bez limitu',
'thin' => 'Tenká',
),
+ '_' => 'Zobrazení',
),
'profile' => array(
- '_' => 'Správa profilu',
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => 'Smazání účtu',
'warn' => 'Váš účet bude smazán spolu se všemi souvisejícími daty',
+ '_' => 'Smazání účtu',
),
'email' => 'Email',
'password_api' => 'Password API<br /><small>(tzn. pro mobilní aplikace)</small>',
'password_form' => 'Heslo<br /><small>(pro přihlášení webovým formulářem)</small>',
'password_format' => 'Alespoň 7 znaků',
'title' => 'Profil',
+ '_' => 'Správa profilu',
),
'query' => array(
- '_' => 'Uživatelské dotazy',
'deprecated' => 'Tento dotaz již není platný. Odkazovaná kategorie nebo kanál byly smazány.',
- 'display' => 'Display user query results', //TODO - Translation
+ 'display' => 'Display user query results', // TODO - Translation
'filter' => 'Filtr aplikován:',
'get_all' => 'Zobrazit všechny články',
'get_category' => 'Zobrazit "%s" kategorii',
'get_favorite' => 'Zobrazit oblíbené články',
'get_feed' => 'Zobrazit "%s" článkek',
- 'no_filter' => 'Zrušit filtr',
'none' => 'Ještě jste nevytvořil žádný uživatelský dotaz.',
+ 'no_filter' => 'Zrušit filtr',
'number' => 'Dotaz n°%d',
'order_asc' => 'Zobrazit nejdříve nejstarší články',
'order_desc' => 'Zobrazit nejdříve nejnovější články',
- 'remove' => 'Remove user query', //TODO - Translation
+ 'remove' => 'Remove user query', // TODO - Translation
'search' => 'Hledat "%s"',
'state_0' => 'Zobrazit všechny články',
'state_1' => 'Zobrazit přečtené články',
@@ -85,17 +85,17 @@ return array(
'state_6' => 'Zobrazit oblíbené nepřečtené články',
'state_7' => 'Zobrazit oblíbené články',
'state_8' => 'Zobrazit všechny články vyjma oblíbených',
- 'state_9' => 'Zobrazit všechny přečtené články vyjma oblíbených',
- 'state_10' => 'Zobrazit všechny nepřečtené články vyjma oblíbených',
+ 'state_9' => 'Zobrazit všechny přečtené články vyjma oblíbených',
+ 'state_10' => 'Zobrazit všechny nepřečtené články vyjma oblíbených',
'state_11' => 'Zobrazit všechny články vyjma oblíbených',
'state_12' => 'Zobrazit všechny články',
'state_13' => 'Zobrazit přečtené články',
'state_14' => 'Zobrazit nepřečtené články',
'state_15' => 'Zobrazit všechny články',
'title' => 'Uživatelské dotazy',
+ '_' => 'Uživatelské dotazy',
),
'reading' => array(
- '_' => 'Čtení',
'after_onread' => 'Po “označit vše jako přečtené”,',
'articles_per_page' => 'Počet článků na stranu',
'auto_load_more' => 'Načítat další články dole na stránce',
@@ -116,16 +116,16 @@ return array(
'when' => 'Označit článek jako přečtený…',
),
'show' => array(
- '_' => 'Počet zobrazených článků',
'adaptive' => 'Vyberte zobrazení',
'all_articles' => 'Zobrazit všechny články',
'unread' => 'Zobrazit jen nepřečtené',
+ '_' => 'Počet zobrazených článků',
),
- 'sides_close_article' => 'Clicking outside of article text area closes the article', //TODO - Translation
+ 'sides_close_article' => 'Clicking outside of article text area closes the article', // TODO - Translation
'sort' => array(
- '_' => 'Řazení',
'newer_first' => 'Nejdříve nejnovější',
'older_first' => 'Nejdříve nejstarší',
+ '_' => 'Řazení',
),
'sticky_post' => 'Při otevření posunout článek nahoru',
'title' => 'Čtení',
@@ -135,26 +135,26 @@ return array(
'normal' => 'Normální',
'reader' => 'Čtení',
),
+ '_' => 'Čtení',
),
'sharing' => array(
- '_' => 'Sdílení',
- 'add' => 'Add a sharing method', //TODO - Translation
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
- 'email' => 'Email',
- 'facebook' => 'Facebook',
+ 'add' => 'Add a sharing method', // TODO - Translation
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
+ 'email' => 'Email', // TODO - Translation
+ 'facebook' => 'Facebook', // TODO - Translation
'more_information' => 'Více informací',
'print' => 'Tisk',
- 'remove' => 'Remove sharing method', //TODO - Translation
- 'shaarli' => 'Shaarli',
+ 'remove' => 'Remove sharing method', // TODO - Translation
+ 'shaarli' => 'Shaarli', // TODO - Translation
'share_name' => 'Jméno pro zobrazení',
'share_url' => 'Jakou URL použít pro sdílení',
'title' => 'Sdílení',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag', // TODO - Translation
+ '_' => 'Sdílení',
),
'shortcut' => array(
- '_' => 'Zkratky',
'article_action' => 'Články - akce',
'auto_share' => 'Sdílet',
'auto_share_help' => 'Je-li nastavena pouze jedna možnost sdílení, bude použita. Další možnosti jsou dostupné pomocí jejich čísla.',
@@ -162,7 +162,7 @@ return array(
'collapse_article' => 'Srolovat',
'first_article' => 'Skočit na první článek',
'focus_search' => 'Hledání',
- 'global_view' => 'Switch to global view', //TODO - Translation
+ 'global_view' => 'Switch to global view', // TODO - Translation
'help' => 'Zobrazit documentaci',
'javascript' => 'Pro použití zkratek musí být povolen JavaScript',
'last_article' => 'Skočit na poslední článek',
@@ -171,21 +171,22 @@ return array(
'mark_read' => 'Označit jako přečtené',
'navigation' => 'Navigace',
'navigation_help' => 'Pomocí přepínače "Shift" fungují navigační zkratky v rámci kanálů.<br/>Pomocí přepínače "Alt" fungují v rámci kategorií.',
- 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', //TODO - Translation
+ 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', // TODO - Translation
'next_article' => 'Skočit na další článek',
- 'normal_view' => 'Switch to normal view', //TODO - Translation
+ 'normal_view' => 'Switch to normal view', // TODO - Translation
'other_action' => 'Ostatní akce',
'previous_article' => 'Skočit na předchozí článek',
- 'reading_view' => 'Switch to reading view', //TODO - Translation
- 'rss_view' => 'Open RSS view in a new tab', //TODO - Translation
+ 'reading_view' => 'Switch to reading view', // TODO - Translation
+ 'rss_view' => 'Open RSS view in a new tab', // TODO - Translation
'see_on_website' => 'Navštívit původní webovou stránku',
'shift_for_all_read' => '+ <code>shift</code> označí vše jako přečtené',
- 'skip_next_article' => 'Focus next without opening', //TODO - Translation
- 'skip_previous_article' => 'Focus previous without opening', //TODO - Translation
+ 'skip_next_article' => 'Focus next without opening', // TODO - Translation
+ 'skip_previous_article' => 'Focus previous without opening', // TODO - Translation
'title' => 'Zkratky',
'user_filter' => 'Aplikovat uživatelské filtry',
'user_filter_help' => 'Je-li nastaven pouze jeden filtr, bude použit. Další filtry jsou dostupné pomocí jejich čísla.',
- 'views' => 'Views', //TODO - Translation
+ 'views' => 'Views', // TODO - Translation
+ '_' => 'Zkratky',
),
'user' => array(
'articles_and_size' => '%s článků (%s)',
diff --git a/app/i18n/cz/feedback.php b/app/i18n/cz/feedback.php
index 3d0dcbc96..112dc963c 100644
--- a/app/i18n/cz/feedback.php
+++ b/app/i18n/cz/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => 'Optimalizace dokončena',
- ),
'access' => array(
'denied' => 'Nemáte oprávnění přistupovat na tuto stránku',
'not_found' => 'Tato stránka neexistuje',
),
+ 'admin' => array(
+ 'optimization_complete' => 'Optimalizace dokončena',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => 'Nastal problém s konfigurací přihlašovacího systému. Zkuste to prosím později.',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s nelze zapnout. Pro více detailů <a href="%s">zkontrolujte logy FreshRSS</a>.',
'ok' => '%s je nyní zapnut',
),
- 'no_access' => 'Nemáte přístup k %s',
'not_enabled' => '%s není ještě zapnut',
'not_found' => '%s neexistuje',
+ 'no_access' => 'Nemáte přístup k %s',
),
'import_export' => array(
'export_no_zip_extension' => 'Na serveru není naistalována podpora ZIP. Zkuste prosím exportovat soubory jeden po druhém.',
@@ -57,8 +63,8 @@ return array(
'sub' => array(
'actualize' => 'Aktualizovat',
'articles' => array(
- 'marked_read' => 'The selected articles have been marked as read.', //TODO - Translation
- 'marked_unread' => 'The articles have been marked as unread.', //TODO - Translation
+ 'marked_read' => 'The selected articles have been marked as read.', // TODO - Translation
+ 'marked_unread' => 'The articles have been marked as unread.', // TODO - Translation
),
'category' => array(
'created' => 'Kategorie %s byla vytvořena.',
@@ -66,10 +72,10 @@ return array(
'emptied' => 'Kategorie byla vyprázdněna',
'error' => 'Kategorii nelze aktualizovat',
'name_exists' => 'Název kategorie již existuje.',
- 'no_id' => 'Musíte upřesnit id kategorie.',
- 'no_name' => 'Název kategorie nemůže být prázdný.',
'not_delete_default' => 'Nelze smazat výchozí kategorii!',
'not_exist' => 'Tato kategorie neexistuje!',
+ 'no_id' => 'Musíte upřesnit id kategorie.',
+ 'no_name' => 'Název kategorie nemůže být prázdný.',
'over_max' => 'Dosáhl jste maximálního počtu kategorií (%d)',
'updated' => 'Kategorie byla aktualizována.',
),
@@ -80,12 +86,12 @@ return array(
'already_subscribed' => 'Již jste přihlášen k odběru <em>%s</em>',
'deleted' => 'Kanál byl smazán',
'error' => 'Kanál nelze aktualizovat',
- 'internal_problem' => 'RSS kanál nelze přidat. Pro detaily <a href="%s">zkontrolujte logy FreshRSS</a>.', //TODO - Translation
+ 'internal_problem' => 'RSS kanál nelze přidat. Pro detaily <a href="%s">zkontrolujte logy FreshRSS</a>.',
'invalid_url' => 'URL <em>%s</em> není platné',
+ 'not_added' => '<em>%s</em> nemůže být přidán',
+ 'no_refresh' => 'Nelze obnovit žádné kanály…',
'n_actualized' => '%d kanálů bylo aktualizováno',
'n_entries_deleted' => '%d článků bylo smazáno',
- 'no_refresh' => 'Nelze obnovit žádné kanály…',
- 'not_added' => '<em>%s</em> nemůže být přidán',
'over_max' => 'Dosáhl jste maximálního počtu kanálů (%d)',
'updated' => 'Kanál byl aktualizován',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => 'Uživatel %s byl vytvořen',
'error' => 'Uživatele %s nelze vytvořit',
+ '_' => 'Uživatel %s byl vytvořen',
),
'deleted' => array(
- '_' => 'Uživatel %s byl smazán',
'error' => 'Uživatele %s nelze smazat',
+ '_' => 'Uživatel %s byl smazán',
),
'updated' => array(
- '_' => 'User %s has been updated', //TODO - Translation
- 'error' => 'User %s has not been updated', //TODO - Translation
+ 'error' => 'User %s has not been updated', // TODO - Translation
+ '_' => 'User %s has been updated', // TODO - Translation
),
),
);
diff --git a/app/i18n/cz/gen.php b/app/i18n/cz/gen.php
index de1456187..c67583f5c 100644
--- a/app/i18n/cz/gen.php
+++ b/app/i18n/cz/gen.php
@@ -3,45 +3,46 @@
return array(
'action' => array(
'actualize' => 'Aktualizovat',
- 'back' => '← Go back', //TODO - Translation
+ 'back' => '← Go back', // TODO - Translation
'back_to_rss_feeds' => '← Zpět na seznam RSS kanálů',
'cancel' => 'Zrušit',
'create' => 'Vytvořit',
'disable' => 'Zakázat',
'empty' => 'Vyprázdnit',
'enable' => 'Povolit',
- 'export' => 'Export',
+ 'export' => 'Export', // TODO - Translation
'filter' => 'Filtrovat',
- 'import' => 'Import',
+ 'import' => 'Import', // TODO - Translation
'manage' => 'Spravovat',
'mark_favorite' => 'Označit jako oblíbené',
'mark_read' => 'Označit jako přečtené',
+ 'purge' => 'Purge', // TODO - Translation
'remove' => 'Odstranit',
'see_website' => 'Navštívit WWW stránku',
'submit' => 'Odeslat',
'truncate' => 'Smazat všechny články',
- 'update' => 'Update', //TODO - Translation
+ 'update' => 'Update', // TODO - Translation
),
'auth' => array(
- 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
+ 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
'email' => 'Email',
'keep_logged_in' => 'Zapamatovat přihlášení <small>(%s dny)</small>',
- 'login' => 'Login',
+ 'login' => 'Login', // TODO - Translation
'logout' => 'Odhlášení',
'password' => array(
- '_' => 'Heslo',
'format' => '<small>Alespoň 7 znaků</small>',
+ '_' => 'Heslo',
),
'registration' => array(
- '_' => 'Nový účet',
'ask' => 'Vytvořit účet?',
'title' => 'Vytvoření účtu',
+ '_' => 'Nový účet',
),
'reset' => 'Reset přihlášení',
'username' => array(
- '_' => 'Uživatel',
'admin' => 'Název administrátorského účtu',
'format' => '<small>maximálně 16 alfanumerických znaků</small>',
+ '_' => 'Uživatel',
),
),
'date' => array(
@@ -64,8 +65,8 @@ return array(
'Jan' => '\\L\\e\\d\\e\\n',
'jan' => 'led',
'january' => 'Led',
- 'Jul' => '\\Č\\e\\r\\v\\e\\n\\e\\c',
'jul' => 'čvn',
+ 'Jul' => '\\Č\\e\\r\\v\\e\\n\\e\\c',
'july' => 'Čvn',
'Jun' => '\\Č\\e\\r\\v\\e\\n',
'jun' => 'čer',
@@ -75,8 +76,8 @@ return array(
'last_month' => 'Minulý měsíc',
'last_week' => 'Minulý týden',
'last_year' => 'Minulý rok',
- 'Mar' => '\\B\\ř\\e\\z\\e\\n',
'mar' => 'bře',
+ 'Mar' => '\\B\\ř\\e\\z\\e\\n',
'march' => 'Bře',
'May' => '\\K\\v\\ě\\t\\e\\n',
'may' => 'Květen',
@@ -101,8 +102,8 @@ return array(
'yesterday' => 'Včera',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => 'O FreshRSS',
+ '_' => 'FreshRSS', // TODO - Translation
),
'js' => array(
'category_empty' => 'Prázdná kategorie',
@@ -117,20 +118,21 @@ return array(
'should_be_activated' => 'JavaScript musí být povolen',
),
'lang' => array(
- 'cz' => 'Čeština',
- 'de' => 'Deutsch',
- 'en' => 'English',
- 'es' => 'Español',
- 'fr' => 'Français',
- 'he' => 'עברית',
- 'it' => 'Italiano',
- 'kr' => '한국어',
- 'nl' => 'Nederlands',
- 'oc' => 'Occitan',
- 'pt-br' => 'Português (Brasil)',
- 'ru' => 'Русский',
- 'tr' => 'Türkçe',
- 'zh-cn' => '简体中文',
+ 'cz' => 'Čeština', // TODO - Translation
+ 'de' => 'Deutsch', // TODO - Translation
+ 'en' => 'English', // TODO - Translation
+ 'es' => 'Español', // TODO - Translation
+ 'fr' => 'Français', // TODO - Translation
+ 'he' => 'עברית', // TODO - Translation
+ 'it' => 'Italiano', // TODO - Translation
+ 'kr' => '한국어', // TODO - Translation
+ 'nl' => 'Nederlands', // TODO - Translation
+ 'oc' => 'Occitan', // TODO - Translation
+ 'pt-br' => 'Português (Brasil)', // TODO - Translation
+ 'ru' => 'Русский', // TODO - Translation
+ 'sk' => 'Slovenčina', // TODO - Translation
+ 'tr' => 'Türkçe', // TODO - Translation
+ 'zh-cn' => '简体中文', // TODO - Translation
),
'menu' => array(
'about' => 'O aplikaci',
@@ -148,7 +150,7 @@ return array(
'sharing' => 'Sdílení',
'shortcuts' => 'Zkratky',
'stats' => 'Statistika',
- 'system' => 'System configuration', //TODO - Translation
+ 'system' => 'System configuration', // TODO - Translation
'update' => 'Aktualizace',
'user_management' => 'Správa uživatelů',
'user_profile' => 'Profil',
@@ -163,31 +165,31 @@ return array(
'previous' => 'Předchozí',
),
'period' => array(
- 'days' => 'days', //TODO - Translation
- 'hours' => 'hours', //TODO - Translation
- 'months' => 'months', //TODO - Translation
- 'weeks' => 'weeks', //TODO - Translation
- 'years' => 'years', //TODO - Translation
+ 'days' => 'days', // TODO - Translation
+ 'hours' => 'hours', // TODO - Translation
+ 'months' => 'months', // TODO - Translation
+ 'weeks' => 'weeks', // TODO - Translation
+ 'years' => 'years', // TODO - Translation
),
'share' => array(
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
- 'email' => 'Email',
- 'facebook' => 'Facebook',
- 'gnusocial' => 'GNU social',
- 'jdh' => 'Journal du hacker',
- 'Known' => 'Known based sites',
- 'lemmy' => 'Lemmy',
- 'linkedin' => 'LinkedIn',
- 'mastodon' => 'Mastodon',
- 'movim' => 'Movim',
- 'pinboard' => 'Pinboard',
- 'pocket' => 'Pocket',
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
+ 'email' => 'Email', // TODO - Translation
+ 'facebook' => 'Facebook', // TODO - Translation
+ 'gnusocial' => 'GNU social', // TODO - Translation
+ 'jdh' => 'Journal du hacker', // TODO - Translation
+ 'Known' => 'Known based sites', // TODO - Translation
+ 'lemmy' => 'Lemmy', // TODO - Translation
+ 'linkedin' => 'LinkedIn', // TODO - Translation
+ 'mastodon' => 'Mastodon', // TODO - Translation
+ 'movim' => 'Movim', // TODO - Translation
+ 'pinboard' => 'Pinboard', // TODO - Translation
+ 'pocket' => 'Pocket', // TODO - Translation
'print' => 'Tisk',
- 'shaarli' => 'Shaarli',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag v1',
- 'wallabagv2' => 'wallabag v2',
+ 'shaarli' => 'Shaarli', // TODO - Translation
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag v1', // TODO - Translation
+ 'wallabagv2' => 'wallabag v2', // TODO - Translation
),
'short' => array(
'attention' => 'Upozornění!',
@@ -197,8 +199,8 @@ return array(
'damn' => 'Sakra!',
'default_category' => 'Nezařazeno',
'no' => 'Ne',
- 'not_applicable' => 'Not available', //TODO - Translation
- 'ok' => 'Ok!',
+ 'not_applicable' => 'Not available', // TODO - Translation
+ 'ok' => 'Ok!', // TODO - Translation
'or' => 'nebo',
'yes' => 'Ano',
),
diff --git a/app/i18n/cz/index.php b/app/i18n/cz/index.php
index 078ca5ca1..5715a9503 100644
--- a/app/i18n/cz/index.php
+++ b/app/i18n/cz/index.php
@@ -2,8 +2,7 @@
return array(
'about' => array(
- '_' => 'O FreshRSS',
- 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', // TODO - Translation
'bugs_reports' => 'Hlášení chyb',
'credits' => 'Poděkování',
'credits_content' => 'Některé designové prvky pocházejí z <a href="http://twitter.github.io/bootstrap/">Bootstrap</a>, FreshRSS ale tuto platformu nevyužívá. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Ikony</a> pocházejí z <a href="https://www.gnome.org/">GNOME projektu</a>. Font <em>Open Sans</em> vytvořil <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a>. FreshRSS je založen na PHP framework <a href="https://github.com/marienfressinaud/MINZ">Minz</a>.',
@@ -14,23 +13,21 @@ return array(
'title' => 'O FreshRSS',
'version' => 'Verze',
'website' => 'Webové stránka',
- ),
- 'tos' => array(
- 'title' => 'Terms of Service', // TODO - Translation
+ '_' => 'O FreshRSS',
),
'feed' => array(
'add' => 'Můžete přidat kanály.',
'empty' => 'Žádné články k zobrazení.',
'rss_of' => 'RSS kanál %s',
'title' => 'RSS kanály',
- 'title_global' => 'Přehled',
'title_fav' => 'Oblíbené',
+ 'title_global' => 'Přehled',
),
'log' => array(
- '_' => 'Logy',
'clear' => 'Vymazat logy',
'empty' => 'Log je prázdný',
'title' => 'Logy',
+ '_' => 'Logy',
),
'menu' => array(
'about' => 'O FreshRSS',
@@ -43,7 +40,7 @@ return array(
'mark_all_read' => 'Označit vše jako přečtené',
'mark_cat_read' => 'Označit kategorii jako přečtenou',
'mark_feed_read' => 'Označit kanál jako přečtený',
- 'mark_selection_unread' => 'Mark selection as unread', //TODO - Translation
+ 'mark_selection_unread' => 'Mark selection as unread', // TODO - Translation
'newer_first' => 'Nové nejdříve',
'non-starred' => 'Zobrazit vše vyjma oblíbených',
'normal_view' => 'Normální',
@@ -56,11 +53,14 @@ return array(
'starred' => 'Zobrazit oblíbené',
'stats' => 'Statistika',
'subscription' => 'Správa subskripcí',
- 'tags' => 'My labels', //TODO - Translation
+ 'tags' => 'My labels', // TODO - Translation
'unread' => 'Zobrazovat nepřečtené',
),
'share' => 'Sdílet',
'tag' => array(
- 'related' => 'Související tagy', //TODO - Translation
+ 'related' => 'Související tagy',
+ ),
+ 'tos' => array(
+ 'title' => 'Terms of Service', // TODO - Translation
),
);
diff --git a/app/i18n/cz/install.php b/app/i18n/cz/install.php
index d1b5d1616..78e300498 100644
--- a/app/i18n/cz/install.php
+++ b/app/i18n/cz/install.php
@@ -17,20 +17,19 @@ return array(
'type' => 'Způsob přihlášení',
),
'bdd' => array(
- '_' => 'Databáze',
'conf' => array(
- '_' => 'Nastavení databáze',
'ko' => 'Ověřte informace o databázi.',
'ok' => 'Nastavení databáze bylo uloženo.',
+ '_' => 'Nastavení databáze',
),
'host' => 'Hostitel',
'password' => 'Heslo',
'prefix' => 'Prefix tabulky',
'type' => 'Typ databáze',
'username' => 'Uživatel',
+ '_' => 'Databáze',
),
'check' => array(
- '_' => 'Kontrola',
'already_installed' => 'Zjistili jsme, že FreshRSS je již nainstalován!',
'cache' => array(
'nok' => 'Zkontrolujte oprávnění adresáře <em>./data/cache</em>. HTTP server musí mít do tohoto adresáře práva zápisu',
@@ -69,8 +68,8 @@ return array(
'ok' => 'Máte doporučenou knihovnu pro parsování JSON.',
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
'nok' => 'Nemáte framework Minz.',
@@ -96,10 +95,11 @@ return array(
'nok' => 'Pro parsování XML chybí požadovaná knihovna.',
'ok' => 'Máte požadovanou knihovnu pro parsování XML.',
),
+ '_' => 'Kontrola',
),
'conf' => array(
- '_' => 'Obecná nastavení',
'ok' => 'Nastavení bylo uloženo.',
+ '_' => 'Obecná nastavení',
),
'congratulations' => 'Gratulujeme!',
'default_user' => 'Jméno výchozího uživatele <small>(maximálně 16 alfanumerických znaků)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => 'Reinstalací FreshRSS ztratíte předchozí konfiguraci. Opravdu chcete pokračovat?',
),
'language' => array(
- '_' => 'Jazyk',
'choose' => 'Vyberte jazyk FreshRSS',
'defined' => 'Jazyk byl nastaven.',
+ '_' => 'Jazyk',
),
'not_deleted' => 'Nastala chyba, soubor <em>%s</em> musíte smazat ručně.',
'ok' => 'Instalace byla úspěšná.',
'step' => 'krok %d',
'steps' => 'Kroky',
- 'title' => 'Instalace · FreshRSS',
'this_is_the_end' => 'Konec',
+ 'title' => 'Instalace · FreshRSS',
);
diff --git a/app/i18n/cz/sub.php b/app/i18n/cz/sub.php
index f2c259d15..8c1a89531 100644
--- a/app/i18n/cz/sub.php
+++ b/app/i18n/cz/sub.php
@@ -2,24 +2,24 @@
return array(
'api' => array(
- 'documentation' => 'Copy the following URL to use it within an external tool.', //TODO - Translation
- 'title' => 'API', //TODO - Translation
+ 'documentation' => 'Copy the following URL to use it within an external tool.', // TODO - Translation
+ 'title' => 'API', // TODO - Translation
),
'bookmarklet' => array(
- 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', //TODO - Translation
- 'label' => 'Subscribe', //TODO - Translation
- 'title' => 'Bookmarklet', //TODO - Translation
+ 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', // TODO - Translation
+ 'label' => 'Subscribe', // TODO - Translation
+ 'title' => 'Bookmarklet', // TODO - Translation
),
'category' => array(
- '_' => 'Kategorie',
'add' => 'Přidat kategorii',
'archiving' => 'Archivace',
'empty' => 'Vyprázdit kategorii',
'information' => 'Informace',
'new' => 'Nová kategorie',
- 'position' => 'Display position', //TODO - Translation
- 'position_help' => 'To control category sort order', //TODO - Translation
+ 'position' => 'Display position', // TODO - Translation
+ 'position_help' => 'To control category sort order', // TODO - Translation
'title' => 'Název',
+ '_' => 'Kategorie',
),
'feed' => array(
'add' => 'Přidat RSS kanál',
@@ -32,73 +32,73 @@ return array(
'password' => 'Heslo',
'username' => 'Přihlašovací jméno',
),
- 'clear_cache' => 'Always clear cache', //TODO - Translation
+ 'clear_cache' => 'Always clear cache', // TODO - Translation
'css_help' => 'Stáhne zkrácenou verzi RSS kanálů (pozor, náročnější na čas!)',
'css_path' => 'Původní CSS soubor článku z webových stránek',
'description' => 'Popis',
'empty' => 'Kanál je prázdný. Ověřte prosím zda je ještě autorem udržován.',
'error' => 'Vyskytl se problém s kanálem. Ověřte že je vždy dostupný, prosím, a poté jej aktualizujte.',
'filteractions' => array(
- '_' => 'Filter actions', //TODO - Translation
- 'help' => 'Write one search filter per line.', //TODO - Translation
+ 'help' => 'Write one search filter per line.', // TODO - Translation
+ '_' => 'Filter actions', // TODO - Translation
),
'information' => 'Informace',
'keep_min' => 'Zachovat tento minimální počet článků',
'moved_category_deleted' => 'Po smazání kategorie budou v ní obsažené kanály automaticky přesunuty do <em>%s</em>.',
- 'mute' => 'mute', //TODO - Translation
+ 'mute' => 'mute', // TODO - Translation
'no_selected' => 'Nejsou označeny žádné kanály.',
'number_entries' => '%d článků',
'priority' => array(
- '_' => 'Visibility', //TODO - Translation
- 'archived' => 'Do not show (archived)', //TODO - Translation
+ 'archived' => 'Do not show (archived)', // TODO - Translation
'main_stream' => 'Zobrazit ve “Všechny kanály”',
- 'normal' => 'Show in its category', //TODO - Translation
+ 'normal' => 'Show in its category', // TODO - Translation
+ '_' => 'Visibility', // TODO - Translation
),
- 'websub' => 'Okamžité oznámení s WebSub',
'show' => array(
- 'all' => 'Show all feeds', //TODO - Translation
- 'error' => 'Show only feeds with error', //TODO - Translation
+ 'all' => 'Show all feeds', // TODO - Translation
+ 'error' => 'Show only feeds with error', // TODO - Translation
),
'showing' => array(
- 'error' => 'Showing only feeds with error', //TODO - Translation
+ 'error' => 'Showing only feeds with error', // TODO - Translation
),
- 'ssl_verify' => 'Verify SSL security', //TODO - Translation
+ 'ssl_verify' => 'Verify SSL security', // TODO - Translation
'stats' => 'Statistika',
'think_to_add' => 'Můžete přidat kanály.',
- 'timeout' => 'Timeout in seconds', //TODO - Translation
+ 'timeout' => 'Timeout in seconds', // TODO - Translation
'title' => 'Název',
'title_add' => 'Přidat RSS kanál',
'ttl' => 'Neobnovovat častěji než',
'url' => 'URL kanálu',
'validator' => 'Zkontrolovat platnost kanálu',
'website' => 'URL webové stránky',
+ 'websub' => 'Okamžité oznámení s WebSub',
),
'firefox' => array(
- 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.',// TODO
- 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', //TODO - Translation
- 'title' => 'Firefox feed reader', //TODO - Translation
+ 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.', // TODO - Translation
+ 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', // TODO - Translation
+ 'title' => 'Firefox feed reader', // TODO - Translation
),
'import_export' => array(
- 'export' => 'Export',
+ 'export' => 'Export', // TODO - Translation
+ 'export_labelled' => 'Export your labelled articles', // TODO - Translation
'export_opml' => 'Exportovat seznam kanálů (OPML)',
'export_starred' => 'Exportovat oblíbené',
- 'export_labelled' => 'Export your labelled articles', //TODO
'feed_list' => 'Seznam %s článků',
'file_to_import' => 'Soubor k importu<br />(OPML, JSON nebo ZIP)',
'file_to_import_no_zip' => 'Soubor k importu<br />(OPML nebo JSON)',
- 'import' => 'Import',
+ 'import' => 'Import', // TODO - Translation
'starred_list' => 'Seznam oblíbených článků',
- 'title' => 'Import / export',
+ 'title' => 'Import / export', // TODO - Translation
),
'menu' => array(
'bookmark' => 'Přihlásit (FreshRSS bookmark)',
- 'import_export' => 'Import / export',
+ 'import_export' => 'Import / export', // TODO - Translation
'subscription_management' => 'Správa subskripcí',
- 'subscription_tools' => 'Subscription tools', //TODO - Translation
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
),
'title' => array(
- '_' => 'Správa subskripcí',
'feed_management' => 'Správa RSS kanálů',
- 'subscription_tools' => 'Subscription tools', //TODO - Translation
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
+ '_' => 'Správa subskripcí',
),
);
diff --git a/app/i18n/cz/user.php b/app/i18n/cz/user.php
index 3a8343c11..52197ad46 100644
--- a/app/i18n/cz/user.php
+++ b/app/i18n/cz/user.php
@@ -3,35 +3,35 @@
return array(
'email' => array(
'feedback' => array(
- 'invalid' => 'The email address is invalid.', //TODO - Translation
- 'required' => 'The email address is required.', //TODO - Translation
+ 'invalid' => 'The email address is invalid.', // TODO - Translation
+ 'required' => 'The email address is required.', // TODO - Translation
),
'validation' => array(
- 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', //TODO - Translation
- 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', //TODO - Translation
+ 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', // TODO - Translation
+ 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', // TODO - Translation
'feedback' => array(
- 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', //TODO - Translation
- 'email_sent' => 'An email has been sent to your address.', //TODO - Translation
- 'error' => 'The email address failed to be validated.', //TODO - Translation
- 'ok' => 'The email address has been validated.', //TODO - Translation
- 'unneccessary' => 'The email address was already validated.', //TODO - Translation
- 'wrong_token' => 'The email address failed to be validated due to a wrong token.', //TODO - Translation
+ 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', // TODO - Translation
+ 'email_sent' => 'An email has been sent to your address.', // TODO - Translation
+ 'error' => 'The email address failed to be validated.', // TODO - Translation
+ 'ok' => 'The email address has been validated.', // TODO - Translation
+ 'unneccessary' => 'The email address was already validated.', // TODO - Translation
+ 'wrong_token' => 'The email address failed to be validated due to a wrong token.', // TODO - Translation
),
- 'need_to' => 'You need to validate your email address before being able to use %s.', //TODO - Translation
- 'resend_email' => 'Resend the email', //TODO - Translation
- 'title' => 'Email address validation', //TODO - Translation
- ),
- ),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
+ 'need_to' => 'You need to validate your email address before being able to use %s.', // TODO - Translation
+ 'resend_email' => 'Resend the email', // TODO - Translation
+ 'title' => 'Email address validation', // TODO - Translation
),
),
'mailer' => array(
'email_need_validation' => array(
- 'title' => 'You need to validate your account', //TODO - Translation
- 'welcome' => 'Welcome %s,', //TODO - Translation
- 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', //TODO - Translation
+ 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', // TODO - Translation
+ 'title' => 'You need to validate your account', // TODO - Translation
+ 'welcome' => 'Welcome %s,', // TODO - Translation
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
),
),
);
diff --git a/app/i18n/de/admin.php b/app/i18n/de/admin.php
index d075bf28f..443a9b380 100644
--- a/app/i18n/de/admin.php
+++ b/app/i18n/de/admin.php
@@ -83,9 +83,9 @@ return array(
'ok' => 'Sie haben PDO und mindestens einen der unterstützten Treiber (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'PHP-Installation',
'nok' => 'Ihre PHP-Version ist %s aber FreshRSS benötigt mindestens Version %s.',
'ok' => 'Ihre PHP-Version ist %s, welche kompatibel mit FreshRSS ist.',
+ '_' => 'PHP-Installation',
),
'tables' => array(
'nok' => 'Es fehlen eine oder mehrere Tabellen in der Datenbank.',
@@ -113,19 +113,18 @@ return array(
'empty_list' => 'Es gibt keine installierte Erweiterung.',
'enabled' => 'Aktiviert',
'latest' => 'Installiert',
- 'name' => 'Name',
+ 'name' => 'Name', // TODO - Translation
'no_configure_view' => 'Diese Erweiterung kann nicht konfiguriert werden.',
'system' => array(
- '_' => 'System-Erweiterungen',
'no_rights' => 'System-Erweiterung (Sie haben keine Berechtigung dafür)',
+ '_' => 'System-Erweiterungen',
),
'title' => 'Erweiterungen',
'update' => 'Update verfügbar',
'user' => 'Benutzer-Erweiterungen',
- 'version' => 'Version',
+ 'version' => 'Version', // TODO - Translation
),
'stats' => array(
- '_' => 'Statistiken',
'all_feeds' => 'Alle Feeds',
'category' => 'Kategorie',
'entry_count' => 'Anzahl der Einträge',
@@ -135,7 +134,7 @@ return array(
'entry_per_hour' => 'Pro Stunde (Durchschnitt: %.2f Nachrichten)',
'entry_per_month' => 'Pro Monat (Durchschnitt: %.2f Nachrichten)',
'entry_repartition' => 'Einträge-Verteilung',
- 'feed' => 'Feed',
+ 'feed' => 'Feed', // TODO - Translation
'feed_per_category' => 'Feeds pro Kategorie',
'idle' => 'Inaktive Feeds',
'main' => 'Haupt-Statistiken',
@@ -155,37 +154,44 @@ return array(
'status_unread' => 'Ungelesen',
'title' => 'Statistiken',
'top_feed' => 'Top 10-Feeds',
+ '_' => 'Statistiken',
),
'system' => array(
- '_' => 'Systemeinstellungen',
'auto-update-url' => 'Auto-update URL',
- 'force_email_validation' => 'Force email addresses validation', //TODO - Translation
- 'instance-name' => 'Dein Reader Name',
- 'max-categories' => 'Anzahl erlaubter Kategorien pro Benutzer',
- 'max-feeds' => 'Anzahl erlaubter Feeds pro Benutzer',
'cookie-duration' => array(
'help' => 'in Sekunden',
- 'number' => 'Duration to keep logged in', // @todo translate
+ 'number' => 'Eingeloggt bleiben für',
),
+ 'force_email_validation' => 'E-Mail Adressvalidierung erzwingen',
+ 'instance-name' => 'Dein Reader Name',
+ 'max-categories' => 'Anzahl erlaubter Kategorien pro Benutzer',
+ 'max-feeds' => 'Anzahl erlaubter Feeds pro Benutzer',
'registration' => array(
'help' => '0 meint, dass es kein Account Limit gibt',
'number' => 'Maximale Anzahl von Accounts',
),
+ '_' => 'Systemeinstellungen',
),
'update' => array(
- '_' => 'System aktualisieren',
'apply' => 'Anwenden',
'check' => 'Auf neue Aktualisierungen prüfen',
'current_version' => 'Ihre aktuelle Version von FreshRSS ist %s.',
'last' => 'Letzte Überprüfung: %s',
'none' => 'Keine ausstehende Aktualisierung',
'title' => 'System aktualisieren',
+ '_' => 'System aktualisieren',
),
'user' => array(
'articles_and_size' => '%s Artikel (%s)',
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => 'Neuen Benutzer erstellen',
+ 'database_size' => 'Database size', // TODO - Translation
'delete_users' => 'Lösche Benutzer',
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => 'Sprache',
+ 'list' => 'User list', // TODO - Translation
'number' => 'Es wurde bis jetzt %d Account erstellt',
'numbers' => 'Es wurden bis jetzt %d Accounts erstellt',
'password_form' => 'Passwort<br /><small>(für die Anmeldemethode per Webformular)</small>',
@@ -193,8 +199,8 @@ return array(
'selected' => 'Ausgewählter Benutzer',
'title' => 'Benutzer verwalten',
'update_users' => 'Aktualisiere Benutzer',
- 'user_list' => 'Liste der Benutzer',
'username' => 'Nutzername',
'users' => 'Benutzer',
+ 'user_list' => 'Liste der Benutzer',
),
);
diff --git a/app/i18n/de/conf.php b/app/i18n/de/conf.php
index 89bbfc10e..50644098b 100644
--- a/app/i18n/de/conf.php
+++ b/app/i18n/de/conf.php
@@ -2,34 +2,33 @@
return array(
'archiving' => array(
- '_' => 'Archivierung',
'delete_after' => 'Entferne Artikel nach',
- 'exception' => 'Purge exception', //TODO - Translation
+ 'exception' => 'Archivierungsausnahmen',
'help' => 'Weitere Optionen sind in den Einstellungen der individuellen Feeds verfügbar.',
- 'keep_favourites' => 'Never delete favourites', //TODO - Translation
+ 'keep_favourites' => 'Lieblingsartikel behalten',
+ 'keep_labels' => 'Artikel mit Label behalten',
+ 'keep_max' => 'Maximale Anzahl an Artikeln die behalten werden',
'keep_min_by_feed' => 'Minimale Anzahl an Artikeln, die pro Feed behalten werden',
- 'keep_labels' => 'Never delete labels', //TODO - Translation
- 'keep_unreads' => 'Never delete unreads', //TODO - Translation
- 'maintenance' => 'Maintenance', //TODO - Translation
+ 'keep_period' => 'Maximales Alter der zu behaltenden Artikel',
+ 'keep_unreads' => 'Ungelesene Artikel behalten',
+ 'maintenance' => 'Wartung',
'optimize' => 'Datenbank optimieren',
'optimize_help' => 'Sollte gelegentlich durchgeführt werden, um die Größe der Datenbank zu reduzieren.',
- 'policy' => 'Purge policy', //TODO - Translation
- 'policy_warning' => 'If no purge policy is selected, every article will be kept.', //TODO - Translation
+ 'policy' => 'Archivierungsrichtlinien',
+ 'policy_warning' => 'Ohne Archivierungsrichtlinien werden alle Artikel behalten',
'purge_now' => 'Jetzt bereinigen',
- 'keep_max' => 'Maximum number of articles to keep', //TODO - Translation
- 'keep_period' => 'Maximum age of articles to keep', //TODO - Translation
'title' => 'Archivierung',
'ttl' => 'Aktualisiere automatisch nicht öfter als',
+ '_' => 'Archivierung',
),
'display' => array(
- '_' => 'Anzeige',
'icon' => array(
'bottom_line' => 'Fußzeile',
+ 'display_authors' => 'Autoren',
'entry' => 'Artikel-Symbole',
'publication_date' => 'Datum der Veröffentlichung',
'related_tags' => 'Verwandte Tags',
'sharing' => 'Teilen',
- 'display_authors' => 'Authors', //TODO - Translation
'top_line' => 'Kopfzeile',
),
'language' => 'Sprache',
@@ -47,21 +46,22 @@ return array(
'no_limit' => 'Keine Begrenzung',
'thin' => 'Klein',
),
+ '_' => 'Anzeige',
),
'profile' => array(
- '_' => 'Profil-Verwaltung',
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => 'Accountlöschung',
'warn' => 'Dein Account und alle damit bezogenen Daten werden gelöscht.',
+ '_' => 'Accountlöschung',
),
'email' => 'E-Mail-Adresse',
'password_api' => 'Passwort-API<br /><small>(z. B. für mobile Anwendungen)</small>',
'password_form' => 'Passwort<br /><small>(für die Anmeldemethode per Webformular)</small>',
'password_format' => 'mindestens 7 Zeichen',
'title' => 'Profil',
+ '_' => 'Profil-Verwaltung',
),
'query' => array(
- '_' => 'Benutzerabfragen',
'deprecated' => 'Diese Abfrage ist nicht länger gültig. Die referenzierte Kategorie oder der Feed ist gelöscht worden.',
'display' => 'Zeige Abfrage Ergebnisse',
'filter' => 'Angewendeter Filter:',
@@ -69,8 +69,8 @@ return array(
'get_category' => 'Kategorie "%s" anzeigen',
'get_favorite' => 'Lieblingsartikel anzeigen',
'get_feed' => 'Feed "%s" anzeigen',
- 'no_filter' => 'Kein Filter',
'none' => 'Sie haben bisher keine Benutzerabfrage erstellt.',
+ 'no_filter' => 'Kein Filter',
'number' => 'Abfrage Nr. %d',
'order_asc' => 'Älteste Artikel zuerst anzeigen',
'order_desc' => 'Neueste Artikel zuerst anzeigen',
@@ -93,9 +93,9 @@ return array(
'state_14' => 'Ungelesene Artikel anzeigen',
'state_15' => 'Alle Artikel anzeigen',
'title' => 'Benutzerabfragen',
+ '_' => 'Benutzerabfragen',
),
'reading' => array(
- '_' => 'Lesen',
'after_onread' => 'Nach „Alle als gelesen markieren“,',
'articles_per_page' => 'Anzahl der Artikel pro Seite',
'auto_load_more' => 'Die nächsten Artikel am Seitenende laden',
@@ -116,16 +116,16 @@ return array(
'when' => 'Artikel als gelesen markieren…',
),
'show' => array(
- '_' => 'Artikel zum Anzeigen',
'adaptive' => 'Anzeige anpassen',
'all_articles' => 'Alle Artikel zeigen',
'unread' => 'Nur ungelesene zeigen',
+ '_' => 'Artikel zum Anzeigen',
),
'sides_close_article' => 'Klick außerhalb des Artikel-Textes schließt den Artikel',
'sort' => array(
- '_' => 'Sortierreihenfolge',
'newer_first' => 'Neuere zuerst',
'older_first' => 'Ältere zuerst',
+ '_' => 'Sortierreihenfolge',
),
'sticky_post' => 'Wenn geöffnet, den Artikel ganz oben anheften',
'title' => 'Lesen',
@@ -135,27 +135,27 @@ return array(
'normal' => 'Normale Ansicht',
'reader' => 'Lese-Ansicht',
),
+ '_' => 'Lesen',
),
'sharing' => array(
- '_' => 'Teilen',
'add' => 'Füge eine Teilen-Dienst hinzu',
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
'email' => 'E-Mail',
- 'facebook' => 'Facebook',
+ 'facebook' => 'Facebook', // TODO - Translation
'more_information' => 'Weitere Informationen',
'print' => 'Drucken',
'remove' => 'Entferne Teilen-Dienst',
- 'shaarli' => 'Shaarli',
+ 'shaarli' => 'Shaarli', // TODO - Translation
'share_name' => 'Anzuzeigender Teilen-Name',
'share_url' => 'Zu verwendende Teilen-URL',
'title' => 'Teilen',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag', // TODO - Translation
+ '_' => 'Teilen',
),
'shortcut' => array(
- '_' => 'Tastenkombination',
- 'article_action' => 'Artikelaktionen',
+ 'article_action' => 'Artikel',
'auto_share' => 'Teilen',
'auto_share_help' => 'Wenn es nur eine Option zum Teilen gibt, wird diese verwendet. Ansonsten sind die Optionen über ihre Nummer erreichbar.',
'close_dropdown' => 'Menüs schließen',
@@ -169,9 +169,9 @@ return array(
'load_more' => 'Weitere Artikel laden',
'mark_favorite' => 'Als Favorit markieren',
'mark_read' => 'Als gelesen markieren',
- 'navigation' => 'Navigation',
+ 'navigation' => 'Navigation', // TODO - Translation
'navigation_help' => 'Mit der "Umschalttaste" finden die Tastenkombination auf Feeds Anwendung.<br/>Mit der "Alt-Taste" finden die Tastenkombination auf Kategorien Anwendung.',
- 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', //TODO - Translation
+ 'navigation_no_mod_help' => 'Die folgenden Navigationsverknüpfungen unterstützen keine Modifikatoren.',
'next_article' => 'Zum nächsten Artikel springen',
'normal_view' => 'Wechsle zur normalen Ansicht',
'other_action' => 'Andere Aktionen',
@@ -180,12 +180,13 @@ return array(
'rss_view' => 'Öffne RSS Ansicht in neuem Tab',
'see_on_website' => 'Auf der Original-Webseite ansehen',
'shift_for_all_read' => '+ <code>Umschalttaste</code>, um alle Artikel als gelesen zu markieren.',
- 'skip_next_article' => 'Focus next without opening', //TODO - Translation
- 'skip_previous_article' => 'Focus previous without opening', //TODO - Translation
+ 'skip_next_article' => 'Nächsten markieren ohne zu öffnen',
+ 'skip_previous_article' => 'Vorherigen markieren ohne zu öffnen',
'title' => 'Tastenkombination',
'user_filter' => 'Auf Benutzerfilter zugreifen',
'user_filter_help' => 'Wenn es nur einen Benutzerfilter gibt, wird dieser verwendet. Ansonsten sind die Filter über ihre Nummer erreichbar.',
'views' => 'Ansichten',
+ '_' => 'Tastenkombination',
),
'user' => array(
'articles_and_size' => '%s Artikel (%s)',
diff --git a/app/i18n/de/feedback.php b/app/i18n/de/feedback.php
index 269069162..9677b799d 100644
--- a/app/i18n/de/feedback.php
+++ b/app/i18n/de/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => 'Optimierung abgeschlossen',
- ),
'access' => array(
'denied' => 'Sie haben nicht die Berechtigung, diese Seite aufzurufen',
'not_found' => 'Sie suchen nach einer Seite, die nicht existiert',
),
+ 'admin' => array(
+ 'optimization_complete' => 'Optimierung abgeschlossen',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => 'Während der Konfiguration des Authentifikationssystems trat ein Fehler auf. Bitte versuchen Sie es später erneut.',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s kann nicht aktiviert werden. Für Details <a href="%s">prüfen Sie die FreshRSS-Protokolle</a>.',
'ok' => '%s ist jetzt aktiviert',
),
- 'no_access' => 'Sie haben keinen Zugang zu %s',
'not_enabled' => '%s ist noch nicht aktiviert',
'not_found' => '%s existiert nicht',
+ 'no_access' => 'Sie haben keinen Zugang zu %s',
),
'import_export' => array(
'export_no_zip_extension' => 'Die ZIP-Erweiterung fehlt auf Ihrem Server. Bitte versuchen Sie die Dateien eine nach der anderen zu exportieren.',
@@ -66,10 +72,10 @@ return array(
'emptied' => 'Die Kategorie ist geleert worden.',
'error' => 'Die Kategorie kann nicht aktualisiert werden',
'name_exists' => 'Der Kategorie-Name existiert bereits.',
- 'no_id' => 'Sie müssen die ID der Kategorie präzisieren.',
- 'no_name' => 'Der Kategorie-Name kann nicht leer sein.',
'not_delete_default' => 'Sie können die Vorgabe-Kategorie nicht löschen!',
'not_exist' => 'Die Kategorie existiert nicht!',
+ 'no_id' => 'Sie müssen die ID der Kategorie präzisieren.',
+ 'no_name' => 'Der Kategorie-Name kann nicht leer sein.',
'over_max' => 'Sie haben Ihre Kategorien-Limite erreicht (%d)',
'updated' => 'Die Kategorie ist aktualisiert worden.',
),
@@ -82,10 +88,10 @@ return array(
'error' => 'Der Feed kann nicht aktualisiert werden',
'internal_problem' => 'Der RSS-Feed konnte nicht hinzugefügt werden. Für Details <a href="%s">prüfen Sie die FreshRSS-Protokolle</a>.',
'invalid_url' => 'Die URL <em>%s</em> ist ungültig',
+ 'not_added' => '<em>%s</em> konnte nicht hinzugefügt werden',
+ 'no_refresh' => 'Es gibt keinen Feed zum Aktualisieren…',
'n_actualized' => 'Die %d Feeds sind aktualisiert worden',
'n_entries_deleted' => 'Die %d Artikel sind gelöscht worden',
- 'no_refresh' => 'Es gibt keinen Feed zum Aktualisieren…',
- 'not_added' => '<em>%s</em> konnte nicht hinzugefügt werden',
'over_max' => 'Sie haben Ihre Feeds-Limite erreicht (%d)',
'updated' => 'Der Feed ist aktualisiert worden',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => 'Der Benutzer %s ist erstellt worden',
'error' => 'Der Benutzer %s kann nicht erstellt werden',
+ '_' => 'Der Benutzer %s ist erstellt worden',
),
'deleted' => array(
- '_' => 'Der Benutzer %s ist gelöscht worden',
'error' => 'Der Benutzer %s kann nicht gelöscht werden',
+ '_' => 'Der Benutzer %s ist gelöscht worden',
),
'updated' => array(
- '_' => 'Benutzer %s wurde aktualisiert',
'error' => 'Benutzer %s wurde nicht aktualisiert',
+ '_' => 'Benutzer %s wurde aktualisiert',
),
),
);
diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php
index e2dd2a251..a0e366ab7 100644
--- a/app/i18n/de/gen.php
+++ b/app/i18n/de/gen.php
@@ -3,7 +3,7 @@
return array(
'action' => array(
'actualize' => 'Aktualisieren',
- 'back' => '← Go back', //TODO - Translation
+ 'back' => '← Zurück',
'back_to_rss_feeds' => '← Zurück zu Ihren RSS-Feeds gehen',
'cancel' => 'Abbrechen',
'create' => 'Erstellen',
@@ -16,6 +16,7 @@ return array(
'manage' => 'Verwalten',
'mark_favorite' => 'Als Favorit markieren',
'mark_read' => 'Als gelesen markieren',
+ 'purge' => 'Purge', // TODO - Translation
'remove' => 'Entfernen',
'see_website' => 'Webseite ansehen',
'submit' => 'Abschicken',
@@ -23,34 +24,34 @@ return array(
'update' => 'Aktualisieren',
),
'auth' => array(
- 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
+ 'accept_tos' => 'Ich akzeptiere die <a href="%s">Nutzungsbedingungen</a>.',
'email' => 'E-Mail-Adresse',
'keep_logged_in' => 'Eingeloggt bleiben <small>(%s Tage)</small>',
'login' => 'Anmelden',
'logout' => 'Abmelden',
'password' => array(
- '_' => 'Passwort',
'format' => '<small>mindestens 7 Zeichen</small>',
+ '_' => 'Passwort',
),
'registration' => array(
- '_' => 'Neuer Account',
'ask' => 'Erstelle einen Account?',
'title' => 'Accounterstellung',
+ '_' => 'Neuer Account',
),
'reset' => 'Zurücksetzen der Authentifizierung',
'username' => array(
- '_' => 'Nutzername',
'admin' => 'Administrator-Nutzername',
'format' => '<small>maximal 16 alphanumerische Zeichen</small>',
+ '_' => 'Nutzername',
),
),
'date' => array(
- 'Apr' => '\\A\\p\\r\\i\\l',
+ 'Apr' => '\\A\\p\\r\\i\\l', // TODO - Translation
'apr' => 'Apr',
- 'april' => 'April',
- 'Aug' => '\\A\\u\\g\\u\\s\\t',
+ 'april' => 'April', // TODO - Translation
+ 'Aug' => '\\A\\u\\g\\u\\s\\t', // TODO - Translation
'aug' => 'Aug',
- 'august' => 'August',
+ 'august' => 'August', // TODO - Translation
'before_yesterday' => 'Ältere Beiträge',
'Dec' => '\\D\\e\\z\\e\\m\\b\\e\\r',
'dec' => 'Dez',
@@ -64,8 +65,8 @@ return array(
'Jan' => '\\J\\a\\n\\u\\a\\r',
'jan' => 'Jan',
'january' => 'Januar',
- 'Jul' => '\\J\\u\\l\\i',
'jul' => 'Jul',
+ 'Jul' => '\\J\\u\\l\\i',
'july' => 'Juli',
'Jun' => '\\J\\u\\n\\i',
'jun' => 'Jun',
@@ -75,24 +76,24 @@ return array(
'last_month' => 'Letzter Monat',
'last_week' => 'Letzte Woche',
'last_year' => 'Letztes Jahr',
- 'Mar' => '\\M\\ä\\r\\z',
'mar' => 'Mär',
+ 'Mar' => '\\M\\ä\\r\\z',
'march' => 'März',
'May' => '\\M\\a\\i',
'may' => 'Mai',
'may_' => 'Mai',
'mon' => 'Mo',
'month' => 'Monat(en)',
- 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r',
+ 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r', // TODO - Translation
'nov' => 'Nov',
- 'november' => 'November',
+ 'november' => 'November', // TODO - Translation
'Oct' => '\\O\\k\\t\\o\\b\\e\\r',
'oct' => 'Okt',
'october' => 'Oktober',
'sat' => 'Sa',
- 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',
+ 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r', // TODO - Translation
'sep' => 'Sep',
- 'september' => 'September',
+ 'september' => 'September', // TODO - Translation
'sun' => 'So',
'thu' => 'Do',
'today' => 'Heute',
@@ -101,8 +102,8 @@ return array(
'yesterday' => 'Gestern',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => 'Über FreshRSS',
+ '_' => 'FreshRSS', // TODO - Translation
),
'js' => array(
'category_empty' => 'Kategorie leeren',
@@ -117,24 +118,25 @@ return array(
'should_be_activated' => 'JavaScript muss aktiviert sein',
),
'lang' => array(
- 'cz' => 'Čeština',
- 'de' => 'Deutsch',
- 'en' => 'English',
- 'es' => 'Español',
- 'fr' => 'Français',
- 'he' => 'עברית',
- 'it' => 'Italiano',
- 'kr' => '한국어',
- 'nl' => 'Nederlands',
- 'oc' => 'Occitan',
- 'pt-br' => 'Português (Brasil)',
- 'ru' => 'Русский',
- 'tr' => 'Türkçe',
- 'zh-cn' => '简体中文',
+ 'cz' => 'Čeština', // TODO - Translation
+ 'de' => 'Deutsch', // TODO - Translation
+ 'en' => 'English', // TODO - Translation
+ 'es' => 'Español', // TODO - Translation
+ 'fr' => 'Français', // TODO - Translation
+ 'he' => 'עברית', // TODO - Translation
+ 'it' => 'Italiano', // TODO - Translation
+ 'kr' => '한국어', // TODO - Translation
+ 'nl' => 'Nederlands', // TODO - Translation
+ 'oc' => 'Occitan', // TODO - Translation
+ 'pt-br' => 'Português (Brasil)', // TODO - Translation
+ 'ru' => 'Русский', // TODO - Translation
+ 'sk' => 'Slovenčina', // TODO - Translation
+ 'tr' => 'Türkçe', // TODO - Translation
+ 'zh-cn' => '简体中文', // TODO - Translation
),
'menu' => array(
'about' => 'Über',
- 'admin' => 'Administration',
+ 'admin' => 'Administration', // TODO - Translation
'archiving' => 'Archivierung',
'authentication' => 'Authentifizierung',
'check_install' => 'Installationsüberprüfung',
@@ -163,31 +165,31 @@ return array(
'previous' => 'Vorherige',
),
'period' => array(
- 'days' => 'days', //TODO - Translation
- 'hours' => 'hours', //TODO - Translation
- 'months' => 'months', //TODO - Translation
- 'weeks' => 'weeks', //TODO - Translation
- 'years' => 'years', //TODO - Translation
+ 'days' => 'Tage',
+ 'hours' => 'Stunden',
+ 'months' => 'Monate',
+ 'weeks' => 'Wochen',
+ 'years' => 'Jahre',
),
'share' => array(
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
'email' => 'E-Mail',
- 'facebook' => 'Facebook',
- 'gnusocial' => 'GNU social',
- 'jdh' => 'Journal du hacker',
+ 'facebook' => 'Facebook', // TODO - Translation
+ 'gnusocial' => 'GNU social', // TODO - Translation
+ 'jdh' => 'Journal du hacker', // TODO - Translation
'Known' => 'Known-Seite (https://withknown.com)',
- 'lemmy' => 'Lemmy',
- 'linkedin' => 'LinkedIn',
- 'mastodon' => 'Mastodon',
- 'movim' => 'Movim',
- 'pinboard' => 'Pinboard',
- 'pocket' => 'Pocket',
+ 'lemmy' => 'Lemmy', // TODO - Translation
+ 'linkedin' => 'LinkedIn', // TODO - Translation
+ 'mastodon' => 'Mastodon', // TODO - Translation
+ 'movim' => 'Movim', // TODO - Translation
+ 'pinboard' => 'Pinboard', // TODO - Translation
+ 'pocket' => 'Pocket', // TODO - Translation
'print' => 'Drucken',
- 'shaarli' => 'Shaarli',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag v1',
- 'wallabagv2' => 'wallabag v2',
+ 'shaarli' => 'Shaarli', // TODO - Translation
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag v1', // TODO - Translation
+ 'wallabagv2' => 'wallabag v2', // TODO - Translation
),
'short' => array(
'attention' => 'Achtung!',
diff --git a/app/i18n/de/index.php b/app/i18n/de/index.php
index 85ab3bb26..296db6939 100644
--- a/app/i18n/de/index.php
+++ b/app/i18n/de/index.php
@@ -2,35 +2,32 @@
return array(
'about' => array(
- '_' => 'Über',
- 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', // TODO - Translation
'bugs_reports' => 'Fehlerberichte',
- 'credits' => 'Credits',
+ 'credits' => 'Credits', // TODO - Translation
'credits_content' => 'Einige Designelemente stammen von <a href="http://twitter.github.io/bootstrap/">Bootstrap</a>, obwohl FreshRSS dieses Framework nicht nutzt. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Icons</a> stammen vom <a href="https://www.gnome.org/">GNOME project</a>. <em>Open Sans</em> Font wurde von <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a> erstellt. FreshRSS basiert auf <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, einem PHP-Framework.',
'freshrss_description' => 'FreshRSS ist ein RSS-Feedsaggregator zum selbst hosten wie zum Beispiel <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> oder <a href="https://github.com/LeedRSS/Leed">Leed</a>. Er ist leicht und einfach zu handhaben und gleichzeitig ein leistungsstarkes und konfigurierbares Werkzeug.',
- 'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">on Github</a>',
+ 'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">on Github</a>', // TODO - Translation
'license' => 'Lizenz',
'project_website' => 'Projekt-Webseite',
'title' => 'Über',
- 'version' => 'Version',
+ 'version' => 'Version', // TODO - Translation
'website' => 'Webseite',
- ),
- 'tos' => array(
- 'title' => 'Terms of Service', // TODO - Translation
+ '_' => 'Über',
),
'feed' => array(
'add' => 'Sie können Feeds hinzufügen.',
'empty' => 'Es gibt keinen Artikel zum Anzeigen.',
'rss_of' => 'RSS-Feed von %s',
'title' => 'Ihre RSS-Feeds',
- 'title_global' => 'Globale Ansicht',
'title_fav' => 'Ihre Favoriten',
+ 'title_global' => 'Globale Ansicht',
),
'log' => array(
- '_' => 'Protokolle',
'clear' => 'Protokolle leeren',
'empty' => 'Protokolldatei ist leer.',
'title' => 'Protokolle',
+ '_' => 'Protokolle',
),
'menu' => array(
'about' => 'Über FreshRSS',
@@ -56,11 +53,14 @@ return array(
'starred' => 'Nur Favoriten zeigen',
'stats' => 'Statistiken',
'subscription' => 'Abonnementverwaltung',
- 'tags' => 'My labels', //TODO - Translation
+ 'tags' => 'Meine Tags',
'unread' => 'Nur ungelesene zeigen',
),
'share' => 'Teilen',
'tag' => array(
'related' => 'Verwandte Tags',
),
+ 'tos' => array(
+ 'title' => 'Nutzungsbedingungen',
+ ),
);
diff --git a/app/i18n/de/install.php b/app/i18n/de/install.php
index 6fc8f2149..734edb7bb 100644
--- a/app/i18n/de/install.php
+++ b/app/i18n/de/install.php
@@ -17,20 +17,19 @@ return array(
'type' => 'Authentifizierungsmethode',
),
'bdd' => array(
- '_' => 'Datenbank',
'conf' => array(
- '_' => 'Datenbank-Konfiguration',
'ko' => 'Überprüfen Sie Ihre Datenbank-Information.',
'ok' => 'Datenbank-Konfiguration ist gespeichert worden.',
+ '_' => 'Datenbank-Konfiguration',
),
- 'host' => 'Host',
+ 'host' => 'Host', // TODO - Translation
'password' => 'SQL-Password',
'prefix' => 'Tabellen-Präfix',
'type' => 'Datenbank-Typ',
'username' => 'SQL-Nutzername',
+ '_' => 'Datenbank',
),
'check' => array(
- '_' => 'Überprüfungen',
'already_installed' => 'Wir haben festgestellt, dass FreshRSS bereits installiert wurde!',
'cache' => array(
'nok' => 'Überprüfen Sie die Berechtigungen des Verzeichnisses <em>./data/cache</em>. Der HTTP-Server muss Schreibrechte besitzen.',
@@ -96,10 +95,11 @@ return array(
'nok' => 'Ihnen fehlt die benötigte Bibliothek um XML zu parsen.',
'ok' => 'Sie haben die benötigte Bibliothek um XML zu parsen.',
),
+ '_' => 'Überprüfungen',
),
'conf' => array(
- '_' => 'Allgemeine Konfiguration',
'ok' => 'Die allgemeine Konfiguration ist gespeichert worden.',
+ '_' => 'Allgemeine Konfiguration',
),
'congratulations' => 'Glückwunsch!',
'default_user' => 'Nutzername des Standardbenutzers <small>(maximal 16 alphanumerische Zeichen)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => 'Du wirst deine vorherige Konfiguration (Daten) verlieren FreshRSS. Bist du sicher, dass du fortfahren willst?',
),
'language' => array(
- '_' => 'Sprache',
'choose' => 'Wählen Sie eine Sprache für FreshRSS',
'defined' => 'Die Sprache ist festgelegt worden.',
+ '_' => 'Sprache',
),
'not_deleted' => 'Etwas ist schiefgelaufen; Sie müssen die Datei <em>%s</em> manuell löschen.',
'ok' => 'Der Installationsvorgang war erfolgreich.',
'step' => 'Schritt %d',
'steps' => 'Schritte',
- 'title' => 'Installation · FreshRSS',
'this_is_the_end' => 'Das ist das Ende',
+ 'title' => 'Installation · FreshRSS', // TODO - Translation
);
diff --git a/app/i18n/de/sub.php b/app/i18n/de/sub.php
index 754ac0866..9af3902e4 100644
--- a/app/i18n/de/sub.php
+++ b/app/i18n/de/sub.php
@@ -3,23 +3,23 @@
return array(
'api' => array(
'documentation' => 'Kopieren Sie die folgende URL, um sie in einem externen Tool zu verwenden.',
- 'title' => 'API',
+ 'title' => 'API', // TODO - Translation
),
'bookmarklet' => array(
'documentation' => 'Ziehen Sie diese Schaltfläche auf Ihre Lesezeichen-Symbolleiste oder klicken Sie mit der rechten Maustaste darauf und wählen Sie "Als Lesezeichen hinzufügen". Klicken Sie dann auf einer beliebigen Seite, die Sie abonnieren möchten, auf die Schaltfläche "Abonnieren".',
'label' => 'Abonnieren',
- 'title' => 'Bookmarklet',
+ 'title' => 'Bookmarklet', // TODO - Translation
),
'category' => array(
- '_' => 'Kategorie',
'add' => 'Eine Kategorie hinzufügen',
'archiving' => 'Archivierung',
'empty' => 'Leere Kategorie',
- 'information' => 'Information',
+ 'information' => 'Information', // TODO - Translation
'new' => 'Neue Kategorie',
- 'position' => 'Display position', //TODO - Translation
- 'position_help' => 'To control category sort order', //TODO - Translation
+ 'position' => 'Reihenfolge',
+ 'position_help' => 'Steuert die Kategoriesortierung',
'title' => 'Titel',
+ '_' => 'Kategorie',
),
'feed' => array(
'add' => 'Einen RSS-Feed hinzufügen',
@@ -39,28 +39,27 @@ return array(
'empty' => 'Dieser Feed ist leer. Bitte stellen Sie sicher, dass er noch gepflegt wird.',
'error' => 'Dieser Feed ist auf ein Problem gestoßen. Bitte stellen Sie sicher, dass er immer lesbar ist und aktualisieren Sie ihn dann.',
'filteractions' => array(
- '_' => 'Filter actions', //TODO - Translation
- 'help' => 'Write one search filter per line.', //TODO - Translation
+ 'help' => 'Ein Suchfilter pro Zeile',
+ '_' => 'Filteraktionen',
),
- 'information' => 'Information',
+ 'information' => 'Information', // TODO - Translation
'keep_min' => 'Minimale Anzahl an Artikeln, die behalten wird',
'moved_category_deleted' => 'Wenn Sie eine Kategorie entfernen, werden deren Feeds automatisch in die Kategorie <em>%s</em> eingefügt.',
'mute' => 'Stumm schalten',
'no_selected' => 'Kein Feed ausgewählt.',
'number_entries' => '%d Artikel',
'priority' => array(
- '_' => 'Sichtbarkeit',
'archived' => 'Nicht anzeigen (archiviert)',
'main_stream' => 'In Haupt-Feeds zeigen',
'normal' => 'Zeige in eigener Kategorie',
+ '_' => 'Sichtbarkeit',
),
- 'websub' => 'Sofortbenachrichtigung mit WebSub',
'show' => array(
- 'all' => 'Show all feeds', //TODO - Translation
- 'error' => 'Show only feeds with error', //TODO - Translation
+ 'all' => 'Alle Feeds zeigen',
+ 'error' => 'Nur Feeds mit Fehlern zeigen',
),
'showing' => array(
- 'error' => 'Showing only feeds with error', //TODO - Translation
+ 'error' => 'Nur Feeds mit Fehlern zeigen',
),
'ssl_verify' => 'Überprüfe SSL Sicherheit',
'stats' => 'Statistiken',
@@ -72,17 +71,18 @@ return array(
'url' => 'Feed-URL',
'validator' => 'Überprüfen Sie die Gültigkeit des Feeds',
'website' => 'Webseiten-URL',
+ 'websub' => 'Sofortbenachrichtigung mit WebSub',
),
'firefox' => array(
'documentation' => 'Folge den <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">hier</a> beschriebenen Schritten um FreshRSS zu Deiner Firefox RSS-Reader Liste hinzuzufügen.',
- 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', //TODO - Translation
+ 'obsolete_63' => 'Seit Version 63 hat Firefox die Möglichkeit entfernt, Dienste hinzuzufügen, die keine eigenständigen Anwendungen sind.',
'title' => 'Firefox RSS-Reader',
),
'import_export' => array(
'export' => 'Exportieren',
+ 'export_labelled' => 'Artikel mit Labeln exportieren',
'export_opml' => 'Liste der Feeds exportieren (OPML)',
'export_starred' => 'Ihre Favoriten exportieren',
- 'export_labelled' => 'Export your labelled articles', //TODO
'feed_list' => 'Liste von %s Artikeln',
'file_to_import' => 'Zu importierende Datei<br />(OPML, JSON oder ZIP)',
'file_to_import_no_zip' => 'Zu importierende Datei<br />(OPML oder JSON)',
@@ -97,8 +97,8 @@ return array(
'subscription_tools' => 'Abonnement-Tools',
),
'title' => array(
- '_' => 'Abonnementverwaltung',
'feed_management' => 'Verwaltung der RSS-Feeds',
'subscription_tools' => 'Abonnement-Tools',
+ '_' => 'Abonnementverwaltung',
),
);
diff --git a/app/i18n/de/user.php b/app/i18n/de/user.php
index 3a8343c11..37a038383 100644
--- a/app/i18n/de/user.php
+++ b/app/i18n/de/user.php
@@ -3,35 +3,35 @@
return array(
'email' => array(
'feedback' => array(
- 'invalid' => 'The email address is invalid.', //TODO - Translation
- 'required' => 'The email address is required.', //TODO - Translation
+ 'invalid' => 'E-Mail-Adresse ungültig',
+ 'required' => 'E-Mail ist ein Pflichtfeld',
),
'validation' => array(
- 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', //TODO - Translation
- 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', //TODO - Translation
+ 'change_email' => 'Sie können Ihre E-Mail Adresse auf Ihrem <a href="%s">Profil</a> ändern.',
+ 'email_sent_to' => 'Wir haben Ihnen eine E-Mail an <strong>%s</strong> gesendet. Bitte folgen Sie den Anweisungen um Ihre E-Mail Adresse zu verifizieren.',
'feedback' => array(
- 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', //TODO - Translation
- 'email_sent' => 'An email has been sent to your address.', //TODO - Translation
- 'error' => 'The email address failed to be validated.', //TODO - Translation
- 'ok' => 'The email address has been validated.', //TODO - Translation
- 'unneccessary' => 'The email address was already validated.', //TODO - Translation
- 'wrong_token' => 'The email address failed to be validated due to a wrong token.', //TODO - Translation
+ 'email_failed' => 'Wir konnten Ihnen aufgrund einer Fehlkonfiguration des Servers keine E-Mail schicken.',
+ 'email_sent' => 'Wir haben Ihnen eine E-Mail geschickt.',
+ 'error' => 'Die E-Mail Adresse konnte nicht veifiziert werden.',
+ 'ok' => 'Die E-Mail Adresse wurde verifiziert',
+ 'unneccessary' => 'Die E-Mail Adresse wurde bereits verifiziert.',
+ 'wrong_token' => 'Die E-Mail Adresse konnte aufgrund eines ungültigen Sicherheitstokens nicht verifiziert werden.',
),
- 'need_to' => 'You need to validate your email address before being able to use %s.', //TODO - Translation
- 'resend_email' => 'Resend the email', //TODO - Translation
- 'title' => 'Email address validation', //TODO - Translation
- ),
- ),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
+ 'need_to' => 'Sie müssen zuerst Ihre E-Mail Adresse verifizieren, bevor Sie %s nutzen können.',
+ 'resend_email' => 'E-Mail erneut versenden',
+ 'title' => 'E-Mail Adressvalidierung',
),
),
'mailer' => array(
'email_need_validation' => array(
- 'title' => 'You need to validate your account', //TODO - Translation
- 'welcome' => 'Welcome %s,', //TODO - Translation
- 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', //TODO - Translation
+ 'body' => 'Sie haben Sich gerade bei %s registriert und müssen nun nur noch Ihre E-Mail Adresse verifizieren. Bitte klicken Sie hier:',
+ 'title' => 'Sie müssen Ihr Konto verifizieren',
+ 'welcome' => 'Willkommen, %s,',
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'Sie müssen die Nutzungsbedingungen akzeptieren um sich zu registrieren.',
),
),
);
diff --git a/app/i18n/en/admin.php b/app/i18n/en/admin.php
index c5ab183e8..497a7051c 100644
--- a/app/i18n/en/admin.php
+++ b/app/i18n/en/admin.php
@@ -83,9 +83,9 @@ return array(
'ok' => 'You have PDO and at least one of the supported drivers (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'PHP installation',
'nok' => 'Your PHP version is %s but FreshRSS requires at least version %s.',
'ok' => 'Your PHP version is %s, which is compatible with FreshRSS.',
+ '_' => 'PHP installation',
),
'tables' => array(
'nok' => 'There are one or more missing tables in the database.',
@@ -116,8 +116,8 @@ return array(
'name' => 'Name',
'no_configure_view' => 'This extension cannot be configured.',
'system' => array(
- '_' => 'System extensions',
'no_rights' => 'System extension (you have no rights on it)',
+ '_' => 'System extensions',
),
'title' => 'Extensions',
'update' => 'Update available',
@@ -125,7 +125,6 @@ return array(
'version' => 'Version',
),
'stats' => array(
- '_' => 'Statistics',
'all_feeds' => 'All feeds',
'category' => 'Category',
'entry_count' => 'Entry count',
@@ -155,37 +154,44 @@ return array(
'status_unread' => 'Unread',
'title' => 'Statistics',
'top_feed' => 'Top ten feeds',
+ '_' => 'Statistics',
),
'system' => array(
- '_' => 'System configuration',
'auto-update-url' => 'Auto-update server URL',
- 'force_email_validation' => 'Force email addresses validation',
- 'instance-name' => 'Instance name',
- 'max-categories' => 'Categories per user limit',
- 'max-feeds' => 'Feeds per user limit',
'cookie-duration' => array(
'help' => 'in seconds',
'number' => 'Duration to keep logged in',
),
+ 'force_email_validation' => 'Force email addresses validation',
+ 'instance-name' => 'Instance name',
+ 'max-categories' => 'Categories per user limit',
+ 'max-feeds' => 'Feeds per user limit',
'registration' => array(
'help' => '0 means that there is no account limit',
'number' => 'Max number of accounts',
),
+ '_' => 'System configuration',
),
'update' => array(
- '_' => 'Update system',
'apply' => 'Apply',
'check' => 'Check for new updates',
'current_version' => 'Your current version of FreshRSS is %s.',
'last' => 'Last verification: %s',
'none' => 'No update to apply',
'title' => 'Update system',
+ '_' => 'Update system',
),
'user' => array(
'articles_and_size' => '%s articles (%s)',
+ 'article_count' => 'Articles',
+ 'back_to_manage' => '← Return to user list',
'create' => 'Create new user',
+ 'database_size' => 'Database size',
'delete_users' => 'Delete user',
+ 'email' => 'Email address',
+ 'feed_count' => 'Feeds',
'language' => 'Language',
+ 'list' => 'User list',
'number' => 'There is %d account created',
'numbers' => 'There are %d accounts created',
'password_form' => 'Password<br /><small>(for the Web-form login method)</small>',
@@ -193,8 +199,8 @@ return array(
'selected' => 'Selected user',
'title' => 'Manage users',
'update_users' => 'Update user',
- 'user_list' => 'List of users',
'username' => 'Username',
'users' => 'Users',
+ 'user_list' => 'List of users',
),
);
diff --git a/app/i18n/en/conf.php b/app/i18n/en/conf.php
index 2d4e06550..581b45e74 100644
--- a/app/i18n/en/conf.php
+++ b/app/i18n/en/conf.php
@@ -2,13 +2,14 @@
return array(
'archiving' => array(
- '_' => 'Archiving',
'delete_after' => 'Remove articles after',
'exception' => 'Purge exception',
'help' => 'More options are available in the individual feed settings',
'keep_favourites' => 'Never delete favourites',
- 'keep_min_by_feed' => 'Minimum number of articles to keep by feed',
'keep_labels' => 'Never delete labels',
+ 'keep_max' => 'Maximum number of articles to keep',
+ 'keep_min_by_feed' => 'Minimum number of articles to keep by feed',
+ 'keep_period' => 'Maximum age of articles to keep',
'keep_unreads' => 'Never delete unreads',
'maintenance' => 'Maintenance',
'optimize' => 'Optimise database',
@@ -16,20 +17,18 @@ return array(
'policy' => 'Purge policy',
'policy_warning' => 'If no purge policy is selected, every article will be kept.',
'purge_now' => 'Purge now',
- 'keep_max' => 'Maximum number of articles to keep',
- 'keep_period' => 'Maximum age of articles to keep',
'title' => 'Archiving',
'ttl' => 'Do not automatically refresh more often than',
+ '_' => 'Archiving',
),
'display' => array(
- '_' => 'Display',
'icon' => array(
'bottom_line' => 'Bottom line',
+ 'display_authors' => 'Authors',
'entry' => 'Article icons',
'publication_date' => 'Date of publication',
'related_tags' => 'Article tags',
'sharing' => 'Sharing',
- 'display_authors' => 'Authors',
'top_line' => 'Top line',
),
'language' => 'Language',
@@ -47,21 +46,22 @@ return array(
'no_limit' => 'No limit',
'thin' => 'Thin',
),
+ '_' => 'Display',
),
'profile' => array(
- '_' => 'Profile management',
+ 'api' => 'API management',
'delete' => array(
- '_' => 'Account deletion',
'warn' => 'Your account and all related data will be deleted.',
+ '_' => 'Account deletion',
),
'email' => 'Email address',
'password_api' => 'API password<br /><small>(e.g., for mobile apps)</small>',
'password_form' => 'Password<br /><small>(for the Web-form login method)</small>',
'password_format' => 'At least 7 characters',
'title' => 'Profile',
+ '_' => 'Profile management',
),
'query' => array(
- '_' => 'User queries',
'deprecated' => 'This query is no longer valid. The referenced category or feed has been deleted.',
'display' => 'Display user query results',
'filter' => 'Filter applied:',
@@ -69,8 +69,8 @@ return array(
'get_category' => 'Display "%s" category',
'get_favorite' => 'Display favourite articles',
'get_feed' => 'Display "%s" feed',
- 'no_filter' => 'No filter',
'none' => 'You haven’t created any user queries yet.',
+ 'no_filter' => 'No filter',
'number' => 'Query n°%d',
'order_asc' => 'Display oldest articles first',
'order_desc' => 'Display newest articles first',
@@ -93,9 +93,9 @@ return array(
'state_14' => 'Display unread articles',
'state_15' => 'Display all articles',
'title' => 'User queries',
+ '_' => 'User queries',
),
'reading' => array(
- '_' => 'Reading',
'after_onread' => 'After “mark all as read”,',
'articles_per_page' => 'Number of articles per page',
'auto_load_more' => 'Load more articles at the page bottom',
@@ -116,16 +116,16 @@ return array(
'when' => 'Mark article as read…',
),
'show' => array(
- '_' => 'Articles to display',
'adaptive' => 'Adjust showing',
'all_articles' => 'Show all articles',
'unread' => 'Show only unread',
+ '_' => 'Articles to display',
),
'sides_close_article' => 'Clicking outside of article text area closes the article',
'sort' => array(
- '_' => 'Sort order',
'newer_first' => 'Newest first',
'older_first' => 'Oldest first',
+ '_' => 'Sort order',
),
'sticky_post' => 'Stick the article to the top when opened',
'title' => 'Reading',
@@ -135,9 +135,9 @@ return array(
'normal' => 'Normal view',
'reader' => 'Reading view',
),
+ '_' => 'Reading',
),
'sharing' => array(
- '_' => 'Sharing',
'add' => 'Add a sharing method',
'blogotext' => 'Blogotext',
'diaspora' => 'Diaspora*',
@@ -152,9 +152,9 @@ return array(
'title' => 'Sharing',
'twitter' => 'Twitter',
'wallabag' => 'wallabag',
+ '_' => 'Sharing',
),
'shortcut' => array(
- '_' => 'Shortcuts',
'article_action' => 'Article actions',
'auto_share' => 'Share',
'auto_share_help' => 'If there is only one sharing mode, it is used. Otherwise, modes are accessible by their number.',
@@ -186,6 +186,7 @@ return array(
'user_filter' => 'Access user queries',
'user_filter_help' => 'If there is only one user query, it is used. Otherwise, queries are accessible by their number.',
'views' => 'Views',
+ '_' => 'Shortcuts',
),
'user' => array(
'articles_and_size' => '%s articles (%s)',
diff --git a/app/i18n/en/feedback.php b/app/i18n/en/feedback.php
index 2322a62cc..c040c8a10 100644
--- a/app/i18n/en/feedback.php
+++ b/app/i18n/en/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => 'Optimization complete',
- ),
'access' => array(
'denied' => 'You don’t have permission to access this page',
'not_found' => 'You are looking for a page which doesn’t exist',
),
+ 'admin' => array(
+ 'optimization_complete' => 'Optimization complete',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified',
+ 'updated' => 'Your password has been modified',
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => 'A problem occured during authentication system configuration. Please retry later.',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s cannot be enabled. <a href="%s">Check FreshRSS logs</a> for details.',
'ok' => '%s is now enabled',
),
- 'no_access' => 'You have no access on %s',
'not_enabled' => '%s is not enabled',
'not_found' => '%s does not exist',
+ 'no_access' => 'You have no access on %s',
),
'import_export' => array(
'export_no_zip_extension' => 'ZIP extension is not present on your server. Please try to export files one by one.',
@@ -66,10 +72,10 @@ return array(
'emptied' => 'Category has been emptied',
'error' => 'Category cannot be updated',
'name_exists' => 'Category name already exists.',
- 'no_id' => 'You must specify the id of the category.',
- 'no_name' => 'Category name cannot be empty.',
'not_delete_default' => 'You cannot delete the default category!',
'not_exist' => 'The category does not exist!',
+ 'no_id' => 'You must specify the id of the category.',
+ 'no_name' => 'Category name cannot be empty.',
'over_max' => 'You have reached your limit of categories (%d)',
'updated' => 'Category has been updated.',
),
@@ -82,10 +88,10 @@ return array(
'error' => 'Feed cannot be updated',
'internal_problem' => 'The newsfeed could not be added. <a href="%s">Check FreshRSS logs</a> for details. You can try force adding by appending <code>#force_feed</code> to the URL.',
'invalid_url' => 'URL <em>%s</em> is invalid',
+ 'not_added' => '<em>%s</em> could not be added',
+ 'no_refresh' => 'There is no feed to refresh…',
'n_actualized' => '%d feeds have been updated',
'n_entries_deleted' => '%d articles have been deleted',
- 'no_refresh' => 'There is no feed to refresh…',
- 'not_added' => '<em>%s</em> could not be added',
'over_max' => 'You have reached your limit of feeds (%d)',
'updated' => 'Feed has been updated',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => 'User %s has been created',
'error' => 'User %s cannot be created',
+ '_' => 'User %s has been created',
),
'deleted' => array(
- '_' => 'User %s has been deleted',
'error' => 'User %s cannot be deleted',
+ '_' => 'User %s has been deleted',
),
'updated' => array(
- '_' => 'User %s has been updated',
'error' => 'User %s has not been updated',
+ '_' => 'User %s has been updated',
),
),
);
diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php
index fc1bd587a..ea595b5ed 100644
--- a/app/i18n/en/gen.php
+++ b/app/i18n/en/gen.php
@@ -16,6 +16,7 @@ return array(
'manage' => 'Manage',
'mark_favorite' => 'Mark as favourite',
'mark_read' => 'Mark as read',
+ 'purge' => 'Purge',
'remove' => 'Remove',
'see_website' => 'See website',
'submit' => 'Submit',
@@ -29,19 +30,19 @@ return array(
'login' => 'Login',
'logout' => 'Logout',
'password' => array(
- '_' => 'Password',
'format' => '<small>At least 7 characters</small>',
+ '_' => 'Password',
),
'registration' => array(
- '_' => 'New account',
'ask' => 'Create an account?',
'title' => 'Account creation',
+ '_' => 'New account',
),
'reset' => 'Authentication reset',
'username' => array(
- '_' => 'Username',
'admin' => 'Administrator username',
'format' => '<small>maximum 16 alphanumeric characters</small>',
+ '_' => 'Username',
),
),
'date' => array(
@@ -64,8 +65,8 @@ return array(
'Jan' => '\\J\\a\\n\\u\\a\\r\\y',
'jan' => 'Jan.',
'january' => 'January',
- 'Jul' => '\\J\\u\\l\\y',
'jul' => 'July',
+ 'Jul' => '\\J\\u\\l\\y',
'july' => 'July',
'Jun' => '\\J\\u\\n\\e',
'jun' => 'June',
@@ -75,8 +76,8 @@ return array(
'last_month' => 'Last month',
'last_week' => 'Last week',
'last_year' => 'Last year',
- 'Mar' => '\\M\\a\\r\\c\\h',
'mar' => 'Mar.',
+ 'Mar' => '\\M\\a\\r\\c\\h',
'march' => 'March',
'May' => '\\M\\a\\y',
'may' => 'May',
@@ -89,8 +90,8 @@ return array(
'Oct' => '\\O\\c\\t\\o\\b\\e\\r',
'oct' => 'Oct.',
'october' => 'October',
- 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',
'sat' => 'Sat',
+ 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',
'sep' => 'Sept.',
'september' => 'September',
'sun' => 'Sun',
@@ -101,8 +102,8 @@ return array(
'yesterday' => 'Yesterday',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => 'About FreshRSS',
+ '_' => 'FreshRSS',
),
'js' => array(
'category_empty' => 'Empty category',
diff --git a/app/i18n/en/index.php b/app/i18n/en/index.php
index 71bf8b53e..af45dc82d 100644
--- a/app/i18n/en/index.php
+++ b/app/i18n/en/index.php
@@ -2,7 +2,6 @@
return array(
'about' => array(
- '_' => 'About',
'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
'bugs_reports' => 'Bugs reports',
'credits' => 'Credits',
@@ -14,23 +13,21 @@ return array(
'title' => 'About',
'version' => 'Version',
'website' => 'Website',
- ),
- 'tos' => array(
- 'title' => 'Terms of Service',
+ '_' => 'About',
),
'feed' => array(
'add' => 'You may add some feeds.',
'empty' => 'There is no article to show.',
'rss_of' => 'RSS feed of %s',
'title' => 'Your RSS feeds',
- 'title_global' => 'Global view',
'title_fav' => 'Your favourites',
+ 'title_global' => 'Global view',
),
'log' => array(
- '_' => 'Logs',
'clear' => 'Clear the logs',
'empty' => 'Log file is empty',
'title' => 'Logs',
+ '_' => 'Logs',
),
'menu' => array(
'about' => 'About FreshRSS',
@@ -63,4 +60,7 @@ return array(
'tag' => array(
'related' => 'Article tags',
),
+ 'tos' => array(
+ 'title' => 'Terms of Service',
+ ),
);
diff --git a/app/i18n/en/install.php b/app/i18n/en/install.php
index 395919e9a..8386c8967 100644
--- a/app/i18n/en/install.php
+++ b/app/i18n/en/install.php
@@ -17,20 +17,19 @@ return array(
'type' => 'Authentication method',
),
'bdd' => array(
- '_' => 'Database',
'conf' => array(
- '_' => 'Database configuration',
'ko' => 'Verify your database information.',
'ok' => 'Database configuration has been saved.',
+ '_' => 'Database configuration',
),
'host' => 'Host',
'password' => 'Database password',
'prefix' => 'Table prefix',
'type' => 'Type of database',
'username' => 'Database username',
+ '_' => 'Database',
),
'check' => array(
- '_' => 'Checks',
'already_installed' => 'We have detected that FreshRSS is already installed!',
'cache' => array(
'nok' => 'Check permissions on <em>./data/cache</em> directory. HTTP server must have rights to write into',
@@ -96,10 +95,11 @@ return array(
'nok' => 'Cannot find the required library to parse XML.',
'ok' => 'You have the required library to parse XML.',
),
+ '_' => 'Checks',
),
'conf' => array(
- '_' => 'General configuration',
'ok' => 'General configuration has been saved.',
+ '_' => 'General configuration',
),
'congratulations' => 'Congratulations!',
'default_user' => 'Username of the default user <small>(maximum 16 alphanumeric characters)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => 'You will lose your previous configuration by reinstalling FreshRSS. Are you sure you want to continue?',
),
'language' => array(
- '_' => 'Language',
'choose' => 'Choose a language for FreshRSS',
'defined' => 'Language has been defined.',
+ '_' => 'Language',
),
'not_deleted' => 'Something went wrong; you must delete the file <em>%s</em> manually.',
'ok' => 'The installation process was successful.',
'step' => 'step %d',
'steps' => 'Steps',
- 'title' => 'Installation · FreshRSS',
'this_is_the_end' => 'This is the end',
+ 'title' => 'Installation · FreshRSS',
);
diff --git a/app/i18n/en/sub.php b/app/i18n/en/sub.php
index 252177940..292e0e3b0 100644
--- a/app/i18n/en/sub.php
+++ b/app/i18n/en/sub.php
@@ -11,7 +11,6 @@ return array(
'title' => 'Bookmarklet',
),
'category' => array(
- '_' => 'Category',
'add' => 'Add a category',
'archiving' => 'Archiving',
'empty' => 'Empty category',
@@ -20,6 +19,7 @@ return array(
'position' => 'Display position',
'position_help' => 'To control category sort order',
'title' => 'Title',
+ '_' => 'Category',
),
'feed' => array(
'add' => 'Add a RSS feed',
@@ -39,8 +39,8 @@ return array(
'empty' => 'This feed is empty. Please verify that it is still maintained.',
'error' => 'This feed has encountered a problem. Please verify that it is always reachable then update it.',
'filteractions' => array(
- '_' => 'Filter actions',
'help' => 'Write one search filter per line.',
+ '_' => 'Filter actions',
),
'information' => 'Information',
'keep_min' => 'Minimum number of articles to keep',
@@ -49,12 +49,11 @@ return array(
'no_selected' => 'No feed selected.',
'number_entries' => '%d articles',
'priority' => array(
- '_' => 'Visibility',
'archived' => 'Do not show (archived)',
'main_stream' => 'Show in main stream',
'normal' => 'Show in its category',
+ '_' => 'Visibility',
),
- 'websub' => 'Instant notification with WebSub',
'show' => array(
'all' => 'Show all feeds',
'error' => 'Show only feeds with error',
@@ -72,6 +71,7 @@ return array(
'url' => 'Feed URL',
'validator' => 'Check the validity of the feed',
'website' => 'Website URL',
+ 'websub' => 'Instant notification with WebSub',
),
'firefox' => array(
'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.',
@@ -80,9 +80,9 @@ return array(
),
'import_export' => array(
'export' => 'Export',
+ 'export_labelled' => 'Export your labelled articles',
'export_opml' => 'Export list of feeds (OPML)',
'export_starred' => 'Export your favourites',
- 'export_labelled' => 'Export your labelled articles',
'feed_list' => 'List of %s articles',
'file_to_import' => 'File to import<br />(OPML, JSON or ZIP)',
'file_to_import_no_zip' => 'File to import<br />(OPML or JSON)',
@@ -97,8 +97,8 @@ return array(
'subscription_tools' => 'Subscription tools',
),
'title' => array(
- '_' => 'Subscriptions management',
'feed_management' => 'RSS feeds management',
'subscription_tools' => 'Subscription tools',
+ '_' => 'Subscriptions management',
),
);
diff --git a/app/i18n/en/user.php b/app/i18n/en/user.php
index 54d8dfa4d..3ba6d930f 100644
--- a/app/i18n/en/user.php
+++ b/app/i18n/en/user.php
@@ -22,16 +22,16 @@ return array(
'title' => 'Email address validation',
),
),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'You must accept the Terms of Service to be able to register.',
- ),
- ),
'mailer' => array(
'email_need_validation' => array(
+ 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:',
'title' => 'You need to validate your account',
'welcome' => 'Welcome %s,',
- 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:',
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'You must accept the Terms of Service to be able to register.',
),
),
);
diff --git a/app/i18n/es/admin.php b/app/i18n/es/admin.php
index 1af3bdcb2..a8dcac86e 100755
--- a/app/i18n/es/admin.php
+++ b/app/i18n/es/admin.php
@@ -67,8 +67,8 @@ return array(
'ok' => 'Dispones de la extensión JSON.',
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
'nok' => 'No se ha podido localizar el entorno Minz.',
@@ -83,9 +83,9 @@ return array(
'ok' => 'Dispones de PDO y, al menos, de uno de los controladores compatibles (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'Instalación PHP',
'nok' => 'Dispones de la versión PHP %s pero FreshRSS requiere de, al menos, la versión %s.',
'ok' => 'Dispones de la versión PHP %s, que es compatible con FreshRSS.',
+ '_' => 'Instalación PHP',
),
'tables' => array(
'nok' => 'Falta al menos una tabla en la base de datos.',
@@ -106,26 +106,25 @@ return array(
),
),
'extensions' => array(
- 'author' => 'Author', //TODO - Translation
- 'community' => 'Available community extensions', //TODO - Translation
- 'description' => 'Description', //TODO - Translation
+ 'author' => 'Author', // TODO - Translation
+ 'community' => 'Available community extensions', // TODO - Translation
+ 'description' => 'Description', // TODO - Translation
'disabled' => 'Desactivado',
'empty_list' => 'No hay extensiones instaladas',
'enabled' => 'Activado',
- 'latest' => 'Installed', //TODO - Translation
- 'name' => 'Name', //TODO - Translation
+ 'latest' => 'Installed', // TODO - Translation
+ 'name' => 'Name', // TODO - Translation
'no_configure_view' => 'Esta extensión no puede ser configurada.',
'system' => array(
- '_' => 'Sistema de extensiones',
'no_rights' => 'Sistema de extensiones (careces de los permisos necesarios)',
+ '_' => 'Sistema de extensiones',
),
'title' => 'Extensiones',
- 'update' => 'Update available', //TODO - Translation
+ 'update' => 'Update available', // TODO - Translation
'user' => 'Extensiones de usuario',
- 'version' => 'Version', //TODO - Translation
+ 'version' => 'Version', // TODO - Translation
),
'stats' => array(
- '_' => 'Estadísticas',
'all_feeds' => 'Todas las fuentes',
'category' => 'Categoría',
'entry_count' => 'Cómputo total',
@@ -151,50 +150,57 @@ return array(
'repartition' => 'Reprto de artículos',
'status_favorites' => 'Favoritos',
'status_read' => 'Leídos',
- 'status_total' => 'Total',
+ 'status_total' => 'Total', // TODO - Translation
'status_unread' => 'Pendientes',
'title' => 'Estadísticas',
'top_feed' => 'Las 10 fuentes más activas',
+ '_' => 'Estadísticas',
),
'system' => array(
- '_' => 'Configuración del sistema',
'auto-update-url' => 'URL de auto-actualización',
- 'force_email_validation' => 'Force email addresses validation', //TODO - Translation
+ 'cookie-duration' => array(
+ 'help' => 'in seconds', // TODO - Translation
+ 'number' => 'Duration to keep logged in', // TODO - Translation
+ ),
+ 'force_email_validation' => 'Force email addresses validation', // TODO - Translation
'instance-name' => 'Nombre de la fuente',
'max-categories' => 'Límite de categorías por usuario',
'max-feeds' => 'Límite de fuentes por usuario',
- 'cookie-duration' => array(
- 'help' => 'in seconds', // @todo translate
- 'number' => 'Duration to keep logged in', // @todo translate
- ),
'registration' => array(
'help' => '0 significa que no hay límite en la cuenta',
'number' => 'Número máximo de cuentas',
),
+ '_' => 'Configuración del sistema',
),
'update' => array(
- '_' => 'Actualizar sistema',
'apply' => 'Aplicar',
'check' => 'Buscar actualizaciones',
'current_version' => 'Dispones de la versión %s de FreshRSS.',
'last' => 'Última comprobación: %s',
'none' => 'No hay actualizaciones disponibles',
'title' => 'Actualizar sistema',
+ '_' => 'Actualizar sistema',
),
'user' => array(
- 'articles_and_size' => '%s articles (%s)',
+ 'articles_and_size' => '%s articles (%s)', // TODO - Translation
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => 'Crear nuevo usuario',
- 'delete_users' => 'Delete user', //TODO - Translation
+ 'database_size' => 'Database size', // TODO - Translation
+ 'delete_users' => 'Delete user', // TODO - Translation
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => 'Idioma',
+ 'list' => 'User list', // TODO - Translation
'number' => 'Hay %d cuenta creada',
'numbers' => 'Hay %d cuentas creadas',
'password_form' => 'Contraseña<br /><small>(para el método de identificación por formulario web)</small>',
'password_format' => 'Mínimo de 7 caracteres',
- 'selected' => 'Selected user', //TODO - Translation
+ 'selected' => 'Selected user', // TODO - Translation
'title' => 'Administrar usuarios',
- 'update_users' => 'Update user', //TODO - Translation
- 'user_list' => 'Lista de usuarios',
+ 'update_users' => 'Update user', // TODO - Translation
'username' => 'Nombre de usuario',
'users' => 'Usuarios',
+ 'user_list' => 'Lista de usuarios',
),
);
diff --git a/app/i18n/es/conf.php b/app/i18n/es/conf.php
index 7a93a87de..8b61c4d0f 100755
--- a/app/i18n/es/conf.php
+++ b/app/i18n/es/conf.php
@@ -2,34 +2,33 @@
return array(
'archiving' => array(
- '_' => 'Archivo',
'delete_after' => 'Eliminar artículos tras',
- 'exception' => 'Purge exception', //TODO - Translation
+ 'exception' => 'Purge exception', // TODO - Translation
'help' => 'Hay más opciones disponibles en los ajustes de la fuente',
- 'keep_favourites' => 'Never delete favourites', //TODO - Translation
+ 'keep_favourites' => 'Never delete favourites', // TODO - Translation
+ 'keep_labels' => 'Never delete labels', // TODO - Translation
+ 'keep_max' => 'Maximum number of articles to keep', // TODO - Translation
'keep_min_by_feed' => 'Número mínimo de artículos a conservar por fuente',
- 'keep_labels' => 'Never delete labels', //TODO - Translation
- 'keep_unreads' => 'Never delete unreads', //TODO - Translation
- 'maintenance' => 'Maintenance', //TODO - Translation
+ 'keep_period' => 'Maximum age of articles to keep', // TODO - Translation
+ 'keep_unreads' => 'Never delete unreads', // TODO - Translation
+ 'maintenance' => 'Maintenance', // TODO - Translation
'optimize' => 'Optimizar la base de datos',
'optimize_help' => 'Ejecuta la optimización de vez en cuando para reducir el tamaño de la base de datos',
- 'policy' => 'Purge policy', //TODO - Translation
- 'policy_warning' => 'If no purge policy is selected, every article will be kept.', //TODO - Translation
+ 'policy' => 'Purge policy', // TODO - Translation
+ 'policy_warning' => 'If no purge policy is selected, every article will be kept.', // TODO - Translation
'purge_now' => 'Limpiar ahora',
- 'keep_max' => 'Maximum number of articles to keep', //TODO - Translation
- 'keep_period' => 'Maximum age of articles to keep', //TODO - Translation
'title' => 'Archivo',
'ttl' => 'No actualizar automáticamente más de',
+ '_' => 'Archivo',
),
'display' => array(
- '_' => 'Visualización',
'icon' => array(
'bottom_line' => 'Línea inferior',
+ 'display_authors' => 'Authors', // TODO - Translation
'entry' => 'Iconos de artículos',
'publication_date' => 'Fecha de publicación',
'related_tags' => 'Etiquetas relacionadas',
'sharing' => 'Compartir',
- 'display_authors' => 'Authors', //TODO - Translation
'top_line' => 'Línea superior',
),
'language' => 'Idioma',
@@ -37,7 +36,7 @@ return array(
'seconds' => 'segundos (0 significa sin límite de espera)',
'timeout' => 'Notificación de fin de espera HTML5',
),
- 'show_nav_buttons' => 'Show the navigation buttons', //TODO - Translation
+ 'show_nav_buttons' => 'Show the navigation buttons', // TODO - Translation
'theme' => 'Tema',
'title' => 'Visualización',
'width' => array(
@@ -47,34 +46,35 @@ return array(
'no_limit' => 'Sin límite',
'thin' => 'Estrecho',
),
+ '_' => 'Visualización',
),
'profile' => array(
- '_' => 'Administración de perfiles',
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => 'Borrar cuenta',
'warn' => 'Tu cuenta y todos los datos asociados serán eliminados.',
+ '_' => 'Borrar cuenta',
),
'email' => 'Correo electrónico',
'password_api' => 'Contraseña API <br /><small>(para apps móviles, por ej.)</small>',
'password_form' => 'Contraseña<br /><small>(para el método de identificación por formulario web)</small>',
'password_format' => 'Mínimo de 7 caracteres',
'title' => 'Perfil',
+ '_' => 'Administración de perfiles',
),
'query' => array(
- '_' => 'Consultas de usuario',
'deprecated' => 'Esta consulta ya no es válida. La categoría referenciada o fuente ha sido eliminada.',
- 'display' => 'Display user query results', //TODO - Translation
+ 'display' => 'Display user query results', // TODO - Translation
'filter' => 'Filtro aplicado:',
'get_all' => 'Mostrar todos los artículos',
'get_category' => 'Mostrar la categoría "%s"',
'get_favorite' => 'Mostrar artículos favoritos',
'get_feed' => 'Mostrar fuente "%s"',
- 'no_filter' => 'Sin filtro',
'none' => 'Todavía no has creado ninguna consulta de usuario.',
+ 'no_filter' => 'Sin filtro',
'number' => 'Consulta n° %d',
'order_asc' => 'Mostrar primero los artículos más antiguos',
'order_desc' => 'Mostrar primero los artículos más recientes',
- 'remove' => 'Remove user query', //TODO - Translation
+ 'remove' => 'Remove user query', // TODO - Translation
'search' => 'Buscar "%s"',
'state_0' => 'Mostrar todos los artículos',
'state_1' => 'Mostrar artículos leídos',
@@ -93,9 +93,9 @@ return array(
'state_14' => 'Mostrar artículos sin leer',
'state_15' => 'Mostrar todos los artículos',
'title' => 'Consultas de usuario',
+ '_' => 'Consultas de usuario',
),
'reading' => array(
- '_' => 'Lectura',
'after_onread' => 'Tras “marcar todo como leído”,',
'articles_per_page' => 'Número de artículos por página',
'auto_load_more' => 'Cargar más artículos al final de la página',
@@ -116,16 +116,16 @@ return array(
'when' => 'Marcar el artículo como leído…',
),
'show' => array(
- '_' => 'Artículos a mostrar',
'adaptive' => 'Ajustar la visualización',
'all_articles' => 'Mostrar todos los artículos',
'unread' => 'Mostrar solo pendientes',
+ '_' => 'Artículos a mostrar',
),
'sides_close_article' => 'Pinchar fuera del área de texto del artículo lo cerrará',
'sort' => array(
- '_' => 'Orden',
'newer_first' => 'Nuevos primero',
'older_first' => 'Antiguos primero',
+ '_' => 'Orden',
),
'sticky_post' => 'Pegar el artículo a la parte superior al abrirlo',
'title' => 'Lectura',
@@ -135,26 +135,26 @@ return array(
'normal' => 'Vista Normal',
'reader' => 'Vista de Lectura',
),
+ '_' => 'Lectura',
),
'sharing' => array(
- '_' => 'Compartir',
- 'add' => 'Add a sharing method', //TODO - Translation
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
- 'email' => 'Email',
- 'facebook' => 'Facebook',
+ 'add' => 'Add a sharing method', // TODO - Translation
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
+ 'email' => 'Email', // TODO - Translation
+ 'facebook' => 'Facebook', // TODO - Translation
'more_information' => 'Más información',
- 'print' => 'Print',
- 'remove' => 'Remove sharing method', //TODO - Translation
- 'shaarli' => 'Shaarli',
+ 'print' => 'Print', // TODO - Translation
+ 'remove' => 'Remove sharing method', // TODO - Translation
+ 'shaarli' => 'Shaarli', // TODO - Translation
'share_name' => 'Compartir nombre a mostrar',
'share_url' => 'Compatir URL a usar',
'title' => 'Compartir',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag', // TODO - Translation
+ '_' => 'Compartir',
),
'shortcut' => array(
- '_' => 'Atajos de teclado',
'article_action' => 'Acciones de artículo',
'auto_share' => 'Compartir',
'auto_share_help' => 'Si solo hay un modo para compartir, ese será el que se use. En caso contrario los modos quedarán accesibles por su numeración.',
@@ -162,7 +162,7 @@ return array(
'collapse_article' => 'Contraer',
'first_article' => 'Saltar al primer artículo',
'focus_search' => 'Acceso a la casilla de búsqueda',
- 'global_view' => 'Switch to global view', //TODO - Translation
+ 'global_view' => 'Switch to global view', // TODO - Translation
'help' => 'Mostrar documentación',
'javascript' => 'JavaScript debe estar activado para poder usar atajos de teclado',
'last_article' => 'Saltar al último artículo',
@@ -171,21 +171,22 @@ return array(
'mark_read' => 'Marcar como leído',
'navigation' => 'Navegación',
'navigation_help' => 'Con el modificador "Mayúsculas" es posible usar los atajos de teclado en las fuentes.<br/>Con el modificador "Alt" es posible aplicar los atajos de teclado en las categorías.',
- 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', //TODO - Translation
+ 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', // TODO - Translation
'next_article' => 'Saltar al siguiente artículo',
- 'normal_view' => 'Switch to normal view', //TODO - Translation
+ 'normal_view' => 'Switch to normal view', // TODO - Translation
'other_action' => 'Otras acciones',
'previous_article' => 'Saltar al artículo anterior',
- 'reading_view' => 'Switch to reading view', //TODO - Translation
- 'rss_view' => 'Open RSS view in a new tab', //TODO - Translation
+ 'reading_view' => 'Switch to reading view', // TODO - Translation
+ 'rss_view' => 'Open RSS view in a new tab', // TODO - Translation
'see_on_website' => 'Ver en la web original',
'shift_for_all_read' => '+ <code>mayúsculas</code> para marcar todos los artículos como leídos',
- 'skip_next_article' => 'Focus next without opening', //TODO - Translation
- 'skip_previous_article' => 'Focus previous without opening', //TODO - Translation
+ 'skip_next_article' => 'Focus next without opening', // TODO - Translation
+ 'skip_previous_article' => 'Focus previous without opening', // TODO - Translation
'title' => 'Atajos de teclado',
'user_filter' => 'Acceso a filtros de usuario',
'user_filter_help' => 'Si solo hay un filtro de usuario, ese será el que se use. En caso contrario, los filtros están accesibles por su númeración.',
- 'views' => 'Views', //TODO - Translation
+ 'views' => 'Views', // TODO - Translation
+ '_' => 'Atajos de teclado',
),
'user' => array(
'articles_and_size' => '%s artículos (%s)',
diff --git a/app/i18n/es/feedback.php b/app/i18n/es/feedback.php
index d70ccfe8a..3db76ea27 100755
--- a/app/i18n/es/feedback.php
+++ b/app/i18n/es/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => 'Optimimización completada',
- ),
'access' => array(
'denied' => 'No dispones de permiso para acceder a esta página',
'not_found' => 'La página que buscas no existe',
),
+ 'admin' => array(
+ 'optimization_complete' => 'Optimimización completada',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => 'Hubo un problema durante la configuración del sistema de idenfificación. Por favor, inténtalo más tarde.',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s no se puede activar. <a href="%s">Revisa el registro de FreshRSS</a> para más información.',
'ok' => '%s ha quedado activado',
),
- 'no_access' => 'No tienes acceso a %s',
'not_enabled' => '%s no está activado',
'not_found' => '%s no existe',
+ 'no_access' => 'No tienes acceso a %s',
),
'import_export' => array(
'export_no_zip_extension' => 'La extensión ZIP no está disponible en tu servidor. Por favor, exporta estos archivos uno a uno.',
@@ -57,8 +63,8 @@ return array(
'sub' => array(
'actualize' => 'Actualización',
'articles' => array(
- 'marked_read' => 'The selected articles have been marked as read.', //TODO - Translation
- 'marked_unread' => 'The articles have been marked as unread.', //TODO - Translation
+ 'marked_read' => 'The selected articles have been marked as read.', // TODO - Translation
+ 'marked_unread' => 'The articles have been marked as unread.', // TODO - Translation
),
'category' => array(
'created' => 'Se ha creado la categoría %s.',
@@ -66,10 +72,10 @@ return array(
'emptied' => 'Se ha vaciado la categoría',
'error' => 'No es posible actualizar la categoría',
'name_exists' => 'Ya existe una categoría con ese nombre.',
- 'no_id' => 'Debes especificar la id de la categoría.',
- 'no_name' => '¡El nombre de la categoría no puede dejarse en blanco!.',
'not_delete_default' => '¡No puedes borrar la categoría por defecto!',
'not_exist' => 'La categoría no existe',
+ 'no_id' => 'Debes especificar la id de la categoría.',
+ 'no_name' => '¡El nombre de la categoría no puede dejarse en blanco!.',
'over_max' => 'Has alcanzado el límite de categorías (%d)',
'updated' => 'La categoría se ha actualizado.',
),
@@ -80,12 +86,12 @@ return array(
'already_subscribed' => 'Ya estás suscrito a <em>%s</em>',
'deleted' => 'Fuente eliminada',
'error' => 'No es posible actualizar la fuente',
- 'internal_problem' => 'No ha sido posible agregar la fuente RSS. <a href="%s">Revisa el registro de FreshRSS </a> para más información.', //TODO - Translation
+ 'internal_problem' => 'No ha sido posible agregar la fuente RSS. <a href="%s">Revisa el registro de FreshRSS </a> para más información.',
'invalid_url' => 'La URL <em>%s</em> es inválida',
+ 'not_added' => '<em>%s</em> no ha podido se añadida',
+ 'no_refresh' => 'No hay fuente a actualizar…',
'n_actualized' => 'Se han actualiado %d fuentes',
'n_entries_deleted' => 'Se han eliminado %d artículos',
- 'no_refresh' => 'No hay fuente a actualizar…',
- 'not_added' => '<em>%s</em> no ha podido se añadida',
'over_max' => 'Has alcanzado tu límite de fuentes (%d)',
'updated' => 'Fuente actualizada',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => 'Se ha creado el usuario %s',
'error' => 'No se ha podido crear al usuario %s',
+ '_' => 'Se ha creado el usuario %s',
),
'deleted' => array(
- '_' => 'El usuario %s ha sido eliminado',
'error' => 'El usuario %s no ha podido ser eliminado',
+ '_' => 'El usuario %s ha sido eliminado',
),
'updated' => array(
- '_' => 'User %s has been updated', //TODO - Translation
- 'error' => 'User %s has not been updated', //TODO - Translation
+ 'error' => 'User %s has not been updated', // TODO - Translation
+ '_' => 'User %s has been updated', // TODO - Translation
),
),
);
diff --git a/app/i18n/es/gen.php b/app/i18n/es/gen.php
index 538ddc8fe..45ba47ec1 100755
--- a/app/i18n/es/gen.php
+++ b/app/i18n/es/gen.php
@@ -3,7 +3,7 @@
return array(
'action' => array(
'actualize' => 'Actualizar',
- 'back' => '← Go back', //TODO - Translation
+ 'back' => '← Go back', // TODO - Translation
'back_to_rss_feeds' => '← regresar a tus fuentes RSS',
'cancel' => 'Cancelar',
'create' => 'Crear',
@@ -16,32 +16,33 @@ return array(
'manage' => 'Administrar',
'mark_favorite' => 'Marcar como favorita',
'mark_read' => 'Marcar como leído',
+ 'purge' => 'Purge', // TODO - Translation
'remove' => 'Borrar',
'see_website' => 'Ver web',
'submit' => 'Enviar',
'truncate' => 'Borrar todos los artículos',
- 'update' => 'Update', //TODO - Translation
+ 'update' => 'Update', // TODO - Translation
),
'auth' => array(
- 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
+ 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
'email' => 'Correo electrónico',
'keep_logged_in' => 'Mantenerme identificado <small>(%s días)</small>',
'login' => 'Conectar',
'logout' => 'Desconectar',
'password' => array(
- '_' => 'Contraseña',
'format' => '<small>Mínimo de 7 caracteres</small>',
+ '_' => 'Contraseña',
),
'registration' => array(
- '_' => 'Nueva cuenta',
'ask' => '¿Crear una cuenta?',
'title' => 'Creación de cuenta',
+ '_' => 'Nueva cuenta',
),
'reset' => 'Reinicar identificación',
'username' => array(
- '_' => 'Nombre de usuario',
'admin' => 'Nombre de usuario del Administrador',
'format' => '<small>máximo 16 caracteres alfanuméricos</small>',
+ '_' => 'Nombre de usuario',
),
),
'date' => array(
@@ -58,14 +59,14 @@ return array(
'Feb' => '\\F\\e\\b\\r\\e\\r\\o',
'feb' => 'feb',
'february' => 'febrero',
- 'format_date' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y',
- 'format_date_hour' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y \\a\\t H\\:i',
+ 'format_date' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y', // TODO - Translation
+ 'format_date_hour' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y \\a\\t H\\:i', // TODO - Translation
'fri' => 'Vie',
'Jan' => '\\E\\n\\e\\r\\o',
'jan' => 'ene',
'january' => 'ene',
- 'Jul' => '\\J\\u\\l\\i\\o',
'jul' => 'jul',
+ 'Jul' => '\\J\\u\\l\\i\\o',
'july' => 'julio',
'Jun' => '\\J\\u\\n\\i\\o',
'jun' => 'jun',
@@ -75,8 +76,8 @@ return array(
'last_month' => 'Mes pasado',
'last_week' => 'Semana pasada',
'last_year' => 'Año pasado',
- 'Mar' => '\\M\\a\\r\\z\\o',
'mar' => 'mar',
+ 'Mar' => '\\M\\a\\r\\z\\o',
'march' => 'marzo',
'May' => '\\M\\a\\y\\o',
'may' => 'mayo',
@@ -101,8 +102,8 @@ return array(
'yesterday' => 'Ayer',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => 'Acerca de FreshRSS',
+ '_' => 'FreshRSS', // TODO - Translation
),
'js' => array(
'category_empty' => 'Vaciar categoría',
@@ -117,20 +118,21 @@ return array(
'should_be_activated' => 'JavaScript debe estar activado',
),
'lang' => array(
- 'cz' => 'Čeština',
- 'de' => 'Deutsch',
- 'en' => 'English',
- 'es' => 'Español',
- 'fr' => 'Français',
- 'he' => 'עברית',
- 'it' => 'Italiano',
- 'kr' => '한국어',
- 'nl' => 'Nederlands',
- 'oc' => 'Occitan',
- 'pt-br' => 'Português (Brasil)',
- 'ru' => 'Русский',
- 'tr' => 'Türkçe',
- 'zh-cn' => '简体中文',
+ 'cz' => 'Čeština', // TODO - Translation
+ 'de' => 'Deutsch', // TODO - Translation
+ 'en' => 'English', // TODO - Translation
+ 'es' => 'Español', // TODO - Translation
+ 'fr' => 'Français', // TODO - Translation
+ 'he' => 'עברית', // TODO - Translation
+ 'it' => 'Italiano', // TODO - Translation
+ 'kr' => '한국어', // TODO - Translation
+ 'nl' => 'Nederlands', // TODO - Translation
+ 'oc' => 'Occitan', // TODO - Translation
+ 'pt-br' => 'Português (Brasil)', // TODO - Translation
+ 'ru' => 'Русский', // TODO - Translation
+ 'sk' => 'Slovenčina', // TODO - Translation
+ 'tr' => 'Türkçe', // TODO - Translation
+ 'zh-cn' => '简体中文', // TODO - Translation
),
'menu' => array(
'about' => 'Acerca de',
@@ -163,31 +165,31 @@ return array(
'previous' => 'Anterior',
),
'period' => array(
- 'days' => 'days', //TODO - Translation
- 'hours' => 'hours', //TODO - Translation
- 'months' => 'months', //TODO - Translation
- 'weeks' => 'weeks', //TODO - Translation
- 'years' => 'years', //TODO - Translation
+ 'days' => 'days', // TODO - Translation
+ 'hours' => 'hours', // TODO - Translation
+ 'months' => 'months', // TODO - Translation
+ 'weeks' => 'weeks', // TODO - Translation
+ 'years' => 'years', // TODO - Translation
),
'share' => array(
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
- 'email' => 'Email',
- 'facebook' => 'Facebook',
- 'gnusocial' => 'GNU social',
- 'jdh' => 'Journal du hacker',
- 'Known' => 'Known based sites',
- 'lemmy' => 'Lemmy',
- 'linkedin' => 'LinkedIn',
- 'mastodon' => 'Mastodon',
- 'movim' => 'Movim',
- 'pinboard' => 'Pinboard',
- 'pocket' => 'Pocket',
- 'print' => 'Print',
- 'shaarli' => 'Shaarli',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag v1',
- 'wallabagv2' => 'wallabag v2',
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
+ 'email' => 'Email', // TODO - Translation
+ 'facebook' => 'Facebook', // TODO - Translation
+ 'gnusocial' => 'GNU social', // TODO - Translation
+ 'jdh' => 'Journal du hacker', // TODO - Translation
+ 'Known' => 'Known based sites', // TODO - Translation
+ 'lemmy' => 'Lemmy', // TODO - Translation
+ 'linkedin' => 'LinkedIn', // TODO - Translation
+ 'mastodon' => 'Mastodon', // TODO - Translation
+ 'movim' => 'Movim', // TODO - Translation
+ 'pinboard' => 'Pinboard', // TODO - Translation
+ 'pocket' => 'Pocket', // TODO - Translation
+ 'print' => 'Print', // TODO - Translation
+ 'shaarli' => 'Shaarli', // TODO - Translation
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag v1', // TODO - Translation
+ 'wallabagv2' => 'wallabag v2', // TODO - Translation
),
'short' => array(
'attention' => '¡Aviso!',
@@ -196,7 +198,7 @@ return array(
'by_default' => 'Por defecto',
'damn' => '¡Córcholis!',
'default_category' => 'Sin categorizar',
- 'no' => 'No',
+ 'no' => 'No', // TODO - Translation
'not_applicable' => 'No disponible',
'ok' => '¡Vale!',
'or' => 'o',
diff --git a/app/i18n/es/index.php b/app/i18n/es/index.php
index 8977ee70b..f1056d831 100755
--- a/app/i18n/es/index.php
+++ b/app/i18n/es/index.php
@@ -2,8 +2,7 @@
return array(
'about' => array(
- '_' => 'Acerca de',
- 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', // TODO - Translation
'bugs_reports' => 'Informe de fallos',
'credits' => 'Créditos',
'credits_content' => 'Aunque FreshRSS no usa ese entorno, algunos elementos del diseño están obtenidos de <a href="http://twitter.github.io/bootstrap/">Bootstrap</a>. Los <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Iconos</a> han sido obtenidos del <a href="https://www.gnome.org/">proyecto GNOME</a>. La fuente <em>Open Sans</em> es una creación de <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a>. FreshRSS usa el entorno PHP <a href="https://github.com/marienfressinaud/MINZ">Minz</a>.',
@@ -14,23 +13,21 @@ return array(
'title' => 'Acerca de',
'version' => 'Versión',
'website' => 'Web',
- ),
- 'tos' => array(
- 'title' => 'Terms of Service', // TODO - Translation
+ '_' => 'Acerca de',
),
'feed' => array(
'add' => 'Puedes añadir fuentes.',
'empty' => 'No hay artículos a mostrar.',
'rss_of' => 'Fuente RSS de %s',
'title' => 'Tus fuentes RSS',
- 'title_global' => 'Vista global',
'title_fav' => 'Tus favoritos',
+ 'title_global' => 'Vista global',
),
'log' => array(
- '_' => 'Registros',
'clear' => 'Limpiar registros',
'empty' => 'El archivo de registro está vacío',
'title' => 'Registros',
+ '_' => 'Registros',
),
'menu' => array(
'about' => 'Acerca de FreshRSS',
@@ -43,7 +40,7 @@ return array(
'mark_all_read' => 'Marcar todo como leído',
'mark_cat_read' => 'Marcar categoría como leída',
'mark_feed_read' => 'Marcar fuente como leída',
- 'mark_selection_unread' => 'Mark selection as unread', //TODO - Translation
+ 'mark_selection_unread' => 'Mark selection as unread', // TODO - Translation
'newer_first' => 'Nuevos primero',
'non-starred' => 'Mostrar todos menos los favoritos',
'normal_view' => 'Vista normal',
@@ -56,11 +53,14 @@ return array(
'starred' => 'Mostrar solo los favoritos',
'stats' => 'Estadísticas',
'subscription' => 'Administración de suscripciones',
- 'tags' => 'My labels', //TODO - Translation
+ 'tags' => 'My labels', // TODO - Translation
'unread' => 'Mostar solo no leídos',
),
'share' => 'Compartir',
'tag' => array(
- 'related' => 'Etiquetas relacionadas', //TODO - Translation
+ 'related' => 'Etiquetas relacionadas',
+ ),
+ 'tos' => array(
+ 'title' => 'Terms of Service', // TODO - Translation
),
);
diff --git a/app/i18n/es/install.php b/app/i18n/es/install.php
index 44236ccae..6ab7128e4 100755
--- a/app/i18n/es/install.php
+++ b/app/i18n/es/install.php
@@ -17,20 +17,19 @@ return array(
'type' => 'Método de identificación',
),
'bdd' => array(
- '_' => 'Base de datos',
'conf' => array(
- '_' => 'Configuración de la base de datos',
'ko' => 'Verificar la información de tu base de datos.',
'ok' => 'La configuración de la base de datos ha sido guardada.',
+ '_' => 'Configuración de la base de datos',
),
'host' => 'Servidor',
'password' => 'Contraseña de la base de datos',
'prefix' => 'Prefijo de la tabla',
'type' => 'Tipo de base de datos',
'username' => 'Nombre de usuario de la base de datos',
+ '_' => 'Base de datos',
),
'check' => array(
- '_' => 'Verificaciones',
'already_installed' => '¡FreshRSS ya está instalado!',
'cache' => array(
'nok' => 'Comprueba los permisos en el directorio <em>./data/cache</em>. El servidor HTTP debe contar con permisos de escritura.',
@@ -69,8 +68,8 @@ return array(
'ok' => 'Dispones de la librería recomendada para procesar JSON.',
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
'nok' => 'No se ha podido localizar el entorno Minz.',
@@ -96,10 +95,11 @@ return array(
'nok' => 'No se ha podido localizar la librería necesaria para procesar XML.',
'ok' => 'Dispones de la librería necesaria para procesar XML.',
),
+ '_' => 'Verificaciones',
),
'conf' => array(
- '_' => 'Configuración general',
'ok' => 'La configuración general se ha guardado.',
+ '_' => 'Configuración general',
),
'congratulations' => '¡Enhorabuena!',
'default_user' => 'Nombre de usuario para el usuario por defecto <small>(máximo de 16 caracteres alfanuméricos)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => 'Al reinstalar FreshRSS perderás cualquier configuración anterior. ¿Seguro que quieres continuar?',
),
'language' => array(
- '_' => 'Idioma',
'choose' => 'Selecciona el idioma para FreshRSS',
'defined' => 'Idioma seleccionado.',
+ '_' => 'Idioma',
),
'not_deleted' => 'Parece que ha habido un error. Debes eliminar el archivo <em>%s</em> de forma manual.',
'ok' => 'La instalación se ha completado correctamente.',
'step' => 'paso %d',
'steps' => 'Pasos',
- 'title' => 'Instalación · FreshRSS',
'this_is_the_end' => '¡Terminamos!',
+ 'title' => 'Instalación · FreshRSS',
);
diff --git a/app/i18n/es/sub.php b/app/i18n/es/sub.php
index f1640b76b..f1a54d882 100755
--- a/app/i18n/es/sub.php
+++ b/app/i18n/es/sub.php
@@ -2,24 +2,24 @@
return array(
'api' => array(
- 'documentation' => 'Copy the following URL to use it within an external tool.', //TODO - Translation
- 'title' => 'API', //TODO - Translation
+ 'documentation' => 'Copy the following URL to use it within an external tool.', // TODO - Translation
+ 'title' => 'API', // TODO - Translation
),
'bookmarklet' => array(
- 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', //TODO - Translation
- 'label' => 'Subscribe', //TODO - Translation
- 'title' => 'Bookmarklet', //TODO - Translation
+ 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', // TODO - Translation
+ 'label' => 'Subscribe', // TODO - Translation
+ 'title' => 'Bookmarklet', // TODO - Translation
),
'category' => array(
- '_' => 'Categoría',
'add' => 'Añadir a la categoría',
'archiving' => 'Archivo',
'empty' => 'Vaciar categoría',
'information' => 'Información',
'new' => 'Nueva categoría',
- 'position' => 'Display position', //TODO - Translation
- 'position_help' => 'To control category sort order', //TODO - Translation
+ 'position' => 'Display position', // TODO - Translation
+ 'position_help' => 'To control category sort order', // TODO - Translation
'title' => 'Título',
+ '_' => 'Categoría',
),
'feed' => array(
'add' => 'Añadir fuente RSS',
@@ -32,57 +32,57 @@ return array(
'password' => 'Contraseña HTTP',
'username' => 'Nombre de usuario HTTP',
),
- 'clear_cache' => 'Always clear cache', //TODO - Translation
+ 'clear_cache' => 'Always clear cache', // TODO - Translation
'css_help' => 'Recibir fuentes RSS truncadas (aviso, ¡necesita más tiempo!)',
'css_path' => 'Ruta a la CSS de los artículos en la web original',
'description' => 'Descripción',
'empty' => 'La fuente está vacía. Por favor, verifica que siga activa.',
'error' => 'Hay un problema con esta fuente. Por favor, veritica que esté disponible y prueba de nuevo.',
'filteractions' => array(
- '_' => 'Filter actions', //TODO - Translation
- 'help' => 'Write one search filter per line.', //TODO - Translation
+ 'help' => 'Write one search filter per line.', // TODO - Translation
+ '_' => 'Filter actions', // TODO - Translation
),
'information' => 'Información',
'keep_min' => 'Número mínimo de artículos a conservar',
'moved_category_deleted' => 'Al borrar una categoría todas sus fuentes pasan automáticamente a la categoría <em>%s</em>.',
- 'mute' => 'mute', //TODO - Translation
+ 'mute' => 'mute', // TODO - Translation
'no_selected' => 'No hay funentes seleccionadas.',
'number_entries' => '%d artículos',
'priority' => array(
- '_' => 'Visibility', //TODO - Translation
- 'archived' => 'Do not show (archived)', //TODO - Translation
+ 'archived' => 'Do not show (archived)', // TODO - Translation
'main_stream' => 'Mostrar en salida principal',
- 'normal' => 'Show in its category', //TODO - Translation
+ 'normal' => 'Show in its category', // TODO - Translation
+ '_' => 'Visibility', // TODO - Translation
),
- 'websub' => 'Notificación inmedaiata con WebSub',
'show' => array(
- 'all' => 'Show all feeds', //TODO - Translation
- 'error' => 'Show only feeds with error', //TODO - Translation
+ 'all' => 'Show all feeds', // TODO - Translation
+ 'error' => 'Show only feeds with error', // TODO - Translation
),
'showing' => array(
- 'error' => 'Showing only feeds with error', //TODO - Translation
+ 'error' => 'Showing only feeds with error', // TODO - Translation
),
- 'ssl_verify' => 'Verify SSL security', //TODO - Translation
+ 'ssl_verify' => 'Verify SSL security', // TODO - Translation
'stats' => 'Estadísticas',
'think_to_add' => 'Puedes añadir fuentes.',
- 'timeout' => 'Timeout in seconds', //TODO - Translation
+ 'timeout' => 'Timeout in seconds', // TODO - Translation
'title' => 'Título',
'title_add' => 'Añadir fuente RSS',
'ttl' => 'No actualizar de forma automática con una frecuencia mayor a',
'url' => 'URL de la fuente',
'validator' => 'Verifica la validez de la fuente',
'website' => 'Web de la URL',
+ 'websub' => 'Notificación inmedaiata con WebSub',
),
'firefox' => array(
- 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.', //TODO - Translation
- 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', //TODO - Translation
- 'title' => 'Firefox feed reader', //TODO - Translation
+ 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.', // TODO - Translation
+ 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', // TODO - Translation
+ 'title' => 'Firefox feed reader', // TODO - Translation
),
'import_export' => array(
'export' => 'Exportar',
+ 'export_labelled' => 'Export your labelled articles', // TODO - Translation
'export_opml' => 'Exportar la lista de fuentes (OPML)',
'export_starred' => 'Exportar tus favoritos',
- 'export_labelled' => 'Export your labelled articles', //TODO
'feed_list' => 'Lista de %s artículos',
'file_to_import' => 'Archivo a importar<br />(OPML, JSON o ZIP)',
'file_to_import_no_zip' => 'Archivo a importar<br />(OPML o JSON)',
@@ -94,11 +94,11 @@ return array(
'bookmark' => 'Suscribirse (favorito FreshRSS)',
'import_export' => 'Importar / exportar',
'subscription_management' => 'Administración de suscripciones',
- 'subscription_tools' => 'Subscription tools', //TODO - Translation
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
),
'title' => array(
- '_' => 'Administración de suscripciones',
'feed_management' => 'Administración de fuentes RSS',
- 'subscription_tools' => 'Subscription tools', //TODO - Translation
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
+ '_' => 'Administración de suscripciones',
),
);
diff --git a/app/i18n/es/user.php b/app/i18n/es/user.php
index 3a8343c11..52197ad46 100644
--- a/app/i18n/es/user.php
+++ b/app/i18n/es/user.php
@@ -3,35 +3,35 @@
return array(
'email' => array(
'feedback' => array(
- 'invalid' => 'The email address is invalid.', //TODO - Translation
- 'required' => 'The email address is required.', //TODO - Translation
+ 'invalid' => 'The email address is invalid.', // TODO - Translation
+ 'required' => 'The email address is required.', // TODO - Translation
),
'validation' => array(
- 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', //TODO - Translation
- 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', //TODO - Translation
+ 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', // TODO - Translation
+ 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', // TODO - Translation
'feedback' => array(
- 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', //TODO - Translation
- 'email_sent' => 'An email has been sent to your address.', //TODO - Translation
- 'error' => 'The email address failed to be validated.', //TODO - Translation
- 'ok' => 'The email address has been validated.', //TODO - Translation
- 'unneccessary' => 'The email address was already validated.', //TODO - Translation
- 'wrong_token' => 'The email address failed to be validated due to a wrong token.', //TODO - Translation
+ 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', // TODO - Translation
+ 'email_sent' => 'An email has been sent to your address.', // TODO - Translation
+ 'error' => 'The email address failed to be validated.', // TODO - Translation
+ 'ok' => 'The email address has been validated.', // TODO - Translation
+ 'unneccessary' => 'The email address was already validated.', // TODO - Translation
+ 'wrong_token' => 'The email address failed to be validated due to a wrong token.', // TODO - Translation
),
- 'need_to' => 'You need to validate your email address before being able to use %s.', //TODO - Translation
- 'resend_email' => 'Resend the email', //TODO - Translation
- 'title' => 'Email address validation', //TODO - Translation
- ),
- ),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
+ 'need_to' => 'You need to validate your email address before being able to use %s.', // TODO - Translation
+ 'resend_email' => 'Resend the email', // TODO - Translation
+ 'title' => 'Email address validation', // TODO - Translation
),
),
'mailer' => array(
'email_need_validation' => array(
- 'title' => 'You need to validate your account', //TODO - Translation
- 'welcome' => 'Welcome %s,', //TODO - Translation
- 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', //TODO - Translation
+ 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', // TODO - Translation
+ 'title' => 'You need to validate your account', // TODO - Translation
+ 'welcome' => 'Welcome %s,', // TODO - Translation
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
),
),
);
diff --git a/app/i18n/fr/admin.php b/app/i18n/fr/admin.php
index 6002617fc..2cf6adc89 100644
--- a/app/i18n/fr/admin.php
+++ b/app/i18n/fr/admin.php
@@ -83,9 +83,9 @@ return array(
'ok' => 'Vous disposez de PDO et d’au moins un des drivers supportés (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'Installation de PHP',
'nok' => 'Votre version de PHP est la %s mais FreshRSS requiert au moins la version %s.',
'ok' => 'Votre version de PHP est la %s, qui est compatible avec FreshRSS.',
+ '_' => 'Installation de PHP',
),
'tables' => array(
'nok' => 'Impossible de trouver une ou plusieurs tables en base de données.',
@@ -108,7 +108,7 @@ return array(
'extensions' => array(
'author' => 'Auteur',
'community' => 'Extensions utilisateur disponibles',
- 'description' => 'Description',
+ 'description' => 'Description', // TODO - Translation
'disabled' => 'Désactivée',
'empty_list' => 'Aucune extension installée',
'enabled' => 'Activée',
@@ -116,16 +116,15 @@ return array(
'name' => 'Nom',
'no_configure_view' => 'Cette extension n’a pas à être configurée',
'system' => array(
- '_' => 'Extensions système',
'no_rights' => 'Extensions système (contrôlées par l’administrateur)',
+ '_' => 'Extensions système',
),
'title' => 'Extensions',
'update' => 'Mise à jour disponible',
'user' => 'Extensions utilisateur',
- 'version' => 'Version',
+ 'version' => 'Version', // TODO - Translation
),
'stats' => array(
- '_' => 'Statistiques',
'all_feeds' => 'Tous les flux',
'category' => 'Catégorie',
'entry_count' => 'Nombre d’articles',
@@ -155,37 +154,44 @@ return array(
'status_unread' => 'non lus',
'title' => 'Statistiques',
'top_feed' => 'Les dix plus gros flux',
+ '_' => 'Statistiques',
),
'system' => array(
- '_' => 'Configuration du système',
'auto-update-url' => 'URL du service de mise à jour',
- 'force_email_validation' => 'Forcer la validation des adresses email',
- 'instance-name' => 'Nom de l’instance',
- 'max-categories' => 'Limite de catégories par utilisateur',
- 'max-feeds' => 'Limite de flux par utilisateur',
'cookie-duration' => array(
'help' => 'en secondes',
'number' => 'Durée avant expiration de la session',
),
+ 'force_email_validation' => 'Forcer la validation des adresses email',
+ 'instance-name' => 'Nom de l’instance',
+ 'max-categories' => 'Limite de catégories par utilisateur',
+ 'max-feeds' => 'Limite de flux par utilisateur',
'registration' => array(
'help' => 'Un chiffre de 0 signifie que l’on peut créer un nombre infini de comptes',
'number' => 'Nombre max de comptes',
),
+ '_' => 'Configuration du système',
),
'update' => array(
- '_' => 'Système de mise à jour',
'apply' => 'Appliquer la mise à jour',
'check' => 'Vérifier les mises à jour',
'current_version' => 'Votre version actuelle de FreshRSS est la %s.',
'last' => 'Dernière vérification : %s',
'none' => 'Aucune mise à jour à appliquer',
'title' => 'Système de mise à jour',
+ '_' => 'Système de mise à jour',
),
'user' => array(
'articles_and_size' => '%s articles (%s)',
+ 'article_count' => 'Articles',
+ 'back_to_manage' => '← Revenir à la liste des utilisateurs',
'create' => 'Créer un nouvel utilisateur',
+ 'database_size' => 'Volumétrie',
'delete_users' => 'Supprimer un utilisateur',
+ 'email' => 'Adresse email',
+ 'feed_count' => 'Flux',
'language' => 'Langue',
+ 'list' => 'Liste des utilisateurs',
'number' => '%d compte a déjà été créé',
'numbers' => '%d comptes ont déjà été créés',
'password_form' => 'Mot de passe<br /><small>(pour connexion par formulaire)</small>',
@@ -193,8 +199,8 @@ return array(
'selected' => 'Utilisateur sélectionné',
'title' => 'Gestion des utilisateurs',
'update_users' => 'Mettre à jour un utilisateur',
- 'user_list' => 'Liste des utilisateurs',
'username' => 'Nom d’utilisateur',
'users' => 'Utilisateurs',
+ 'user_list' => 'Liste des utilisateurs',
),
);
diff --git a/app/i18n/fr/conf.php b/app/i18n/fr/conf.php
index 020c94085..ab93b221d 100644
--- a/app/i18n/fr/conf.php
+++ b/app/i18n/fr/conf.php
@@ -2,34 +2,33 @@
return array(
'archiving' => array(
- '_' => 'Archivage',
'delete_after' => 'Supprimer les articles après',
'exception' => 'Exception de nettoyage',
'help' => 'D’autres options sont disponibles dans la configuration individuelle des flux.',
'keep_favourites' => 'Ne jamais supprimer les articles favoris',
- 'keep_min_by_feed' => 'Nombre minimum d’articles à conserver par flux',
'keep_labels' => 'Ne jamais supprimer les articles étiquetés',
+ 'keep_max' => 'Nombre maximum d’articles à conserver',
+ 'keep_min_by_feed' => 'Nombre minimum d’articles à conserver par flux',
+ 'keep_period' => 'Âge maximum des articles à conserver',
'keep_unreads' => 'Ne jamais supprimer les articles non lus',
- 'maintenance' => 'Maintenance',
+ 'maintenance' => 'Maintenance', // TODO - Translation
'optimize' => 'Optimiser la base de données',
'optimize_help' => 'À faire de temps en temps pour réduire la taille de la BDD',
'policy' => 'Politique de nettoyage',
'policy_warning' => 'Si aucune politique de nettoyage n’est sélectionnée, tous les articles seront conservés.',
'purge_now' => 'Purger maintenant',
- 'keep_max' => 'Nombre maximum d’articles à conserver',
- 'keep_period' => 'Âge maximum des articles à conserver',
'title' => 'Archivage',
'ttl' => 'Ne pas automatiquement rafraîchir plus souvent que',
+ '_' => 'Archivage',
),
'display' => array(
- '_' => 'Affichage',
'icon' => array(
'bottom_line' => 'Ligne du bas',
+ 'display_authors' => 'Authors', // TODO - Translation
'entry' => 'Icônes d’article',
'publication_date' => 'Date de publication',
'related_tags' => 'Tags de l’article',
'sharing' => 'Partage',
- 'display_authors' => 'Authors', //TODO - Translation
'top_line' => 'Ligne du haut',
),
'language' => 'Langue',
@@ -47,21 +46,22 @@ return array(
'no_limit' => 'Pas de limite',
'thin' => 'Fine',
),
+ '_' => 'Affichage',
),
'profile' => array(
- '_' => 'Gestion du profil',
+ 'api' => 'Gestion de l’API',
'delete' => array(
- '_' => 'Suppression du compte',
'warn' => 'Le compte et toutes les données associées vont être supprimées.',
+ '_' => 'Suppression du compte',
),
'email' => 'Adresse email',
'password_api' => 'Mot de passe API<br /><small>(ex. : pour applis mobiles)</small>',
'password_form' => 'Mot de passe<br /><small>(pour connexion par formulaire)</small>',
'password_format' => '7 caractères minimum',
'title' => 'Profil',
+ '_' => 'Gestion du profil',
),
'query' => array(
- '_' => 'Filtres utilisateurs',
'deprecated' => 'Ce filtre n’est plus valide. La catégorie ou le flux concerné a été supprimé.',
'display' => 'Afficher les résultats du filtre',
'filter' => 'Filtres appliqués :',
@@ -69,8 +69,8 @@ return array(
'get_category' => 'Afficher la catégorie "%s"',
'get_favorite' => 'Afficher les articles favoris',
'get_feed' => 'Afficher le flux "%s"',
- 'no_filter' => 'Aucun filtre appliqué',
'none' => 'Vous n’avez pas encore créé de filtre.',
+ 'no_filter' => 'Aucun filtre appliqué',
'number' => 'Filtre n°%d',
'order_asc' => 'Afficher les articles les plus anciens en premier',
'order_desc' => 'Afficher les articles les plus récents en premier',
@@ -93,9 +93,9 @@ return array(
'state_14' => 'Afficher les articles non lus',
'state_15' => 'Afficher tous les articles',
'title' => 'Filtres utilisateurs',
+ '_' => 'Filtres utilisateurs',
),
'reading' => array(
- '_' => 'Lecture',
'after_onread' => 'Après “marquer tout comme lu”,',
'articles_per_page' => 'Nombre d’articles par page',
'auto_load_more' => 'Charger les articles suivants en bas de page',
@@ -116,16 +116,16 @@ return array(
'when' => 'Marquer un article comme lu…',
),
'show' => array(
- '_' => 'Articles à afficher',
'adaptive' => 'Adapter l’affichage',
'all_articles' => 'Afficher tous les articles',
'unread' => 'Afficher les non lus',
+ '_' => 'Articles à afficher',
),
'sides_close_article' => 'Cliquer hors de la zone de texte ferme l’article',
'sort' => array(
- '_' => 'Ordre de tri',
'newer_first' => 'Plus récents en premier',
'older_first' => 'Plus anciens en premier',
+ '_' => 'Ordre de tri',
),
'sticky_post' => 'Aligner l’article en haut quand il est ouvert',
'title' => 'Lecture',
@@ -135,9 +135,9 @@ return array(
'normal' => 'Vue normale',
'reader' => 'Vue lecture',
),
+ '_' => 'Lecture',
),
'sharing' => array(
- '_' => 'Partage',
'add' => 'Ajouter une méthode de partage',
'blogotext' => 'Blogotext',
'diaspora' => 'Diaspora*',
@@ -152,9 +152,9 @@ return array(
'title' => 'Partage',
'twitter' => 'Twitter',
'wallabag' => 'wallabag',
+ '_' => 'Partage',
),
'shortcut' => array(
- '_' => 'Raccourcis',
'article_action' => 'Actions associées à l’article courant',
'auto_share' => 'Partager',
'auto_share_help' => 'S’il n’y a qu’un mode de partage, celui-ci est utilisé automatiquement. Sinon ils sont accessibles par leur numéro.',
@@ -186,6 +186,7 @@ return array(
'user_filter' => 'Accéder aux filtres utilisateur',
'user_filter_help' => 'S’il n’y a qu’un filtre utilisateur, celui-ci est utilisé automatiquement. Sinon ils sont accessibles par leur numéro.',
'views' => 'Vues',
+ '_' => 'Raccourcis',
),
'user' => array(
'articles_and_size' => '%s articles (%s)',
diff --git a/app/i18n/fr/feedback.php b/app/i18n/fr/feedback.php
index 328113c25..1f6c49b4d 100644
--- a/app/i18n/fr/feedback.php
+++ b/app/i18n/fr/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => 'Optimisation terminée.',
- ),
'access' => array(
'denied' => 'Vous n’avez pas le droit d’accéder à cette page !',
'not_found' => 'La page que vous cherchez n’existe pas !',
),
+ 'admin' => array(
+ 'optimization_complete' => 'Optimisation terminée.',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Votre mot de passe n’a pas pu être mis à jour',
+ 'updated' => 'Votre mot de passe a été mis à jour',
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => 'Un problème est survenu lors de la configuration de votre système d’authentification. Veuillez réessayer plus tard.',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s ne peut pas être activée. <a href="%s">Consulter les logs de FreshRSS</a> pour plus de détails.',
'ok' => '%s est désormais activée',
),
- 'no_access' => 'Vous n’avez aucun accès sur %s',
'not_enabled' => '%s n’est pas encore activée',
'not_found' => '%s n’existe pas',
+ 'no_access' => 'Vous n’avez aucun accès sur %s',
),
'import_export' => array(
'export_no_zip_extension' => 'L’extension ZIP n’est pas présente sur votre serveur. Veuillez essayer d’exporter les fichiers un par un.',
@@ -66,10 +72,10 @@ return array(
'emptied' => 'La catégorie a été vidée.',
'error' => 'La catégorie n’a pas pu être modifiée',
'name_exists' => 'Une catégorie possède déjà ce nom.',
- 'no_id' => 'Vous devez préciser l’id de la catégorie.',
- 'no_name' => 'Vous devez préciser un nom pour la catégorie.',
'not_delete_default' => 'Vous ne pouvez pas supprimer la catégorie par défaut !',
'not_exist' => 'Cette catégorie n’existe pas !',
+ 'no_id' => 'Vous devez préciser l’id de la catégorie.',
+ 'no_name' => 'Vous devez préciser un nom pour la catégorie.',
'over_max' => 'Vous avez atteint votre limite de catégories (%d)',
'updated' => 'La catégorie a été mise à jour.',
),
@@ -82,10 +88,10 @@ return array(
'error' => 'Une erreur est survenue',
'internal_problem' => 'Le flux ne peut pas être ajouté. <a href="%s">Consulter les logs de FreshRSS</a> pour plus de détails. Vous pouvez essayer de forcer l’ajout par addition de <code>#force_feed</code> à l’URL.',
'invalid_url' => 'L’url <em>%s</em> est invalide.',
+ 'not_added' => '<em>%s</em> n’a pas pu être ajouté.',
+ 'no_refresh' => 'Il n’y a aucun flux à actualiser…',
'n_actualized' => '%d flux ont été mis à jour.',
'n_entries_deleted' => '%d articles ont été supprimés.',
- 'no_refresh' => 'Il n’y a aucun flux à actualiser…',
- 'not_added' => '<em>%s</em> n’a pas pu être ajouté.',
'over_max' => 'Vous avez atteint votre limite de flux (%d)',
'updated' => 'Le flux a été mis à jour',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => 'L’utilisateur %s a été créé.',
'error' => 'L’utilisateur %s ne peut pas être créé.',
+ '_' => 'L’utilisateur %s a été créé.',
),
'deleted' => array(
- '_' => 'L’utilisateur %s a été supprimé.',
'error' => 'L’utilisateur %s ne peut pas être supprimé.',
+ '_' => 'L’utilisateur %s a été supprimé.',
),
'updated' => array(
- '_' => 'L’utilisateur %s a été mis à jour',
'error' => 'L’utilisateur %s n’a pas été mis à jour',
+ '_' => 'L’utilisateur %s a été mis à jour',
),
),
);
diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php
index a6875dd05..1f25220da 100644
--- a/app/i18n/fr/gen.php
+++ b/app/i18n/fr/gen.php
@@ -16,6 +16,7 @@ return array(
'manage' => 'Gérer',
'mark_favorite' => 'Mettre en favori',
'mark_read' => 'Marquer comme lu',
+ 'purge' => 'Purger',
'remove' => 'Supprimer',
'see_website' => 'Voir le site',
'submit' => 'Valider',
@@ -29,19 +30,19 @@ return array(
'login' => 'Connexion',
'logout' => 'Déconnexion',
'password' => array(
- '_' => 'Mot de passe',
'format' => '<small>7 caractères minimum</small>',
+ '_' => 'Mot de passe',
),
'registration' => array(
- '_' => 'Nouveau compte',
'ask' => 'Créer un compte ?',
'title' => 'Création de compte',
+ '_' => 'Nouveau compte',
),
'reset' => 'Réinitialisation de l’authentification',
'username' => array(
- '_' => 'Nom d’utilisateur',
'admin' => 'Nom d’utilisateur administrateur',
'format' => '<small>16 caractères alphanumériques maximum</small>',
+ '_' => 'Nom d’utilisateur',
),
),
'date' => array(
@@ -64,8 +65,8 @@ return array(
'Jan' => '\\j\\a\\n\\v\\i\\e\\r',
'jan' => 'jan.',
'january' => 'janvier',
- 'Jul' => '\\j\\u\\i\\l\\l\\e\\t',
'jul' => 'jui.',
+ 'Jul' => '\\j\\u\\i\\l\\l\\e\\t',
'july' => 'juillet',
'Jun' => '\\j\\u\\i\\n',
'jun' => 'juin',
@@ -75,8 +76,8 @@ return array(
'last_month' => 'Depuis le mois dernier',
'last_week' => 'Depuis la semaine dernière',
'last_year' => 'Depuis l’année dernière',
- 'Mar' => '\\m\\a\\r\\s',
'mar' => 'mars',
+ 'Mar' => '\\m\\a\\r\\s',
'march' => 'mars',
'May' => '\\m\\a\\i',
'may' => 'mai',
@@ -101,8 +102,8 @@ return array(
'yesterday' => 'Hier',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => 'À propos de FreshRSS',
+ '_' => 'FreshRSS',
),
'js' => array(
'category_empty' => 'Catégorie vide',
@@ -122,13 +123,14 @@ return array(
'en' => 'English',
'es' => 'Español',
'fr' => 'Français',
- 'he' => 'עברית',
+ 'he' => 'עברית', // TODO - Translation
'it' => 'Italiano',
'kr' => '한국어',
'nl' => 'Nederlands',
- 'oc' => 'Occitan',
+ 'oc' => 'Occitan', // TODO - Translation
'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
+ 'sk' => 'Slovenčina', // TODO - Translation
'tr' => 'Türkçe',
'zh-cn' => '简体中文',
),
@@ -178,11 +180,11 @@ return array(
'jdh' => 'Journal du hacker',
'Known' => 'Sites basés sur Known',
'lemmy' => 'Lemmy',
- 'linkedin' => 'LinkedIn',
- 'mastodon' => 'Mastodon',
+ 'linkedin' => 'LinkedIn', // TODO - Translation
+ 'mastodon' => 'Mastodon', // TODO - Translation
'movim' => 'Movim',
- 'pinboard' => 'Pinboard',
- 'pocket' => 'Pocket',
+ 'pinboard' => 'Pinboard', // TODO - Translation
+ 'pocket' => 'Pocket', // TODO - Translation
'print' => 'Imprimer',
'shaarli' => 'Shaarli',
'twitter' => 'Twitter',
diff --git a/app/i18n/fr/index.php b/app/i18n/fr/index.php
index 489de3849..2a95e52e2 100644
--- a/app/i18n/fr/index.php
+++ b/app/i18n/fr/index.php
@@ -2,7 +2,6 @@
return array(
'about' => array(
- '_' => 'À propos',
'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
'bugs_reports' => 'Rapports de bugs',
'credits' => 'Crédits',
@@ -14,23 +13,21 @@ return array(
'title' => 'À propos',
'version' => 'Version',
'website' => 'Site Internet',
- ),
- 'tos' => array(
- 'title' => 'Conditions Générales d’Utilisation',
+ '_' => 'À propos',
),
'feed' => array(
'add' => 'Vous pouvez ajouter des flux.',
'empty' => 'Il n’y a aucun article à afficher.',
'rss_of' => 'Flux RSS de %s',
'title' => 'Vos flux RSS',
- 'title_global' => 'Vue globale',
'title_fav' => 'Vos favoris',
+ 'title_global' => 'Vue globale',
),
'log' => array(
- '_' => 'Logs',
'clear' => 'Effacer les logs',
'empty' => 'Les logs sont vides.',
'title' => 'Logs',
+ '_' => 'Logs',
),
'menu' => array(
'about' => 'À propos de FreshRSS',
@@ -63,4 +60,7 @@ return array(
'tag' => array(
'related' => 'Tags de l’article',
),
+ 'tos' => array(
+ 'title' => 'Conditions Générales d’Utilisation',
+ ),
);
diff --git a/app/i18n/fr/install.php b/app/i18n/fr/install.php
index 9f2d90195..7dc567f41 100644
--- a/app/i18n/fr/install.php
+++ b/app/i18n/fr/install.php
@@ -17,20 +17,19 @@ return array(
'type' => 'Méthode d’authentification',
),
'bdd' => array(
- '_' => 'Base de données',
'conf' => array(
- '_' => 'Configuration de la base de données',
'ko' => 'Vérifiez les informations d’accès à la base de données.',
'ok' => 'La configuration de la base de données a été enregistrée.',
+ '_' => 'Configuration de la base de données',
),
'host' => 'Hôte',
'password' => 'Mot de passe pour base de données',
'prefix' => 'Préfixe des tables',
'type' => 'Type de base de données',
'username' => 'Nom d’utilisateur pour base de données',
+ '_' => 'Base de données',
),
'check' => array(
- '_' => 'Vérifications',
'already_installed' => 'FreshRSS semble avoir déjà été installé !',
'cache' => array(
'nok' => 'Veuillez vérifier les droits sur le répertoire <em>./data/cache</em>. Le serveur HTTP doit être capable d’écrire dedans',
@@ -96,10 +95,11 @@ return array(
'nok' => 'Impossible de trouver une librairie requise pour XML.',
'ok' => 'Vouz disposez de la librairie requise pour XML.',
),
+ '_' => 'Vérifications',
),
'conf' => array(
- '_' => 'Configuration générale',
'ok' => 'La configuration générale a été enregistrée.',
+ '_' => 'Configuration générale',
),
'congratulations' => 'Félicitations !',
'default_user' => 'Nom de l’utilisateur par défaut <small>(16 caractères alphanumériques maximum)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => 'Réinstaller FreshRSS vous fera perdre la configuration précédente. Êtes-vous sûr de vouloir continuer ?',
),
'language' => array(
- '_' => 'Langue',
'choose' => 'Choisissez la langue pour FreshRSS',
'defined' => 'La langue a bien été définie.',
+ '_' => 'Langue',
),
'not_deleted' => 'Quelque chose s’est mal passé, vous devez supprimer le fichier <em>%s</em> à la main.',
'ok' => 'L’installation s’est bien passée.',
'step' => 'étape %d',
'steps' => 'Étapes',
- 'title' => 'Installation · FreshRSS',
'this_is_the_end' => 'This is the end',
+ 'title' => 'Installation · FreshRSS',
);
diff --git a/app/i18n/fr/sub.php b/app/i18n/fr/sub.php
index e12444315..14bc6219c 100644
--- a/app/i18n/fr/sub.php
+++ b/app/i18n/fr/sub.php
@@ -3,7 +3,7 @@
return array(
'api' => array(
'documentation' => 'Copier l’URL suivante dans l’outil qui utilisera l’API.',
- 'title' => 'API',
+ 'title' => 'API', // TODO - Translation
),
'bookmarklet' => array(
'documentation' => 'Glisser ce bouton dans la barre des favoris ou cliquer droit dessus et choisir "Enregistrer ce lien". Ensuite, cliquer sur le bouton "S’abonner" sur les pages auxquelles vous voulez vous abonner.',
@@ -11,7 +11,6 @@ return array(
'title' => 'Bookmarklet',
),
'category' => array(
- '_' => 'Catégorie',
'add' => 'Ajouter une catégorie',
'archiving' => 'Archivage',
'empty' => 'Catégorie vide',
@@ -20,6 +19,7 @@ return array(
'position' => 'Position d’affichage',
'position_help' => 'Pour contrôler l’ordre de tri des catégories',
'title' => 'Titre',
+ '_' => 'Catégorie',
),
'feed' => array(
'add' => 'Ajouter un flux RSS',
@@ -39,8 +39,8 @@ return array(
'empty' => 'Ce flux est vide. Veuillez vérifier qu’il est toujours maintenu.',
'error' => 'Ce flux a rencontré un problème. Veuillez vérifier qu’il est toujours accessible puis actualisez-le.',
'filteractions' => array(
- '_' => 'Filtres d’action',
'help' => 'Écrivez une recherche par ligne.',
+ '_' => 'Filtres d’action',
),
'information' => 'Informations',
'keep_min' => 'Nombre minimum d’articles à conserver',
@@ -49,12 +49,11 @@ return array(
'no_selected' => 'Aucun flux sélectionné.',
'number_entries' => '%d articles',
'priority' => array(
- '_' => 'Visibilité',
'archived' => 'Ne pas afficher (archivé)',
'main_stream' => 'Afficher dans le flux principal',
'normal' => 'Afficher dans sa catégorie',
+ '_' => 'Visibilité',
),
- 'websub' => 'Notification instantanée par WebSub',
'show' => array(
'all' => 'Montrer tous les flux',
'error' => 'Montrer seulement les flux en erreur',
@@ -72,6 +71,7 @@ return array(
'url' => 'URL du flux',
'validator' => 'Vérifier la validité du flux',
'website' => 'URL du site',
+ 'websub' => 'Notification instantanée par WebSub',
),
'firefox' => array(
'documentation' => 'Suivre les étapes décrites <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">ici</a> pour ajouter FreshRSS à la liste des lecteurs de flux dans Firefox.',
@@ -80,9 +80,9 @@ return array(
),
'import_export' => array(
'export' => 'Exporter',
+ 'export_labelled' => 'Exporter les articles étiquetés',
'export_opml' => 'Exporter la liste des flux (OPML)',
'export_starred' => 'Exporter les favoris',
- 'export_labelled' => 'Exporter les articles étiquetés',
'feed_list' => 'Liste des articles de %s',
'file_to_import' => 'Fichier à importer<br />(OPML, JSON ou ZIP)',
'file_to_import_no_zip' => 'Fichier à importer<br />(OPML ou JSON)',
@@ -97,8 +97,8 @@ return array(
'subscription_tools' => 'Outils d’abonnement',
),
'title' => array(
- '_' => 'Gestion des abonnements',
'feed_management' => 'Gestion des flux RSS',
'subscription_tools' => 'Outils d’abonnement',
+ '_' => 'Gestion des abonnements',
),
);
diff --git a/app/i18n/fr/user.php b/app/i18n/fr/user.php
index 7b531c749..0c596636c 100644
--- a/app/i18n/fr/user.php
+++ b/app/i18n/fr/user.php
@@ -14,7 +14,7 @@ return array(
'email_sent' => 'Un email a été envoyé à votre adresse.',
'error' => 'L’adresse email n’a pas pu être validée.',
'ok' => 'L’adresse email a été validée.',
- 'unnecessary' => 'L’adresse email a déjà été validée.',
+ 'unneccessary' => 'The email address was already validated.', // TODO - Translation
'wrong_token' => 'L’adresse email n’a pas pu être validée à cause d’un mauvais token.',
),
'need_to' => 'Vous devez valider votre adresse email avant de pouvoir utiliser %s.',
@@ -22,16 +22,16 @@ return array(
'title' => 'Validation de l’adresse email',
),
),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'Vous devez accepter les conditions générales d’utilisation pour pouvoir vous inscrire.',
- ),
- ),
'mailer' => array(
'email_need_validation' => array(
+ 'body' => 'Vous venez de vous inscrire sur %s mais vous devez encore valider votre adresse email. Pour cela, veuillez cliquer sur ce lien :',
'title' => 'Vous devez valider votre compte',
'welcome' => 'Bienvenue %s,',
- 'body' => 'Vous venez de vous inscrire sur %s mais vous devez encore valider votre adresse email. Pour cela, veuillez cliquer sur ce lien :',
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'Vous devez accepter les conditions générales d’utilisation pour pouvoir vous inscrire.',
),
),
);
diff --git a/app/i18n/he/admin.php b/app/i18n/he/admin.php
index 759b74e2a..55ee9fc5d 100644
--- a/app/i18n/he/admin.php
+++ b/app/i18n/he/admin.php
@@ -8,10 +8,10 @@ return array(
'form' => 'טופס אינטרנטי (מסורתי, דורש JavaScript)',
'http' => 'HTTP (למשתמשים מתקדמים עם HTTPS)',
'none' => 'ללא (מסוכן)',
- 'title' => 'Authentication', //TODO - Translation
+ 'title' => 'Authentication', // TODO - Translation
'title_reset' => 'איפוס אימות',
'token' => 'מחרוזת אימות',
- 'token_help' => 'Allows to access RSS output of the default user without authentication:', //TODO - Translation
+ 'token_help' => 'Allows to access RSS output of the default user without authentication:',
'type' => 'שיטת אימות',
'unsafe_autologin' => 'הרשאה להתחברות אוטומטית בפורמט: ',
),
@@ -21,12 +21,12 @@ return array(
'ok' => 'ההרשאות בתיקיית המטמון תקינות',
),
'categories' => array(
- 'nok' => 'Category table is bad configured.', //TODO - Translation
- 'ok' => 'Category table is ok.', //TODO - Translation
+ 'nok' => 'Category table is bad configured.',
+ 'ok' => 'Category table is ok.', // TODO - Translation
),
'connection' => array(
- 'nok' => 'Connection to the database cannot being established.', //TODO - Translation
- 'ok' => 'Connection to the database is ok.', //TODO - Translation
+ 'nok' => 'Connection to the database cannot being established.',
+ 'ok' => 'Connection to the database is ok.', // TODO - Translation
),
'ctype' => array(
'nok' => 'הספרייה הנדרשת ל character type checking (php-ctype) אינה מותקנת',
@@ -34,44 +34,44 @@ return array(
),
'curl' => array(
'nok' => 'בURL לא מותקן (php-curl package)',
- 'ok' => 'You have cURL extension.', //TODO - Translation
+ 'ok' => 'You have cURL extension.',
),
'data' => array(
'nok' => 'יש לבדוק את ההרשאות בתיקייה <em>%s</em>. שרת הHTTP חייב להיות בעל הרשאות כתיבה.',
'ok' => 'ההרשאות בתיקיית הדאטא תקינות',
),
- 'database' => 'Database installation', //TODO - Translation
+ 'database' => 'Database installation', // TODO - Translation
'dom' => array(
- 'nok' => 'הספרייה הנדרשת לסיור ב DOM אינה מותקנת (php-xml package)',
+ 'nok' => 'הספרייה הנדרשת לסיור ב DOM אינה מותקנת (php-xml package)',
'ok' => 'הספרייה הנדרשת לסיור ב DOM מותקנת',
),
'entries' => array(
- 'nok' => 'Entry table is bad configured.', //TODO - Translation
- 'ok' => 'Entry table is ok.', //TODO - Translation
+ 'nok' => 'Entry table is bad configured.',
+ 'ok' => 'Entry table is ok.', // TODO - Translation
),
'favicons' => array(
- 'nok' => 'Check permissions on <em>./data/favicons</em> directory. HTTP server must have rights to write into', //TODO - Translation
+ 'nok' => 'Check permissions on <em>./data/favicons</em> directory. HTTP server must have rights to write into', // TODO - Translation
'ok' => 'ההרשאות בתיקיית הfavicons תקינות',
),
'feeds' => array(
- 'nok' => 'Feed table is bad configured.', //TODO - Translation
- 'ok' => 'Feed table is ok.', //TODO - Translation
+ 'nok' => 'Feed table is bad configured.',
+ 'ok' => 'Feed table is ok.', // TODO - Translation
),
'fileinfo' => array(
- 'nok' => 'Cannot find the PHP fileinfo library (fileinfo package).', //TODO - Translation
- 'ok' => 'You have the fileinfo library.', //TODO - Translation
+ 'nok' => 'Cannot find the PHP fileinfo library (fileinfo package).', // TODO - Translation
+ 'ok' => 'You have the fileinfo library.', // TODO - Translation
),
- 'files' => 'File installation', //TODO - Translation
+ 'files' => 'File installation', // TODO - Translation
'json' => array(
- 'nok' => 'You lack JSON (php-json package).', //TODO - Translation
- 'ok' => 'You have JSON extension.', //TODO - Translation
+ 'nok' => 'You lack JSON (php-json package).',
+ 'ok' => 'You have JSON extension.', // TODO - Translation
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
- 'nok' => 'You lack the Minz framework.', //TODO - Translation
+ 'nok' => 'You lack the Minz framework.',
'ok' => 'יש לכם את תשתית Minz',
),
'pcre' => array(
@@ -83,57 +83,56 @@ return array(
'ok' => 'PDO מותקן ולפחות אחד ממנהלי ההתקן הנתמכים מותקן (pdo_mysql, pdo_sqlite)',
),
'php' => array(
- '_' => 'PHP installation', //TODO - Translation
'nok' => 'גירסת PHP שלכם היא %s אך FreshRSS דורש לפחות את גירסה %s',
'ok' => 'גירסת PHP שלכם היא %s, שתואמת ל FreshRSS',
+ '_' => 'PHP installation', // TODO - Translation
),
'tables' => array(
- 'nok' => 'There is one or more lacking tables in the database.', //TODO - Translation
- 'ok' => 'Tables are existing in the database.', //TODO - Translation
+ 'nok' => 'There is one or more lacking tables in the database.',
+ 'ok' => 'Tables are existing in the database.',
),
- 'title' => 'Installation checking', //TODO - Translation
+ 'title' => 'Installation checking', // TODO - Translation
'tokens' => array(
- 'nok' => 'Check permissions on <em>./data/tokens</em> directory. HTTP server must have rights to write into', //TODO - Translation
- 'ok' => 'Permissions on tokens directory are good.', //TODO - Translation
+ 'nok' => 'Check permissions on <em>./data/tokens</em> directory. HTTP server must have rights to write into', // TODO - Translation
+ 'ok' => 'Permissions on tokens directory are good.', // TODO - Translation
),
'users' => array(
- 'nok' => 'Check permissions on <em>./data/users</em> directory. HTTP server must have rights to write into', //TODO - Translation
- 'ok' => 'Permissions on users directory are good.', //TODO - Translation
+ 'nok' => 'Check permissions on <em>./data/users</em> directory. HTTP server must have rights to write into', // TODO - Translation
+ 'ok' => 'Permissions on users directory are good.', // TODO - Translation
),
'zip' => array(
- 'nok' => 'You lack ZIP extension (php-zip package).', //TODO - Translation
- 'ok' => 'You have ZIP extension.', //TODO - Translation
+ 'nok' => 'You lack ZIP extension (php-zip package).',
+ 'ok' => 'You have ZIP extension.', // TODO - Translation
),
),
'extensions' => array(
- 'author' => 'Author', //TODO - Translation
- 'community' => 'Available community extensions', //TODO - Translation
- 'description' => 'Description', //TODO - Translation
- 'disabled' => 'Disabled', //TODO - Translation
- 'empty_list' => 'There is no installed extension', //TODO - Translation
- 'enabled' => 'Enabled', //TODO - Translation
- 'latest' => 'Installed', //TODO - Translation
- 'name' => 'Name', //TODO - Translation
- 'no_configure_view' => 'This extension cannot be configured.', //TODO - Translation
+ 'author' => 'Author', // TODO - Translation
+ 'community' => 'Available community extensions', // TODO - Translation
+ 'description' => 'Description', // TODO - Translation
+ 'disabled' => 'Disabled', // TODO - Translation
+ 'empty_list' => 'There is no installed extension',
+ 'enabled' => 'Enabled', // TODO - Translation
+ 'latest' => 'Installed', // TODO - Translation
+ 'name' => 'Name', // TODO - Translation
+ 'no_configure_view' => 'This extension cannot be configured.', // TODO - Translation
'system' => array(
- '_' => 'System extensions', //TODO - Translation
- 'no_rights' => 'System extension (you have no rights on it)', //TODO - Translation
+ 'no_rights' => 'System extension (you have no rights on it)', // TODO - Translation
+ '_' => 'System extensions', // TODO - Translation
),
- 'title' => 'Extensions', //TODO - Translation
- 'update' => 'Update available', //TODO - Translation
- 'user' => 'User extensions', //TODO - Translation
- 'version' => 'Version', //TODO - Translation
+ 'title' => 'Extensions', // TODO - Translation
+ 'update' => 'Update available', // TODO - Translation
+ 'user' => 'User extensions', // TODO - Translation
+ 'version' => 'Version', // TODO - Translation
),
'stats' => array(
- '_' => 'סטטיסטיקות',
'all_feeds' => 'כל ההזנות',
'category' => 'קטגוריה',
'entry_count' => 'סכום המאמרים',
'entry_per_category' => 'מאמרים על פי קטגוריה',
'entry_per_day' => 'מספר מאמרים ליום (30 ימים אחרונים)',
- 'entry_per_day_of_week' => 'Per day of week (average: %.2f messages)', //TODO - Translation
- 'entry_per_hour' => 'Per hour (average: %.2f messages)', //TODO - Translation
- 'entry_per_month' => 'Per month (average: %.2f messages)', //TODO - Translation
+ 'entry_per_day_of_week' => 'Per day of week (average: %.2f messages)', // TODO - Translation
+ 'entry_per_hour' => 'Per hour (average: %.2f messages)', // TODO - Translation
+ 'entry_per_month' => 'Per month (average: %.2f messages)', // TODO - Translation
'entry_repartition' => 'חלוקת המאמרים',
'feed' => 'הזנה',
'feed_per_category' => 'הזנות על פי קטגוריה',
@@ -155,46 +154,53 @@ return array(
'status_unread' => 'לא נקרא',
'title' => 'סטטיסטיקות',
'top_feed' => 'עשרת ההזנות המובילות',
+ '_' => 'סטטיסטיקות',
),
'system' => array(
- '_' => 'System configuration', //TODO - Translation
- 'auto-update-url' => 'Auto-update server URL', //TODO - Translation
+ 'auto-update-url' => 'Auto-update server URL', // TODO - Translation
'cookie-duration' => array(
- 'help' => 'in seconds', //TODO - Translation
- 'number' => 'Duration to keep logged in', //TODO - Translation
+ 'help' => 'in seconds', // TODO - Translation
+ 'number' => 'Duration to keep logged in', // TODO - Translation
),
- 'force_email_validation' => 'Force email addresses validation', //TODO - Translation
- 'instance-name' => 'Instance name', //TODO - Translation
- 'max-categories' => 'Categories per user limit', //TODO - Translation
- 'max-feeds' => 'Feeds per user limit', //TODO - Translation
+ 'force_email_validation' => 'Force email addresses validation', // TODO - Translation
+ 'instance-name' => 'Instance name', // TODO - Translation
+ 'max-categories' => 'Categories per user limit', // TODO - Translation
+ 'max-feeds' => 'Feeds per user limit', // TODO - Translation
'registration' => array(
- 'help' => '0 means that there is no account limit', //TODO - Translation
- 'number' => 'Max number of accounts', //TODO - Translation
+ 'help' => '0 means that there is no account limit', // TODO - Translation
+ 'number' => 'Max number of accounts', // TODO - Translation
),
+ '_' => 'System configuration', // TODO - Translation
),
'update' => array(
- '_' => 'מערכת העדכון',
'apply' => 'החלת העדכון',
'check' => 'בדיקת עדכונים חדשים',
- 'current_version' => 'Your current version of FreshRSS is the %s.', //TODO - Translation
+ 'current_version' => 'Your current version of FreshRSS is the %s.',
'last' => 'תאריך בדיקה אחרון: %s',
'none' => 'אין עדכון להחלה',
'title' => 'מערכת העדכון',
+ '_' => 'מערכת העדכון',
),
'user' => array(
- 'articles_and_size' => '%s articles (%s)', //TODO - Translation
+ 'articles_and_size' => '%s articles (%s)', // TODO - Translation
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => 'יצירת משתמש חדש',
- 'delete_users' => 'Delete user', //TODO - Translation
+ 'database_size' => 'Database size', // TODO - Translation
+ 'delete_users' => 'Delete user', // TODO - Translation
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => 'שפה',
- 'number' => 'There is %d account created', //TODO - Translation
- 'numbers' => 'There are %d accounts created', //TODO - Translation
+ 'list' => 'User list', // TODO - Translation
+ 'number' => 'There is %d account created', // TODO - Translation
+ 'numbers' => 'There are %d accounts created', // TODO - Translation
'password_form' => 'סיסמה<br /><small>(לשימוש בטפוס ההרשמה)</small>',
- 'password_format' => 'At least 7 characters', //TODO - Translation
- 'selected' => 'Selected user', //TODO - Translation
- 'title' => 'Manage users', //TODO - Translation
- 'update_users' => 'Update user', //TODO - Translation
- 'user_list' => 'רשימת משתמשים',
+ 'password_format' => 'At least 7 characters', // TODO - Translation
+ 'selected' => 'Selected user', // TODO - Translation
+ 'title' => 'Manage users', // TODO - Translation
+ 'update_users' => 'Update user', // TODO - Translation
'username' => 'שם משתמש',
'users' => 'משתמשים',
+ 'user_list' => 'רשימת משתמשים',
),
);
diff --git a/app/i18n/he/conf.php b/app/i18n/he/conf.php
index b987f21f4..136f249f0 100644
--- a/app/i18n/he/conf.php
+++ b/app/i18n/he/conf.php
@@ -2,34 +2,33 @@
return array(
'archiving' => array(
- '_' => 'ארכוב',
'delete_after' => 'מחיקת מאמרים לאחר',
- 'exception' => 'Purge exception', //TODO - Translation
+ 'exception' => 'Purge exception', // TODO - Translation
'help' => 'אפשרויות נוספות זמינות בזרמים ספציפיים',
- 'keep_favourites' => 'Never delete favourites', //TODO - Translation
- 'keep_min_by_feed' => 'Minimum number of articles to keep by feed',
- 'keep_labels' => 'Never delete labels', //TODO - Translation
- 'keep_unreads' => 'Never delete unreads', //TODO - Translation
- 'maintenance' => 'Maintenance', //TODO - Translation
+ 'keep_favourites' => 'Never delete favourites', // TODO - Translation
+ 'keep_labels' => 'Never delete labels', // TODO - Translation
+ 'keep_max' => 'Maximum number of articles to keep', // TODO - Translation
+ 'keep_min_by_feed' => 'Minimum number of articles to keep by feed', // TODO - Translation
+ 'keep_period' => 'Maximum age of articles to keep', // TODO - Translation
+ 'keep_unreads' => 'Never delete unreads', // TODO - Translation
+ 'maintenance' => 'Maintenance', // TODO - Translation
'optimize' => 'מיטוב בסיס הנתונים',
'optimize_help' => 'ביצוע לעיתים קרובות על מנת למטב את בסיס הנתונים',
- 'policy' => 'Purge policy', //TODO - Translation
- 'policy_warning' => 'If no purge policy is selected, every article will be kept.', //TODO - Translation
+ 'policy' => 'Purge policy', // TODO - Translation
+ 'policy_warning' => 'If no purge policy is selected, every article will be kept.', // TODO - Translation
'purge_now' => 'ניקוי עכשיו',
- 'keep_max' => 'Maximum number of articles to keep', //TODO - Translation
- 'keep_period' => 'Maximum age of articles to keep', //TODO - Translation
'title' => 'ארכוב',
'ttl' => 'אין לרענן אוטומטית יותר מ',
+ '_' => 'ארכוב',
),
'display' => array(
- '_' => 'תצוגה',
'icon' => array(
'bottom_line' => 'שורה תחתונה',
+ 'display_authors' => 'Authors', // TODO - Translation
'entry' => 'סמלילי מאמרים',
'publication_date' => 'תאריך הפרסום',
- 'related_tags' => 'תגיות קשורות', //TODO - Translation
+ 'related_tags' => 'תגיות קשורות',
'sharing' => 'שיתוף',
- 'display_authors' => 'Authors', //TODO - Translation
'top_line' => 'שורה עליונה',
),
'language' => 'שפה',
@@ -37,7 +36,7 @@ return array(
'seconds' => 'שניות (0 משמעותה ללא פג תוקף)',
'timeout' => 'HTML5 התראה פג תוקף',
),
- 'show_nav_buttons' => 'Show the navigation buttons', //TODO - Translation
+ 'show_nav_buttons' => 'Show the navigation buttons', // TODO - Translation
'theme' => 'ערכת נושא',
'title' => 'תצוגה',
'width' => array(
@@ -47,34 +46,35 @@ return array(
'no_limit' => 'ללא הגבלה',
'thin' => 'צר',
),
+ '_' => 'תצוגה',
),
'profile' => array(
- '_' => 'Profile management', //TODO - Translation
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => 'Account deletion', //TODO - Translation
- 'warn' => 'Your account and all related data will be deleted.', //TODO - Translation
+ 'warn' => 'Your account and all related data will be deleted.', // TODO - Translation
+ '_' => 'Account deletion', // TODO - Translation
),
- 'email' => 'Email address', //TODO - Translation
+ 'email' => 'Email address', // TODO - Translation
'password_api' => 'סיסמת API<br /><small>(לדוגמה ליישומים סלולריים)</small>',
'password_form' => 'סיסמה<br /><small>(לשימוש בטפוס ההרשמה)</small>',
- 'password_format' => 'At least 7 characters', //TODO - Translation
- 'title' => 'Profile', //TODO - Translation
+ 'password_format' => 'At least 7 characters', // TODO - Translation
+ 'title' => 'Profile', // TODO - Translation
+ '_' => 'Profile management', // TODO - Translation
),
'query' => array(
- '_' => 'שאילתות',
'deprecated' => 'שאילתה זו אינה בתוקף יותר, הפיד או הקטגוריה לייחוס נמחקו.',
- 'display' => 'Display user query results', //TODO - Translation
+ 'display' => 'Display user query results', // TODO - Translation
'filter' => 'מסננים בשימוש:',
'get_all' => 'הצגת כל המאמרים',
'get_category' => 'הצגת קטגוריה "%s"',
'get_favorite' => 'הצגת מאמרים מועדפים',
'get_feed' => 'הצגת הזנה %s',
- 'no_filter' => 'ללא סינון',
'none' => 'אף שאילתה לא נוצרה עדיין.',
+ 'no_filter' => 'ללא סינון',
'number' => 'שאילתה מספר °%d',
'order_asc' => 'הצגת מאמרים ישנים בראש',
'order_desc' => 'הצגת מאמרים חדשים בראש',
- 'remove' => 'Remove user query', //TODO - Translation
+ 'remove' => 'Remove user query', // TODO - Translation
'search' => 'חיפוש "%s"',
'state_0' => 'הצגת כל המאמרים',
'state_1' => 'הצגת מאמרים שנקראו',
@@ -91,22 +91,22 @@ return array(
'state_12' => 'הצגת כל המאמרים',
'state_13' => 'הצגת מאמרים שנקראו',
'state_14' => 'הצגת מאמרים שלא נקראו',
- 'state_15' => 'הצגת כל המאמרים',
+ 'state_15' => 'הצגת כל המאמרים',
'title' => 'שאילתות',
+ '_' => 'שאילתות',
),
'reading' => array(
- '_' => 'קריאה',
'after_onread' => 'לאחר “סימון הכל כנקרא”,',
'articles_per_page' => 'מספר המאמרים בעמוד',
'auto_load_more' => 'טעינת המאמר הבא סוף העמוד',
- 'auto_remove_article' => 'Hide articles after reading', //TODO - Translation
+ 'auto_remove_article' => 'Hide articles after reading', // TODO - Translation
'confirm_enabled' => 'הצגת דו-שיח לאישור “סימון הכל כנקרא” ',
'display_articles_unfolded' => 'הצגת מאמרים בשלמותם כברירת מחדל',
'display_categories_unfolded' => 'הצגת קטגוריות בשלמותן כברירת מחדל',
'hide_read_feeds' => 'הסתרת קטגוריות &amp; הזנות ללא מאמרים שלא נקראו (לא עובד יחד עם “הצגת כל המאמרים”)',
'img_with_lazyload' => 'שימוש ב "טעינה עצלה" על מנת לטעון תמונות',
'jump_next' => 'קפיצה לפריט הבא שלא נקרא (הזנה או קטגוריה)',
- 'mark_updated_article_unread' => 'Mark updated articles as unread', //TODO - Translation
+ 'mark_updated_article_unread' => 'Mark updated articles as unread', // TODO - Translation
'number_divided_when_reader' => 'חלוקה ב2 במצב קריאה.',
'read' => array(
'article_open_on_website' => 'כאשר מאמר נפתח באתר המקורי',
@@ -116,16 +116,16 @@ return array(
'when' => 'סימון מאמרים כנקראו…',
),
'show' => array(
- '_' => 'מאמרים להצגה',
'adaptive' => 'תצוגה מתעדכנת',
'all_articles' => 'הצגת כל המאמרים',
'unread' => 'הצגת מאמרים שלא נקראו בלבד',
+ '_' => 'מאמרים להצגה',
),
- 'sides_close_article' => 'Clicking outside of article text area closes the article', //TODO - Translation
+ 'sides_close_article' => 'Clicking outside of article text area closes the article', // TODO - Translation
'sort' => array(
- '_' => 'סדר המיון',
'newer_first' => 'חדשים בראש',
'older_first' => 'ישנים יותר בראש',
+ '_' => 'סדר המיון',
),
'sticky_post' => 'הצמדת המאמר לחלק העליון כאשר הוא פתוח',
'title' => 'קריאה',
@@ -135,34 +135,34 @@ return array(
'normal' => 'תצוגה רגילה',
'reader' => 'תצוגת קריאה',
),
+ '_' => 'קריאה',
),
'sharing' => array(
- '_' => 'שיתוף',
- 'add' => 'Add a sharing method', //TODO - Translation
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
+ 'add' => 'Add a sharing method', // TODO - Translation
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
'email' => 'דואר אלקטרוני',
- 'facebook' => 'Facebook',
+ 'facebook' => 'Facebook', // TODO - Translation
'more_information' => 'מידע נוסף',
'print' => 'הדפסה',
- 'remove' => 'Remove sharing method', //TODO - Translation
- 'shaarli' => 'Shaarli',
+ 'remove' => 'Remove sharing method', // TODO - Translation
+ 'shaarli' => 'Shaarli', // TODO - Translation
'share_name' => 'שיתוף שם לתצוגה',
'share_url' => 'לשימוש שתפו URL',
'title' => 'שיתוף',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag', // TODO - Translation
+ '_' => 'שיתוף',
),
'shortcut' => array(
- '_' => 'קיצורי דרך',
'article_action' => 'פעולות על מאמרים',
'auto_share' => 'שיתוף',
'auto_share_help' => 'אם יש רק מצב שיתוף אחד, הוא מופעל. אחרת המצבים נבחרים על בסיס המספר שלהם.',
- 'close_dropdown' => 'Close menus', //TODO - Translation
+ 'close_dropdown' => 'Close menus', // TODO - Translation
'collapse_article' => 'כיווץ',
'first_article' => 'דילוג למאמר הראשון',
'focus_search' => 'גישה לתיבת החיפוש',
- 'global_view' => 'Switch to global view', //TODO - Translation
+ 'global_view' => 'Switch to global view', // TODO - Translation
'help' => 'הצגת התיעוד',
'javascript' => 'חובה להפעיל JavaScript על מנת לעשות שימוש בקיצורי דרך',
'last_article' => 'דילוג למאמר האחרון',
@@ -171,24 +171,25 @@ return array(
'mark_read' => 'סימון כנקרא',
'navigation' => 'ניווט',
'navigation_help' => 'בעזרת מקש השיפט קיצורי דרך חלים על הזנות .<br/>עם מקש האלט הם חלים על קטגוריות.',
- 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', //TODO - Translation
+ 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', // TODO - Translation
'next_article' => 'דילוג למאמר הבא',
- 'normal_view' => 'Switch to normal view', //TODO - Translation
+ 'normal_view' => 'Switch to normal view', // TODO - Translation
'other_action' => 'פעולות אחרות',
'previous_article' => 'דילוג למאמר הקודם',
- 'reading_view' => 'Switch to reading view', //TODO - Translation
- 'rss_view' => 'Open RSS view in a new tab', //TODO - Translation
+ 'reading_view' => 'Switch to reading view', // TODO - Translation
+ 'rss_view' => 'Open RSS view in a new tab', // TODO - Translation
'see_on_website' => 'ראו את המקור באתר',
'shift_for_all_read' => '+ <code>shift</code> על מנת לסמן את כל המאמרים כנקראו',
- 'skip_next_article' => 'Focus next without opening', //TODO - Translation
- 'skip_previous_article' => 'Focus previous without opening', //TODO - Translation
+ 'skip_next_article' => 'Focus next without opening', // TODO - Translation
+ 'skip_previous_article' => 'Focus previous without opening', // TODO - Translation
'title' => 'קיצורי דרך',
'user_filter' => 'גישה למססנים',
'user_filter_help' => 'אם יש רק מזנן אחד הוא יהיה בשימוש. אחרת המסננים ישמשו על בסיס המספר שלהם.',
- 'views' => 'Views', //TODO - Translation
+ 'views' => 'Views', // TODO - Translation
+ '_' => 'קיצורי דרך',
),
'user' => array(
- 'articles_and_size' => '%s articles (%s)', //TODO - Translation
+ 'articles_and_size' => '%s articles (%s)', // TODO - Translation
'current' => 'משתמש נוכחי',
'is_admin' => 'מנהל',
'users' => 'משתמשים',
diff --git a/app/i18n/he/feedback.php b/app/i18n/he/feedback.php
index f972173cb..56af570c3 100644
--- a/app/i18n/he/feedback.php
+++ b/app/i18n/he/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => 'המיטוב הושלם',
- ),
'access' => array(
'denied' => 'אין לך הרשאות לצפות בדף זה',
'not_found' => 'הדף הזה לא נמצא',
),
+ 'admin' => array(
+ 'optimization_complete' => 'המיטוב הושלם',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => 'אירעה שגיאה במהלך הגדרת מערכת האימיות. אנא נסו שוב מאוחר יותר.',
@@ -15,32 +21,32 @@ return array(
),
'login' => array(
'invalid' => 'הכניסה לחשבון שגויה',
- 'success' => 'You are connected', // @todo
+ 'success' => 'You are connected', // TODO - Translation
),
'logout' => array(
- 'success' => 'You are disconnected', // @todo
+ 'success' => 'You are disconnected', // TODO - Translation
),
'no_password_set' => 'לא הוגדרה סיסמת מנהל. תכונה זו אינה זמינה.',
),
'conf' => array(
- 'error' => 'An error occurred during configuration saving', // @todo
+ 'error' => 'An error occurred during configuration saving', // TODO - Translation
'query_created' => 'השאילתה "%s" נוצרה.',
'shortcuts_updated' => 'קיצורי הדרך עודכנו',
'updated' => 'ההגדרות עודכנו',
),
'extensions' => array(
- 'already_enabled' => '%s is already enabled', // @todo
+ 'already_enabled' => '%s is already enabled', // TODO - Translation
'disable' => array(
- 'ko' => '%s cannot be disabled. <a href="%s">Check FreshRSS logs</a> for details.', // @todo
- 'ok' => '%s is now disabled', // @todo
+ 'ko' => '%s cannot be disabled. <a href="%s">Check FreshRSS logs</a> for details.', // TODO - Translation
+ 'ok' => '%s is now disabled', // TODO - Translation
),
'enable' => array(
- 'ko' => '%s cannot be enabled. <a href="%s">Check FreshRSS logs</a> for details.', // @todo
- 'ok' => '%s is now enabled', // @todo
+ 'ko' => '%s cannot be enabled. <a href="%s">Check FreshRSS logs</a> for details.', // TODO - Translation
+ 'ok' => '%s is now enabled', // TODO - Translation
),
- 'no_access' => 'You have no access on %s', // @todo
- 'not_enabled' => '%s is not enabled yet', // @todo
- 'not_found' => '%s does not exist', // @todo
+ 'not_enabled' => '%s is not enabled yet',
+ 'not_found' => '%s does not exist', // TODO - Translation
+ 'no_access' => 'You have no access on %s', // TODO - Translation
),
'import_export' => array(
'export_no_zip_extension' => 'הרחבת ZIP אינה מותקנת על השרת.',
@@ -51,27 +57,27 @@ return array(
'zip_error' => 'אירעה שגיאה במהלך ייבוא קובץ הZIP.',
),
'profile' => array(
- 'error' => 'Your profile cannot be modified', // @todo
- 'updated' => 'Your profile has been modified', // @todo
+ 'error' => 'Your profile cannot be modified', // TODO - Translation
+ 'updated' => 'Your profile has been modified', // TODO - Translation
),
'sub' => array(
'actualize' => 'מימוש',
'articles' => array(
- 'marked_read' => 'The selected articles have been marked as read.', //TODO - Translation
- 'marked_unread' => 'The articles have been marked as unread.', //TODO - Translation
+ 'marked_read' => 'The selected articles have been marked as read.', // TODO - Translation
+ 'marked_unread' => 'The articles have been marked as unread.', // TODO - Translation
),
'category' => array(
- 'created' => 'Category %s has been created.', //TODO - Translation
- 'deleted' => 'Category has been deleted.', //TODO - Translation
+ 'created' => 'Category %s has been created.', // TODO - Translation
+ 'deleted' => 'Category has been deleted.', // TODO - Translation
'emptied' => 'הקטגוריה רוקנה',
- 'error' => 'Category cannot be updated', //TODO - Translation
- 'name_exists' => 'Category name already exists.', //TODO - Translation
- 'no_id' => 'You must precise the id of the category.', //TODO - Translation
- 'no_name' => 'Category name cannot be empty.', //TODO - Translation
- 'not_delete_default' => 'You cannot delete the default category!', //TODO - Translation
- 'not_exist' => 'The category does not exist!', //TODO - Translation
- 'over_max' => 'You have reached your limit of categories (%d)', //TODO - Translation
- 'updated' => 'Category has been updated.', //TODO - Translation
+ 'error' => 'Category cannot be updated', // TODO - Translation
+ 'name_exists' => 'Category name already exists.', // TODO - Translation
+ 'not_delete_default' => 'You cannot delete the default category!', // TODO - Translation
+ 'not_exist' => 'The category does not exist!', // TODO - Translation
+ 'no_id' => 'You must precise the id of the category.',
+ 'no_name' => 'Category name cannot be empty.', // TODO - Translation
+ 'over_max' => 'You have reached your limit of categories (%d)', // TODO - Translation
+ 'updated' => 'Category has been updated.', // TODO - Translation
),
'feed' => array(
'actualized' => '<em>%s</em> עודכן',
@@ -79,20 +85,20 @@ return array(
'added' => 'RSS הזנת <em>%s</em> נוספה',
'already_subscribed' => 'אתה כבר רשום ל <em>%s</em>',
'deleted' => 'ההזנה נמחקה',
- 'error' => 'Feed cannot be updated', //TODO - Translation
- 'internal_problem' => 'אין אפשרות להוסיף את ההזנה. <a href="%s">בדקו את הלוגים</a> לפרטים.', //TODO - Translation
+ 'error' => 'Feed cannot be updated', // TODO - Translation
+ 'internal_problem' => 'אין אפשרות להוסיף את ההזנה. <a href="%s">בדקו את הלוגים</a> לפרטים.',
'invalid_url' => 'URL <em>%s</em> אינו תקין',
+ 'not_added' => '<em>%s</em> אין אפשרות להוסיף את',
+ 'no_refresh' => 'אין הזנה שניתן לרענן…',
'n_actualized' => '%d הזנות עודכנו',
'n_entries_deleted' => '%d המאמרים נמחקו',
- 'no_refresh' => 'אין הזנה שניתן לרענן…',
- 'not_added' => '<em>%s</em> אין אפשרות להוסיף את',
- 'over_max' => 'You have reached your limit of feeds (%d)', //TODO - Translation
+ 'over_max' => 'You have reached your limit of feeds (%d)', // TODO - Translation
'updated' => 'ההזנה התעדכנה',
),
'purge_completed' => 'הניקוי הושלם (%d מאמרים נמחקו)',
),
'update' => array(
- 'can_apply' => 'FreshRSS will be now updated to the <strong>version %s</strong>.', //TODO - Translation
+ 'can_apply' => 'FreshRSS will be now updated to the <strong>version %s</strong>.',
'error' => 'תהליך העדכון נתקל בשגיאה: %s',
'file_is_nok' => 'יש לבדוק את ההרשאות בתיקייה <em>%s</em>. שרת הHTTP חייב להיות בעל הרשאות כתיבה.',
'finished' => 'העדכון הושלם!',
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
+ 'error' => 'User %s cannot be created', // TODO - Translation
'_' => 'המשתמש %s נוצר',
- 'error' => 'User %s cannot be created', //TODO - Translation
),
'deleted' => array(
+ 'error' => 'User %s cannot be deleted', // TODO - Translation
'_' => 'המשתמש %s נמחק',
- 'error' => 'User %s cannot be deleted', //TODO - Translation
),
'updated' => array(
- '_' => 'User %s has been updated', //TODO - Translation
- 'error' => 'User %s has not been updated', //TODO - Translation
+ 'error' => 'User %s has not been updated', // TODO - Translation
+ '_' => 'User %s has been updated', // TODO - Translation
),
),
);
diff --git a/app/i18n/he/gen.php b/app/i18n/he/gen.php
index 34e6d77de..5622690e4 100644
--- a/app/i18n/he/gen.php
+++ b/app/i18n/he/gen.php
@@ -3,71 +3,72 @@
return array(
'action' => array(
'actualize' => 'מימוש',
- 'back' => '← Go back', //TODO - Translation
+ 'back' => '← Go back', // TODO - Translation
'back_to_rss_feeds' => '← חזרה להזנות הRSS שלך',
'cancel' => 'ביטול',
'create' => 'יצירה',
- 'disable' => 'Disable', //TODO - Translation
- 'empty' => 'Empty', //TODO - Translation
- 'enable' => 'Enable', //TODO - Translation
+ 'disable' => 'Disable', // TODO - Translation
+ 'empty' => 'Empty', // TODO - Translation
+ 'enable' => 'Enable', // TODO - Translation
'export' => 'ייצוא',
'filter' => 'מסנן',
'import' => 'ייבוא',
'manage' => 'ניהול',
- 'mark_read' => 'סימון כנקרא',
'mark_favorite' => 'סימון כמועדף',
- 'remove' => 'Remove', //TODO - Translation
+ 'mark_read' => 'סימון כנקרא',
+ 'purge' => 'Purge', // TODO - Translation
+ 'remove' => 'Remove', // TODO - Translation
'see_website' => 'ראו אתר',
'submit' => 'אישור',
'truncate' => 'מחיקת כל המאמרים',
- 'update' => 'Update', //TODO - Translation
+ 'update' => 'Update', // TODO - Translation
),
'auth' => array(
- 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
- 'email' => 'Email address', //TODO - Translation
+ 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
+ 'email' => 'Email address', // TODO - Translation
'keep_logged_in' => 'השאר מחובר <small>חודש</small>',
'login' => 'כניסה לחשבון',
'logout' => 'יציאה מהחשבון',
'password' => array(
+ 'format' => '<small>At least 7 characters</small>', // TODO - Translation
'_' => 'סיסמה',
- 'format' => '<small>At least 7 characters</small>',
),
'registration' => array(
- '_' => 'New account', //TODO - Translation
- 'ask' => 'Create an account?', //TODO - Translation
- 'title' => 'Account creation', //TODO - Translation
+ 'ask' => 'Create an account?', // TODO - Translation
+ 'title' => 'Account creation', // TODO - Translation
+ '_' => 'New account', // TODO - Translation
),
'reset' => 'איפוס אימות',
'username' => array(
- '_' => 'שם משתמש',
'admin' => 'שם משתמש של המנהל',
- 'format' => '<small>maximum 16 alphanumeric characters</small>', //TODO - Translation
+ 'format' => '<small>maximum 16 alphanumeric characters</small>', // TODO - Translation
+ '_' => 'שם משתמש',
),
),
'date' => array(
- 'Apr' => '\\A\\p\\r\\i\\l',
+ 'Apr' => '\\A\\p\\r\\i\\l', // TODO - Translation
'apr' => 'apr',
'april' => 'Apr',
- 'Aug' => '\\A\\u\\g\\u\\s\\t',
+ 'Aug' => '\\A\\u\\g\\u\\s\\t', // TODO - Translation
'aug' => 'aug',
'august' => 'Aug',
'before_yesterday' => 'ישן יותר',
- 'Dec' => '\\D\\e\\c\\e\\m\\b\\e\\r',
+ 'Dec' => '\\D\\e\\c\\e\\m\\b\\e\\r', // TODO - Translation
'dec' => 'dec',
'december' => 'Dec',
- 'Feb' => '\\F\\e\\b\\r\\u\\a\\r\\y',
+ 'Feb' => '\\F\\e\\b\\r\\u\\a\\r\\y', // TODO - Translation
'feb' => 'feb',
'february' => 'Feb',
- 'format_date' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y',
- 'format_date_hour' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y \\a\\t H\\:i',
- 'fri' => 'Fri',
- 'Jan' => '\\J\\a\\n\\u\\a\\r\\y',
+ 'format_date' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y', // TODO - Translation
+ 'format_date_hour' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y \\a\\t H\\:i', // TODO - Translation
+ 'fri' => 'Fri', // TODO - Translation
+ 'Jan' => '\\J\\a\\n\\u\\a\\r\\y', // TODO - Translation
'jan' => 'jan',
'january' => 'Jan',
- 'Jul' => '\\J\\u\\l\\y',
'jul' => 'jul',
+ 'Jul' => '\\J\\u\\l\\y', // TODO - Translation
'july' => 'Jul',
- 'Jun' => '\\J\\u\\n\\e',
+ 'Jun' => '\\J\\u\\n\\e', // TODO - Translation
'jun' => 'jun',
'june' => 'Jun',
'last_3_month' => 'בשלושת החודשים האחרונים',
@@ -75,72 +76,73 @@ return array(
'last_month' => 'בחודש שעבר',
'last_week' => 'בשבוע שעבר',
'last_year' => 'בשנה האחרונה',
- 'Mar' => '\\M\\a\\r\\c\\h',
'mar' => 'mar',
+ 'Mar' => '\\M\\a\\r\\c\\h', // TODO - Translation
'march' => 'Mar',
- 'May' => '\\M\\a\\y',
- 'may' => 'May',
- 'may_' => 'May',
- 'mon' => 'Mon',
+ 'May' => '\\M\\a\\y', // TODO - Translation
+ 'may' => 'May', // TODO - Translation
+ 'may_' => 'May', // TODO - Translation
+ 'mon' => 'Mon', // TODO - Translation
'month' => 'חודשים',
- 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r',
+ 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r', // TODO - Translation
'nov' => 'nov',
'november' => 'Nov',
- 'Oct' => '\\O\\c\\t\\o\\b\\e\\r',
+ 'Oct' => '\\O\\c\\t\\o\\b\\e\\r', // TODO - Translation
'oct' => 'oct',
'october' => 'Oct',
- 'sat' => 'Sat',
- 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',
+ 'sat' => 'Sat', // TODO - Translation
+ 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r', // TODO - Translation
'sep' => 'sep',
'september' => 'Sep',
- 'sun' => 'Sun',
- 'thu' => 'Thu',
+ 'sun' => 'Sun', // TODO - Translation
+ 'thu' => 'Thu', // TODO - Translation
'today' => 'היום',
- 'tue' => 'Tue',
- 'wed' => 'Wed',
+ 'tue' => 'Tue', // TODO - Translation
+ 'wed' => 'Wed', // TODO - Translation
'yesterday' => 'אתמול',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => 'אודות FreshRSS',
+ '_' => 'FreshRSS', // TODO - Translation
),
'js' => array(
- 'category_empty' => 'Empty category', //TODO - Translation
+ 'category_empty' => 'Empty category', // TODO - Translation
'confirm_action' => 'האם אתם בטוחים שברצונכם לבצע פעולה זו? אין אפשרות לבטל אותה!',
'confirm_action_feed_cat' => 'האם אתם בטוחים שברצוניכם לבצע פעולה זו? מועדפים ושאילתות עשויות לאבוד. אין אפשרות לבטל אותה!',
'feedback' => array(
- 'body_new_articles' => 'ישנם \d מאמרים חדשים לקרוא ב FreshRSS.',
- 'request_failed' => 'A request has failed, it may have been caused by Internet connection problems.', //TODO - Translation
+ 'body_new_articles' => 'ישנם \\d מאמרים חדשים לקרוא ב FreshRSS.',
+ 'request_failed' => 'A request has failed, it may have been caused by Internet connection problems.', // TODO - Translation
'title_new_articles' => 'FreshRSS: מאמרים חדשים!',
),
'new_article' => 'מאמרים חדשים זמינים, לחצו לרענון העמוד.',
'should_be_activated' => 'חובה להפעיל JavaScript',
),
'lang' => array(
- 'cz' => 'Čeština',
- 'de' => 'Deutsch',
- 'en' => 'English',
- 'es' => 'Español',
- 'fr' => 'Français',
- 'he' => 'עברית',
- 'it' => 'Italiano',
- 'kr' => '한국어',
- 'nl' => 'Nederlands',
- 'oc' => 'Occitan',
- 'pt-br' => 'Português (Brasil)',
- 'ru' => 'Русский',
- 'tr' => 'Türkçe',
- 'zh-cn' => '简体中文',
+ 'cz' => 'Čeština', // TODO - Translation
+ 'de' => 'Deutsch', // TODO - Translation
+ 'en' => 'English', // TODO - Translation
+ 'es' => 'Español', // TODO - Translation
+ 'fr' => 'Français', // TODO - Translation
+ 'he' => 'עברית', // TODO - Translation
+ 'it' => 'Italiano', // TODO - Translation
+ 'kr' => '한국어', // TODO - Translation
+ 'nl' => 'Nederlands', // TODO - Translation
+ 'oc' => 'Occitan', // TODO - Translation
+ 'pt-br' => 'Português (Brasil)', // TODO - Translation
+ 'ru' => 'Русский', // TODO - Translation
+ 'sk' => 'Slovenčina', // TODO - Translation
+ 'tr' => 'Türkçe', // TODO - Translation
+ 'zh-cn' => '简体中文', // TODO - Translation
),
'menu' => array(
'about' => 'אודות',
'admin' => 'ניהול',
'archiving' => 'ארכוב',
- 'authentication' => 'Authentication', //TODO - Translation
- 'check_install' => 'Installation checking', //TODO - Translation
+ 'authentication' => 'Authentication', // TODO - Translation
+ 'check_install' => 'Installation checking', // TODO - Translation
'configuration' => 'הגדרות',
'display' => 'תצוגה',
- 'extensions' => 'Extensions', //TODO - Translation
+ 'extensions' => 'Extensions', // TODO - Translation
'logs' => 'לוגים',
'queries' => 'שאילתות',
'reading' => 'קריאה',
@@ -148,10 +150,10 @@ return array(
'sharing' => 'שיתוף',
'shortcuts' => 'קיצורי דרך',
'stats' => 'סטטיסטיקות',
- 'system' => 'System configuration', //TODO - Translation
+ 'system' => 'System configuration', // TODO - Translation
'update' => 'עדכון',
- 'user_management' => 'Manage users', //TODO - Translation
- 'user_profile' => 'Profile', //TODO - Translation
+ 'user_management' => 'Manage users', // TODO - Translation
+ 'user_profile' => 'Profile', // TODO - Translation
),
'pagination' => array(
'first' => 'הראשון',
@@ -163,31 +165,31 @@ return array(
'previous' => 'הקודם',
),
'period' => array(
- 'days' => 'days', //TODO - Translation
- 'hours' => 'hours', //TODO - Translation
- 'months' => 'months', //TODO - Translation
- 'weeks' => 'weeks', //TODO - Translation
- 'years' => 'years', //TODO - Translation
+ 'days' => 'days', // TODO - Translation
+ 'hours' => 'hours', // TODO - Translation
+ 'months' => 'months', // TODO - Translation
+ 'weeks' => 'weeks', // TODO - Translation
+ 'years' => 'years', // TODO - Translation
),
'share' => array(
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
'email' => 'דואר אלקטרוני',
- 'facebook' => 'Facebook',
- 'gnusocial' => 'GNU social',
- 'jdh' => 'Journal du hacker',
- 'Known' => 'Known based sites',
- 'lemmy' => 'Lemmy',
- 'linkedin' => 'LinkedIn',
- 'mastodon' => 'Mastodon',
- 'movim' => 'Movim',
- 'pinboard' => 'Pinboard',
- 'pocket' => 'Pocket',
+ 'facebook' => 'Facebook', // TODO - Translation
+ 'gnusocial' => 'GNU social', // TODO - Translation
+ 'jdh' => 'Journal du hacker', // TODO - Translation
+ 'Known' => 'Known based sites', // TODO - Translation
+ 'lemmy' => 'Lemmy', // TODO - Translation
+ 'linkedin' => 'LinkedIn', // TODO - Translation
+ 'mastodon' => 'Mastodon', // TODO - Translation
+ 'movim' => 'Movim', // TODO - Translation
+ 'pinboard' => 'Pinboard', // TODO - Translation
+ 'pocket' => 'Pocket', // TODO - Translation
'print' => 'הדפסה',
- 'shaarli' => 'Shaarli',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag v1',
- 'wallabagv2' => 'wallabag v2',
+ 'shaarli' => 'Shaarli', // TODO - Translation
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag v1', // TODO - Translation
+ 'wallabagv2' => 'wallabag v2', // TODO - Translation
),
'short' => array(
'attention' => 'זהירות!',
@@ -197,7 +199,7 @@ return array(
'damn' => 'הו לא!',
'default_category' => 'ללא קטגוריה',
'no' => 'לא',
- 'not_applicable' => 'Not available', //TODO - Translation
+ 'not_applicable' => 'Not available', // TODO - Translation
'ok' => 'כן!',
'or' => 'או',
'yes' => 'כן',
diff --git a/app/i18n/he/index.php b/app/i18n/he/index.php
index 7cd1945e7..76d634e76 100644
--- a/app/i18n/he/index.php
+++ b/app/i18n/he/index.php
@@ -2,8 +2,7 @@
return array(
'about' => array(
- '_' => 'אודות',
- 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', // TODO - Translation
'bugs_reports' => 'דיווח באגים',
'credits' => 'קרדיטים',
'credits_content' => 'מאפייני עיצוב מסויימים הגיעו מ <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> אף על פי ש FreshRSS אינו משתמש בתשתית הזו. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">סמלילים</a> הגיעו מ <a href="https://www.gnome.org/"> פרוייקט GNOME </a>. <em>Open Sans</em> הגופן police נוצר על ידי <a href="https://www.google.com/webfonts/specimen/Open+Sans">Steve Matteson</a>. Favicons נאספים בעזרת <a href="https://getfavicon.appspot.com/">getFavicon API</a>. FreshRSS מבוסס על <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, תשתית PHP.',
@@ -14,23 +13,21 @@ return array(
'title' => 'אודות',
'version' => 'גרסה',
'website' => 'אתר',
- ),
- 'tos' => array(
- 'title' => 'Terms of Service', // TODO - Translation
+ '_' => 'אודות',
),
'feed' => array(
'add' => 'ניתן להוסיף הזנות חדשות.',
'empty' => 'אין מאמר להצגה.',
'rss_of' => 'הזנת RSS של %s',
'title' => 'ההזנות שלך',
- 'title_global' => 'תצוגה גלובלית',
'title_fav' => 'המועדפים שלך',
+ 'title_global' => 'תצוגה גלובלית',
),
'log' => array(
- '_' => 'לוגים',
'clear' => 'ניקוי הלוגים',
'empty' => 'קובץ הלוג ריק',
'title' => 'לוגים',
+ '_' => 'לוגים',
),
'menu' => array(
'about' => 'אודות FreshRSS',
@@ -43,7 +40,7 @@ return array(
'mark_all_read' => 'סימון הכל כנקרא',
'mark_cat_read' => 'סימון קטגוריה כנקראה',
'mark_feed_read' => 'סימון הזנה כנקראה',
- 'mark_selection_unread' => 'Mark selection as unread', //TODO - Translation
+ 'mark_selection_unread' => 'Mark selection as unread', // TODO - Translation
'newer_first' => 'חדשים בראש',
'non-starred' => 'הצגת הכל פרט למועדפים',
'normal_view' => 'תצוגה רגילה',
@@ -56,11 +53,14 @@ return array(
'starred' => 'הצגת מועדפים בלבד',
'stats' => 'סטטיסטיקות',
'subscription' => 'ניהול הרשמות',
- 'tags' => 'My labels', //TODO - Translation
+ 'tags' => 'My labels', // TODO - Translation
'unread' => 'הצגת מאמרים שלא נקראו בלבד',
),
'share' => 'שיתוף',
'tag' => array(
- 'related' => 'תגיות קשורות', //TODO - Translation
+ 'related' => 'תגיות קשורות',
+ ),
+ 'tos' => array(
+ 'title' => 'Terms of Service', // TODO - Translation
),
);
diff --git a/app/i18n/he/install.php b/app/i18n/he/install.php
index 3a3e5ab12..f2b477403 100644
--- a/app/i18n/he/install.php
+++ b/app/i18n/he/install.php
@@ -4,36 +4,35 @@ return array(
'action' => array(
'finish' => 'השלמת ההתקנה',
'fix_errors_before' => 'יש לתקן את השגיאות לפני המעבר לשלב הבא.',
- 'keep_install' => 'Keep previous configuration', //TODO - Translation
+ 'keep_install' => 'Keep previous configuration', // TODO - Translation
'next_step' => 'לשלב הבא',
- 'reinstall' => 'Reinstall FreshRSS', //TODO - Translation
+ 'reinstall' => 'Reinstall FreshRSS', // TODO - Translation
),
'auth' => array(
'form' => 'טופס אינטרנטי (מסורתי, דורש JavaScript)',
'http' => 'HTTP (למשתמשים מתקדמים עם HTTPS)',
'none' => 'ללא (מסוכן)',
'password_form' => 'סיסמה<br /><small>(לשימוש בטפוס ההרשמה)</small>',
- 'password_format' => 'At least 7 characters', //TODO - Translation
+ 'password_format' => 'At least 7 characters', // TODO - Translation
'type' => 'שיטת אימות',
),
'bdd' => array(
- '_' => 'בסיס נתונים',
'conf' => array(
- '_' => 'הגדרות בסיס נתונים',
'ko' => 'נא לוודא את הגדרות בסיס הנתונים.',
'ok' => 'הגדרות בסיס הנתונים נשמרו.',
+ '_' => 'הגדרות בסיס נתונים',
),
'host' => 'מארח',
'password' => 'HTTP סיסמה',
'prefix' => 'קידומת הטבלה',
'type' => 'סוג בסיס הנתונים',
'username' => 'HTTP שם משתמש',
+ '_' => 'בסיס נתונים',
),
'check' => array(
- '_' => 'בדיקות',
- 'already_installed' => 'We have detected that FreshRSS is already installed!', //TODO - Translation
+ 'already_installed' => 'We have detected that FreshRSS is already installed!', // TODO - Translation
'cache' => array(
- 'nok' => 'Check permissions on <em>./data/cache</em> directory. HTTP server must have rights to write into', //TODO - Translation
+ 'nok' => 'Check permissions on <em>./data/cache</em> directory. HTTP server must have rights to write into', // TODO - Translation
'ok' => 'ההרשאות בתיקיית המטמון תקינות',
),
'ctype' => array(
@@ -45,35 +44,35 @@ return array(
'ok' => 'יש לכם את גירסת %s של cURL',
),
'data' => array(
- 'nok' => 'Check permissions on <em>./data</em> directory. HTTP server must have rights to write into', //TODO - Translation
+ 'nok' => 'Check permissions on <em>./data</em> directory. HTTP server must have rights to write into', // TODO - Translation
'ok' => 'ההרשאות בתיקיית הדאטא תקינות',
),
'dom' => array(
- 'nok' => 'הספרייה הנדרשת לסיור ב DOM אינה מותקנת (php-xml package)',
+ 'nok' => 'הספרייה הנדרשת לסיור ב DOM אינה מותקנת (php-xml package)',
'ok' => 'הספרייה הנדרשת לסיור ב DOM מותקנת',
),
'favicons' => array(
- 'nok' => 'Check permissions on <em>./data/favicons</em> directory. HTTP server must have rights to write into', //TODO - Translation
+ 'nok' => 'Check permissions on <em>./data/favicons</em> directory. HTTP server must have rights to write into', // TODO - Translation
'ok' => 'ההרשאות בתיקיית הfavicons תקינות',
),
'fileinfo' => array(
- 'nok' => 'Cannot find the PHP fileinfo library (fileinfo package).', //TODO - Translation
- 'ok' => 'You have the fileinfo library.', //TODO - Translation
+ 'nok' => 'Cannot find the PHP fileinfo library (fileinfo package).', // TODO - Translation
+ 'ok' => 'You have the fileinfo library.', // TODO - Translation
),
'http_referer' => array(
'nok' => 'נא לדבוק שאינך פוגעת ב HTTP REFERER שלך.',
'ok' => 'הHTTP REFERER ידוע ותאם לשרת שלך.',
),
'json' => array(
- 'nok' => 'Cannot find a recommended library to parse JSON.', //TODO - Translation
- 'ok' => 'You have a recommended library to parse JSON.', //TODO - Translation
+ 'nok' => 'Cannot find a recommended library to parse JSON.', // TODO - Translation
+ 'ok' => 'You have a recommended library to parse JSON.', // TODO - Translation
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
- 'nok' => 'You lack the Minz framework.', //TODO - Translation
+ 'nok' => 'You lack the Minz framework.',
'ok' => 'יש לכם את תשתית Minz',
),
'pcre' => array(
@@ -89,17 +88,18 @@ return array(
'ok' => 'גירסת PHP שלכם היא %s, שתואמת ל FreshRSS',
),
'users' => array(
- 'nok' => 'Check permissions on <em>./data/users</em> directory. HTTP server must have rights to write into', //TODO - Translation
- 'ok' => 'Permissions on users directory are good.', //TODO - Translation
+ 'nok' => 'Check permissions on <em>./data/users</em> directory. HTTP server must have rights to write into', // TODO - Translation
+ 'ok' => 'Permissions on users directory are good.', // TODO - Translation
),
'xml' => array(
- 'nok' => 'Cannot find the required library to parse XML.', //TODO - Translation
- 'ok' => 'You have the required library to parse XML.', //TODO - Translation
+ 'nok' => 'Cannot find the required library to parse XML.', // TODO - Translation
+ 'ok' => 'You have the required library to parse XML.', // TODO - Translation
),
+ '_' => 'בדיקות',
),
'conf' => array(
- '_' => 'הגדרות כלליות',
'ok' => 'ההגדרות הכלליות נשמרו.',
+ '_' => 'הגדרות כלליות',
),
'congratulations' => 'מזל טוב!',
'default_user' => 'שם המשתמש של משתמש ברירת המחדל <small>(לכל היותר 16 תווים אלפאנומריים)</small>',
@@ -107,17 +107,17 @@ return array(
'fix_errors_before' => 'יש לתקן את השגיאות לפני המעבר לשלב הבא.',
'javascript_is_better' => 'FreshRSS מעדיף שתאפשרו JavaScript',
'js' => array(
- 'confirm_reinstall' => 'You will lose your previous configuration by reinstalling FreshRSS. Are you sure you want to continue?', //TODO - Translation
+ 'confirm_reinstall' => 'You will lose your previous configuration by reinstalling FreshRSS. Are you sure you want to continue?', // TODO - Translation
),
'language' => array(
- '_' => 'שפה',
'choose' => 'בחירת שפה ל FreshRSS',
'defined' => 'השפה הוגדרה.',
+ '_' => 'שפה',
),
'not_deleted' => 'משהו נכשל; יש צורך למחוק את הקובץ <em>%s</em> ידנית.',
- 'ok' => 'The installation process was successful.', //TODO - Translation
- 'step' => 'step %d', //TODO - Translation
+ 'ok' => 'The installation process was successful.', // TODO - Translation
+ 'step' => 'step %d', // TODO - Translation
'steps' => 'שלבים',
- 'title' => 'התקנה · FreshRSS',
'this_is_the_end' => 'סיום',
+ 'title' => 'התקנה · FreshRSS',
);
diff --git a/app/i18n/he/sub.php b/app/i18n/he/sub.php
index 3fd0f267a..3d60ca246 100644
--- a/app/i18n/he/sub.php
+++ b/app/i18n/he/sub.php
@@ -2,24 +2,24 @@
return array(
'api' => array(
- 'documentation' => 'Copy the following URL to use it within an external tool.', //TODO - Translation
- 'title' => 'API', //TODO - Translation
+ 'documentation' => 'Copy the following URL to use it within an external tool.', // TODO - Translation
+ 'title' => 'API', // TODO - Translation
),
'bookmarklet' => array(
- 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', //TODO - Translation
- 'label' => 'Subscribe', //TODO - Translation
- 'title' => 'Bookmarklet', //TODO - Translation
+ 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', // TODO - Translation
+ 'label' => 'Subscribe', // TODO - Translation
+ 'title' => 'Bookmarklet', // TODO - Translation
),
'category' => array(
- '_' => 'קטגוריה',
'add' => 'הוספת קטגוריה',
'archiving' => 'ארכוב',
- 'empty' => 'Empty category', //TODO - Translation
+ 'empty' => 'Empty category', // TODO - Translation
'information' => 'מידע',
'new' => 'קטגוריה חדשה',
- 'position' => 'Display position', //TODO - Translation
- 'position_help' => 'To control category sort order', //TODO - Translation
+ 'position' => 'Display position', // TODO - Translation
+ 'position_help' => 'To control category sort order', // TODO - Translation
'title' => 'כותרת',
+ '_' => 'קטגוריה',
),
'feed' => array(
'add' => 'הוספת הזנה',
@@ -32,57 +32,57 @@ return array(
'password' => 'HTTP סיסמה',
'username' => 'HTTP שם משתמש',
),
- 'clear_cache' => 'Always clear cache', //TODO - Translation
- 'css_help' => 'קבלת הזנות RSS קטומות (זהירות, לוקח זמן רב יותר!)',
+ 'clear_cache' => 'Always clear cache', // TODO - Translation
+ 'css_help' => 'קבלת הזנות RSS קטומות (זהירות, לוקח זמן רב יותר!)',
'css_path' => 'נתיב הCSS של המאמר באתר המקורי',
'description' => 'תיאור',
'empty' => 'הזנה זו ריקה. אנא ודאו שהיא עדיין מתוחזקת.',
'error' => 'הזנה זו נתקלה בשגיאה, אנא ודאו שהיא תקינה ואז נסו שנית.',
'filteractions' => array(
- '_' => 'Filter actions', //TODO - Translation
- 'help' => 'Write one search filter per line.', //TODO - Translation
+ 'help' => 'Write one search filter per line.', // TODO - Translation
+ '_' => 'Filter actions', // TODO - Translation
),
'information' => 'מידע',
'keep_min' => 'מסםר מינימלי של מאמרים לשמור',
- 'moved_category_deleted' => 'כאשר הקטגוריה נמחקת ההזנות שבתוכה אוטומטית מקוטלגות תחת <em>%s</em>.',
- 'mute' => 'mute', //TODO - Translation
+ 'moved_category_deleted' => 'כאשר הקטגוריה נמחקת ההזנות שבתוכה אוטומטית מקוטלגות תחת <em>%s</em>.',
+ 'mute' => 'mute', // TODO - Translation
'no_selected' => 'אף הזנה לא נבחרה.',
'number_entries' => '%d מאמרים',
'priority' => array(
- '_' => 'Visibility', //TODO - Translation
- 'archived' => 'Do not show (archived)', //TODO - Translation
+ 'archived' => 'Do not show (archived)', // TODO - Translation
'main_stream' => 'הצגה בזרם המרכזי',
- 'normal' => 'Show in its category', //TODO - Translation
+ 'normal' => 'Show in its category', // TODO - Translation
+ '_' => 'Visibility', // TODO - Translation
),
- 'websub' => 'Instant notification with WebSub', //TODO - Translation
'show' => array(
- 'all' => 'Show all feeds', //TODO - Translation
- 'error' => 'Show only feeds with error', //TODO - Translation
+ 'all' => 'Show all feeds', // TODO - Translation
+ 'error' => 'Show only feeds with error', // TODO - Translation
),
'showing' => array(
- 'error' => 'Showing only feeds with error', //TODO - Translation
+ 'error' => 'Showing only feeds with error', // TODO - Translation
),
- 'ssl_verify' => 'Verify SSL security', //TODO - Translation
+ 'ssl_verify' => 'Verify SSL security', // TODO - Translation
'stats' => 'סטטיסטיקות',
'think_to_add' => 'ניתן להוסיף הזנות חדשות.',
- 'timeout' => 'Timeout in seconds', //TODO - Translation
+ 'timeout' => 'Timeout in seconds', // TODO - Translation
'title' => 'כותרת',
'title_add' => 'הוספת הזנה',
'ttl' => 'אין לרענן אוטומטית יותר מ',
'url' => 'הזנה URL',
'validator' => 'בדיקות תקינות ההזנה',
'website' => 'אתר URL',
+ 'websub' => 'Instant notification with WebSub', // TODO - Translation
),
'firefox' => array(
- 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.', //TODO - Translation
- 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', //TODO - Translation
- 'title' => 'Firefox feed reader', //TODO - Translation
+ 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.', // TODO - Translation
+ 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', // TODO - Translation
+ 'title' => 'Firefox feed reader', // TODO - Translation
),
'import_export' => array(
'export' => 'ייצוא',
+ 'export_labelled' => 'Export your labelled articles', // TODO - Translation
'export_opml' => 'ייצוא רשימת הזנות (OPML)',
'export_starred' => 'ייצוא מועדפים',
- 'export_labelled' => 'Export your labelled articles', //TODO
'feed_list' => 'רשימה של %s מאמרים',
'file_to_import' => 'קובץ לייבוא<br />(OPML, Json or Zip)',
'file_to_import_no_zip' => 'קובץ לייבוא<br />(OPML or Json)',
@@ -94,11 +94,11 @@ return array(
'bookmark' => 'הרשמה (FreshRSS סימניית)',
'import_export' => 'יבוא / יצוא ',
'subscription_management' => 'ניהול הרשמות',
- 'subscription_tools' => 'Subscription tools', //TODO - Translation
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
),
'title' => array(
- '_' => 'ניהול הרשמות',
'feed_management' => 'ניהול הזנות RSS',
- 'subscription_tools' => 'Subscription tools', //TODO - Translation
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
+ '_' => 'ניהול הרשמות',
),
);
diff --git a/app/i18n/he/user.php b/app/i18n/he/user.php
index 3a8343c11..52197ad46 100644
--- a/app/i18n/he/user.php
+++ b/app/i18n/he/user.php
@@ -3,35 +3,35 @@
return array(
'email' => array(
'feedback' => array(
- 'invalid' => 'The email address is invalid.', //TODO - Translation
- 'required' => 'The email address is required.', //TODO - Translation
+ 'invalid' => 'The email address is invalid.', // TODO - Translation
+ 'required' => 'The email address is required.', // TODO - Translation
),
'validation' => array(
- 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', //TODO - Translation
- 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', //TODO - Translation
+ 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', // TODO - Translation
+ 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', // TODO - Translation
'feedback' => array(
- 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', //TODO - Translation
- 'email_sent' => 'An email has been sent to your address.', //TODO - Translation
- 'error' => 'The email address failed to be validated.', //TODO - Translation
- 'ok' => 'The email address has been validated.', //TODO - Translation
- 'unneccessary' => 'The email address was already validated.', //TODO - Translation
- 'wrong_token' => 'The email address failed to be validated due to a wrong token.', //TODO - Translation
+ 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', // TODO - Translation
+ 'email_sent' => 'An email has been sent to your address.', // TODO - Translation
+ 'error' => 'The email address failed to be validated.', // TODO - Translation
+ 'ok' => 'The email address has been validated.', // TODO - Translation
+ 'unneccessary' => 'The email address was already validated.', // TODO - Translation
+ 'wrong_token' => 'The email address failed to be validated due to a wrong token.', // TODO - Translation
),
- 'need_to' => 'You need to validate your email address before being able to use %s.', //TODO - Translation
- 'resend_email' => 'Resend the email', //TODO - Translation
- 'title' => 'Email address validation', //TODO - Translation
- ),
- ),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
+ 'need_to' => 'You need to validate your email address before being able to use %s.', // TODO - Translation
+ 'resend_email' => 'Resend the email', // TODO - Translation
+ 'title' => 'Email address validation', // TODO - Translation
),
),
'mailer' => array(
'email_need_validation' => array(
- 'title' => 'You need to validate your account', //TODO - Translation
- 'welcome' => 'Welcome %s,', //TODO - Translation
- 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', //TODO - Translation
+ 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', // TODO - Translation
+ 'title' => 'You need to validate your account', // TODO - Translation
+ 'welcome' => 'Welcome %s,', // TODO - Translation
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
),
),
);
diff --git a/app/i18n/it/admin.php b/app/i18n/it/admin.php
index 8bb6c7bfe..7a0f2e47e 100644
--- a/app/i18n/it/admin.php
+++ b/app/i18n/it/admin.php
@@ -67,8 +67,8 @@ return array(
'ok' => 'Estensione JSON presente.',
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
'nok' => 'Manca il framework Minz.',
@@ -83,9 +83,9 @@ return array(
'ok' => 'PDO e altri driver supportati (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'Installazione PHP',
'nok' => 'Versione PHP %s FreshRSS richiede almeno la versione %s.',
'ok' => 'Versione PHP %s, compatibile con FreshRSS.',
+ '_' => 'Installazione PHP',
),
'tables' => array(
'nok' => 'Rilevate tabelle mancanti nel database.',
@@ -106,26 +106,25 @@ return array(
),
),
'extensions' => array(
- 'author' => 'Author', //TODO - Translation
- 'community' => 'Available community extensions', //TODO - Translation
- 'description' => 'Description', //TODO - Translation
+ 'author' => 'Author', // TODO - Translation
+ 'community' => 'Available community extensions', // TODO - Translation
+ 'description' => 'Description', // TODO - Translation
'disabled' => 'Disabilitata',
'empty_list' => 'Non ci sono estensioni installate',
'enabled' => 'Abilitata',
- 'latest' => 'Installed', //TODO - Translation
- 'name' => 'Name', //TODO - Translation
+ 'latest' => 'Installed', // TODO - Translation
+ 'name' => 'Name', // TODO - Translation
'no_configure_view' => 'Questa estensioni non può essere configurata.',
'system' => array(
- '_' => 'Estensioni di sistema',
'no_rights' => 'Estensione di sistema (non hai i permessi su questo tipo)',
+ '_' => 'Estensioni di sistema',
),
'title' => 'Estensioni',
- 'update' => 'Update available', //TODO - Translation
+ 'update' => 'Update available', // TODO - Translation
'user' => 'Estensioni utente',
- 'version' => 'Version', //TODO - Translation
+ 'version' => 'Version', // TODO - Translation
),
'stats' => array(
- '_' => 'Statistiche',
'all_feeds' => 'Tutti i feeds',
'category' => 'Categoria',
'entry_count' => 'Articoli',
@@ -135,7 +134,7 @@ return array(
'entry_per_hour' => 'Per ora (media: %.2f articoli)',
'entry_per_month' => 'Per mese (media: %.2f articoli)',
'entry_repartition' => 'Ripartizione contenuti',
- 'feed' => 'Feed',
+ 'feed' => 'Feed', // TODO - Translation
'feed_per_category' => 'Feeds per categoria',
'idle' => 'Feeds non aggiornati',
'main' => 'Statistiche principali',
@@ -155,46 +154,53 @@ return array(
'status_unread' => 'Non letti',
'title' => 'Statistiche',
'top_feed' => 'I migliori 10 feeds',
+ '_' => 'Statistiche',
),
'system' => array(
- '_' => 'Configurazione di sistema',
- 'auto-update-url' => 'Auto-update server URL', //TODO - Translation
- 'force_email_validation' => 'Force email addresses validation', //TODO - Translation
+ 'auto-update-url' => 'Auto-update server URL', // TODO - Translation
+ 'cookie-duration' => array(
+ 'help' => 'in seconds', // TODO - Translation
+ 'number' => 'Duration to keep logged in', // TODO - Translation
+ ),
+ 'force_email_validation' => 'Force email addresses validation', // TODO - Translation
'instance-name' => 'Nome istanza',
'max-categories' => 'Limite categorie per utente',
'max-feeds' => 'Limite feeds per utente',
- 'cookie-duration' => array(
- 'help' => 'in seconds', // @todo translate
- 'number' => 'Duration to keep logged in', // @todo translate
- ),
'registration' => array(
'help' => '0 significa che non esiste limite sui profili',
'number' => 'Numero massimo di profili',
),
+ '_' => 'Configurazione di sistema',
),
'update' => array(
- '_' => 'Aggiornamento sistema',
'apply' => 'Applica',
'check' => 'Controlla la presenza di nuovi aggiornamenti',
'current_version' => 'FreshRSS versione %s.',
'last' => 'Ultima verifica: %s',
'none' => 'Nessun aggiornamento da applicare',
'title' => 'Aggiorna sistema',
+ '_' => 'Aggiornamento sistema',
),
'user' => array(
'articles_and_size' => '%s articoli (%s)',
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => 'Crea nuovo utente',
- 'delete_users' => 'Delete user', //TODO - Translation
+ 'database_size' => 'Database size', // TODO - Translation
+ 'delete_users' => 'Delete user', // TODO - Translation
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => 'Lingua',
+ 'list' => 'User list', // TODO - Translation
'number' => ' %d profilo utente creato',
'numbers' => 'Sono presenti %d profili utente',
'password_form' => 'Password<br /><small>(per il login classico)</small>',
'password_format' => 'Almeno 7 caratteri',
- 'selected' => 'Selected user', //TODO - Translation
+ 'selected' => 'Selected user', // TODO - Translation
'title' => 'Gestione utenti',
- 'update_users' => 'Update user', //TODO - Translation
- 'user_list' => 'Lista utenti',
+ 'update_users' => 'Update user', // TODO - Translation
'username' => 'Nome utente',
'users' => 'Utenti',
+ 'user_list' => 'Lista utenti',
),
);
diff --git a/app/i18n/it/conf.php b/app/i18n/it/conf.php
index 4bdaad33d..8e67dd68d 100644
--- a/app/i18n/it/conf.php
+++ b/app/i18n/it/conf.php
@@ -2,34 +2,33 @@
return array(
'archiving' => array(
- '_' => 'Archiviazione',
'delete_after' => 'Rimuovi articoli dopo',
- 'exception' => 'Purge exception', //TODO - Translation
+ 'exception' => 'Purge exception', // TODO - Translation
'help' => 'Altre opzioni sono disponibili nelle impostazioni dei singoli feed',
- 'keep_favourites' => 'Never delete favourites', //TODO - Translation
+ 'keep_favourites' => 'Never delete favourites', // TODO - Translation
+ 'keep_labels' => 'Never delete labels', // TODO - Translation
+ 'keep_max' => 'Maximum number of articles to keep', // TODO - Translation
'keep_min_by_feed' => 'Numero minimo di articoli da mantenere per feed',
- 'keep_labels' => 'Never delete labels', //TODO - Translation
- 'keep_unreads' => 'Never delete unreads', //TODO - Translation
- 'maintenance' => 'Maintenance', //TODO - Translation
+ 'keep_period' => 'Maximum age of articles to keep', // TODO - Translation
+ 'keep_unreads' => 'Never delete unreads', // TODO - Translation
+ 'maintenance' => 'Maintenance', // TODO - Translation
'optimize' => 'Ottimizza database',
'optimize_help' => 'Da fare occasionalmente per ridurre le dimensioni del database',
- 'policy' => 'Purge policy', //TODO - Translation
- 'policy_warning' => 'If no purge policy is selected, every article will be kept.', //TODO - Translation
+ 'policy' => 'Purge policy', // TODO - Translation
+ 'policy_warning' => 'If no purge policy is selected, every article will be kept.', // TODO - Translation
'purge_now' => 'Cancella ora',
- 'keep_max' => 'Maximum number of articles to keep', //TODO - Translation
- 'keep_period' => 'Maximum age of articles to keep', //TODO - Translation
'title' => 'Archiviazione',
'ttl' => 'Non effettuare aggiornamenti per più di',
+ '_' => 'Archiviazione',
),
'display' => array(
- '_' => 'Visualizzazione',
'icon' => array(
'bottom_line' => 'Barra in fondo',
+ 'display_authors' => 'Authors', // TODO - Translation
'entry' => 'Icone degli articoli',
'publication_date' => 'Data di pubblicazione',
- 'related_tags' => 'Tags correlati', //TODO - Translation
+ 'related_tags' => 'Tags correlati',
'sharing' => 'Condivisione',
- 'display_authors' => 'Authors', //TODO - Translation
'top_line' => 'Barra in alto',
),
'language' => 'Lingua',
@@ -37,7 +36,7 @@ return array(
'seconds' => 'secondi (0 significa nessun timeout)',
'timeout' => 'Notifica timeout HTML5',
),
- 'show_nav_buttons' => 'Show the navigation buttons', //TODO - Translation
+ 'show_nav_buttons' => 'Show the navigation buttons', // TODO - Translation
'theme' => 'Tema',
'title' => 'Visualizzazione',
'width' => array(
@@ -47,34 +46,35 @@ return array(
'no_limit' => 'Nessun limite',
'thin' => 'Stretto',
),
+ '_' => 'Visualizzazione',
),
'profile' => array(
- '_' => 'Gestione profili',
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => 'Cancellazione account',
'warn' => 'Il tuo account e tutti i dati associati saranno cancellati.',
+ '_' => 'Cancellazione account',
),
'email' => 'Indirizzo email',
'password_api' => 'Password API<br /><small>(e.g., per applicazioni mobili)</small>',
'password_form' => 'Password<br /><small>(per il login classico)</small>',
'password_format' => 'Almeno 7 caratteri',
'title' => 'Profilo',
+ '_' => 'Gestione profili',
),
'query' => array(
- '_' => 'Ricerche personali',
'deprecated' => 'Questa query non è più valida. La categoria o il feed di riferimento non stati cancellati.',
- 'display' => 'Display user query results', //TODO - Translation
+ 'display' => 'Display user query results', // TODO - Translation
'filter' => 'Filtro applicato:',
'get_all' => 'Mostra tutti gli articoli',
'get_category' => 'Mostra la categoria "%s" ',
'get_favorite' => 'Mostra articoli preferiti',
'get_feed' => 'Mostra feed "%s" ',
- 'no_filter' => 'Nessun filtro',
'none' => 'Non hai creato nessuna ricerca personale.',
+ 'no_filter' => 'Nessun filtro',
'number' => 'Ricerca n°%d',
'order_asc' => 'Mostra prima gli articoli più vecchi',
'order_desc' => 'Mostra prima gli articoli più nuovi',
- 'remove' => 'Remove user query', //TODO - Translation
+ 'remove' => 'Remove user query', // TODO - Translation
'search' => 'Cerca per "%s"',
'state_0' => 'Mostra tutti gli articoli',
'state_1' => 'Mostra gli articoli letti',
@@ -93,9 +93,9 @@ return array(
'state_14' => 'Mostra gli articoli non letti',
'state_15' => 'Mostra tutti gli articoli',
'title' => 'Ricerche personali',
+ '_' => 'Ricerche personali',
),
'reading' => array(
- '_' => 'Lettura',
'after_onread' => 'Dopo “segna tutto come letto”,',
'articles_per_page' => 'Numero di articoli per pagina',
'auto_load_more' => 'Carica articoli successivi a fondo pagina',
@@ -116,16 +116,16 @@ return array(
'when' => 'Segna articoli come letti…',
),
'show' => array(
- '_' => 'Articoli da visualizzare',
'adaptive' => 'Adatta visualizzazione',
'all_articles' => 'Mostra tutti gli articoli',
'unread' => 'Mostra solo non letti',
+ '_' => 'Articoli da visualizzare',
),
- 'sides_close_article' => 'Clicking outside of article text area closes the article', //TODO - Translation
+ 'sides_close_article' => 'Clicking outside of article text area closes the article', // TODO - Translation
'sort' => array(
- '_' => 'Ordinamento',
'newer_first' => 'Prima i più recenti',
'older_first' => 'Prima i più vecchi',
+ '_' => 'Ordinamento',
),
'sticky_post' => 'Blocca il contenuto a inizio pagina quando aperto',
'title' => 'Lettura',
@@ -135,26 +135,26 @@ return array(
'normal' => 'Vista elenco',
'reader' => 'Modalità di lettura',
),
+ '_' => 'Lettura',
),
'sharing' => array(
- '_' => 'Condivisione',
- 'add' => 'Add a sharing method', //TODO - Translation
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
- 'email' => 'Email',
- 'facebook' => 'Facebook',
+ 'add' => 'Add a sharing method', // TODO - Translation
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
+ 'email' => 'Email', // TODO - Translation
+ 'facebook' => 'Facebook', // TODO - Translation
'more_information' => 'Ulteriori informazioni',
'print' => 'Stampa',
- 'remove' => 'Remove sharing method', //TODO - Translation
- 'shaarli' => 'Shaarli',
+ 'remove' => 'Remove sharing method', // TODO - Translation
+ 'shaarli' => 'Shaarli', // TODO - Translation
'share_name' => 'Nome condivisione',
'share_url' => 'URL condivisione',
'title' => 'Condividi',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag', // TODO - Translation
+ '_' => 'Condivisione',
),
'shortcut' => array(
- '_' => 'Comandi tastiera',
'article_action' => 'Azioni sugli articoli',
'auto_share' => 'Condividi',
'auto_share_help' => 'Se è presente un solo servizio di condivisione verrà usato quello, altrimenti usare anche il numero associato.',
@@ -162,7 +162,7 @@ return array(
'collapse_article' => 'Collassa articoli',
'first_article' => 'Salta al primo articolo',
'focus_search' => 'Modulo di ricerca',
- 'global_view' => 'Switch to global view', //TODO - Translation
+ 'global_view' => 'Switch to global view', // TODO - Translation
'help' => 'Mostra documentazione',
'javascript' => 'JavaScript deve essere abilitato per poter usare i comandi da tastiera',
'last_article' => 'Salta all ultimo articolo',
@@ -171,21 +171,22 @@ return array(
'mark_read' => 'Segna come letto',
'navigation' => 'Navigazione',
'navigation_help' => 'Con il tasto "Shift" i comandi di navigazione verranno applicati ai feeds.<br/>Con il tasto "Alt" i comandi di navigazione verranno applicati alle categorie.',
- 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', //TODO - Translation
+ 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', // TODO - Translation
'next_article' => 'Salta al contenuto successivo',
- 'normal_view' => 'Switch to normal view', // TODO
+ 'normal_view' => 'Switch to normal view', // TODO - Translation
'other_action' => 'Altre azioni',
'previous_article' => 'Salta al contenuto precedente',
- 'reading_view' => 'Switch to reading view', //TODO - Translation
- 'rss_view' => 'Open RSS view in a new tab', //TODO - Translation
+ 'reading_view' => 'Switch to reading view', // TODO - Translation
+ 'rss_view' => 'Open RSS view in a new tab', // TODO - Translation
'see_on_website' => 'Vai al sito fonte',
'shift_for_all_read' => '+ <code>shift</code> per segnare tutti gli articoli come letti',
- 'skip_next_article' => 'Focus next without opening', //TODO - Translation
- 'skip_previous_article' => 'Focus previous without opening', //TODO - Translation
+ 'skip_next_article' => 'Focus next without opening', // TODO - Translation
+ 'skip_previous_article' => 'Focus previous without opening', // TODO - Translation
'title' => 'Comandi da tastiera',
'user_filter' => 'Accedi alle ricerche personali',
'user_filter_help' => 'Se è presente una sola ricerca personale verrà usata quella, altrimenti usare anche il numero associato.',
- 'views' => 'Views', //TODO - Translation
+ 'views' => 'Views', // TODO - Translation
+ '_' => 'Comandi tastiera',
),
'user' => array(
'articles_and_size' => '%s articoli (%s)',
diff --git a/app/i18n/it/feedback.php b/app/i18n/it/feedback.php
index ca7879904..26cd9bf6a 100644
--- a/app/i18n/it/feedback.php
+++ b/app/i18n/it/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => 'Ottimizzazione completata',
- ),
'access' => array(
'denied' => 'Non hai i permessi per accedere a questa pagina',
'not_found' => 'Pagina non disponibile',
),
+ 'admin' => array(
+ 'optimization_complete' => 'Ottimizzazione completata',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => 'Si è verificato un problema alla configurazione del sistema di autenticazione. Per favore riprova più tardi.',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s non può essere abilitata. <a href="%s">Verifica i logs</a> per dettagli.',
'ok' => '%s è ora abilitata',
),
- 'no_access' => 'Accesso negato a %s',
'not_enabled' => '%s non abilitato',
'not_found' => '%s non disponibile',
+ 'no_access' => 'Accesso negato a %s',
),
'import_export' => array(
'export_no_zip_extension' => 'Estensione ZIP non presente sul server. Per favore esporta i files singolarmente.',
@@ -57,8 +63,8 @@ return array(
'sub' => array(
'actualize' => 'Aggiorna',
'articles' => array(
- 'marked_read' => 'The selected articles have been marked as read.', //TODO - Translation
- 'marked_unread' => 'The articles have been marked as unread.', //TODO - Translation
+ 'marked_read' => 'The selected articles have been marked as read.', // TODO - Translation
+ 'marked_unread' => 'The articles have been marked as unread.', // TODO - Translation
),
'category' => array(
'created' => 'Categoria %s creata.',
@@ -66,10 +72,10 @@ return array(
'emptied' => 'Categoria svuotata',
'error' => 'Categoria non aggiornata',
'name_exists' => 'Categoria già esistente.',
- 'no_id' => 'Categoria senza ID.',
- 'no_name' => 'Il nome della categoria non può essere lasciato vuoto.',
'not_delete_default' => 'Non puoi cancellare la categoria predefinita!',
'not_exist' => 'La categoria non esite!',
+ 'no_id' => 'Categoria senza ID.',
+ 'no_name' => 'Il nome della categoria non può essere lasciato vuoto.',
'over_max' => 'Hai raggiunto il numero limite di categorie (%d)',
'updated' => 'Categoria aggiornata.',
),
@@ -80,12 +86,12 @@ return array(
'already_subscribed' => 'Hai già sottoscritto <em>%s</em>',
'deleted' => 'Feed cancellato',
'error' => 'Feed non aggiornato',
- 'internal_problem' => 'RSS feed non aggiunto. <a href="%s">Verifica i logs</a> per dettagli.', //TODO - Translation
+ 'internal_problem' => 'RSS feed non aggiunto. <a href="%s">Verifica i logs</a> per dettagli.',
'invalid_url' => 'URL <em>%s</em> non valido',
+ 'not_added' => '<em>%s</em> non può essere aggiunto',
+ 'no_refresh' => 'Nessun aggiornamento disponibile…',
'n_actualized' => '%d feeds aggiornati',
'n_entries_deleted' => '%d articoli cancellati',
- 'no_refresh' => 'Nessun aggiornamento disponibile…',
- 'not_added' => '<em>%s</em> non può essere aggiunto',
'over_max' => 'Hai raggiunto il numero limite di feed (%d)',
'updated' => 'Feed aggiornato',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => 'Utente %s creato',
'error' => 'Errore nella creazione utente %s ',
+ '_' => 'Utente %s creato',
),
'deleted' => array(
- '_' => 'Utente %s cancellato',
'error' => 'Utente %s non cancellato',
+ '_' => 'Utente %s cancellato',
),
'updated' => array(
- '_' => 'User %s has been updated', //TODO - Translation
- 'error' => 'User %s has not been updated', //TODO - Translation
+ 'error' => 'User %s has not been updated', // TODO - Translation
+ '_' => 'User %s has been updated', // TODO - Translation
),
),
);
diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php
index 50d4b4e6c..de670e44d 100644
--- a/app/i18n/it/gen.php
+++ b/app/i18n/it/gen.php
@@ -3,7 +3,7 @@
return array(
'action' => array(
'actualize' => 'Aggiorna',
- 'back' => '← Go back', //TODO - Translation
+ 'back' => '← Go back', // TODO - Translation
'back_to_rss_feeds' => '← Indietro',
'cancel' => 'Annulla',
'create' => 'Crea',
@@ -16,32 +16,33 @@ return array(
'manage' => 'Gestisci',
'mark_favorite' => 'Segna come preferito',
'mark_read' => 'Segna come letto',
+ 'purge' => 'Purge', // TODO - Translation
'remove' => 'Rimuovi',
'see_website' => 'Vai al sito',
'submit' => 'Conferma',
'truncate' => 'Cancella tutti gli articoli',
- 'update' => 'Update', // TODO
+ 'update' => 'Update', // TODO - Translation
),
'auth' => array(
- 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
+ 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
'email' => 'Indirizzo email',
'keep_logged_in' => 'Ricorda i dati <small>(%s giorni)</small>',
'login' => 'Accedi',
'logout' => 'Esci',
'password' => array(
- '_' => 'Password',
'format' => '<small>almeno 7 caratteri</small>',
+ '_' => 'Password', // TODO - Translation
),
'registration' => array(
- '_' => 'Nuovo profilo',
'ask' => 'Vuoi creare un nuovo profilo?',
'title' => 'Creazione profilo',
+ '_' => 'Nuovo profilo',
),
'reset' => 'Reset autenticazione',
'username' => array(
- '_' => 'Username',
'admin' => 'Username amministratore',
'format' => '<small>massimo 16 caratteri alfanumerici</small>',
+ '_' => 'Username', // TODO - Translation
),
),
'date' => array(
@@ -60,12 +61,12 @@ return array(
'february' => 'febbraio',
'format_date' => 'j\\ %s Y',
'format_date_hour' => 'j\\ %s Y \\o\\r\\e H\\:i',
- 'fri' => 'Fri',
+ 'fri' => 'Fri', // TODO - Translation
'Jan' => '\\G\\e\\n\\u\\a\\i\\o',
'jan' => 'genn.',
'january' => 'gennaio',
- 'Jul' => '\\L\\u\\g\\l\\i\\o',
'jul' => 'jul',
+ 'Jul' => '\\L\\u\\g\\l\\i\\o',
'july' => 'luglio',
'Jun' => '\\G\\i\\u\\g\\n\\o',
'jun' => 'jun',
@@ -75,13 +76,13 @@ return array(
'last_month' => 'Ultimo mese',
'last_week' => 'Ultima settimana',
'last_year' => 'Ultimo anno',
- 'Mar' => '\\M\\a\\r\\z\\o',
'mar' => 'mar.',
+ 'Mar' => '\\M\\a\\r\\z\\o',
'march' => 'marzo',
'May' => '\\M\\a\\g\\g\\i\\o',
'may' => 'maggio',
- 'may_' => 'May',
- 'mon' => 'Mon',
+ 'may_' => 'May', // TODO - Translation
+ 'mon' => 'Mon', // TODO - Translation
'month' => 'mesi',
'Nov' => '\\N\\o\\v\\e\\m\\b\\r\\e',
'nov' => 'nov.',
@@ -89,20 +90,20 @@ return array(
'Oct' => '\\O\\t\\t\\o\\b\\r\\e',
'oct' => 'ott.',
'october' => 'ottobre',
- 'sat' => 'Sat',
+ 'sat' => 'Sat', // TODO - Translation
'Sep' => '\\S\\e\\t\\t\\e\\m\\b\\r\\e',
'sep' => 'sett.',
'september' => 'settembre',
- 'sun' => 'Sun',
- 'thu' => 'Thu',
+ 'sun' => 'Sun', // TODO - Translation
+ 'thu' => 'Thu', // TODO - Translation
'today' => 'Oggi',
- 'tue' => 'Tue',
- 'wed' => 'Wed',
+ 'tue' => 'Tue', // TODO - Translation
+ 'wed' => 'Wed', // TODO - Translation
'yesterday' => 'Ieri',
),
'freshrss' => array(
- '_' => 'Feed RSS Reader',
'about' => 'Informazioni',
+ '_' => 'Feed RSS Reader',
),
'js' => array(
'category_empty' => 'Categoria vuota',
@@ -117,20 +118,21 @@ return array(
'should_be_activated' => 'JavaScript deve essere abilitato',
),
'lang' => array(
- 'cz' => 'Čeština',
- 'de' => 'Deutsch',
- 'en' => 'English',
- 'es' => 'Español',
- 'fr' => 'Français',
- 'he' => 'עברית',
- 'it' => 'Italiano',
- 'kr' => '한국어',
- 'nl' => 'Nederlands',
- 'oc' => 'Occitan',
- 'pt-br' => 'Português (Brasil)',
- 'ru' => 'Русский',
- 'tr' => 'Türkçe',
- 'zh-cn' => '简体中文',
+ 'cz' => 'Čeština', // TODO - Translation
+ 'de' => 'Deutsch', // TODO - Translation
+ 'en' => 'English', // TODO - Translation
+ 'es' => 'Español', // TODO - Translation
+ 'fr' => 'Français', // TODO - Translation
+ 'he' => 'עברית', // TODO - Translation
+ 'it' => 'Italiano', // TODO - Translation
+ 'kr' => '한국어', // TODO - Translation
+ 'nl' => 'Nederlands', // TODO - Translation
+ 'oc' => 'Occitan', // TODO - Translation
+ 'pt-br' => 'Português (Brasil)', // TODO - Translation
+ 'ru' => 'Русский', // TODO - Translation
+ 'sk' => 'Slovenčina', // TODO - Translation
+ 'tr' => 'Türkçe', // TODO - Translation
+ 'zh-cn' => '简体中文', // TODO - Translation
),
'menu' => array(
'about' => 'Informazioni',
@@ -141,7 +143,7 @@ return array(
'configuration' => 'Configurazione',
'display' => 'Visualizzazione',
'extensions' => 'Estensioni',
- 'logs' => 'Logs',
+ 'logs' => 'Logs', // TODO - Translation
'queries' => 'Ricerche personali',
'reading' => 'Lettura',
'search' => 'Ricerca parole o #tags',
@@ -163,31 +165,31 @@ return array(
'previous' => 'Precedente',
),
'period' => array(
- 'days' => 'days', //TODO - Translation
- 'hours' => 'hours', //TODO - Translation
- 'months' => 'months', //TODO - Translation
- 'weeks' => 'weeks', //TODO - Translation
- 'years' => 'years', //TODO - Translation
+ 'days' => 'days', // TODO - Translation
+ 'hours' => 'hours', // TODO - Translation
+ 'months' => 'months', // TODO - Translation
+ 'weeks' => 'weeks', // TODO - Translation
+ 'years' => 'years', // TODO - Translation
),
'share' => array(
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
- 'email' => 'Email',
- 'facebook' => 'Facebook',
- 'gnusocial' => 'GNU social',
- 'jdh' => 'Journal du hacker',
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
+ 'email' => 'Email', // TODO - Translation
+ 'facebook' => 'Facebook', // TODO - Translation
+ 'gnusocial' => 'GNU social', // TODO - Translation
+ 'jdh' => 'Journal du hacker', // TODO - Translation
'Known' => 'Siti basati su Known',
- 'lemmy' => 'Lemmy',
- 'linkedin' => 'LinkedIn',
- 'mastodon' => 'Mastodon',
- 'movim' => 'Movim',
- 'pinboard' => 'Pinboard',
- 'pocket' => 'Pocket',
+ 'lemmy' => 'Lemmy', // TODO - Translation
+ 'linkedin' => 'LinkedIn', // TODO - Translation
+ 'mastodon' => 'Mastodon', // TODO - Translation
+ 'movim' => 'Movim', // TODO - Translation
+ 'pinboard' => 'Pinboard', // TODO - Translation
+ 'pocket' => 'Pocket', // TODO - Translation
'print' => 'Stampa',
- 'shaarli' => 'Shaarli',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag v1',
- 'wallabagv2' => 'wallabag v2',
+ 'shaarli' => 'Shaarli', // TODO - Translation
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag v1', // TODO - Translation
+ 'wallabagv2' => 'wallabag v2', // TODO - Translation
),
'short' => array(
'attention' => 'Attenzione!',
@@ -196,7 +198,7 @@ return array(
'by_default' => 'predefinito',
'damn' => 'Ops!',
'default_category' => 'Senza categoria',
- 'no' => 'No',
+ 'no' => 'No', // TODO - Translation
'not_applicable' => 'Non disponibile',
'ok' => 'OK!',
'or' => 'o',
diff --git a/app/i18n/it/index.php b/app/i18n/it/index.php
index 16c695a12..ec9f8546f 100644
--- a/app/i18n/it/index.php
+++ b/app/i18n/it/index.php
@@ -2,8 +2,7 @@
return array(
'about' => array(
- '_' => 'Informazioni',
- 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', // TODO - Translation
'bugs_reports' => 'Bugs',
'credits' => 'Crediti',
'credits_content' => 'Alcuni elementi di design provengono da <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> sebbene FreshRSS non usi questo framework. Le <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">icone</a> provengono dal progetto <a href="https://www.gnome.org/">GNOME</a>. Il carattere <em>Open Sans</em> è stato creato da <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a>. FreshRSS è basato su <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, un framework PHP.',
@@ -14,23 +13,21 @@ return array(
'title' => 'Informazioni',
'version' => 'Versione',
'website' => 'Sito',
- ),
- 'tos' => array(
- 'title' => 'Terms of Service', // TODO - Translation
+ '_' => 'Informazioni',
),
'feed' => array(
'add' => 'Aggiungi un Feed RSS',
'empty' => 'Non ci sono articoli da mostrare.',
'rss_of' => 'RSS feed di %s',
'title' => 'RSS feeds',
- 'title_global' => 'Vista globale per categorie',
'title_fav' => 'Preferiti',
+ 'title_global' => 'Vista globale per categorie',
),
'log' => array(
- '_' => 'Logs',
'clear' => 'Svuota logs',
'empty' => 'File di log vuoto',
- 'title' => 'Logs',
+ 'title' => 'Logs', // TODO - Translation
+ '_' => 'Logs', // TODO - Translation
),
'menu' => array(
'about' => 'Informazioni',
@@ -43,7 +40,7 @@ return array(
'mark_all_read' => 'Segna tutto come letto',
'mark_cat_read' => 'Segna la categoria come letta',
'mark_feed_read' => 'Segna il feed come letto',
- 'mark_selection_unread' => 'Mark selection as unread', //TODO - Translation
+ 'mark_selection_unread' => 'Mark selection as unread', // TODO - Translation
'newer_first' => 'Mostra prima i recenti',
'non-starred' => 'Escludi preferiti',
'normal_view' => 'Vista elenco',
@@ -51,16 +48,19 @@ return array(
'queries' => 'Chiavi di ricerca',
'read' => 'Mostra solo letti',
'reader_view' => 'Modalità di lettura',
- 'rss_view' => 'RSS feed',
+ 'rss_view' => 'RSS feed', // TODO - Translation
'search_short' => 'Cerca',
'starred' => 'Mostra solo preferiti',
'stats' => 'Statistiche',
'subscription' => 'Gestione sottoscrizioni',
- 'tags' => 'My labels', //TODO - Translation
+ 'tags' => 'My labels', // TODO - Translation
'unread' => 'Mostra solo non letti',
),
'share' => 'Condividi',
'tag' => array(
- 'related' => 'Tags correlati', //TODO - Translation
+ 'related' => 'Tags correlati',
+ ),
+ 'tos' => array(
+ 'title' => 'Terms of Service', // TODO - Translation
),
);
diff --git a/app/i18n/it/install.php b/app/i18n/it/install.php
index 0b904ab02..5bbc7c86a 100644
--- a/app/i18n/it/install.php
+++ b/app/i18n/it/install.php
@@ -17,20 +17,19 @@ return array(
'type' => 'Metodo di autenticazione',
),
'bdd' => array(
- '_' => 'Database',
'conf' => array(
- '_' => 'Configurazione database',
'ko' => 'Verifica le informazioni del database.',
'ok' => 'Le configurazioni del database sono state salvate.',
+ '_' => 'Configurazione database',
),
- 'host' => 'Host',
+ 'host' => 'Host', // TODO - Translation
'password' => 'Password del database',
'prefix' => 'Prefisso tabella',
'type' => 'Tipo di database',
'username' => 'Nome utente del database',
+ '_' => 'Database', // TODO - Translation
),
'check' => array(
- '_' => 'Controlli',
'already_installed' => 'FreshRSS risulta già installato!',
'cache' => array(
'nok' => 'Verifica i permessi sulla cartella <em>./data/cache</em>. Il server HTTP deve avere i permessi per scriverci dentro',
@@ -66,11 +65,11 @@ return array(
),
'json' => array(
'nok' => 'You lack a recommended library to parse JSON.',
- 'ok' => 'You have a recommended library to parse JSON.',
+ 'ok' => 'You have a recommended library to parse JSON.', // TODO - Translation
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
'nok' => 'Manca il framework Minz.',
@@ -94,12 +93,13 @@ return array(
),
'xml' => array(
'nok' => 'You lack the required library to parse XML.',
- 'ok' => 'You have the required library to parse XML.',
+ 'ok' => 'You have the required library to parse XML.', // TODO - Translation
),
+ '_' => 'Controlli',
),
'conf' => array(
- '_' => 'Configurazioni generali',
'ok' => 'Configurazioni generali salvate.',
+ '_' => 'Configurazioni generali',
),
'congratulations' => 'Congratulazione!',
'default_user' => 'Username utente predefinito <small>(massimo 16 caratteri alfanumerici)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => 'Reinstallando FreshRSS perderai la configurazione precedente. Sei sicuro di voler procedere?',
),
'language' => array(
- '_' => 'Lingua',
'choose' => 'Seleziona la lingua per FreshRSS',
'defined' => 'Lingua impostata.',
+ '_' => 'Lingua',
),
'not_deleted' => 'Qualcosa non ha funzionato; devi cancellare il file <em>%s</em> manualmente.',
'ok' => 'Processo di installazione terminato con successo.',
'step' => 'Passaggio %d',
'steps' => 'Passaggi',
- 'title' => 'Installazione · FreshRSS',
'this_is_the_end' => 'Fine',
+ 'title' => 'Installazione · FreshRSS',
);
diff --git a/app/i18n/it/sub.php b/app/i18n/it/sub.php
index 78db7b0a6..5b6341344 100644
--- a/app/i18n/it/sub.php
+++ b/app/i18n/it/sub.php
@@ -2,24 +2,24 @@
return array(
'api' => array(
- 'documentation' => 'Copy the following URL to use it within an external tool.', //TODO - Translation
- 'title' => 'API', //TODO - Translation
+ 'documentation' => 'Copy the following URL to use it within an external tool.', // TODO - Translation
+ 'title' => 'API', // TODO - Translation
),
'bookmarklet' => array(
- 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.',// TODO
- 'label' => 'Subscribe', //TODO - Translation
- 'title' => 'Bookmarklet', //TODO - Translation
+ 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', // TODO - Translation
+ 'label' => 'Subscribe', // TODO - Translation
+ 'title' => 'Bookmarklet', // TODO - Translation
),
'category' => array(
- '_' => 'Categoria',
'add' => 'Aggiungi una categoria',
'archiving' => 'Archiviazione',
'empty' => 'Categoria vuota',
'information' => 'Informazioni',
'new' => 'Nuova categoria',
- 'position' => 'Display position', //TODO - Translation
- 'position_help' => 'To control category sort order', //TODO - Translation
+ 'position' => 'Display position', // TODO - Translation
+ 'position_help' => 'To control category sort order', // TODO - Translation
'title' => 'Titolo',
+ '_' => 'Categoria',
),
'feed' => array(
'add' => 'Aggiungi un Feed RSS',
@@ -29,60 +29,60 @@ return array(
'configuration' => 'Autenticazione',
'help' => 'Accesso per feeds protetti',
'http' => 'Autenticazione HTTP',
- 'password' => 'HTTP password',
- 'username' => 'HTTP username',
+ 'password' => 'HTTP password', // TODO - Translation
+ 'username' => 'HTTP username', // TODO - Translation
),
- 'clear_cache' => 'Always clear cache', //TODO - Translation
+ 'clear_cache' => 'Always clear cache', // TODO - Translation
'css_help' => 'In caso di RSS feeds troncati (attenzione, richiede molto tempo!)',
'css_path' => 'Percorso del foglio di stile CSS del sito di origine',
'description' => 'Descrizione',
'empty' => 'Questo feed non contiene articoli. Per favore verifica il sito direttamente.',
'error' => 'Questo feed ha generato un errore. Per favore verifica se ancora disponibile.',
'filteractions' => array(
- '_' => 'Filter actions', //TODO - Translation
- 'help' => 'Write one search filter per line.', //TODO - Translation
+ 'help' => 'Write one search filter per line.', // TODO - Translation
+ '_' => 'Filter actions', // TODO - Translation
),
'information' => 'Informazioni',
'keep_min' => 'Numero minimo di articoli da mantenere',
'moved_category_deleted' => 'Cancellando una categoria i feed al suo interno verranno classificati automaticamente come <em>%s</em>.',
- 'mute' => 'mute', //TODO - Translation
+ 'mute' => 'mute', // TODO - Translation
'no_selected' => 'Nessun feed selezionato.',
'number_entries' => '%d articoli',
'priority' => array(
- '_' => 'Visibility', //TODO - Translation
- 'archived' => 'Do not show (archived)', //TODO - Translation
- 'main_stream' => 'Mostra in homepage', //TODO - Translation
- 'normal' => 'Show in its category', //TODO - Translation
+ 'archived' => 'Do not show (archived)', // TODO - Translation
+ 'main_stream' => 'Mostra in homepage',
+ 'normal' => 'Show in its category', // TODO - Translation
+ '_' => 'Visibility', // TODO - Translation
),
- 'websub' => 'Notifica istantanea con WebSub',
'show' => array(
- 'all' => 'Show all feeds', //TODO - Translation
- 'error' => 'Show only feeds with error', //TODO - Translation
+ 'all' => 'Show all feeds', // TODO - Translation
+ 'error' => 'Show only feeds with error', // TODO - Translation
),
'showing' => array(
- 'error' => 'Showing only feeds with error', //TODO - Translation
+ 'error' => 'Showing only feeds with error', // TODO - Translation
),
- 'ssl_verify' => 'Verify SSL security', //TODO - Translation
+ 'ssl_verify' => 'Verify SSL security', // TODO - Translation
'stats' => 'Statistiche',
'think_to_add' => 'Aggiungi feed.',
- 'timeout' => 'Timeout in seconds', //TODO - Translation
+ 'timeout' => 'Timeout in seconds', // TODO - Translation
'title' => 'Titolo',
'title_add' => 'Aggiungi RSS feed',
'ttl' => 'Non aggiornare automaticamente piu di',
- 'url' => 'Feed URL',
+ 'url' => 'Feed URL', // TODO - Translation
'validator' => 'Controlla la validita del feed ',
'website' => 'URL del sito',
+ 'websub' => 'Notifica istantanea con WebSub',
),
'firefox' => array(
- 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.', //TODO - Translation
- 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', //TODO - Translation
- 'title' => 'Firefox feed reader', //TODO - Translation
+ 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.', // TODO - Translation
+ 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', // TODO - Translation
+ 'title' => 'Firefox feed reader', // TODO - Translation
),
'import_export' => array(
'export' => 'Esporta',
+ 'export_labelled' => 'Export your labelled articles', // TODO - Translation
'export_opml' => 'Esporta tutta la lista dei feed (OPML)',
'export_starred' => 'Esporta i tuoi preferiti',
- 'export_labelled' => 'Export your labelled articles', //TODO
'feed_list' => 'Elenco di %s articoli',
'file_to_import' => 'File da importare<br />(OPML, JSON o ZIP)',
'file_to_import_no_zip' => 'File da importare<br />(OPML o JSON)',
@@ -94,11 +94,11 @@ return array(
'bookmark' => 'Bookmark (trascina nei preferiti)',
'import_export' => 'Importa / esporta',
'subscription_management' => 'Gestione sottoscrizioni',
- 'subscription_tools' => 'Subscription tools', //TODO - Translation
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
),
'title' => array(
- '_' => 'Gestione sottoscrizioni',
'feed_management' => 'Gestione RSS feeds',
- 'subscription_tools' => 'Subscription tools', //TODO - Translation
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
+ '_' => 'Gestione sottoscrizioni',
),
);
diff --git a/app/i18n/it/user.php b/app/i18n/it/user.php
index 3a8343c11..52197ad46 100644
--- a/app/i18n/it/user.php
+++ b/app/i18n/it/user.php
@@ -3,35 +3,35 @@
return array(
'email' => array(
'feedback' => array(
- 'invalid' => 'The email address is invalid.', //TODO - Translation
- 'required' => 'The email address is required.', //TODO - Translation
+ 'invalid' => 'The email address is invalid.', // TODO - Translation
+ 'required' => 'The email address is required.', // TODO - Translation
),
'validation' => array(
- 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', //TODO - Translation
- 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', //TODO - Translation
+ 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', // TODO - Translation
+ 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', // TODO - Translation
'feedback' => array(
- 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', //TODO - Translation
- 'email_sent' => 'An email has been sent to your address.', //TODO - Translation
- 'error' => 'The email address failed to be validated.', //TODO - Translation
- 'ok' => 'The email address has been validated.', //TODO - Translation
- 'unneccessary' => 'The email address was already validated.', //TODO - Translation
- 'wrong_token' => 'The email address failed to be validated due to a wrong token.', //TODO - Translation
+ 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', // TODO - Translation
+ 'email_sent' => 'An email has been sent to your address.', // TODO - Translation
+ 'error' => 'The email address failed to be validated.', // TODO - Translation
+ 'ok' => 'The email address has been validated.', // TODO - Translation
+ 'unneccessary' => 'The email address was already validated.', // TODO - Translation
+ 'wrong_token' => 'The email address failed to be validated due to a wrong token.', // TODO - Translation
),
- 'need_to' => 'You need to validate your email address before being able to use %s.', //TODO - Translation
- 'resend_email' => 'Resend the email', //TODO - Translation
- 'title' => 'Email address validation', //TODO - Translation
- ),
- ),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
+ 'need_to' => 'You need to validate your email address before being able to use %s.', // TODO - Translation
+ 'resend_email' => 'Resend the email', // TODO - Translation
+ 'title' => 'Email address validation', // TODO - Translation
),
),
'mailer' => array(
'email_need_validation' => array(
- 'title' => 'You need to validate your account', //TODO - Translation
- 'welcome' => 'Welcome %s,', //TODO - Translation
- 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', //TODO - Translation
+ 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', // TODO - Translation
+ 'title' => 'You need to validate your account', // TODO - Translation
+ 'welcome' => 'Welcome %s,', // TODO - Translation
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
),
),
);
diff --git a/app/i18n/kr/admin.php b/app/i18n/kr/admin.php
index 4a8e425d5..9c41430eb 100644
--- a/app/i18n/kr/admin.php
+++ b/app/i18n/kr/admin.php
@@ -64,7 +64,7 @@ return array(
'files' => '파일 시스템 설치 요구사항',
'json' => array(
'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php-json 패키지).',
- 'ok' => 'JSON 확장 기능이 설치되어 있습니다.',
+ 'ok' => 'JSON 확장 기능이 설치되어 있습니다.',
),
'mbstring' => array(
'nok' => '유니코드 지원을 위한 mbstring 라이브러리를 찾을 수 없습니다.',
@@ -83,9 +83,9 @@ return array(
'ok' => '최소 하나의 지원가능한 드라이버와 PDO가 설치되어 있습니다 (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'PHP 설치 요구사항',
'nok' => 'PHP 버전은 %s 이지만, FreshRSS에는 최소 %s의 버전이 필요합니다.',
'ok' => 'PHP 버전은 %s 이고, FreshRSS와 호환가능 합니다.',
+ '_' => 'PHP 설치 요구사항',
),
'tables' => array(
'nok' => '하나 이상의 테이블을 데이터베이스에서 찾을 수 없습니다.',
@@ -116,8 +116,8 @@ return array(
'name' => '이름',
'no_configure_view' => '이 확장 기능은 설정이 없습니다.',
'system' => array(
- '_' => '시스템 확장 기능',
'no_rights' => '시스템 확장 기능 (이 확장 기능에 대한 권한이 없습니다)',
+ '_' => '시스템 확장 기능',
),
'title' => '확장 기능',
'update' => '업데이트 있음',
@@ -125,7 +125,6 @@ return array(
'version' => '버전',
),
'stats' => array(
- '_' => '통계',
'all_feeds' => '모든 피드',
'category' => '카테고리',
'entry_count' => '글 개수',
@@ -155,37 +154,44 @@ return array(
'status_unread' => '읽지 않음',
'title' => '통계',
'top_feed' => '상위 10 개 피드',
+ '_' => '통계',
),
'system' => array(
- '_' => '시스템 설정',
'auto-update-url' => '자동 업데이트 서버 URL',
- 'force_email_validation' => 'Force email addresses validation', //TODO - Translation
- 'instance-name' => '인스턴스 이름',
- 'max-categories' => '사용자별 카테고리 개수 제한',
- 'max-feeds' => '사용자별 피드 개수 제한',
'cookie-duration' => array(
'help' => '초',
'number' => '로그인 유지 시간',
),
+ 'force_email_validation' => 'Force email addresses validation', // TODO - Translation
+ 'instance-name' => '인스턴스 이름',
+ 'max-categories' => '사용자별 카테고리 개수 제한',
+ 'max-feeds' => '사용자별 피드 개수 제한',
'registration' => array(
'help' => '0: 제한 없음',
'number' => '계정 최대 개수',
),
+ '_' => '시스템 설정',
),
'update' => array(
- '_' => '업데이트',
'apply' => '업데이트 적용하기',
'check' => '새 업데이트 확인하기',
'current_version' => '현재 FreshRSS 버전은 %s 입니다.',
'last' => '마지막 확인: %s',
'none' => '적용 가능한 업데이트가 없습니다',
'title' => '업데이트',
+ '_' => '업데이트',
),
'user' => array(
'articles_and_size' => '%s 개의 글 (%s)',
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => '새 사용자 생성',
+ 'database_size' => 'Database size', // TODO - Translation
'delete_users' => '사용자 삭제',
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => '언어',
+ 'list' => 'User list', // TODO - Translation
'number' => '%d 개의 계정이 생성되었습니다',
'numbers' => '%d 개의 계정이 생성되었습니다',
'password_form' => '암호<br /><small>(웹폼 로그인 방식 사용시)</small>',
@@ -193,8 +199,8 @@ return array(
'selected' => '선택된 사용자',
'title' => '사용자 관리',
'update_users' => '사용자 정보 변경',
- 'user_list' => '사용자 목록',
'username' => '사용자 이름',
'users' => '전체 사용자',
+ 'user_list' => '사용자 목록',
),
);
diff --git a/app/i18n/kr/conf.php b/app/i18n/kr/conf.php
index 1e77d0098..1a5c41969 100644
--- a/app/i18n/kr/conf.php
+++ b/app/i18n/kr/conf.php
@@ -2,34 +2,33 @@
return array(
'archiving' => array(
- '_' => '보관',
'delete_after' => '다음 기간보다 오래된 글 삭제',
- 'exception' => 'Purge exception', //TODO - Translation
+ 'exception' => 'Purge exception', // TODO - Translation
'help' => '더 자세한 옵션은 개별 피드 설정에 있습니다',
- 'keep_favourites' => 'Never delete favourites', //TODO - Translation
+ 'keep_favourites' => 'Never delete favourites', // TODO - Translation
+ 'keep_labels' => 'Never delete labels', // TODO - Translation
+ 'keep_max' => 'Maximum number of articles to keep', // TODO - Translation
'keep_min_by_feed' => '피드별 최소 유지 글 개수',
- 'keep_labels' => 'Never delete labels', //TODO - Translation
- 'keep_unreads' => 'Never delete unreads', //TODO - Translation
- 'maintenance' => 'Maintenance', //TODO - Translation
+ 'keep_period' => 'Maximum age of articles to keep', // TODO - Translation
+ 'keep_unreads' => 'Never delete unreads', // TODO - Translation
+ 'maintenance' => 'Maintenance', // TODO - Translation
'optimize' => '데이터베이스 최적화',
'optimize_help' => '데이터베이스 크기를 줄이기 위해 가끔씩 수행해주세요',
- 'policy' => 'Purge policy', //TODO - Translation
- 'policy_warning' => 'If no purge policy is selected, every article will be kept.', //TODO - Translation
+ 'policy' => 'Purge policy', // TODO - Translation
+ 'policy_warning' => 'If no purge policy is selected, every article will be kept.', // TODO - Translation
'purge_now' => '지금 삭제',
- 'keep_max' => 'Maximum number of articles to keep', //TODO - Translation
- 'keep_period' => 'Maximum age of articles to keep', //TODO - Translation
'title' => '보관',
'ttl' => '다음 시간이 지나기 전에 새로고침 금지',
+ '_' => '보관',
),
'display' => array(
- '_' => '표시',
'icon' => array(
'bottom_line' => '하단',
+ 'display_authors' => 'Authors', // TODO - Translation
'entry' => '문서 아이콘',
'publication_date' => '발행일',
'related_tags' => '관련 태그',
'sharing' => '공유',
- 'display_authors' => 'Authors', //TODO - Translation
'top_line' => '상단',
),
'language' => '언어',
@@ -47,21 +46,22 @@ return array(
'no_limit' => '제한 없음',
'thin' => '얇음',
),
+ '_' => '표시',
),
'profile' => array(
- '_' => '프로필 관리',
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => '계정 삭제',
'warn' => '당신의 계정과 관련된 모든 데이터가 삭제됩니다.',
+ '_' => '계정 삭제',
),
'email' => '메일 주소',
'password_api' => 'API 암호<br /><small>(예: 모바일 애플리케이션)</small>',
'password_form' => '암호<br /><small>(웹폼 로그인 방식 사용시)</small>',
'password_format' => '7 글자 이상이어야 합니다',
'title' => '프로필',
+ '_' => '프로필 관리',
),
'query' => array(
- '_' => '사용자 쿼리',
'deprecated' => '이 쿼리는 더 이상 유효하지 않습니다. 해당하는 카테고리나 피드가 삭제되었습니다.',
'display' => '사용자 쿼리 결과 표시',
'filter' => '적용된 필터:',
@@ -69,8 +69,8 @@ return array(
'get_category' => '"%s" 카테고리 표시',
'get_favorite' => '즐겨찾기에 등록된 글 표시',
'get_feed' => '"%s" 피드 표시',
- 'no_filter' => '필터가 없습니다',
'none' => '아직 사용자 쿼리를 만들지 않았습니다.',
+ 'no_filter' => '필터가 없습니다',
'number' => '쿼리 #%d',
'order_asc' => '오래된 글 먼저 표시',
'order_desc' => '최근 글 먼저 표시',
@@ -93,9 +93,9 @@ return array(
'state_14' => '읽지 않은 글 표시',
'state_15' => '모든 글 표시',
'title' => '사용자 쿼리',
+ '_' => '사용자 쿼리',
),
'reading' => array(
- '_' => '읽기',
'after_onread' => '“모두 읽음으로 표시” 후,',
'articles_per_page' => '페이지당 글 수',
'auto_load_more' => '페이지 하단에 다다르면 글 더 불러오기',
@@ -116,16 +116,16 @@ return array(
'when' => '읽음으로 표시…',
),
'show' => array(
- '_' => '글 표시 방식',
'adaptive' => '읽지 않은 글이 없으면 모든 글 표시',
'all_articles' => '모든 글 표시',
'unread' => '읽지 않은 글만 표시',
+ '_' => '글 표시 방식',
),
'sides_close_article' => '글 영역 바깥을 클릭하면 글 접기',
'sort' => array(
- '_' => '정렬 순서',
'newer_first' => '최근 글 먼저',
'older_first' => '오래된 글 먼저',
+ '_' => '정렬 순서',
),
'sticky_post' => '글이 펼쳐진 경우 최상단에 고정하기',
'title' => '읽기',
@@ -135,9 +135,9 @@ return array(
'normal' => '일반 모드',
'reader' => '읽기 모드',
),
+ '_' => '읽기',
),
'sharing' => array(
- '_' => '공유',
'add' => '공유 방법 추가',
'blogotext' => 'Blogotext',
'diaspora' => 'Diaspora*',
@@ -152,9 +152,9 @@ return array(
'title' => '공유',
'twitter' => 'Twitter',
'wallabag' => 'wallabag',
+ '_' => '공유',
),
'shortcut' => array(
- '_' => '단축키',
'article_action' => '글 관련 동작',
'auto_share' => '공유',
'auto_share_help' => '공유 옵션이 하나만 설정되어 있다면 해당 공유 옵션을 사용하고, 그렇지 않다면 공유 옵션을 번호로 선택할 수 있습니다.',
@@ -186,6 +186,7 @@ return array(
'user_filter' => '사용자 필터 사용하기',
'user_filter_help' => '사용자 필터가 하나만 설정되어 있다면 해당 필터를 사용하고, 그렇지 않다면 필터를 번호로 선택할 수 있습니다.',
'views' => '표시',
+ '_' => '단축키',
),
'user' => array(
'articles_and_size' => '%s 개의 글 (%s)',
diff --git a/app/i18n/kr/feedback.php b/app/i18n/kr/feedback.php
index 0e31536f8..def6c0745 100644
--- a/app/i18n/kr/feedback.php
+++ b/app/i18n/kr/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => '최적화가 완료되었습니다',
- ),
'access' => array(
'denied' => '이 페이지에 접근할 수 있는 권한이 없습니다',
'not_found' => '이 페이지는 존재하지 않습니다',
),
+ 'admin' => array(
+ 'optimization_complete' => '최적화가 완료되었습니다',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => '인증 시스템을 설정하는 동안 문제가 발생했습니다. 잠시 후 다시 시도하세요.',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s 확장 기능을 활성화 할 수 없습니다. 자세한 내용은 <a href="%s">FreshRSS 로그</a>를 참고하세요.',
'ok' => '%s 확장 기능이 활성화되었습니다',
),
- 'no_access' => '%s 확장 기능에 접근 권한이 없습니다',
'not_enabled' => '%s 확장 기능이 활성화되지 않았습니다',
'not_found' => '%s 확장 기능이 존재하지 않습니다',
+ 'no_access' => '%s 확장 기능에 접근 권한이 없습니다',
),
'import_export' => array(
'export_no_zip_extension' => 'ZIP 확장 기능을 서버에서 찾을 수 없습니다. 파일을 하나씩 내보내세요.',
@@ -66,10 +72,10 @@ return array(
'emptied' => '카테고리를 비웠습니다',
'error' => '카테고리를 변경할 수 없습니다',
'name_exists' => '같은 카테고리 이름이 이미 존재합니다.',
- 'no_id' => '카테고리 id를 명시해야 합니다.',
- 'no_name' => '카테고리 이름을 명시해야 합니다.',
'not_delete_default' => '기본 카테고리는 삭제할 수 없습니다!',
'not_exist' => '카테고리가 존재하지 않습니다!',
+ 'no_id' => '카테고리 id를 명시해야 합니다.',
+ 'no_name' => '카테고리 이름을 명시해야 합니다.',
'over_max' => '카테고리 개수 제한에 다다랐습니다 (%d)',
'updated' => '카테고리가 변경되었습니다.',
),
@@ -82,10 +88,10 @@ return array(
'error' => '피드를 변경할 수 없습니다',
'internal_problem' => 'RSS 피드를 추가할 수 없습니다. 자세한 내용은 <a href="%s">FreshRSS 로그</a>를 참고하세요.',
'invalid_url' => 'URL (<em>%s</em>)이 유효하지 않습니다',
+ 'not_added' => '<em>%s</em> 피드를 추가할 수 없습니다',
+ 'no_refresh' => '새 글을 가져올 피드가 없습니다…',
'n_actualized' => '%d 개의 피드에서 새 글을 가져왔습니다',
'n_entries_deleted' => '%d 개의 글을 삭제했습니다',
- 'no_refresh' => '새 글을 가져올 피드가 없습니다…',
- 'not_added' => '<em>%s</em> 피드를 추가할 수 없습니다',
'over_max' => '피드 개수 제한에 다다랐습니다 (%d)',
'updated' => '피드가 변경되었습니다',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => '%s 사용자가 생성되었습니다',
'error' => '%s 사용자를 생성할 수 없습니다',
+ '_' => '%s 사용자가 생성되었습니다',
),
'deleted' => array(
- '_' => '%s 사용자를 삭제했습니다',
'error' => '%s 사용자를 삭제할 수 없습니다',
+ '_' => '%s 사용자를 삭제했습니다',
),
'updated' => array(
- '_' => '사용자 %s의 정보가 변경되었습니다',
'error' => '사용자 %s의 정보가 변경되지 않았습니다',
+ '_' => '사용자 %s의 정보가 변경되었습니다',
),
),
);
diff --git a/app/i18n/kr/gen.php b/app/i18n/kr/gen.php
index fdc95d431..45a053386 100644
--- a/app/i18n/kr/gen.php
+++ b/app/i18n/kr/gen.php
@@ -3,7 +3,7 @@
return array(
'action' => array(
'actualize' => '새 글 가져오기',
- 'back' => '← Go back', //TODO - Translation
+ 'back' => '← Go back', // TODO - Translation
'back_to_rss_feeds' => '← RSS 피드로 돌아가기',
'cancel' => '취소',
'create' => '생성',
@@ -16,6 +16,7 @@ return array(
'manage' => '관리',
'mark_favorite' => '즐겨찾기에 등록',
'mark_read' => '읽음으로 표시',
+ 'purge' => 'Purge', // TODO - Translation
'remove' => '삭제',
'see_website' => '웹사이트 열기',
'submit' => '설정 저장',
@@ -23,25 +24,25 @@ return array(
'update' => '변경',
),
'auth' => array(
- 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
+ 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
'email' => '메일 주소',
'keep_logged_in' => '로그인 유지 <small>(%s 일)</small>',
'login' => '로그인',
'logout' => '로그아웃',
'password' => array(
- '_' => '암호',
'format' => '<small>7 글자 이상이어야 합니다</small>',
+ '_' => '암호',
),
'registration' => array(
- '_' => '새 계정',
'ask' => '새 계정을 만들까요?',
'title' => '계정 생성',
+ '_' => '새 계정',
),
'reset' => '인증 초기화',
'username' => array(
- '_' => '사용자 이름',
'admin' => '관리자 이름',
'format' => '<small>알파벳과 숫자를 포함할 수 있고 최대 16 글자</small>',
+ '_' => '사용자 이름',
),
),
'date' => array(
@@ -64,8 +65,8 @@ return array(
'Jan' => '\\J\\a\\n\\u\\a\\r\\y',
'jan' => '1월',
'january' => '1월',
- 'Jul' => '\\J\\u\\l\\y',
'jul' => '7월',
+ 'Jul' => '\\J\\u\\l\\y',
'july' => '7월',
'Jun' => '\\J\\u\\n\\e',
'jun' => '6월',
@@ -75,15 +76,15 @@ return array(
'last_month' => '최근 한 달',
'last_week' => '최근 한 주',
'last_year' => '최근 일 년',
- 'Mar' => '\\M\\a\\r\\c\\h',
'mar' => '3월',
+ 'Mar' => '\\M\\a\\r\\c\\h',
'march' => '3월',
'May' => '\\M\\a\\y',
'may' => '5월',
'may_' => '5월',
- 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r',
'mon' => '월',
'month' => '개월',
+ 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r',
'nov' => '11월',
'november' => '11월',
'Oct' => '\\O\\c\\t\\o\\b\\e\\r',
@@ -101,8 +102,8 @@ return array(
'yesterday' => '어제',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => '정보',
+ '_' => 'FreshRSS',
),
'js' => array(
'category_empty' => '빈 카테고리',
@@ -129,6 +130,7 @@ return array(
'oc' => 'Occitan',
'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
+ 'sk' => 'Slovenčina', // TODO - Translation
'tr' => 'Türkçe',
'zh-cn' => '简体中文',
),
@@ -163,11 +165,11 @@ return array(
'previous' => '이전',
),
'period' => array(
- 'days' => 'days', //TODO - Translation
- 'hours' => 'hours', //TODO - Translation
- 'months' => 'months', //TODO - Translation
- 'weeks' => 'weeks', //TODO - Translation
- 'years' => 'years', //TODO - Translation
+ 'days' => 'days', // TODO - Translation
+ 'hours' => 'hours', // TODO - Translation
+ 'months' => 'months', // TODO - Translation
+ 'weeks' => 'weeks', // TODO - Translation
+ 'years' => 'years', // TODO - Translation
),
'share' => array(
'blogotext' => 'Blogotext',
diff --git a/app/i18n/kr/index.php b/app/i18n/kr/index.php
index 6e582d906..692c72a07 100644
--- a/app/i18n/kr/index.php
+++ b/app/i18n/kr/index.php
@@ -2,7 +2,6 @@
return array(
'about' => array(
- '_' => '정보',
'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
'bugs_reports' => '버그 제보하기',
'credits' => '크레딧',
@@ -14,23 +13,21 @@ return array(
'title' => '정보',
'version' => '버전',
'website' => '웹사이트',
- ),
- 'tos' => array(
- 'title' => 'Terms of Service', // TODO - Translation
+ '_' => '정보',
),
'feed' => array(
'add' => '피드를 추가하세요.',
'empty' => '글이 없습니다.',
'rss_of' => '%s의 피드',
'title' => 'RSS 피드',
- 'title_global' => '전체 모드',
'title_fav' => '즐겨찾기',
+ 'title_global' => '전체 모드',
),
'log' => array(
- '_' => '로그',
'clear' => '로그 모두 지우기',
'empty' => '로그 파일이 비어있습니다',
'title' => '로그',
+ '_' => '로그',
),
'menu' => array(
'about' => 'FreshRSS 정보',
@@ -63,4 +60,7 @@ return array(
'tag' => array(
'related' => '관련 태그',
),
+ 'tos' => array(
+ 'title' => 'Terms of Service', // TODO - Translation
+ ),
);
diff --git a/app/i18n/kr/install.php b/app/i18n/kr/install.php
index 65e8726e1..8b966a627 100644
--- a/app/i18n/kr/install.php
+++ b/app/i18n/kr/install.php
@@ -17,20 +17,19 @@ return array(
'type' => '인증 방식',
),
'bdd' => array(
- '_' => '데이터베이스',
'conf' => array(
- '_' => '데이터베이스 설정',
'ko' => '데이터베이스 정보를 확인하세요.',
'ok' => '데이터베이스 설정이 저장되었습니다.',
+ '_' => '데이터베이스 설정',
),
'host' => '데이터베이스 서버',
'password' => '데이터베이스 암호',
'prefix' => '테이블 접두어',
'type' => '데이터베이스 종류',
'username' => '데이터베이스 사용자 이름',
+ '_' => '데이터베이스',
),
'check' => array(
- '_' => '설치 요구사항 확인',
'already_installed' => 'FreshRSS가 이미 설치되어 있는 것을 감지했습니다!',
'cache' => array(
'nok' => '<em>./data/cache</em> 디렉토리의 권한을 확인하세요. HTTP 서버가 쓰기 권한을 가지고 있어야 합니다',
@@ -66,7 +65,7 @@ return array(
),
'json' => array(
'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php-json 패키지).',
- 'ok' => 'JSON 확장 기능이 설치되어 있습니다.',
+ 'ok' => 'JSON 확장 기능이 설치되어 있습니다.',
),
'mbstring' => array(
'nok' => '유니코드 지원을 위한 mbstring 라이브러리를 찾을 수 없습니다.',
@@ -96,10 +95,11 @@ return array(
'nok' => 'XML 해석을 위한 라이브러리르 찾을 수 없습니다.',
'ok' => 'XML 해석을 위한 라이브러리가 설치되어 있습니다.',
),
+ '_' => '설치 요구사항 확인',
),
'conf' => array(
- '_' => '일반 설정',
'ok' => '일반 설정이 저장되었습니다.',
+ '_' => '일반 설정',
),
'congratulations' => '축하합니다!',
'default_user' => '기본 사용자 이름<small>(알파벳과 숫자를 포함할 수 있고 최대 16 글자)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => 'FreshRSS을 다시 설치하면 이전 설정이 사라집니다. 계속하시겠습니까?',
),
'language' => array(
- '_' => '언어',
'choose' => 'FreshRSS에서 사용할 언어를 고르세요',
'defined' => '언어가 설정되었습니다.',
+ '_' => '언어',
),
'not_deleted' => '무언가 잘못되었습니다; <em>%s</em> 파일을 직접 삭제해주세요.',
'ok' => '설치 과정이 성공적으로 끝났습니다.',
'step' => '단계 %d',
'steps' => '단계',
- 'title' => '설치 · FreshRSS',
'this_is_the_end' => '마침',
+ 'title' => '설치 · FreshRSS',
);
diff --git a/app/i18n/kr/sub.php b/app/i18n/kr/sub.php
index ac45e4e73..bc339f30f 100644
--- a/app/i18n/kr/sub.php
+++ b/app/i18n/kr/sub.php
@@ -11,15 +11,15 @@ return array(
'title' => '북마클릿',
),
'category' => array(
- '_' => '카테고리',
'add' => '카테고리 추가',
'archiving' => '보관',
'empty' => '빈 카테고리',
'information' => '정보',
'new' => '새 카테고리',
- 'position' => 'Display position', //TODO - Translation
- 'position_help' => 'To control category sort order', //TODO - Translation
+ 'position' => 'Display position', // TODO - Translation
+ 'position_help' => 'To control category sort order', // TODO - Translation
'title' => '제목',
+ '_' => '카테고리',
),
'feed' => array(
'add' => 'RSS 피드 추가',
@@ -39,8 +39,8 @@ return array(
'empty' => '이 피드는 비어있습니다. 피드가 계속 운영되고 있는지 확인하세요.',
'error' => '이 피드에 문제가 발생했습니다. 이 피드에 접근 권한이 있는지 확인하세요.',
'filteractions' => array(
- '_' => 'Filter actions', //TODO - Translation
- 'help' => 'Write one search filter per line.', //TODO - Translation
+ 'help' => 'Write one search filter per line.', // TODO - Translation
+ '_' => 'Filter actions', // TODO - Translation
),
'information' => '정보',
'keep_min' => '최소 유지 글 개수',
@@ -49,12 +49,11 @@ return array(
'no_selected' => '선택된 피드가 없습니다.',
'number_entries' => '%d 개의 글',
'priority' => array(
- '_' => '표시',
'archived' => '표시하지 않음 (보관됨)',
'main_stream' => '메인 스트림에 표시하기',
'normal' => '피드가 속한 카테고리에만 표시하기',
+ '_' => '표시',
),
- 'websub' => 'WebSub을 사용한 즉시 알림',
'show' => array(
'all' => '모든 피드 보기',
'error' => '오류가 발생한 피드만 보기',
@@ -72,17 +71,18 @@ return array(
'url' => '피드 URL',
'validator' => '피드 유효성 검사',
'website' => '웹사이트 URL',
+ 'websub' => 'WebSub을 사용한 즉시 알림',
),
'firefox' => array(
'documentation' => 'FreshRSS를 Firefox 피드 리더에 추가하기 위해서는 <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">여기</a>의 설명을 따르세요.',
- 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', //TODO - Translation
+ 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', // TODO - Translation
'title' => 'Firefox 피드 리더',
),
'import_export' => array(
'export' => '내보내기',
+ 'export_labelled' => '라벨이 표시된 글들 내보내기',
'export_opml' => '피드 목록 내보내기 (OPML)',
'export_starred' => '즐겨찾기 내보내기',
- 'export_labelled' => '라벨이 표시된 글들 내보내기',
'feed_list' => '%s 개의 글 목록',
'file_to_import' => '불러올 파일<br />(OPML, JSON 또는 ZIP)',
'file_to_import_no_zip' => '불러올 파일<br />(OPML 또는 JSON)',
@@ -97,8 +97,8 @@ return array(
'subscription_tools' => '구독 도구',
),
'title' => array(
- '_' => '구독 관리',
'feed_management' => 'RSS 피드 관리',
'subscription_tools' => '구독 도구',
+ '_' => '구독 관리',
),
);
diff --git a/app/i18n/kr/user.php b/app/i18n/kr/user.php
index 3a8343c11..52197ad46 100644
--- a/app/i18n/kr/user.php
+++ b/app/i18n/kr/user.php
@@ -3,35 +3,35 @@
return array(
'email' => array(
'feedback' => array(
- 'invalid' => 'The email address is invalid.', //TODO - Translation
- 'required' => 'The email address is required.', //TODO - Translation
+ 'invalid' => 'The email address is invalid.', // TODO - Translation
+ 'required' => 'The email address is required.', // TODO - Translation
),
'validation' => array(
- 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', //TODO - Translation
- 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', //TODO - Translation
+ 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', // TODO - Translation
+ 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', // TODO - Translation
'feedback' => array(
- 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', //TODO - Translation
- 'email_sent' => 'An email has been sent to your address.', //TODO - Translation
- 'error' => 'The email address failed to be validated.', //TODO - Translation
- 'ok' => 'The email address has been validated.', //TODO - Translation
- 'unneccessary' => 'The email address was already validated.', //TODO - Translation
- 'wrong_token' => 'The email address failed to be validated due to a wrong token.', //TODO - Translation
+ 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', // TODO - Translation
+ 'email_sent' => 'An email has been sent to your address.', // TODO - Translation
+ 'error' => 'The email address failed to be validated.', // TODO - Translation
+ 'ok' => 'The email address has been validated.', // TODO - Translation
+ 'unneccessary' => 'The email address was already validated.', // TODO - Translation
+ 'wrong_token' => 'The email address failed to be validated due to a wrong token.', // TODO - Translation
),
- 'need_to' => 'You need to validate your email address before being able to use %s.', //TODO - Translation
- 'resend_email' => 'Resend the email', //TODO - Translation
- 'title' => 'Email address validation', //TODO - Translation
- ),
- ),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
+ 'need_to' => 'You need to validate your email address before being able to use %s.', // TODO - Translation
+ 'resend_email' => 'Resend the email', // TODO - Translation
+ 'title' => 'Email address validation', // TODO - Translation
),
),
'mailer' => array(
'email_need_validation' => array(
- 'title' => 'You need to validate your account', //TODO - Translation
- 'welcome' => 'Welcome %s,', //TODO - Translation
- 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', //TODO - Translation
+ 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', // TODO - Translation
+ 'title' => 'You need to validate your account', // TODO - Translation
+ 'welcome' => 'Welcome %s,', // TODO - Translation
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
),
),
);
diff --git a/app/i18n/nl/admin.php b/app/i18n/nl/admin.php
index 1083c630b..b6ffee16a 100644
--- a/app/i18n/nl/admin.php
+++ b/app/i18n/nl/admin.php
@@ -1,5 +1,5 @@
<?php
-/* Dutch translation by Wanabo. http://www.nieuwskop.be */
+
return array(
'auth' => array(
'allow_anonymous' => 'Sta bezoekers toe om artikelen te lezen van de standaard gebruiker (%s)',
@@ -83,9 +83,9 @@ return array(
'ok' => 'U hebt PDO en ten minste één van de ondersteunde drivers (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'PHP installatie',
'nok' => 'Uw PHP versie is %s maar FreshRSS benodigd tenminste versie %s.',
'ok' => 'Uw PHP versie is %s, welke compatibel is met FreshRSS.',
+ '_' => 'PHP installatie',
),
'tables' => array(
'nok' => 'Er zijn één of meer ontbrekende tabellen in de database.',
@@ -116,8 +116,8 @@ return array(
'name' => 'Naam',
'no_configure_view' => 'Deze uitbreiding kan niet worden geconfigureerd.',
'system' => array(
- '_' => 'Systeemuitbreidingen',
'no_rights' => 'Systeemuitbreidingen (U hebt hier geen rechten op)',
+ '_' => 'Systeemuitbreidingen',
),
'title' => 'Uitbreidingen',
'update' => 'Update beschikbaar',
@@ -125,7 +125,6 @@ return array(
'version' => 'Versie',
),
'stats' => array(
- '_' => 'Statistieken',
'all_feeds' => 'Alle feeds',
'category' => 'Categorie',
'entry_count' => 'Invoer aantallen',
@@ -155,37 +154,44 @@ return array(
'status_unread' => 'Ongelezen',
'title' => 'Statistieken',
'top_feed' => 'Top tien feeds',
+ '_' => 'Statistieken',
),
'system' => array(
- '_' => 'Systeem configuratie',
'auto-update-url' => 'Automatische update server URL',
- 'force_email_validation' => 'Emailadresvalidatie forceren',
- 'instance-name' => 'Voorbeeld naam',
- 'max-categories' => 'Categorielimiet per gebruiker',
- 'max-feeds' => 'Feedlimiet per gebruiker',
'cookie-duration' => array(
'help' => 'in seconden',
'number' => 'Tijdsduur om ingelogd te blijven',
),
+ 'force_email_validation' => 'Emailadresvalidatie forceren',
+ 'instance-name' => 'Voorbeeld naam',
+ 'max-categories' => 'Categorielimiet per gebruiker',
+ 'max-feeds' => 'Feedlimiet per gebruiker',
'registration' => array(
'help' => '0 betekent geen account limiet',
'number' => 'Maximum aantal accounts',
),
+ '_' => 'Systeem configuratie',
),
'update' => array(
- '_' => 'Versie controle',
'apply' => 'Toepassen',
'check' => 'Controleer op nieuwe versies',
'current_version' => 'Uw huidige versie van FreshRSS is %s.',
'last' => 'Laatste controle: %s',
'none' => 'Geen nieuwe versie om toe te passen',
'title' => 'Vernieuw systeem',
+ '_' => 'Versie controle',
),
'user' => array(
'articles_and_size' => '%s artikelen (%s)',
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => 'Creëer nieuwe gebruiker',
+ 'database_size' => 'Database size', // TODO - Translation
'delete_users' => 'Verwijder gebruiker',
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => 'Taal',
+ 'list' => 'User list', // TODO - Translation
'number' => 'Er is %d accounts gemaakt',
'numbers' => 'Er zijn %d accounts gemaakt',
'password_form' => 'Wachtwoord<br /><small>(voor de Web-formulier loginmethode)</small>',
@@ -193,8 +199,8 @@ return array(
'selected' => 'Geselecteerde gebruiker',
'title' => 'Beheer gebruikers',
'update_users' => 'Gebruiker bijwerken',
- 'user_list' => 'Lijst van gebruikers ',
'username' => 'Gebruikersnaam',
'users' => 'Gebruikers',
+ 'user_list' => 'Lijst van gebruikers ',
),
);
diff --git a/app/i18n/nl/conf.php b/app/i18n/nl/conf.php
index ca6627cbb..d6a2a01a3 100644
--- a/app/i18n/nl/conf.php
+++ b/app/i18n/nl/conf.php
@@ -2,13 +2,14 @@
return array(
'archiving' => array(
- '_' => 'Archivering',
'delete_after' => 'Verwijder artikelen na',
'exception' => 'Zuiveringsuitzondering',
'help' => 'Meer opties zijn beschikbaar in de persoonlijke stroom instellingen',
'keep_favourites' => 'Favorieten nooit verwijderen',
- 'keep_min_by_feed' => 'Minimum aantal te behouden artikelen in de feed',
'keep_labels' => 'Labels nooit verwijderen',
+ 'keep_max' => 'Maximaal aantal artikelen om te behouden',
+ 'keep_min_by_feed' => 'Minimum aantal te behouden artikelen in de feed',
+ 'keep_period' => 'Maximumleeftijd artikelen om te behouden',
'keep_unreads' => 'Ongelezen artikels nooit verwijderen',
'maintenance' => 'Onderhoud',
'optimize' => 'Database optimaliseren',
@@ -16,20 +17,18 @@ return array(
'policy' => 'Zuiveringsbeleid',
'policy_warning' => 'Zonder zuiveringsbeleid wordt elk artikel bewaard.',
'purge_now' => 'Schoon nu op',
- 'keep_max' => 'Maximaal aantal artikelen om te behouden',
- 'keep_period' => 'Maximumleeftijd artikelen om te behouden',
'title' => 'Archivering',
'ttl' => 'Vernieuw niet automatisch meer dan',
+ '_' => 'Archivering',
),
'display' => array(
- '_' => 'Opmaak',
'icon' => array(
'bottom_line' => 'Onderaan',
+ 'display_authors' => 'Auteurs',
'entry' => 'Artikel pictogrammen',
'publication_date' => 'Publicatie datum',
'related_tags' => 'Gerelateerde labels',
'sharing' => 'Delen',
- 'display_authors' => 'Auteurs',
'top_line' => 'Bovenaan',
),
'language' => 'Taal',
@@ -47,21 +46,22 @@ return array(
'no_limit' => 'Geen limiet',
'thin' => 'Smal',
),
+ '_' => 'Opmaak',
),
'profile' => array(
- '_' => 'Profiel beheer',
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => 'Account verwijderen',
'warn' => 'Uw account en alle gerelateerde gegvens worden verwijderd.',
+ '_' => 'Account verwijderen',
),
'email' => 'Email adres',
'password_api' => 'Wachtwoord API<br /><small>(e.g., voor mobiele apps)</small>',
'password_form' => 'Wachtwoord<br /><small>(voor de Web-formulier log in methode)</small>',
'password_format' => 'Ten minste 7 tekens',
'title' => 'Profiel',
+ '_' => 'Profiel beheer',
),
'query' => array(
- '_' => 'Gebruikersquery\'s (informatie aanvragen)',
'deprecated' => 'Deze query (informatie aanvraag) is niet langer geldig. De bedoelde categorie of feed is al verwijderd.',
'display' => 'Queryresultaten weergeven',
'filter' => 'Filter toegepast:',
@@ -69,8 +69,8 @@ return array(
'get_category' => 'Toon "%s" categorie',
'get_favorite' => 'Toon favoriete artikelen',
'get_feed' => 'Toon "%s" feed',
- 'no_filter' => 'Geen filter',
'none' => 'U hebt nog geen gebruikers query aangemaakt..',
+ 'no_filter' => 'Geen filter',
'number' => 'Query n°%d',
'order_asc' => 'Toon oudste artikelen eerst',
'order_desc' => 'Toon nieuwste artikelen eerst',
@@ -93,9 +93,9 @@ return array(
'state_14' => 'Toon ongelezen artikelen',
'state_15' => 'Toon alle artikelen',
'title' => 'Gebruikersquery\'s',
+ '_' => 'Gebruikersquery\'s (informatie aanvragen)',
),
'reading' => array(
- '_' => 'Lezen',
'after_onread' => 'Na “markeer alles als gelezen”,',
'articles_per_page' => 'Aantal artikelen per pagina',
'auto_load_more' => 'Laad volgende artikel onderaan de pagina',
@@ -116,16 +116,16 @@ return array(
'when' => 'Markeer artikel als gelezen…',
),
'show' => array(
- '_' => 'Artikelen om te tonen',
'adaptive' => 'Pas weergave aan',
'all_articles' => 'Bekijk alle artikelen',
'unread' => 'Bekijk alleen ongelezen',
+ '_' => 'Artikelen om te tonen',
),
'sides_close_article' => 'Sluit het artikel door buiten de artikeltekst te klikken',
'sort' => array(
- '_' => 'Sorteer volgorde',
'newer_first' => 'Nieuwste eerst',
'older_first' => 'Oudste eerst',
+ '_' => 'Sorteer volgorde',
),
'sticky_post' => 'Koppel artikel aan de bovenkant als het geopend wordt',
'title' => 'Lees modus',
@@ -135,9 +135,9 @@ return array(
'normal' => 'Normale weergave',
'reader' => 'Lees weergave',
),
+ '_' => 'Lezen',
),
'sharing' => array(
- '_' => 'Delen',
'add' => 'Deelmethode toevoegen',
'blogotext' => 'Blogotext',
'diaspora' => 'Diaspora*',
@@ -152,9 +152,9 @@ return array(
'title' => 'Delen',
'twitter' => 'Twitter',
'wallabag' => 'wallabag',
+ '_' => 'Delen',
),
'shortcut' => array(
- '_' => 'Snelkoppelingen',
'article_action' => 'Artikelacties',
'auto_share' => 'Delen',
'auto_share_help' => 'Als er slechts één deelmethode is, dan wordt die gebruikt. Anders zijn ze toegankelijk met hun nummer.',
@@ -186,6 +186,7 @@ return array(
'user_filter' => 'Toegang gebruikers filters',
'user_filter_help' => 'Als er slechts één gebruikersfilter is, dan wordt die gebruikt. Anders zijn ze toegankelijk met hun nummer.',
'views' => 'Aanzichten',
+ '_' => 'Snelkoppelingen',
),
'user' => array(
'articles_and_size' => '%s artikelen (%s)',
diff --git a/app/i18n/nl/feedback.php b/app/i18n/nl/feedback.php
index 97e1a71b8..273441805 100644
--- a/app/i18n/nl/feedback.php
+++ b/app/i18n/nl/feedback.php
@@ -1,13 +1,19 @@
<?php
-/* Dutch translation by Wanabo. http://www.nieuwskop.be */
+
return array(
- 'admin' => array(
- 'optimization_complete' => 'Optimalisatie compleet',
- ),
'access' => array(
'denied' => 'U hebt geen rechten om deze pagina te bekijken.',
'not_found' => 'Deze pagina bestaat niet',
),
+ 'admin' => array(
+ 'optimization_complete' => 'Optimalisatie compleet',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => 'Er is een probleem opgetreden tijdens de controle van de systeemconfiguratie. Probeer het later nog eens.',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s kan niet worden ingeschakeld. <a href="%s">Controleer FreshRSS log bestanden</a> voor details.',
'ok' => '%s is nn ingeschakeld',
),
- 'no_access' => 'U hebt geen toegang voor %s',
'not_enabled' => '%s is nog niet ingeschakeld',
'not_found' => '%s bestaat niet',
+ 'no_access' => 'U hebt geen toegang voor %s',
),
'import_export' => array(
'export_no_zip_extension' => 'ZIP uitbreiding is niet aanwezig op uw server. Exporteer a.u.b. uw bestanden één voor één.',
@@ -66,10 +72,10 @@ return array(
'emptied' => 'Categorie is leeg gemaakt',
'error' => 'Categorie kan niet worden vernieuwd',
'name_exists' => 'Categorie naam bestaat al.',
- 'no_id' => 'U moet de id specificeren of de categorie.',
- 'no_name' => 'Categorie naam mag niet leeg zijn.',
'not_delete_default' => 'U kunt de standaard categorie niet verwijderen!',
'not_exist' => 'De categorie bestaat niet!',
+ 'no_id' => 'U moet de id specificeren of de categorie.',
+ 'no_name' => 'Categorie naam mag niet leeg zijn.',
'over_max' => 'Maximum aantal categorieën bereikt (%d)',
'updated' => 'Categorie vernieuwd.',
),
@@ -82,10 +88,10 @@ return array(
'error' => 'Feed kan niet worden vernieuwd',
'internal_problem' => 'De feed kon niet worden toegevoegd. <a href="%s">Controleer de FreshRSS-logbestanden</a> voor details. Toevoegen forceren kan worden geprobeerd door <code>#force_feed</code> aan de URL toe te voegen.',
'invalid_url' => 'URL <em>%s</em> is ongeldig',
+ 'not_added' => '<em>%s</em> kon niet worden toegevoegd',
+ 'no_refresh' => 'Er is geen feed om te vernieuwen…',
'n_actualized' => '%d feeds zijn vernieuwd',
'n_entries_deleted' => '%d artikelen zijn verwijderd',
- 'no_refresh' => 'Er is geen feed om te vernieuwen…',
- 'not_added' => '<em>%s</em> kon niet worden toegevoegd',
'over_max' => 'Maximum aantal feeds bereikt (%d)',
'updated' => 'Feed is vernieuwd',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => 'Gebruiker %s is aangemaakt',
'error' => 'Gebruiker %s kan niet worden aangemaakt',
+ '_' => 'Gebruiker %s is aangemaakt',
),
'deleted' => array(
- '_' => 'Gebruiker %s is verwijderd',
'error' => 'Gebruiker %s kan niet worden verwijderd',
+ '_' => 'Gebruiker %s is verwijderd',
),
'updated' => array(
- '_' => 'Gebruiker %s is bijgewerkt',
'error' => 'Gebruiker %s kan niet worden bijgewerkt',
+ '_' => 'Gebruiker %s is bijgewerkt',
),
),
);
diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php
index fdbb866fc..55937b378 100644
--- a/app/i18n/nl/gen.php
+++ b/app/i18n/nl/gen.php
@@ -16,6 +16,7 @@ return array(
'manage' => 'Beheren',
'mark_favorite' => 'Markeer als favoriet',
'mark_read' => 'Markeer als gelezen',
+ 'purge' => 'Purge', // TODO - Translation
'remove' => 'Verwijder',
'see_website' => 'Bekijk website',
'submit' => 'Opslaan',
@@ -29,19 +30,19 @@ return array(
'login' => 'Log in',
'logout' => 'Log uit',
'password' => array(
- '_' => 'Wachtwoord',
'format' => '<small>Ten minste 7 tekens</small>',
+ '_' => 'Wachtwoord',
),
'registration' => array(
- '_' => 'Nieuw account',
'ask' => 'Maak een account?',
'title' => 'Account maken',
+ '_' => 'Nieuw account',
),
'reset' => 'Authenticatie reset',
'username' => array(
- '_' => 'Gebruikersnaam',
'admin' => 'Beheerdersgebruikersnaam',
'format' => '<small>maximaal 16 alfanumerieke tekens</small>',
+ '_' => 'Gebruikersnaam',
),
),
'date' => array(
@@ -64,8 +65,8 @@ return array(
'Jan' => '\\J\\a\\n\\u\\a\\r\\i',
'jan' => 'jan',
'january' => 'Jan',
- 'Jul' => '\\J\\u\\l\\i',
'jul' => 'jul',
+ 'Jul' => '\\J\\u\\l\\i',
'july' => 'Jul',
'Jun' => '\\J\\u\\n\\i',
'jun' => 'jun',
@@ -75,8 +76,8 @@ return array(
'last_month' => 'Vorige maand',
'last_week' => 'Vorige week',
'last_year' => 'Vorig jaar',
- 'Mar' => '\\M\\a\\a\\r\\t',
'mar' => 'mrt',
+ 'Mar' => '\\M\\a\\a\\r\\t',
'march' => 'Mrt',
'May' => '\\M\\e\\i',
'may' => 'Mei',
@@ -101,8 +102,8 @@ return array(
'yesterday' => 'Gisteren',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => 'Over FreshRSS',
+ '_' => 'FreshRSS',
),
'js' => array(
'category_empty' => 'Lege categorie',
@@ -129,6 +130,7 @@ return array(
'oc' => 'Occitan',
'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
+ 'sk' => 'Slovenčina',
'tr' => 'Türkçe',
'zh-cn' => '简体中文',
),
@@ -170,8 +172,24 @@ return array(
'years' => 'jaren',
),
'share' => array(
+ 'blogotext' => 'Blogotext',
+ 'diaspora' => 'Diaspora*',
'email' => 'Email',
+ 'facebook' => 'Facebook',
+ 'gnusocial' => 'GNU social',
+ 'jdh' => 'Journal du hacker',
'Known' => 'Known-gebaseerde sites',
+ 'lemmy' => 'Lemmy',
+ 'linkedin' => 'LinkedIn',
+ 'mastodon' => 'Mastodon',
+ 'movim' => 'Movim',
+ 'pinboard' => 'Pinboard',
+ 'pocket' => 'Pocket',
+ 'print' => 'Print',
+ 'shaarli' => 'Shaarli',
+ 'twitter' => 'Twitter',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
),
'short' => array(
'attention' => 'Attentie!',
diff --git a/app/i18n/nl/index.php b/app/i18n/nl/index.php
index 22720f927..e6a1658fe 100644
--- a/app/i18n/nl/index.php
+++ b/app/i18n/nl/index.php
@@ -1,8 +1,7 @@
<?php
-/* Dutch translation by Wanabo. http://www.nieuwskop.be */
+
return array(
'about' => array(
- '_' => 'Over',
'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
'bugs_reports' => 'Rapporteer fouten',
'credits' => 'Waarderingen',
@@ -14,23 +13,21 @@ return array(
'title' => 'Over',
'version' => 'Versie',
'website' => 'Website',
- ),
- 'tos' => array(
- 'title' => 'Gebruiksvoorwaarden',
+ '_' => 'Over',
),
'feed' => array(
'add' => 'U kunt wat feeds toevoegen.',
'empty' => 'Er is geen artikel om te laten zien.',
'rss_of' => 'RSS-feed van %s',
'title' => 'Overzicht RSS-feeds',
- 'title_global' => 'Globale weergave',
'title_fav' => 'Uw favorieten',
+ 'title_global' => 'Globale weergave',
),
'log' => array(
- '_' => 'Log bestanden',
'clear' => 'Leeg de log bestanden',
'empty' => 'Log bestand is leeg',
'title' => 'Log bestanden',
+ '_' => 'Log bestanden',
),
'menu' => array(
'about' => 'Over FreshRSS',
@@ -63,4 +60,7 @@ return array(
'tag' => array(
'related' => 'Verwante labels',
),
+ 'tos' => array(
+ 'title' => 'Gebruiksvoorwaarden',
+ ),
);
diff --git a/app/i18n/nl/install.php b/app/i18n/nl/install.php
index 6597c8146..6834bf352 100644
--- a/app/i18n/nl/install.php
+++ b/app/i18n/nl/install.php
@@ -1,5 +1,5 @@
<?php
-/* Dutch translation by Wanabo. http://www.nieuwskop.be */
+
return array(
'action' => array(
'finish' => 'Completeer installatie',
@@ -17,20 +17,19 @@ return array(
'type' => 'Authenticatiemethode',
),
'bdd' => array(
- '_' => 'Database',
'conf' => array(
- '_' => 'Database configuratie',
'ko' => 'Controleer uw database informatie.',
'ok' => 'Database configuratie is opgeslagen.',
+ '_' => 'Database configuratie',
),
'host' => 'Host',
'password' => 'Database wachtwoord',
'prefix' => 'Tabel voorvoegsel',
'type' => 'Type database',
'username' => 'Database gebruikersnaam',
+ '_' => 'Database',
),
'check' => array(
- '_' => 'Controles',
'already_installed' => 'We hebben geconstateerd dat FreshRSS al is geïnstallerd!',
'cache' => array(
'nok' => 'Controleer permissies van de <em>./data/cache</em> map. HTTP server moet rechten hebben om er in te kunnen schrijven',
@@ -96,10 +95,11 @@ return array(
'nok' => 'U mist de benodigde bibliotheek om XML te gebruiken.',
'ok' => 'U hebt de benodigde bibliotheek om XML te gebruiken.',
),
+ '_' => 'Controles',
),
'conf' => array(
- '_' => 'Algemene configuratie',
'ok' => 'Algemene configuratie is opgeslagen.',
+ '_' => 'Algemene configuratie',
),
'congratulations' => 'Gefeliciteerd!',
'default_user' => 'Gebruikersnaam van de standaardgebruiker <small>(maximaal 16 alfanumerieke tekens)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => 'U zal uw vorige configuratie kwijtraken door FreshRSS opnieuw te installeren. Weet u zeker dat u verder wilt gaan?',
),
'language' => array(
- '_' => 'Taal',
'choose' => 'Kies een taal voor FreshRSS',
'defined' => 'Taal is bepaald.',
+ '_' => 'Taal',
),
'not_deleted' => 'Er ging iets fout! U moet het bestand <em>%s</em> handmatig verwijderen.',
'ok' => 'De installatieprocedure is geslaagd.',
'step' => 'stap %d',
'steps' => 'Stappen',
- 'title' => 'Installatie · FreshRSS',
'this_is_the_end' => 'Dit is het einde',
+ 'title' => 'Installatie · FreshRSS',
);
diff --git a/app/i18n/nl/sub.php b/app/i18n/nl/sub.php
index 8a3af6064..fe8f5362a 100644
--- a/app/i18n/nl/sub.php
+++ b/app/i18n/nl/sub.php
@@ -1,5 +1,5 @@
<?php
-/* Dutch translation by Wanabo. http://www.nieuwskop.be */
+
return array(
'api' => array(
'documentation' => 'Kopieer de volgende URL om deze in een externe toepassing te gebruiken.',
@@ -11,7 +11,6 @@ return array(
'title' => 'Bookmarklet',
),
'category' => array(
- '_' => 'Categorie',
'add' => 'Voeg categorie toe',
'archiving' => 'Archiveren',
'empty' => 'Lege categorie',
@@ -20,6 +19,7 @@ return array(
'position' => 'Weergavepositie',
'position_help' => 'Om de categorieweergave-sorteervolgorde te controleren',
'title' => 'Titel',
+ '_' => 'Categorie',
),
'feed' => array(
'add' => 'Voeg een RSS-feed toe',
@@ -39,8 +39,8 @@ return array(
'empty' => 'Deze feed is leeg. Controleer of deze nog actueel is.',
'error' => 'Deze feed heeft problemen. Verifieer a.u.b het doeladres en actualiseer het.',
'filteractions' => array(
- '_' => 'Filteracties',
'help' => 'Voer één zoekfilter per lijn in.',
+ '_' => 'Filteracties',
),
'information' => 'Informatie',
'keep_min' => 'Minimum aantal artikelen om te houden',
@@ -49,12 +49,11 @@ return array(
'no_selected' => 'Geen feed geselecteerd.',
'number_entries' => '%d artikelen',
'priority' => array(
- '_' => 'Zichtbaarheid',
'archived' => 'Niet weergeven (gearchiveerd)',
'main_stream' => 'Zichtbaar in het overzicht',
'normal' => 'Toon in categorie',
+ '_' => 'Zichtbaarheid',
),
- 'websub' => 'Directe notificaties met WebSub',
'show' => array(
'all' => 'Alle feeds tonen',
'error' => 'Alleen feeds met een foutmelding tonen',
@@ -72,6 +71,7 @@ return array(
'url' => 'Feed-url',
'validator' => 'Controleer de geldigheid van de feed',
'website' => 'Website-url',
+ 'websub' => 'Directe notificaties met WebSub',
),
'firefox' => array(
'documentation' => 'Volg de stappen die <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">hier</a> beschreven worden om FreshRSS aan de Firefox-nieuwslezerlijst toe te voegen.',
@@ -80,9 +80,9 @@ return array(
),
'import_export' => array(
'export' => 'Exporteer',
+ 'export_labelled' => 'Exporteer gelabelde artikels',
'export_opml' => 'Exporteer lijst van feeds (OPML)',
'export_starred' => 'Exporteer je favorieten',
- 'export_labelled' => 'Exporteer gelabelde artikels',
'feed_list' => 'Lijst van %s artikelen',
'file_to_import' => 'Bestand om te importeren<br />(OPML, JSON of ZIP)',
'file_to_import_no_zip' => 'Bestand om te importeren<br />(OPML of JSON)',
@@ -97,8 +97,8 @@ return array(
'subscription_tools' => 'Hulpmiddelen voor abonnementen',
),
'title' => array(
- '_' => 'Abonnementenbeheer',
'feed_management' => 'RSS-feedbeheer',
'subscription_tools' => 'Hulpmiddelen voor abonnementen',
+ '_' => 'Abonnementenbeheer',
),
);
diff --git a/app/i18n/nl/user.php b/app/i18n/nl/user.php
index f98a6b2fd..67615694e 100644
--- a/app/i18n/nl/user.php
+++ b/app/i18n/nl/user.php
@@ -22,16 +22,16 @@ return array(
'title' => 'Emailadresvalidatie',
),
),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'De gebruiksvoorwaarden moeten worden geaccepteerd om te kunnen registeren.',
- ),
- ),
'mailer' => array(
'email_need_validation' => array(
+ 'body' => 'Je hebt je net geregistreerd op %s, maar je moet je email nog valideren. Volg daarvoor de link:',
'title' => 'Je account moet worden gevalideerd',
'welcome' => 'Welkom %s,',
- 'body' => 'Je hebt je net geregistreerd op %s, maar je moet je email nog valideren. Volg daarvoor de link:',
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'De gebruiksvoorwaarden moeten worden geaccepteerd om te kunnen registeren.',
),
),
);
diff --git a/app/i18n/oc/admin.php b/app/i18n/oc/admin.php
index 1fb8d5c3a..f27014fca 100644
--- a/app/i18n/oc/admin.php
+++ b/app/i18n/oc/admin.php
@@ -83,9 +83,9 @@ return array(
'ok' => 'Avètz PDO e almens un des drivers compatibles (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'Installacion PHP',
'nok' => 'Vòstra version PHP es la %s más FreshRSS demanda almens la versión %s.',
'ok' => 'Vòstra version PHP es %s, qu’es compatibla amb FreshRSS.',
+ '_' => 'Installacion PHP',
),
'tables' => array(
'nok' => 'Manca una o mai tabla dins la basa de donadas.',
@@ -116,16 +116,15 @@ return array(
'name' => 'Nom',
'no_configure_view' => 'Aquesta extension se pòt pas configurar.',
'system' => array(
- '_' => 'Extensions sistèma',
'no_rights' => 'Extensions sistèma (contrarotlat per l’administrator)',
+ '_' => 'Extensions sistèma',
),
'title' => 'Extensions',
'update' => 'Mesa a jorn disponibla',
'user' => 'Extensions utilizaire',
- 'version' => 'Version',
+ 'version' => 'Version', // TODO - Translation
),
'stats' => array(
- '_' => 'Estatisticas',
'all_feeds' => 'Totes los fluxes',
'category' => 'Categoria',
'entry_count' => 'Nombre d’articles',
@@ -151,13 +150,13 @@ return array(
'repartition' => 'Reparticion dels articles',
'status_favorites' => 'Favorits',
'status_read' => 'Legit',
- 'status_total' => 'Total',
+ 'status_total' => 'Total', // TODO - Translation
'status_unread' => 'Pas legits',
'title' => 'Estatisticas',
'top_feed' => 'Los dètz fluxes mai gròsses',
+ '_' => 'Estatisticas',
),
'system' => array(
- '_' => 'Configuracion sistèma',
'auto-update-url' => 'URL del servici de mesa a jorn',
'cookie-duration' => array(
'help' => 'en segondas',
@@ -168,24 +167,31 @@ return array(
'max-categories' => 'Limita de categoria per utilizaire',
'max-feeds' => 'Limita de fluxes per utilizaire',
'registration' => array(
- 'number' => 'Nombre max de comptes',
'help' => '0 vòl dire qu’i a pas cap de limita de compte',
+ 'number' => 'Nombre max de comptes',
),
+ '_' => 'Configuracion sistèma',
),
'update' => array(
- '_' => 'Sistèma de mesa a jorn',
'apply' => 'Aplicar',
'check' => 'Verificar las mesas a jorn',
'current_version' => 'Vòstra version actuala de FreshRSS es %s.',
'last' => 'Darrièra verificacion : %s',
'none' => 'Cap d’actualizacion d’aplicar',
'title' => 'Sistèma de mesa a jorn',
+ '_' => 'Sistèma de mesa a jorn',
),
'user' => array(
'articles_and_size' => '%s articles (%s)',
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => 'Crear un nòu utilizaire',
+ 'database_size' => 'Database size', // TODO - Translation
'delete_users' => 'Suprimir un utilizaire',
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => 'Lenga',
+ 'list' => 'User list', // TODO - Translation
'number' => '%d compte ja creat',
'numbers' => '%d comptes ja creats',
'password_form' => 'Senhal <br /><small>(ex. : per la connexion via formulari)</small>',
@@ -193,8 +199,8 @@ return array(
'selected' => 'Utilizaire seleccionat',
'title' => 'Gestion dels utilizaires',
'update_users' => 'Actualizar un utilizaire',
- 'user_list' => 'Lista dels utilizaires',
'username' => 'Nom d’utilizaire',
'users' => 'Utilizaires',
+ 'user_list' => 'Lista dels utilizaires',
),
);
diff --git a/app/i18n/oc/conf.php b/app/i18n/oc/conf.php
index e123c03c5..ed0673083 100644
--- a/app/i18n/oc/conf.php
+++ b/app/i18n/oc/conf.php
@@ -2,14 +2,14 @@
return array(
'archiving' => array(
- '_' => 'Archius',
- 'advanced' => 'Avançat',
'delete_after' => 'Levar los articles aprèp',
'exception' => 'Excepcion de purga',
'help' => 'Mai d’opcions son disponiblas dins la configuracion individuala dels fluxes',
'keep_favourites' => 'Jamai suprimir los favorits',
- 'keep_min_by_feed' => 'Nombre minimum d’articles de servar per flux',
'keep_labels' => 'Jamai suprimir las etiquetas',
+ 'keep_max' => 'Nombre maximum d’articles de gardar',
+ 'keep_min_by_feed' => 'Nombre minimum d’articles de servar per flux',
+ 'keep_period' => 'Atge maximum dels articles de gardar',
'keep_unreads' => 'Jamai suprimir los pas legits',
'maintenance' => 'Entreten',
'optimize' => 'Optimizar la basa de donada',
@@ -17,20 +17,18 @@ return array(
'policy' => 'Politica de purga',
'policy_warning' => 'Se cap de politica de purga es pas seleccionada, totes los articles seràn gardats',
'purge_now' => 'Purgar ara',
- 'keep_max' => 'Nombre maximum d’articles de gardar',
- 'keep_period' => 'Atge maximum dels articles de gardar',
'title' => 'Archius',
'ttl' => 'Actualizar pas automaticament mai sovent que',
+ '_' => 'Archius',
),
'display' => array(
- '_' => 'Afichatge',
'icon' => array(
'bottom_line' => 'Linha enbàs',
+ 'display_authors' => 'Autors',
'entry' => 'Icònas d’article',
'publication_date' => 'Data de publicacion',
'related_tags' => 'Etiquetas ligadas',
'sharing' => 'Partatge',
- 'display_authors' => 'Autors',
'top_line' => 'Linha amont',
),
'language' => 'Lenga',
@@ -48,21 +46,22 @@ return array(
'no_limit' => 'Cap de limit',
'thin' => 'Fina',
),
+ '_' => 'Afichatge',
),
'profile' => array(
- '_' => 'Gestion del perfil',
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => 'Supression del compte',
'warn' => 'Lo compte e totas las donadas ligadas seràn suprimits.',
+ '_' => 'Supression del compte',
),
'email' => 'Adreça de corrièl',
'password_api' => 'Senhal API<br /><small>(ex. : per las aplicacions mobil)</small>',
'password_form' => 'Senhal API<br /><small>(ex. : per la connexion via formulari)</small>',
'password_format' => 'Almens 7 caractèrs',
'title' => 'Pefil',
+ '_' => 'Gestion del perfil',
),
'query' => array(
- '_' => 'Filtres utilizaires',
'deprecated' => 'Aqueste filtre es pas valid. La categoria o lo flux concernit es estat suprimit.',
'display' => 'Mostrar los resultats del filtre',
'filter' => 'Filtres aplicats :',
@@ -70,8 +69,8 @@ return array(
'get_category' => 'Mostrar la categoria « %s »',
'get_favorite' => 'Mostrar los articles favorits',
'get_feed' => 'Mostrar lo flux « %s »',
- 'no_filter' => 'Cap de filtre aplicat',
'none' => 'Avètz pas encara creat cap de filtre.',
+ 'no_filter' => 'Cap de filtre aplicat',
'number' => 'Filtre n°%d',
'order_asc' => 'Mostrar los articles mai ancians en primièr',
'order_desc' => 'Mostrar los articles mai recents en primièr',
@@ -94,9 +93,9 @@ return array(
'state_14' => 'Mostrar los articles pas legits',
'state_15' => 'Mostrar totes los articles',
'title' => 'Filtres utilizaire',
+ '_' => 'Filtres utilizaires',
),
'reading' => array(
- '_' => 'Lectura',
'after_onread' => 'Aprèp « marcar coma legit »,',
'articles_per_page' => 'Nombre d’articles per pagina',
'auto_load_more' => 'Cargar los articles seguents enbàs de la pagina',
@@ -117,16 +116,16 @@ return array(
'when' => 'Marcar un article coma legit…',
),
'show' => array(
- '_' => 'Articles de mostrar',
'adaptive' => 'Adaptar l’afichatge',
'all_articles' => 'Mostrar totes los articles',
'unread' => 'Mostrar pas que los pas legits',
+ '_' => 'Articles de mostrar',
),
'sides_close_article' => 'Clicar fòra de la zòna de tèxte tampa l’article',
'sort' => array(
- '_' => 'Òrdre de tria',
'newer_first' => 'Mai recents en primièr',
'older_first' => 'Mai ancians en primièr',
+ '_' => 'Òrdre de tria',
),
'sticky_post' => 'Gardar l’article amont quand es dobèrt',
'title' => 'Lectura',
@@ -136,9 +135,9 @@ return array(
'normal' => 'Vista normala',
'reader' => 'Vista lectura',
),
+ '_' => 'Lectura',
),
'sharing' => array(
- '_' => 'Partatge',
'add' => 'Ajustar un metòde de partatge',
'blogotext' => 'Blogotext',
'diaspora' => 'Diaspora*',
@@ -153,9 +152,9 @@ return array(
'title' => 'Partatge',
'twitter' => 'Twitter',
'wallabag' => 'wallabag',
+ '_' => 'Partatge',
),
'shortcut' => array(
- '_' => 'Acorchis',
'article_action' => 'Accions ligadas a l’article',
'auto_share' => 'Partejar',
'auto_share_help' => 'S’i a pas qu’un mòde de partatge, aquel serà utilizat. Autrament los mòdes son accessibles per lor numèro.',
@@ -187,6 +186,7 @@ return array(
'user_filter' => 'Accedir als filtres utilizaire',
'user_filter_help' => 'S’i a pas qu’un filtre utilizaire, aquel serà utilizat. Autrament los filtres son accessibles per lor numèro.',
'views' => 'Vistas',
+ '_' => 'Acorchis',
),
'user' => array(
'articles_and_size' => '%s articles (%s)',
diff --git a/app/i18n/oc/feedback.php b/app/i18n/oc/feedback.php
index 7f7d05dbd..feb220a69 100644
--- a/app/i18n/oc/feedback.php
+++ b/app/i18n/oc/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => 'Optimizacion acabada',
- ),
'access' => array(
'denied' => 'Avètz pas l’autorizacion d’accedir a aquesta pagina',
'not_found' => 'La pagina que cercatz existís pas',
),
+ 'admin' => array(
+ 'optimization_complete' => 'Optimizacion acabada',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => 'Un problèma es aparegut pendent la configuracion del sistèma d’autentificacion. Tonatz ensajar ai tard.',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s pòt pas èsser activada. <a href="%s">Consultatz los jornals d’audit de FreshRSS logs</a> per mai de detalhs.',
'ok' => '%s es ara activada',
),
- 'no_access' => 'Avètz pas accès sus %s',
'not_enabled' => '%s es pas encara activada',
'not_found' => '%s existís pas',
+ 'no_access' => 'Avètz pas accès sus %s',
),
'import_export' => array(
'export_no_zip_extension' => 'L\'extension ZIP es pas presenta sul servidor. Volgatz ensajar d\'exportar los fichièrs un per un.',
@@ -66,10 +72,10 @@ return array(
'emptied' => 'La categoria es estada voidada',
'error' => 'Actualizacion de la categoria impossibla',
'name_exists' => 'Una categoria se ditz ja atal.',
- 'no_id' => 'Vos cal precisar l’id de la categoria.',
- 'no_name' => 'Vos cal donar un nom a la categoria.',
'not_delete_default' => 'Podètz pas suprimir la categoria per defaut !',
'not_exist' => 'Aquesta categoria existís pas !',
+ 'no_id' => 'Vos cal precisar l’id de la categoria.',
+ 'no_name' => 'Vos cal donar un nom a la categoria.',
'over_max' => 'Avètz atengut la limita de categoria (%d)',
'updated' => 'La categoria es estada actualizada.',
),
@@ -80,12 +86,12 @@ return array(
'already_subscribed' => 'Seguissètz ja <em>%s</em>',
'deleted' => 'Lo flux es suprimit',
'error' => 'Error en actualizar',
- 'internal_problem' => 'Lo flux pòt pas èsser ajustat. <a href="%s">Consultatz los jornals d’audit de FreshRSS</a> per ne saber mai. Podètz forçar l’apondon en ajustant <code>#force_feed</code> a l’URL.',
+ 'internal_problem' => 'Lo flux pòt pas èsser ajustat. <a href="%s">Consultatz los jornals d’audit de FreshRSS</a> per ne saber mai. Podètz forçar l’apondon en ajustant <code>#force_feed</code> a l’URL.',
'invalid_url' => 'L\'URL <em>%s</em> es invalida',
+ 'not_added' => '<em>%s</em> a pas pogut èsser ajustat',
+ 'no_refresh' => 'I a pas cap de flux d’actualizar…',
'n_actualized' => '%s fluxes son estats actualizats',
'n_entries_deleted' => '%d articles son estats suprimits',
- 'no_refresh' => 'I a pas cap de flux d’actualizar…',
- 'not_added' => '<em>%s</em> a pas pogut èsser ajustat',
'over_max' => 'Avètz atengut vòstra limita de fluxes (%d)',
'updated' => 'Lo flux es actualizat',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => 'L’utilizaire %s es estat creat',
'error' => 'L’utilizaire %s pòt pas èsser creat',
+ '_' => 'L’utilizaire %s es estat creat',
),
'deleted' => array(
- '_' => 'L’utilizaire %s es estat suprimit',
'error' => 'L’utilizaire %s pòt pas èsser suprimit',
+ '_' => 'L’utilizaire %s es estat suprimit',
),
'updated' => array(
- '_' => 'L’utilizaire %s es estat actualizat',
'error' => 'L’utilizaire %s es pas estat actualizat',
+ '_' => 'L’utilizaire %s es estat actualizat',
),
),
);
diff --git a/app/i18n/oc/gen.php b/app/i18n/oc/gen.php
index a5bd003c2..7bf851e59 100644
--- a/app/i18n/oc/gen.php
+++ b/app/i18n/oc/gen.php
@@ -16,6 +16,7 @@ return array(
'manage' => 'Gerir',
'mark_favorite' => 'Ajustar als favorits',
'mark_read' => 'Marcar coma legit',
+ 'purge' => 'Purge', // TODO - Translation
'remove' => 'Levar',
'see_website' => 'Veire lo site',
'submit' => 'Mandar',
@@ -29,19 +30,19 @@ return array(
'login' => 'Connexion',
'logout' => 'Se desconnectar',
'password' => array(
- '_' => 'Senhal',
'format' => '<small>Almens 7 caractèrs</small>',
+ '_' => 'Senhal',
),
'registration' => array(
- '_' => 'Compte nòu',
'ask' => 'Crear un compte?',
'title' => 'Creacion de compte',
+ '_' => 'Compte nòu',
),
'reset' => 'Reïnicializacion de l’autentificacion',
'username' => array(
- '_' => 'Nom d’utilizaire',
'admin' => 'Nom d’utilizaire administrator',
'format' => '<small>16 caractèrs alfanumerics maximum)</small>',
+ '_' => 'Nom d’utilizaire',
),
),
'date' => array(
@@ -59,13 +60,13 @@ return array(
'feb' => 'feb.',
'february' => 'febrièr',
'format_date' => 'j \\d\\e %s \\d\\e Y',
- 'format_date_hour' => 'j \\d\\e %s \\d\\e Y \\a H\:i',
+ 'format_date_hour' => 'j \\d\\e %s \\d\\e Y \\a H\\:i',
'fri' => 'dv',
'Jan' => '\\g\\e\\n\\i\\è\\r',
'jan' => 'gen.',
'january' => 'genièr',
- 'Jul' => '\\j\\u\\l\\h\\e\\t',
'jul' => 'julh',
+ 'Jul' => '\\j\\u\\l\\h\\e\\t',
'july' => 'julhet',
'Jun' => '\\j\\u\\n\\h',
'jun' => 'junh',
@@ -75,8 +76,8 @@ return array(
'last_month' => 'Dempuèi lo mes passat',
'last_week' => 'Dempuèi la setmana passada',
'last_year' => 'Dempuèi l’annada passada',
- 'Mar' => '\\m\\a\\r\\ç',
'mar' => 'març',
+ 'Mar' => '\\m\\a\\r\\ç',
'march' => 'març',
'May' => '\\m\\a\\i',
'may' => 'mai',
@@ -101,8 +102,8 @@ return array(
'yesterday' => 'Ièr',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => 'A prepaus de FreshRSS',
+ '_' => 'FreshRSS',
),
'js' => array(
'category_empty' => 'Categoria voida',
@@ -122,13 +123,14 @@ return array(
'en' => 'English',
'es' => 'Español',
'fr' => 'Français',
- 'he' => 'עברית',
+ 'he' => 'עברית', // TODO - Translation
'it' => 'Italiano',
'kr' => '한국어',
'nl' => 'Nederlands',
'oc' => 'Occitan',
'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
+ 'sk' => 'Slovenčina', // TODO - Translation
'tr' => 'Türkçe',
'zh-cn' => '简体中文',
),
@@ -178,11 +180,11 @@ return array(
'jdh' => 'Journal du hacker',
'Known' => 'Sites basats sus Known',
'lemmy' => 'Lemmy',
- 'linkedin' => 'LinkedIn',
- 'mastodon' => 'Mastodon',
+ 'linkedin' => 'LinkedIn', // TODO - Translation
+ 'mastodon' => 'Mastodon', // TODO - Translation
'movim' => 'Movim',
- 'pinboard' => 'Pinboard',
- 'pocket' => 'Pocket',
+ 'pinboard' => 'Pinboard', // TODO - Translation
+ 'pocket' => 'Pocket', // TODO - Translation
'print' => 'Imprimir',
'shaarli' => 'Shaarli',
'twitter' => 'Twitter',
diff --git a/app/i18n/oc/index.php b/app/i18n/oc/index.php
index 763d24139..0a6d2ed3a 100644
--- a/app/i18n/oc/index.php
+++ b/app/i18n/oc/index.php
@@ -2,35 +2,32 @@
return array(
'about' => array(
- '_' => 'A prepaus',
'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
'bugs_reports' => 'Senhalament de problèmas',
'credits' => 'Crèdits',
'credits_content' => 'Unes elements de l’estil venon del <a href="http://twitter.github.io/bootstrap/">projècte Bootstrap</a> encara que FreshRSS utilize pas aqueste framework. Las <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">icònas</a> venon del <a href="https://www.gnome.org/">projècte GNOME</a>. La polissa <em>Open Sans</em> utilizada foguèt creada per en <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a>. FreshRSS es basat sus <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, un framework PHP.',
'freshrss_description' => 'FreshRSS es un agregador de fluxes RSS per l’auto-albergar tal coma <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> o <a href="https://github.com/LeedRSS/Leed">Leed</a>. Sa tòca es d’èsser leugièr e de bon utilizar de prima abòrd mas tanben d’èsser potent e parametrable.',
- 'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">on Github</a>',
+ 'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">on Github</a>', // TODO - Translation
'license' => 'Licéncia',
'project_website' => 'Site del projècte',
'title' => 'A prepaus',
- 'website' => 'Site internet',
'version' => 'Version',
- ),
- 'tos' => array(
- 'title' => 'Condicions d’utilizacion',
+ 'website' => 'Site internet',
+ '_' => 'A prepaus',
),
'feed' => array(
'add' => 'Podètz ajustar de fluxes.',
'empty' => 'I a pas cap de flux de mostrar.',
'rss_of' => 'Flux RSS de %s',
'title' => 'Vòstres fluxes RSS',
- 'title_global' => 'Vista generala',
'title_fav' => 'Vòstres favorits',
+ 'title_global' => 'Vista generala',
),
'log' => array(
- '_' => 'Jornals d’audit',
'clear' => 'Escafar los jornals',
'empty' => 'Los jornals son voids',
'title' => 'Jornals d’audit',
+ '_' => 'Jornals d’audit',
),
'menu' => array(
'about' => 'A prepaus de FreshRSS',
@@ -63,4 +60,7 @@ return array(
'tag' => array(
'related' => 'Etiquetas ligadas',
),
+ 'tos' => array(
+ 'title' => 'Condicions d’utilizacion',
+ ),
);
diff --git a/app/i18n/oc/install.php b/app/i18n/oc/install.php
index 5d4639ab4..5bbbd6a4f 100644
--- a/app/i18n/oc/install.php
+++ b/app/i18n/oc/install.php
@@ -17,20 +17,19 @@ return array(
'type' => 'Mòde d’autentification',
),
'bdd' => array(
- '_' => 'Basa de donadas',
'conf' => array(
- '_' => 'Configuracion de la basa de donadas',
'ko' => 'Verificatz las informacions de la basa de donadas.',
'ok' => 'La configuracion de la basa de donadas es salvagarda.',
+ '_' => 'Configuracion de la basa de donadas',
),
'host' => 'Òste',
'password' => 'Senhal de la basa de donadas',
'prefix' => 'Prefixe de tabla',
'type' => 'Tipe de basa de donadas',
'username' => 'Nom d’utilizaire de la basa de donadas',
+ '_' => 'Basa de donadas',
),
'check' => array(
- '_' => 'Verificacions',
'already_installed' => 'Sembla que FreshRSS es ja installat !',
'cache' => array(
'nok' => 'Volgatz verificar los dreches sul repertòri <em>./data/cache</em>. Lo servidor HTTP deu poder escriure dedins',
@@ -96,10 +95,11 @@ return array(
'nok' => 'Impossible de trobar una bibliotèca necessària per XML.',
'ok' => 'Avètz la bibliotèca per percórrer los XML.',
),
+ '_' => 'Verificacions',
),
'conf' => array(
- '_' => 'Configuracion generala',
'ok' => 'La configuracion generala es enregistrada.',
+ '_' => 'Configuracion generala',
),
'congratulations' => 'Òsca !',
'default_user' => 'Nom d’utilizaire per defaut <small>16 caractèrs alfanumerics maximum)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => 'En reïnstallant FreshRSS perdretz la configuracion precedenta. Volètz vertadièrament contunhar ?',
),
'language' => array(
- '_' => 'Lenga',
'choose' => 'Causissètz la lenga per FreshRSS',
'defined' => 'La lenga es corrèctament definida.',
+ '_' => 'Lenga',
),
'not_deleted' => 'Quicòm a trucat, sembla qu’avètz suprimit <em>%s</em> a la man.',
'ok' => 'L’installacion s’es corrèctament passada.',
'step' => 'etapa %d',
'steps' => 'Etapas',
- 'title' => 'Installacion · FreshRSS',
'this_is_the_end' => 'Es la fin',
+ 'title' => 'Installacion · FreshRSS',
);
diff --git a/app/i18n/oc/sub.php b/app/i18n/oc/sub.php
index 98a7521eb..2c7e5bce5 100644
--- a/app/i18n/oc/sub.php
+++ b/app/i18n/oc/sub.php
@@ -1,8 +1,9 @@
<?php
+
return array(
'api' => array(
'documentation' => 'Copiatz l’URL seguenta per l’utilizaire dins d’una aisina extèrna.',
- 'title' => 'API',
+ 'title' => 'API', // TODO - Translation
),
'bookmarklet' => array(
'documentation' => 'Depausatz aqueste boton per la barra de marcapaginas o clicatz-lo a drecha e causissètz « Enregistrar aqueste ligam». Puèi clicatz «S’abonar» sus las paginas que volètz seguir.',
@@ -10,7 +11,6 @@ return array(
'title' => 'Bookmarklet',
),
'category' => array(
- '_' => 'Categoria',
'add' => 'Ajustar una categoria',
'archiving' => 'Archivar',
'empty' => 'Categoria voida',
@@ -19,6 +19,7 @@ return array(
'position' => 'Mostrar la posicion',
'position_help' => 'Per contrarotlar l’òrdre de tria de la categoria',
'title' => 'Títol',
+ '_' => 'Categoria',
),
'feed' => array(
'add' => 'Ajustar un flux RSS',
@@ -38,8 +39,8 @@ return array(
'empty' => 'Aqueste flux es void. Assegurats-vos qu’es totjorn mantengut.',
'error' => 'Aqueste flux a rescontrat un problèma. Volgatz verificar que siá totjorn accessible puèi actualizatz-lo.',
'filteractions' => array(
- '_' => 'Filtre d’accion',
'help' => 'Escrivètz una recèrca per linha.',
+ '_' => 'Filtre d’accion',
),
'information' => 'Informacions',
'keep_min' => 'Nombre minimum d’articles de servar',
@@ -48,12 +49,11 @@ return array(
'no_selected' => 'Cap de flux pas seleccionat.',
'number_entries' => '%d articles',
'priority' => array(
- '_' => 'Visibilitat',
'archived' => 'Mostrar pas (archivat)',
'main_stream' => 'Mostar al flux màger',
'normal' => 'Mostar dins sa categoria',
+ '_' => 'Visibilitat',
),
- 'websub' => 'Notificaciones instantáneas amb WebSub',
'show' => array(
'all' => 'Mostrar totes los fluxes',
'error' => 'Mostrar pas que los fluxes amb errors',
@@ -71,6 +71,7 @@ return array(
'url' => 'Flux URL',
'validator' => 'Verificar la validitat del flux',
'website' => 'URL del site',
+ 'websub' => 'Notificaciones instantáneas amb WebSub',
),
'firefox' => array(
'documentation' => 'Seguissètz las etapas descrichas <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">aquí</a> per ajustar FreshRSS a la lista dels lectors de flux de Firefox.',
@@ -79,16 +80,15 @@ return array(
),
'import_export' => array(
'export' => 'Exportar',
+ 'export_labelled' => 'Exportar los articles etiquetats',
'export_opml' => 'Exportar la lista de fluxes (OPML)',
'export_starred' => 'Exportar los favorits',
- 'export_labelled' => 'Exportar los articles etiquetats',
'feed_list' => 'Lista dels %s articles',
'file_to_import' => 'Fichièr d’importar<br />(OPML, JSON o ZIP)',
'file_to_import_no_zip' => 'Fichièr d’importar<br />(OPML o JSON)',
'import' => 'Importar',
'starred_list' => 'Lista dels articles favorits',
'title' => 'Importar / Exportar',
-
),
'menu' => array(
'bookmark' => 'Sabonar (marcapagina FreshRSS)',
@@ -97,8 +97,8 @@ return array(
'subscription_tools' => 'Aisinas d’abonament',
),
'title' => array(
- '_' => 'Gestion dels abonaments',
'feed_management' => 'Gestion dels fluxes RSS',
'subscription_tools' => 'Aisinas d’abonament',
+ '_' => 'Gestion dels abonaments',
),
);
diff --git a/app/i18n/oc/user.php b/app/i18n/oc/user.php
index 655aa052c..dbab5b898 100644
--- a/app/i18n/oc/user.php
+++ b/app/i18n/oc/user.php
@@ -22,16 +22,16 @@ return array(
'title' => 'Validacion de l’adreça electronica',
),
),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'Vos cal acceptar las condicions d’utilizacion per poder vos inscriure.',
- ),
- ),
'mailer' => array(
'email_need_validation' => array(
+ 'body' => 'Venètz de vos marcar sus %s mas vos cal encara validar l’adreça electronica. Per aquò far, seguissètz lo ligam :',
'title' => 'Vos cal validar vòstra adreça electronica',
'welcome' => 'La benvenguda %s,',
- 'body' => 'Venètz de vos marcar sus %s mas vos cal encara validar l’adreça electronica. Per aquò far, seguissètz lo ligam :',
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'Vos cal acceptar las condicions d’utilizacion per poder vos inscriure.',
),
),
);
diff --git a/app/i18n/pt-br/admin.php b/app/i18n/pt-br/admin.php
index cef6694c2..83639c01b 100644
--- a/app/i18n/pt-br/admin.php
+++ b/app/i18n/pt-br/admin.php
@@ -67,8 +67,8 @@ return array(
'ok' => 'Você tem a extensão JSON.',
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
'nok' => 'Não foi possível encontrar o framework Minz.',
@@ -83,9 +83,9 @@ return array(
'ok' => 'Você tem o PDO e ao menos um dos drivers suportados (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'Instação do PHP',
'nok' => 'Sua versão do PHP é %s mas FreshRSS requer ao menos a versão %s.',
'ok' => 'Sua versão do PHP é %s, que é compatível com o FreshRSS.',
+ '_' => 'Instação do PHP',
),
'tables' => array(
'nok' => 'Há uma ou mais tabelas inexistentes no banco de dados.',
@@ -106,26 +106,25 @@ return array(
),
),
'extensions' => array(
- 'author' => 'Author', //TODO - Translation
- 'community' => 'Available community extensions', //TODO - Translation
- 'description' => 'Description', //TODO - Translation
+ 'author' => 'Author', // TODO - Translation
+ 'community' => 'Available community extensions', // TODO - Translation
+ 'description' => 'Description', // TODO - Translation
'disabled' => 'Desabilitado',
'empty_list' => 'Não há extensões instaladas',
'enabled' => 'Habilitada',
- 'latest' => 'Installed', //TODO - Translation
- 'name' => 'Name', //TODO - Translation
+ 'latest' => 'Installed', // TODO - Translation
+ 'name' => 'Name', // TODO - Translation
'no_configure_view' => 'Esta extensão não pode ser configurada.',
'system' => array(
- '_' => 'Extensões do sistema',
'no_rights' => 'Extensões do sistema (Você não tem direitos para isto)',
+ '_' => 'Extensões do sistema',
),
'title' => 'Extensões',
- 'update' => 'Update available', //TODO - Translation
+ 'update' => 'Update available', // TODO - Translation
'user' => 'Extensões do usuário',
- 'version' => 'Version', //TODO - Translation
+ 'version' => 'Version', // TODO - Translation
),
'stats' => array(
- '_' => 'Estatísticas',
'all_feeds' => 'Todos os feeds',
'category' => 'Categoria',
'entry_count' => 'Contagem de entrada',
@@ -135,7 +134,7 @@ return array(
'entry_per_hour' => 'Por hora (média: %.2f mensagens)',
'entry_per_month' => 'Por mês(média: %.2f mensagens)',
'entry_repartition' => 'Repartição de entradas',
- 'feed' => 'Feed',
+ 'feed' => 'Feed', // TODO - Translation
'feed_per_category' => 'Feeds por categoria',
'idle' => 'Feeds inativos',
'main' => 'Estatísticas principais',
@@ -151,50 +150,57 @@ return array(
'repartition' => 'Repartição de artigos',
'status_favorites' => 'Favoritos',
'status_read' => 'Lido',
- 'status_total' => 'Total',
+ 'status_total' => 'Total', // TODO - Translation
'status_unread' => 'Não lidos',
'title' => 'Estatísticas',
'top_feed' => 'Top10 feeds',
+ '_' => 'Estatísticas',
),
'system' => array(
- '_' => 'Configuração do sistema',
'auto-update-url' => 'URL do servidor para atualização automática',
- 'force_email_validation' => 'Force email addresses validation', //TODO - Translation
+ 'cookie-duration' => array(
+ 'help' => 'in seconds', // TODO - Translation
+ 'number' => 'Duration to keep logged in', // TODO - Translation
+ ),
+ 'force_email_validation' => 'Force email addresses validation', // TODO - Translation
'instance-name' => 'Nome da instância',
'max-categories' => 'Limite de categorias por usuário',
'max-feeds' => 'Limite de Feeds por usuário',
- 'cookie-duration' => array(
- 'help' => 'in seconds', // @todo translate
- 'number' => 'Duration to keep logged in', // @todo translate
- ),
'registration' => array(
'help' => '0 significa que não há limite para a conta',
'number' => 'Máximo número de contas',
),
+ '_' => 'Configuração do sistema',
),
'update' => array(
- '_' => 'Atualização do sistema',
'apply' => 'Aplicar',
'check' => 'Buscar por novas atualizações',
'current_version' => 'Sua versão do FreshRSS é %s.',
'last' => 'Última verificação: %s',
'none' => 'Nenhuma atualização para se aplicar',
'title' => 'Sistema de atualização',
+ '_' => 'Atualização do sistema',
),
'user' => array(
'articles_and_size' => '%s artigos (%s)',
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => 'Criar novo usuário',
- 'delete_users' => 'Delete user', //TODO - Translation
+ 'database_size' => 'Database size', // TODO - Translation
+ 'delete_users' => 'Delete user', // TODO - Translation
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => 'Idioma',
+ 'list' => 'User list', // TODO - Translation
'number' => 'Há %d conta criada',
'numbers' => 'Há %d contas criadas',
'password_form' => 'Senha<br /><small>(para o login pelo método do formulário)</small>',
'password_format' => 'Ao menos 7 caracteres',
- 'selected' => 'Selected user', //TODO - Translation
+ 'selected' => 'Selected user', // TODO - Translation
'title' => 'Gerenciar usuários',
- 'update_users' => 'Update user', //TODO - Translation
- 'user_list' => 'Lista de usuários',
+ 'update_users' => 'Update user', // TODO - Translation
'username' => 'Usuário',
'users' => 'Usuários',
+ 'user_list' => 'Lista de usuários',
),
);
diff --git a/app/i18n/pt-br/conf.php b/app/i18n/pt-br/conf.php
index 5e43cc373..3f09e1837 100644
--- a/app/i18n/pt-br/conf.php
+++ b/app/i18n/pt-br/conf.php
@@ -2,34 +2,33 @@
return array(
'archiving' => array(
- '_' => 'Arquivar',
'delete_after' => 'Remover artigos depois',
- 'exception' => 'Purge exception', //TODO - Translation
+ 'exception' => 'Purge exception', // TODO - Translation
'help' => 'Mais opções estão disponíveis nas configurações individuais do feed',
- 'keep_favourites' => 'Never delete favourites', //TODO - Translation
+ 'keep_favourites' => 'Never delete favourites', // TODO - Translation
+ 'keep_labels' => 'Never delete labels', // TODO - Translation
+ 'keep_max' => 'Maximum number of articles to keep', // TODO - Translation
'keep_min_by_feed' => 'Número mínimo de artigos para deixar no feed',
- 'keep_labels' => 'Never delete labels', //TODO - Translation
- 'keep_unreads' => 'Never delete unreads', //TODO - Translation
- 'maintenance' => 'Maintenance', //TODO - Translation
+ 'keep_period' => 'Maximum age of articles to keep', // TODO - Translation
+ 'keep_unreads' => 'Never delete unreads', // TODO - Translation
+ 'maintenance' => 'Maintenance', // TODO - Translation
'optimize' => 'Otimizar banco de dados',
'optimize_help' => 'Faça ocasionalmente para reduzir o tamanho do banco de dados',
- 'policy' => 'Purge policy', //TODO - Translation
- 'policy_warning' => 'If no purge policy is selected, every article will be kept.', //TODO - Translation
+ 'policy' => 'Purge policy', // TODO - Translation
+ 'policy_warning' => 'If no purge policy is selected, every article will be kept.', // TODO - Translation
'purge_now' => 'Purge agora',
- 'keep_max' => 'Maximum number of articles to keep', //TODO - Translation
- 'keep_period' => 'Maximum age of articles to keep', //TODO - Translation
'title' => 'Arquivar',
'ttl' => 'Não atualize automaticamente mais frequente que',
+ '_' => 'Arquivar',
),
'display' => array(
- '_' => 'Exibição',
'icon' => array(
'bottom_line' => 'Linha inferior',
+ 'display_authors' => 'Authors', // TODO - Translation
'entry' => 'Ícones de artigos',
'publication_date' => 'Data da publicação',
- 'related_tags' => 'Tags relacionadas', //TODO - Translation
+ 'related_tags' => 'Tags relacionadas',
'sharing' => 'Compartilhar',
- 'display_authors' => 'Authors', //TODO - Translation
'top_line' => 'Linha superior',
),
'language' => 'Ídioma',
@@ -37,7 +36,7 @@ return array(
'seconds' => 'segundos (0 significa sem timeout)',
'timeout' => 'Notificação em HTML5 de timeout',
),
- 'show_nav_buttons' => 'Show the navigation buttons', //TODO - Translation
+ 'show_nav_buttons' => 'Show the navigation buttons', // TODO - Translation
'theme' => 'Tema',
'title' => 'Exibição',
'width' => array(
@@ -47,34 +46,35 @@ return array(
'no_limit' => 'Sem lmite',
'thin' => 'Fino',
),
+ '_' => 'Exibição',
),
'profile' => array(
- '_' => 'Gerenciamento de perfil',
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => 'Remover conta',
'warn' => 'Sua conta e todos os dados relacionados serão removidos.',
+ '_' => 'Remover conta',
),
'email' => 'Endereço de e-mail',
'password_api' => 'Senha da API<br /><small>(p.s., para aplicativos móveis)</small>',
'password_form' => 'Senha<br /><small>(para o método de formulário web)</small>',
'password_format' => 'Ao menos 7 caracteres',
'title' => 'Perfil',
+ '_' => 'Gerenciamento de perfil',
),
'query' => array(
- '_' => 'Queries do usuário',
'deprecated' => 'Esta não é mais válida. A categoria ou feed relacionado foi deletado.',
- 'display' => 'Display user query results', //TODO - Translation
+ 'display' => 'Display user query results', // TODO - Translation
'filter' => 'Filtro aplicado:',
'get_all' => 'Mostrar todos os artigos',
'get_category' => 'Visualizar "%s" categoria',
'get_favorite' => 'Visualizar artigos favoritos',
'get_feed' => 'Visualizar "%s" feed',
- 'no_filter' => 'Sem filtro',
'none' => 'Você não criou nenhuma query de usuário ainda.',
- 'number' => 'Query n°%d',
+ 'no_filter' => 'Sem filtro',
+ 'number' => 'Query n°%d', // TODO - Translation
'order_asc' => 'Exibir artigos mais antigos primeiro',
'order_desc' => 'Exibir artigos mais novos primeiro',
- 'remove' => 'Remove user query', //TODO - Translation
+ 'remove' => 'Remove user query', // TODO - Translation
'search' => 'Busca por "%s"',
'state_0' => 'Exibir todos os artigos',
'state_1' => 'Exibir artigos lidos',
@@ -93,9 +93,9 @@ return array(
'state_14' => 'Exibir artigos não lidos',
'state_15' => 'Exibir todos os artigos',
'title' => 'Queries de usuários',
+ '_' => 'Queries do usuário',
),
'reading' => array(
- '_' => 'Leitura',
'after_onread' => 'Depois de "marcar todos como lido",',
'articles_per_page' => 'Número de artigos por página',
'auto_load_more' => 'Carregar mais artigos no final da página',
@@ -116,16 +116,16 @@ return array(
'when' => 'Marcar artigo como lido…',
),
'show' => array(
- '_' => 'Artigos para exibir',
'adaptive' => 'Ajustar visualização',
'all_articles' => 'Exibir todos os artigos',
'unread' => 'Exibir apenas não lido',
+ '_' => 'Artigos para exibir',
),
'sides_close_article' => 'Clicando fora da área do texto do artigo fecha o mesmo',
'sort' => array(
- '_' => 'Ordem de visualização',
'newer_first' => 'Novos primeiro',
'older_first' => 'Antigos primeiro',
+ '_' => 'Ordem de visualização',
),
'sticky_post' => 'Coloque o artigo no topo quando aberto',
'title' => 'Lendo',
@@ -135,26 +135,26 @@ return array(
'normal' => 'Visualização normal',
'reader' => 'Visualização de leitura',
),
+ '_' => 'Leitura',
),
'sharing' => array(
- '_' => 'Compartilhando',
- 'add' => 'Add a sharing method', //TODO - Translation
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
- 'email' => 'Email',
- 'facebook' => 'Facebook',
+ 'add' => 'Add a sharing method', // TODO - Translation
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
+ 'email' => 'Email', // TODO - Translation
+ 'facebook' => 'Facebook', // TODO - Translation
'more_information' => 'Mais informação',
'print' => 'Imprimir',
- 'remove' => 'Remove sharing method', //TODO - Translation
- 'shaarli' => 'Shaarli',
+ 'remove' => 'Remove sharing method', // TODO - Translation
+ 'shaarli' => 'Shaarli', // TODO - Translation
'share_name' => 'Nome de visualização para compartilhar',
'share_url' => 'URL utilizada para compartilhar',
'title' => 'Compartilhando',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag', // TODO - Translation
+ '_' => 'Compartilhando',
),
'shortcut' => array(
- '_' => 'Atalhos',
'article_action' => 'Ações no artigo',
'auto_share' => 'Compartilhar',
'auto_share_help' => 'Se há apenas um modo de compartilhamento, ele é usado. Caso contrário, serão acessíveis pelo seu número.',
@@ -162,7 +162,7 @@ return array(
'collapse_article' => 'Fechar',
'first_article' => 'Ir para o primeiro artigo',
'focus_search' => 'Acessar a caixa de busca',
- 'global_view' => 'Switch to global view', //TODO - Translation
+ 'global_view' => 'Switch to global view', // TODO - Translation
'help' => 'Mostrar documentação',
'javascript' => 'JavaScript deve ser habilitado para utilizar atalhos',
'last_article' => 'Ir para o último artigo',
@@ -171,21 +171,22 @@ return array(
'mark_read' => 'Marcar como lido',
'navigation' => 'Navegação',
'navigation_help' => 'Com o modificador "Shift", atalhos de navegação aplicam aos feeds.<br/>Com o "Alt" modificador, atalhos de navegação aplicam as categorias.',
- 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', //TODO - Translation
+ 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', // TODO - Translation
'next_article' => 'Pule para o próximo artigo',
- 'normal_view' => 'Switch to normal view', //TODO - Translation
+ 'normal_view' => 'Switch to normal view', // TODO - Translation
'other_action' => 'Outras ações',
'previous_article' => 'Pule para o artigo anterior',
- 'reading_view' => 'Switch to reading view', //TODO - Translation
- 'rss_view' => 'Open RSS view in a new tab', //TODO - Translation
+ 'reading_view' => 'Switch to reading view', // TODO - Translation
+ 'rss_view' => 'Open RSS view in a new tab', // TODO - Translation
'see_on_website' => 'Visualize o site original',
'shift_for_all_read' => '+ <code>shift</code> para marcar todos os artigos como lido',
- 'skip_next_article' => 'Focus next without opening', //TODO - Translation
- 'skip_previous_article' => 'Focus previous without opening', //TODO - Translation
+ 'skip_next_article' => 'Focus next without opening', // TODO - Translation
+ 'skip_previous_article' => 'Focus previous without opening', // TODO - Translation
'title' => 'Atalhos',
'user_filter' => 'Acesse filtros de usuário',
'user_filter_help' => 'Se há apenas um filtro, ele é utilizado. Caso contrário, os filtros serão acessíveis pelos seus números.',
- 'views' => 'Views', //TODO - Translation
+ 'views' => 'Views', // TODO - Translation
+ '_' => 'Atalhos',
),
'user' => array(
'articles_and_size' => '%s artigos (%s)',
diff --git a/app/i18n/pt-br/feedback.php b/app/i18n/pt-br/feedback.php
index 816bbf43b..0e644ce8f 100644
--- a/app/i18n/pt-br/feedback.php
+++ b/app/i18n/pt-br/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => 'Otimização Completa',
- ),
'access' => array(
'denied' => 'Você não tem permissão para acessar esta página',
'not_found' => 'VocÊ está buscando por uma página que não existe',
),
+ 'admin' => array(
+ 'optimization_complete' => 'Otimização Completa',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => 'Um problema ocorreu durante o sistema de configuração para autenticação. Por favor tente mais tarde.',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s não pode ser habilitado. <a href="%s">verifique os logs do FreshRSS</a> para detalhes.',
'ok' => '%s agora está habilitado',
),
- 'no_access' => 'Você não tem acesso ao %s',
'not_enabled' => '%s não está habilitado',
'not_found' => '%s não existe',
+ 'no_access' => 'Você não tem acesso ao %s',
),
'import_export' => array(
'export_no_zip_extension' => 'extensão ZIP não está presente em seu servidor. Por favor tente exportar os arquivos um por vez.',
@@ -51,14 +57,14 @@ return array(
'zip_error' => 'Um erro ocorreu durante a importação do arquivo ZIP.',
),
'profile' => array(
- 'error' => 'Your profile cannot be modified',
- 'updated' => 'Your profile has been modified',
+ 'error' => 'Your profile cannot be modified', // TODO - Translation
+ 'updated' => 'Your profile has been modified', // TODO - Translation
),
'sub' => array(
'actualize' => 'Atualizando',
'articles' => array(
- 'marked_read' => 'The selected articles have been marked as read.', //TODO - Translation
- 'marked_unread' => 'The articles have been marked as unread.', //TODO - Translation
+ 'marked_read' => 'The selected articles have been marked as read.', // TODO - Translation
+ 'marked_unread' => 'The articles have been marked as unread.', // TODO - Translation
),
'category' => array(
'created' => 'Categoria %s foi criada.',
@@ -66,10 +72,10 @@ return array(
'emptied' => 'Categoria foi esvaziada',
'error' => 'Categoria não pode ser atualizada',
'name_exists' => 'Este nome de categoria já existe.',
- 'no_id' => 'Você precisa especificar um id para a categoria.',
- 'no_name' => 'Nome da categoria não pode ser vazio.',
'not_delete_default' => 'Você não pode deletar uma categoria vazia!',
'not_exist' => 'A categoria não existe!',
+ 'no_id' => 'Você precisa especificar um id para a categoria.',
+ 'no_name' => 'Nome da categoria não pode ser vazio.',
'over_max' => 'Você atingiu seu limite de categorias (%d)',
'updated' => 'Categoria foi atualizada.',
),
@@ -80,12 +86,12 @@ return array(
'already_subscribed' => 'Você já está inscrito no <em>%s</em>',
'deleted' => 'o Feed foi deletado',
'error' => 'O feed não pode ser atualizado',
- 'internal_problem' => 'O RSS feed não pôde ser adicionado. <a href="%s">Verifique os FreshRSS logs</a> para detalhes.', //TODO - Translation
+ 'internal_problem' => 'O RSS feed não pôde ser adicionado. <a href="%s">Verifique os FreshRSS logs</a> para detalhes.',
'invalid_url' => 'URL <em>%s</em> é inválida',
+ 'not_added' => '<em>%s</em> não pode ser atualizado',
+ 'no_refresh' => 'Não há feed para atualizar…',
'n_actualized' => '%d feeds foram atualizados',
'n_entries_deleted' => '%d artigos foram deletados',
- 'no_refresh' => 'Não há feed para atualizar…',
- 'not_added' => '<em>%s</em> não pode ser atualizado',
'over_max' => 'Você atingiu seu limite de feeds (%d)',
'updated' => 'Feed foram atualizados',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => 'Usuário %s foi criado',
'error' => 'Usuário %s não pode ser criado',
+ '_' => 'Usuário %s foi criado',
),
'deleted' => array(
- '_' => 'Usuário %s foi deletado',
'error' => 'Usuário %s não pode ser deletado',
+ '_' => 'Usuário %s foi deletado',
),
'updated' => array(
- '_' => 'User %s has been updated', //TODO - Translation
- 'error' => 'User %s has not been updated', //TODO - Translation
+ 'error' => 'User %s has not been updated', // TODO - Translation
+ '_' => 'User %s has been updated', // TODO - Translation
),
),
);
diff --git a/app/i18n/pt-br/gen.php b/app/i18n/pt-br/gen.php
index 0e7f367ee..a65c87b6c 100644
--- a/app/i18n/pt-br/gen.php
+++ b/app/i18n/pt-br/gen.php
@@ -3,7 +3,7 @@
return array(
'action' => array(
'actualize' => 'Atualizar',
- 'back' => '← Go back', //TODO - Translation
+ 'back' => '← Go back', // TODO - Translation
'back_to_rss_feeds' => '← Volte para o seu feeds RSS',
'cancel' => 'Cancelar',
'create' => 'Criar',
@@ -16,32 +16,33 @@ return array(
'manage' => 'Gerenciar',
'mark_favorite' => 'Marcar como favorito',
'mark_read' => 'Marcar como lido',
+ 'purge' => 'Purge', // TODO - Translation
'remove' => 'Remover',
'see_website' => 'Ver o site',
'submit' => 'Enviar',
'truncate' => 'Deletar todos os artigos',
- 'update' => 'Update', //TODO - Translation
+ 'update' => 'Update', // TODO - Translation
),
'auth' => array(
- 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
+ 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
'email' => 'Endereço de e-mail',
'keep_logged_in' => 'Mantenha logado por <small>(%s days)</small>',
- 'login' => 'Login',
- 'logout' => 'Logout',
+ 'login' => 'Login', // TODO - Translation
+ 'logout' => 'Logout', // TODO - Translation
'password' => array(
- '_' => 'Senha',
'format' => '<small>Ao menos 7 caracteres</small>',
+ '_' => 'Senha',
),
'registration' => array(
- '_' => 'Nova conta',
'ask' => 'Criar novoa conta?',
'title' => 'Criação de conta',
+ '_' => 'Nova conta',
),
'reset' => 'Reset autenticação',
'username' => array(
- '_' => 'Usuário',
'admin' => 'Usuário administrador',
'format' => '<small>máximo 16 caracteres alphanumericos</small>',
+ '_' => 'Usuário',
),
),
'date' => array(
@@ -64,8 +65,8 @@ return array(
'Jan' => '\\J\\a\\n\\e\\i\\r\\o',
'jan' => 'jan',
'january' => 'Jan',
- 'Jul' => '\\J\\u\\l\\h\\o',
'jul' => 'jul',
+ 'Jul' => '\\J\\u\\l\\h\\o',
'july' => 'Jul',
'Jun' => '\\J\\u\\n\\h\\o',
'jun' => 'jun',
@@ -75,8 +76,8 @@ return array(
'last_month' => 'Últimos mês',
'last_week' => 'Última semana',
'last_year' => 'Último ano',
- 'Mar' => '\\M\\a\\r\\ç\\o',
'mar' => 'mar',
+ 'Mar' => '\\M\\a\\r\\ç\\o',
'march' => 'Mar',
'May' => '\\M\\a\\i\\o',
'may' => 'Mai',
@@ -101,8 +102,8 @@ return array(
'yesterday' => 'Ontem',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => 'Sobre FreshRSS',
+ '_' => 'FreshRSS', // TODO - Translation
),
'js' => array(
'category_empty' => 'Categoria vazia',
@@ -117,20 +118,21 @@ return array(
'should_be_activated' => 'JavaScript precisa estar ativo',
),
'lang' => array(
- 'cz' => 'Čeština',
- 'de' => 'Deutsch',
- 'en' => 'English',
- 'es' => 'Español',
- 'fr' => 'Français',
- 'he' => 'עברית',
- 'it' => 'Italiano',
- 'kr' => '한국어',
- 'nl' => 'Nederlands',
- 'oc' => 'Occitan',
- 'pt-br' => 'Português (Brasil)',
- 'ru' => 'Русский',
- 'tr' => 'Türkçe',
- 'zh-cn' => '简体中文',
+ 'cz' => 'Čeština', // TODO - Translation
+ 'de' => 'Deutsch', // TODO - Translation
+ 'en' => 'English', // TODO - Translation
+ 'es' => 'Español', // TODO - Translation
+ 'fr' => 'Français', // TODO - Translation
+ 'he' => 'עברית', // TODO - Translation
+ 'it' => 'Italiano', // TODO - Translation
+ 'kr' => '한국어', // TODO - Translation
+ 'nl' => 'Nederlands', // TODO - Translation
+ 'oc' => 'Occitan', // TODO - Translation
+ 'pt-br' => 'Português (Brasil)', // TODO - Translation
+ 'ru' => 'Русский', // TODO - Translation
+ 'sk' => 'Slovenčina', // TODO - Translation
+ 'tr' => 'Türkçe', // TODO - Translation
+ 'zh-cn' => '简体中文', // TODO - Translation
),
'menu' => array(
'about' => 'Sobre',
@@ -141,7 +143,7 @@ return array(
'configuration' => 'Configuração',
'display' => 'Visualização',
'extensions' => 'Extensões',
- 'logs' => 'Logs',
+ 'logs' => 'Logs', // TODO - Translation
'queries' => 'Queries de usuário',
'reading' => 'Leitura',
'search' => 'Procurar por palavras ou #tags',
@@ -163,31 +165,31 @@ return array(
'previous' => 'Anterior',
),
'period' => array(
- 'days' => 'days', //TODO - Translation
- 'hours' => 'hours', //TODO - Translation
- 'months' => 'months', //TODO - Translation
- 'weeks' => 'weeks', //TODO - Translation
- 'years' => 'years', //TODO - Translation
+ 'days' => 'days', // TODO - Translation
+ 'hours' => 'hours', // TODO - Translation
+ 'months' => 'months', // TODO - Translation
+ 'weeks' => 'weeks', // TODO - Translation
+ 'years' => 'years', // TODO - Translation
),
'share' => array(
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
- 'email' => 'Email',
- 'facebook' => 'Facebook',
- 'gnusocial' => 'GNU social',
- 'jdh' => 'Journal du hacker',
- 'Known' => 'Known based sites',
- 'lemmy' => 'Lemmy',
- 'linkedin' => 'LinkedIn',
- 'mastodon' => 'Mastodon',
- 'movim' => 'Movim',
- 'pinboard' => 'Pinboard',
- 'pocket' => 'Pocket',
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
+ 'email' => 'Email', // TODO - Translation
+ 'facebook' => 'Facebook', // TODO - Translation
+ 'gnusocial' => 'GNU social', // TODO - Translation
+ 'jdh' => 'Journal du hacker', // TODO - Translation
+ 'Known' => 'Known based sites', // TODO - Translation
+ 'lemmy' => 'Lemmy', // TODO - Translation
+ 'linkedin' => 'LinkedIn', // TODO - Translation
+ 'mastodon' => 'Mastodon', // TODO - Translation
+ 'movim' => 'Movim', // TODO - Translation
+ 'pinboard' => 'Pinboard', // TODO - Translation
+ 'pocket' => 'Pocket', // TODO - Translation
'print' => 'Imprimir',
- 'shaarli' => 'Shaarli',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag v1',
- 'wallabagv2' => 'wallabag v2',
+ 'shaarli' => 'Shaarli', // TODO - Translation
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag v1', // TODO - Translation
+ 'wallabagv2' => 'wallabag v2', // TODO - Translation
),
'short' => array(
'attention' => 'Atencão!',
@@ -198,7 +200,7 @@ return array(
'default_category' => 'Sem categoria',
'no' => 'Não',
'not_applicable' => 'Não disponível',
- 'ok' => 'Ok!',
+ 'ok' => 'Ok!', // TODO - Translation
'or' => 'ou',
'yes' => 'Sim',
),
diff --git a/app/i18n/pt-br/index.php b/app/i18n/pt-br/index.php
index fac17e171..a389b7125 100644
--- a/app/i18n/pt-br/index.php
+++ b/app/i18n/pt-br/index.php
@@ -2,8 +2,7 @@
return array(
'about' => array(
- '_' => 'Sobre',
- 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', // TODO - Translation
'bugs_reports' => 'Reportar Bugs',
'credits' => 'Créditos',
'credits_content' => 'Alguns elementos de design vieram do <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> Embora FreshRRS não utiliza este framework. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Ícones</a> vieram do <a href="https://www.gnome.org/">GNOME project</a>. <em>Open Sans</em> font police foi criada por <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a>. FreshRSS é baseado no <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, um framework PHP.',
@@ -14,23 +13,21 @@ return array(
'title' => 'Sobre',
'version' => 'Versão',
'website' => 'Site',
- ),
- 'tos' => array(
- 'title' => 'Terms of Service', // TODO - Translation
+ '_' => 'Sobre',
),
'feed' => array(
'add' => 'Você pode adicionar alguns feeds.',
'empty' => 'Não há nenhum artigo para mostrar.',
'rss_of' => 'RSS feed do %s',
'title' => 'Seus RSS feeds',
- 'title_global' => 'Visualização Global',
'title_fav' => 'Seus favoritos',
+ 'title_global' => 'Visualização Global',
),
'log' => array(
- '_' => 'Logs',
'clear' => 'Limpar logs',
'empty' => 'Arquivo de log está vazio',
- 'title' => 'Logs',
+ 'title' => 'Logs', // TODO - Translation
+ '_' => 'Logs', // TODO - Translation
),
'menu' => array(
'about' => 'Sobre o FreshRSS',
@@ -43,7 +40,7 @@ return array(
'mark_all_read' => 'Marcar todos como lidos',
'mark_cat_read' => 'Marcar categoria como lida',
'mark_feed_read' => 'Marcar feed com lido',
- 'mark_selection_unread' => 'Mark selection as unread', //TODO - Translation
+ 'mark_selection_unread' => 'Mark selection as unread', // TODO - Translation
'newer_first' => 'Novos primeiro',
'non-starred' => 'Mostrar todos, exceto favoritos',
'normal_view' => 'visualização normal',
@@ -51,16 +48,19 @@ return array(
'queries' => 'Queries do usuário',
'read' => 'Mostrar apenas lidos',
'reader_view' => 'Visualização de leitura',
- 'rss_view' => 'RSS feed',
+ 'rss_view' => 'RSS feed', // TODO - Translation
'search_short' => 'Buscar',
'starred' => 'Mostrar apenas os favoritos',
'stats' => 'Estatísticas',
'subscription' => 'Gerenciamento de inscrições',
- 'tags' => 'My labels', //TODO - Translation
+ 'tags' => 'My labels', // TODO - Translation
'unread' => 'Mostrar apenas os não lidos',
),
'share' => 'Compartilhar',
'tag' => array(
- 'related' => 'Tags relacionadas', //TODO - Translation
+ 'related' => 'Tags relacionadas',
+ ),
+ 'tos' => array(
+ 'title' => 'Terms of Service', // TODO - Translation
),
);
diff --git a/app/i18n/pt-br/install.php b/app/i18n/pt-br/install.php
index d99a09364..5a42ee6af 100644
--- a/app/i18n/pt-br/install.php
+++ b/app/i18n/pt-br/install.php
@@ -17,20 +17,19 @@ return array(
'type' => 'Método de autenticação',
),
'bdd' => array(
- '_' => 'Banco de dados',
'conf' => array(
- '_' => 'Configuração do banco de dados',
'ko' => 'Verifique as informações do seu banco de dados.',
'ok' => 'Configurações do banco de dados foram salvas.',
+ '_' => 'Configuração do banco de dados',
),
- 'host' => 'Host',
+ 'host' => 'Host', // TODO - Translation
'password' => 'Senha do banco de dados',
'prefix' => 'Prefixo da tabela',
'type' => 'Tipo do banco de dados',
'username' => 'Usuário do banco de dados',
+ '_' => 'Banco de dados',
),
'check' => array(
- '_' => 'Verificações',
'already_installed' => 'Verificamos que o FreshRSS já está instalado!',
'cache' => array(
'nok' => 'Verifique as permissões no diretório <em>./data/cache</em>. O servidor HTTP deve ter direitos para escrever dentro desta pasta.',
@@ -69,8 +68,8 @@ return array(
'ok' => 'Você tem a extensão JSON.',
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
'nok' => 'Não foi possível encontrar o framework Minz.',
@@ -96,10 +95,11 @@ return array(
'nok' => 'Não foi possível encontrar a biblioteca necessária para parse o XML.',
'ok' => 'Você tem a biblioteca necessária para parse o XML.',
),
+ '_' => 'Verificações',
),
'conf' => array(
- '_' => 'Configurações gerais',
'ok' => 'Configurações gerais foram salvas.',
+ '_' => 'Configurações gerais',
),
'congratulations' => 'Parabéns!',
'default_user' => 'Usuário do usuário padrão <small>(máximo de 16 caracteres alphanumericos)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => 'Você irá perder suas configurações anteriores ao reinstalar o FreshRSS. Você está certo que deseja continuar?',
),
'language' => array(
- '_' => 'Idioma',
'choose' => 'Escolhar o idioma para o FreshRSS',
'defined' => 'Idioma foi definido.',
+ '_' => 'Idioma',
),
'not_deleted' => 'Algo deu errado; você deve deletar o arquivo <em>%s</em> manualmente.',
'ok' => 'O processo de instalação foi um sucesso.',
'step' => 'passo %d',
'steps' => 'Passos',
- 'title' => 'Instalação · FreshRSS',
'this_is_the_end' => 'Este é o final',
+ 'title' => 'Instalação · FreshRSS',
);
diff --git a/app/i18n/pt-br/sub.php b/app/i18n/pt-br/sub.php
index 04e0c85ab..72994bf1c 100644
--- a/app/i18n/pt-br/sub.php
+++ b/app/i18n/pt-br/sub.php
@@ -2,87 +2,87 @@
return array(
'api' => array(
- 'documentation' => 'Copy the following URL to use it within an external tool.', //TODO - Translation
- 'title' => 'API', //TODO - Translation
+ 'documentation' => 'Copy the following URL to use it within an external tool.', // TODO - Translation
+ 'title' => 'API', // TODO - Translation
),
'bookmarklet' => array(
- 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', //TODO - Translation
- 'label' => 'Subscribe', //TODO - Translation
- 'title' => 'Bookmarklet', //TODO - Translation
+ 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', // TODO - Translation
+ 'label' => 'Subscribe', // TODO - Translation
+ 'title' => 'Bookmarklet', // TODO - Translation
),
'category' => array(
- '_' => 'Categoria',
'add' => 'Adicionar uma categoria',
'archiving' => 'Arquivar',
'empty' => 'Categoria vazia',
'information' => 'Informações',
'new' => 'Nova categoria',
- 'position' => 'Display position', //TODO - Translation
- 'position_help' => 'To control category sort order', //TODO - Translation
+ 'position' => 'Display position', // TODO - Translation
+ 'position_help' => 'To control category sort order', // TODO - Translation
'title' => 'Título',
+ '_' => 'Categoria',
),
'feed' => array(
'add' => 'Adicionar um RSS feed',
'advanced' => 'Avançado',
'archiving' => 'Arquivar',
'auth' => array(
- 'configuration' => 'Login',
+ 'configuration' => 'Login', // TODO - Translation
'help' => 'Permite acesso a feeds RSS protegidos por HTTP',
'http' => 'Autenticação HTTP',
'password' => 'Senha HTTP',
'username' => 'Usuário HTTP',
),
- 'clear_cache' => 'Always clear cache', //TODO - Translation
+ 'clear_cache' => 'Always clear cache', // TODO - Translation
'css_help' => 'Retorna RSS feeds truncados (atenção, requer mais tempo!)',
'css_path' => 'Caminho do CSS do artigo no site original',
'description' => 'Descrição',
'empty' => 'Este feed está vazio. Por favor verifique ele ainda é mantido.',
'error' => 'Este feed encontra-se com problema. Por favor verifique se ele ainda está disponível e atualize-o.',
'filteractions' => array(
- '_' => 'Filter actions', //TODO - Translation
- 'help' => 'Write one search filter per line.', //TODO - Translation
+ 'help' => 'Write one search filter per line.', // TODO - Translation
+ '_' => 'Filter actions', // TODO - Translation
),
'information' => 'Informações',
'keep_min' => 'Número mínimo de artigos para manter',
'moved_category_deleted' => 'Quando você deleta uma categoria, seus feeds são automaticamente classificados como <em>%s</em>.',
- 'mute' => 'mute', //TODO - Translation
+ 'mute' => 'mute', // TODO - Translation
'no_selected' => 'Nenhum feed selecionado.',
'number_entries' => '%d artigos',
'priority' => array(
- '_' => 'Visibility', //TODO - Translation
- 'archived' => 'Do not show (archived)', //TODO - Translation
+ 'archived' => 'Do not show (archived)', // TODO - Translation
'main_stream' => 'Mostrar na tela principal',
- 'normal' => 'Show in its category', //TODO - Translation
+ 'normal' => 'Show in its category', // TODO - Translation
+ '_' => 'Visibility', // TODO - Translation
),
- 'websub' => 'Notificação instantânea com WebSub',
'show' => array(
- 'all' => 'Show all feeds', //TODO - Translation
- 'error' => 'Show only feeds with error', //TODO - Translation
+ 'all' => 'Show all feeds', // TODO - Translation
+ 'error' => 'Show only feeds with error', // TODO - Translation
),
'showing' => array(
- 'error' => 'Showing only feeds with error', //TODO - Translation
+ 'error' => 'Showing only feeds with error', // TODO - Translation
),
- 'ssl_verify' => 'Verify SSL security', //TODO - Translation
+ 'ssl_verify' => 'Verify SSL security', // TODO - Translation
'stats' => 'Estatísticas',
'think_to_add' => 'Você deve adicionar alguns feeds.',
- 'timeout' => 'Timeout in seconds', //TODO - Translation
+ 'timeout' => 'Timeout in seconds', // TODO - Translation
'title' => 'Título',
'title_add' => 'Adicionar o RSS feed',
'ttl' => 'Não atualize automáticamente mais que',
- 'url' => 'Feed URL',
+ 'url' => 'Feed URL', // TODO - Translation
'validator' => 'Verifique a validade do feed',
'website' => 'URL do site',
+ 'websub' => 'Notificação instantânea com WebSub',
),
'firefox' => array(
- 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.',// TODO
- 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', //TODO - Translation
- 'title' => 'Firefox feed reader', //TODO - Translation
+ 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.', // TODO - Translation
+ 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', // TODO - Translation
+ 'title' => 'Firefox feed reader', // TODO - Translation
),
'import_export' => array(
'export' => 'Exportar',
+ 'export_labelled' => 'Export your labelled articles', // TODO - Translation
'export_opml' => 'Exporta a lista dos feeds (OPML)',
'export_starred' => 'Exportar seus favoritos',
- 'export_labelled' => 'Export your labelled articles', //TODO
'feed_list' => 'Lista dos %s artigos',
'file_to_import' => 'Arquivo para importar<br />(OPML, JSON or ZIP)',
'file_to_import_no_zip' => 'Arquivo para importar<br />(OPML or JSON)',
@@ -94,9 +94,11 @@ return array(
'bookmark' => 'Inscreva-se (FreshRSS favoritos)',
'import_export' => 'Importar / exportar',
'subscription_management' => 'Gerenciamento de inscrições',
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
),
'title' => array(
- '_' => 'Gerenciamento de inscrições',
'feed_management' => 'Gerenciamento dos RSS feeds',
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
+ '_' => 'Gerenciamento de inscrições',
),
);
diff --git a/app/i18n/pt-br/user.php b/app/i18n/pt-br/user.php
index 3a8343c11..52197ad46 100644
--- a/app/i18n/pt-br/user.php
+++ b/app/i18n/pt-br/user.php
@@ -3,35 +3,35 @@
return array(
'email' => array(
'feedback' => array(
- 'invalid' => 'The email address is invalid.', //TODO - Translation
- 'required' => 'The email address is required.', //TODO - Translation
+ 'invalid' => 'The email address is invalid.', // TODO - Translation
+ 'required' => 'The email address is required.', // TODO - Translation
),
'validation' => array(
- 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', //TODO - Translation
- 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', //TODO - Translation
+ 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', // TODO - Translation
+ 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', // TODO - Translation
'feedback' => array(
- 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', //TODO - Translation
- 'email_sent' => 'An email has been sent to your address.', //TODO - Translation
- 'error' => 'The email address failed to be validated.', //TODO - Translation
- 'ok' => 'The email address has been validated.', //TODO - Translation
- 'unneccessary' => 'The email address was already validated.', //TODO - Translation
- 'wrong_token' => 'The email address failed to be validated due to a wrong token.', //TODO - Translation
+ 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', // TODO - Translation
+ 'email_sent' => 'An email has been sent to your address.', // TODO - Translation
+ 'error' => 'The email address failed to be validated.', // TODO - Translation
+ 'ok' => 'The email address has been validated.', // TODO - Translation
+ 'unneccessary' => 'The email address was already validated.', // TODO - Translation
+ 'wrong_token' => 'The email address failed to be validated due to a wrong token.', // TODO - Translation
),
- 'need_to' => 'You need to validate your email address before being able to use %s.', //TODO - Translation
- 'resend_email' => 'Resend the email', //TODO - Translation
- 'title' => 'Email address validation', //TODO - Translation
- ),
- ),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
+ 'need_to' => 'You need to validate your email address before being able to use %s.', // TODO - Translation
+ 'resend_email' => 'Resend the email', // TODO - Translation
+ 'title' => 'Email address validation', // TODO - Translation
),
),
'mailer' => array(
'email_need_validation' => array(
- 'title' => 'You need to validate your account', //TODO - Translation
- 'welcome' => 'Welcome %s,', //TODO - Translation
- 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', //TODO - Translation
+ 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', // TODO - Translation
+ 'title' => 'You need to validate your account', // TODO - Translation
+ 'welcome' => 'Welcome %s,', // TODO - Translation
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
),
),
);
diff --git a/app/i18n/ru/admin.php b/app/i18n/ru/admin.php
index adf091df9..3fcf151dd 100644
--- a/app/i18n/ru/admin.php
+++ b/app/i18n/ru/admin.php
@@ -67,8 +67,8 @@ return array(
'ok' => 'У вас установлена библиотека для работы с JSON.',
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
'nok' => 'У вас не установлен фрейворк Minz.',
@@ -83,9 +83,9 @@ return array(
'ok' => 'У вас установлен PDO и как минимум один из поддерживаемых драйверов (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'PHP installation',
'nok' => 'У вас установлен PHP версии %s, но FreshRSS необходима версия не ниже %s.',
'ok' => 'У вас установлен PHP версии %s, который совместим с FreshRSS.',
+ '_' => 'PHP installation', // TODO - Translation
),
'tables' => array(
'nok' => 'В базе данных отсуствует одна или больше таблица.',
@@ -94,38 +94,37 @@ return array(
'title' => 'Проверка установки и настройки',
'tokens' => array(
'nok' => 'Проверьте права доступа к папке <em>./data/tokens</em> . Сервер HTTP должен иметь права на запись в эту папку.',
- 'ok' => 'Права на папку tokens в порядке.',
+ 'ok' => 'Права на папку tokens в порядке.',
),
'users' => array(
'nok' => 'Проверьте права доступа к папке <em>./data/users</em> . Сервер HTTP должен иметь права на запись в эту папку.',
- 'ok' => 'Права на папку users в порядке.',
+ 'ok' => 'Права на папку users в порядке.',
),
'zip' => array(
'nok' => 'You lack ZIP extension (php-zip package).',
- 'ok' => 'You have ZIP extension.',
+ 'ok' => 'You have ZIP extension.', // TODO - Translation
),
),
'extensions' => array(
- 'author' => 'Author', //TODO - Translation
- 'community' => 'Available community extensions', //TODO - Translation
- 'description' => 'Description', //TODO - Translation
+ 'author' => 'Author', // TODO - Translation
+ 'community' => 'Available community extensions', // TODO - Translation
+ 'description' => 'Description', // TODO - Translation
'disabled' => 'Отключены',
'empty_list' => 'Расширения не установлены',
'enabled' => 'Включены',
- 'latest' => 'Installed', //TODO - Translation
- 'name' => 'Name', //TODO - Translation
+ 'latest' => 'Installed', // TODO - Translation
+ 'name' => 'Name', // TODO - Translation
'no_configure_view' => 'Это расширение нельзя настроить.',
'system' => array(
- '_' => 'Системные расширения',
'no_rights' => 'Системные расширения (у вас нет к ним доступа)',
+ '_' => 'Системные расширения',
),
'title' => 'Расширения',
- 'update' => 'Update available', //TODO - Translation
+ 'update' => 'Update available', // TODO - Translation
'user' => 'Расширения пользователя',
- 'version' => 'Version', //TODO - Translation
+ 'version' => 'Version', // TODO - Translation
),
'stats' => array(
- '_' => 'Статистика',
'all_feeds' => 'Все подписки',
'category' => 'Категория',
'entry_count' => 'Количество статей',
@@ -155,46 +154,53 @@ return array(
'status_unread' => 'Не прочитано',
'title' => 'Статистика',
'top_feed' => '10 лучших подписок',
+ '_' => 'Статистика',
),
'system' => array(
- '_' => 'Системные настройки',
'auto-update-url' => 'Адрес сервера для автоматического обновления',
- 'force_email_validation' => 'Force email addresses validation', //TODO - Translation
+ 'cookie-duration' => array(
+ 'help' => 'in seconds', // TODO - Translation
+ 'number' => 'Duration to keep logged in', // TODO - Translation
+ ),
+ 'force_email_validation' => 'Force email addresses validation', // TODO - Translation
'instance-name' => 'Название этого сервера',
'max-categories' => 'Количество категорий на пользователя',
'max-feeds' => 'Количество статей на пользователя',
- 'cookie-duration' => array(
- 'help' => 'in seconds', // @todo translate
- 'number' => 'Duration to keep logged in', // @todo translate
- ),
'registration' => array(
'help' => '0 означает неограниченное количество пользователей',
'number' => 'Максимальное количество пользователей',
),
+ '_' => 'Системные настройки',
),
'update' => array(
- '_' => 'Обновление системы',
'apply' => 'Применить',
'check' => 'Проверить обновления',
'current_version' => 'Ваша текущая версия FreshRSS: %s.',
'last' => 'Последняя проверка: %s',
'none' => 'Нечего обновлять',
'title' => 'Обновить систему',
+ '_' => 'Обновление системы',
),
'user' => array(
'articles_and_size' => '%s статей (%s)',
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => 'Создать нового пользователя',
- 'delete_users' => 'Delete user', //TODO - Translation
+ 'database_size' => 'Database size', // TODO - Translation
+ 'delete_users' => 'Delete user', // TODO - Translation
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => 'Язык',
+ 'list' => 'User list', // TODO - Translation
'number' => 'На данный момент создан %d аккаунт',
- 'numbers' => 'На данный момент аккаунтов создано: %d',
+ 'numbers' => 'На данный момент аккаунтов создано: %d',
'password_form' => 'Пароль<br /><small>(для входа через Веб-форму)</small>',
'password_format' => 'Минимум 7 символов',
- 'selected' => 'Selected user', //TODO - Translation
+ 'selected' => 'Selected user', // TODO - Translation
'title' => 'Управление пользователями',
- 'update_users' => 'Update user', //TODO - Translation
- 'user_list' => 'Список пользователей',
+ 'update_users' => 'Update user', // TODO - Translation
'username' => 'Имя пользователя',
'users' => 'Пользователи',
+ 'user_list' => 'Список пользователей',
),
);
diff --git a/app/i18n/ru/conf.php b/app/i18n/ru/conf.php
index 7a80587f8..919966c35 100644
--- a/app/i18n/ru/conf.php
+++ b/app/i18n/ru/conf.php
@@ -2,195 +2,196 @@
return array(
'archiving' => array(
- '_' => 'Архивация',
'delete_after' => 'Удалять статьи после',
- 'exception' => 'Purge exception', //TODO - Translation
+ 'exception' => 'Purge exception', // TODO - Translation
'help' => 'Каждую подписку можно настроить более гибко',
- 'keep_favourites' => 'Never delete favourites', //TODO - Translation
- 'keep_min_by_feed' => 'Minimum number of articles to keep by feed', //TODO - Translation
- 'keep_labels' => 'Never delete labels', //TODO - Translation
- 'keep_unreads' => 'Never delete unreads', //TODO - Translation
- 'maintenance' => 'Maintenance', //TODO - Translation
+ 'keep_favourites' => 'Never delete favourites', // TODO - Translation
+ 'keep_labels' => 'Never delete labels', // TODO - Translation
+ 'keep_max' => 'Maximum number of articles to keep', // TODO - Translation
+ 'keep_min_by_feed' => 'Minimum number of articles to keep by feed', // TODO - Translation
+ 'keep_period' => 'Maximum age of articles to keep', // TODO - Translation
+ 'keep_unreads' => 'Never delete unreads', // TODO - Translation
+ 'maintenance' => 'Maintenance', // TODO - Translation
'optimize' => 'Оптимизировать базу данных',
- 'optimize_help' => 'To do occasionally to reduce the size of the database', //TODO - Translation
- 'policy' => 'Purge policy', //TODO - Translation
- 'policy_warning' => 'If no purge policy is selected, every article will be kept.', //TODO - Translation
+ 'optimize_help' => 'To do occasionally to reduce the size of the database',
+ 'policy' => 'Purge policy', // TODO - Translation
+ 'policy_warning' => 'If no purge policy is selected, every article will be kept.', // TODO - Translation
'purge_now' => 'Очистить сейчас',
- 'keep_max' => 'Maximum number of articles to keep', //TODO - Translation
- 'keep_period' => 'Maximum age of articles to keep', //TODO - Translation
'title' => 'Архивация',
'ttl' => 'Не обновлять чаще чем',
+ '_' => 'Архивация',
),
'display' => array(
- '_' => 'Display',
'icon' => array(
- 'bottom_line' => 'Bottom line', //TODO - Translation
- 'entry' => 'Article icons', //TODO - Translation
- 'publication_date' => 'Date of publication', //TODO - Translation
- 'related_tags' => 'Related tags', //TODO - Translation
- 'sharing' => 'Sharing', //TODO - Translation
- 'display_authors' => 'Authors', //TODO - Translation
- 'top_line' => 'Top line', //TODO - Translation
+ 'bottom_line' => 'Bottom line', // TODO - Translation
+ 'display_authors' => 'Authors', // TODO - Translation
+ 'entry' => 'Article icons', // TODO - Translation
+ 'publication_date' => 'Date of publication', // TODO - Translation
+ 'related_tags' => 'Related tags',
+ 'sharing' => 'Sharing', // TODO - Translation
+ 'top_line' => 'Top line', // TODO - Translation
),
'language' => 'Язык',
'notif_html5' => array(
- 'seconds' => 'seconds (0 means no timeout)', //TODO - Translation
- 'timeout' => 'HTML5 notification timeout', //TODO - Translation
+ 'seconds' => 'seconds (0 means no timeout)', // TODO - Translation
+ 'timeout' => 'HTML5 notification timeout', // TODO - Translation
),
- 'show_nav_buttons' => 'Show the navigation buttons', //TODO - Translation
+ 'show_nav_buttons' => 'Show the navigation buttons', // TODO - Translation
'theme' => 'Тема',
- 'title' => 'Display', //TODO - Translation
+ 'title' => 'Display', // TODO - Translation
'width' => array(
- 'content' => 'Content width', //TODO - Translation
- 'large' => 'Large', //TODO - Translation
- 'medium' => 'Medium', //TODO - Translation
- 'no_limit' => 'No limit', //TODO - Translation
- 'thin' => 'Thin', //TODO - Translation
+ 'content' => 'Content width', // TODO - Translation
+ 'large' => 'Large', // TODO - Translation
+ 'medium' => 'Medium', // TODO - Translation
+ 'no_limit' => 'No limit', // TODO - Translation
+ 'thin' => 'Thin', // TODO - Translation
),
+ '_' => 'Display', // TODO - Translation
),
'profile' => array(
- '_' => 'Profile management', //TODO - Translation
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => 'Account deletion', //TODO - Translation
- 'warn' => 'Your account and all the related data will be deleted.', //TODO - Translation
+ 'warn' => 'Your account and all the related data will be deleted.',
+ '_' => 'Account deletion', // TODO - Translation
),
- 'email' => 'Email address', //TODO - Translation
- 'password_api' => 'Password API<br /><small>(e.g., for mobile apps)</small>', //TODO - Translation
- 'password_form' => 'Password<br /><small>(for the Web-form login method)</small>', //TODO - Translation
- 'password_format' => 'At least 7 characters', //TODO - Translation
- 'title' => 'Profile', //TODO - Translation
+ 'email' => 'Email address', // TODO - Translation
+ 'password_api' => 'Password API<br /><small>(e.g., for mobile apps)</small>',
+ 'password_form' => 'Password<br /><small>(for the Web-form login method)</small>', // TODO - Translation
+ 'password_format' => 'At least 7 characters', // TODO - Translation
+ 'title' => 'Profile', // TODO - Translation
+ '_' => 'Profile management', // TODO - Translation
),
'query' => array(
- '_' => 'User queries',
- 'deprecated' => 'This query is no longer valid. The referenced category or feed has been deleted.', //TODO - Translation
- 'display' => 'Display user query results', //TODO - Translation
- 'filter' => 'Filter applied:', //TODO - Translation
- 'get_all' => 'Display all articles', //TODO - Translation
- 'get_category' => 'Display "%s" category', //TODO - Translation
- 'get_favorite' => 'Display favorite articles', //TODO - Translation
- 'get_feed' => 'Display "%s" feed', //TODO - Translation
- 'no_filter' => 'No filter', //TODO - Translation
- 'none' => 'You haven’t created any user query yet.', //TODO - Translation
- 'number' => 'Query n°%d', //TODO - Translation
- 'order_asc' => 'Display oldest articles first', //TODO - Translation
- 'order_desc' => 'Display newest articles first', //TODO - Translation
- 'remove' => 'Remove user query', //TODO - Translation
- 'search' => 'Search for "%s"', //TODO - Translation
- 'state_0' => 'Display all articles', //TODO - Translation
- 'state_1' => 'Display read articles', //TODO - Translation
- 'state_2' => 'Display unread articles', //TODO - Translation
- 'state_3' => 'Display all articles', //TODO - Translation
- 'state_4' => 'Display favorite articles', //TODO - Translation
- 'state_5' => 'Display read favorite articles', //TODO - Translation
- 'state_6' => 'Display unread favorite articles', //TODO - Translation
- 'state_7' => 'Display favorite articles', //TODO - Translation
- 'state_8' => 'Display not favorite articles', //TODO - Translation
- 'state_9' => 'Display read not favorite articles', //TODO - Translation
- 'state_10' => 'Display unread not favorite articles', //TODO - Translation
- 'state_11' => 'Display not favorite articles', //TODO - Translation
- 'state_12' => 'Display all articles', //TODO - Translation
- 'state_13' => 'Display read articles', //TODO - Translation
- 'state_14' => 'Display unread articles', //TODO - Translation
- 'state_15' => 'Display all articles', //TODO - Translation
- 'title' => 'User queries', //TODO - Translation
+ 'deprecated' => 'This query is no longer valid. The referenced category or feed has been deleted.', // TODO - Translation
+ 'display' => 'Display user query results', // TODO - Translation
+ 'filter' => 'Filter applied:', // TODO - Translation
+ 'get_all' => 'Display all articles', // TODO - Translation
+ 'get_category' => 'Display "%s" category', // TODO - Translation
+ 'get_favorite' => 'Display favorite articles',
+ 'get_feed' => 'Display "%s" feed', // TODO - Translation
+ 'none' => 'You haven’t created any user query yet.',
+ 'no_filter' => 'No filter', // TODO - Translation
+ 'number' => 'Query n°%d', // TODO - Translation
+ 'order_asc' => 'Display oldest articles first', // TODO - Translation
+ 'order_desc' => 'Display newest articles first', // TODO - Translation
+ 'remove' => 'Remove user query', // TODO - Translation
+ 'search' => 'Search for "%s"', // TODO - Translation
+ 'state_0' => 'Display all articles', // TODO - Translation
+ 'state_1' => 'Display read articles', // TODO - Translation
+ 'state_2' => 'Display unread articles', // TODO - Translation
+ 'state_3' => 'Display all articles', // TODO - Translation
+ 'state_4' => 'Display favorite articles',
+ 'state_5' => 'Display read favorite articles',
+ 'state_6' => 'Display unread favorite articles',
+ 'state_7' => 'Display favorite articles',
+ 'state_8' => 'Display not favorite articles',
+ 'state_9' => 'Display read not favorite articles',
+ 'state_10' => 'Display unread not favorite articles',
+ 'state_11' => 'Display not favorite articles',
+ 'state_12' => 'Display all articles', // TODO - Translation
+ 'state_13' => 'Display read articles', // TODO - Translation
+ 'state_14' => 'Display unread articles', // TODO - Translation
+ 'state_15' => 'Display all articles', // TODO - Translation
+ 'title' => 'User queries', // TODO - Translation
+ '_' => 'User queries', // TODO - Translation
),
'reading' => array(
- '_' => 'Reading', //TODO - Translation
- 'after_onread' => 'After “mark all as read”,', //TODO - Translation
- 'articles_per_page' => 'Number of articles per page', //TODO - Translation
- 'auto_load_more' => 'Load next articles at the page bottom', //TODO - Translation
- 'auto_remove_article' => 'Hide articles after reading', //TODO - Translation
- 'confirm_enabled' => 'Display a confirmation dialog on “mark all as read” actions', //TODO - Translation
- 'display_articles_unfolded' => 'Show articles unfolded by default', //TODO - Translation
- 'display_categories_unfolded' => 'Show categories unfolded by default', //TODO - Translation
- 'hide_read_feeds' => 'Hide categories & feeds with no unread article (does not work with “Show all articles” configuration)', //TODO - Translation
- 'img_with_lazyload' => 'Use "lazy load" mode to load pictures', //TODO - Translation
- 'jump_next' => 'jump to next unread sibling (feed or category)', //TODO - Translation
- 'mark_updated_article_unread' => 'Mark updated articles as unread', //TODO - Translation
- 'number_divided_when_reader' => 'Divided by 2 in the reading view.', //TODO - Translation
+ 'after_onread' => 'After “mark all as read”,', // TODO - Translation
+ 'articles_per_page' => 'Number of articles per page', // TODO - Translation
+ 'auto_load_more' => 'Load next articles at the page bottom',
+ 'auto_remove_article' => 'Hide articles after reading', // TODO - Translation
+ 'confirm_enabled' => 'Display a confirmation dialog on “mark all as read” actions', // TODO - Translation
+ 'display_articles_unfolded' => 'Show articles unfolded by default', // TODO - Translation
+ 'display_categories_unfolded' => 'Show categories unfolded by default', // TODO - Translation
+ 'hide_read_feeds' => 'Hide categories & feeds with no unread article (does not work with “Show all articles” configuration)',
+ 'img_with_lazyload' => 'Use "lazy load" mode to load pictures', // TODO - Translation
+ 'jump_next' => 'jump to next unread sibling (feed or category)', // TODO - Translation
+ 'mark_updated_article_unread' => 'Mark updated articles as unread', // TODO - Translation
+ 'number_divided_when_reader' => 'Divided by 2 in the reading view.', // TODO - Translation
'read' => array(
- 'article_open_on_website' => 'when article is opened on its original website', //TODO - Translation
- 'article_viewed' => 'when article is viewed', //TODO - Translation
- 'scroll' => 'while scrolling', //TODO - Translation
- 'upon_reception' => 'upon reception of the article', //TODO - Translation
- 'when' => 'Mark article as read…', //TODO - Translation
+ 'article_open_on_website' => 'when article is opened on its original website', // TODO - Translation
+ 'article_viewed' => 'when article is viewed', // TODO - Translation
+ 'scroll' => 'while scrolling', // TODO - Translation
+ 'upon_reception' => 'upon reception of the article',
+ 'when' => 'Mark article as read…', // TODO - Translation
),
'show' => array(
- '_' => 'Articles to display', //TODO - Translation
- 'adaptive' => 'Adjust showing', //TODO - Translation
- 'all_articles' => 'Show all articles', //TODO - Translation
- 'unread' => 'Show only unread', //TODO - Translation
+ 'adaptive' => 'Adjust showing', // TODO - Translation
+ 'all_articles' => 'Show all articles', // TODO - Translation
+ 'unread' => 'Show only unread', // TODO - Translation
+ '_' => 'Articles to display', // TODO - Translation
),
- 'sides_close_article' => 'Clicking outside of article text area closes the article', //TODO - Translation
+ 'sides_close_article' => 'Clicking outside of article text area closes the article', // TODO - Translation
'sort' => array(
- '_' => 'Sort order', //TODO - Translation
- 'newer_first' => 'Newer first', //TODO - Translation
- 'older_first' => 'Oldest first', //TODO - Translation
+ 'newer_first' => 'Newer first',
+ 'older_first' => 'Oldest first', // TODO - Translation
+ '_' => 'Sort order', // TODO - Translation
),
- 'sticky_post' => 'Stick the article to the top when opened', //TODO - Translation
- 'title' => 'Reading', //TODO - Translation
+ 'sticky_post' => 'Stick the article to the top when opened', // TODO - Translation
+ 'title' => 'Reading', // TODO - Translation
'view' => array(
- 'default' => 'Default view', //TODO - Translation
- 'global' => 'Global view', //TODO - Translation
- 'normal' => 'Normal view', //TODO - Translation
- 'reader' => 'Reading view', //TODO - Translation
+ 'default' => 'Default view', // TODO - Translation
+ 'global' => 'Global view', // TODO - Translation
+ 'normal' => 'Normal view', // TODO - Translation
+ 'reader' => 'Reading view', // TODO - Translation
),
+ '_' => 'Reading', // TODO - Translation
),
'sharing' => array(
- '_' => 'Sharing', //TODO - Translation
- 'add' => 'Add a sharing method', //TODO - Translation
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
- 'email' => 'Email', //TODO - Translation
- 'facebook' => 'Facebook',
- 'more_information' => 'More information', //TODO - Translation
- 'print' => 'Print', //TODO - Translation
- 'remove' => 'Remove sharing method', //TODO - Translation
- 'shaarli' => 'Shaarli',
- 'share_name' => 'Share name to display', //TODO - Translation
- 'share_url' => 'Share URL to use', //TODO - Translation
- 'title' => 'Sharing',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'add' => 'Add a sharing method', // TODO - Translation
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
+ 'email' => 'Email', // TODO - Translation
+ 'facebook' => 'Facebook', // TODO - Translation
+ 'more_information' => 'More information', // TODO - Translation
+ 'print' => 'Print', // TODO - Translation
+ 'remove' => 'Remove sharing method', // TODO - Translation
+ 'shaarli' => 'Shaarli', // TODO - Translation
+ 'share_name' => 'Share name to display', // TODO - Translation
+ 'share_url' => 'Share URL to use', // TODO - Translation
+ 'title' => 'Sharing', // TODO - Translation
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag', // TODO - Translation
+ '_' => 'Sharing', // TODO - Translation
),
'shortcut' => array(
- '_' => 'Shortcuts', //TODO - Translation
- 'article_action' => 'Article actions', //TODO - Translation
- 'auto_share' => 'Share', //TODO - Translation
- 'auto_share_help' => 'If there is only one sharing mode, it is used. Else modes are accessible by their number.', //TODO - Translation
- 'close_dropdown' => 'Close menus', //TODO - Translation
- 'collapse_article' => 'Collapse', //TODO - Translation
- 'first_article' => 'Skip to the first article', //TODO - Translation
- 'focus_search' => 'Access search box', //TODO - Translation
- 'global_view' => 'Switch to global view', //TODO - Translation
- 'help' => 'Display documentation', //TODO - Translation
- 'javascript' => 'JavaScript must be enabled in order to use shortcuts', //TODO - Translation
- 'last_article' => 'Skip to the last article', //TODO - Translation
- 'load_more' => 'Load more articles', //TODO - Translation
- 'mark_read' => 'Mark as read', //TODO - Translation
- 'mark_favorite' => 'Mark as favourite', //TODO - Translation
- 'navigation' => 'Navigation', //TODO - Translation
- 'navigation_help' => 'With the "Shift" modifier, navigation shortcuts apply on feeds.<br/>With the "Alt" modifier, navigation shortcuts apply on categories.', //TODO - Translation
- 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', //TODO - Translation
- 'next_article' => 'Skip to the next article', //TODO - Translation
- 'normal_view' => 'Switch to normal view', //TODO - Translation
- 'other_action' => 'Other actions', //TODO - Translation
- 'previous_article' => 'Skip to the previous article', //TODO - Translation
- 'reading_view' => 'Switch to reading view', //TODO - Translation
- 'rss_view' => 'Open RSS view in a new tab', //TODO - Translation
- 'see_on_website' => 'See on original website', //TODO - Translation
- 'shift_for_all_read' => '+ <code>shift</code> to mark all articles as read', //TODO - Translation
- 'skip_next_article' => 'Focus next without opening', //TODO - Translation
- 'skip_previous_article' => 'Focus previous without opening', //TODO - Translation
- 'title' => 'Shortcuts', //TODO - Translation
- 'user_filter' => 'Access user filters', //TODO - Translation
- 'user_filter_help' => 'If there is only one user filter, it is used. Else filters are accessible by their number.', //TODO - Translation
- 'views' => 'Views', //TODO - Translation
+ 'article_action' => 'Article actions', // TODO - Translation
+ 'auto_share' => 'Share', // TODO - Translation
+ 'auto_share_help' => 'If there is only one sharing mode, it is used. Else modes are accessible by their number.',
+ 'close_dropdown' => 'Close menus', // TODO - Translation
+ 'collapse_article' => 'Collapse', // TODO - Translation
+ 'first_article' => 'Skip to the first article',
+ 'focus_search' => 'Access search box', // TODO - Translation
+ 'global_view' => 'Switch to global view', // TODO - Translation
+ 'help' => 'Display documentation', // TODO - Translation
+ 'javascript' => 'JavaScript must be enabled in order to use shortcuts', // TODO - Translation
+ 'last_article' => 'Skip to the last article',
+ 'load_more' => 'Load more articles', // TODO - Translation
+ 'mark_favorite' => 'Mark as favourite',
+ 'mark_read' => 'Mark as read',
+ 'navigation' => 'Navigation', // TODO - Translation
+ 'navigation_help' => 'With the "Shift" modifier, navigation shortcuts apply on feeds.<br/>With the "Alt" modifier, navigation shortcuts apply on categories.', // TODO - Translation
+ 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', // TODO - Translation
+ 'next_article' => 'Skip to the next article',
+ 'normal_view' => 'Switch to normal view', // TODO - Translation
+ 'other_action' => 'Other actions', // TODO - Translation
+ 'previous_article' => 'Skip to the previous article',
+ 'reading_view' => 'Switch to reading view', // TODO - Translation
+ 'rss_view' => 'Open RSS view in a new tab', // TODO - Translation
+ 'see_on_website' => 'See on original website', // TODO - Translation
+ 'shift_for_all_read' => '+ <code>shift</code> to mark all articles as read', // TODO - Translation
+ 'skip_next_article' => 'Focus next without opening', // TODO - Translation
+ 'skip_previous_article' => 'Focus previous without opening', // TODO - Translation
+ 'title' => 'Shortcuts', // TODO - Translation
+ 'user_filter' => 'Access user filters',
+ 'user_filter_help' => 'If there is only one user filter, it is used. Else filters are accessible by their number.',
+ 'views' => 'Views', // TODO - Translation
+ '_' => 'Shortcuts', // TODO - Translation
),
'user' => array(
- 'articles_and_size' => '%s articles (%s)', //TODO - Translation
- 'current' => 'Current user', //TODO - Translation
- 'is_admin' => 'is administrator', //TODO - Translation
- 'users' => 'Users', //TODO - Translation
+ 'articles_and_size' => '%s articles (%s)', // TODO - Translation
+ 'current' => 'Current user', // TODO - Translation
+ 'is_admin' => 'is administrator', // TODO - Translation
+ 'users' => 'Users', // TODO - Translation
),
);
diff --git a/app/i18n/ru/feedback.php b/app/i18n/ru/feedback.php
index 7b859fcdd..cf606cd1e 100644
--- a/app/i18n/ru/feedback.php
+++ b/app/i18n/ru/feedback.php
@@ -1,116 +1,122 @@
<?php
return array(
+ 'access' => array(
+ 'denied' => 'You don’t have permission to access this page', // TODO - Translation
+ 'not_found' => 'You are looking for a page which doesn’t exist', // TODO - Translation
+ ),
'admin' => array(
- 'optimization_complete' => 'Optimisation complete', //TODO - Translation
+ 'optimization_complete' => 'Optimisation complete',
),
- 'access' => array(
- 'denied' => 'You don’t have permission to access this page', //TODO - Translation
- 'not_found' => 'You are looking for a page which doesn’t exist', //TODO - Translation
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
),
'auth' => array(
'form' => array(
- 'not_set' => 'A problem occured during authentication system configuration. Please retry later.', //TODO - Translation
- 'set' => 'Form is now your default authentication system.', //TODO - Translation
+ 'not_set' => 'A problem occured during authentication system configuration. Please retry later.', // TODO - Translation
+ 'set' => 'Form is now your default authentication system.', // TODO - Translation
),
'login' => array(
- 'invalid' => 'Login is invalid', //TODO - Translation
- 'success' => 'You are connected', //TODO - Translation
+ 'invalid' => 'Login is invalid', // TODO - Translation
+ 'success' => 'You are connected', // TODO - Translation
),
'logout' => array(
- 'success' => 'You are disconnected', //TODO - Translation
+ 'success' => 'You are disconnected', // TODO - Translation
),
- 'no_password_set' => 'Administrator password hasn’t been set. This feature isn’t available.', //TODO - Translation
+ 'no_password_set' => 'Administrator password hasn’t been set. This feature isn’t available.', // TODO - Translation
),
'conf' => array(
- 'error' => 'An error occurred during configuration saving', //TODO - Translation
- 'query_created' => 'Query "%s" has been created.', //TODO - Translation
- 'shortcuts_updated' => 'Shortcuts have been updated', //TODO - Translation
- 'updated' => 'Configuration has been updated', //TODO - Translation
+ 'error' => 'An error occurred during configuration saving', // TODO - Translation
+ 'query_created' => 'Query "%s" has been created.', // TODO - Translation
+ 'shortcuts_updated' => 'Shortcuts have been updated', // TODO - Translation
+ 'updated' => 'Configuration has been updated', // TODO - Translation
),
'extensions' => array(
- 'already_enabled' => '%s is already enabled', //TODO - Translation
+ 'already_enabled' => '%s is already enabled', // TODO - Translation
'disable' => array(
- 'ko' => '%s cannot be disabled. <a href="%s">Check FreshRSS logs</a> for details.', //TODO - Translation
- 'ok' => '%s is now disabled', //TODO - Translation
+ 'ko' => '%s cannot be disabled. <a href="%s">Check FreshRSS logs</a> for details.', // TODO - Translation
+ 'ok' => '%s is now disabled', // TODO - Translation
),
'enable' => array(
- 'ko' => '%s cannot be enabled. <a href="%s">Check FreshRSS logs</a> for details.', //TODO - Translation
- 'ok' => '%s is now enabled', //TODO - Translation
+ 'ko' => '%s cannot be enabled. <a href="%s">Check FreshRSS logs</a> for details.', // TODO - Translation
+ 'ok' => '%s is now enabled', // TODO - Translation
),
- 'no_access' => 'You have no access on %s', //TODO - Translation
- 'not_enabled' => '%s is not enabled yet', //TODO - Translation
- 'not_found' => '%s does not exist', //TODO - Translation
+ 'not_enabled' => '%s is not enabled yet',
+ 'not_found' => '%s does not exist', // TODO - Translation
+ 'no_access' => 'You have no access on %s', // TODO - Translation
),
'import_export' => array(
- 'export_no_zip_extension' => 'ZIP extension is not present on your server. Please try to export files one by one.', //TODO - Translation
- 'feeds_imported' => 'Your feeds have been imported and will now be updated', //TODO - Translation
- 'feeds_imported_with_errors' => 'Your feeds have been imported but some errors occurred', //TODO - Translation
- 'file_cannot_be_uploaded' => 'File cannot be uploaded!', //TODO - Translation
- 'no_zip_extension' => 'ZIP extension is not present on your server.', //TODO - Translation
- 'zip_error' => 'An error occured during ZIP import.', //TODO - Translation
+ 'export_no_zip_extension' => 'ZIP extension is not present on your server. Please try to export files one by one.', // TODO - Translation
+ 'feeds_imported' => 'Your feeds have been imported and will now be updated', // TODO - Translation
+ 'feeds_imported_with_errors' => 'Your feeds have been imported but some errors occurred',
+ 'file_cannot_be_uploaded' => 'File cannot be uploaded!', // TODO - Translation
+ 'no_zip_extension' => 'ZIP extension is not present on your server.', // TODO - Translation
+ 'zip_error' => 'An error occured during ZIP import.', // TODO - Translation
),
'profile' => array(
- 'error' => 'Your profile cannot be modified', //TODO - Translation
- 'updated' => 'Your profile has been modified', //TODO - Translation
+ 'error' => 'Your profile cannot be modified', // TODO - Translation
+ 'updated' => 'Your profile has been modified', // TODO - Translation
),
'sub' => array(
- 'actualize' => 'Actualise', //TODO - Translation
+ 'actualize' => 'Actualise',
'articles' => array(
- 'marked_read' => 'The selected articles have been marked as read.', //TODO - Translation
- 'marked_unread' => 'The articles have been marked as unread.', //TODO - Translation
+ 'marked_read' => 'The selected articles have been marked as read.', // TODO - Translation
+ 'marked_unread' => 'The articles have been marked as unread.', // TODO - Translation
),
'category' => array(
- 'created' => 'Category %s has been created.', //TODO - Translation
- 'deleted' => 'Category has been deleted.', //TODO - Translation
- 'emptied' => 'Category has been emptied', //TODO - Translation
- 'error' => 'Category cannot be updated', //TODO - Translation
- 'name_exists' => 'Category name already exists.', //TODO - Translation
- 'no_id' => 'You must precise the id of the category.', //TODO - Translation
- 'no_name' => 'Category name cannot be empty.', //TODO - Translation
- 'not_delete_default' => 'You cannot delete the default category!', //TODO - Translation
- 'not_exist' => 'The category does not exist!', //TODO - Translation
- 'over_max' => 'You have reached your limit of categories (%d)', //TODO - Translation
- 'updated' => 'Category has been updated.', //TODO - Translation
+ 'created' => 'Category %s has been created.', // TODO - Translation
+ 'deleted' => 'Category has been deleted.', // TODO - Translation
+ 'emptied' => 'Category has been emptied', // TODO - Translation
+ 'error' => 'Category cannot be updated', // TODO - Translation
+ 'name_exists' => 'Category name already exists.', // TODO - Translation
+ 'not_delete_default' => 'You cannot delete the default category!', // TODO - Translation
+ 'not_exist' => 'The category does not exist!', // TODO - Translation
+ 'no_id' => 'You must precise the id of the category.',
+ 'no_name' => 'Category name cannot be empty.', // TODO - Translation
+ 'over_max' => 'You have reached your limit of categories (%d)', // TODO - Translation
+ 'updated' => 'Category has been updated.', // TODO - Translation
),
'feed' => array(
- 'actualized' => '<em>%s</em> has been updated', //TODO - Translation
- 'actualizeds' => 'RSS feeds have been updated', //TODO - Translation
- 'added' => 'RSS feed <em>%s</em> has been added', //TODO - Translation
- 'already_subscribed' => 'You have already subscribed to <em>%s</em>', //TODO - Translation
- 'deleted' => 'Feed has been deleted', //TODO - Translation
- 'error' => 'Feed cannot be updated', //TODO - Translation
- 'internal_problem' => 'The newsfeed could not be added. <a href="%s">Check FreshRSS logs</a> for details. You can try force adding by appending <code>#force_feed</code> to the URL.', //TODO - Translation
- 'invalid_url' => 'URL <em>%s</em> is invalid', //TODO - Translation
- 'n_actualized' => '%d feeds have been updated', //TODO - Translation
- 'n_entries_deleted' => '%d articles have been deleted', //TODO - Translation
- 'no_refresh' => 'There is no feed to refresh…', //TODO - Translation
- 'not_added' => '<em>%s</em> could not be added', //TODO - Translation
- 'over_max' => 'You have reached your limit of feeds (%d)', //TODO - Translation
- 'updated' => 'Feed has been updated', //TODO - Translation
+ 'actualized' => '<em>%s</em> has been updated', // TODO - Translation
+ 'actualizeds' => 'RSS feeds have been updated', // TODO - Translation
+ 'added' => 'RSS feed <em>%s</em> has been added', // TODO - Translation
+ 'already_subscribed' => 'You have already subscribed to <em>%s</em>', // TODO - Translation
+ 'deleted' => 'Feed has been deleted', // TODO - Translation
+ 'error' => 'Feed cannot be updated', // TODO - Translation
+ 'internal_problem' => 'The newsfeed could not be added. <a href="%s">Check FreshRSS logs</a> for details. You can try force adding by appending <code>#force_feed</code> to the URL.', // TODO - Translation
+ 'invalid_url' => 'URL <em>%s</em> is invalid', // TODO - Translation
+ 'not_added' => '<em>%s</em> could not be added', // TODO - Translation
+ 'no_refresh' => 'There is no feed to refresh…', // TODO - Translation
+ 'n_actualized' => '%d feeds have been updated', // TODO - Translation
+ 'n_entries_deleted' => '%d articles have been deleted', // TODO - Translation
+ 'over_max' => 'You have reached your limit of feeds (%d)', // TODO - Translation
+ 'updated' => 'Feed has been updated', // TODO - Translation
),
- 'purge_completed' => 'Purge completed (%d articles deleted)', //TODO - Translation
+ 'purge_completed' => 'Purge completed (%d articles deleted)', // TODO - Translation
),
'update' => array(
- 'can_apply' => 'FreshRSS will now be updated to the <strong>version %s</strong>.', //TODO - Translation
- 'error' => 'The update process has encountered an error: %s', //TODO - Translation
- 'file_is_nok' => 'New <strong>version %s</strong> available, but check permissions on <em>%s</em> directory. HTTP server must have rights to write into', //TODO - Translation
- 'finished' => 'Update completed!', //TODO - Translation
- 'none' => 'No update to apply', //TODO - Translation
- 'server_not_found' => 'Update server cannot be found. [%s]', //TODO - Translation
+ 'can_apply' => 'FreshRSS will now be updated to the <strong>version %s</strong>.', // TODO - Translation
+ 'error' => 'The update process has encountered an error: %s', // TODO - Translation
+ 'file_is_nok' => 'New <strong>version %s</strong> available, but check permissions on <em>%s</em> directory. HTTP server must have rights to write into', // TODO - Translation
+ 'finished' => 'Update completed!', // TODO - Translation
+ 'none' => 'No update to apply', // TODO - Translation
+ 'server_not_found' => 'Update server cannot be found. [%s]', // TODO - Translation
),
'user' => array(
'created' => array(
- '_' => 'User %s has been created', //TODO - Translation
- 'error' => 'User %s cannot be created', //TODO - Translation
+ 'error' => 'User %s cannot be created', // TODO - Translation
+ '_' => 'User %s has been created', // TODO - Translation
),
'deleted' => array(
- '_' => 'User %s has been deleted', //TODO - Translation
- 'error' => 'User %s cannot be deleted', //TODO - Translation
+ 'error' => 'User %s cannot be deleted', // TODO - Translation
+ '_' => 'User %s has been deleted', // TODO - Translation
),
'updated' => array(
- '_' => 'User %s has been updated', //TODO - Translation
- 'error' => 'User %s has not been updated', //TODO - Translation
+ 'error' => 'User %s has not been updated', // TODO - Translation
+ '_' => 'User %s has been updated', // TODO - Translation
),
),
);
diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php
index 5200a7005..dc3baf7c5 100644
--- a/app/i18n/ru/gen.php
+++ b/app/i18n/ru/gen.php
@@ -2,204 +2,206 @@
return array(
'action' => array(
- 'actualize' => 'Actualize', //TODO - Translation
- 'back' => '← Go back', //TODO - Translation
- 'back_to_rss_feeds' => '← Go back to your RSS feeds', //TODO - Translation
- 'cancel' => 'Cancel', //TODO - Translation
- 'create' => 'Create', //TODO - Translation
- 'disable' => 'Disable', //TODO - Translation
- 'empty' => 'Empty', //TODO - Translation
- 'enable' => 'Enable', //TODO - Translation
- 'export' => 'Export', //TODO - Translation
- 'filter' => 'Filter', //TODO - Translation
- 'import' => 'Import', //TODO - Translation
- 'manage' => 'Manage', //TODO - Translation
- 'mark_favorite' => 'Mark as favourite', //TODO - Translation
- 'mark_read' => 'Mark as read', //TODO - Translation
- 'remove' => 'Remove', //TODO - Translation
- 'see_website' => 'See website', //TODO - Translation
- 'submit' => 'Submit', //TODO - Translation
- 'truncate' => 'Delete all articles', //TODO - Translation
- 'update' => 'Update', //TODO - Translation
+ 'actualize' => 'Actualize', // TODO - Translation
+ 'back' => '← Go back', // TODO - Translation
+ 'back_to_rss_feeds' => '← Go back to your RSS feeds', // TODO - Translation
+ 'cancel' => 'Cancel', // TODO - Translation
+ 'create' => 'Create', // TODO - Translation
+ 'disable' => 'Disable', // TODO - Translation
+ 'empty' => 'Empty', // TODO - Translation
+ 'enable' => 'Enable', // TODO - Translation
+ 'export' => 'Export', // TODO - Translation
+ 'filter' => 'Filter', // TODO - Translation
+ 'import' => 'Import', // TODO - Translation
+ 'manage' => 'Manage', // TODO - Translation
+ 'mark_favorite' => 'Mark as favourite', // TODO - Translation
+ 'mark_read' => 'Mark as read', // TODO - Translation
+ 'purge' => 'Purge', // TODO - Translation
+ 'remove' => 'Remove', // TODO - Translation
+ 'see_website' => 'See website', // TODO - Translation
+ 'submit' => 'Submit', // TODO - Translation
+ 'truncate' => 'Delete all articles', // TODO - Translation
+ 'update' => 'Update', // TODO - Translation
),
'auth' => array(
- 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
- 'email' => 'Email address', //TODO - Translation
- 'keep_logged_in' => 'Keep me logged in <small>(%s дней)</small>', //TODO - Translation
- 'login' => 'Login', //TODO - Translation
- 'logout' => 'Logout', //TODO - Translation
+ 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
+ 'email' => 'Email address', // TODO - Translation
+ 'keep_logged_in' => 'Keep me logged in <small>(%s дней)</small>',
+ 'login' => 'Login', // TODO - Translation
+ 'logout' => 'Logout', // TODO - Translation
'password' => array(
- '_' => 'Password', //TODO - Translation
- 'format' => '<small>At least 7 characters</small>', //TODO - Translation
+ 'format' => '<small>At least 7 characters</small>', // TODO - Translation
+ '_' => 'Password', // TODO - Translation
),
'registration' => array(
- '_' => 'New account', //TODO - Translation
- 'ask' => 'Create an account?', //TODO - Translation
- 'title' => 'Account creation', //TODO - Translation
+ 'ask' => 'Create an account?', // TODO - Translation
+ 'title' => 'Account creation', // TODO - Translation
+ '_' => 'New account', // TODO - Translation
),
- 'reset' => 'Authentication reset', //TODO - Translation
+ 'reset' => 'Authentication reset', // TODO - Translation
'username' => array(
- '_' => 'Username', //TODO - Translation
- 'admin' => 'Administrator username', //TODO - Translation
- 'format' => '<small>maximum 16 alphanumeric characters</small>', //TODO - Translation
+ 'admin' => 'Administrator username', // TODO - Translation
+ 'format' => '<small>maximum 16 alphanumeric characters</small>', // TODO - Translation
+ '_' => 'Username', // TODO - Translation
),
),
'date' => array(
- 'Apr' => '\\A\\p\\r\\i\\l', //TODO - Translation
- 'apr' => 'apr', //TODO - Translation
- 'april' => 'Apr', //TODO - Translation
- 'Aug' => '\\A\\u\\g\\u\\s\\t', //TODO - Translation
- 'aug' => 'aug', //TODO - Translation
- 'august' => 'Aug', //TODO - Translation
- 'before_yesterday' => 'Before yesterday', //TODO - Translation
- 'Dec' => '\\D\\e\\c\\e\\m\\b\\e\\r', //TODO - Translation
- 'dec' => 'dec', //TODO - Translation
- 'december' => 'Dec', //TODO - Translation
- 'Feb' => '\\F\\e\\b\\r\\u\\a\\r\\y', //TODO - Translation
- 'feb' => 'feb', //TODO - Translation
- 'february' => 'Feb', //TODO - Translation
- 'format_date' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y', //TODO - Translation
- 'format_date_hour' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y \\a\\t H\\:i', //TODO - Translation
- 'fri' => 'Fri', //TODO - Translation
- 'Jan' => '\\J\\a\\n\\u\\a\\r\\y', //TODO - Translation
- 'jan' => 'jan', //TODO - Translation
- 'january' => 'Jan', //TODO - Translation
- 'Jul' => '\\J\\u\\l\\y', //TODO - Translation
- 'jul' => 'jul', //TODO - Translation
- 'july' => 'Jul', //TODO - Translation
- 'Jun' => '\\J\\u\\n\\e', //TODO - Translation
- 'jun' => 'jun', //TODO - Translation
- 'june' => 'Jun', //TODO - Translation
- 'last_3_month' => 'Last three months', //TODO - Translation
- 'last_6_month' => 'Last six months', //TODO - Translation
- 'last_month' => 'Last month', //TODO - Translation
- 'last_week' => 'Last week', //TODO - Translation
- 'last_year' => 'Last year', //TODO - Translation
- 'Mar' => '\\M\\a\\r\\c\\h', //TODO - Translation
- 'mar' => 'mar', //TODO - Translation
- 'march' => 'Mar', //TODO - Translation
- 'May' => '\\M\\a\\y', //TODO - Translation
- 'may' => 'May', //TODO - Translation
- 'may_' => 'May', //TODO - Translation
- 'mon' => 'Mon', //TODO - Translation
- 'month' => 'months', //TODO - Translation
- 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r', //TODO - Translation
- 'nov' => 'nov', //TODO - Translation
- 'november' => 'Nov', //TODO - Translation
- 'Oct' => '\\O\\c\\t\\o\\b\\e\\r', //TODO - Translation
- 'oct' => 'oct', //TODO - Translation
- 'october' => 'Oct', //TODO - Translation
- 'sat' => 'Sat', //TODO - Translation
- 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r', //TODO - Translation
- 'sep' => 'sep', //TODO - Translation
- 'september' => 'Sep', //TODO - Translation
- 'sun' => 'Sun', //TODO - Translation
- 'thu' => 'Thu', //TODO - Translation
- 'today' => 'Today', //TODO - Translation
- 'tue' => 'Tue', //TODO - Translation
- 'wed' => 'Wed', //TODO - Translation
- 'yesterday' => 'Yesterday', //TODO - Translation
+ 'Apr' => '\\A\\p\\r\\i\\l', // TODO - Translation
+ 'apr' => 'apr',
+ 'april' => 'Apr',
+ 'Aug' => '\\A\\u\\g\\u\\s\\t', // TODO - Translation
+ 'aug' => 'aug',
+ 'august' => 'Aug',
+ 'before_yesterday' => 'Before yesterday', // TODO - Translation
+ 'Dec' => '\\D\\e\\c\\e\\m\\b\\e\\r', // TODO - Translation
+ 'dec' => 'dec',
+ 'december' => 'Dec',
+ 'Feb' => '\\F\\e\\b\\r\\u\\a\\r\\y', // TODO - Translation
+ 'feb' => 'feb',
+ 'february' => 'Feb',
+ 'format_date' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y', // TODO - Translation
+ 'format_date_hour' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y \\a\\t H\\:i', // TODO - Translation
+ 'fri' => 'Fri', // TODO - Translation
+ 'Jan' => '\\J\\a\\n\\u\\a\\r\\y', // TODO - Translation
+ 'jan' => 'jan',
+ 'january' => 'Jan',
+ 'jul' => 'jul',
+ 'Jul' => '\\J\\u\\l\\y', // TODO - Translation
+ 'july' => 'Jul',
+ 'Jun' => '\\J\\u\\n\\e', // TODO - Translation
+ 'jun' => 'jun',
+ 'june' => 'Jun',
+ 'last_3_month' => 'Last three months', // TODO - Translation
+ 'last_6_month' => 'Last six months', // TODO - Translation
+ 'last_month' => 'Last month', // TODO - Translation
+ 'last_week' => 'Last week', // TODO - Translation
+ 'last_year' => 'Last year', // TODO - Translation
+ 'mar' => 'mar',
+ 'Mar' => '\\M\\a\\r\\c\\h', // TODO - Translation
+ 'march' => 'Mar',
+ 'May' => '\\M\\a\\y', // TODO - Translation
+ 'may' => 'May', // TODO - Translation
+ 'may_' => 'May', // TODO - Translation
+ 'mon' => 'Mon', // TODO - Translation
+ 'month' => 'months', // TODO - Translation
+ 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r', // TODO - Translation
+ 'nov' => 'nov',
+ 'november' => 'Nov',
+ 'Oct' => '\\O\\c\\t\\o\\b\\e\\r', // TODO - Translation
+ 'oct' => 'oct',
+ 'october' => 'Oct',
+ 'sat' => 'Sat', // TODO - Translation
+ 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r', // TODO - Translation
+ 'sep' => 'sep',
+ 'september' => 'Sep',
+ 'sun' => 'Sun', // TODO - Translation
+ 'thu' => 'Thu', // TODO - Translation
+ 'today' => 'Today', // TODO - Translation
+ 'tue' => 'Tue', // TODO - Translation
+ 'wed' => 'Wed', // TODO - Translation
+ 'yesterday' => 'Yesterday', // TODO - Translation
),
'freshrss' => array(
- '_' => 'FreshRSS', //TODO - Translation
- 'about' => 'About FreshRSS', //TODO - Translation
+ 'about' => 'About FreshRSS', // TODO - Translation
+ '_' => 'FreshRSS', // TODO - Translation
),
'js' => array(
- 'category_empty' => 'Empty category', //TODO - Translation
- 'confirm_action' => 'Are you sure you want to perform this action? It cannot be cancelled!', //TODO - Translation
- 'confirm_action_feed_cat' => 'Are you sure you want to perform this action? You will lose related favorites and user queries. It cannot be cancelled!', //TODO - Translation
+ 'category_empty' => 'Empty category', // TODO - Translation
+ 'confirm_action' => 'Are you sure you want to perform this action? It cannot be cancelled!', // TODO - Translation
+ 'confirm_action_feed_cat' => 'Are you sure you want to perform this action? You will lose related favorites and user queries. It cannot be cancelled!',
'feedback' => array(
- 'body_new_articles' => 'There are %%d new articles to read on FreshRSS.', //TODO - Translation
- 'request_failed' => 'A request has failed, it may have been caused by Internet connection problems.', //TODO - Translation
- 'title_new_articles' => 'FreshRSS: new articles!', //TODO - Translation
+ 'body_new_articles' => 'There are %%d new articles to read on FreshRSS.', // TODO - Translation
+ 'request_failed' => 'A request has failed, it may have been caused by Internet connection problems.', // TODO - Translation
+ 'title_new_articles' => 'FreshRSS: new articles!', // TODO - Translation
),
- 'new_article' => 'There are new available articles, click to refresh the page.', //TODO - Translation
- 'should_be_activated' => 'JavaScript must be enabled', //TODO - Translation
+ 'new_article' => 'There are new available articles, click to refresh the page.', // TODO - Translation
+ 'should_be_activated' => 'JavaScript must be enabled', // TODO - Translation
),
'lang' => array(
- 'cz' => 'Čeština',
- 'de' => 'Deutsch',
- 'en' => 'English',
- 'es' => 'Español',
- 'fr' => 'Français',
- 'he' => 'עברית',
- 'it' => 'Italiano',
- 'kr' => '한국어',
- 'nl' => 'Nederlands',
- 'oc' => 'Occitan',
- 'pt-br' => 'Português (Brasil)',
- 'ru' => 'Русский',
- 'tr' => 'Türkçe',
- 'zh-cn' => '简体中文',
+ 'cz' => 'Čeština', // TODO - Translation
+ 'de' => 'Deutsch', // TODO - Translation
+ 'en' => 'English', // TODO - Translation
+ 'es' => 'Español', // TODO - Translation
+ 'fr' => 'Français', // TODO - Translation
+ 'he' => 'עברית', // TODO - Translation
+ 'it' => 'Italiano', // TODO - Translation
+ 'kr' => '한국어', // TODO - Translation
+ 'nl' => 'Nederlands', // TODO - Translation
+ 'oc' => 'Occitan', // TODO - Translation
+ 'pt-br' => 'Português (Brasil)', // TODO - Translation
+ 'ru' => 'Русский', // TODO - Translation
+ 'sk' => 'Slovenčina', // TODO - Translation
+ 'tr' => 'Türkçe', // TODO - Translation
+ 'zh-cn' => '简体中文', // TODO - Translation
),
'menu' => array(
- 'about' => 'About', //TODO - Translation
- 'admin' => 'Administration', //TODO - Translation
- 'archiving' => 'Archiving', //TODO - Translation
- 'authentication' => 'Authentication', //TODO - Translation
- 'check_install' => 'Installation checking', //TODO - Translation
- 'configuration' => 'Configuration', //TODO - Translation
- 'display' => 'Display', //TODO - Translation
- 'extensions' => 'Extensions', //TODO - Translation
- 'logs' => 'Logs', //TODO - Translation
- 'queries' => 'User queries', //TODO - Translation
- 'reading' => 'Reading', //TODO - Translation
- 'search' => 'Search words or #tags', //TODO - Translation
- 'sharing' => 'Sharing', //TODO - Translation
- 'shortcuts' => 'Shortcuts', //TODO - Translation
- 'stats' => 'Statistics', //TODO - Translation
- 'system' => 'System configuration', //TODO - Translation
- 'update' => 'Update', //TODO - Translation
- 'user_management' => 'Manage users', //TODO - Translation
- 'user_profile' => 'Profile', //TODO - Translation
+ 'about' => 'About', // TODO - Translation
+ 'admin' => 'Administration', // TODO - Translation
+ 'archiving' => 'Archiving', // TODO - Translation
+ 'authentication' => 'Authentication', // TODO - Translation
+ 'check_install' => 'Installation checking', // TODO - Translation
+ 'configuration' => 'Configuration', // TODO - Translation
+ 'display' => 'Display', // TODO - Translation
+ 'extensions' => 'Extensions', // TODO - Translation
+ 'logs' => 'Logs', // TODO - Translation
+ 'queries' => 'User queries', // TODO - Translation
+ 'reading' => 'Reading', // TODO - Translation
+ 'search' => 'Search words or #tags', // TODO - Translation
+ 'sharing' => 'Sharing', // TODO - Translation
+ 'shortcuts' => 'Shortcuts', // TODO - Translation
+ 'stats' => 'Statistics', // TODO - Translation
+ 'system' => 'System configuration', // TODO - Translation
+ 'update' => 'Update', // TODO - Translation
+ 'user_management' => 'Manage users', // TODO - Translation
+ 'user_profile' => 'Profile', // TODO - Translation
),
'pagination' => array(
- 'first' => 'First', //TODO - Translation
- 'last' => 'Last', //TODO - Translation
- 'load_more' => 'Load more articles', //TODO - Translation
- 'mark_all_read' => 'Mark all as read', //TODO - Translation
- 'next' => 'Next', //TODO - Translation
- 'nothing_to_load' => 'There are no more articles', //TODO - Translation
- 'previous' => 'Previous', //TODO - Translation
+ 'first' => 'First', // TODO - Translation
+ 'last' => 'Last', // TODO - Translation
+ 'load_more' => 'Load more articles', // TODO - Translation
+ 'mark_all_read' => 'Mark all as read', // TODO - Translation
+ 'next' => 'Next', // TODO - Translation
+ 'nothing_to_load' => 'There are no more articles', // TODO - Translation
+ 'previous' => 'Previous', // TODO - Translation
),
'period' => array(
- 'days' => 'days', //TODO - Translation
- 'hours' => 'hours', //TODO - Translation
- 'months' => 'months', //TODO - Translation
- 'weeks' => 'weeks', //TODO - Translation
- 'years' => 'years', //TODO - Translation
+ 'days' => 'days', // TODO - Translation
+ 'hours' => 'hours', // TODO - Translation
+ 'months' => 'months', // TODO - Translation
+ 'weeks' => 'weeks', // TODO - Translation
+ 'years' => 'years', // TODO - Translation
),
'share' => array(
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
- 'email' => 'Email',
- 'facebook' => 'Facebook',
- 'gnusocial' => 'GNU social',
- 'jdh' => 'Journal du hacker',
- 'Known' => 'Known based sites',
- 'lemmy' => 'Lemmy',
- 'linkedin' => 'LinkedIn',
- 'mastodon' => 'Mastodon',
- 'movim' => 'Movim',
- 'pinboard' => 'Pinboard',
- 'pocket' => 'Pocket',
- 'print' => 'Print',
- 'shaarli' => 'Shaarli',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag v1',
- 'wallabagv2' => 'wallabag v2',
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
+ 'email' => 'Email', // TODO - Translation
+ 'facebook' => 'Facebook', // TODO - Translation
+ 'gnusocial' => 'GNU social', // TODO - Translation
+ 'jdh' => 'Journal du hacker', // TODO - Translation
+ 'Known' => 'Known based sites', // TODO - Translation
+ 'lemmy' => 'Lemmy', // TODO - Translation
+ 'linkedin' => 'LinkedIn', // TODO - Translation
+ 'mastodon' => 'Mastodon', // TODO - Translation
+ 'movim' => 'Movim', // TODO - Translation
+ 'pinboard' => 'Pinboard', // TODO - Translation
+ 'pocket' => 'Pocket', // TODO - Translation
+ 'print' => 'Print', // TODO - Translation
+ 'shaarli' => 'Shaarli', // TODO - Translation
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag v1', // TODO - Translation
+ 'wallabagv2' => 'wallabag v2', // TODO - Translation
),
'short' => array(
- 'attention' => 'Warning!', //TODO - Translation
- 'blank_to_disable' => 'Leave blank to disable', //TODO - Translation
- 'by_author' => 'By:', //TODO - Translation
- 'by_default' => 'By default', //TODO - Translation
- 'damn' => 'Damn!', //TODO - Translation
- 'default_category' => 'Uncategorized', //TODO - Translation
- 'no' => 'No', //TODO - Translation
- 'not_applicable' => 'Not available', //TODO - Translation
- 'ok' => 'Ok!', //TODO - Translation
- 'or' => 'or', //TODO - Translation
- 'yes' => 'Yes', //TODO - Translation
+ 'attention' => 'Warning!', // TODO - Translation
+ 'blank_to_disable' => 'Leave blank to disable', // TODO - Translation
+ 'by_author' => 'By:', // TODO - Translation
+ 'by_default' => 'By default', // TODO - Translation
+ 'damn' => 'Damn!',
+ 'default_category' => 'Uncategorized', // TODO - Translation
+ 'no' => 'No', // TODO - Translation
+ 'not_applicable' => 'Not available', // TODO - Translation
+ 'ok' => 'Ok!', // TODO - Translation
+ 'or' => 'or', // TODO - Translation
+ 'yes' => 'Yes', // TODO - Translation
),
);
diff --git a/app/i18n/ru/index.php b/app/i18n/ru/index.php
index b5f022cd2..bb8a95fa9 100644
--- a/app/i18n/ru/index.php
+++ b/app/i18n/ru/index.php
@@ -2,65 +2,65 @@
return array(
'about' => array(
- '_' => 'About', //TODO - Translation
- 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', //TODO - Translation
- 'bugs_reports' => 'Bugs reports', //TODO - Translation
- 'credits' => 'Credits', //TODO - Translation
- 'credits_content' => 'Some design elements come from <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> although FreshRSS doesn’t use this framework. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Icons</a> come from <a href="https://www.gnome.org/">GNOME project</a>. <em>Open Sans</em> font police has been created by <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a>. FreshRSS is based on <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, a PHP framework.', //TODO - Translation
- 'freshrss_description' => 'FreshRSS is a RSS feeds aggregator to self-host like <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> or <a href="https://github.com/LeedRSS/Leed">Leed</a>. It is light and easy to take in hand while being powerful and configurable tool.', //TODO - Translation
- 'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">on Github</a>', //TODO - Translation
- 'license' => 'License', //TODO - Translation
- 'project_website' => 'Project website', //TODO - Translation
- 'title' => 'About', //TODO - Translation
- 'version' => 'Version', //TODO - Translation
- 'website' => 'Website', //TODO - Translation
- ),
- 'tos' => array(
- 'title' => 'Terms of Service', // TODO - Translation
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', // TODO - Translation
+ 'bugs_reports' => 'Bugs reports', // TODO - Translation
+ 'credits' => 'Credits', // TODO - Translation
+ 'credits_content' => 'Some design elements come from <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> although FreshRSS doesn’t use this framework. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Icons</a> come from <a href="https://www.gnome.org/">GNOME project</a>. <em>Open Sans</em> font police has been created by <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a>. FreshRSS is based on <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, a PHP framework.', // TODO - Translation
+ 'freshrss_description' => 'FreshRSS is a RSS feeds aggregator to self-host like <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> or <a href="https://github.com/LeedRSS/Leed">Leed</a>. It is light and easy to take in hand while being powerful and configurable tool.', // TODO - Translation
+ 'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">on Github</a>', // TODO - Translation
+ 'license' => 'License', // TODO - Translation
+ 'project_website' => 'Project website', // TODO - Translation
+ 'title' => 'About', // TODO - Translation
+ 'version' => 'Version', // TODO - Translation
+ 'website' => 'Website', // TODO - Translation
+ '_' => 'About', // TODO - Translation
),
'feed' => array(
- 'add' => 'You may add some feeds.', //TODO - Translation
- 'empty' => 'There is no article to show.', //TODO - Translation
- 'rss_of' => 'RSS feed of %s', //TODO - Translation
- 'title' => 'Your RSS feeds', //TODO - Translation
- 'title_global' => 'Global view', //TODO - Translation
- 'title_fav' => 'Your favourites', //TODO - Translation
+ 'add' => 'You may add some feeds.', // TODO - Translation
+ 'empty' => 'There is no article to show.', // TODO - Translation
+ 'rss_of' => 'RSS feed of %s', // TODO - Translation
+ 'title' => 'Your RSS feeds', // TODO - Translation
+ 'title_fav' => 'Your favourites', // TODO - Translation
+ 'title_global' => 'Global view', // TODO - Translation
),
'log' => array(
- '_' => 'Logs',
- 'clear' => 'Clear the logs', //TODO - Translation
- 'empty' => 'Log file is empty', //TODO - Translation
- 'title' => 'Logs', //TODO - Translation
+ 'clear' => 'Clear the logs', // TODO - Translation
+ 'empty' => 'Log file is empty', // TODO - Translation
+ 'title' => 'Logs', // TODO - Translation
+ '_' => 'Logs', // TODO - Translation
),
'menu' => array(
- 'about' => 'About FreshRSS',
- 'add_query' => 'Add a query',
- 'before_one_day' => 'Before one day',
- 'before_one_week' => 'Before one week',
- 'favorites' => 'Favourites (%s)',
- 'global_view' => 'Global view',
- 'main_stream' => 'Main stream',
- 'mark_all_read' => 'Mark all as read',
- 'mark_cat_read' => 'Mark category as read',
- 'mark_feed_read' => 'Mark feed as read',
- 'mark_selection_unread' => 'Mark selection as unread', //TODO - Translation
- 'newer_first' => 'Newer first', //TODO - Translation
- 'non-starred' => 'Show all but favorites', //TODO - Translation
- 'normal_view' => 'Normal view', //TODO - Translation
- 'older_first' => 'Oldest first', //TODO - Translation
- 'queries' => 'User queries', //TODO - Translation
- 'read' => 'Show only read', //TODO - Translation
- 'reader_view' => 'Reading view', //TODO - Translation
- 'rss_view' => 'RSS feed', //TODO - Translation
- 'search_short' => 'Search', //TODO - Translation
- 'starred' => 'Show only favorites', //TODO - Translation
- 'stats' => 'Statistics', //TODO - Translation
- 'subscription' => 'Subscriptions management',
- 'tags' => 'My labels', //TODO - Translation
- 'unread' => 'Show only unread', //TODO - Translation
+ 'about' => 'About FreshRSS', // TODO - Translation
+ 'add_query' => 'Add a query', // TODO - Translation
+ 'before_one_day' => 'Before one day', // TODO - Translation
+ 'before_one_week' => 'Before one week', // TODO - Translation
+ 'favorites' => 'Favourites (%s)', // TODO - Translation
+ 'global_view' => 'Global view', // TODO - Translation
+ 'main_stream' => 'Main stream', // TODO - Translation
+ 'mark_all_read' => 'Mark all as read', // TODO - Translation
+ 'mark_cat_read' => 'Mark category as read', // TODO - Translation
+ 'mark_feed_read' => 'Mark feed as read', // TODO - Translation
+ 'mark_selection_unread' => 'Mark selection as unread', // TODO - Translation
+ 'newer_first' => 'Newer first', // TODO - Translation
+ 'non-starred' => 'Show all but favorites',
+ 'normal_view' => 'Normal view', // TODO - Translation
+ 'older_first' => 'Oldest first', // TODO - Translation
+ 'queries' => 'User queries', // TODO - Translation
+ 'read' => 'Show only read',
+ 'reader_view' => 'Reading view', // TODO - Translation
+ 'rss_view' => 'RSS feed', // TODO - Translation
+ 'search_short' => 'Search', // TODO - Translation
+ 'starred' => 'Show only favorites',
+ 'stats' => 'Statistics', // TODO - Translation
+ 'subscription' => 'Subscriptions management', // TODO - Translation
+ 'tags' => 'My labels', // TODO - Translation
+ 'unread' => 'Show only unread',
),
- 'share' => 'Share',
+ 'share' => 'Share', // TODO - Translation
'tag' => array(
- 'related' => 'Article tags', //TODO - Translation
+ 'related' => 'Article tags', // TODO - Translation
+ ),
+ 'tos' => array(
+ 'title' => 'Terms of Service', // TODO - Translation
),
);
diff --git a/app/i18n/ru/install.php b/app/i18n/ru/install.php
index fd1e5c962..47069abca 100644
--- a/app/i18n/ru/install.php
+++ b/app/i18n/ru/install.php
@@ -3,7 +3,7 @@
return array(
'action' => array(
'finish' => 'Завершить установку',
- 'fix_errors_before' => 'Пожалуйста, исправьте ошибки прежде чем переходить к следующему этапу.',
+ 'fix_errors_before' => 'Пожалуйста, исправьте ошибки прежде чем переходить к следующему этапу.',
'keep_install' => 'Сохранить предыдущую установку',
'next_step' => 'Перейти к следующему этапу',
'reinstall' => 'Переустановить FreshRSS',
@@ -17,20 +17,19 @@ return array(
'type' => 'Метод аутентификации',
),
'bdd' => array(
- '_' => 'База данных',
'conf' => array(
- '_' => 'Конфигурация базы данныхDatabase configuration',
'ko' => 'Проверьте конфигурацию базы данных.',
'ok' => 'Конфигурация базы данных сохранена.',
+ '_' => 'Конфигурация базы данныхDatabase configuration',
),
'host' => 'Хост',
'password' => 'Пароль базы данных',
'prefix' => 'Префикс таблицы',
'type' => 'Тип базы данных',
'username' => 'Имя пользователя базы данных',
+ '_' => 'База данных',
),
'check' => array(
- '_' => 'Проверки',
'already_installed' => 'Обнаружена предыдущая установка FreshRSS!',
'cache' => array(
'nok' => 'Проверьте права доступа к папке <em>./data/cache</em> . Сервер HTTP должен иметь права на запись в эту папку.',
@@ -65,12 +64,12 @@ return array(
'ok' => 'Ваш HTTP REFERER известен и соотвествует вашему серверу.',
),
'json' => array(
- 'nok' => 'Cannot find a recommended library to parse JSON.', //TODO - Translation
- 'ok' => 'You have a recommended library to parse JSON.', //TODO - Translation
+ 'nok' => 'Cannot find a recommended library to parse JSON.', // TODO - Translation
+ 'ok' => 'You have a recommended library to parse JSON.', // TODO - Translation
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
'nok' => 'У вас не установлен фрейворк Minz.',
@@ -90,34 +89,35 @@ return array(
),
'users' => array(
'nok' => 'Проверьте права доступа к папке <em>./data/users</em> . Сервер HTTP должен иметь права на запись в эту папку.',
- 'ok' => 'Права на папку users в порядке.',
+ 'ok' => 'Права на папку users в порядке.',
),
'xml' => array(
- 'nok' => 'Cannot find the required library to parse XML.',
- 'ok' => 'You have the required library to parse XML.',
+ 'nok' => 'Cannot find the required library to parse XML.', // TODO - Translation
+ 'ok' => 'You have the required library to parse XML.', // TODO - Translation
),
+ '_' => 'Проверки',
),
'conf' => array(
- '_' => 'Общие настройки',
'ok' => 'Общие настройки были сохранены.',
+ '_' => 'Общие настройки',
),
'congratulations' => 'Поздравляем!',
'default_user' => 'Имя пользователя по умолчанию <small>(максимум 16 латинских букв и/или цифр)</small>',
'delete_articles_after' => 'Удалять статьи после',
- 'fix_errors_before' => 'Пожалуйста, исправьте ошибки прежде чем переходить к следующему этапу..',
+ 'fix_errors_before' => 'Пожалуйста, исправьте ошибки прежде чем переходить к следующему этапу..',
'javascript_is_better' => 'FreshRSS принесёт больше удовольствия, если включить JavaScript',
'js' => array(
'confirm_reinstall' => 'Переустанавливая FreshRSS, вы потеряете предыдущую конфигурацию. Вы хотите продолжить?',
),
'language' => array(
- '_' => 'Язык',
'choose' => 'Выберите язык для FreshRSS',
'defined' => 'Язык выбран.',
+ '_' => 'Язык',
),
'not_deleted' => 'Что-то пошло не так; удалите файл <em>%s</em> вручную.',
'ok' => 'Установка успешна.',
'step' => '%d этап',
'steps' => 'Этапы',
- 'title' => 'Установка · FreshRSS',
'this_is_the_end' => 'Это конец',
+ 'title' => 'Установка · FreshRSS',
);
diff --git a/app/i18n/ru/sub.php b/app/i18n/ru/sub.php
index e8cdeb89d..a3eff66fc 100644
--- a/app/i18n/ru/sub.php
+++ b/app/i18n/ru/sub.php
@@ -2,103 +2,103 @@
return array(
'api' => array(
- 'documentation' => 'Copy the following URL to use it within an external tool.', //TODO - Translation
- 'title' => 'API', //TODO - Translation
+ 'documentation' => 'Copy the following URL to use it within an external tool.', // TODO - Translation
+ 'title' => 'API', // TODO - Translation
),
'bookmarklet' => array(
- 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', //TODO - Translation
- 'label' => 'Subscribe', //TODO - Translation
- 'title' => 'Bookmarklet', //TODO - Translation
+ 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', // TODO - Translation
+ 'label' => 'Subscribe', // TODO - Translation
+ 'title' => 'Bookmarklet', // TODO - Translation
),
'category' => array(
- '_' => 'Category', //TODO - Translation
- 'add' => 'Add a category', //TODO - Translation
- 'archiving' => 'Archivage', //TODO - Translation
- 'empty' => 'Empty category', //TODO - Translation
- 'information' => 'Information', //TODO - Translation
- 'new' => 'New category', //TODO - Translation
- 'position' => 'Display position', //TODO - Translation
- 'position_help' => 'To control category sort order', //TODO - Translation
- 'title' => 'Title', //TODO - Translation
+ 'add' => 'Add a category', // TODO - Translation
+ 'archiving' => 'Archivage',
+ 'empty' => 'Empty category', // TODO - Translation
+ 'information' => 'Information', // TODO - Translation
+ 'new' => 'New category', // TODO - Translation
+ 'position' => 'Display position', // TODO - Translation
+ 'position_help' => 'To control category sort order', // TODO - Translation
+ 'title' => 'Title', // TODO - Translation
+ '_' => 'Category', // TODO - Translation
),
'feed' => array(
- 'add' => 'Add a RSS feed', //TODO - Translation
- 'advanced' => 'Advanced', //TODO - Translation
- 'archiving' => 'Archivage', //TODO - Translation
+ 'add' => 'Add a RSS feed', // TODO - Translation
+ 'advanced' => 'Advanced', // TODO - Translation
+ 'archiving' => 'Archivage',
'auth' => array(
- 'configuration' => 'Login', //TODO - Translation
- 'help' => 'Connection allows to access HTTP protected RSS feeds', //TODO - Translation
- 'http' => 'HTTP Authentication', //TODO - Translation
- 'password' => 'HTTP password', //TODO - Translation
- 'username' => 'HTTP username', //TODO - Translation
+ 'configuration' => 'Login', // TODO - Translation
+ 'help' => 'Connection allows to access HTTP protected RSS feeds',
+ 'http' => 'HTTP Authentication', // TODO - Translation
+ 'password' => 'HTTP password', // TODO - Translation
+ 'username' => 'HTTP username', // TODO - Translation
),
- 'clear_cache' => 'Always clear cache', //TODO - Translation
- 'css_help' => 'Retrieves truncated RSS feeds (caution, requires more time!)', //TODO - Translation
- 'css_path' => 'Articles CSS path on original website', //TODO - Translation
- 'description' => 'Description', //TODO - Translation
- 'empty' => 'This feed is empty. Please verify that it is still maintained.', //TODO - Translation
- 'error' => 'This feed has encountered a problem. Please verify that it is always reachable then actualize it.', //TODO - Translation
+ 'clear_cache' => 'Always clear cache', // TODO - Translation
+ 'css_help' => 'Retrieves truncated RSS feeds (caution, requires more time!)', // TODO - Translation
+ 'css_path' => 'Articles CSS path on original website', // TODO - Translation
+ 'description' => 'Description', // TODO - Translation
+ 'empty' => 'This feed is empty. Please verify that it is still maintained.', // TODO - Translation
+ 'error' => 'This feed has encountered a problem. Please verify that it is always reachable then actualize it.',
'filteractions' => array(
- '_' => 'Filter actions', //TODO - Translation
- 'help' => 'Write one search filter per line.', //TODO - Translation
+ 'help' => 'Write one search filter per line.', // TODO - Translation
+ '_' => 'Filter actions', // TODO - Translation
),
- 'information' => 'Information', //TODO - Translation
- 'keep_min' => 'Minimum number of articles to keep', //TODO - Translation
- 'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.', //TODO - Translation
- 'mute' => 'mute', //TODO - Translation
- 'no_selected' => 'No feed selected.', //TODO - Translation
- 'number_entries' => '%d articles', //TODO - Translation
+ 'information' => 'Information', // TODO - Translation
+ 'keep_min' => 'Minimum number of articles to keep', // TODO - Translation
+ 'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.', // TODO - Translation
+ 'mute' => 'mute', // TODO - Translation
+ 'no_selected' => 'No feed selected.', // TODO - Translation
+ 'number_entries' => '%d articles', // TODO - Translation
'priority' => array(
- '_' => 'Visibility', //TODO - Translation
- 'archived' => 'Do not show (archived)', //TODO - Translation
- 'main_stream' => 'Show in main stream', //TODO - Translation
- 'normal' => 'Show in its category', //TODO - Translation
+ 'archived' => 'Do not show (archived)', // TODO - Translation
+ 'main_stream' => 'Show in main stream', // TODO - Translation
+ 'normal' => 'Show in its category', // TODO - Translation
+ '_' => 'Visibility', // TODO - Translation
),
- 'websub' => 'Instant notification with WebSub', //TODO - Translation
'show' => array(
- 'all' => 'Show all feeds', //TODO - Translation
- 'error' => 'Show only feeds with error', //TODO - Translation
+ 'all' => 'Show all feeds', // TODO - Translation
+ 'error' => 'Show only feeds with error', // TODO - Translation
),
'showing' => array(
- 'error' => 'Showing only feeds with error', //TODO - Translation
+ 'error' => 'Showing only feeds with error', // TODO - Translation
),
- 'ssl_verify' => 'Verify SSL security', //TODO - Translation
- 'stats' => 'Statistics', //TODO - Translation
- 'think_to_add' => 'You may add some feeds.', //TODO - Translation
- 'timeout' => 'Timeout in seconds', //TODO - Translation
- 'title' => 'Title', //TODO - Translation
- 'title_add' => 'Add a RSS feed', //TODO - Translation
- 'ttl' => 'Do not automatically refresh more often than', //TODO - Translation
- 'url' => 'Feed URL', //TODO - Translation
- 'validator' => 'Check the validity of the feed', //TODO - Translation
- 'website' => 'Website URL', //TODO - Translation
+ 'ssl_verify' => 'Verify SSL security', // TODO - Translation
+ 'stats' => 'Statistics', // TODO - Translation
+ 'think_to_add' => 'You may add some feeds.', // TODO - Translation
+ 'timeout' => 'Timeout in seconds', // TODO - Translation
+ 'title' => 'Title', // TODO - Translation
+ 'title_add' => 'Add a RSS feed', // TODO - Translation
+ 'ttl' => 'Do not automatically refresh more often than', // TODO - Translation
+ 'url' => 'Feed URL', // TODO - Translation
+ 'validator' => 'Check the validity of the feed', // TODO - Translation
+ 'website' => 'Website URL', // TODO - Translation
+ 'websub' => 'Instant notification with WebSub', // TODO - Translation
),
'firefox' => array(
- 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.', //TODO - Translation
- 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', //TODO - Translation
- 'title' => 'Firefox feed reader', //TODO - Translation
+ 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.', // TODO - Translation
+ 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', // TODO - Translation
+ 'title' => 'Firefox feed reader', // TODO - Translation
),
'import_export' => array(
- 'export' => 'Export', //TODO - Translation
- 'export_opml' => 'Export list of feeds (OPML)', //TODO - Translation
- 'export_starred' => 'Export your favourites', //TODO - Translation
- 'export_labelled' => 'Export your labelled articles', //TODO
- 'feed_list' => 'List of %s articles', //TODO - Translation
- 'file_to_import' => 'File to import<br />(OPML, JSON or ZIP)', //TODO - Translation
- 'file_to_import_no_zip' => 'File to import<br />(OPML or JSON)', //TODO - Translation
- 'import' => 'Import', //TODO - Translation
- 'starred_list' => 'List of favourite articles', //TODO - Translation
- 'title' => 'Import / export', //TODO - Translation
+ 'export' => 'Export', // TODO - Translation
+ 'export_labelled' => 'Export your labelled articles', // TODO - Translation
+ 'export_opml' => 'Export list of feeds (OPML)', // TODO - Translation
+ 'export_starred' => 'Export your favourites', // TODO - Translation
+ 'feed_list' => 'List of %s articles', // TODO - Translation
+ 'file_to_import' => 'File to import<br />(OPML, JSON or ZIP)', // TODO - Translation
+ 'file_to_import_no_zip' => 'File to import<br />(OPML or JSON)', // TODO - Translation
+ 'import' => 'Import', // TODO - Translation
+ 'starred_list' => 'List of favourite articles', // TODO - Translation
+ 'title' => 'Import / export', // TODO - Translation
),
'menu' => array(
- 'bookmark' => 'Subscribe (FreshRSS bookmark)', //TODO - Translation
- 'import_export' => 'Import / export', //TODO - Translation
- 'subscription_management' => 'Subscriptions management', //TODO - Translation
- 'subscription_tools' => 'Subscription tools', //TODO - Translation
+ 'bookmark' => 'Subscribe (FreshRSS bookmark)', // TODO - Translation
+ 'import_export' => 'Import / export', // TODO - Translation
+ 'subscription_management' => 'Subscriptions management', // TODO - Translation
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
),
'title' => array(
- '_' => 'Subscriptions management', //TODO - Translation
- 'feed_management' => 'RSS feeds management', //TODO - Translation
- 'subscription_tools' => 'Subscription tools', //TODO - Translation
+ 'feed_management' => 'RSS feeds management', // TODO - Translation
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
+ '_' => 'Subscriptions management', // TODO - Translation
),
);
diff --git a/app/i18n/ru/user.php b/app/i18n/ru/user.php
index 3a8343c11..52197ad46 100644
--- a/app/i18n/ru/user.php
+++ b/app/i18n/ru/user.php
@@ -3,35 +3,35 @@
return array(
'email' => array(
'feedback' => array(
- 'invalid' => 'The email address is invalid.', //TODO - Translation
- 'required' => 'The email address is required.', //TODO - Translation
+ 'invalid' => 'The email address is invalid.', // TODO - Translation
+ 'required' => 'The email address is required.', // TODO - Translation
),
'validation' => array(
- 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', //TODO - Translation
- 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', //TODO - Translation
+ 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', // TODO - Translation
+ 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', // TODO - Translation
'feedback' => array(
- 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', //TODO - Translation
- 'email_sent' => 'An email has been sent to your address.', //TODO - Translation
- 'error' => 'The email address failed to be validated.', //TODO - Translation
- 'ok' => 'The email address has been validated.', //TODO - Translation
- 'unneccessary' => 'The email address was already validated.', //TODO - Translation
- 'wrong_token' => 'The email address failed to be validated due to a wrong token.', //TODO - Translation
+ 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', // TODO - Translation
+ 'email_sent' => 'An email has been sent to your address.', // TODO - Translation
+ 'error' => 'The email address failed to be validated.', // TODO - Translation
+ 'ok' => 'The email address has been validated.', // TODO - Translation
+ 'unneccessary' => 'The email address was already validated.', // TODO - Translation
+ 'wrong_token' => 'The email address failed to be validated due to a wrong token.', // TODO - Translation
),
- 'need_to' => 'You need to validate your email address before being able to use %s.', //TODO - Translation
- 'resend_email' => 'Resend the email', //TODO - Translation
- 'title' => 'Email address validation', //TODO - Translation
- ),
- ),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
+ 'need_to' => 'You need to validate your email address before being able to use %s.', // TODO - Translation
+ 'resend_email' => 'Resend the email', // TODO - Translation
+ 'title' => 'Email address validation', // TODO - Translation
),
),
'mailer' => array(
'email_need_validation' => array(
- 'title' => 'You need to validate your account', //TODO - Translation
- 'welcome' => 'Welcome %s,', //TODO - Translation
- 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', //TODO - Translation
+ 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', // TODO - Translation
+ 'title' => 'You need to validate your account', // TODO - Translation
+ 'welcome' => 'Welcome %s,', // TODO - Translation
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
),
),
);
diff --git a/app/i18n/sk/admin.php b/app/i18n/sk/admin.php
index 347204f37..1e06c40b9 100644
--- a/app/i18n/sk/admin.php
+++ b/app/i18n/sk/admin.php
@@ -83,9 +83,9 @@ return array(
'ok' => 'Našiel sa PDO a aspoň jeden z podporovaných ovládačov (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'Inštalácia PHP',
'nok' => 'Vaša verzia PHP je %s, ale FreshRSS vyžaduje minimálne verziu %s.',
'ok' => 'Vaša verzia PHP %s je kompatibilná s FreshRSS.',
+ '_' => 'Inštalácia PHP',
),
'tables' => array(
'nok' => 'V databáze chýba jedna alebo viacero tabuliek.',
@@ -116,8 +116,8 @@ return array(
'name' => 'Názov',
'no_configure_view' => 'Toto rozšírenie nemá nastavenia.',
'system' => array(
- '_' => 'Systémové rozšírenia',
'no_rights' => 'Systémové rozšírenie (nemáte oprávnenia)',
+ '_' => 'Systémové rozšírenia',
),
'title' => 'Rozšírenia',
'update' => 'Sú dostupné aktualizácie',
@@ -125,7 +125,6 @@ return array(
'version' => 'Verzia',
),
'stats' => array(
- '_' => 'Štatistiky',
'all_feeds' => 'Všetky kanály',
'category' => 'Kategória',
'entry_count' => 'Počet položiek',
@@ -155,36 +154,44 @@ return array(
'status_unread' => 'Neprečítané',
'title' => 'Štatistiky',
'top_feed' => 'Top 10 kanálov',
+ '_' => 'Štatistiky',
),
'system' => array(
- '_' => 'Nastavenia systému',
'auto-update-url' => 'Odkaz na aktualizačný server',
- 'instance-name' => 'Názov inštancie',
- 'max-categories' => 'Limit počtu kategórií pre používateľa',
- 'max-feeds' => 'Limit počtu kanálov pre používateľov',
'cookie-duration' => array(
'help' => 'v sekundách',
'number' => 'Dobra, počas ktorej ste prihlásený',
),
+ 'force_email_validation' => 'Force email addresses validation', // TODO - Translation
+ 'instance-name' => 'Názov inštancie',
+ 'max-categories' => 'Limit počtu kategórií pre používateľa',
+ 'max-feeds' => 'Limit počtu kanálov pre používateľov',
'registration' => array(
'help' => '0 znamená žiadny limit počtu účtov',
'number' => 'Maximálny počt účtov',
),
+ '_' => 'Nastavenia systému',
),
'update' => array(
- '_' => 'Aktualizácia systému',
'apply' => 'Použiť',
'check' => 'Skontrolovať aktualizácie',
'current_version' => 'Vaša aktuálna verzia FreshRSS: %s',
'last' => 'Posledná kontrola: %s',
'none' => 'Žiadna nová aktualizácia',
'title' => 'Aktualizácia systému',
+ '_' => 'Aktualizácia systému',
),
'user' => array(
'articles_and_size' => '%s článkov (%s)',
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => 'Vytvoriť nového používateľa',
+ 'database_size' => 'Database size', // TODO - Translation
'delete_users' => 'Zmazať používateľa',
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => 'Jazyk',
+ 'list' => 'User list', // TODO - Translation
'number' => 'Je vytvorený používateľ: %d',
'numbers' => 'Je vytvorených používateľov: %d',
'password_form' => 'Heslo<br /><small>(pre spôsob prihlásenia cez webový formulár)</small>',
@@ -192,8 +199,8 @@ return array(
'selected' => 'Označený používateľ',
'title' => 'Správa používateľov',
'update_users' => 'Sktualizovať používateľov',
- 'user_list' => 'Zoznam používateľov',
'username' => 'Používateľské meno',
'users' => 'Používatelia',
+ 'user_list' => 'Zoznam používateľov',
),
);
diff --git a/app/i18n/sk/conf.php b/app/i18n/sk/conf.php
index 2e2289b79..0f758424b 100644
--- a/app/i18n/sk/conf.php
+++ b/app/i18n/sk/conf.php
@@ -2,19 +2,26 @@
return array(
'archiving' => array(
- '_' => 'Archivovanie',
- 'advanced' => 'Pokročilé',
'delete_after' => 'Vymazať články po',
+ 'exception' => 'Purge exception', // TODO - Translation
'help' => 'Viac možností nájdete v nastaveniach kanála',
+ 'keep_favourites' => 'Never delete favourites', // TODO - Translation
+ 'keep_labels' => 'Never delete labels', // TODO - Translation
+ 'keep_max' => 'Maximum number of articles to keep', // TODO - Translation
'keep_min_by_feed' => 'Minimálny počet článkov kanála na zachovanie',
+ 'keep_period' => 'Maximum age of articles to keep', // TODO - Translation
+ 'keep_unreads' => 'Never delete unreads', // TODO - Translation
+ 'maintenance' => 'Maintenance', // TODO - Translation
'optimize' => 'Optimalizovať databázu',
'optimize_help' => 'Občas vykonajte na zmenšenie veľkosti databázy',
+ 'policy' => 'Purge policy', // TODO - Translation
+ 'policy_warning' => 'If no purge policy is selected, every article will be kept.', // TODO - Translation
'purge_now' => 'Vyčistiť teraz',
'title' => 'Archivovanie',
'ttl' => 'Neaktualizovať častejšie ako',
+ '_' => 'Archivovanie',
),
'display' => array(
- '_' => 'Zobrazenie',
'icon' => array(
'bottom_line' => 'Spodný riadok',
'display_authors' => 'Autori',
@@ -39,20 +46,22 @@ return array(
'no_limit' => 'Bez obmedzenia',
'thin' => 'Úzka',
),
+ '_' => 'Zobrazenie',
),
'profile' => array(
- '_' => 'Správca profilu',
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => 'Vymazanie účtu',
'warn' => 'Váš účet a všetky údaje v ňom budú vymazané.',
+ '_' => 'Vymazanie účtu',
),
+ 'email' => 'Email address', // TODO - Translation
'password_api' => 'Heslo API<br /><small>(pre mobilné aplikácie)</small>',
'password_form' => 'Heslo<br /><small>(pre spôsob prihlásenia cez webový formulár)</small>',
'password_format' => 'Najmenej 7 znakov',
'title' => 'Profil',
+ '_' => 'Správca profilu',
),
'query' => array(
- '_' => 'Dopyty používateľa',
'deprecated' => 'Tento dopyt už nie je platný. Kategória alebo kanál boli vymazané.',
'display' => 'Zobraziť výsledky dopytu používateľa',
'filter' => 'Použitý filter:',
@@ -60,8 +69,8 @@ return array(
'get_category' => 'Zobraziť kategóriu "%s"',
'get_favorite' => 'Zobraziť obľúbené články',
'get_feed' => 'Zobraziť kanál "%s"',
- 'no_filter' => 'Žiadny filter',
'none' => 'Zatiaľ ste nevytvorili používateľský dopyt.',
+ 'no_filter' => 'Žiadny filter',
'number' => 'Dopyt číslo %d',
'order_asc' => 'Zobraziť staršie články hore',
'order_desc' => 'Zobraziť novšie články hore',
@@ -84,9 +93,9 @@ return array(
'state_14' => 'Zobraziť neprečítané články',
'state_15' => 'Zobraziť všetky články',
'title' => 'Používateľské dopyty',
+ '_' => 'Dopyty používateľa',
),
'reading' => array(
- '_' => 'Čítanie',
'after_onread' => 'Po “Označiť všetko ako prečítané”,',
'articles_per_page' => 'Počet článkov na jednu stranu',
'auto_load_more' => 'Načítať ďalšie články dolu na stránke',
@@ -107,16 +116,16 @@ return array(
'when' => 'Označiť článok ako prečítaný…',
),
'show' => array(
- '_' => 'Článkov na zobrazenie',
'adaptive' => 'Vyberte zobrazenie',
'all_articles' => 'Zobraziť všetky články',
'unread' => 'Zobraziť iba neprečítané',
+ '_' => 'Článkov na zobrazenie',
),
'sides_close_article' => 'Po kliknutí mimo textu článku sa článok zatvorí',
'sort' => array(
- '_' => 'Poradie',
'newer_first' => 'Novšie hore',
'older_first' => 'Staršie hore',
+ '_' => 'Poradie',
),
'sticky_post' => 'Po otvorení posunúť článok hore',
'title' => 'Čítanie',
@@ -126,15 +135,14 @@ return array(
'normal' => 'Základné zobrazenie',
'reader' => 'Zobrazenie na čítanie',
),
+ '_' => 'Čítanie',
),
'sharing' => array(
- '_' => 'Zdieľanie',
'add' => 'Pridať spôsob zdieľania',
'blogotext' => 'Blogotext',
'diaspora' => 'Diaspora*',
'email' => 'E-mail',
'facebook' => 'Facebook',
- 'g+' => 'Google+',
'more_information' => 'Viac informácií',
'print' => 'Tlač',
'remove' => 'Odstrániť spôsob zdieľania',
@@ -144,9 +152,9 @@ return array(
'title' => 'Zdieľanie',
'twitter' => 'Twitter',
'wallabag' => 'wallabag',
+ '_' => 'Zdieľanie',
),
'shortcut' => array(
- '_' => 'Skratky',
'article_action' => 'Akcie článku',
'auto_share' => 'Zdieľať',
'auto_share_help' => 'Ak je nastavený iba jeden spôsob zdieľania, použije sa. Inak si spôsoby zdieľania vyberá používateľ podľa čísla.',
@@ -178,6 +186,7 @@ return array(
'user_filter' => 'Použiť používateľské filtre',
'user_filter_help' => 'Ak je nastavený iba jeden spôsob zdieľania, použije sa. Inak si spôsoby zdieľania vyberá používateľ podľa čísla.',
'views' => 'Zobrazenia',
+ '_' => 'Skratky',
),
'user' => array(
'articles_and_size' => '%s článkov (%s)',
diff --git a/app/i18n/sk/feedback.php b/app/i18n/sk/feedback.php
index 9aee79068..cbdc085e1 100644
--- a/app/i18n/sk/feedback.php
+++ b/app/i18n/sk/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => 'Optimalizácia dokončená',
- ),
'access' => array(
'denied' => 'Na prístup k tejto stránke nemáte oprávnenie',
'not_found' => 'Hľadáte stránku, ktorá neexistuje',
),
+ 'admin' => array(
+ 'optimization_complete' => 'Optimalizácia dokončená',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => 'Nastavl problém pri nastavovaní prihlasovacieho systému. Prosím, skúste to znova neskôr.',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s sa nepodarilo povoliť. <a href="%s">Prečítajte si záznamy FreshRSS</a>, ak chcete poznať podrobnosti.',
'ok' => '%s je teraz povolený',
),
- 'no_access' => 'Nemáte prístup k %s',
'not_enabled' => '%s nie je povolený',
'not_found' => '%s neexistuje',
+ 'no_access' => 'Nemáte prístup k %s',
),
'import_export' => array(
'export_no_zip_extension' => 'ZIP rozšírenie sa na vašom serveri nenachádza. Prosím, skúste exportovať súbory pojednom.',
@@ -66,10 +72,10 @@ return array(
'emptied' => 'Kategória bola vyprázdnená',
'error' => 'Nepodarilo sa aktualizovať kategóriu',
'name_exists' => 'Názov kategórie už existuje.',
- 'no_id' => 'Musíte zadať ID kategórie.',
- 'no_name' => 'Názov kategórie nemôže byť prázdny.',
'not_delete_default' => 'Nemôžete odstrániť prednastavenú kategóriu!',
'not_exist' => 'Kategória neexistuje!',
+ 'no_id' => 'Musíte zadať ID kategórie.',
+ 'no_name' => 'Názov kategórie nemôže byť prázdny.',
'over_max' => 'Dosiahli ste limit počtu kategórií (%d)',
'updated' => 'Kategória bola aktualizovaná.',
),
@@ -82,10 +88,10 @@ return array(
'error' => 'Kanál sa nepodarilo aktualizovať',
'internal_problem' => 'Kanál sa nepodarilo pridať. <a href="%s">Prečítajte si záznamy FreshRSS</a>, ak chcete poznať podrobnosti. Skúste pridať kanál pomocou <code>#force_feed</code> v odkaze (URL).',
'invalid_url' => 'Odkaz <em>%s</em> je neplatný',
+ 'not_added' => 'Kanál <em>%s</em> sa nepodarilo pridať',
+ 'no_refresh' => 'Žiadny kanál sa neaktualizoval…',
'n_actualized' => 'Počet aktualizovaných kanálov: %d',
'n_entries_deleted' => 'Počet vymazaných článkov: %d',
- 'no_refresh' => 'Žiadny kanál sa neaktualizoval…',
- 'not_added' => 'Kanál <em>%s</em> sa nepodarilo pridať',
'over_max' => 'Dosiahli ste limit počtu kanálov (%d)',
'updated' => 'Kanál bol aktualizovaný',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => 'Používateľ %s bol vytvorený',
'error' => 'Používateľ %s nebol vytvorený',
+ '_' => 'Používateľ %s bol vytvorený',
),
'deleted' => array(
- '_' => 'Používateľ %s bol vymazaný',
'error' => 'Používateľ %s nebol vymazaný',
+ '_' => 'Používateľ %s bol vymazaný',
),
'updated' => array(
- '_' => 'Používateľ %s bol aktualizovaný',
'error' => 'Používateľ %s nebol aktualizovaný',
+ '_' => 'Používateľ %s bol aktualizovaný',
),
),
);
diff --git a/app/i18n/sk/gen.php b/app/i18n/sk/gen.php
index 7303ffa9f..d6548e72a 100644
--- a/app/i18n/sk/gen.php
+++ b/app/i18n/sk/gen.php
@@ -3,6 +3,7 @@
return array(
'action' => array(
'actualize' => 'Aktualizovať',
+ 'back' => '← Go back', // TODO - Translation
'back_to_rss_feeds' => '← Späť na vaše RSS kanály',
'cancel' => 'Zrušiť',
'create' => 'Vytvoriť',
@@ -15,6 +16,7 @@ return array(
'manage' => 'Spravovať',
'mark_favorite' => 'Označiť ako obľúbené',
'mark_read' => 'Označiť ako prečítané',
+ 'purge' => 'Purge', // TODO - Translation
'remove' => 'Odstrániť',
'see_website' => 'Zobraziť webovú stránku',
'submit' => 'Poslať',
@@ -22,25 +24,25 @@ return array(
'update' => 'Aktualizovať',
),
'auth' => array(
- 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
+ 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
'email' => 'E-mailová adresa',
'keep_logged_in' => 'Zostať prihlásený <small>(počet dní: %s)</small>',
'login' => 'Prihlásiť',
'logout' => 'Odhlásiť',
'password' => array(
- '_' => 'Heslo',
'format' => '<small>Najmenej 7 znakov</small>',
+ '_' => 'Heslo',
),
'registration' => array(
- '_' => 'Nový účet',
'ask' => 'Vytvoriť účet?',
'title' => 'Vytvorenie účtu',
+ '_' => 'Nový účet',
),
'reset' => 'Reset prihlásenia',
'username' => array(
- '_' => 'Používateľské meno',
'admin' => 'Administrátorské používateľské meno',
'format' => '<small>maximálne 16 alfanumerických znakov</small>',
+ '_' => 'Používateľské meno',
),
),
'date' => array(
@@ -63,8 +65,8 @@ return array(
'Jan' => '\\J\\a\\n\\u\\á\\r',
'jan' => 'Jan.',
'january' => 'Január',
- 'Jul' => '\\J\\ú\\l',
'jul' => 'Júl',
+ 'Jul' => '\\J\\ú\\l',
'july' => 'Júl',
'Jun' => '\\J\\ú\\n',
'jun' => 'Jún',
@@ -74,8 +76,8 @@ return array(
'last_month' => 'Posledný mesiac',
'last_week' => 'Posledný týždeň',
'last_year' => 'Posledný rok',
- 'Mar' => '\\M\\a\\r\\e\\c',
'mar' => 'Mar.',
+ 'Mar' => '\\M\\a\\r\\e\\c',
'march' => 'Marec',
'May' => '\\M\\á\\j',
'may' => 'Máj',
@@ -88,8 +90,8 @@ return array(
'Oct' => '\\O\\k\\t\\ó\\b\\e\\r',
'oct' => 'Okt.',
'october' => 'Október',
- 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',
'sat' => 'So',
+ 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',
'sep' => 'Sept.',
'september' => 'September',
'sun' => 'Ne',
@@ -100,8 +102,8 @@ return array(
'yesterday' => 'Včera',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => 'O FreshRSS',
+ '_' => 'FreshRSS',
),
'js' => array(
'category_empty' => 'Prázdna kategória',
@@ -115,6 +117,23 @@ return array(
'new_article' => 'Našli sa nové články. Kliknite na obnovenie stránky.',
'should_be_activated' => 'Musíte povoliť JavaScript',
),
+ 'lang' => array(
+ 'cz' => 'Čeština',
+ 'de' => 'Deutsch',
+ 'en' => 'English',
+ 'es' => 'Español',
+ 'fr' => 'Français',
+ 'he' => 'עברית',
+ 'it' => 'Italiano',
+ 'kr' => '한국어',
+ 'nl' => 'Nederlands',
+ 'oc' => 'Occitan',
+ 'pt-br' => 'Português (Brasil)',
+ 'ru' => 'Русский',
+ 'sk' => 'Slovenčina',
+ 'tr' => 'Türkçe',
+ 'zh-cn' => '简体中文',
+ ),
'menu' => array(
'about' => 'O FreshRSS',
'admin' => 'Administrácia',
@@ -145,15 +164,22 @@ return array(
'nothing_to_load' => 'Žiadne nové články',
'previous' => 'Predošlý',
),
+ 'period' => array(
+ 'days' => 'days', // TODO - Translation
+ 'hours' => 'hours', // TODO - Translation
+ 'months' => 'months', // TODO - Translation
+ 'weeks' => 'weeks', // TODO - Translation
+ 'years' => 'years', // TODO - Translation
+ ),
'share' => array(
'blogotext' => 'Blogotext',
'diaspora' => 'Diaspora*',
'email' => 'E-mail',
'facebook' => 'Facebook',
- 'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
'Known' => 'Stránky založené na Known',
+ 'lemmy' => 'Lemmy', // TODO - Translation
'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
diff --git a/app/i18n/sk/index.php b/app/i18n/sk/index.php
index ae5a077b0..a7b2d4cac 100644
--- a/app/i18n/sk/index.php
+++ b/app/i18n/sk/index.php
@@ -2,7 +2,6 @@
return array(
'about' => array(
- '_' => 'O FreshRSS',
'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
'bugs_reports' => 'Nahlásiť chybu',
'credits' => 'Poďakovanie',
@@ -14,23 +13,21 @@ return array(
'title' => 'O FreshRSS',
'version' => 'Verzia',
'website' => 'Webová stránka',
- ),
- 'tos' => array(
- 'title' => 'Terms of Service', // TODO - Translation
+ '_' => 'O FreshRSS',
),
'feed' => array(
'add' => 'Môžete pridať kanály.',
'empty' => 'Žiadne články.',
'rss_of' => 'RSS kanál pre %s',
'title' => 'Vaše RSS kanály',
- 'title_global' => 'Prehľad',
'title_fav' => 'Vaše obľúbené',
+ 'title_global' => 'Prehľad',
),
'log' => array(
- '_' => 'Záznamy',
'clear' => 'Vymazať záznamy',
'empty' => 'Súbor záznamu je prázdny',
'title' => 'Záznamy',
+ '_' => 'Záznamy',
),
'menu' => array(
'about' => 'O FreshRSS',
@@ -63,4 +60,7 @@ return array(
'tag' => array(
'related' => 'Značky článku',
),
+ 'tos' => array(
+ 'title' => 'Terms of Service', // TODO - Translation
+ ),
);
diff --git a/app/i18n/sk/install.php b/app/i18n/sk/install.php
index 08fbfeef9..b34b4e878 100644
--- a/app/i18n/sk/install.php
+++ b/app/i18n/sk/install.php
@@ -17,20 +17,19 @@ return array(
'type' => 'Spôsob prihlásenia',
),
'bdd' => array(
- '_' => 'Databáza',
'conf' => array(
- '_' => 'Nastavenia databázy',
'ko' => 'Skontrolovať vaše informácie o databáze.',
'ok' => 'Nastavenia databázy boli uložené.',
+ '_' => 'Nastavenia databázy',
),
'host' => 'Server',
'password' => 'Heslo databázy',
'prefix' => 'Predpona názvu tabuľky',
'type' => 'Druh databázy',
'username' => 'Používateľské meno databázy',
+ '_' => 'Databáza',
),
'check' => array(
- '_' => 'Kontrola',
'already_installed' => 'Zistilo sa, že FreshRSS je už nainštalovaný!',
'cache' => array(
'nok' => 'Skontrolujte oprávnenia prístupu do priečinku <em>./data/cache</em>. HTTP server musí mať právo doň zapisovať.',
@@ -96,10 +95,11 @@ return array(
'nok' => 'Nepodarilo sa nájsť požadovanú knižnicu na spracovanie formátu XML.',
'ok' => 'Našla sa požadovaná knižnica na spracovanie formátu XML.',
),
+ '_' => 'Kontrola',
),
'conf' => array(
- '_' => 'Hlavné nastavenia',
'ok' => 'Hlavné nastavenia boli uložené.',
+ '_' => 'Hlavné nastavenia',
),
'congratulations' => 'Nastavenia!',
'default_user' => 'Hlavné používateľské meno <small>(najviac 16 alfanumerických znakov)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => 'Ak budete pokračovať v preinštalovaní FreshRSS, stratíte vaše predošlé nastavenia. Naozaj chcete pokračovať?',
),
'language' => array(
- '_' => 'Jazyk',
'choose' => 'Vyberte jazyk pre FreshRSS',
'defined' => 'Jazyk bol nastavený.',
+ '_' => 'Jazyk',
),
'not_deleted' => 'Niečo sa nepodarilo. Musíte ručne zmazať súbor <em>%s</em>.',
'ok' => 'Inštalácia bola úspešná.',
'step' => 'krok %d',
'steps' => 'Kroky',
- 'title' => 'Inštalácia · FreshRSS',
'this_is_the_end' => 'Toto je koniec',
+ 'title' => 'Inštalácia · FreshRSS',
);
diff --git a/app/i18n/sk/sub.php b/app/i18n/sk/sub.php
index 3149c370b..1d87afc01 100644
--- a/app/i18n/sk/sub.php
+++ b/app/i18n/sk/sub.php
@@ -11,14 +11,15 @@ return array(
'title' => 'Záložka',
),
'category' => array(
- '_' => 'Kategória',
'add' => 'Pridať kategóriu',
+ 'archiving' => 'Archiving', // TODO - Translation
'empty' => 'Prázdna kategória',
'information' => 'Informácia',
'new' => 'Nová kategória',
- 'position' => 'Display position', //TODO - Translation
- 'position_help' => 'To control category sort order', //TODO - Translation
+ 'position' => 'Display position', // TODO - Translation
+ 'position_help' => 'To control category sort order', // TODO - Translation
'title' => 'Názov',
+ '_' => 'Kategória',
),
'feed' => array(
'add' => 'Pridať RSS kanál',
@@ -38,8 +39,8 @@ return array(
'empty' => 'Tento kanál je prázdny. Overte, prosím, či je ešte spravovaný autorom.',
'error' => 'Vyskytol sa problém s týmto kanálom. Overte, prosím, či kanál stále existuje, potom ho obnovte.',
'filteractions' => array(
- '_' => 'Filtrovať akcie',
'help' => 'Napíšte jeden výraz hľadania na riadok.',
+ '_' => 'Filtrovať akcie',
),
'information' => 'Informácia',
'keep_min' => 'Minimálny počet článkov na uchovanie',
@@ -48,12 +49,11 @@ return array(
'no_selected' => 'Nevybrali ste kanál.',
'number_entries' => 'Počet článkov: %d',
'priority' => array(
- '_' => 'Viditeľnosť',
'archived' => 'Nezobrazovať (archivované)',
'main_stream' => 'Zobraziť v prehľade kanálov',
'normal' => 'Zobraziť vo svojej kategórii',
+ '_' => 'Viditeľnosť',
),
- 'websub' => 'Okamžité oznámenia cez WebSub',
'show' => array(
'all' => 'Zobraziť všetky kanály',
'error' => 'Zobraziť iba kanály s chybou',
@@ -71,17 +71,18 @@ return array(
'url' => 'Odkaz kanála',
'validator' => 'Skontrolovať platnosť kanála',
'website' => 'Odkaz webovej stránky',
+ 'websub' => 'Okamžité oznámenia cez WebSub',
),
'firefox' => array(
'documentation' => 'Pridajte RSS kanály do Firefoxu <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">pomocou tohto návodu</a>.',
- 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', //TODO - Translation
+ 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', // TODO - Translation
'title' => 'RSS čítačka vo Firefoxe',
),
'import_export' => array(
'export' => 'Exportovať',
+ 'export_labelled' => 'Exportovať vaše označené články',
'export_opml' => 'Exportovať zoznam kanálov (OPML)',
'export_starred' => 'Exportovať vaše obľúbené',
- 'export_labelled' => 'Exportovať vaše označené články',
'feed_list' => 'Zoznam článkov %s',
'file_to_import' => 'Súbor na import<br />(OPML, JSON alebo ZIP)',
'file_to_import_no_zip' => 'Súbor na import<br />(OPML alebo JSON)',
@@ -96,8 +97,8 @@ return array(
'subscription_tools' => 'Nástroje na odoberanie kanálov',
),
'title' => array(
- '_' => 'Správa odoberaných kanálov',
'feed_management' => 'Správa RSS kanálov',
'subscription_tools' => 'Nástroje na odoberanie kanálov',
+ '_' => 'Správa odoberaných kanálov',
),
);
diff --git a/app/i18n/sk/user.php b/app/i18n/sk/user.php
index 3a8343c11..52197ad46 100644
--- a/app/i18n/sk/user.php
+++ b/app/i18n/sk/user.php
@@ -3,35 +3,35 @@
return array(
'email' => array(
'feedback' => array(
- 'invalid' => 'The email address is invalid.', //TODO - Translation
- 'required' => 'The email address is required.', //TODO - Translation
+ 'invalid' => 'The email address is invalid.', // TODO - Translation
+ 'required' => 'The email address is required.', // TODO - Translation
),
'validation' => array(
- 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', //TODO - Translation
- 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', //TODO - Translation
+ 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', // TODO - Translation
+ 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', // TODO - Translation
'feedback' => array(
- 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', //TODO - Translation
- 'email_sent' => 'An email has been sent to your address.', //TODO - Translation
- 'error' => 'The email address failed to be validated.', //TODO - Translation
- 'ok' => 'The email address has been validated.', //TODO - Translation
- 'unneccessary' => 'The email address was already validated.', //TODO - Translation
- 'wrong_token' => 'The email address failed to be validated due to a wrong token.', //TODO - Translation
+ 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', // TODO - Translation
+ 'email_sent' => 'An email has been sent to your address.', // TODO - Translation
+ 'error' => 'The email address failed to be validated.', // TODO - Translation
+ 'ok' => 'The email address has been validated.', // TODO - Translation
+ 'unneccessary' => 'The email address was already validated.', // TODO - Translation
+ 'wrong_token' => 'The email address failed to be validated due to a wrong token.', // TODO - Translation
),
- 'need_to' => 'You need to validate your email address before being able to use %s.', //TODO - Translation
- 'resend_email' => 'Resend the email', //TODO - Translation
- 'title' => 'Email address validation', //TODO - Translation
- ),
- ),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
+ 'need_to' => 'You need to validate your email address before being able to use %s.', // TODO - Translation
+ 'resend_email' => 'Resend the email', // TODO - Translation
+ 'title' => 'Email address validation', // TODO - Translation
),
),
'mailer' => array(
'email_need_validation' => array(
- 'title' => 'You need to validate your account', //TODO - Translation
- 'welcome' => 'Welcome %s,', //TODO - Translation
- 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', //TODO - Translation
+ 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', // TODO - Translation
+ 'title' => 'You need to validate your account', // TODO - Translation
+ 'welcome' => 'Welcome %s,', // TODO - Translation
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
),
),
);
diff --git a/app/i18n/tr/admin.php b/app/i18n/tr/admin.php
index 2c7d0fd6d..bb097d5e8 100644
--- a/app/i18n/tr/admin.php
+++ b/app/i18n/tr/admin.php
@@ -67,8 +67,8 @@ return array(
'ok' => 'JSON eklentisi sorunsuz.',
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
'nok' => 'Minz framework eksik.',
@@ -83,9 +83,9 @@ return array(
'ok' => 'PDO sorunsuz (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
- '_' => 'PHP kurulumu',
'nok' => 'PHP versiyonunuz %s fakat FreshRSS için gerekli olan en düşük sürüm %s.',
'ok' => 'PHP versiyonunuz %s, FreshRSS ile tam uyumlu.',
+ '_' => 'PHP kurulumu',
),
'tables' => array(
'nok' => 'Veritabanında bir veya daha fazla tablo eksik.',
@@ -106,26 +106,25 @@ return array(
),
),
'extensions' => array(
- 'author' => 'Author', //TODO - Translation
- 'community' => 'Available community extensions', //TODO - Translation
- 'description' => 'Description', //TODO - Translation
+ 'author' => 'Author', // TODO - Translation
+ 'community' => 'Available community extensions', // TODO - Translation
+ 'description' => 'Description', // TODO - Translation
'disabled' => 'Pasif',
'empty_list' => 'Yüklenmiş eklenti bulunmamaktadır',
'enabled' => 'Aktif',
- 'latest' => 'Installed', //TODO - Translation
- 'name' => 'Name', //TODO - Translation
+ 'latest' => 'Installed', // TODO - Translation
+ 'name' => 'Name', // TODO - Translation
'no_configure_view' => 'Bu eklenti yapılandırılamaz.',
'system' => array(
- '_' => 'Sistem eklentileri',
'no_rights' => 'Sistem eklentileri (düzenleme hakkınız yok)',
+ '_' => 'Sistem eklentileri',
),
'title' => 'Eklentiler',
- 'update' => 'Update available', //TODO - Translation
+ 'update' => 'Update available', // TODO - Translation
'user' => 'Kullanıcı eklentileri',
- 'version' => 'Version', //TODO - Translation
+ 'version' => 'Version', // TODO - Translation
),
'stats' => array(
- '_' => 'İstatistikler',
'all_feeds' => 'Tüm akış',
'category' => 'Kategori',
'entry_count' => 'Makale sayısı',
@@ -155,46 +154,53 @@ return array(
'status_unread' => 'Okunmamış',
'title' => 'İstatistikler',
'top_feed' => 'İlk 10 akış',
+ '_' => 'İstatistikler',
),
'system' => array(
- '_' => 'Sistem yapılandırması',
'auto-update-url' => 'Otomatik güncelleme sunucu URL',
- 'force_email_validation' => 'Force email addresses validation', //TODO - Translation
+ 'cookie-duration' => array(
+ 'help' => 'in seconds', // TODO - Translation
+ 'number' => 'Duration to keep logged in', // TODO - Translation
+ ),
+ 'force_email_validation' => 'Force email addresses validation', // TODO - Translation
'instance-name' => 'Örnek isim',
'max-categories' => 'Kullanıcı başına kategori limiti',
'max-feeds' => 'Kullanıcı başına akış limiti',
- 'cookie-duration' => array(
- 'help' => 'in seconds', // @todo translate
- 'number' => 'Duration to keep logged in', // @todo translate
- ),
'registration' => array(
'help' => '0 sınır yok anlamındadır',
'number' => 'En fazla hesap sayısı',
),
+ '_' => 'Sistem yapılandırması',
),
'update' => array(
- '_' => 'Sistem güncelleme',
'apply' => 'Uygula',
'check' => 'Güncelleme kontrolü',
'current_version' => 'Mevcut FreshRSS sürümünüz %s.',
'last' => 'Son kontrol: %s',
'none' => 'Yeni güncelleme yok',
'title' => 'Sistem güncelleme',
+ '_' => 'Sistem güncelleme',
),
'user' => array(
'articles_and_size' => '%s makale (%s)',
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => 'Yeni kullanıcı oluştur',
- 'delete_users' => 'Delete user', //TODO - Translation
+ 'database_size' => 'Database size', // TODO - Translation
+ 'delete_users' => 'Delete user', // TODO - Translation
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => 'Dil',
+ 'list' => 'User list', // TODO - Translation
'number' => 'Oluşturulmuş %d hesap var',
'numbers' => 'Oluşturulmuş %d hesap var',
'password_form' => 'Şifre<br /><small>(Tarayıcı girişi için)</small>',
'password_format' => 'En az 7 karakter',
- 'selected' => 'Selected user', //TODO - Translation
+ 'selected' => 'Selected user', // TODO - Translation
'title' => 'Kullanıcıları yönet',
- 'update_users' => 'Update user', //TODO - Translation
- 'user_list' => 'Kullanıcı listesi',
+ 'update_users' => 'Update user', // TODO - Translation
'username' => 'Kullanıcı adı',
'users' => 'Kullanıcılar',
+ 'user_list' => 'Kullanıcı listesi',
),
);
diff --git a/app/i18n/tr/conf.php b/app/i18n/tr/conf.php
index c8ea78efa..f6dcb5a23 100644
--- a/app/i18n/tr/conf.php
+++ b/app/i18n/tr/conf.php
@@ -2,34 +2,33 @@
return array(
'archiving' => array(
- '_' => 'Arşiv',
'delete_after' => 'Makelelerin tutulacağı süre',
- 'exception' => 'Purge exception', //TODO - Translation
+ 'exception' => 'Purge exception', // TODO - Translation
'help' => 'Akış ayarlarında daha çok ayar bulabilirsiniz',
- 'keep_favourites' => 'Never delete favourites', //TODO - Translation
+ 'keep_favourites' => 'Never delete favourites', // TODO - Translation
+ 'keep_labels' => 'Never delete labels', // TODO - Translation
+ 'keep_max' => 'Maximum number of articles to keep', // TODO - Translation
'keep_min_by_feed' => 'Akışta en az tutulacak makale sayısı',
- 'keep_labels' => 'Never delete labels', //TODO - Translation
- 'keep_unreads' => 'Never delete unreads', //TODO - Translation
- 'maintenance' => 'Maintenance', //TODO - Translation
+ 'keep_period' => 'Maximum age of articles to keep', // TODO - Translation
+ 'keep_unreads' => 'Never delete unreads', // TODO - Translation
+ 'maintenance' => 'Maintenance', // TODO - Translation
'optimize' => 'Veritabanı optimize et',
'optimize_help' => 'Bu işlem bazen veritabanı boyutunu düşürmeye yardımcı olur',
- 'policy' => 'Purge policy', //TODO - Translation
- 'policy_warning' => 'If no purge policy is selected, every article will be kept.', //TODO - Translation
+ 'policy' => 'Purge policy', // TODO - Translation
+ 'policy_warning' => 'If no purge policy is selected, every article will be kept.', // TODO - Translation
'purge_now' => 'Şimdi temizle',
- 'keep_max' => 'Maximum number of articles to keep', //TODO - Translation
- 'keep_period' => 'Maximum age of articles to keep', //TODO - Translation
'title' => 'Arşiv',
'ttl' => 'Şu süreden sık otomatik yenileme yapma',
+ '_' => 'Arşiv',
),
'display' => array(
- '_' => 'Görünüm',
'icon' => array(
'bottom_line' => 'Alt çizgi',
+ 'display_authors' => 'Authors', // TODO - Translation
'entry' => 'Makale ikonları',
'publication_date' => 'Yayınlama Tarihi',
- 'related_tags' => 'İlgili etiketler', //TODO - Translation
+ 'related_tags' => 'İlgili etiketler',
'sharing' => 'Paylaşım',
- 'display_authors' => 'Authors', //TODO - Translation
'top_line' => 'Üst çizgi',
),
'language' => 'Dil',
@@ -37,7 +36,7 @@ return array(
'seconds' => 'saniye (0 zaman aşımı yok demektir)',
'timeout' => 'HTML5 bildirim zaman aşımı',
),
- 'show_nav_buttons' => 'Show the navigation buttons', //TODO - Translation
+ 'show_nav_buttons' => 'Show the navigation buttons', // TODO - Translation
'theme' => 'Tema',
'title' => 'Görünüm',
'width' => array(
@@ -47,34 +46,35 @@ return array(
'no_limit' => 'Sınırsız',
'thin' => 'Zayıf',
),
+ '_' => 'Görünüm',
),
'profile' => array(
- '_' => 'Profil yönetimi',
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => 'Hesap silme',
'warn' => 'Hesabınız ve tüm verileriniz silinecek.',
+ '_' => 'Hesap silme',
),
'email' => 'Email adresleri',
'password_api' => 'API Şifresi<br /><small>(ör. mobil uygulamalar için)</small>',
'password_form' => 'Şifre<br /><small>(Tarayıcı girişi için)</small>',
'password_format' => 'En az 7 karakter',
'title' => 'Profil',
+ '_' => 'Profil yönetimi',
),
'query' => array(
- '_' => 'Kullanıcı sorguları',
'deprecated' => 'Bu sorgu artık geçerli değil. İlgili akış veya kategori silinmiş.',
- 'display' => 'Display user query results', //TODO - Translation
+ 'display' => 'Display user query results', // TODO - Translation
'filter' => 'Filtre uygulandı:',
'get_all' => 'Tüm makaleleri göster',
'get_category' => '"%s" kategorisini göster',
'get_favorite' => 'Favori makaleleri göster',
'get_feed' => '"%s" akışını göster',
- 'no_filter' => 'Filtre yok',
'none' => 'Henüz hiç kullanıcı sorgusu oluşturmadınız.',
+ 'no_filter' => 'Filtre yok',
'number' => 'Sorgu n°%d',
'order_asc' => 'Önce eski makaleleri göster',
'order_desc' => 'Önce yeni makaleleri göster',
- 'remove' => 'Remove user query', //TODO - Translation
+ 'remove' => 'Remove user query', // TODO - Translation
'search' => '"%s" için arama',
'state_0' => 'Tüm makaleleri göster',
'state_1' => 'Okunmuş makaleleri göster',
@@ -93,16 +93,16 @@ return array(
'state_14' => 'Okunmamış makaleleri göster',
'state_15' => 'Tüm makaleleri göster',
'title' => 'Kullanıcı sorguları',
+ '_' => 'Kullanıcı sorguları',
),
'reading' => array(
- '_' => 'Okuma',
'after_onread' => '"Hepsini okundu say" dedinten sonra,',
'articles_per_page' => 'Sayfa başına makale sayısı',
'auto_load_more' => 'Sayfa sonunda yeni makaleleri yükle',
'auto_remove_article' => 'Okuduktan sonra makaleleri gizle',
'confirm_enabled' => '"Hepsini okundu say" eylemi için onay iste',
- 'display_articles_unfolded' => 'Show articles unfolded by default',
- 'display_categories_unfolded' => 'Show categories unfolded by default',
+ 'display_articles_unfolded' => 'Show articles unfolded by default', // TODO - Translation
+ 'display_categories_unfolded' => 'Show categories unfolded by default', // TODO - Translation
'hide_read_feeds' => 'Okunmamış makalesi olmayan kategori veya akışı gizle ("Tüm makaleleri göster" komutunda çalışmaz)',
'img_with_lazyload' => 'Resimleri yüklemek için "tembel modu" kullan',
'jump_next' => 'Bir sonraki benzer okunmamışa geç (akış veya kategori)',
@@ -116,16 +116,16 @@ return array(
'when' => 'Makaleyi okundu olarak işaretle…',
),
'show' => array(
- '_' => 'Gösterilecek makaleler',
'adaptive' => 'Ayarlanmış gösterim',
'all_articles' => 'Tüm makaleleri göster',
'unread' => 'Sadece okunmamış makaleleri göster',
+ '_' => 'Gösterilecek makaleler',
),
- 'sides_close_article' => 'Clicking outside of article text area closes the article', //TODO - Translation
+ 'sides_close_article' => 'Clicking outside of article text area closes the article', // TODO - Translation
'sort' => array(
- '_' => 'Sıralama',
'newer_first' => 'Önce yeniler',
'older_first' => 'Önce eskiler',
+ '_' => 'Sıralama',
),
'sticky_post' => 'Makale açıldığında yukarı getir',
'title' => 'Okuma',
@@ -135,26 +135,26 @@ return array(
'normal' => 'Normal görünüm',
'reader' => 'Okuma görünümü',
),
+ '_' => 'Okuma',
),
'sharing' => array(
- '_' => 'Paylaşım',
- 'add' => 'Add a sharing method', //TODO - Translation
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
- 'email' => 'Email',
- 'facebook' => 'Facebook',
+ 'add' => 'Add a sharing method', // TODO - Translation
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
+ 'email' => 'Email', // TODO - Translation
+ 'facebook' => 'Facebook', // TODO - Translation
'more_information' => 'Daha fazla bilgi',
'print' => 'Yazdır',
- 'remove' => 'Remove sharing method', //TODO - Translation
- 'shaarli' => 'Shaarli',
+ 'remove' => 'Remove sharing method', // TODO - Translation
+ 'shaarli' => 'Shaarli', // TODO - Translation
'share_name' => 'Paylaşım ismi',
'share_url' => 'Paylaşım URL si',
'title' => 'Paylaşım',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag',
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag', // TODO - Translation
+ '_' => 'Paylaşım',
),
'shortcut' => array(
- '_' => 'Kısayollar',
'article_action' => 'Makale eylemleri',
'auto_share' => 'Paylaş',
'auto_share_help' => 'Sadece 1 paylaşım modu varsa bu kullanılır. Yoksa kendi paylaşım numaraları ile kullanılır.',
@@ -162,7 +162,7 @@ return array(
'collapse_article' => 'Kapat',
'first_article' => 'İlk makaleyi atla',
'focus_search' => 'Arama kutusuna eriş',
- 'global_view' => 'Switch to global view', //TODO - Translation
+ 'global_view' => 'Switch to global view', // TODO - Translation
'help' => 'Dokümantasyonu göster',
'javascript' => 'Kısayolları kullanabilmek için JavaScript aktif olmalıdır',
'last_article' => 'Son makaleyi atla',
@@ -171,21 +171,22 @@ return array(
'mark_read' => 'Okundu olarak işaretle',
'navigation' => 'Genel eylemler',
'navigation_help' => '"Shift" tuşu ile kısayollar akışlar için geçerli olur.<br/>"Alt" tuşu ile kısayollar kategoriler için geçerli olur.',
- 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', //TODO - Translation
+ 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', // TODO - Translation
'next_article' => 'Sonraki makaleye geç',
- 'normal_view' => 'Switch to normal view', //TODO - Translation
+ 'normal_view' => 'Switch to normal view', // TODO - Translation
'other_action' => 'Diğer eylemler',
'previous_article' => 'Önceki makaleye geç',
- 'reading_view' => 'Switch to reading view', //TODO - Translation
- 'rss_view' => 'Open RSS view in a new tab', //TODO - Translation
+ 'reading_view' => 'Switch to reading view', // TODO - Translation
+ 'rss_view' => 'Open RSS view in a new tab', // TODO - Translation
'see_on_website' => 'Orijinal sitede göster',
'shift_for_all_read' => '+ <code>shift</code> tuşu ile tüm makaleler okundu olarak işaretlenir',
- 'skip_next_article' => 'Focus next without opening', //TODO - Translation
- 'skip_previous_article' => 'Focus previous without opening', //TODO - Translation
+ 'skip_next_article' => 'Focus next without opening', // TODO - Translation
+ 'skip_previous_article' => 'Focus previous without opening', // TODO - Translation
'title' => 'Kısayollar',
'user_filter' => 'Kullanıcı filtrelerine eriş',
'user_filter_help' => 'Eğer tek filtre varsa o kullanılır. Yoksa filtrelerin kendi numaralarıyla kullanılır.',
- 'views' => 'Views', //TODO - Translation
+ 'views' => 'Views', // TODO - Translation
+ '_' => 'Kısayollar',
),
'user' => array(
'articles_and_size' => '%s makale (%s)',
diff --git a/app/i18n/tr/feedback.php b/app/i18n/tr/feedback.php
index fc1e59bbc..fe76c4b0e 100644
--- a/app/i18n/tr/feedback.php
+++ b/app/i18n/tr/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => 'Optimizasyon tamamlandı',
- ),
'access' => array(
'denied' => 'Bu sayfaya erişim yetkiniz yok',
'not_found' => 'Varolmayan bir sayfa arıyorsunuz',
),
+ 'admin' => array(
+ 'optimization_complete' => 'Optimizasyon tamamlandı',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => 'Sistem yapılandırma kimlik doğrulaması sırasında hata oldu. Lütfen daha sonra tekrar deneyin.',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s aktifleştirilemiyor. Detaylar için <a href="%s">FreshRSS log kayıtlarını</a> kontrol edin.',
'ok' => '%s aktif',
),
- 'no_access' => '%s de yetkiniz yok',
'not_enabled' => '%s henüz aktif değil',
'not_found' => '%s bulunmamaktadır',
+ 'no_access' => '%s de yetkiniz yok',
),
'import_export' => array(
'export_no_zip_extension' => 'ZIP eklentisi mevcut sunucunuzda yer almıyor. Lütfen başka dosya formatında dışarı aktarmayı deneyin.',
@@ -57,8 +63,8 @@ return array(
'sub' => array(
'actualize' => 'Güncelleme',
'articles' => array(
- 'marked_read' => 'The selected articles have been marked as read.', //TODO - Translation
- 'marked_unread' => 'The articles have been marked as unread.', //TODO - Translation
+ 'marked_read' => 'The selected articles have been marked as read.', // TODO - Translation
+ 'marked_unread' => 'The articles have been marked as unread.', // TODO - Translation
),
'category' => array(
'created' => 'Kategori %s oluşturuldu.',
@@ -66,10 +72,10 @@ return array(
'emptied' => 'Kategori boşaltıldı',
'error' => 'Kategori güncellenemedi',
'name_exists' => 'Kategori ismi zaten bulunmakta.',
- 'no_id' => 'Kategori id sinden emin olmalısınız.',
- 'no_name' => 'Kategori ismi boş olamaz.',
'not_delete_default' => 'Öntanımlı kategoriyi silemezsiniz!',
'not_exist' => 'Kategori bulunmamakta!',
+ 'no_id' => 'Kategori id sinden emin olmalısınız.',
+ 'no_name' => 'Kategori ismi boş olamaz.',
'over_max' => 'Kategori limitini aştınız (%d)',
'updated' => 'Karegori güncellendi.',
),
@@ -80,12 +86,12 @@ return array(
'already_subscribed' => '<em>%s</em> için zaten aboneliğiniz bulunmakta',
'deleted' => 'Akış silindi',
'error' => 'Akış güncellenemiyor',
- 'internal_problem' => 'RSS akışı eklenemiyor. Detaylar için <a href="%s">FreshRSS log kayıtlarını</a> kontrol edin.', //TODO - Translation
+ 'internal_problem' => 'RSS akışı eklenemiyor. Detaylar için <a href="%s">FreshRSS log kayıtlarını</a> kontrol edin.',
'invalid_url' => 'URL <em>%s</em> geçersiz',
+ 'not_added' => '<em>%s</em> eklenemedi',
+ 'no_refresh' => 'Yenilenecek akış yok…',
'n_actualized' => '%d akışları güncellendi',
'n_entries_deleted' => '%d makaleleri silindi',
- 'no_refresh' => 'Yenilenecek akış yok…',
- 'not_added' => '<em>%s</em> eklenemedi',
'over_max' => 'Akış limitini aştınız (%d)',
'updated' => 'Akış güncellendi',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => '%s kullanıcısı oluşturuldu',
'error' => '%s kullanıcısı oluşturulamadı',
+ '_' => '%s kullanıcısı oluşturuldu',
),
'deleted' => array(
- '_' => '%s kullanıcısı silindi',
'error' => '%s kullanıcısı silinemedi',
+ '_' => '%s kullanıcısı silindi',
),
'updated' => array(
- '_' => 'User %s has been updated', //TODO - Translation
- 'error' => 'User %s has not been updated', //TODO - Translation
+ 'error' => 'User %s has not been updated', // TODO - Translation
+ '_' => 'User %s has been updated', // TODO - Translation
),
),
);
diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php
index ccc5b9ee6..681fd5e74 100644
--- a/app/i18n/tr/gen.php
+++ b/app/i18n/tr/gen.php
@@ -3,7 +3,7 @@
return array(
'action' => array(
'actualize' => 'Yenile',
- 'back' => '← Go back', //TODO - Translation
+ 'back' => '← Go back', // TODO - Translation
'back_to_rss_feeds' => '← RSS akışlarınız için geri gidin',
'cancel' => 'İptal',
'create' => 'Oluştur',
@@ -16,32 +16,33 @@ return array(
'manage' => 'Yönet',
'mark_favorite' => 'Favoriye ekle',
'mark_read' => 'Okundu olarak işaretle',
+ 'purge' => 'Purge', // TODO - Translation
'remove' => 'Sil',
'see_website' => 'Siteyi gör',
'submit' => 'Onayla',
'truncate' => 'Tüm makaleleri sil',
- 'update' => 'Update', //TODO - Translation
+ 'update' => 'Update', // TODO - Translation
),
'auth' => array(
- 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
+ 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
'email' => 'Email adresleri',
'keep_logged_in' => '<small>(%s günler)</small> oturumu açık tut',
'login' => 'Giriş',
'logout' => 'Çıkış',
'password' => array(
- '_' => 'Şifre',
'format' => '<small>En az 7 karakter</small>',
+ '_' => 'Şifre',
),
'registration' => array(
- '_' => 'Yeni hesap',
'ask' => 'Yeni bir hesap oluştur',
'title' => 'Hesap oluşturma',
+ '_' => 'Yeni hesap',
),
'reset' => 'Kimlik doğrulama sıfırla',
'username' => array(
- '_' => 'Kullancı adı',
'admin' => 'Yönetici kullanıcı adı',
'format' => '<small>en fazla 16 alfanümerik karakter</small>',
+ '_' => 'Kullancı adı',
),
),
'date' => array(
@@ -58,14 +59,14 @@ return array(
'Feb' => '\\Ş\\u\\b\\a\\t',
'feb' => 'şub',
'february' => 'Şub',
- 'format_date' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y',
- 'format_date_hour' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y \\a\\t H\\:i',
+ 'format_date' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y', // TODO - Translation
+ 'format_date_hour' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y \\a\\t H\\:i', // TODO - Translation
'fri' => 'Cum',
'Jan' => '\\O\\c\\a\\k',
'jan' => 'oca',
'january' => 'Oca',
- 'Jul' => '\\T\\e\\m\\m\\u\\z',
'jul' => 'tem',
+ 'Jul' => '\\T\\e\\m\\m\\u\\z',
'july' => 'Tem',
'Jun' => '\\H\\a\\z\\i\\r\\a\\n',
'jun' => 'haz',
@@ -75,12 +76,12 @@ return array(
'last_month' => 'Geçen ay',
'last_week' => 'Geçen hafta',
'last_year' => 'Geçen yıl',
- 'Mar' => '\\M\\a\\r\\t',
'mar' => 'mar',
+ 'Mar' => '\\M\\a\\r\\t',
'march' => 'Mar',
'May' => '\\M\\a\\y\\ı\\s',
'may' => 'Mayıs',
- 'may_' => 'May',
+ 'may_' => 'May', // TODO - Translation
'mon' => 'Pzt',
'month' => 'ay',
'Nov' => '\\K\\a\\s\\ı\\m',
@@ -101,8 +102,8 @@ return array(
'yesterday' => 'Dün',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => 'FreshRSS hakkında',
+ '_' => 'FreshRSS', // TODO - Translation
),
'js' => array(
'category_empty' => 'Boş kategori',
@@ -117,20 +118,21 @@ return array(
'should_be_activated' => 'JavaScript aktif olmalıdır.',
),
'lang' => array(
- 'cz' => 'Čeština',
- 'de' => 'Deutsch',
- 'en' => 'English',
- 'es' => 'Español',
- 'fr' => 'Français',
- 'he' => 'עברית',
- 'it' => 'Italiano',
- 'kr' => '한국어',
- 'nl' => 'Nederlands',
- 'oc' => 'Occitan',
- 'pt-br' => 'Português (Brasil)',
- 'ru' => 'Русский',
- 'tr' => 'Türkçe',
- 'zh-cn' => '简体中文',
+ 'cz' => 'Čeština', // TODO - Translation
+ 'de' => 'Deutsch', // TODO - Translation
+ 'en' => 'English', // TODO - Translation
+ 'es' => 'Español', // TODO - Translation
+ 'fr' => 'Français', // TODO - Translation
+ 'he' => 'עברית', // TODO - Translation
+ 'it' => 'Italiano', // TODO - Translation
+ 'kr' => '한국어', // TODO - Translation
+ 'nl' => 'Nederlands', // TODO - Translation
+ 'oc' => 'Occitan', // TODO - Translation
+ 'pt-br' => 'Português (Brasil)', // TODO - Translation
+ 'ru' => 'Русский', // TODO - Translation
+ 'sk' => 'Slovenčina', // TODO - Translation
+ 'tr' => 'Türkçe', // TODO - Translation
+ 'zh-cn' => '简体中文', // TODO - Translation
),
'menu' => array(
'about' => 'Hakkında',
@@ -163,31 +165,31 @@ return array(
'previous' => 'Önceki',
),
'period' => array(
- 'days' => 'days', //TODO - Translation
- 'hours' => 'hours', //TODO - Translation
- 'months' => 'months', //TODO - Translation
- 'weeks' => 'weeks', //TODO - Translation
- 'years' => 'years', //TODO - Translation
+ 'days' => 'days', // TODO - Translation
+ 'hours' => 'hours', // TODO - Translation
+ 'months' => 'months', // TODO - Translation
+ 'weeks' => 'weeks', // TODO - Translation
+ 'years' => 'years', // TODO - Translation
),
'share' => array(
- 'blogotext' => 'Blogotext',
- 'diaspora' => 'Diaspora*',
- 'email' => 'Email',
- 'facebook' => 'Facebook',
- 'gnusocial' => 'GNU social',
- 'jdh' => 'Journal du hacker',
- 'Known' => 'Known based sites',
- 'lemmy' => 'Lemmy',
- 'linkedin' => 'LinkedIn',
- 'mastodon' => 'Mastodon',
- 'movim' => 'Movim',
- 'pinboard' => 'Pinboard',
- 'pocket' => 'Pocket',
- 'print' => 'Print',
- 'shaarli' => 'Shaarli',
- 'twitter' => 'Twitter',
- 'wallabag' => 'wallabag v1',
- 'wallabagv2' => 'wallabag v2',
+ 'blogotext' => 'Blogotext', // TODO - Translation
+ 'diaspora' => 'Diaspora*', // TODO - Translation
+ 'email' => 'Email', // TODO - Translation
+ 'facebook' => 'Facebook', // TODO - Translation
+ 'gnusocial' => 'GNU social', // TODO - Translation
+ 'jdh' => 'Journal du hacker', // TODO - Translation
+ 'Known' => 'Known based sites', // TODO - Translation
+ 'lemmy' => 'Lemmy', // TODO - Translation
+ 'linkedin' => 'LinkedIn', // TODO - Translation
+ 'mastodon' => 'Mastodon', // TODO - Translation
+ 'movim' => 'Movim', // TODO - Translation
+ 'pinboard' => 'Pinboard', // TODO - Translation
+ 'pocket' => 'Pocket', // TODO - Translation
+ 'print' => 'Print', // TODO - Translation
+ 'shaarli' => 'Shaarli', // TODO - Translation
+ 'twitter' => 'Twitter', // TODO - Translation
+ 'wallabag' => 'wallabag v1', // TODO - Translation
+ 'wallabagv2' => 'wallabag v2', // TODO - Translation
),
'short' => array(
'attention' => 'Tehlike!',
diff --git a/app/i18n/tr/index.php b/app/i18n/tr/index.php
index e284d78db..b74f6eace 100644
--- a/app/i18n/tr/index.php
+++ b/app/i18n/tr/index.php
@@ -2,8 +2,7 @@
return array(
'about' => array(
- '_' => 'Hakkında',
- 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', // TODO - Translation
'bugs_reports' => 'Hata raporu',
'credits' => 'Tanıtım',
'credits_content' => 'Bu frameworkü kullanmamasına rağmen FreshRSS bazı tasarım ögelerini <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> dan almıştır. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">İkonlar</a> <a href="https://www.gnome.org/">GNOME projesinden</a> alınmıştır. <em>Open Sans</em> yazı tipi <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a> tarafından oluşturulmuştur. FreshRSS bir PHP framework olan <a href="https://github.com/marienfressinaud/MINZ">Minz</a> i temel alır.',
@@ -13,24 +12,22 @@ return array(
'project_website' => 'Proje sayfası',
'title' => 'Hakkında',
'version' => 'Versiyon',
- 'website' => 'Website',
- ),
- 'tos' => array(
- 'title' => 'Terms of Service', // TODO - Translation
+ 'website' => 'Website', // TODO - Translation
+ '_' => 'Hakkında',
),
'feed' => array(
'add' => 'Akış ekleyebilirsin.',
'empty' => 'Gösterilecek makale yok.',
- 'rss_of' => 'RSS feed of %s',
+ 'rss_of' => 'RSS feed of %s', // TODO - Translation
'title' => 'RSS akışlarınız',
- 'title_global' => 'Global görünüm',
'title_fav' => 'Favorilerin',
+ 'title_global' => 'Global görünüm',
),
'log' => array(
- '_' => 'Log Kayıtları',
'clear' => 'Log kayıt dosyasını temizle',
'empty' => 'Log kayır dosyası boş',
'title' => 'Log Kayıtları',
+ '_' => 'Log Kayıtları',
),
'menu' => array(
'about' => 'FreshRSS hakkında',
@@ -43,7 +40,7 @@ return array(
'mark_all_read' => 'Hepsini okundu olarak işaretle',
'mark_cat_read' => 'Kategoriyi okundu olarak işaretle',
'mark_feed_read' => 'Akışı okundu olarak işaretle',
- 'mark_selection_unread' => 'Mark selection as unread', //TODO - Translation
+ 'mark_selection_unread' => 'Mark selection as unread', // TODO - Translation
'newer_first' => 'Önce yeniler',
'non-starred' => 'Favori dışındakileri göster',
'normal_view' => 'Normal görünüm',
@@ -56,11 +53,14 @@ return array(
'starred' => 'Favorileri göster',
'stats' => 'İstatistikler',
'subscription' => 'Abonelik yönetimi',
- 'tags' => 'My labels', //TODO - Translation
+ 'tags' => 'My labels', // TODO - Translation
'unread' => 'Okunmamışları göster',
),
- 'share' => 'Share',
+ 'share' => 'Share', // TODO - Translation
'tag' => array(
- 'related' => 'İlgili etiketler', //TODO - Translation
+ 'related' => 'İlgili etiketler',
+ ),
+ 'tos' => array(
+ 'title' => 'Terms of Service', // TODO - Translation
),
);
diff --git a/app/i18n/tr/install.php b/app/i18n/tr/install.php
index 8d152322c..2eca52e26 100644
--- a/app/i18n/tr/install.php
+++ b/app/i18n/tr/install.php
@@ -17,20 +17,19 @@ return array(
'type' => 'Kimlik doğrulama yöntemi',
),
'bdd' => array(
- '_' => 'Veritabanı',
'conf' => array(
- '_' => 'Veritabanı yapılandırılması',
'ko' => 'Veritabanı bilginizi doğrulayın.',
'ok' => 'Veritabanı yapılandırılması kayıt edildi.',
+ '_' => 'Veritabanı yapılandırılması',
),
'host' => 'Sunucu',
'password' => 'Veritabanı şifresi',
'prefix' => 'Tablo ön eki',
'type' => 'Veritabanı türü',
'username' => 'Veritabanı kullanıcı adı',
+ '_' => 'Veritabanı',
),
'check' => array(
- '_' => 'Kontroller',
'already_installed' => 'FreshRSS zaten yüklü!',
'cache' => array(
'nok' => '<em>./data/cache</em> klasör yetkisini kontrol edin. HTTP yazma yetkisi olmalı',
@@ -69,8 +68,8 @@ return array(
'ok' => 'Tavsiye edilen JSON çözümleme kütüphanesi sorunsuz.',
),
'mbstring' => array(
- 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO - Translation
- 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO - Translation
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO - Translation
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO - Translation
),
'minz' => array(
'nok' => 'Minz framework eksik.',
@@ -94,12 +93,13 @@ return array(
),
'xml' => array(
'nok' => 'You lack the required library to parse XML.',
- 'ok' => 'You have the required library to parse XML.',
+ 'ok' => 'You have the required library to parse XML.', // TODO - Translation
),
+ '_' => 'Kontroller',
),
'conf' => array(
- '_' => 'Genel yapılandırma',
'ok' => 'Genel yapılandırma ayarları kayıt edildi.',
+ '_' => 'Genel yapılandırma',
),
'congratulations' => 'Tebrikler!',
'default_user' => 'Öntanımlı kullanıcı adı <small>(en fazla 16 alfanümerik karakter)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => 'FreshRSS i yeniden kurarak önceki yapılandırma ayarlarınızı kaybedeceksiniz. Devam etmek istiyor musunuz ?',
),
'language' => array(
- '_' => 'Dil',
'choose' => 'FreshRSS için bir dil seçin',
'defined' => 'Dil belirlendi.',
+ '_' => 'Dil',
),
'not_deleted' => 'Hata meydana geldi; <em>%s</em> dosyasını elle silmelisiniz.',
'ok' => 'Kurulum başarıyla tamamlandı.',
'step' => 'adım %d',
'steps' => 'Adımlar',
- 'title' => 'Kurulum · FreshRSS',
'this_is_the_end' => 'Son Adım',
+ 'title' => 'Kurulum · FreshRSS',
);
diff --git a/app/i18n/tr/sub.php b/app/i18n/tr/sub.php
index ed2a7ce76..a8793766c 100644
--- a/app/i18n/tr/sub.php
+++ b/app/i18n/tr/sub.php
@@ -2,24 +2,24 @@
return array(
'api' => array(
- 'documentation' => 'Copy the following URL to use it within an external tool.', //TODO - Translation
- 'title' => 'API', //TODO - Translation
+ 'documentation' => 'Copy the following URL to use it within an external tool.', // TODO - Translation
+ 'title' => 'API', // TODO - Translation
),
'bookmarklet' => array(
- 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', //TODO - Translation
- 'label' => 'Subscribe', //TODO - Translation
- 'title' => 'Bookmarklet', //TODO - Translation
+ 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose "Bookmark This Link". Then click "Subscribe" button in any page you want to subscribe to.', // TODO - Translation
+ 'label' => 'Subscribe', // TODO - Translation
+ 'title' => 'Bookmarklet', // TODO - Translation
),
'category' => array(
- '_' => 'Kategori',
'add' => 'Kategori ekle',
'archiving' => 'Arşiv',
'empty' => 'Boş kategori',
'information' => 'Bilgi',
'new' => 'Yeni kategori',
- 'position' => 'Display position', //TODO - Translation
- 'position_help' => 'To control category sort order', //TODO - Translation
+ 'position' => 'Display position', // TODO - Translation
+ 'position_help' => 'To control category sort order', // TODO - Translation
'title' => 'Başlık',
+ '_' => 'Kategori',
),
'feed' => array(
'add' => 'RSS akışı ekle',
@@ -32,57 +32,57 @@ return array(
'password' => 'HTTP şifre',
'username' => 'HTTP kullanıcı adı',
),
- 'clear_cache' => 'Always clear cache', //TODO - Translation
+ 'clear_cache' => 'Always clear cache', // TODO - Translation
'css_help' => 'Dikkat, daha çok zaman gerekir!',
'css_path' => 'Makaleleri kendi CSS görünümü ile göster',
'description' => 'Tanım',
'empty' => 'Bu akış boş. Lütfen akışın aktif olduğuna emin olun.',
'error' => 'Bu akışda bir hatayla karşılaşıldı. Lütfen akışın sürekli ulaşılabilir olduğuna emin olun.',
'filteractions' => array(
- '_' => 'Filter actions', //TODO - Translation
- 'help' => 'Write one search filter per line.', //TODO - Translation
+ 'help' => 'Write one search filter per line.', // TODO - Translation
+ '_' => 'Filter actions', // TODO - Translation
),
'information' => 'Bilgi',
'keep_min' => 'En az tutulacak makale sayısı',
'moved_category_deleted' => 'Bir kategoriyi silerseniz, içerisindeki akışlar <em>%s</em> içerisine yerleşir.',
- 'mute' => 'mute', //TODO - Translation
+ 'mute' => 'mute', // TODO - Translation
'no_selected' => 'Hiçbir akış seçilmedi.',
'number_entries' => '%d makale',
'priority' => array(
- '_' => 'Visibility', //TODO - Translation
- 'archived' => 'Do not show (archived)', //TODO - Translation
+ 'archived' => 'Do not show (archived)', // TODO - Translation
'main_stream' => 'Ana akışda göster',
- 'normal' => 'Show in its category', //TODO - Translation
+ 'normal' => 'Show in its category', // TODO - Translation
+ '_' => 'Visibility', // TODO - Translation
),
- 'websub' => 'WebSub ile anlık bildirim',
'show' => array(
- 'all' => 'Show all feeds', //TODO - Translation
- 'error' => 'Show only feeds with error', //TODO - Translation
+ 'all' => 'Show all feeds', // TODO - Translation
+ 'error' => 'Show only feeds with error', // TODO - Translation
),
'showing' => array(
- 'error' => 'Showing only feeds with error', //TODO - Translation
+ 'error' => 'Showing only feeds with error', // TODO - Translation
),
- 'ssl_verify' => 'Verify SSL security', //TODO - Translation
+ 'ssl_verify' => 'Verify SSL security', // TODO - Translation
'stats' => 'İstatistikler',
'think_to_add' => 'Akış ekleyebilirsiniz.',
- 'timeout' => 'Timeout in seconds', //TODO - Translation
+ 'timeout' => 'Timeout in seconds', // TODO - Translation
'title' => 'Başlık',
'title_add' => 'RSS akışı ekle',
'ttl' => 'Şu kadar süreden fazla otomatik yenileme yapma',
'url' => 'Akış URL',
'validator' => 'Akış geçerliliğini kontrol edin',
'website' => 'Site URL',
+ 'websub' => 'WebSub ile anlık bildirim',
),
'firefox' => array(
- 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.', //TODO - Translation
- 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', //TODO - Translation
- 'title' => 'Firefox feed reader', //TODO - Translation
+ 'documentation' => 'Follow the steps described <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">here</a> to add FreshRSS to Firefox feed reader list.', // TODO - Translation
+ 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', // TODO - Translation
+ 'title' => 'Firefox feed reader', // TODO - Translation
),
'import_export' => array(
'export' => 'Dışa aktar',
+ 'export_labelled' => 'Export your labelled articles', // TODO - Translation
'export_opml' => 'Akış listesini dışarı aktar (OPML)',
'export_starred' => 'Favorileri dışarı aktar',
- 'export_labelled' => 'Export your labelled articles', //TODO
'feed_list' => '%s makalenin listesi',
'file_to_import' => 'Dosyadan içe aktar<br />(OPML, JSON or ZIP)',
'file_to_import_no_zip' => 'Dosyadan içe aktar<br />(OPML or JSON)',
@@ -94,11 +94,11 @@ return array(
'bookmark' => 'Abonelik (FreshRSS yer imleri)',
'import_export' => 'İçe / dışa aktar',
'subscription_management' => 'Abonelik yönetimi',
- 'subscription_tools' => 'Subscription tools', //TODO - Translation
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
),
'title' => array(
+ 'feed_management' => 'RSS akış yönetimi',
+ 'subscription_tools' => 'Subscription tools', // TODO - Translation
'_' => 'Abonelik yönetimi',
- 'feed_management' => 'RSS akış yönetimi',
- 'subscription_tools' => 'Subscription tools', //TODO - Translation
),
);
diff --git a/app/i18n/tr/user.php b/app/i18n/tr/user.php
index 3a8343c11..52197ad46 100644
--- a/app/i18n/tr/user.php
+++ b/app/i18n/tr/user.php
@@ -3,35 +3,35 @@
return array(
'email' => array(
'feedback' => array(
- 'invalid' => 'The email address is invalid.', //TODO - Translation
- 'required' => 'The email address is required.', //TODO - Translation
+ 'invalid' => 'The email address is invalid.', // TODO - Translation
+ 'required' => 'The email address is required.', // TODO - Translation
),
'validation' => array(
- 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', //TODO - Translation
- 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', //TODO - Translation
+ 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', // TODO - Translation
+ 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', // TODO - Translation
'feedback' => array(
- 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', //TODO - Translation
- 'email_sent' => 'An email has been sent to your address.', //TODO - Translation
- 'error' => 'The email address failed to be validated.', //TODO - Translation
- 'ok' => 'The email address has been validated.', //TODO - Translation
- 'unneccessary' => 'The email address was already validated.', //TODO - Translation
- 'wrong_token' => 'The email address failed to be validated due to a wrong token.', //TODO - Translation
+ 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', // TODO - Translation
+ 'email_sent' => 'An email has been sent to your address.', // TODO - Translation
+ 'error' => 'The email address failed to be validated.', // TODO - Translation
+ 'ok' => 'The email address has been validated.', // TODO - Translation
+ 'unneccessary' => 'The email address was already validated.', // TODO - Translation
+ 'wrong_token' => 'The email address failed to be validated due to a wrong token.', // TODO - Translation
),
- 'need_to' => 'You need to validate your email address before being able to use %s.', //TODO - Translation
- 'resend_email' => 'Resend the email', //TODO - Translation
- 'title' => 'Email address validation', //TODO - Translation
- ),
- ),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
+ 'need_to' => 'You need to validate your email address before being able to use %s.', // TODO - Translation
+ 'resend_email' => 'Resend the email', // TODO - Translation
+ 'title' => 'Email address validation', // TODO - Translation
),
),
'mailer' => array(
'email_need_validation' => array(
- 'title' => 'You need to validate your account', //TODO - Translation
- 'welcome' => 'Welcome %s,', //TODO - Translation
- 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', //TODO - Translation
+ 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', // TODO - Translation
+ 'title' => 'You need to validate your account', // TODO - Translation
+ 'welcome' => 'Welcome %s,', // TODO - Translation
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
),
),
);
diff --git a/app/i18n/zh-cn/admin.php b/app/i18n/zh-cn/admin.php
index cdc8449a3..84541e402 100644
--- a/app/i18n/zh-cn/admin.php
+++ b/app/i18n/zh-cn/admin.php
@@ -83,9 +83,9 @@ return array(
'ok' => '已找到 PDO 和支持的至少一种驱动 (pdo_mysql, pdo_sqlite, pdo_pgsql) 。',
),
'php' => array(
- '_' => 'PHP 相关',
'nok' => '你的 PHP 版本为 %s,但 FreshRSS 最低需要 %s。',
'ok' => '你的 PHP 版本为 %s,与 FreshRSS 兼容。',
+ '_' => 'PHP 相关',
),
'tables' => array(
'nok' => '数据库中缺少一个或多个表。',
@@ -116,8 +116,8 @@ return array(
'name' => '名称',
'no_configure_view' => '此扩展不能配置。',
'system' => array(
- '_' => '系统扩展',
'no_rights' => '系统扩展 (你不能修改它)',
+ '_' => '系统扩展',
),
'title' => '扩展',
'update' => '更新可用',
@@ -125,7 +125,6 @@ return array(
'version' => '版本',
),
'stats' => array(
- '_' => '统计',
'all_feeds' => '所有 RSS 源',
'category' => '分类',
'entry_count' => '条目数',
@@ -155,37 +154,44 @@ return array(
'status_unread' => '未读',
'title' => '统计',
'top_feed' => '前十 RSS 源',
+ '_' => '统计',
),
'system' => array(
- '_' => '系统配置',
'auto-update-url' => '自动升级服务器 URL',
- 'force_email_validation' => 'Force email addresses validation', //TODO - Translation
- 'instance-name' => '实例名称',
- 'max-categories' => '每用户分类限制',
- 'max-feeds' => '每用户 RSS 源限制',
'cookie-duration' => array(
'help' => '单位(秒)',
'number' => '保持登录的时长',
),
+ 'force_email_validation' => 'Force email addresses validation', // TODO - Translation
+ 'instance-name' => '实例名称',
+ 'max-categories' => '每用户分类限制',
+ 'max-feeds' => '每用户 RSS 源限制',
'registration' => array(
'help' => '0 表示无账户数限制',
'number' => '最大账户数',
),
+ '_' => '系统配置',
),
'update' => array(
- '_' => '更新系统',
'apply' => '应用',
'check' => '检查更新',
'current_version' => '当前 FreshRSS 版本为 %s.',
'last' => '上一次检查: %s',
'none' => '没有可用更新',
'title' => '更新系统',
+ '_' => '更新系统',
),
'user' => array(
'articles_and_size' => '%s 篇文章 (%s)',
+ 'article_count' => 'Articles', // TODO - Translation
+ 'back_to_manage' => '← Return to user list', // TODO - Translation
'create' => '创建新用户',
+ 'database_size' => 'Database size', // TODO - Translation
'delete_users' => '删除用户',
+ 'email' => 'Email address', // TODO - Translation
+ 'feed_count' => 'Feeds', // TODO - Translation
'language' => '语言',
+ 'list' => 'User list', // TODO - Translation
'number' => '已有 %d 个用户',
'numbers' => '已有 %d 个用户',
'password_form' => '密码<br /><small>(用于 Web-form 登录方式)</small>',
@@ -193,8 +199,8 @@ return array(
'selected' => '已选中用户',
'title' => '用户管理',
'update_users' => '更新用户',
- 'user_list' => '用户列表',
'username' => '用户名',
'users' => '用户',
+ 'user_list' => '用户列表',
),
);
diff --git a/app/i18n/zh-cn/conf.php b/app/i18n/zh-cn/conf.php
index a7404bc58..98db0b98d 100644
--- a/app/i18n/zh-cn/conf.php
+++ b/app/i18n/zh-cn/conf.php
@@ -2,34 +2,33 @@
return array(
'archiving' => array(
- '_' => '存档',
'delete_after' => '文章保留',
- 'exception' => 'Purge exception', //TODO - Translation
+ 'exception' => 'Purge exception', // TODO - Translation
'help' => '详细选项位于单独的 RSS 源设置',
- 'keep_favourites' => 'Never delete favourites', //TODO - Translation
+ 'keep_favourites' => 'Never delete favourites', // TODO - Translation
+ 'keep_labels' => 'Never delete labels', // TODO - Translation
+ 'keep_max' => 'Maximum number of articles to keep', // TODO - Translation
'keep_min_by_feed' => '至少保存的文章数',
- 'keep_labels' => 'Never delete labels', //TODO - Translation
- 'keep_unreads' => 'Never delete unreads', //TODO - Translation
- 'maintenance' => 'Maintenance', //TODO - Translation
+ 'keep_period' => 'Maximum age of articles to keep', // TODO - Translation
+ 'keep_unreads' => 'Never delete unreads', // TODO - Translation
+ 'maintenance' => 'Maintenance', // TODO - Translation
'optimize' => '优化数据库',
'optimize_help' => '偶尔执行优化可以减少数据库大小',
- 'policy' => 'Purge policy', //TODO - Translation
- 'policy_warning' => 'If no purge policy is selected, every article will be kept.', //TODO - Translation
+ 'policy' => 'Purge policy', // TODO - Translation
+ 'policy_warning' => 'If no purge policy is selected, every article will be kept.', // TODO - Translation
'purge_now' => '立即清除',
- 'keep_max' => 'Maximum number of articles to keep', //TODO - Translation
- 'keep_period' => 'Maximum age of articles to keep', //TODO - Translation
'title' => '存档',
'ttl' => '最小自动更新时间',
+ '_' => '存档',
),
'display' => array(
- '_' => '显示',
'icon' => array(
'bottom_line' => '底栏',
+ 'display_authors' => 'Authors', // TODO - Translation
'entry' => '文章图标',
'publication_date' => '更新日期',
'related_tags' => '相关标签',
'sharing' => '分享',
- 'display_authors' => 'Authors', //TODO - Translation
'top_line' => '顶栏',
),
'language' => '语言',
@@ -47,21 +46,22 @@ return array(
'no_limit' => '无限制',
'thin' => '小',
),
+ '_' => '显示',
),
'profile' => array(
- '_' => '帐户管理',
+ 'api' => 'API management', // TODO - Translation
'delete' => array(
- '_' => '账户删除',
'warn' => '你的帐户和所有相关数据都将被删除。',
+ '_' => '账户删除',
),
'email' => 'Email 地址',
'password_api' => 'API 密码<br /><small>(例如,用于手机 APP)</small>',
'password_form' => '密码<br /><small>(用于 Web-form 登录方式)</small>',
'password_format' => '至少 7 个字符',
'title' => '用户帐户',
+ '_' => '帐户管理',
),
'query' => array(
- '_' => '自定义查询',
'deprecated' => '此查询不再有效。相关的分类或 RSS 源已被删除。',
'display' => '显示查询结果',
'filter' => '生效的过滤器:',
@@ -69,8 +69,8 @@ return array(
'get_category' => '显示分类 "%s"',
'get_favorite' => '显示收藏文章',
'get_feed' => '显示RSS 源 "%s"',
- 'no_filter' => '无过滤器',
'none' => '你未创建任何自定义查询。',
+ 'no_filter' => '无过滤器',
'number' => '查询 n°%d',
'order_asc' => '由旧到新显示文章',
'order_desc' => '由新到旧显示文章',
@@ -93,9 +93,9 @@ return array(
'state_14' => '显示未读文章',
'state_15' => '显示所有文章',
'title' => '自定义查询',
+ '_' => '自定义查询',
),
'reading' => array(
- '_' => '阅读',
'after_onread' => '“全部设为已读”后,',
'articles_per_page' => '每页文章数',
'auto_load_more' => '在页面底部载入下一篇文章',
@@ -116,16 +116,16 @@ return array(
'when' => '将文章设为已读…',
),
'show' => array(
- '_' => '文章显示',
'adaptive' => '智能显示',
'all_articles' => '显示所有文章',
'unread' => '只显示未读',
+ '_' => '文章显示',
),
'sides_close_article' => '点击文章外区域以关闭文章',
'sort' => array(
- '_' => '排列顺序',
'newer_first' => '由新到旧',
'older_first' => '由旧到新',
+ '_' => '排列顺序',
),
'sticky_post' => '打开文章时将其置顶',
'title' => '阅读',
@@ -135,9 +135,9 @@ return array(
'normal' => '普通视图',
'reader' => '阅读视图',
),
+ '_' => '阅读',
),
'sharing' => array(
- '_' => '分享',
'add' => '添加分享方式',
'blogotext' => 'Blogotext',
'diaspora' => 'Diaspora*',
@@ -152,9 +152,9 @@ return array(
'title' => '分享',
'twitter' => 'Twitter',
'wallabag' => 'wallabag',
+ '_' => '分享',
),
'shortcut' => array(
- '_' => '快捷键',
'article_action' => '文章操作',
'auto_share' => '分享',
'auto_share_help' => '如果有多种分享方式,则会按照它们的编号依次访问。',
@@ -186,6 +186,7 @@ return array(
'user_filter' => '显示自定义查询',
'user_filter_help' => '如果有多个自定义过滤器,则会按照它们的编号依次访问。',
'views' => '视图',
+ '_' => '快捷键',
),
'user' => array(
'articles_and_size' => '%s 篇文章 (%s)',
diff --git a/app/i18n/zh-cn/feedback.php b/app/i18n/zh-cn/feedback.php
index e8ee969b0..67fb181bd 100644
--- a/app/i18n/zh-cn/feedback.php
+++ b/app/i18n/zh-cn/feedback.php
@@ -1,13 +1,19 @@
<?php
return array(
- 'admin' => array(
- 'optimization_complete' => '优化完成',
- ),
'access' => array(
'denied' => '你无权访问此页面',
'not_found' => '你寻找的页面不存在',
),
+ 'admin' => array(
+ 'optimization_complete' => '优化完成',
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO - Translation
+ 'updated' => 'Your password has been modified', // TODO - Translation
+ ),
+ ),
'auth' => array(
'form' => array(
'not_set' => '配置认证方式时出错。请稍后重试。',
@@ -38,9 +44,9 @@ return array(
'ko' => '%s 启用失败。<a href="%s">检查 FreshRSS 日志</a> 查看详情。',
'ok' => '%s 现已禁用',
),
- 'no_access' => '你无权访问 %s',
'not_enabled' => '%s 未启用',
'not_found' => '%s 不存在',
+ 'no_access' => '你无权访问 %s',
),
'import_export' => array(
'export_no_zip_extension' => '服务器未启用 ZIP 扩展。请尝试逐个导出文件。',
@@ -66,10 +72,10 @@ return array(
'emptied' => '分类已清空。',
'error' => '分类更新失败。',
'name_exists' => '分类名已存在。',
- 'no_id' => '你必须明确分类 ID',
- 'no_name' => '分类名不能为空。',
'not_delete_default' => '你不能删除默认分类!',
'not_exist' => '分类不存在!',
+ 'no_id' => '你必须明确分类 ID',
+ 'no_name' => '分类名不能为空。',
'over_max' => '你已达到分类数限制 (%d)',
'updated' => '分类已更新。',
),
@@ -82,10 +88,10 @@ return array(
'error' => 'RSS 源更新失败',
'internal_problem' => 'RSS 源添加失败。<a href="%s">检查 FreshRSS 日志</a> 查看详情。你可以在URL后附加 <code>#force_feed</code> 从而尝试强制添加。',
'invalid_url' => 'URL <em>%s</em> 无效',
+ 'not_added' => '<em>%s</em> 添加失败',
+ 'no_refresh' => '没有可刷新的 RSS 源…',
'n_actualized' => '%d 个 RSS 源已更新',
'n_entries_deleted' => '%d 篇文章已删除',
- 'no_refresh' => '没有可刷新的 RSS 源…',
- 'not_added' => '<em>%s</em> 添加失败',
'over_max' => '你已达到 RSS 源数限制 (%d)',
'updated' => 'RSS 源已更新',
),
@@ -101,16 +107,16 @@ return array(
),
'user' => array(
'created' => array(
- '_' => '用户 %s 已创建',
'error' => '用户 %s 创建失败',
+ '_' => '用户 %s 已创建',
),
'deleted' => array(
- '_' => '用户 %s 已删除',
'error' => '用户 %s 删除失败',
+ '_' => '用户 %s 已删除',
),
'updated' => array(
- '_' => '用户 %s 已更新',
'error' => '用户 %s 更新失败',
+ '_' => '用户 %s 已更新',
),
),
);
diff --git a/app/i18n/zh-cn/gen.php b/app/i18n/zh-cn/gen.php
index 31817260e..96b09bcdc 100644
--- a/app/i18n/zh-cn/gen.php
+++ b/app/i18n/zh-cn/gen.php
@@ -3,7 +3,7 @@
return array(
'action' => array(
'actualize' => '获取',
- 'back' => '← Go back', //TODO - Translation
+ 'back' => '← Go back', // TODO - Translation
'back_to_rss_feeds' => '← 返回',
'cancel' => '取消',
'create' => '创建',
@@ -16,32 +16,33 @@ return array(
'manage' => '管理',
'mark_favorite' => '加入收藏',
'mark_read' => '设为已读',
+ 'purge' => 'Purge', // TODO - Translation
'remove' => '删除',
'see_website' => '查看网站',
'submit' => '提交',
'truncate' => '删除所有文章',
- 'update' => '更新', //TODO - Translation
+ 'update' => '更新',
),
'auth' => array(
- 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
+ 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO - Translation
'email' => 'Email 地址',
'keep_logged_in' => '自动登录<small>(%s 天)</small>',
'login' => '登录',
'logout' => '登出',
'password' => array(
- '_' => '密码',
'format' => '<small>至少 7 个字符</small>',
+ '_' => '密码',
),
'registration' => array(
- '_' => '新账户',
'ask' => '创建新账户?',
'title' => '账户创建',
+ '_' => '新账户',
),
'reset' => '密码重置',
'username' => array(
- '_' => '用户名',
'admin' => '管理员用户名',
'format' => '<small>最大 16 个数字或字母</small>',
+ '_' => '用户名',
),
),
'date' => array(
@@ -59,13 +60,13 @@ return array(
'feb' => '二月',
'february' => '二月',
'format_date' => 'Y\\年n\\月j\\日',
- 'format_date_hour' => 'Y\\年n\\月j\\日 H\\:i',
+ 'format_date_hour' => 'Y\\年n\\月j\\日 H\\:i',
'fri' => '周五',
'Jan' => '\\一\\月',
'jan' => '一月',
'january' => '一月',
- 'Jul' => '\\七\\月',
'jul' => '七月',
+ 'Jul' => '\\七\\月',
'july' => '七月',
'Jun' => '\\六\\月',
'jun' => '六月',
@@ -75,8 +76,8 @@ return array(
'last_month' => '上月',
'last_week' => '上周',
'last_year' => '去年',
- 'Mar' => '\\三\\月',
'mar' => '三月',
+ 'Mar' => '\\三\\月',
'march' => '三月',
'May' => '\\五\\月',
'may' => '五月',
@@ -101,8 +102,8 @@ return array(
'yesterday' => '昨天',
),
'freshrss' => array(
- '_' => 'FreshRSS',
'about' => '关于 FreshRSS',
+ '_' => 'FreshRSS',
),
'js' => array(
'category_empty' => '清空分类',
@@ -129,6 +130,7 @@ return array(
'oc' => 'Occitan',
'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
+ 'sk' => 'Slovenčina', // TODO - Translation
'tr' => 'Türkçe',
'zh-cn' => '简体中文',
),
@@ -163,11 +165,11 @@ return array(
'previous' => '上一页',
),
'period' => array(
- 'days' => 'days', //TODO - Translation
- 'hours' => 'hours', //TODO - Translation
- 'months' => 'months', //TODO - Translation
- 'weeks' => 'weeks', //TODO - Translation
- 'years' => 'years', //TODO - Translation
+ 'days' => 'days', // TODO - Translation
+ 'hours' => 'hours', // TODO - Translation
+ 'months' => 'months', // TODO - Translation
+ 'weeks' => 'weeks', // TODO - Translation
+ 'years' => 'years', // TODO - Translation
),
'share' => array(
'blogotext' => 'Blogotext',
diff --git a/app/i18n/zh-cn/index.php b/app/i18n/zh-cn/index.php
index 3e448608e..2c0c490e9 100644
--- a/app/i18n/zh-cn/index.php
+++ b/app/i18n/zh-cn/index.php
@@ -2,7 +2,6 @@
return array(
'about' => array(
- '_' => '关于',
'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
'bugs_reports' => 'Bug 报告',
'credits' => '致谢',
@@ -14,23 +13,21 @@ return array(
'title' => '关于',
'version' => '版本',
'website' => '网站',
- ),
- 'tos' => array(
- 'title' => 'Terms of Service', // TODO - Translation
+ '_' => '关于',
),
'feed' => array(
'add' => '你可以添加一些 RSS 源。',
'empty' => '暂时没有文章可显示。',
'rss_of' => '%s 的 RSS 源',
'title' => '首页',
- 'title_global' => '全屏视图',
'title_fav' => '收藏',
+ 'title_global' => '全屏视图',
),
'log' => array(
- '_' => '日志',
'clear' => '清除日志',
'empty' => '日志文件为空',
'title' => '日志',
+ '_' => '日志',
),
'menu' => array(
'about' => '关于 FreshRSS',
@@ -63,4 +60,7 @@ return array(
'tag' => array(
'related' => '文章标签',
),
+ 'tos' => array(
+ 'title' => 'Terms of Service', // TODO - Translation
+ ),
);
diff --git a/app/i18n/zh-cn/install.php b/app/i18n/zh-cn/install.php
index da231917b..a2df1603b 100644
--- a/app/i18n/zh-cn/install.php
+++ b/app/i18n/zh-cn/install.php
@@ -17,20 +17,19 @@ return array(
'type' => '认证方式',
),
'bdd' => array(
- '_' => '数据库',
'conf' => array(
- '_' => '数据库配置',
'ko' => '请验证你的数据库信息。',
'ok' => '数据库配置已保存。',
+ '_' => '数据库配置',
),
'host' => '主机',
'password' => '密码',
'prefix' => '表前缀',
'type' => '数据库类型',
'username' => '用户名',
+ '_' => '数据库',
),
'check' => array(
- '_' => '检查',
'already_installed' => '我们检测到 FreshRSS 已经安装!',
'cache' => array(
'nok' => '请检查 <em>./data/cache</em> 目录权限。HTTP 服务器必须有其写入权限。',
@@ -96,10 +95,11 @@ return array(
'nok' => '找不到用于 XML 解析库。',
'ok' => '已找到 XML 解析库。',
),
+ '_' => '检查',
),
'conf' => array(
- '_' => '常规配置',
'ok' => '常规配置已保存。',
+ '_' => '常规配置',
),
'congratulations' => '恭喜!',
'default_user' => '默认用户名 <small>(最大 16 个数字或字母)</small>',
@@ -110,14 +110,14 @@ return array(
'confirm_reinstall' => '重新安装 FreshRSS 将会重置之前的配置。你确定要继续吗?',
),
'language' => array(
- '_' => '语言',
'choose' => '为 FreshRSS 选择语言',
'defined' => '语言已指定。',
+ '_' => '语言',
),
'not_deleted' => '出错!你必须手动删除文件 <em>%s</em>。',
'ok' => '安装成功。',
'step' => '步骤 %d',
'steps' => '步骤',
- 'title' => '安装 FreshRSS',
'this_is_the_end' => '最后一步',
+ 'title' => '安装 FreshRSS',
);
diff --git a/app/i18n/zh-cn/sub.php b/app/i18n/zh-cn/sub.php
index 944d6986f..9e27506a6 100644
--- a/app/i18n/zh-cn/sub.php
+++ b/app/i18n/zh-cn/sub.php
@@ -11,15 +11,15 @@ return array(
'title' => '书签应用',
),
'category' => array(
- '_' => '分类',
'add' => '添加分类',
'archiving' => '存档',
'empty' => '空分类',
'information' => '信息',
'new' => '新分类',
- 'position' => 'Display position', //TODO - Translation
- 'position_help' => 'To control category sort order', //TODO - Translation
+ 'position' => 'Display position', // TODO - Translation
+ 'position_help' => 'To control category sort order', // TODO - Translation
'title' => '标题',
+ '_' => '分类',
),
'feed' => array(
'add' => '添加 RSS 源',
@@ -39,8 +39,8 @@ return array(
'empty' => '此源为空。请确认它是否正常更新。',
'error' => '此源遇到一些问题。请在确认是否能正常访问后重试。',
'filteractions' => array(
- '_' => 'Filter actions', //TODO - Translation
- 'help' => 'Write one search filter per line.', //TODO - Translation
+ 'help' => 'Write one search filter per line.', // TODO - Translation
+ '_' => 'Filter actions', // TODO - Translation
),
'information' => '信息',
'keep_min' => '至少保存的文章数',
@@ -49,12 +49,11 @@ return array(
'no_selected' => '未选择 RSS 源。',
'number_entries' => '%d 篇文章',
'priority' => array(
- '_' => '可见性',
'archived' => '不显示 (存档)',
'main_stream' => '在首页中显示',
'normal' => '在分类中显示',
+ '_' => '可见性',
),
- 'websub' => 'WebSub 即时通知',
'show' => array(
'all' => '显示所有 RSS 源',
'error' => '仅显示有错误的 RSS 源',
@@ -72,17 +71,18 @@ return array(
'url' => '源 URL',
'validator' => '检查 RSS 源有效性',
'website' => '网站 URL',
+ 'websub' => 'WebSub 即时通知',
),
'firefox' => array(
'documentation' => '按照 <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">这里</a> 描述的步骤可将 FreshRSS 添加到 Firefox 阅读器列表',
- 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', //TODO - Translation
+ 'obsolete_63' => 'From version 63 and onwards, Firefox has removed the ability to add your own subscription services that are not standalone programs.', // TODO - Translation
'title' => 'Firefox RSS 阅读器',
),
'import_export' => array(
'export' => '导出',
+ 'export_labelled' => '导出有标签的文章',
'export_opml' => '导出 RSS 源列表 (OPML)',
'export_starred' => '导出你的收藏',
- 'export_labelled' => '导出有标签的文章',
'feed_list' => '%s 文章列表',
'file_to_import' => '需要导入的文件<br />(OPML, JSON 或 ZIP)',
'file_to_import_no_zip' => '需要导入的文件<br />(OPML 或 JSON)',
@@ -97,8 +97,8 @@ return array(
'subscription_tools' => '订阅工具',
),
'title' => array(
- '_' => '订阅管理',
'feed_management' => 'RSS 源管理',
'subscription_tools' => '订阅工具',
+ '_' => '订阅管理',
),
);
diff --git a/app/i18n/zh-cn/user.php b/app/i18n/zh-cn/user.php
index 3a8343c11..52197ad46 100644
--- a/app/i18n/zh-cn/user.php
+++ b/app/i18n/zh-cn/user.php
@@ -3,35 +3,35 @@
return array(
'email' => array(
'feedback' => array(
- 'invalid' => 'The email address is invalid.', //TODO - Translation
- 'required' => 'The email address is required.', //TODO - Translation
+ 'invalid' => 'The email address is invalid.', // TODO - Translation
+ 'required' => 'The email address is required.', // TODO - Translation
),
'validation' => array(
- 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', //TODO - Translation
- 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', //TODO - Translation
+ 'change_email' => 'You can change your email address <a href="%s">on the profile page</a>.', // TODO - Translation
+ 'email_sent_to' => 'We sent you an email at <strong>%s</strong>, please follow its indications to validate your address.', // TODO - Translation
'feedback' => array(
- 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', //TODO - Translation
- 'email_sent' => 'An email has been sent to your address.', //TODO - Translation
- 'error' => 'The email address failed to be validated.', //TODO - Translation
- 'ok' => 'The email address has been validated.', //TODO - Translation
- 'unneccessary' => 'The email address was already validated.', //TODO - Translation
- 'wrong_token' => 'The email address failed to be validated due to a wrong token.', //TODO - Translation
+ 'email_failed' => 'We couldn’t send you an email because of a misconfiguration of the server.', // TODO - Translation
+ 'email_sent' => 'An email has been sent to your address.', // TODO - Translation
+ 'error' => 'The email address failed to be validated.', // TODO - Translation
+ 'ok' => 'The email address has been validated.', // TODO - Translation
+ 'unneccessary' => 'The email address was already validated.', // TODO - Translation
+ 'wrong_token' => 'The email address failed to be validated due to a wrong token.', // TODO - Translation
),
- 'need_to' => 'You need to validate your email address before being able to use %s.', //TODO - Translation
- 'resend_email' => 'Resend the email', //TODO - Translation
- 'title' => 'Email address validation', //TODO - Translation
- ),
- ),
- 'tos' => array(
- 'feedback' => array(
- 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
+ 'need_to' => 'You need to validate your email address before being able to use %s.', // TODO - Translation
+ 'resend_email' => 'Resend the email', // TODO - Translation
+ 'title' => 'Email address validation', // TODO - Translation
),
),
'mailer' => array(
'email_need_validation' => array(
- 'title' => 'You need to validate your account', //TODO - Translation
- 'welcome' => 'Welcome %s,', //TODO - Translation
- 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', //TODO - Translation
+ 'body' => 'You’ve just registered on %s but you still need to validate your email. For that, just follow the link:', // TODO - Translation
+ 'title' => 'You need to validate your account', // TODO - Translation
+ 'welcome' => 'Welcome %s,', // TODO - Translation
+ ),
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'You must accept the Terms of Service to be able to register.', // TODO - Translation
),
),
);
diff --git a/app/install.php b/app/install.php
index 557ae9eab..3737e2ccc 100644
--- a/app/install.php
+++ b/app/install.php
@@ -221,7 +221,6 @@ function saveStep3() {
$_SESSION['default_user'],
'', //TODO: Add e-mail
$password_plain,
- '',
[
'language' => $_SESSION['language'],
]
diff --git a/app/shares.php b/app/shares.php
index 9df83617a..7778dbd5c 100644
--- a/app/shares.php
+++ b/app/shares.php
@@ -8,10 +8,12 @@
* For each share there is different configuration options. Here is the description
* of those options:
* - url is a mandatory option. It is a string representing the share URL. It
- * supports 3 different placeholders for custom data. The ~URL~ placeholder
+ * supports 4 different placeholders for custom data. The ~URL~ placeholder
* represents the URL of the system used to share, it is configured by the
* user. The ~LINK~ placeholder represents the link of the shared article.
- * The ~TITLE~ placeholder represents the title of the shared article.
+ * The ~TITLE~ placeholder represents the title of the shared article. The
+ * ~ID~ placeholder represents the id of the shared article (only useful
+ * for internal use)
* - transform is an array of transformation to apply on links and titles
* - help is a URL to a help page
* - form is the type of form to display during configuration. It's either
diff --git a/app/views/helpers/index/normal/entry_bottom.phtml b/app/views/helpers/index/normal/entry_bottom.phtml
index dd84ca346..6755e9b6b 100644
--- a/app/views/helpers/index/normal/entry_bottom.phtml
+++ b/app/views/helpers/index/normal/entry_bottom.phtml
@@ -78,6 +78,7 @@
<ul class="dropdown-menu">
<li class="dropdown-close"><a href="#close">❌</a></li><?php
+ $id = $this->entry->id();
$link = $this->entry->link();
$title = $this->entry->title() . ' · ' . $this->feed->name();
foreach (FreshRSS_Context::$user_conf->sharing as $share_options) {
@@ -85,6 +86,7 @@
if ($share === null) {
continue;
}
+ $share_options['id'] = $id;
$share_options['link'] = $link;
$share_options['title'] = $title;
$share->update($share_options);
diff --git a/app/views/user/details.phtml b/app/views/user/details.phtml
new file mode 100644
index 000000000..7a4687184
--- /dev/null
+++ b/app/views/user/details.phtml
@@ -0,0 +1,65 @@
+<?php $this->partial('aside_configure'); ?>
+
+<div class="post">
+ <a href="<?= _url('user', 'manage'); ?>"><?= _t('admin.user.back_to_manage'); ?></a>
+
+ <legend><?= $this->username; ?></legend>
+ <form method="post" action="<?= _url('user', 'manage', 'username', $this->username); ?>">
+ <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken(); ?>" />
+
+ <div class="form-group">
+ <label class="group-name"><?= _t('admin.user.email') ?></label>
+ <div class="group-controls">
+ <?= $this->details['mail_login'] ?>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="group-name"><?= _t('admin.user.language') ?></label>
+ <div class="group-controls">
+ <?= _t("gen.lang.{$this->details['language']}") ?>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="group-name"><?= _t('admin.user.feed_count') ?></label>
+ <div class="group-controls">
+ <?= format_number($this->details['feed_count']) ?>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="group-name"><?= _t('admin.user.article_count') ?></label>
+ <div class="group-controls">
+ <?= format_number($this->details['article_count']) ?>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="group-name"><?= _t('admin.user.database_size') ?></label>
+ <div class="group-controls">
+ <?= format_bytes($this->details['database_size']) ?>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="group-name" for="newPasswordPlain"><?= _t('admin.user.password_form') ?></label>
+ <div class="group-controls">
+ <div class="stick">
+ <input type="password" id="newPasswordPlain" name="newPasswordPlain" autocomplete="new-password" pattern=".{7,}" <?= cryptAvailable() ? '' : 'disabled="disabled" ' ?>/>
+ <a class="btn toggle-password" data-toggle="password-<?= $this->username; ?>"><?= _i('key') ?></a>
+ </div>
+ <?= _i('help'); ?> <?= _t('admin.user.password_format') ?>
+ </div>
+ </div>
+
+ <div class="form-group form-actions">
+ <noscript><b><?= _t('gen.js.should_be_activated'); ?></b></noscript>
+ <div class="group-controls">
+ <button type="submit" class="btn btn-important" name="action" value="update"><?= _t('gen.action.update') ?></button>
+ <button type="submit" class="btn btn-attention confirm" name="action" value="purge"><?= _t('gen.action.purge') ?></button>
+ <button type="submit" class="btn btn-attention confirm" name="action" value="delete"><?= _t('gen.action.remove') ?></button>
+ <div>
+ </div>
+ </form>
+</div>
diff --git a/app/views/user/manage.phtml b/app/views/user/manage.phtml
index 93d1008b5..951544248 100644
--- a/app/views/user/manage.phtml
+++ b/app/views/user/manage.phtml
@@ -57,66 +57,31 @@
</div>
</form>
- <form method="post" action="<?= _url('user', 'update') ?>">
- <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" />
- <legend><?= _t('admin.user.update_users') ?></legend>
-
- <div class="form-group">
- <label class="group-name" for="current_user"><?= _t('admin.user.selected') ?></label>
- <div class="group-controls">
- <select id="current_user" name="username">
- <option selected="selected"> </option>
- <?php foreach (listUsers() as $username) { ?>
- <option value="<?= $username ?>"><?= $username ?></option>
- <?php } ?>
- </select>
- </div>
- </div>
-
- <div class="form-group">
- <label class="group-name" for="newPasswordPlain"><?= _t('admin.user.password_form') ?></label>
- <div class="group-controls">
- <div class="stick">
- <input type="password" id="newPasswordPlain" name="newPasswordPlain" autocomplete="new-password" pattern=".{7,}" <?= cryptAvailable() ? '' : 'disabled="disabled" ' ?>/>
- <a class="btn toggle-password" data-toggle="newPasswordPlain"><?= _i('key') ?></a>
- </div>
- <?= _i('help') ?> <?= _t('conf.profile.password_format') ?>
- <noscript><b><?= _t('gen.js.should_be_activated') ?></b></noscript>
- </div>
- </div>
-
- <div class="form-group form-actions">
- <div class="group-controls">
- <button type="submit" class="btn btn-important"><?= _t('gen.action.update') ?></button>
- <button type="reset" class="btn"><?= _t('gen.action.cancel') ?></button>
- </div>
- </div>
- </form>
-
- <form method="post" action="<?= _url('user', 'delete') ?>">
- <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" />
- <legend><?= _t('admin.user.delete_users') ?></legend>
-
- <div class="form-group">
- <label class="group-name" for="user-list"><?= _t('admin.user.selected') ?></label>
- <div class="group-controls">
- <select id="user-list" class="select-change" name="username">
- <option selected="selected"> </option>
- <?php foreach (listUsers() as $username) { ?>
- <option data-url="<?= _url('user', 'manage', 'u', $username) ?>" <?= $this->current_user === $username ? 'selected="selected"' : '' ?> value="<?= $username ?>"><?= $username ?></option>
- <?php } ?>
- </select>
-
- <p><?php echo _t('admin.user.articles_and_size',
- format_number($this->nb_articles),
- format_bytes($this->size_user)); ?></p>
- </div>
- </div>
-
- <div class="form-group form-actions">
- <div class="group-controls">
- <button type="submit" class="btn btn-attention confirm"><?= _t('gen.action.remove') ?></button>
- </div>
- </div>
- </form>
+ <legend><?= _t('admin.user.list'); ?></legend>
+ <table id="user-list">
+ <thead>
+ <tr>
+ <th><?= _t('admin.user.username') ?></th>
+ <th><?= _t('admin.user.email') ?></th>
+ <th><?= _t('admin.user.language') ?></th>
+ <th><?= _t('admin.user.feed_count') ?></th>
+ <th><?= _t('admin.user.article_count') ?></th>
+ <th><?= _t('admin.user.database_size') ?></th>
+ <th>&nbsp;</th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($this->users as $username => $values) : ?>
+ <tr>
+ <td><?= $username ?></td>
+ <td><?= $values['mail_login'] ?></td>
+ <td><?= _t("gen.lang.{$values['language']}") ?></td>
+ <td><?= format_number($values['feed_count']) ?></td>
+ <td><?= format_number($values['article_count']) ?></td>
+ <td><?= format_bytes($values['database_size']) ?></td>
+ <td><a href="<?= _url('user', 'details', 'username', $username) ?>">Details</a></td>
+ </tr>
+ <?php endforeach ?>
+ </tbody>
+ </table>
</div>
diff --git a/app/views/user/profile.phtml b/app/views/user/profile.phtml
index b8bb5cee9..5357c2bfd 100644
--- a/app/views/user/profile.phtml
+++ b/app/views/user/profile.phtml
@@ -48,19 +48,6 @@
</div>
</div>
- <?php if (FreshRSS_Context::$system_conf->api_enabled) { ?>
- <div class="form-group">
- <label class="group-name" for="apiPasswordPlain"><?= _t('conf.profile.password_api') ?></label>
- <div class="group-controls">
- <div class="stick">
- <input type="password" id="apiPasswordPlain" name="apiPasswordPlain" autocomplete="new-password" pattern=".{7,}" <?= cryptAvailable() ? '' : 'disabled="disabled" ' ?>/>
- <a class="btn toggle-password" data-toggle="apiPasswordPlain"><?= _i('key') ?></a>
- </div>
- <?= _i('help') ?> <kbd><a href="../api/"><?= Minz_Url::display('/api/', 'html', true) ?></a></kbd>
- </div>
- </div>
- <?php } ?>
-
<?php if (FreshRSS_Auth::accessNeedsAction()) { ?>
<div class="form-group">
<label class="group-name" for="token"><?= _t('admin.auth.token') ?></label>
@@ -82,6 +69,30 @@
</div>
</form>
+ <?php if (FreshRSS_Context::$system_conf->api_enabled) { ?>
+ <form method="post" action="<?= _url('api', 'updatePassword') ?>">
+ <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" />
+ <legend><?= _t('conf.profile.api') ?></legend>
+
+ <div class="form-group">
+ <label class="group-name" for="apiPasswordPlain"><?= _t('conf.profile.password_api') ?></label>
+ <div class="group-controls">
+ <div class="stick">
+ <input type="password" id="apiPasswordPlain" name="apiPasswordPlain" autocomplete="new-password" pattern=".{7,}" <?= cryptAvailable() ? '' : 'disabled="disabled" ' ?>/>
+ <a class="btn toggle-password" data-toggle="apiPasswordPlain"><?= _i('key') ?></a>
+ </div>
+ <?= _i('help') ?> <kbd><a href="../api/"><?= Minz_Url::display('/api/', 'html', true) ?></a></kbd>
+ </div>
+ </div>
+
+ <div class="form-group form-actions">
+ <div class="group-controls">
+ <button type="submit" class="btn btn-important"><?= _t('gen.action.submit') ?></button>
+ </div>
+ </div>
+ </form>
+ <?php } ?>
+
<?php if (!FreshRSS_Auth::hasAccess('admin')) { ?>
<form id="crypto-form" method="post" action="<?= _url('user', 'delete') ?>">
<input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" />
diff --git a/cli/README.md b/cli/README.md
index 89b440a39..4ef665e69 100644
--- a/cli/README.md
+++ b/cli/README.md
@@ -127,5 +127,5 @@ Example to get the number of feeds of a given user:
# Install and updates
-If you want to administrate FreshRSS using git, please read our [installation docs](https://freshrss.github.io/FreshRSS/en/admins/02_Installation.html)
+If you want to administrate FreshRSS using git, please read our [installation docs](https://freshrss.github.io/FreshRSS/en/admins/03_Installation.html)
and [update guidelines](https://freshrss.github.io/FreshRSS/en/admins/03_Updating.html).
diff --git a/cli/_update-or-create-user.php b/cli/_update-or-create-user.php
index 43b86a4a9..3217a07ea 100644
--- a/cli/_update-or-create-user.php
+++ b/cli/_update-or-create-user.php
@@ -4,7 +4,6 @@ require(__DIR__ . '/_cli.php');
$params = array(
'user:',
'password:',
- 'api_password:',
'language:',
'email:',
'token:',
@@ -24,7 +23,7 @@ $options = getopt('', $params);
if (!validateOptions($argv, $params) || empty($options['user'])) {
fail('Usage: ' . basename($_SERVER['SCRIPT_FILENAME']) .
- " --user username ( --password 'password' --api_password 'api_password'" .
+ " --user username ( --password 'password'" .
" --language en --email user@example.net --token 'longRandomString'" .
($isUpdate ? '' : '--no_default_feeds') .
" --purge_after_months 3 --feed_min_articles_default 50 --feed_ttl_default 3600" .
diff --git a/cli/check.translation.php b/cli/check.translation.php
index 6ebd12973..12655fc8e 100644
--- a/cli/check.translation.php
+++ b/cli/check.translation.php
@@ -1,11 +1,14 @@
<?php
-require_once __DIR__ . '/i18n/I18nFile.php';
require_once __DIR__ . '/i18n/I18nCompletionValidator.php';
+require_once __DIR__ . '/i18n/I18nData.php';
+require_once __DIR__ . '/i18n/I18nFile.php';
+require_once __DIR__ . '/i18n/I18nIgnoreFile.php';
require_once __DIR__ . '/i18n/I18nUsageValidator.php';
$i18nFile = new I18nFile();
-$i18nData = $i18nFile->load();
+$i18nIgnoreFile = new I18nIgnoreFile();
+$i18nData = new I18nData($i18nFile->load(), $i18nIgnoreFile->load());
$options = getopt("dhl:r");
diff --git a/cli/create-user.php b/cli/create-user.php
index 7e0a031d9..9e978ee3c 100755
--- a/cli/create-user.php
+++ b/cli/create-user.php
@@ -20,7 +20,6 @@ $ok = FreshRSS_user_Controller::createUser(
$username,
empty($options['mail_login']) ? '' : $options['mail_login'],
empty($options['password']) ? '' : $options['password'],
- empty($options['api_password']) ? '' : $options['api_password'],
$values,
!isset($options['no_default_feeds'])
);
diff --git a/cli/i18n/I18nData.php b/cli/i18n/I18nData.php
index 2178d330d..a6d260a8f 100644
--- a/cli/i18n/I18nData.php
+++ b/cli/i18n/I18nData.php
@@ -5,15 +5,95 @@ class I18nData {
const REFERENCE_LANGUAGE = 'en';
private $data = array();
- private $originalData = array();
+ private $ignore = array();
- public function __construct($data) {
+ public function __construct($data, $ignore) {
$this->data = $data;
- $this->originalData = $data;
+ $this->ignore = $ignore;
+
+ $this->synchonizeKeys();
}
public function getData() {
- return $this->data;
+ $output = array();
+ $reference = $this->getReferenceLanguage();
+ $languages = $this->getNonReferenceLanguages();
+
+ foreach ($reference as $file => $values) {
+ foreach ($values as $key => $value) {
+ $output[static::REFERENCE_LANGUAGE][$file][$key] = $value;
+ foreach ($languages as $language) {
+ if ($this->data[$language][$file][$key] !== $value) {
+ // This value is translated, there is no need to flag it.
+ $output[$language][$file][$key] = $this->data[$language][$file][$key];
+ } elseif (array_key_exists($language, $this->ignore) && in_array($key, $this->ignore[$language])) {
+ // This value is ignored, there is no need to flag it.
+ $output[$language][$file][$key] = $this->data[$language][$file][$key];
+ } else {
+ // This value is not translated nor ignored, it must be flagged.
+ $output[$language][$file][$key] = "{$value} -> todo";
+ }
+ }
+ }
+ }
+
+ return $output;
+ }
+
+ public function getIgnore() {
+ $ignore = array();
+
+ foreach ($this->ignore as $language => $keys) {
+ sort($keys);
+ $ignore[$language] = $keys;
+ }
+
+ return $ignore;
+ }
+
+ private function synchonizeKeys() {
+ $this->addMissingKeysFromReference();
+ $this->removeExtraKeysFromOtherLanguages();
+ $this->removeUnknownIgnoreKeys();
+ }
+
+ private function addMissingKeysFromReference() {
+ $reference = $this->getReferenceLanguage();
+ $languages = $this->getNonReferenceLanguages();
+
+ foreach ($reference as $file => $values) {
+ foreach ($values as $key => $value) {
+ foreach ($languages as $language) {
+ if (!array_key_exists($key, $this->data[$language][$file])) {
+ $this->data[$language][$file][$key] = $value;
+ }
+ }
+ }
+ }
+ }
+
+ private function removeExtraKeysFromOtherLanguages() {
+ $reference = $this->getReferenceLanguage();
+ foreach ($this->getNonReferenceLanguages() as $language) {
+ foreach ($this->getLanguage($language) as $file => $values) {
+ foreach ($values as $key => $value) {
+ if (!array_key_exists($key, $reference[$file])) {
+ unset($this->data[$language][$file][$key]);
+ }
+ }
+ }
+ }
+ }
+
+ private function removeUnknownIgnoreKeys() {
+ $reference = $this->getReferenceLanguage();
+ foreach ($this->ignore as $language => $keys) {
+ foreach ($keys as $index => $key) {
+ if (!array_key_exists($this->getFilenamePrefix($key), $reference) || !array_key_exists($key, $reference[$this->getFilenamePrefix($key)])) {
+ unset($this->ignore[$language][$index]);
+ }
+ }
+ }
}
/**
@@ -29,6 +109,17 @@ class I18nData {
}
/**
+ * Return all available languages without the reference language
+ *
+ * @return array
+ */
+ public function getNonReferenceLanguages() {
+ return array_filter(array_keys($this->data), function ($value) {
+ return static::REFERENCE_LANGUAGE !== $value;
+ });
+ }
+
+ /**
* Add a new language. It's a copy of the reference language.
*
* @param string $language
@@ -42,7 +133,7 @@ class I18nData {
}
/**
- * Add a key in the reference language
+ * Add a new key to all languages.
*
* @param string $key
* @param string $value
@@ -53,7 +144,12 @@ class I18nData {
array_key_exists($key, $this->data[static::REFERENCE_LANGUAGE][$this->getFilenamePrefix($key)])) {
throw new Exception('The selected key already exist.');
}
- $this->data[static::REFERENCE_LANGUAGE][$this->getFilenamePrefix($key)][$key] = $value;
+
+ foreach ($this->getAvailableLanguages() as $language) {
+ if (!array_key_exists($key, $this->data[$language][$this->getFilenamePrefix($key)])) {
+ $this->data[$language][$this->getFilenamePrefix($key)][$key] = $value;
+ }
+ }
}
/**
@@ -76,29 +172,6 @@ class I18nData {
}
/**
- * Duplicate a key from the reference language to all other languages
- *
- * @param string $key
- * @throws Exception
- */
- public function duplicateKey($key) {
- if (!array_key_exists($this->getFilenamePrefix($key), $this->data[static::REFERENCE_LANGUAGE]) ||
- !array_key_exists($key, $this->data[static::REFERENCE_LANGUAGE][$this->getFilenamePrefix($key)])) {
- throw new Exception('The selected key does not exist.');
- }
- $value = $this->data[static::REFERENCE_LANGUAGE][$this->getFilenamePrefix($key)][$key];
- foreach ($this->getAvailableLanguages() as $language) {
- if (static::REFERENCE_LANGUAGE === $language) {
- continue;
- }
- if (array_key_exists($key, $this->data[$language][$this->getFilenamePrefix($key)])) {
- continue;
- }
- $this->data[$language][$this->getFilenamePrefix($key)][$key] = $value;
- }
- }
-
- /**
* Remove a key in all languages
*
* @param string $key
@@ -113,14 +186,13 @@ class I18nData {
if (array_key_exists($key, $this->data[$language][$this->getFilenamePrefix($key)])) {
unset($this->data[$language][$this->getFilenamePrefix($key)][$key]);
}
+ if (array_key_exists($language, $this->ignore) && $position = array_search($key, $this->ignore[$language])) {
+ unset($this->ignore[$language][$position]);
+ }
}
}
/**
- * WARNING! This is valid only for ignore files. It's not the best way to
- * handle that but as it's meant to be used only for the cli tool, there
- * is no point of spending time on making it better than that.
- *
* Ignore a key from a language, or reverse it.
*
* @param string $key
@@ -128,25 +200,20 @@ class I18nData {
* @param boolean $reverse
*/
public function ignore($key, $language, $reverse = false) {
- $index = array_search($key, $this->data[$language]);
+ if (!array_key_exists($language, $this->ignore)) {
+ $this->ignore[$language] = array();
+ }
- if ($index && $reverse) {
- unset($this->data[$language][$index]);
+ $index = array_search($key, $this->ignore[$language]);
+ if (false !== $index && $reverse) {
+ unset($this->ignore[$language][$index]);
return;
}
- if ($index && !$reverse) {
+ if (false !== $index && !$reverse) {
return;
}
- $this->data[$language][] = $key;
- }
- /**
- * Check if the data has changed
- *
- * @return bool
- */
- public function hasChanged() {
- return $this->data !== $this->originalData;
+ $this->ignore[$language][] = $key;
}
public function getLanguage($language) {
diff --git a/cli/i18n/I18nFile.php b/cli/i18n/I18nFile.php
index 56459ce8b..c97520862 100644
--- a/cli/i18n/I18nFile.php
+++ b/cli/i18n/I18nFile.php
@@ -1,6 +1,5 @@
<?php
-require_once __DIR__ . '/I18nData.php';
require_once __DIR__ . '/I18nFileInterface.php';
class I18nFile implements I18nFileInterface{
@@ -27,11 +26,11 @@ class I18nFile implements I18nFileInterface{
}
}
- return new I18nData($i18n);
+ return $i18n;
}
- public function dump(I18nData $i18n) {
- foreach ($i18n->getData() as $language => $file) {
+ public function dump(array $i18n) {
+ foreach ($i18n as $language => $file) {
$dir = $this->i18nPath . DIRECTORY_SEPARATOR . $language;
if (!file_exists($dir)) {
mkdir($dir);
@@ -80,7 +79,7 @@ class I18nFile implements I18nFileInterface{
private function unflatten($translation) {
$a = array();
- ksort($translation);
+ ksort($translation, SORT_NATURAL | SORT_FLAG_CASE);
foreach ($translation as $compoundKey => $value) {
$keys = explode('.', $compoundKey);
array_shift($keys);
@@ -105,17 +104,20 @@ class I18nFile implements I18nFileInterface{
$patterns = array(
'/array \(/',
'/=>\s*array/',
+ '/(\w) {2}/',
'/ {2}/',
+ '/ -> todo\',/',
);
$replacements = array(
'array(',
'=> array',
+ '$1 ',
"\t", // Double quoting is mandatory to have a tab instead of the \t string
+ "',\t// TODO - Translation", // Double quoting is mandatory to have a tab instead of the \t string
);
$translation = preg_replace($patterns, $replacements, $translation);
// Double quoting is mandatory to have new lines instead of \n strings
return sprintf("<?php\n\nreturn %s;\n", $translation);
}
-
}
diff --git a/cli/i18n/I18nFileInterface.php b/cli/i18n/I18nFileInterface.php
index c5aaf9fcd..9e7c41200 100644
--- a/cli/i18n/I18nFileInterface.php
+++ b/cli/i18n/I18nFileInterface.php
@@ -6,5 +6,5 @@ interface I18nFileInterface {
public function load();
- public function dump(I18nData $i18n);
+ public function dump(array $i18n);
}
diff --git a/cli/i18n/I18nIgnoreFile.php b/cli/i18n/I18nIgnoreFile.php
index 714e000ca..a05a3d5e8 100644
--- a/cli/i18n/I18nIgnoreFile.php
+++ b/cli/i18n/I18nIgnoreFile.php
@@ -1,6 +1,5 @@
<?php
-require_once __DIR__ . '/I18nData.php';
require_once __DIR__ . '/I18nFileInterface.php';
class I18nIgnoreFile implements I18nFileInterface {
@@ -11,8 +10,8 @@ class I18nIgnoreFile implements I18nFileInterface {
$this->i18nPath = __DIR__ . '/ignore';
}
- public function dump(I18nData $i18n) {
- foreach ($i18n->getData() as $language => $content) {
+ public function dump(array $i18n) {
+ foreach ($i18n as $language => $content) {
$filename = $this->i18nPath . DIRECTORY_SEPARATOR . $language . '.php';
file_put_contents($filename, $this->format($content));
}
@@ -28,7 +27,7 @@ class I18nIgnoreFile implements I18nFileInterface {
$i18n[$file->getBasename('.php')] = (include $file->getPathname());
}
- return new I18nData($i18n);
+ return $i18n;
}
/**
diff --git a/cli/i18n/ignore/en.php b/cli/i18n/ignore/en.php
index db5a06a5e..78018bea1 100644
--- a/cli/i18n/ignore/en.php
+++ b/cli/i18n/ignore/en.php
@@ -49,6 +49,12 @@ return array(
'conf.query.order_desc',
'conf.query.state_0',
'conf.query.state_1',
+ 'conf.query.state_10',
+ 'conf.query.state_11',
+ 'conf.query.state_12',
+ 'conf.query.state_13',
+ 'conf.query.state_14',
+ 'conf.query.state_15',
'conf.query.state_2',
'conf.query.state_3',
'conf.query.state_4',
@@ -57,12 +63,6 @@ return array(
'conf.query.state_7',
'conf.query.state_8',
'conf.query.state_9',
- 'conf.query.state_10',
- 'conf.query.state_11',
- 'conf.query.state_12',
- 'conf.query.state_13',
- 'conf.query.state_14',
- 'conf.query.state_15',
'conf.sharing.blogotext',
'conf.sharing.diaspora',
'conf.sharing.email',
@@ -83,20 +83,20 @@ return array(
'gen.lang.ru',
'gen.lang.tr',
'gen.lang.zh-cn',
+ 'gen.share.Known',
'gen.share.blogotext',
'gen.share.diaspora',
'gen.share.email',
'gen.share.facebook',
+ 'gen.share.gnusocial',
+ 'gen.share.jdh',
+ 'gen.share.lemmy',
'gen.share.movim',
'gen.share.print',
'gen.share.shaarli',
'gen.share.twitter',
'gen.share.wallabag',
'gen.share.wallabagv2',
- 'gen.share.jdh',
- 'gen.share.Known',
- 'gen.share.gnusocial',
- 'gen.share.lemmy',
'index.menu.non-starred',
'index.menu.read',
'index.menu.starred',
diff --git a/cli/i18n/ignore/fr.php b/cli/i18n/ignore/fr.php
index 8ed8ffff1..d7e54ed98 100644
--- a/cli/i18n/ignore/fr.php
+++ b/cli/i18n/ignore/fr.php
@@ -3,6 +3,7 @@
return array(
'admin.extensions.title',
'admin.stats.number_entries',
+ 'admin.user.article_count',
'admin.user.articles_and_size',
'conf.display.width.large',
'conf.sharing.blogotext',
@@ -34,20 +35,20 @@ return array(
'gen.share.blogotext',
'gen.share.diaspora',
'gen.share.facebook',
+ 'gen.share.gnusocial',
+ 'gen.share.jdh',
+ 'gen.share.lemmy',
'gen.share.movim',
'gen.share.shaarli',
'gen.share.twitter',
'gen.share.wallabag',
'gen.share.wallabagv2',
- 'gen.share.jdh',
- 'gen.share.gnusocial',
- 'gen.share.lemmy',
'index.about.agpl3',
'index.about.version',
'index.log._',
'index.log.title',
- 'install.title',
'install.this_is_the_end',
+ 'install.title',
'sub.bookmarklet.title',
'sub.feed.description',
'sub.feed.number_entries',
diff --git a/cli/i18n/ignore/kr.php b/cli/i18n/ignore/kr.php
index 2fa867cbe..9fd7a6ff0 100644
--- a/cli/i18n/ignore/kr.php
+++ b/cli/i18n/ignore/kr.php
@@ -19,6 +19,7 @@ return array(
'gen.date.Nov',
'gen.date.Oct',
'gen.date.Sep',
+ 'gen.freshrss._',
'gen.lang.cz',
'gen.lang.de',
'gen.lang.en',
@@ -33,13 +34,13 @@ return array(
'gen.lang.ru',
'gen.lang.tr',
'gen.lang.zh-cn',
- 'gen.freshrss._',
'gen.share.Known',
'gen.share.blogotext',
'gen.share.diaspora',
'gen.share.facebook',
'gen.share.gnusocial',
'gen.share.jdh',
+ 'gen.share.lemmy',
'gen.share.linkedin',
'gen.share.mastodon',
'gen.share.movim',
@@ -49,7 +50,6 @@ return array(
'gen.share.twitter',
'gen.share.wallabag',
'gen.share.wallabagv2',
- 'gen.share.lemmy',
'index.about.agpl3',
'sub.api.title',
);
diff --git a/cli/i18n/ignore/nl.php b/cli/i18n/ignore/nl.php
index dc4dd9356..1a3221003 100644
--- a/cli/i18n/ignore/nl.php
+++ b/cli/i18n/ignore/nl.php
@@ -11,8 +11,6 @@ return array(
'conf.sharing.shaarli',
'conf.sharing.twitter',
'conf.sharing.wallabag',
- 'install.bdd._',
- 'install.bdd.host',
'gen.date.Apr',
'gen.date.Dec',
'gen.date.Nov',
@@ -35,8 +33,10 @@ return array(
'gen.lang.zh-cn',
'gen.share.blogotext',
'gen.share.diaspora',
- 'gen.share.facebook',
'gen.share.email',
+ 'gen.share.facebook',
+ 'gen.share.gnusocial',
+ 'gen.share.jdh',
'gen.share.lemmy',
'gen.share.linkedin',
'gen.share.mastodon',
@@ -48,12 +48,12 @@ return array(
'gen.share.twitter',
'gen.share.wallabag',
'gen.share.wallabagv2',
- 'gen.share.jdh',
- 'gen.share.gnusocial',
'gen.short.ok',
'index.about.agpl3',
- 'index.about.website',
'index.about.version',
+ 'index.about.website',
+ 'install.bdd._',
+ 'install.bdd.host',
'sub.api.title',
'sub.bookmarklet.title',
);
diff --git a/cli/i18n/ignore/oc.php b/cli/i18n/ignore/oc.php
index b67b277fe..fed73078e 100644
--- a/cli/i18n/ignore/oc.php
+++ b/cli/i18n/ignore/oc.php
@@ -35,20 +35,20 @@ return array(
'gen.share.blogotext',
'gen.share.diaspora',
'gen.share.facebook',
+ 'gen.share.gnusocial',
+ 'gen.share.jdh',
+ 'gen.share.lemmy',
'gen.share.movim',
'gen.share.shaarli',
'gen.share.twitter',
'gen.share.wallabag',
'gen.share.wallabagv2',
- 'gen.share.jdh',
- 'gen.share.gnusocial',
- 'gen.share.lemmy',
'index.about.agpl3',
'index.about.version',
'index.log._',
'index.log.title',
- 'install.title',
'install.this_is_the_end',
+ 'install.title',
'sub.bookmarklet.title',
'sub.feed.description',
'sub.feed.number_entries',
diff --git a/cli/i18n/ignore/sk.php b/cli/i18n/ignore/sk.php
index 47d20f81f..244c22dbe 100644
--- a/cli/i18n/ignore/sk.php
+++ b/cli/i18n/ignore/sk.php
@@ -9,12 +9,13 @@ return array(
'conf.sharing.shaarli',
'conf.sharing.twitter',
'conf.sharing.wallabag',
- 'gen.freshrss._',
- 'gen.date.apr',
'gen.date.Aug',
+ 'gen.date.Dec',
+ 'gen.date.Nov',
+ 'gen.date.Sep',
+ 'gen.date.apr',
'gen.date.aug',
'gen.date.august',
- 'gen.date.Dec',
'gen.date.dec',
'gen.date.december',
'gen.date.feb',
@@ -22,12 +23,11 @@ return array(
'gen.date.format_date_hour',
'gen.date.jan',
'gen.date.mar',
- 'gen.date.Nov',
'gen.date.nov',
'gen.date.november',
- 'gen.date.Sep',
'gen.date.sep',
'gen.date.september',
+ 'gen.freshrss._',
'gen.lang.cz',
'gen.lang.de',
'gen.lang.en',
@@ -40,13 +40,15 @@ return array(
'gen.lang.oc',
'gen.lang.pt-br',
'gen.lang.ru',
- 'gen.lang.tr',
'gen.lang.sk',
+ 'gen.lang.tr',
'gen.lang.zh-cn',
'gen.share.blogotext',
'gen.share.diaspora',
- 'gen.share.facebook',
'gen.share.email',
+ 'gen.share.facebook',
+ 'gen.share.gnusocial',
+ 'gen.share.jdh',
'gen.share.linkedin',
'gen.share.mastodon',
'gen.share.movim',
@@ -57,8 +59,6 @@ return array(
'gen.share.twitter',
'gen.share.wallabag',
'gen.share.wallabagv2',
- 'gen.share.jdh',
- 'gen.share.gnusocial',
'index.about.agpl3',
'sub.api.title',
'sub.import_export.title',
diff --git a/cli/i18n/ignore/zh-cn.php b/cli/i18n/ignore/zh-cn.php
index e0209d475..382bb7303 100644
--- a/cli/i18n/ignore/zh-cn.php
+++ b/cli/i18n/ignore/zh-cn.php
@@ -8,6 +8,7 @@ return array(
'conf.sharing.shaarli',
'conf.sharing.twitter',
'conf.sharing.wallabag',
+ 'gen.freshrss._',
'gen.lang.cz',
'gen.lang.de',
'gen.lang.en',
@@ -28,6 +29,7 @@ return array(
'gen.share.facebook',
'gen.share.gnusocial',
'gen.share.jdh',
+ 'gen.share.lemmy',
'gen.share.linkedin',
'gen.share.mastodon',
'gen.share.movim',
@@ -37,8 +39,6 @@ return array(
'gen.share.twitter',
'gen.share.wallabag',
'gen.share.wallabagv2',
- 'gen.share.lemmy',
'index.about.agpl3',
'sub.api.title',
- 'gen.freshrss._',
);
diff --git a/cli/manipulate.translation.php b/cli/manipulate.translation.php
index 35405bb89..c6aa328d9 100644
--- a/cli/manipulate.translation.php
+++ b/cli/manipulate.translation.php
@@ -1,5 +1,9 @@
<?php
+require_once __DIR__ . '/i18n/I18nData.php';
+require_once __DIR__ . '/i18n/I18nFile.php';
+require_once __DIR__ . '/i18n/I18nIgnoreFile.php';
+
$options = getopt("a:hk:l:rv:");
if (array_key_exists('h', $options)) {
@@ -10,14 +14,9 @@ if (!array_key_exists('a', $options)) {
error('You need to specify the action to perform.');
}
-if ('ignore' === $options['a']) {
- require_once __DIR__ . '/i18n/I18nIgnoreFile.php';
- $i18nFile = new I18nIgnoreFile();
-} else {
- require_once __DIR__ . '/i18n/I18nFile.php';
- $i18nFile = new I18nFile();
-}
-$i18nData = $i18nFile->load();
+$data = new I18nFile();
+$ignore = new I18nIgnoreFile();
+$i18nData = new I18nData($data->load(), $ignore->load());
switch ($options['a']) {
case 'add' :
@@ -29,6 +28,7 @@ switch ($options['a']) {
$i18nData->addLanguage($options['l']);
} else {
error('You need to specify a valid set of options.');
+ exit;
}
break;
case 'delete' :
@@ -36,32 +36,26 @@ switch ($options['a']) {
$i18nData->removeKey($options['k']);
} else {
error('You need to specify the key to delete.');
- }
- break;
- case 'duplicate' :
- if (array_key_exists('k', $options)) {
- $i18nData->duplicateKey($options['k']);
- } else {
- error('You need to specify the key to duplicate');
+ exit;
}
break;
case 'format' :
- $i18nFile->dump($i18nData);
break;
case 'ignore' :
if (array_key_exists('l', $options) && array_key_exists('k', $options)) {
$i18nData->ignore($options['k'], $options['l'], array_key_exists('r', $options));
} else {
error('You need to specify a valid set of options.');
+ exit;
}
break;
default :
help();
+ exit;
}
-if ($i18nData->hasChanged()) {
- $i18nFile->dump($i18nData);
-}
+$data->dump($i18nData->getData());
+$ignore->dump($i18nData->getIgnore());
/**
* Output error message.
@@ -91,7 +85,7 @@ DESCRIPTION
-a=ACTION
select the action to perform. Available actions are add, delete,
- duplicate, format, and ignore. This option is mandatory.
+ format, and ignore. This option is mandatory.
-k=KEY select the key to work on.
-v=VAL select the value to set.
-l=LANG select the language to work on.
@@ -101,25 +95,22 @@ EXEMPLE
Exemple 1: add a language. It adds a new language by duplicating the referential.
php %1\$s -a add -l my_lang
-Exemple 2: add a new key. It adds the key in the referential.
+Exemple 2: add a new key. It adds the key for all supported languages.
php %1\$s -a add -k my_key -v my_value
Exemple 3: add a new value. It adds a new value for the selected key in the selected language.
php %1\$s -a add -k my_key -v my_value -l my_lang
-Exemple 4: delete a key. It deletes the selected key in every languages.
+Exemple 4: delete a key. It deletes the selected key from all supported languages.
php %1\$s -a delete -k my_key
-Exemple 5: duplicate a key. It duplicates the key from the referential in every languages.
- php %1\$s -a duplicate -k my_key
-
-Exemple 6: format i18n files.
+Exemple 5: format i18n files.
php %1\$s -a format
-Exemple 7: ignore a key. It adds the key in the ignore file to mark it as translated.
+Exemple 6: ignore a key. It adds the key in the ignore file to mark it as translated.
php %1\$s -a ignore -k my_key -l my_lang
-Exemple 8: revert ignore a key. It removes the key from the ignore file.
+Exemple 7: revert ignore a key. It removes the key from the ignore file.
php %1\$s -a ignore -r -k my_key -l my_lang\n\n
HELP;
$file = str_replace(__DIR__ . '/', '', __FILE__);
diff --git a/cli/translation-update.sh b/cli/translation-update.sh
new file mode 100755
index 000000000..9847dc4e0
--- /dev/null
+++ b/cli/translation-update.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+# This script performs the following:
+# - Generate configuration file for po4a (can be configured in CONFIGFILE)
+# - Generate POT file from pages/<DIRECTORY>/*.md
+# - Update PO files in i18n directory with POT file
+# - Generate localized pages.XX/<DIRECTORY>/*.md (where XX is the language code)
+# - Remove unneeded new lines from generated pages
+
+# Name of the po4a configuration file
+CONFIGFILE='po4a.conf'
+
+# List of supported languages
+LANGS=(fr)
+
+# Check if po4a is installed
+if [ -z "$(command -v po4a)" ]; then
+ echo 'It seems that po4a is not installed on your system.'
+ echo 'Please install po4a to use this script.'
+ exit 1
+fi
+
+# Generate po4a.conf file with list of TLDR pages
+echo 'Generating configuration file for po4a...'
+{
+ echo '# WARNING: this file is generated with translation-update.sh'
+ echo '# DO NOT modify this file manually!'
+ echo "[po4a_langs] ${LANGS[*]}"
+ # shellcheck disable=SC2016
+ echo '[po4a_paths] i18n/templates/freshrss.pot $lang:i18n/freshrss.$lang.po'
+} >$CONFIGFILE
+
+for FILE in $(cd en && tree -f -i | grep ".md" | grep -v "admins"); do
+ echo "[type: text] en/$FILE \$lang:\$lang/$FILE opt:\"-o markdown\" opt:\"-M utf-8\"" >>$CONFIGFILE
+done
+
+# Generate POT file, PO files, and pages.XX pages
+echo 'Generating POT file and translated pages...'
+po4a -k 0 --msgid-bugs-address 'https://github.com/FreshRSS/FreshRSS/issues' $CONFIGFILE
diff --git a/cli/update-user.php b/cli/update-user.php
index 8067dadd3..02da16d5a 100755
--- a/cli/update-user.php
+++ b/cli/update-user.php
@@ -11,7 +11,6 @@ $ok = FreshRSS_user_Controller::updateUser(
$username,
empty($options['mail_login']) ? null : $options['mail_login'],
empty($options['password']) ? '' : $options['password'],
- empty($options['api_password']) ? '' : $options['api_password'],
$values);
if (!$ok) {
diff --git a/constants.php b/constants.php
index d4e9d1fa3..b6500f078 100644
--- a/constants.php
+++ b/constants.php
@@ -2,7 +2,7 @@
//NB: Do not edit; use ./constants.local.php instead.
//<Not customisable>
-define('FRESHRSS_VERSION', '1.15.3');
+define('FRESHRSS_VERSION', '1.15.4-dev');
define('FRESHRSS_WEBSITE', 'https://freshrss.org');
define('FRESHRSS_WIKI', 'https://freshrss.github.io/FreshRSS/');
diff --git a/docs/en/admins/02_Prerequisites.md b/docs/en/admins/02_Prerequisites.md
index 0fc0c9a11..196edad63 100644
--- a/docs/en/admins/02_Prerequisites.md
+++ b/docs/en/admins/02_Prerequisites.md
@@ -15,11 +15,11 @@ You need to verify that your server can run FreshRSS before installing it. If yo
# Getting the appropriate version of FreshRSS
-FreshRSS has three different releases or branches. Each branch has its own release frequency. So it is better if you spend some time to understand the purpose of each release.
+FreshRSS has two different releases. It is better if you spend some time to understand the purpose of each release.
## Stable release
-[Download](https://github.com/FreshRSS/FreshRSS/archive/master.zip)
+[Download](https://github.com/FreshRSS/FreshRSS/releases/latest)
This version is really stable, tested thoroughly, and you should not face any major bugs.
@@ -29,11 +29,11 @@ It could happen that we make two releases in a short span of time if we have a r
## Development version
-[Download](https://github.com/FreshRSS/FreshRSS/archive/dev.zip)
+[Download](https://github.com/FreshRSS/FreshRSS/archive/master.zip)
As its name suggests, the development version is the working codebase, intended for developers. **This release may be unstable!**
-If you want to keep track of the most recent enhancements or help the developers with bug reports, this is the branch for you. If you use this version, please keep in mind that you need to follow the branch activity on Github (via [the branch RSS feed](https://github.com/FreshRSS/FreshRSS/commits/dev.atom), for instance), and manually pull new commits.
+If you want to keep track of the most recent enhancements or help the developers with bug reports, this is the branch for you. If you use this version, please keep in mind that you need to follow the branch activity on Github (via [the branch RSS feed](https://github.com/FreshRSS/FreshRSS/commits/master.atom), for instance), and manually pull new commits.
Some say that the main developers use this branch on a daily basis without problem. They may know what they are doing…
diff --git a/docs/en/admins/07_LinuxUpdate.md b/docs/en/admins/07_LinuxUpdate.md
index 7bd867639..c14e07517 100644
--- a/docs/en/admins/07_LinuxUpdate.md
+++ b/docs/en/admins/07_LinuxUpdate.md
@@ -1,7 +1,9 @@
-# Updating on Debian 9/Ubuntu 16.04
+# Updating on Linux
This tutorial demonstrates commands for updating FreshRSS. It assumes that your main FreshRSS directory is `/usr/share/FreshRSS`; If you've installed it somewhere else, substitute your path as necessary.
+**Note that FreshRSS contains a built-in update system.** It's easier to use if you don't understand the commands that follow. It's available through the web interface of your FreshRSS installation, Administration → Update.
+
## Using git
**You must have used git to install FreshRSS to use this update method.**
@@ -13,58 +15,46 @@ If your local user doesn't have write access to the FreshRSS folder, use a sudo
cd /usr/share/FreshRSS/
```
-2. Verify the branch you're currently on. For stable releases, this should be `master`.
+2. Fetch the most recent code from GitHub
```
-git branch
+git fetch --all
```
-
-3. Fetch the most recent code from the FreshRSS github Page
+3. Discard manual changes and delete manual additions
```
-git fetch --all
+git reset --hard
+git clean -f -d
```
-Note: If you wish to switch to a specific version of FreshRSS, or switch to/from the dev branch, this is the time to do that. Example commands for switching branches are found below, in "Switching Branches"
+Note: If you wish to keep your changes, it's better to [create a pull request](https://github.com/FreshRSS/FreshRSS/compare) or [an extension](../developers/03_Backend/05_Extensions.md).
-4. Check for an update
+4. Update FreshRSS
```
-git status
+git checkout master
+git pull
+git checkout $(git describe --tags --abbrev=0)
```
-If there's not an update, you're done! If there is, continue the following steps:
+Note: If you want to use the rolling release, the last command is optional.
-5. Discard manual changes and delete manual additions
+5. (optional) Make sure you use the correct version
```
-git reset --hard
-git clean -f -d
+git status
```
+The command should tell you the tag that you're using. It must be the same as the one associated with [the latest release on GitHub](https://github.com/FreshRSS/FreshRSS/releases/latest). If you use the rolling release, it should tell you that your `master` branch is up to date with `origin`.
+
6. Delete the file that triggers the install wizard
```
rm data/do-install.txt
```
-7. Update to the new version of FreshRSS
-```
-git pull
-```
-
-8. Re-set correct permissions so that your web server can access the files
+7. Re-set correct permissions so that your web server can access the files
```
chown -R :www-data . && chmod -R g+r . && chmod -R g+w ./data/
```
-### Switching Branches
-
-Any command listed here should be run between steps 3 and 4 in the previous section.
-
-To switch from stable to dev (if you haven't before) use the following command: `git checkout -b dev origin/dev`
-
-If you've checked out dev and want to go back to master, the command would be `git checkout master`. After the first time you check out the dev branch, you can use this syntax to switch between the two main branches at will.
-
-If you wish to switch to [a specific release of FreshRSS](https://github.com/FreshRSS/FreshRSS/releases), you would use the command `git checkout <release_name>`, where <release_name> is the specific release number you wish to check out (for example, `git checkout 1.12.0`). Be aware that checking out a specific release will leave you in a state where you can't automatically update; you'll need to run `git checkout master` or `git checkout dev` before you'll be able to pull updates from git automatically.
-
-## Using the zip Archive
+## Using the Zip archive
If your local user doesn't have write access to the FreshRSS folder, use a sudo shell (`sudo -s`), prefix the following commands with `sudo `, or switch to an account that does have write access to the folder.
@@ -73,15 +63,17 @@ If your local user doesn't have write access to the FreshRSS folder, use a sudo
cd /usr/share/FreshRSS/
```
-2. Download and unzip the update file
+2. Get the link to the Zip archive for [the latest release](https://github.com/FreshRSS/FreshRSS/releases/latest). It should be something like `https://github.com/FreshRSS/FreshRSS/archive/1.15.3.zip` (the numbers can change). If you want to use the rolling release, the link is `https://github.com/FreshRSS/FreshRSS/archive/master.zip`
+
+3. Download and unzip the update file
```
-wget https://github.com/FreshRSS/FreshRSS/archive/master.zip
-unzip master.zip
+wget -o freshrss.zip https://github.com/FreshRSS/FreshRSS/archive/1.15.3.zip
+unzip freshrss.zip
```
3. Overwrite all your existing files with the new ones
```
-cp -R FreshRSS-master/* .
+cp -R FreshRSS-*/* .
```
4. Re-set permissions
@@ -91,7 +83,7 @@ chown -R :www-data . && chmod -R g+r . && chmod -R g+w ./data/
5. Clean up the FreshRSS directory by deleting the downloaded zip, the file forcing the setup wizard and the temporary directory
```
-rm -f master.zip
+rm -f freshrss.zip
rm -f data/do-install.txt
-rm -rf FreshRSS-master/
+rm -rf FreshRSS-*/
```
diff --git a/docs/en/contributing.md b/docs/en/contributing.md
index 870e0c14f..11c0dae40 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).
-4. Make your changes to your fork and [send a pull request](https://help.github.com/articles/using-pull-requests/) on the **dev branch**.
+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/).
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..dd56a6af6 100644
--- a/docs/en/developers/01_First_steps.md
+++ b/docs/en/developers/01_First_steps.md
@@ -37,23 +37,23 @@ $ make stop
If you're interested in the configuration, the `make` commands are defined in the [`Makefile`](/Makefile).
-If you need to use a different tag image (default is `dev-alpine`), you can set the `TAG` environment variable:
+If you need to use a different tag image (default is `alpine`), you can set the `TAG` environment variable:
```console
-$ TAG=dev-arm make start
+$ TAG=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
$ # or
-$ TAG=dev-arm make build
+$ TAG=arm make build
```
-The `TAG` variable can be anything (e.g. `dev-local`). You can target a specific architecture by adding `-alpine` or `-arm` at the end of the tag (e.g. `dev-local-arm`).
+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`).
# Project architecture
@@ -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..a898dc23e 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 master
+git pull upstream master
+```
+
+## 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.
+
+## 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..0cb296d0c 100644
--- a/docs/en/developers/05_Release_new_version.md
+++ b/docs/en/developers/05_Release_new_version.md
@@ -1 +1,110 @@
-**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** with the updates of the version to be released.
+
+# Git process
+
+```bash
+$ git checkout master
+$ git pull
+$ 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 `master` 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 `master`;
+* 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 master
+$ 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
![Anonymous access configuration](../img/users/anonymous_access.1.png)
-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.
![Token configuration](../img/users/token.1.png)
-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.
![Navigation menu](../img/users/refresh.1.png)
@@ -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.
![Feed menu](../img/users/refresh.2.png)
# 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.
![Attribute filters in 0.7](../img/users/status.filter.0.7.png)
@@ -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.
![Article icons configuration](../img/users/configuration.article.icons.png)
@@ -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.
![Sharing configuration](../img/users/configuration.sharing.png)
-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.
diff --git a/docs/fr/contributing.md b/docs/fr/contributing.md
index b74f2e673..a58f4fac4 100644
--- a/docs/fr/contributing.md
+++ b/docs/fr/contributing.md
@@ -1,20 +1,90 @@
-## Contribuer au code
+## Rejoignez-nous sur les listes de mailing
-Pour cela, vous vous trouvez au bon endroit pour commencer : la documentation est là pour vous mettre le pied à l'étrier afin de découvrir le code. Voici une sélection de pages qui vous aideront à démarrer :
+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).
-- [Les premiers pas](developers/01_First_steps.md)
-- [Comment l'on fonctionne sur GitHub](developers/02_Github.md)
+* 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).
+* Le deuxième mailing s'adresse principalement aux développeurs. [Rejoignez
+ dev@freshrss.org](https://freshrss.org/mailman/listinfo/dev)
-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).
+## Signaler un bug
-## Contribuer à la documentation
+Avez-vous trouvé un bogue ? Ne paniquez pas, voici quelques étapes pour le
+signaler facilement :
+
+1. Cherche sur [le bug tracker](https://github.com/FreshRSS/FreshRSS/issues)
+ (n'oubliez pas d'utiliser la barre de recherche).
+2. Si vous constatez un bogue similaire, n'hésitez pas à poster un
+ commentaire pour ajouter de l'importance au ticket correspondant.
+3. Si vous ne l'avez pas trouvé, [ouvrez un nouveau
+ ticket](https://github.com/FreshRSS/FreshRSS/issues/new).
+
+Si vous devez créer un nouveau ticket, essayez de garder les conseils
+suivants :
+
+* Donnez un titre explicite au ticket pour le retrouver plus facilement plus
+ tard.
+* Soyez aussi exhaustif que possible dans la description : qu'avez-vous fait
+ ? Quel est le bogue ? Quelles sont les étapes pour reproduire le bogue ?
+
+Nous avons aussi besoin de quelques informations :
+
+* Votre version de FreshRSS (sur la page A propos) ou le fichier
+ `constants.php`)
+* Votre configuration de serveur : type d'hébergement, version PHP
+* Quelle base de données : SQLite, MySQL, MariaDB, PostgreSQL ? Quelle
+ version ?
+* Si possible, les logs associés (logs PHP et logs FreshRSS sous
+ `data/users/your_user/log.txt`)
+
+## Corriger un bogue
+
+Voulez-vous corriger un bogue ? Pour maintenir une grande coordination entre
+les collaborateurs, vous devrez suivre ces indications :
-Il ne vous aura pas échappé que la documentation est encore un peu vide… il y a énormément de choses à faire ! Si vous souhaitez aider à écrire quelques pages, prenez le temps de lire [les informations données sur Github](https://github.com/FreshRSS/documentation/blob/master/README.fr.md).
+1. Assurez-vous que le bogue est associé à un ticket et indiquez que vous
+ allez travailler sur le bogue.
+2. [Fork du répertoire de
+ projet](https://help.github.com/articles/fork-a-repo/).
+3. [Créez une nouvelle
+ branche](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/).
+ Le nom de la branche doit être clair, et idéalement préfixé par
+ l'identifiant du ticket correspondant. Par exemple,
+ `783-contributing-file` pour réparer [ticket
+ #783](https://github.com/FreshRSS/FreshRSS/issues/783).
+4. Ajoutez vos modifications à votre fork et [ouvrez une demande de pull
+ request](https://help.github.com/articles/using-pull-requests/).
-Vous pouvez notamment regarder [les tickets ouverts avec le tag "Documentation"](https://github.com/FreshRSS/FreshRSS/issues?labels=Documentation&state=open). Il s'agit de la liste des choses assez spécifiques à ajouter à la documentation.
+Si vous devez écrire du code, veuillez suivre [nos recommandations de style
+de codage](developers/01_First_steps.md).
-## Contribuer au blog
+**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)".
-Vous souhaitez écrire un article à propos des technologies RSS/Atom/WebSub ou tout simplement nous donner un coup de main à la rédaction d'un billet ? Vous pouvez nous aider !
+## Soumettre une idée
+
+Vous avez de bonnes idées, oui ! Ne soyez pas timide et ouvrez [un nouveau
+ticket](https://github.com/FreshRSS/FreshRSS/issues/new) sur notre tracker
+bogue pour nous demander si nous pouvons le mettre en œuvre. Les plus
+grandes idées viennent souvent des suggestions les plus timides !
+
+Si votre idée est bonne, nous y jetterons un coup d'oeil.
+
+## Contribuer à l'internationalisation (i18n)
+
+Si vous voulez améliorer l'internationalisation, ouvrez d'abord un nouveau
+ticket et suivez les conseils de la section *Fixer un bogue*.
+
+Les traductions sont disponibles dans les sous-répertoires de `./app/i18n/`.
+
+Nous travaillons sur une meilleure façon de gérer l'internationalisation
+mais n'hésitez pas à nous suggérer des idées !
+
+## Contribuer à la documentation
-Pour cela, il suffit de vous rendre sur le dépôt GitHub [FreshRSS/freshrss.org](https://github.com/FreshRSS/freshrss.org) et de nous proposer une « Pull Request ». Les articles de blog doivent se trouver dans le répertoire `./blog` et être écrits en Markdown.
+Il ne vous aura pas échappé que la documentation est encore un peu vide… il
+y a énormément de choses à faire ! Si vous souhaitez aider à écrire quelques
+pages, rendez-vous dans les principaux dépôts[fichier
+docs](https://github.com/FreshRSS/FreshRSS/tree/master/docs) !
diff --git a/docs/fr/developers/01_First_steps.md b/docs/fr/developers/01_First_steps.md
index df3fa65f2..e7c862ae5 100644
--- a/docs/fr/developers/01_First_steps.md
+++ b/docs/fr/developers/01_First_steps.md
@@ -1,20 +1,105 @@
-# Configurer son environnement
+# Configurer son environnement (Docker)
+
+FreshRSS est construit en PHP et utilise le framework Minz. Les
+dépendancessont directement incluses dans le code source, donc vous n'avez
+pas besoin d'utiliser Composer.
+
+Il existe plusieurs façons de configurer votre environnement
+dedéveloppement. La méthode la plus simple et la plus supportée est basée
+surDocker. C'est la solution qui est documentée ci-dessous. Si vous avez
+déjà unenvironnement PHP fonctionnel, vous n'en avez probablement pas
+besoin.
+
+Nous supposons ici que vous utilisez une distribution GNU/Linux, capable
+d'exécuter Docker. Sinon, vous devrez adapter les commandes en conséquence.
+
+Les commandes qui suivent doivent être exécutées dans une console. Ils
+commencent par `$` quand les commandes doivent être exécutées en tant
+qu'utilisateur normal, et par `#` quand elles doivent être exécutées en tant
+qu'utilisateur root. Vous n'avez pas besoin de taper ces caractères. Un
+chemin d'accès peut être indiqué devant ces caractères pour vous aider à
+identifier où ils doivent être exécutés. Par exemple, `app$ echo 'Hello
+World'` indique que vous devez exécuter la commande `echo` dans le
+répertoire `app/`.
+
+Tout d'abord, vous devez installer
+[Docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/).
+
+Une fois que c'est fait, clonez le dépôt de code de la manière suivante :
+
+```console
+$ git clone https://github.com/FreshRSS/FreshRSS.git
+$ cd FreshRSS
+```
+
+Notez que, pour contribuer, vous devrez d'abord « forker » ce dépôt de code
+(ou dépôt de code référent) et cloner votre « fork » à la place de ce
+dépôt. Adaptez les commandes en conséquence.
+
+Ensuite, la seule commande que vous devez connaître est la suivante :
+
+```console
+$ make start
+```
+
+Cela peut prendre un certain temps pour que Docker télécharge l'image
+utilisée. Dans le cas où la commande échoue pour un problème de droit, il
+faudra soit ajouter votre utilisateur au groupe `docker`, soit relancer la
+commande en la préfixant par `sudo`.
+
+**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.
+
+Vous pouvez arrêter les conteneurs en tapant <kbd>Control</kbd> + <kbd>c</kbd> ou avec la commande suivante, dans un autre terminal:
+
+```console
+$ make stop
+```
-**TODO**
+Si la configuration vous intéresse, les commandes `make' sont définies dans
+le fichier [`Makefile`](/Makefile).
-## Docker
+Si vous avez besoin d'utiliser une image Docker identifiée par un tag
+différent (par défaut `alpine`), vous pouvez surcharger de la manière
+suivante la variable d'environnement `TAG` au moment de l'exécution de la
+commande :
-Le développement et le deploiement de FreshRSS peuvent se faire [via Docker](https://github.com/FreshRSS/FreshRSS/tree/dev/Docker).
+```console
+$ TAG=arm make start
+```
+
+Vous pouvez trouver la liste complète des tags disponibles [sur le hub
+Docker](https://hub.docker.com/r/freshrss/freshrss/tags).
+
+Si vous voulez construire l'image Docker, vous pouvez lancer la commande
+suivante :
+
+```console
+$ make build
+$ # ou
+$ TAG=arm make build
+```
+
+La valeur de la variable `TAG` peut contenir n'importe quelle valeur (par
+exemple `local`). Vous pouvez cibler une architecture spécifique en ajoutant
+`-alpine` ou `-arm` à la fin du tag (par exemple `local-arm`).
# Architecture du projet
-**TODO**
+**À FAIRE**
+
+# Extensions
+
+Si vous souhaitez créer votre propre extension FreshRSS, consultez la
+[documentation de l'extension](03_Backend/05_Extensions.md).
# Style de codage
-Si vous désirez contribuer au code, il est important de respecter le style de codage suivant. Le code actuel ne le respecte pas entièrement mais il est de notre devoir à tous de le changer dès que l'occasion se présente.
+Si vous désirez contribuer au code, il est important de respecter le style
+de codage suivant. Le code actuel ne le respecte pas entièrement mais il est
+de notre devoir à tous de le changer dès que l'occasion se présente.
-Aucune nouvelle contribution ne respectant pas ces règles ne sera acceptée tant que les corrections nécessaires ne sont pas appliquées.
+Aucune nouvelle contribution ne respectant pas ces règles ne sera acceptée
+tant que les corrections nécessaires ne sont pas appliquées.
## Espaces, tabulations et autres caractères blancs
@@ -23,7 +108,8 @@ L'indentation du code doit être faite impérativement avec des tabulations.
### Alignement
-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.
+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.
```php
$resultat = une_fonction_avec_un_nom_long($param1, $param2,
@@ -32,9 +118,12 @@ $resultat = une_fonction_avec_un_nom_long($param1, $param2,
### Fin de ligne
-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.
+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.
-Il est possible de vérifier la présence de caractères blancs en fin de ligne grâce à Git avec la commande suivante :
+Il est possible de vérifier la présence de caractères blancs en fin de ligne
+grâce à Git avec la commande suivante :
```bash
# commande à lancer avant l'ajout des fichiers dans l'index
@@ -65,7 +154,10 @@ echo $a ? 1 : 0;
### Le cas des parenthèses
-Il n'y a pas d'espaces entre des parenthèses. Il n'y a pas d'espaces avant une parenthèse ouvrante sauf si elle est précédée d'un mot-clé. Il n'y a pas d'espaces après une parenthèse fermante sauf si elle est suivie d'une accolade ouvrante.
+Il n'y a pas d'espaces entre des parenthèses. Il n'y a pas d'espaces avant
+une parenthèse ouvrante sauf si elle est précédée d'un mot-clé. Il n'y a pas
+d'espaces après une parenthèse fermante sauf si elle est suivie d'une
+accolade ouvrante.
```php
if ($a == 10) {
@@ -79,7 +171,11 @@ if ((int)$a == 10) {
### Le cas des fonctions chainées
-Ce cas se présente le plus souvent en Javascript. Quand on a des fonctions chainées, des fonctions anonymes ainsi que des fonctions de rappels, il est très facile de se perdre. Dans ce cas là, on ajoute une indentation supplémentaire pour toute l'instruction et on revient au même niveau pour une instruction de même niveau.
+Ce cas se présente le plus souvent en Javascript. Quand on a des fonctions
+chainées, des fonctions anonymes ainsi que des fonctions de rappels, il est
+très facile de se perdre. Dans ce cas là, on ajoute une indentation
+supplémentaire pour toute l'instruction et on revient au même niveau pour
+une instruction de même niveau.
```javascript
// Première instruction
@@ -98,9 +194,13 @@ shortcut.add("shift+" + shortcuts.mark_read, function () {
## Longueur des lignes
-Les lignes ne doivent pas dépasser 80 caractères. Il est cependant autorisé exceptionnellement de dépasser cette limite s'il n'est pas possible de la respecter mais en aucun cas, les lignes ne doivent dépasser les 100 caractères.
+Les lignes ne doivent pas dépasser 80 caractères. Il est cependant autorisé
+exceptionnellement de dépasser cette limite s'il n'est pas possible de la
+respecter mais en aucun cas, les lignes ne doivent dépasser les 100
+caractères.
-Dans le cas des fonctions, les paramètres peuvent être déclarés sur plusieurs lignes.
+Dans le cas des fonctions, les paramètres peuvent être déclarés sur
+plusieurs lignes.
```php
function ma_fonction($param_1, $param_2,
@@ -111,7 +211,8 @@ function ma_fonction($param_1, $param_2,
## Nommage
-L'ensemble des éléments du code (fonctions, classes, méthodes et variables) doivent être nommés de manière à décrire leur usage de façon concise.
+L'ensemble des éléments du code (fonctions, classes, méthodes et variables)
+doivent être nommés de manière à décrire leur usage de façon concise.
### Fonctions et variables
@@ -150,12 +251,14 @@ Les fichiers doivent être encodés en UTF-8.
## Compatibilité PHP
-Assurez-vous que votre code fonctionne avec une version de PHP aussi ancienne que celle que FreshRSS supporte officiellement.
+Assurez-vous que votre code fonctionne avec une version de PHP aussi
+ancienne que celle que FreshRSS supporte officiellement.
## Divers
-### Opérateurs
-Les opérateurs doivent être en fin de ligne dans le cas de conditions sur plusieurs lignes.
+### Le cas des opérateurs
+Les opérateurs doivent être en fin de ligne dans le cas de conditions sur
+plusieurs lignes.
```php
if ($a == 10 ||
@@ -164,13 +267,15 @@ if ($a == 10 ||
}
```
-### Fin des fichiers
+### Fin de fichier
-Si le fichier ne contient que du PHP, il ne doit pas comporter de balise fermante
+Si le fichier ne contient que du PHP, il ne doit pas comporter de balise
+fermante.
### Tableaux
-Lors de l'écriture de tableaux sur plusieurs lignes, tous les éléments doivent être suivis d'une virgule (même le dernier).
+Lors de l'écriture de tableaux sur plusieurs lignes, tous les éléments
+doivent être suivis d'une virgule (même le dernier).
```php
$variable = [
diff --git a/docs/fr/developers/02_Github.md b/docs/fr/developers/02_Github.md
index 686b69ec4..724e56e8a 100644
--- a/docs/fr/developers/02_Github.md
+++ b/docs/fr/developers/02_Github.md
@@ -1,77 +1,168 @@
# Remonter un problème ou une suggestion
-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.
+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.
-Si vous êtes convaincus qu'il faut vous faire entendre, voici la marche à suivre.
+Si vous êtes convaincus qu'il faut vous faire entendre, voici la marche à
+suivre.
## Sur GitHub
-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" !
-
- 1. [Rendez-vous sur le gestionnaire de tickets de bugs](https://github.com/FreshRSS/FreshRSS/issues)
- 2. 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.
- 3. Si votre demande est nouvelle, [ouvrez un nouveau ticket de bug](https://github.com/FreshRSS/FreshRSS/issues/new)
- 4. 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 :)
- 5. Merci de bien vouloir suivre les quelques conseils donnés plus bas pour faciliter la prise en compte de votre ticket.
-
+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" !
+
+ 1. [Rendez-vous sur le gestionnaire de tickets de
+ bugs](https://github.com/FreshRSS/FreshRSS/issues)
+ 2. 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.
+ 3. Si votre demande est nouvelle, [ouvrez un nouveau ticket de
+ bug](https://github.com/FreshRSS/FreshRSS/issues/new)
+ 4. 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 :)
+ 5. Merci de bien vouloir suivre les quelques conseils donnés plus bas pour
+ faciliter la prise en compte de votre ticket.
+
## De façon informelle
-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.
+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.
-* Sur [les listes de diffusion](https://freshrss.org/announce-of-the-mailing-lists.html)
+* Sur [notre chat
+ Mattermost](https://framateam.org/signup_user_complete/?id=e2680d3e3128b9fac8fdb3003b0024ee)
+* Sur [les listes de
+ diffusion](https://freshrss.org/announce-of-the-mailing-lists.html)
* À des évènements / rencontres autour du Logiciel Libre
* Autour d'une bière dans un bar
* Etc.
## Conseils
-Voici quelques conseils pour bien présenter votre remontée de bug ou votre suggestion :
-
-
-* **Faites attention à l'orthographe.** même si ce n'est pas toujours facile, faites votre maximum ;)
-* **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.
-* **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 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'').
-* 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é.
-* 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 !
-* Il se peut que les logs puissent révéler des informations plus ou moins confidentielles, **faites attention à ne rien divulguer de sensible.**
-
-De plus, face à un bug, je ne peux que vous encourager à suivre le format de message suivant (tiré du [site de Max & Sam](http://sametmax.com/template-de-demande-daide-en-informatique/)) :
-
-----
-
-**Quel est mon objectif ?**
+Voici quelques conseils pour bien présenter votre remontée de bug ou votre
+suggestion :
+
+
+* **Faites attention à l'orthographe.** même si ce n'est pas toujours
+ facile, faites votre maximum. ;)
+* **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.
+* **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 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'').
+* 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é.
+* 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 !
+* Il se peut que les logs puissent révéler des informations plus ou moins
+ confidentielles, **faites attention à ne rien divulguer de sensible.**
+
+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/)) :
+
+### Quel est mon objectif ?
Donnez le contexte général de ce que vous essayiez de faire.
-**Qu’est-ce que j’ai essayé de faire ?**
+### Qu’est-ce que j’ai essayé de faire ?
-Expliquez pas à pas ce que vous avez fait afin que nous puissions reproduire le bug.
+Expliquez pas à pas ce que vous avez fait afin que nous puissions reproduire
+le bug.
-**Quels résultats ai-je obtenus ?**
+### Quels résultats ai-je obtenus ?
-Le bug : ce que vous voyez qui n'aurez pas dû se passer. Ici vous pouvez fournir les logs.
+Le bug : ce que vous voyez qui n'aurez pas dû se passer. Ici vous pouvez
+fournir les logs.
-**Quel était le résultat attendu ?**
+### Quel était le résultat attendu ?
Afin que nous comprenions bien où est le problème... au moins selon vous :p
-**Quelle est ma situation ?**
+### Quelle est ma situation ?
Pensez à donner les informations suivantes si vous les connaissez :
1. Quel navigateur ? Quelle version ?
2. Quel serveur : Apache, Nginx ? Quelle version ?
3. Quelle version de PHP ?
- 4. Quelle base de données : SQLite, MySQL, MariaDB, PostgreSQL ? Quelle version ?
+ 4. Quelle base de données : SQLite, MySQL, MariaDB, PostgreSQL ? Quelle
+ version ?
5. Quelle distribution sur le serveur ? Et… quelle version ?
-----
-
# Système de branches
-**TODO**
+## Élémentaire
+Si vous êtes novice dans Git, voici quelques ressources qui pourraient vous
+être utiles :
+
+* [Article du blog de GitHub](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/>
+
+## Obtenir le dernier code du répertoire FreshRSS
+Vous devez avant tout ajouter le repo officiel à votre liste de repo remote
+:
+```bash
+git remote add upstream git@github.com:FreshRSS/FreshRSS.git
+```
+
+Vous pouvez vérifier que le repo remote a été ajouté avec succès en
+utilisant :
+```bash
+git remote -v show
+```
+
+Vous pouvez maintenant pull le dernier code de développement :
+```bash
+git checkout master
+git pull upstream master
+```
+
+## Lancer une nouvelle branche de développement
+```bash
+git checkout -b mon-branch-developpement
+```
# Proposer un patch
-**TODO** \ No newline at end of file
+```bash
+# Ajoutez le fichier modifié, ici actualize_script.php
+git add app/actualize_script.php
+# Commitez le changement et écrivez un message de commit approprié.
+git commit
+# Vérifiez deux fois que tout a l'air d'aller bien
+git show
+# Poussez les changements sur ton fork
+git push
+```
+
+Vous pouvez maintenant créer une PR en fonction de votre branche.
+
+## Comment écrire un message de commit
+
+Un message de commit devrait décrire succinctement les changements sur la
+première ligne. Par exemple :
+
+> Fixe une icône cassée
+
+Si nécessaire, une ligne blanche et une explication plus longue peuvent le
+suivre.
+
+Pour d'autres conseils, voir
+[ici](https://chris.beams.io/posts/git-commit/).
diff --git a/docs/fr/developers/03_Backend/02_Minz.md b/docs/fr/developers/03_Backend/02_Minz.md
index 7699f9390..754e23ea9 100644
--- a/docs/fr/developers/03_Backend/02_Minz.md
+++ b/docs/fr/developers/03_Backend/02_Minz.md
@@ -1,27 +1,27 @@
# Modèles
-**TODO**
+**À FAIRE**
# Contrôleurs et actions
-**TODO**
+**À FAIRE**
# Vues
-**TODO**
+**À FAIRE**
# Routage
-**TODO**
+**À FAIRE**
# Écriture des URL
-**TODO**
+**À FAIRE**
# Internationalisation
-**TODO**
+**À FAIRE**
# Comprendres les mécanismes internes
-**TODO**
+**À FAIRE**
diff --git a/docs/fr/developers/03_Backend/04_Changing_source_code.md b/docs/fr/developers/03_Backend/04_Changing_source_code.md
index 0282dd9d2..fd4a354d1 100644
--- a/docs/fr/developers/03_Backend/04_Changing_source_code.md
+++ b/docs/fr/developers/03_Backend/04_Changing_source_code.md
@@ -1,15 +1,15 @@
# Accès à la base de données
-**TODO**
+**À FAIRE**
# Écrire une action et sa vue associée
-**TODO**
+**À FAIRE**
# Gestion de l'authentification
-**TODO**
+**À FAIRE**
# Gestion des logs
-**TODO**
+**À FAIRE**
diff --git a/docs/fr/developers/03_Backend/05_Extensions.md b/docs/fr/developers/03_Backend/05_Extensions.md
index 37a4340af..1b340505f 100644
--- a/docs/fr/developers/03_Backend/05_Extensions.md
+++ b/docs/fr/developers/03_Backend/05_Extensions.md
@@ -1,47 +1,88 @@
-# Fiche technique 0001 — Écriture d'extensions pour FreshRSS
+# Écriture d'extensions pour FreshRSS
## Présentation de FreshRSS
-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).
+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).
## Problème à résoudre
-FreshRSS est limité dans ses possibilités techniques par différents facteurs :
+FreshRSS est limité dans ses possibilités techniques par différents facteurs
+:
-- La disponibilité des développeurs principaux ;
-- La volonté d'intégrer certains changements ;
-- Le niveau de « hack » nécessaire pour intégrer des fonctionnalités à la marge.
+* La disponibilité des développeurs principaux ;
+* La volonté d'intégrer certains changements ;
+* Le niveau de « hack » nécessaire pour intégrer des fonctionnalités à la
+ marge.
-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 ».
+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 ».
-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 :
+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 :
-1. De réduire la quantité de code source à assimiler pour un nouveau contributeur ;
-2. De permettre d'intégrer des nouveautés de façon non-officielles ;
-3. De se passer des développeurs principaux pour d'éventuelles améliorations sans passer par la case « fork ».
-
-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.
+1. De réduire la quantité de code source à assimiler pour un nouveau
+ contributeur ;
+2. De permettre d'intégrer des nouveautés de façon non-officielles ;
+3. De se passer des développeurs principaux pour d'éventuelles améliorations
+ sans passer par la case « fork ».
+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.
## Comprendre les mécaniques de base (Minz et MVC)
**TODO** : bouger dans 02_Minz.md
-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).
+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).
### Architecture MVC
-Minz repose et impose une architecture MVC pour les projets l'utilisant. On distingue dans cette architecture trois composants principaux :
-
-- 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`.
-- 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`.
-- 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`.
-
-### Le routage
-
-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`.
-
-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.
+Minz repose et impose une architecture MVC pour les projets l'utilisant. On
+distingue dans cette architecture trois composants principaux :
+
+* 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`.
+* 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`.
+* 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`.
+
+### Routage
+
+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`.
+
+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.
Exemple de code :
@@ -61,17 +102,24 @@ class FreshRSS_hello_Controller extends Minz_ActionController {
?>
```
-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`.
+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`.
-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`.
+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`.
-Plus loin, sera utilisée la convention `hello/world` pour évoquer un couple contrôleur/action.
+Plus loin, sera utilisée la convention `hello/world` pour évoquer un couple
+contrôleur/action.
-### Gestion des vues
+### Vues
-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.
+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.
-Comme expliqué plus haut, les vues sont du code HTML mixé à du PHP. Exemple de code :
+Comme expliqué plus haut, les vues sont du code HTML mixé à du PHP. Exemple
+de code :
```html
<p>
@@ -83,7 +131,9 @@ La variable `$this->a_variable` a été passée précédemment par le contrôleu
### Accéder aux paramètres GET / POST
-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 :
+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 :
```php
<?php
@@ -105,17 +155,26 @@ echo Minz_Request::param('bar');
?>
```
-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.
+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.
-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.
+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.
### Accéder aux paramètres de session
-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`.
+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`.
### Gestion des URL
-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 :
+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 :
```html
<p>
@@ -123,9 +182,13 @@ Pour profiter pleinement du système de routage de Minz, il est fortement décon
</p>
```
-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 !
+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 !
-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 :
```php
<?php
@@ -144,7 +207,8 @@ echo Minz_Url::display($url_array);
?>
```
-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()` :
+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()` :
```php
<?php
@@ -155,11 +219,16 @@ echo _url('hello', 'world', 'foo', 'bar');
?>
```
-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.
+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.
### Redirections
-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.
+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.
Exemple de code :
@@ -173,7 +242,7 @@ $url_array = [
// Indique à Minz de rediriger l'utilisateur vers la page hello/world.
// 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)
-// Le code qui suit forward() va ainsi être exécuté !
+// Le code qui suit forward() va ainsi être exécuté !
Minz_Request::forward($url_array);
// Pour effectuer une redirection type 302, ajoutez "true".
@@ -183,7 +252,14 @@ Minz_Request::forward($url_array, true);
?>
```
-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 :
+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 :
```php
<?php
@@ -206,43 +282,62 @@ Minz_Request::bad($feedback_bad, $url_array);
### Gestion de la traduction
-Il est fréquent (et c'est un euphémisme) de vouloir afficher des phrases à l'utilisateur. Dans l'exemple précédent par exemple, nous affichions un feedback à l'utilisateur en fonction du résultat d'une validation de formulaire. Le problème est que FreshRSS possède des utilisateurs de différentes nationalités. Il est donc nécessaire de pouvoir gérer différentes langues pour ne pas rester cantonné à l'Anglais ou au Français.
-
-La solution consiste à utiliser la classe `Minz_Translate` qui permet de traduire dynamiquement FreshRSS (ou toute application basée sur Minz). Avant d'utiliser ce module, il est nécessaire de savoir où trouver les chaînes de caractères à traduire. Chaque langue possède son propre sous-répertoire dans un répertoire parent nommé `i18n`. Par exemple, les fichiers de langue en Français sont situés dans `i18n/fr/`. Il existe sept fichiers différents :
-
-- `admin.php` pour tout ce qui est relatif à l'administration de FreshRSS ;
-- `conf.php` pour l'aspect configuration ;
-- `feedback.php` contient les traductions des messages de feedback ;
-- `gen.php` stocke ce qui est global à FreshRSS (gen pour « general ») ;
-- `index.php` pour la page principale qui liste les flux et la page « À propos » ;
-- `install.php` contient les phrases relatives à l'installation de FreshRSS ;
-- `sub.php` pour l'aspect gestion des abonnements (sub pour « subscription »).
-
-Cette organisation permet de ne pas avoir un unique énorme fichier de traduction.
-
-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` :
+Il est fréquent (et c'est un euphémisme) de vouloir afficher des phrases à
+l'utilisateur. Dans l'exemple précédent par exemple, nous affichions un
+feedback à l'utilisateur en fonction du résultat d'une validation de
+formulaire. Le problème est que FreshRSS possède des utilisateurs de
+différentes nationalités. Il est donc nécessaire de pouvoir gérer
+différentes langues pour ne pas rester cantonné à l'Anglais ou au Français.
+
+La solution consiste à utiliser la classe `Minz_Translate` qui permet de
+traduire dynamiquement FreshRSS (ou toute application basée sur Minz). Avant
+d'utiliser ce module, il est nécessaire de savoir où trouver les chaînes de
+caractères à traduire. Chaque langue possède son propre sous-répertoire dans
+un répertoire parent nommé `i18n`. Par exemple, les fichiers de langue en
+Français sont situés dans `i18n/fr/`. Il existe sept fichiers différents :
+
+* `admin.php` pour tout ce qui est relatif à l'administration de FreshRSS ;
+* `conf.php` pour l'aspect configuration ;
+* `feedback.php` contient les traductions des messages de feedback ;
+* `gen.php` stocke ce qui est global à FreshRSS (gen pour « general ») ;
+* `index.php` pour la page principale qui liste les flux et la page « À
+ propos » ;
+* `install.php` contient les phrases relatives à l'installation de FreshRSS
+ ;
+* `sub.php` pour l'aspect gestion des abonnements (sub pour « subscription
+ »).
+
+Cette organisation permet de ne pas avoir un unique énorme fichier de
+traduction.
+
+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` :
```php
<?php
-return [
+return array(
'action' => [
'actualize' => 'Actualiser',
'back_to_rss_feeds' => '← Retour à vos flux RSS',
'cancel' => 'Annuler',
'create' => 'Créer',
'disable' => 'Désactiver',
- ],
- 'freshrss' => [
+ ),
+ 'freshrss' => array(
'_' => 'FreshRSS',
'about' => 'À propos de FreshRSS',
- ],
+ ),
];
?>
```
-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 :
+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 :
```html
<p>
@@ -252,85 +347,212 @@ Pour accéder à ces traductions, `Minz_Translate` va nous aider à l'aide de sa
</p>
```
-La chaîne à passer à la fonction `_t()` consiste en une série d'identifiants séparés par des points. Le premier identifiant indique de quel fichier on veut extraire la traduction (dans notre cas présent, de `gen.php`), tandis que les suivantes indiquent des entrées de tableaux. Ainsi `action` est une entrée du tableau principal et `back_to_rss_feeds` est une entrée du tableau `action`. Cela permet d'organiser encore un peu plus nos fichiers de traduction.
-
-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.
+La chaîne à passer à la fonction `_t()` consiste en une série d'identifiants
+séparés par des points. Le premier identifiant indique de quel fichier on
+veut extraire la traduction (dans notre cas présent, de `gen.php`), tandis
+que les suivantes indiquent des entrées de tableaux. Ainsi `action` est une
+entrée du tableau principal et `back_to_rss_feeds` est une entrée du tableau
+`action`. Cela permet d'organiser encore un peu plus nos fichiers de
+traduction.
+
+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.
### Gestion de la configuration
## Écrire une extension pour FreshRSS
-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.
+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.
-Une extension permet donc d'ajouter des fonctionnalités facilement à FreshRSS sans avoir à toucher au cœur du projet directement.
+Une extension permet donc d'ajouter des fonctionnalités facilement à
+FreshRSS sans avoir à toucher au cœur du projet directement.
### Les fichiers et répertoires de base
-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.
-
-Le répertoire principal d'une extension doit comporter au moins deux fichiers **obligatoire** :
-
-- Un fichier `metadata.json` qui contient une description de l'extension. Ce fichier est écrit en JSON ;
-- Un fichier `extension.php` contenant le point d'entrée de l'extension.
+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.
-Il est possible aussi que vous ayez besoin de fichiers ou sous-répertoires additionnels selon vos besoins :
+Le répertoire principal d'une extension doit comporter au moins deux
+fichiers **obligatoire** :
-- `configure.phtml` est le fichier contenant le formulaire permettant de paramétrer votre extension ;
-- Un répertoire `static/` contenant fichiers CSS et JavaScript dont vous aurez besoin pour votre extension. Notez que si vous devez écrire beaucoup de CSS il est peut-être plus intéressant d'écrire un thème complet (mais ce n'est pas le sujet de cette fiche technique) ;
-- Un répertoire `Controllers` contenant des contrôleurs additionnels ;
-- Un répertoire `i18n` contenant des traductions supplémentaires ;
-- Des répertoires `layout` et `views` permettant de définir de nouvelles vues ou d'écraser les vues actuelles.
+* Un fichier `metadata.json` qui contient une description de l'extension. Ce
+ fichier est écrit en JSON ;
+* Un fichier `extension.php` contenant le point d'entrée de l'extension.
-De plus, il est de bon ton d'avoir un fichier `LICENSE` indiquant la licence sous laquelle est distribuée votre extension et un fichier `README` donnant une description détaillée de celle-ci.
+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`.
-### Écrire le fichier metadata.json
-
-Le fichier `metadata.json` définit votre extension à travers un certain nombre d'éléments importants. Il doit contenir un tableau JSON valide contenant les entrées suivantes :
-
-- `name` : le nom de votre extension ;
-- `author` : votre nom, éventuellement votre adresse mail mais il n'y a pas de format spécifique à adopter ;
-- `description` : une description de votre extension ;
-- `version` : le numéro de version actuel de l'extension ;
-- `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` : définit le type de votre extension. Il existe deux types : `system` et `user`. Nous étudierons cette différence juste après.
+In the file `freshrss/extensions/xExtension-HelloWorld/extension.php` you
+need the structure:
+```html
+class HelloWorldExtension extends Minz_Extension {
+ public function init() {
+ // your code here
+ }
+}
+```
+There is an example HelloWorld extension that you can download from [our
+GitHub repo](https://github.com/FreshRSS/xExtension-HelloWorld).
+
+You may also need additional files or subdirectories depending on your
+needs:
+
+* `configure.phtml` est le fichier contenant le formulaire pour paramétrer
+ votre 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.
+
+### The metadata.json file
+
+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` : le nom de votre extension ;
+* `author` : votre nom, éventuellement votre adresse mail mais il n'y a pas
+ de format spécifique à adopter ;
+* `description` : une description de votre extension ;
+* `version` : le numéro de version actuel de l'extension ;
+* `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` : définit le type de votre extension. Il existe deux types :
+ `system` et `user`. Nous étudierons cette différence juste après.
Seuls les champs `name` et `entrypoint` sont requis.
### Choisir entre extension « system » ou « user »
-### Écrire le fichier extension.php
-
-Ce fichier est le point d'entrée de votre extension. Il doit contenir une classe bien spécifique pour fonctionner. Comme évoqué plus haut, le nom de la classe doit être votre `entrypoint` suffixé par `Extension` (`HelloWorldExtension` par exemple). De plus, cette classe doit héritée de la classe `Minz_Extension` pour bénéficier des méthodes propres aux extensions.
-
-Votre classe va bénéficier de quatre méthodes à redéfinir :
-
-- `install()` est appelée lorsqu'un utilisateur va cliquer sur le bouton pour activer votre extension. Elle permet par exemple de mettre à jour la base de données d'un utilisateur afin de la rendre compatible avec l'extension. Elle retourne `true` si tout s'est bien passé ou, dans le cas contraire, une chaîne de caractères expliquant le problème ;
-- `uninstall()` est appelée lorsqu'un utilisateur va cliquer sur le bouton pour désactiver votre extension. Ainsi, vous pourrez annuler les changements en base de données que vous avez potentiellement faits dans `install()`. Elle retourne `true` si tout s'est bien passé ou, dans le cas contraire, une chaîne de caractères expliquant le problème ;
-- `init()` est appelée à chaque chargement de page *si l'extension est activée*. Elle va donc initialiser le comportement de l'extension. C'est la méthode la plus importante ;
-- `handleConfigureAction()` est appelée lorsqu'un utilisateur charge le panneau de gestion de l'extension. Plus précisément, elle est appelée lorsque l'URL `?c=extension&a=configure&e=le-nom-de-votre-extension` est chargée. Vous devriez aussi écrire ici le comportement voulu lors de la validation du formulaire contenu dans votre fichier `configure.phtml`.
-
-De plus, vous disposerez d'un certain nombre de méthodes directement héritées de `Minz_Extension` que vous ne devriez pas redéfinir :
-
-- Les « getters » tout d'abord. La plupart sont suffisamment explicites pour ne pas les détailler : `getName()`, `getEntrypoint()`, `getPath()` (permet de récupérer le chemin vers votre extension), `getAuthor()`, `getDescription()`, `getVersion()`, `getType()` ;
-- `getFileUrl($filename, $type)` va vous retourner l'URL vers un fichier du répertoire `static`. Le premier paramètre est le nom du fichier (sans `static/`), le deuxième est le type de fichier à servir (`css` ou `js`) ;
-- `registerController($base_name)` va indiquer à Minz de prendre en compte le contrôleur donné dans le système de routage. Le contrôleur doit se situer dans votre répertoire `Controllers`, le nom du fichier doit être `<base_name>Controller.php` et le nom de la classe `FreshExtension_<base_name>_Controller`.
-
-TODO :
-
-- `registerViews()`
-- `registerTranslates()`
-- `registerHook($hook_name, $hook_function)`
+A __user__ extension can be enabled by some users and not by others
+(typically for user preferences).
+
+A __system__ extension in comparison is enabled for every account.
+
+### Writing your own extension.php
+
+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.
+
+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.
+
+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.
+
+**À FAIRE**
+
+* `registerViews()`
+* `registerTranslates()`
+* `registerHook($hook_name, $hook_function)`
+
+### Le système « hooks »
+
+You can register at the FreshRSS event system in an extensions `init()`
+method, to manipulate data when some of the core functions are executed.
-### Système de « hooks »
-
-TODO :
-
-- `entry_before_display` (`function($entry) -> Entry | null`)
-- `entry_before_insert` (`function($entry) -> Entry | null`)
-- `feed_before_insert` (`function($feed) -> Feed | null`)
-- `post_update` (`function(none) -> none`)
-- `simplepie_before_init` (`function($simplePie, $feed) -> none`)
-
-### Écrire le fichier configure.phtml
+```html
+class HelloWorldExtension extends Minz_Extension
+{
+ public function init() {
+ $this->registerHook('entry_before_display', array($this, 'renderEntry'));
+ }
+ public function renderEntry($entry) {
+ $entry->_content('<h1>Hello World</h1>' . $entry->content());
+ return $entry;
+ }
+}
+```
-Lorsque vous voulez ajouter de la configuration à votre extension ou afficher ses informations, vous devez créer le fichier `configure.phtml`.
+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
+
+### Writing your own configure.phtml
+
+When you want to support user configurations for your extension or simply
+display some information, you have to create the `configure.phtml` file.
+
+**À FAIRE**
diff --git a/docs/fr/developers/04_Frontend/01_View_files.md b/docs/fr/developers/04_Frontend/01_View_files.md
index 45174bf58..e35b48809 100644
--- a/docs/fr/developers/04_Frontend/01_View_files.md
+++ b/docs/fr/developers/04_Frontend/01_View_files.md
@@ -1,15 +1,15 @@
# Les fichiers .phtml
-**TODO**
+**À FAIRE**
# Écrire une URL
-**TODO**
+**À FAIRE**
# Afficher une icône
-**TODO**
+**À FAIRE**
# Internationalisation
-**TODO**
+**À FAIRE**
diff --git a/docs/fr/developers/04_Frontend/02_Design.md b/docs/fr/developers/04_Frontend/02_Design.md
index d05a4c44c..03d7ea862 100644
--- a/docs/fr/developers/04_Frontend/02_Design.md
+++ b/docs/fr/developers/04_Frontend/02_Design.md
@@ -1,11 +1,11 @@
# Fichier modèle
-**TODO**
+**À FAIRE**
# Écrire un nouveau thème
-**TODO**
+**À FAIRE**
# Surcharger les icônes
-**TODO**
+**À FAIRE**
diff --git a/docs/fr/developers/05_Release_new_version.md b/docs/fr/developers/05_Release_new_version.md
index 731dc0c76..face8d5cb 100644
--- a/docs/fr/developers/05_Release_new_version.md
+++ b/docs/fr/developers/05_Release_new_version.md
@@ -1,21 +1,27 @@
# Préparer la sortie
-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**.
+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**.
Il est aussi recommandé de faire l'annonce sur mailing@freshrss.org.
# S'assurer de l'état de dev
-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.
+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.
-Il faut aussi **vous assurer que le fichier CHANGELOG est à jour** dans la branche de dev avec les mises à jour de la ou les version(s) à sortir.
+Il faut aussi **vous assurer que le fichier CHANGELOG est à jour** avec les
+mises à jour de la version à sortir.
# Processus Git
```bash
$ git checkout master
$ git pull
-$ git merge --ff dev
$ vim constants.php
# Mettre à jour le numéro de version x.y.z de FRESHRSS_VERSION
$ git commit -a
@@ -27,33 +33,56 @@ $ git push && git push --tags
# Mise à jour de update.freshrss.org
-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.
+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.
-Le dépot gérant le code se trouve sur GitHub : [FreshRSS/update.freshrss.org](https://github.com/FreshRSS/update.freshrss.org/).
+Le dépot gérant le code se trouve sur GitHub :
+[FreshRSS/update.freshrss.org](https://github.com/FreshRSS/update.freshrss.org/).
## Écriture du script de mise à jour
-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 de dev (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 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 `master` (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.
-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`.
+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`.
Il existe ensuite 5 fonctions à remplir :
-- `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 ;
-- `need_info_update()` retourne `true` si l'utilisateur doit intervenir durant la mise à jour ou `false` sinon ;
-- `ask_info_update()` affiche un formulaire à l'utilisateur si `need_info_update()` a retourné `true` ;
-- `save_info_update()` est chargée de sauvegarder les informations renseignées par l'utilisateur (issues du formulaire de `ask_info_update()`) ;
-- `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).
+* `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 ;
+* `need_info_update()` retourne `true` si l'utilisateur doit intervenir
+ durant la mise à jour ou `false` sinon ;
+* `ask_info_update()` affiche un formulaire à l'utilisateur si
+ `need_info_update()` a retourné `true` ;
+* `save_info_update()` est chargée de sauvegarder les informations
+ renseignées par l'utilisateur (issues du formulaire de
+ `ask_info_update()`) ;
+* `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).
## Mise à jour du fichier de versions
-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.
+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.
Voici un exemple de fichier `versions.php` :
```php
<?php
-
return array(
// STABLE
'0.8.0' => '1.0.0',
@@ -68,40 +97,54 @@ return array(
Et voici comment fonctionne cette table :
-- à gauche se trouve la version N, à droite la version N+1 ;
-- les versions `x.y.z-dev` sont **toutes** mises à jour vers `dev` ;
-- les versions stables sont mises à jour vers des versions stables ;
-- il est possible de sauter plusieurs versions d'un coup à condition que les scripts de mise à jour le prennent en charge ;
-- 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.
+* à gauche se trouve la version N, à droite la version N+1 ;
+* les versions `x.y.z-dev` sont **toutes** mises à jour vers `master` ;
+* les versions stables sont mises à jour vers des versions stables ;
+* il est possible de sauter plusieurs versions d'un coup à condition que les
+ scripts de mise à jour le prennent en charge ;
+* 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.
-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 **très fortement** indiqué de garder ce fichier rangé selon les
+numéros de versions en séparant les versions stables et de dev.
## Déploiement
-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.
+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.
-Lorsque vous serez satisfait, mettez à jour update.freshrss.org avec le nouveau script et en testant de nouveau puis passez à la suite.
+Lorsque vous serez satisfait, mettez à jour update.freshrss.org avec le
+nouveau script et en testant de nouveau puis passez à la suite.
# Mise à jour des services FreshRSS
-Deux services sont à mettre à jour immédiatement après la mise à jour de update.freshrss.org :
+Deux services sont à mettre à jour immédiatement après la mise à jour de
+update.freshrss.org :
-- rss.freshrss.org ;
-- demo.freshrss.org (identifiants publics : `demo` / `demodemo`).
+* rss.freshrss.org ;
+* demo.freshrss.org (identifiants publics : `demo` / `demodemo`).
# Annoncer publiquement la sortie
Lorsque tout fonctionne, il est temps d'annoncer la sortie au monde entier !
-- sur GitHub en créant [une nouvelle release](https://github.com/FreshRSS/FreshRSS/releases/new) ;
-- 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)).
-- sur Twitter (compte [@FreshRSS](https://twitter.com/FreshRSS)) ;
-- et sur mailing@freshrss.org ;
+* sur GitHub en créant [une nouvelle
+ release](https://github.com/FreshRSS/FreshRSS/releases/new) ;
+* 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)).
+* sur Twitter (compte [@FreshRSS](https://twitter.com/FreshRSS)) ;
+* et sur mailing@freshrss.org ;
# Lancer la prochaine version de développement
```bash
-$ git checkout dev
+$ git checkout master
$ vim constants.php
# Mettre à jour le numéro de version de FRESHRSS_VERSION
$ vim CHANGELOG.md
@@ -109,4 +152,5 @@ $ vim CHANGELOG.md
$ git add CHANGELOG.md && git commit && git push
```
-Pensez aussi à mettre à jour update.freshrss.org pour qu'il prenne en compte la version de développement actuelle.
+Pensez aussi à mettre à jour update.freshrss.org pour qu'il prenne en compte
+la version de développement actuelle.
diff --git a/docs/fr/index.md b/docs/fr/index.md
index 6a9b27cb2..048741ca6 100644
--- a/docs/fr/index.md
+++ b/docs/fr/index.md
@@ -1,24 +1,37 @@
![Logo de FreshRSS](img/logo_freshrss.png)
-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.
+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.
-FreshRSS a été conçu comme un agrégateur puissant et propose des tas de fonctionnalités :
+FreshRSS a été conçu comme un agrégateur puissant et propose des tas de
+fonctionnalités :
-- Agrégation des flux RSS et Atom.
-- Utilisez les favoris pour marquer les articles qui vous ont plu ou que vous souhaitez lire plus tard.
-- Le système de filtrage et de recherche permettent de cibler exactement les articles que vous souhaitez lire.
-- Les statistiques permettent de savoir en un coup d’œil quels sont les sites qui publient le plus, ou à l’inverse, le moins.
-- Importation / exportation des flux au format OPML.
-- Multi-thèmes pour changer l’habillage de FreshRSS.
-- « *Responsive design* » : l’application s’adapte aux petits écrans pour emporter FreshRSS dans votre poche.
-- Multi-utilisateurs pour héberger plusieurs personnes sur une même installation.
-- API Google Reader pour pouvoir y brancher des applications Android.
-- Auto-hébergeable : le code source est libre (AGPL3) et vous pouvez donc l’héberger sur votre propre serveur.
-- Et bien d’autres !
+* Agrégation des flux RSS et Atom.
+* Utilisez les favoris pour marquer les articles qui vous ont plu ou que
+ vous souhaitez lire plus tard.
+* Le système de filtrage et de recherche permettent de cibler exactement les
+ articles que vous souhaitez lire.
+* Les statistiques permettent de savoir en un coup d’œil quels sont les
+ sites qui publient le plus, ou à l’inverse, le moins.
+* Importation / exportation des flux au format OPML.
+* Multi-thèmes pour changer l’habillage de FreshRSS.
+* API Google Reader pour pouvoir y brancher des applications Android.
+* « *Responsive design* » : l’application s’adapte aux petits écrans pour
+ emporter FreshRSS dans votre poche.
+* Auto-hébergeable : le code source est libre (AGPL3) et vous pouvez donc
+ l’héberger sur votre propre serveur.
+* Multi-utilisateurs pour héberger plusieurs personnes sur une même
+ installation.
+* Et bien d’autres !
Cette documentation est divisée en plusieurs parties :
-* La [documentation utilisateurs](./users/02_First_steps.md) pour découvrir les fonctionnalités de FreshRSS.
-* La [documentation administrateurs](./users/01_Installation.md) pour l’installation et la maintenance de FreshRSS.
-* La [documentation développeurs](./developers/01_First_steps.md) pour savoir comment contribuer et mieux comprendre le code source de FreshRSS.
-* Le [guide de contribution](./contributing.md) pour nous aider à développer FreshRSS.
+* La [documentation utilisateurs](./users/02_First_steps.md) pour découvrir
+ les fonctionnalités de FreshRSS.
+* La [documentation administrateurs](../en/admins/01_Installation.md) (en
+ anglais) pour l’installation et la maintenance de FreshRSS.
+* La [documentation développeurs](./developers/01_First_steps.md) pour
+ savoir comment contribuer et mieux comprendre le code source de FreshRSS.
+* Le [guide de contribution](./contributing.md) pour nous aider à développer
+ FreshRSS.
diff --git a/docs/fr/users/02_First_steps.md b/docs/fr/users/02_First_steps.md
index 589453f28..d5756387b 100644
--- a/docs/fr/users/02_First_steps.md
+++ b/docs/fr/users/02_First_steps.md
@@ -1,25 +1,46 @@
-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.
+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.
-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.
+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.
-[Après l'installation](01_Installation.md), la première chose à faire est d'ajouter un ou plusieurs sites à suivre. Pour cela plusieurs choix s'offrent à vous :
+[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 :
- 1. [Ajouter un flux manuellement](04_Subscriptions.md#ajouter-un-flux)
- 2. [Importer un fichier OPML ou JSON](04_Subscriptions.md#import-et-export)
- 3. [Utiliser le bookmark dédié](04_Subscriptions.md#utiliser-le-bookmark)
+1. [Ajouter un flux manuellement](04_Subscriptions.md#ajouter-un-flux)
+2. [Importer un fichier OPML ou JSON](04_Subscriptions.md#import-et-export)
+3. [Utiliser le bookmark dédié](04_Subscriptions.md#utiliser-le-bookmark)
-Une fois que vous avez ajouté vos flux à FreshRSS, il est temps de les lire. Pour cela, trois modes de lecture s'offrent à vous :
+Une fois que vous avez ajouté vos flux à FreshRSS, il est temps de les
+lire. Pour cela, trois modes de lecture s'offrent à vous :
- 1. [La vue normale](03_Main_view.md#la-vue-normale) qui permet de voir et de lire rapidement les nouveaux articles
- 2. [La vue globale](03_Main_view.md#la-vue-globale) est destinée à vous offrir un panorama de l'état de vos flux
- 3. [La vue lecture](03_Main_view.md#la-vue-lecture) est pensée pour vous offrir un meilleur confort de lecture
+1. [La vue normale](03_Main_view.md#la-vue-normale) qui permet de voir et de
+ lire rapidement les nouveaux articles
+2. [La vue globale](03_Main_view.md#la-vue-globale) est destinée à vous
+ offrir un panorama de l'état de vos flux
+3. [La vue lecture](03_Main_view.md#la-vue-lecture) est pensée pour vous
+ offrir un meilleur confort de lecture
-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 :
+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 :
-* [Rangez vos flux dans des catégories](04_Subscriptions.md#organisation_des_flux)
-* [Configurez votre page d'accueil](05_Configuration.md#personnaliser-la-vue)
-* [Configurez vos options de lecture](05_Configuration.md#options-de-lecture)
+* [Rangez vos flux dans des
+ catégories](04_Subscriptions.md#organisation_des_flux)
+* [Configurez votre page
+ d'accueil](05_Configuration.md#personnaliser-la-vue)
+* [Configurez vos options de
+ lecture](05_Configuration.md#options-de-lecture)
* [Mettez à jour vos flux](03_Main_view.md#rafraichir-les-flux)
-* [Filtrez les articles](03_Main_view.md#filtrer-les-articles) pour accéder rapidement à ceux que vous voulez lire en priorité
-* [Retrouvez un article](03_Main_view.md#rechercher-des-articles) qui a été publié il y a quelques jours ou mois
+* [Filtrez les articles](03_Main_view.md#filtrer-les-articles) pour accéder
+ rapidement à ceux que vous voulez lire en priorité
+* [Retrouvez un article](03_Main_view.md#rechercher-des-articles) qui a été
+ publié il y a quelques jours ou mois
* [Accédez à vos flux même sur mobile](06_Mobile_access.md)
+* [Ajoutez quelques extensions](https://github.com/FreshRSS/Extensions)
+* [Foire aux questions](07_Frequently_Asked_Questions.md)
diff --git a/docs/fr/users/03_Main_view.md b/docs/fr/users/03_Main_view.md
index 8382340c5..e827d6c6d 100644
--- a/docs/fr/users/03_Main_view.md
+++ b/docs/fr/users/03_Main_view.md
@@ -1,65 +1,97 @@
# La vue normale
-**TODO**
+**À FAIRE**
# La vue globale
-**TODO**
+**À FAIRE**
# La vue lecture
-**TODO**
+**À FAIRE**
# Rafraîchir les flux
-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.
+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.
## Mise à jour automatique
-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.
+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.
### Par le script actualize_script.php
-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.
+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.
-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.
+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.
-Ci-dessous vous trouverez un exemple permettant la mise à jour des articles toutes les heures.
+Ci-dessous vous trouverez un exemple permettant la mise à jour des articles
+toutes les heures.
```cron
0 * * * * php /chemin/vers/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log 2>&1
```
+« Paramètres de configuration du script; Ils sont utilisables simultanément
+: »
-### Cron en-ligne
+- 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.
-Il se peut que vous n’ayez pas accès aux tâches planifiées du serveur hébergeant votre instance de FreshRSS. Il reste une possibilité pour mettre les flux à jour automatiquement.
+- 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"
-Pour cela vous devez paramétrer une tâche cron qui devra charger régulièrement une url spécifique : https://freshrss.example.net/i/?c=feed&a=actualize (à adapter selon votre installation). Différents cas de figure peuvent se présenter à vous désormais.
+- 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".
-##### Aucune authentification
+- 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".
-C’est le cas le plus simple, puisque votre instance est publique, vous n’avez rien de particulier à préciser :
+### Online cron
-```cron
-0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'
-```
+If you do not have access to the installation server scheduled task, you can
+still automate the update process.
+
+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.
+
+#### Aucune authentification
-Vous pouvez également choisir un utilisateur différent en ajoutant son nom d'utilisateur à la chaîne de requête, avec `&user=nom-dutilisateur` :
+C’est le cas le plus simple, puisque votre instance est publique, vous
+n’avez rien de particulier à préciser :
```cron
-0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize&user=someone&token=my-token'
+0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'
```
-##### Authentification par formulaire
+### Authentification par formulaire
-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 »).
+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 »).
![Configuration de l’accès anonymes](../img/users/anonymous_access.1.png)
-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.
+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.
-Vous pouvez aussi configurer un jeton d’authentification pour accorder un droit spécial sur votre serveur.
+Vous pouvez aussi configurer un jeton d’authentification pour accorder un
+droit spécial sur votre serveur.
![Configuration du token](../img/users/token.1.png)
@@ -69,47 +101,70 @@ La tâche cron à utiliser sera de la forme suivante :
0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize&token=mon-token'
```
+You can also target a different user by adding their username to the query
+string, with `&user=insert-username`:
+
+```cron
+0 * * * * curl 'https://freshrss.exemple.net/i/?c=feed&a=actualize&user=quelquun&token=mon-token'
+```
-##### Authentification HTTP
+### Authentification HTTP
-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 !**
+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 !**
```cron
-0 * * * * curl -u alice:password123 'https://freshrss.example.net/i/?c=feed&a=actualize'
+0 * * * * curl -u alice:motdepasse123 'https://freshrss.exemple.net/i/?c=feed&a=actualize'
```
## Mise à jour manuelle
-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.
+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.
### Mise à jour complète
-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.
+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.
![Menu de navigation](../img/users/refresh.1.png)
-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.
+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.
![Barre de progression](../img/users/refresh.5.png)
### Mise à jour partielle
-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.
+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.
![Menu du flux](../img/users/refresh.2.png)
# Filtrer les articles
-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.
+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.
-##Par catégorie
+## Par catégorie
-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 :
+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 :
- * *Flux principal* qui affiche uniquement les articles des flux marqués comme visible dans cette catégorie
- * *Favoris* qui affiche uniquement les articles, tous flux confondus, marqués comme favoris
+ * *Flux principal* qui affiche uniquement les articles des flux marqués
+ comme visible dans cette catégorie
+ * *Favoris* qui affiche uniquement les articles, tous flux confondus,
+ marqués comme favoris
-##Par flux
+## Par flux
Il existe plusieurs méthodes pour filtrer les articles par flux :
@@ -120,73 +175,88 @@ Il existe plusieurs méthodes pour filtrer les articles par flux :
![Filtrer par flux](../img/users/feed.filter.1.png)
-##Par statut
+## Par statut
-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.
+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.
-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.
+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.
![Filtrer par attribut en version 0.7](../img/users/status.filter.0.7.png)
-À partir de la version 0.8, les filtres sur les attributs sont directement accessibles. Il est maintenant possible de les combiner. Comme il est possible de faire toutes les combinaisons, il y en a certaines qui retournent le même résultat. Par exemple, si les quatre filtres sont activés ou désactivés, le résultat sera le même.
+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.
-![Filtrer par attribut en version 0.8](../img/users/status.filter.0.8.png)
+![Attribute filters in 0.8](../img/users/status.filter.0.8.png)
-Par défaut, le filtre n’affiche que les articles qui n’ont pas été lus.
+By default, this filter displays only unread articles
-##Par contenu
+## By content
-Il est possible de filtrer les articles par leur contenu en entrant une chaine de caractères dans le champ de recherche prévu à cet effet.
+It is possible to filter articles by their content by inputting a string in
+the search field.
-##Grâce au champ de recherche
+## Grâce au champ de recherche
-Il est possible d’utiliser le champ de recherche pour raffiner les résultats :
+Il est possible d’utiliser le champ de recherche pour raffiner les résultats
+:
* par auteur : `author:nom` or `author:'nom composé'`
* par titre : `intitle:mot` or `intitle:'mot composé'`
* par URL: `inurl:mot` or `inurl:'mot composé'`
* par tag: `#tag`
* par texte libre : `mot` or `'mot composé'`
-* par date de découverte, en utilisant le [format d’intervalle de dates ISO 8601](https://fr.wikipedia.org/wiki/ISO_8601#Les_dur.C3.A9es_et_intervalles) : `date:<intervalle>`
- * D’un jour, mois, ou année :
+* by date of discovery, using the [ISO 8601 time interval format](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals): `date:<date-interval>`
+ * From a specific day, or month, or year:
* `date:2014-03-30`
* `date:2014-03` or `date:201403`
* `date:2014`
- * D’une heure précise d’un jour donné :
+ * From a specific time of a given day:
* `date:2014-05-30T13`
* `date:2014-05-30T13:30`
- * Entre deux dates :
+ * Between two given dates:
* `date:2014-02/2014-04`
* `date:2014-02--2014-04`
* `date:2014-02/04`
* `date:2014-02-03/05`
* `date:2014-02-03T22:00/22:15`
* `date:2014-02-03T22:00/15`
- * Après une date donnée :
+ * After a given date:
* `date:2014-03/`
- * Avant une date donnée :
+ * Before a given date:
* `date:/2014-03`
- * Pour une certaine durée après une date donnée :
+ * For a specific duration after a given date:
* `date:2014-03/P1W`
- * Pour une certaine durée avant une date donnée :
+ * For a specific duration before a given date:
* `date:P1W/2014-05-25T23:59:59`
- * Pour une certaine durée avant l’instant présent (la barre oblique est optionnelle) :
- * `date:P1Y/` ou `date:P1Y` (depuis un an)
- * `date:P2M/` (depuis deux mois)
- * `date:P3W/` (depuis trois semaines)
- * `date:P4D/` (depuis quatre jours)
- * `date:PT5H/` (depuis cinq heures)
- * `date:PT30M/` (depuis trente minutes)
- * `date:PT90S/` (depuis 90 seconds)
- * `date:P1DT1H/` (depuis un jour et une heure)
-* par date de publication, en utilisant le même format : `pubdate:<intervalle>`
-
-Attention à ne pas introduire d’espace entre l’opérateur et la valeur recherchée.
-
-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`.
-
-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.
-
-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`
+ * For the past duration before now (the trailing slash is optional):
+ * `date:P1Y/` or `date:P1Y` (past year)
+ * `date:P2M/` (past two months)
+ * `date:P3W/` (past three weeks)
+ * `date:P4D/` (past four days)
+ * `date:PT5H/` (past five hours)
+ * `date:PT30M/` (past thirty minutes)
+ * `date:PT90S/` (past ninety seconds)
+ * `date:P1DT1H/` (past one day and one hour)
+* by date of publication, using the same format: `pubdate:<date-interval>`
+
+Attention à ne pas introduire d’espace entre l’opérateur et la valeur
+recherchée.
+
+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`.
+
+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.
+
+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`
diff --git a/docs/fr/users/04_Subscriptions.md b/docs/fr/users/04_Subscriptions.md
index 0f8389462..f931efc6b 100644
--- a/docs/fr/users/04_Subscriptions.md
+++ b/docs/fr/users/04_Subscriptions.md
@@ -1,19 +1,23 @@
# Ajouter un flux
-**TODO**
+**À FAIRE**
# Import et export
-**TODO**
+**À FAIRE**
-# Utiliser le « bookmarklet »
+# Utiliser le « bookmarklet »
-Les « bookmarklets » sont de petits scripts que vous pouvez exécuter pour effectuer des tâches utiles ou frivoles. FreshRSS offre un signet ( « bookmark » ) pour s'abonner aux fils de nouvelles.
+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.
1. Ouvrez "Gestion des abonnements".
2. Cliquez sur "Outils d'abonnement".
- 3. 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.
+ 3. 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.
# Organisation des flux
-**TODO**
+**À FAIRE**
diff --git a/docs/fr/users/05_Configuration.md b/docs/fr/users/05_Configuration.md
index b1bda9043..326160e93 100644
--- a/docs/fr/users/05_Configuration.md
+++ b/docs/fr/users/05_Configuration.md
@@ -1,14 +1,27 @@
+
# Personnaliser la vue
-##Langue
-À 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).
+## Langue
+
+À 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).
-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.
+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.
-Les langues disponibles sont : cz, de, en, es, fr, he, it, kr, nl, oc, pt-br, ru, tr, zh-cn.
+Les langues disponibles sont : cz, de, en, es, fr, he, it, kr, nl, oc,
+pt-br, ru, tr, zh-cn.
-##Thème
-Les goûts et les couleurs, ça ne se discute pas. C'est pourquoi FreshRSS propose huit thèmes officiels :
+## Thème
+
+Les goûts et les couleurs, ça ne se discute pas. C'est pourquoi FreshRSS
+propose huit thèmes officiels :
* *Blue Lagoon* par **Mister aiR**
* *Dark* par **AD**
@@ -19,60 +32,148 @@ Les goûts et les couleurs, ça ne se discute pas. C'est pourquoi FreshRSS propo
* *Screwdriver* par **Mister aiR**
* *Swage* par **Patrick Crandol**
-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).
+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).
+
+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.
-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.
+## Largeur du contenu
-##Largeur du contenu
-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 :
+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 :
* **Fine** qui affiche le contenu jusqu'à 550 pixels
* **Moyenne** qui affiche le contenu jusqu'à 800 pixels
* **Large** qui affiche le contenu jusqu'à 1000 pixels
* **Pas de limite** qui affiche le contenu sur 100% de la place disponible
-##Icônes d'article
+## Icônes d'article
+
+Veuillez noter que cette section n'affecte que la vue normale.
+
+![Configuration des icônes
+d'article](../img/users/configuration.article.icons.png)
+
+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.
-**TODO**
+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.
-##Temps d'affichage de la notification HTML5
-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.
+## Temps d'affichage de la notification HTML5
-Il est possible de régler la durée d'affichage de cette notification. Par défaut, la valeur est 0.
+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.
-# Options de lecture
+Il est possible de régler la durée d'affichage de cette notification. Par
+défaut, la valeur est 0.
-**TODO**
+## Show the navigation button
+
+By default, FreshRSS displays buttons to ease the article navigation when
+browsing on mobile. The drawback is that they eat up some precious space.
+
+![navigation button
+configuration](../img/users/configuration.navigation.button.png)
+
+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.
+
+# Reading
+
+**À FAIRE**
# Archivage
-**TODO**
+**À FAIRE**
# Partage
-**TODO**
+Pour vous faciliter la vie, vous pouvez partager des articles directement
+via FreshRSS.
+
+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. ![Sharing
+configuration](../img/users/configuration.sharing.png)
+
+Pour ajouter un nouvel élément à la liste, veuillez suivre les étapes
+simples ci-dessous :
+
+ 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 ```❌``` button next to the share method you want to remove.
+ 1. Submit your changes.
# Raccourcis
-**TODO**
+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.
+
+Of course, if you're not satisfied with the key mapping, you can change you
+configuration to fit your needs.
-# Filtres
+There are 4 types of shortcuts:
-**TODO**
+ 1. Views: they allow switching views with ease.
+ 1. Navigation: they allow navigation through articles, feeds, and
+ categories.
+ 1. Article actions: they allow interactions with an article, like sharing
+ or opening it on the original web-site.
+ 1. Other actions: they allow other interactions with the application, like
+ opening the user queries menu or accessing the documentation.
-# Utilisateurs
+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.
-**TODO**
+The same process applies to the user queries.
-## Méthodes d'authentification
+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.
-**Brouillon**
+# User queries
-### Authentification HTTP
+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.
- 1. Ne laisse rien de visible
- 2. Pour Apache, basé sur un fichier .htaccess
- - Exemple de .htaccess pour un utilisateur "marie" à placer dans le répertoire de FreshRSS ou dans un répertoire parent :
+At the moment, there is no helper to build a user query from here.
+
+# Users
+
+**À FAIRE**
+
+## Authentication methods
+
+### HTTP Authentication (Apache)
+
+ 1. User control is based on the `.htaccess` file.
+ 2. It is best practice to place the `.htaccess` file in the `./i/`
+ subdirectory so the API and other third party services can work.
+ 3. 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!
+ 4. Example `.htaccess` file for a user "marie":
```
AuthUserFile /home/marie/repertoire/.htpasswd
@@ -82,40 +183,55 @@ AuthType Basic
Require user marie
```
-Plus d'informations dans [la documentation d'Apache.](http://httpd.apache.org/docs/trunk/howto/auth.html#gettingitworking)
-
+Plus d'informations dans [la documentation
+d'Apache.](http://httpd.apache.org/docs/trunk/howto/auth.html#gettingitworking)
# Gestion des flux
## Informations
-**TODO**
+**À FAIRE**
## Archivage
-**TODO**
+**À FAIRE**
## Identification
-**TODO**
+**À FAIRE**
## Avancé
### Récupérer un flux tronqué à partir de FreshRSS
-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 :)
+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. :)
-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 !
+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 !
-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)
+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).
-#### Exemple 1 : Rue89
+#### Exemple : Rue89
-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 !)
+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 !)
-On trouve ici que le bloc qui englobe uniquement le contenu de l'article est ```<div class="content clearfix">```. On ne va garder que la classe .content ici. Néanmoins, comme je le disais plus haut, il est préférable de commencer le chemin avec un id. Si on remonte au bloc parent, il s'agit du bloc ```<div id="article">``` et c'est parfait ! Le chemin sera donc ```#article .content```
+On trouve ici que le bloc qui englobe uniquement le contenu de l'article est ```<div class="content clearfix">```. On ne va garder que la classe `.content` ici. Néanmoins, comme je le disais plus haut, il est préférable de commencer le chemin avec un id. Si on remonte au bloc parent, il s'agit du bloc ```<div id="article">``` et c'est parfait ! Le chemin sera donc ```#article .content```.
-#### Liste de correspondances site -> chemin css
+#### Liste de correspondances site → chemin css
* Rue89 : ```#article .content```
* PCINpact : ```#actu_content```
@@ -124,7 +240,8 @@ On trouve ici que le bloc qui englobe uniquement le contenu de l'article est ```
### Récupérer un flux tronqué à l'aide d'outils externes
-Des outils complémentaires peuvent être utilisés pour récupérer le contenu complet d'un article, comme :
+Des outils complémentaires peuvent être utilisés pour récupérer le contenu
+complet d'un article, comme :
* [RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)
* [Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)
diff --git a/docs/fr/users/06_Fever_API.md b/docs/fr/users/06_Fever_API.md
index c3623b341..e6b2f7cc6 100644
--- a/docs/fr/users/06_Fever_API.md
+++ b/docs/fr/users/06_Fever_API.md
@@ -1,23 +1,139 @@
# FreshRSS - API compatible Fever
-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.
+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.
-## Compatibilité
+## Clients compatibles
-Testé avec:
+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.
-- Android
- [Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) (Propriétaire)
+### Utilisation et authentification
-- iOS
- - [Fiery Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) (Propriétaire)
- - [Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) (Commercial)
- - [Reeder](https://www.reederapp.com/) (Commercial) (Connectez-vous plutôt par son option Google Reader API)
+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.
-- MacOS
- - [Readkit](https://apps.apple.com/app/readkit/id588726889) (Commercial)
+Connectez ensuite votre application mobile en utilisant l'adresse de l'API
+(e.g. `https://freshrss.example.net/api/fever.php`).
-## TODO
+## Clients compatibles
-Voir [la page en anglais](../../en/users/06_Fever_API.md).
+Testé avec :
+
+* Android
+ * [Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) (Propriétaire)
+
+* iOS
+ * [Fiery Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) (Propriétaire)
+ * [Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) (Commercial)
+ * [Reeder](https://www.reederapp.com/) (Commercial) (Connectez-vous plutôt par son option Google Reader API)
+
+* MacOS
+ * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial)
+
+
+## Fonctionnalités
+
+Les fonctionnalités suivantes sont implémentées :
+
+* récupération des catégories
+* récupération des flux
+* récupération des entrées (new, favorites, unread, by_id, by_feed,
+ by_category,since)
+* récupération des favicons
+* marquage des entrées comme lues
+* marquage des entrées comme favoris
+* marquage d'un flux comme lu
+* marquage d'une catégorie comme lue
+* support des extensions grace au hook `entry_before_display`
+
+Les fonctionnalités suivantes ne sont pas implémentées :
+
+* « Hot Links » car il n'y a encore rien dans FreshRSS qui soit similaire ou
+ qui puisse être utilisé pour le simuler.
+
+## Tester et déboguer
+
+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/).
+
+Envoyer une requête POST à l'adresse
+https://freshrss.example.net/api/fever.php?api devrait vous renvoyer le
+résultat suivant :
+```json
+{
+ "api_version": 3,
+ "auth": 0
+}
+```
+Super, la configuration de base fonctionne !
+
+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` :
+
+```sh
+api_key=`echo -n "kevin:freshrss" | md5sum | cut -d' ' -f1`
+```
+
+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 :
+
+```sh
+curl -s -F "api_key=$api_key" 'https://freshrss.exemple.net/api/fever.php?api'
+```
+
+Vous devriez obtenir le résultat suivant :
+```json
+{
+ "api_version": 3,
+ "auth": 1,
+ "last_refreshed_on_time": "1520013061"
+}
+```
+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).
+
+Voici quelques exemples simples d'appels réalisables :
+
+* 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
+
+Remplacez `some_id` par un identifiant réel de votre base de données
+`freshrss_username_entry`.
+
+### Déboguer
+
+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 :
+
+```php
+file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' . json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);
+```
+
+Utilisez ensuite votre client RSS pour interroger l'API et vérifier le
+fichier `fever.log`.
+
+## Remerciements
+
+Ce plugin a été inspiré par le
+[tinytinyrss-fever-plugin](https://github.com/dasmurphy/tinytinyrss-fever-plugin).
diff --git a/docs/fr/users/06_Mobile_access.md b/docs/fr/users/06_Mobile_access.md
index f637ccf5b..3adb76d5a 100644
--- a/docs/fr/users/06_Mobile_access.md
+++ b/docs/fr/users/06_Mobile_access.md
@@ -1,19 +1,24 @@
-Cette page suppose que vous avez fini [l’installation du serveur](01_Installation.md).
+Cette page suppose que vous ayez fini [l’installation du
+serveur](01_Installation.md).
# Activer l’API dans FreshRSS
-1. Dans la section “Authentification”, cocher l’option “Autoriser l’accès par API (nécessaire pour les applis mobiles)”.
+1. Dans la section “Authentification”, cocher l’option “Autoriser l’accès
+ par API (nécessaire pour les applis mobiles)”.
2. Dans la section “Profil”, remplir le champ “Mot de passe API (ex. : pour applis mobiles)”.
* Chaque utilisateur doit choisir son mot de passe API.
- * La raison d’être d’un mot de passe API 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.
+ * La raison d’être d’un mot de passe API
+ 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.
-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é.
+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é.
# Tester
-3. Dans la section “Profil”, cliquer sur le lien de la forme `https://rss.example.net/api/` à côté du champ “Mot de passe API”.
+3. Dans la section “Profil”, cliquer sur le lien de la forme
+ `https://rss.example.net/api/` à côté du champ “Mot de passe API”.
4. Cliquer sur le premier lien “Check full server configuration”:
* Si vous obtenez `PASS`, tout est bon : passer à l’étape 6.
* 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.
@@ -41,38 +46,25 @@ Voir la [page sur l’API compatible Fever](06_Fever_API.md) pour une autre poss
* Mettre à jour et retourner à l’étape 3.
-# Tests sur mobile
-
-6. Vous pouvez maintenant tester sur une application mobile (News+, FeedMe, ou EasyRSS sur Android)
- * en utilisant comme adresse https://rss.example.net/api/greader.php ou http://example.net/FreshRSS/p/api/greader.php selon la configuration de votre site Web.
- * ⚠️ attention aux majuscules et aux espaces en tapant l’adresse avec le clavier du mobile ⚠️
- * avec votre nom d’utilisateur et le mot de passe enregistré au point 2 (mot de passe API).
-
-
-# En cas de problèmes
-
- * Vous pouvez voir les logs API dans `./FreshRSS/data/users/_/log_api.txt`
- * Si vous avez une erreur 404 (fichier non trouvé) lors de l’étape de test, et que vous êtes sous Apache,
- voir http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes pour utiliser News+
-(facultatif pour EasyRSS et FeedMe qui devraient fonctionner dès lors que vous obtenez un PASS au test *Check partial server configuration*).
-
-
# Clients compatibles
-Tout client supportant une API de type Google Reader. Sélection :
-
-* Android
- * [News+](https://play.google.com/store/apps/details?id=com.noinnion.android.newsplus) avec [News+ Google Reader extension](https://play.google.com/store/apps/details?id=com.noinnion.android.newsplus.extension.google_reader) (Propriétaire)
- * [FeedMe 3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) (Propriétaire)
- * [EasyRSS](https://github.com/Alkarex/EasyRSS) (Libre, F-Droid)
-* Linux
- * [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Libre)
-* iOS
- * [Reeder-4](https://apps.apple.com/app/reeder-4/id1449412357) (Commercial)
-* MacOS
- * [Vienna RSS](http://www.vienna-rss.com/) (Libre)
-* Firefox
- * [FreshRSS-Notify](https://addons.mozilla.org/fr/firefox/addon/freshrss-notify-webextension/) (Libre)
+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`
+ * 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.
+
+7. Vous pouvez maintenant tester sur une application mobile:
+ * Android
+ * [News+](https://play.google.com/store/apps/details?id=com.noinnion.android.newsplus) avec [News+ Google Reader extension](https://play.google.com/store/apps/details?id=com.noinnion.android.newsplus.extension.google_reader) (Closed source)
+ * [FeedMe 3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) (Propriétaire)
+ * [EasyRSS](https://github.com/Alkarex/EasyRSS) (Libre, [F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/))
+ * Linux
+ * [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Libre)
+ * MacOS
+ * [Vienna RSS](http://www.vienna-rss.com/) (Libre)
+ * [Reeder](https://www.reederapp.com/) (Commercial)
+ * iOS
+ * [Reeder](https://www.reederapp.com/) (Commercial)
+ * Firefox
+ * [FreshRSS-Notify](https://addons.mozilla.org/firefox/addon/freshrss-notify-webextension/) (Libre)
# API compatible Google Reader
diff --git a/docs/fr/users/07_Frequently_Asked_Questions.md b/docs/fr/users/07_Frequently_Asked_Questions.md
index 25e8dbd6a..bb3789b9d 100644
--- a/docs/fr/users/07_Frequently_Asked_Questions.md
+++ b/docs/fr/users/07_Frequently_Asked_Questions.md
@@ -1,54 +1,114 @@
-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.
-
-## C'est quoi ce /i à la fin de l'URL ?
-
-Bien entendu, le ```/i``` n'est pas là pour faire joli ! Il s'agit d'une question de performances et de praticité :
-
-* 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.
-* La racine publique ```./p/``` peut être servie sans restriction d'accès HTTP (qui peut avantageusement être mise en place dans ```./p/i/```).
-* Cela permet d'éviter des problèmes pour des fichiers qui doivent être publics pour bien fonctionner, comme ```favicon.ico```, ```robots.txt```, etc.
-* 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.
+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.
+
+## C'est quoi ce `/i` à la fin de l'URL ?
+
+Bien entendu, le ```/i``` n'est pas là pour faire joli ! Il s'agit d'une
+question de performances et de praticité :
+
+* 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.
+* La racine publique ```./p/``` peut être servie sans restriction d'accès
+ HTTP (qui peut avantageusement être mise en place dans ```./p/i/```).
+* Cela permet d'éviter des problèmes pour des fichiers qui doivent être
+ publics pour bien fonctionner, comme ```favicon.ico```, ```robots.txt```,
+ etc.
+* 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.
## Pourquoi le ```robots.txt``` se trouve dans un sous-répertoire ?
-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```.
+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```.
-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 http://demo.freshrss.org/ pointe vers le répertoire ```./p``` et le ```robots.txt``` se trouve bien à la racine du site : http://demo.freshrss.org/robots.txt.
+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.
-L'explication est la même pour les fichiers ```favicon.ico``` et ```.htaccess```.
+L'explication est la même pour les fichiers ```favicon.ico``` et
+```.htaccess```.
## Pourquoi j'ai des erreurs quand j'essaye d'enregistrer un flux ?
-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 :
-
-1. __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.
-1. __Vérifier la reconnaissance par SimplePie__ grâce à l'[outil en ligne de SimplePie](http://simplepie.org/demo/ "Démo officielle de SimplePie"). Si ça ne fonctionne pas, nous ne pouvons rien faire.
-1. __Vérifier l'intégration dans FreshRSS__ grâce à la [démo](http://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.
-
-Voici une liste des flux qui ne fonctionnent pas :
-
-* http://foulab.org/fr/rss/Foulab_News : ne passe pas la validation W3C (novembre 2014)
-* http://eu.battle.net/hearthstone/fr/feed/news : ne passe pas la validation W3C (novembre 2014)
-* http://webseriesmag.blogs.liberation.fr/we/atom.xml : ne fonctionne pas chez l'utilisateur mais passe l'ensemble des validations ci-dessus (novembre 2014)
+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 :
+
+1. __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.
+1. __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.
+1. __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.
## Comment changer un mot de passe oublié ?
-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.
-
-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 :
+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.
+
+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 :
```sh
./cli/update_user.php --user <username> --password <password>
+
```
-Pour plus d'information à ce sujet, il existe la [documentation dédiée](../../cli/README.md).
+Pour plus d'information à ce sujet, il existe la [documentation
+dédiée](../../cli/README.md).
## Gérer les permissions sous SELinux
-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:
+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:
```sh
semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/FreshRSS/data(/.*)?'
restorecon -Rv /usr/share/FreshRSS/data
```
+
+## Pourquoi y a-t-il une page blanche lorsque je configure les options de partage ?
+
+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.
+
+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 ».
+
+Exemples avec _uBlock_ :
+
+- Ajoutez votre instance FreshRSS à la liste blanche de en l'ajoutant dans
+ _uBlock > Ouvrir le tableau de bord > Liste blanche_.
+- 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_
diff --git a/docs/i18n/freshrss.fr.po b/docs/i18n/freshrss.fr.po
new file mode 100644
index 000000000..7a5d8d00e
--- /dev/null
+++ b/docs/i18n/freshrss.fr.po
@@ -0,0 +1,6248 @@
+# French translations for PACKAGE package
+# Copyright (C) 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Automatically generated, 2019.
+# Frans de Jonge <fransdejonge@gmail.com>, 2019.
+# Marien Fressinaud <dev@marienfressinaud.fr>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: FreshRSS\n"
+"Report-Msgid-Bugs-To: https://github.com/FreshRSS/FreshRSS/issues\n"
+"POT-Creation-Date: 2019-12-07 10:49+0100\n"
+"PO-Revision-Date: 2019-12-07 10:50+0100\n"
+"Last-Translator: Marien Fressinaud <dev@marienfressinaud.fr>\n"
+"Language-Team: French <>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Gtranslator 3.34.0\n"
+
+#. 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
+msgid ""
+"Have you found a bug? Don't panic, here are some steps to report it with "
+"ease:"
+msgstr ""
+"Avez-vous trouvé un bogue ? Ne paniquez pas, voici quelques étapes pour le "
+"signaler facilement :"
+
+#. type: Bullet: '1. '
+#: en/./contributing.md:15
+msgid ""
+"Search for it on [the bug tracker](https://github.com/FreshRSS/FreshRSS/"
+"issues) (don't forget to use the search bar)."
+msgstr ""
+"Cherche sur [le bug tracker](https://github.com/FreshRSS/FreshRSS/issues) "
+"(n'oubliez pas d'utiliser la barre de recherche)."
+
+#. type: Bullet: '2. '
+#: en/./contributing.md:15
+msgid ""
+"If you find a similar bug, don't hesitate to post a comment to add more "
+"importance to the related ticket."
+msgstr ""
+"Si vous constatez un bogue similaire, n'hésitez pas à poster un commentaire "
+"pour ajouter de l'importance au ticket correspondant."
+
+#. type: Bullet: '3. '
+#: en/./contributing.md:15
+msgid ""
+"If you didn't find it, [open a new ticket](https://github.com/FreshRSS/"
+"FreshRSS/issues/new)."
+msgstr ""
+"Si vous ne l'avez pas trouvé, [ouvrez un nouveau ticket](https://github.com/"
+"FreshRSS/FreshRSS/issues/new)."
+
+#. type: Plain text
+#: en/./contributing.md:17
+msgid ""
+"If you have to create a new ticket, please try to keep in mind the following "
+"advice:"
+msgstr ""
+"Si vous devez créer un nouveau ticket, essayez de garder les conseils "
+"suivants :"
+
+#. type: Bullet: '* '
+#: en/./contributing.md:20
+msgid ""
+"Give an explicit title to the ticket so it will be easier to find it later."
+msgstr ""
+"Donnez un titre explicite au ticket pour le retrouver plus facilement plus "
+"tard."
+
+#. type: Bullet: '* '
+#: en/./contributing.md:20
+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 ""
+"Soyez aussi exhaustif que possible dans la description : qu'avez-vous fait ? "
+"Quel est le bogue ? Quelles sont les étapes pour reproduire le bogue ?"
+
+#. type: Plain text
+#: en/./contributing.md:22
+msgid "We also need some information:"
+msgstr "Nous avons aussi besoin de quelques informations :"
+
+#. type: Bullet: '* '
+#: en/./contributing.md:27
+msgid ""
+"Your FreshRSS version (on the about page or in the `constants.php` file)"
+msgstr ""
+"Votre version de FreshRSS (sur la page A propos) ou le fichier `constants."
+"php`)"
+
+#. type: Bullet: '* '
+#: en/./contributing.md:27
+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
+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
+msgid ""
+"If possible, the related logs (PHP logs and FreshRSS logs under `data/users/"
+"your_user/log.txt`)"
+msgstr ""
+"Si possible, les logs associés (logs PHP et logs FreshRSS sous `data/users/"
+"your_user/log.txt`)"
+
+#. type: Title ##
+#: en/./contributing.md:28
+#, no-wrap
+msgid "Fix a bug"
+msgstr "Corriger un bogue"
+
+#. type: Plain text
+#: en/./contributing.md:31
+msgid ""
+"Would you like to fix a bug? For optimum coordination between collaborators, "
+"you should follow these indications:"
+msgstr ""
+"Voulez-vous corriger un bogue ? Pour maintenir une grande coordination entre "
+"les collaborateurs, vous devrez suivre ces indications :"
+
+#. type: Bullet: '1. '
+#: en/./contributing.md:36
+msgid ""
+"Be sure the bug is associated with a ticket and indicate that you'll work on "
+"it."
+msgstr ""
+"Assurez-vous que le bogue est associé à un ticket et indiquez que vous allez "
+"travailler sur le bogue."
+
+#. type: Bullet: '2. '
+#: en/./contributing.md:36
+msgid ""
+"[Fork the project repository](https://help.github.com/articles/fork-a-repo/)."
+msgstr ""
+"[Fork du répertoire de projet](https://help.github.com/articles/fork-a-"
+"repo/)."
+
+#. type: Bullet: '3. '
+#: en/./contributing.md:36
+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, "
+"and ideally prefixed by the related ticket id. For instance, `783-"
+"contributing-file` to fix [ticket #783](https://github.com/FreshRSS/FreshRSS/"
+"issues/783)."
+msgstr ""
+"[Créez une nouvelle branche](https://help.github.com/articles/creating-and-"
+"deleting-branches-within-your-repository/). Le nom de la branche doit être "
+"clair, et idéalement préfixé par l'identifiant du ticket correspondant. Par "
+"exemple, `783-contributing-file` pour réparer [ticket #783](https://github."
+"com/FreshRSS/FreshRSS/issues/783)."
+
+#. type: Bullet: '4. '
+#: en/./contributing.md:36
+msgid ""
+"Make your changes to your fork and [send a pull request](https://help.github."
+"com/articles/using-pull-requests/)."
+msgstr ""
+"Ajoutez vos modifications à votre fork et [ouvrez une demande de pull "
+"request](https://help.github.com/articles/using-pull-requests/)."
+
+#. type: Plain text
+#: en/./contributing.md:38
+msgid ""
+"If you have to write code, please follow [our coding style recommendations]"
+"(developers/01_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
+#, 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
+#, no-wrap
+msgid "Submit an idea"
+msgstr "Soumettre une idée"
+
+#. type: Plain text
+#: en/./contributing.md:44
+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 "
+"implement it. The greatest ideas often come from the shyest suggestions!"
+msgstr ""
+"Vous avez de bonnes idées, oui ! Ne soyez pas timide et ouvrez [un nouveau "
+"ticket](https://github.com/FreshRSS/FreshRSS/issues/new) sur notre tracker "
+"bogue pour nous demander si nous pouvons le mettre en œuvre. Les plus "
+"grandes idées viennent souvent des suggestions les plus timides !"
+
+#. type: Plain text
+#: en/./contributing.md:46
+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
+#, 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
+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 !"
+
+#. type: Title ##
+#: en/./contributing.md:55
+#, no-wrap
+msgid "Contribute to documentation"
+msgstr "Contribuer à la documentation"
+
+#. type: Plain text
+#: en/./contributing.md:58
+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/master/docs)!"
+msgstr ""
+"Il ne vous aura pas échappé que la documentation est encore un peu vide… il "
+"y a énormément de choses à faire ! Si vous souhaitez aider à écrire quelques "
+"pages, rendez-vous dans les principaux dépôts[fichier docs](https://github."
+"com/FreshRSS/FreshRSS/tree/master/docs) !"
+
+#. type: Title #
+#: en/./developers/01_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
+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 "
+"Composer."
+msgstr ""
+"FreshRSS est construit en PHP et utilise le framework Minz. Les "
+"dépendancessont directement incluses dans le code source, donc vous n'avez "
+"pas besoin d'utiliser Composer."
+
+#. type: Plain text
+#: en/./developers/01_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 "
+"documented below. If you already have a working PHP environment, you "
+"probably don't need it."
+msgstr ""
+"Il existe plusieurs façons de configurer votre environnement "
+"dedéveloppement. La méthode la plus simple et la plus supportée est basée "
+"surDocker. C'est la solution qui est documentée ci-dessous. Si vous avez "
+"déjà unenvironnement PHP fonctionnel, vous n'en avez probablement pas besoin."
+
+#. type: Plain text
+#: en/./developers/01_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."
+msgstr ""
+"Nous supposons ici que vous utilisez une distribution GNU/Linux, capable "
+"d'exécuter Docker. Sinon, vous devrez adapter les commandes en conséquence."
+
+#. type: Plain text
+#: en/./developers/01_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 "
+"to be executed as root user. You don't have to type these characters. A path "
+"may be indicated before these characters to help you identify where they "
+"need to be executed. For instance, `app$ echo 'Hello World'` indicates that "
+"you have to execute `echo` command in the `app/` directory."
+msgstr ""
+"Les commandes qui suivent doivent être exécutées dans une console. Ils "
+"commencent par `$` quand les commandes doivent être exécutées en tant "
+"qu'utilisateur normal, et par `#` quand elles doivent être exécutées en tant "
+"qu'utilisateur root. Vous n'avez pas besoin de taper ces caractères. Un "
+"chemin d'accès peut être indiqué devant ces caractères pour vous aider à "
+"identifier où ils doivent être exécutés. Par exemple, `app$ echo 'Hello "
+"World'` indique que vous devez exécuter la commande `echo` dans le "
+"répertoire `app/`."
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:12
+msgid ""
+"First, you need to install [Docker](https://docs.docker.com/install/linux/"
+"docker-ce/ubuntu/)."
+msgstr ""
+"Tout d'abord, vous devez installer [Docker](https://docs.docker.com/install/"
+"linux/docker-ce/ubuntu/)."
+
+#. type: Plain text
+#: en/./developers/01_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
+#, no-wrap
+msgid "console"
+msgstr "console"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:15
+#, no-wrap
+msgid ""
+"$ 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
+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 "
+"consequence."
+msgstr ""
+"Notez que, pour contribuer, vous devrez d'abord « forker » ce dépôt de code "
+"(ou dépôt de code référent) et cloner votre « fork » à la place de ce dépôt. "
+"Adaptez les commandes en conséquence."
+
+#. type: Plain text
+#: en/./developers/01_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"
+msgstr "$ make start\n"
+
+#. type: Plain text
+#: en/./developers/01_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`."
+msgstr ""
+"Cela peut prendre un certain temps pour que Docker télécharge l'image "
+"utilisée. Dans le cas où la commande échoue pour un problème de droit, il "
+"faudra soit ajouter votre utilisateur au groupe `docker`, soit relancer la "
+"commande en la préfixant par `sudo`."
+
+#. type: Plain text
+#: en/./developers/01_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
+#, no-wrap
+msgid "You can stop the containers by typing <kbd>Control</kbd> + <kbd>c</kbd> or with the following command, in another terminal:\n"
+msgstr "Vous pouvez arrêter les conteneurs en tapant <kbd>Control</kbd> + <kbd>c</kbd> ou avec la commande suivante, dans un autre terminal:\n"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:34
+#, no-wrap
+msgid "$ make stop\n"
+msgstr "$ make stop\n"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:39
+msgid ""
+"If you're interested in the configuration, the `make` commands are defined "
+"in the [`Makefile`](/Makefile)."
+msgstr ""
+"Si la configuration vous intéresse, les commandes `make' sont définies dans "
+"le fichier [`Makefile`](/Makefile)."
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:41
+msgid ""
+"If you need to use a different tag image (default is `alpine`), you can set "
+"the `TAG` environment variable:"
+msgstr ""
+"Si vous avez besoin d'utiliser une image Docker identifiée par un tag "
+"différent (par défaut `alpine`), vous pouvez surcharger de la manière "
+"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"
+msgstr "$ TAG=arm make start\n"
+
+#. type: Plain text
+#: en/./developers/01_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)."
+msgstr ""
+"Vous pouvez trouver la liste complète des tags disponibles [sur le hub "
+"Docker](https://hub.docker.com/r/freshrss/freshrss/tags)."
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:49
+msgid ""
+"If you want to build the Docker image yourself, you can use the following "
+"command:"
+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
+msgid ""
+"$ 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
+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 ""
+"La valeur de la variable `TAG` peut contenir n'importe quelle valeur (par "
+"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
+#, 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:381
+#: 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: Title #
+#: en/./developers/01_First_steps.md:62
+#, no-wrap
+msgid "Extensions"
+msgstr "Extensions"
+
+#. type: Plain text
+#: en/./developers/01_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)."
+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
+#, no-wrap
+msgid "Coding style"
+msgstr "Style de codage"
+
+#. type: Plain text
+#: en/./developers/01_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 "
+"the project, but we should fix it every time an opportunity presents itself."
+msgstr ""
+"Si vous désirez contribuer au code, il est important de respecter le style "
+"de codage suivant. Le code actuel ne le respecte pas entièrement mais il est "
+"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
+msgid ""
+"Contributions which don't follow the coding style will be rejected as long "
+"as the coding style is not fixed."
+msgstr ""
+"Aucune nouvelle contribution ne respectant pas ces règles ne sera acceptée "
+"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
+#, no-wrap
+msgid "Indentation"
+msgstr "Indentation"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:76
+msgid "Code indentation must use tabs."
+msgstr ""
+"L'indentation du code doit être faite impérativement avec des tabulations."
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:77
+#, no-wrap
+msgid "Alignment"
+msgstr "Alignement"
+
+#. type: Plain text
+#: en/./developers/01_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."
+msgstr ""
+"Une fois l'indentation faite, il peut être nécessaire de faire un alignement "
+"pour simplifier la lecture. Dans ce cas, il faut utiliser les espaces."
+
+#. type: Code fence info string
+#: en/./developers/01_First_steps.md:81 en/./developers/01_First_steps.md:111
+#: en/./developers/01_First_steps.md:123 en/./developers/01_First_steps.md:158
+#: en/./developers/01_First_steps.md:173 en/./developers/01_First_steps.md:186
+#: en/./developers/01_First_steps.md:196 en/./developers/01_First_steps.md:213
+#: en/./developers/01_First_steps.md:228
+#: en/./developers/03_Backend/05_Extensions.md:47
+#: en/./developers/03_Backend/05_Extensions.md:88
+#: en/./developers/03_Backend/05_Extensions.md:130
+#: en/./developers/03_Backend/05_Extensions.md:149
+#: en/./developers/03_Backend/05_Extensions.md:166
+#: en/./developers/03_Backend/05_Extensions.md:188
+#: en/./developers/03_Backend/05_Extensions.md:225
+#: en/./developers/05_Release_new_version.md:53 en/./users/06_Fever_API.md:107
+#, no-wrap
+msgid "php"
+msgstr "php"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:81
+#, 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/01_First_steps.md:86
+#, no-wrap
+msgid "End of line"
+msgstr "Fin de ligne"
+
+#. 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."
+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
+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: Code fence info string
+#: en/./developers/01_First_steps.md:92 en/./developers/02_Github.md:80
+#: en/./developers/02_Github.md:85 en/./developers/02_Github.md:90
+#: en/./developers/02_Github.md:96 en/./developers/02_Github.md:102
+#: en/./developers/05_Release_new_version.md:15
+#: en/./developers/05_Release_new_version.md:101
+#, no-wrap
+msgid "bash"
+msgstr "bash"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:92
+#, 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/01_First_steps.md:99 en/./developers/01_First_steps.md:220
+#, no-wrap
+msgid "End of file"
+msgstr "Fin de fichier"
+
+#. 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: Title ###
+#: en/./developers/01_First_steps.md:103
+#, no-wrap
+msgid "Commas, dots and semi-columns"
+msgstr "Le cas de la virgule, du point et du point-virgule"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:106
+msgid ""
+"There should no space before those characters, but there should be one after."
+msgstr "Il n'y a pas d'espace avant ces caractères, il y en a un après."
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:107 en/./developers/01_First_steps.md:210
+#, no-wrap
+msgid "Operators"
+msgstr "Le cas des opérateurs"
+
+#. 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."
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:111
+#, no-wrap
+msgid ""
+"if ($a == 10) {\n"
+"\t// do something\n"
+"}\n"
+"\n"
+"echo $a ? 1 : 0;\n"
+msgstr ""
+"if ($a == 10) {\n"
+"\t// faire quelque chose\n"
+"}\n"
+"\n"
+"echo $a ? 1 : 0;\n"
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:119
+#, no-wrap
+msgid "Parentheses"
+msgstr "Le cas des parenthèses"
+
+#. 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."
+msgstr ""
+"Il n'y a pas d'espaces entre des parenthèses. Il n'y a pas d'espaces avant "
+"une parenthèse ouvrante sauf si elle est précédée d'un mot-clé. Il n'y a pas "
+"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
+#, no-wrap
+msgid ""
+"if ($a == 10) {\n"
+"\t// do something\n"
+"}\n"
+"\n"
+"if ((int)$a == 10) {\n"
+"\t// do something\n"
+"}\n"
+msgstr ""
+"if ($a == 10) {\n"
+"\t// faire quelque chose\n"
+"}\n"
+"\n"
+"if ((int)$a == 10) {\n"
+"\t// faire quelque chose\n"
+"}\n"
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:133
+#, 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 "
+"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 ""
+"Ce cas se présente le plus souvent en Javascript. Quand on a des fonctions "
+"chainées, des fonctions anonymes ainsi que des fonctions de rappels, il est "
+"très facile de se perdre. Dans ce cas là, on ajoute une indentation "
+"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
+#, no-wrap
+msgid ""
+"// First instruction\n"
+"shortcut.add(shortcuts.mark_read, function () {\n"
+"\t\t//...\n"
+"\t}, {\n"
+"\t\t'disable_in_input': true\n"
+"\t});\n"
+"// Second instruction\n"
+"shortcut.add(\"shift+\" + shortcuts.mark_read, function () {\n"
+"\t\t//...\n"
+"\t}, {\n"
+"\t\t'disable_in_input': true\n"
+"\t});\n"
+msgstr ""
+"// Première instruction\n"
+"shortcut.add(shortcuts.mark_read, function () {\n"
+"\t\t//...\n"
+"\t}, {\n"
+"\t\t'disable_in_input': true\n"
+"\t});\n"
+"// Deuxième instruction\n"
+"shortcut.add(\"shift+\" + shortcuts.mark_read, function () {\n"
+"\t\t//...\n"
+"\t}, {\n"
+"\t\t'disable_in_input': true\n"
+"\t});\n"
+
+#. type: Title ##
+#: en/./developers/01_First_steps.md:152
+#, no-wrap
+msgid "Line length"
+msgstr "Longueur des lignes"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:155
+msgid ""
+"Lines should strive to be shorter than 80 characters. However, this limit "
+"may be extended to 100 characters when strictly necessary."
+msgstr ""
+"Les lignes ne doivent pas dépasser 80 caractères. Il est cependant autorisé "
+"exceptionnellement de dépasser cette limite s'il n'est pas possible de la "
+"respecter mais en aucun cas, les lignes ne doivent dépasser les 100 "
+"caractères."
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:157
+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
+#, no-wrap
+msgid ""
+"function my_function($param_1, $param_2,\n"
+" $param_3, $param_4) {\n"
+"\t// do something\n"
+"}\n"
+msgstr ""
+"function ma_fonction($param_1, $param_2,\n"
+" $param_3, $param_4) {\n"
+"\t// faire quelque chose\n"
+"}\n"
+
+#. type: Title ##
+#: en/./developers/01_First_steps.md:165
+#, no-wrap
+msgid "Naming"
+msgstr "Nommage"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:168
+msgid ""
+"All code elements (functions, classes, methods and variables) must describe "
+"their usage succinctly."
+msgstr ""
+"L'ensemble des éléments du code (fonctions, classes, méthodes et variables) "
+"doivent être nommés de manière à décrire leur usage de façon concise."
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:169
+#, no-wrap
+msgid "Functions and variables"
+msgstr "Fonctions et variables"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:172
+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
+#, no-wrap
+msgid ""
+"// a function\n"
+"function function_name() {\n"
+"\t// do something\n"
+"}\n"
+"// a variable\n"
+"$variable_name;\n"
+msgstr ""
+"// une fontion\n"
+"function nom_de_la_fontion() {\n"
+"\t// faire quelque chose\n"
+"}\n"
+"// une variable\n"
+"$nom_de_la_variable;\n"
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:182
+#, no-wrap
+msgid "Methods"
+msgstr "Méthodes"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:185
+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
+#, no-wrap
+msgid ""
+"private function methodName() {\n"
+"\t// do something\n"
+"}\n"
+msgstr ""
+"private function nomDeLaMethode() {\n"
+"\t// faire quelque chose\n"
+"}\n"
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:192
+#, no-wrap
+msgid "Classes"
+msgstr "Classes"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:195
+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
+#, no-wrap
+msgid "abstract class ClassName {}\n"
+msgstr "abstract class NomDeLaClasse {}\n"
+
+#. type: Title ##
+#: en/./developers/01_First_steps.md:200
+#, no-wrap
+msgid "Encoding"
+msgstr "Encodage"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:203
+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
+#, no-wrap
+msgid "PHP compatibility"
+msgstr "Compatibilité PHP"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:207
+msgid ""
+"Please ensure that your code works with the oldest PHP version officially "
+"supported by FreshRSS."
+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
+#, no-wrap
+msgid "Miscellaneous"
+msgstr "Divers"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:212
+msgid ""
+"Operators must be at the end of the line if a condition is split over more "
+"than one line."
+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
+#, no-wrap
+msgid ""
+"if ($a == 10 ||\n"
+" $a == 20) {\n"
+"\t// do something\n"
+"}\n"
+msgstr ""
+"if ($a == 10 ||\n"
+" $a == 20) {\n"
+"\t// faire quelque chose\n"
+"}\n"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:223
+msgid ""
+"If the file contains only PHP code, the PHP closing tag must be omitted."
+msgstr ""
+"Si le fichier ne contient que du PHP, il ne doit pas comporter de balise "
+"fermante."
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:224
+#, no-wrap
+msgid "Arrays"
+msgstr "Tableaux"
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:227
+msgid ""
+"If an array declaration runs on more than one line, each element must be "
+"followed by a comma, including the last one."
+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
+#, no-wrap
+msgid ""
+"$variable = [\n"
+"\t\"value 1\",\n"
+"\t\"value 2\",\n"
+"\t\"value 3\",\n"
+"];\n"
+msgstr ""
+"$variable = [\n"
+"\t\"valeur 1\",\n"
+"\t\"valeur 2\",\n"
+"\t\"valeur 3\",\n"
+"];\n"
+
+#. type: Title #
+#: en/./developers/02_Github.md:1
+#, no-wrap
+msgid "Reporting a bug or a suggestion"
+msgstr "Remonter un problème ou une suggestion"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:4
+msgid ""
+"Despite the care given to FreshRSS, it's still possible that bugs occur. The "
+"project is young and development is dynamic, so it can be corrected quickly. "
+"You might also have a feature in mind that doesn't yet exist. Regardless "
+"whether your idea seems silly, far-fetched, useless or too specific, please "
+"don't hesitate to propose it to us! \"Ideas in the air\" often find an "
+"attentive ear. It's new external perspectives that make the project evolve "
+"the most."
+msgstr ""
+"Malgré le soin apporté à FreshRSS, il se peut que des bugs apparaissent "
+"encore. Le projet est jeune et le développement dynamique, aussi celui-ci "
+"pourra être corrigé rapidement. Il se peut aussi que vous ayez en tête une "
+"fonctionnalité qui n'existe pas encore. Que celle-ci vous paraisse idiote, "
+"farfelue, inutile ou trop spécifique, il ne faut surtout pas hésiter à nous "
+"la proposer ! Très souvent des \"idées en l'air\" ont trouvé une oreille "
+"attentive. Ce sont les regards externes qui font le plus évoluer le projet."
+
+#. type: Plain text
+#: en/./developers/02_Github.md:6
+msgid ""
+"If you're convinced that you should be heard, here's how you can go about it."
+msgstr ""
+"Si vous êtes convaincus qu'il faut vous faire entendre, voici la marche à "
+"suivre."
+
+#. type: Title ##
+#: en/./developers/02_Github.md:7
+#, no-wrap
+msgid "On GitHub"
+msgstr "Sur GitHub"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:10
+msgid ""
+"GitHub is the ideal platform to submit your requests. It allows us to "
+"discuss a problem or suggestion with others and it often generates new "
+"ideas. Let's not neglect this \"social\" aspect!"
+msgstr ""
+"GitHub est la plate-forme à privilégier pour vos demandes. En effet, cela "
+"nous permet de pouvoir discuter à plusieurs sur un problème ou une "
+"suggestion et de faire émerger, souvent, des idées nouvelles. Ne négligeons "
+"pas cet aspect \"social\" !"
+
+#. type: Bullet: ' 1. '
+#: en/./developers/02_Github.md:16
+msgid ""
+"[Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/issues)"
+msgstr ""
+"[Rendez-vous sur le gestionnaire de tickets de bugs](https://github.com/"
+"FreshRSS/FreshRSS/issues)"
+
+#. type: Bullet: ' 2. '
+#: en/./developers/02_Github.md:16
+msgid ""
+"Start by checking if a similar request hasn't already been made. If so, "
+"please feel free to add your voice to the request."
+msgstr ""
+"Commencez par rechercher si une demande similaire n'a pas déjà été faite. Si "
+"oui, n'hésitez pas à ajouter votre voix à la demande."
+
+#. type: Bullet: ' 3. '
+#: en/./developers/02_Github.md:16
+msgid ""
+"If your request is new, [open a new bug ticket](https://github.com/FreshRSS/"
+"FreshRSS/issues/new)"
+msgstr ""
+"Si votre demande est nouvelle, [ouvrez un nouveau ticket de bug](https://"
+"github.com/FreshRSS/FreshRSS/issues/new)"
+
+#. type: Bullet: ' 4. '
+#: en/./developers/02_Github.md:16
+msgid ""
+"Finally, write your request. If you're fluent in English, it's the preferred "
+"language because it allows for discussion with the largest number of people."
+msgstr ""
+"Rédigez enfin votre demande. Si vous maitrisez l'anglais, c'est la langue à "
+"privilégier car cela permet d'ouvrir la discussion à un plus grand nombre de "
+"personnes. Sinon, ce n'est pas grave, continuez en français :)"
+
+#. type: Bullet: ' 5. '
+#: en/./developers/02_Github.md:16
+msgid ""
+"Please follow the tips below to make it easier to let your ticket be heard."
+msgstr ""
+"Merci de bien vouloir suivre les quelques conseils donnés plus bas pour "
+"faciliter la prise en compte de votre ticket."
+
+#. type: Title ##
+#: en/./developers/02_Github.md:17
+#, no-wrap
+msgid "Informal"
+msgstr "De façon informelle"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:20
+msgid ""
+"Not everyone likes or uses GitHub for a variety of legitimate reasons. That "
+"is why you can also contact us in a more informal way."
+msgstr ""
+"Tout le monde n'aime pas ou n'utilise pas GitHub pour des raisons aussi "
+"diverses que légitimes. C'est pourquoi vous pouvez aussi nous contacter de "
+"façon plus informelle."
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:26
+msgid ""
+"On [our Mattermost chat](https://framateam.org/signup_user_complete/?"
+"id=e2680d3e3128b9fac8fdb3003b0024ee)"
+msgstr ""
+"Sur [notre chat Mattermost](https://framateam.org/signup_user_complete/?"
+"id=e2680d3e3128b9fac8fdb3003b0024ee)"
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:26
+msgid ""
+"On [the mailing lists](https://freshrss.org/announce-of-the-mailing-lists."
+"html)"
+msgstr ""
+"Sur [les listes de diffusion](https://freshrss.org/announce-of-the-mailing-"
+"lists.html)"
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:26
+msgid "At events / meetings around Free Software"
+msgstr "À des évènements / rencontres autour du Logiciel Libre"
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:26
+msgid "Over a beer in a bar"
+msgstr "Autour d'une bière dans un bar"
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:26
+msgid "Etc."
+msgstr "Etc."
+
+#. type: Title ##
+#: en/./developers/02_Github.md:27
+#, no-wrap
+msgid "Tips"
+msgstr "Conseils"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:30
+msgid "Here are some tips to help you present your bug report or suggestion:"
+msgstr ""
+"Voici quelques conseils pour bien présenter votre remontée de bug ou votre "
+"suggestion :"
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"**Pay attention to spelling**. Even if it's not always easy, try your best!"
+msgstr ""
+"**Faites attention à l'orthographe.** même si ce n'est pas toujours facile, "
+"faites votre maximum. ;)"
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"**Give an explicit title to your request**, even if it's a bit long. This "
+"not only helps us understand your request, but also to find your ticket "
+"later."
+msgstr ""
+"**Donnez un titre explicite à votre demande**, quitte à ce qu'il soit un peu "
+"long. Cela nous aide non seulement à comprendre votre demande, mais aussi à "
+"retrouver votre ticket plus tard."
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"**One request = one ticket.** You may have lots of ideas while being afraid "
+"to spam the bug manager: it doesn't matter. It's better to have a few too "
+"many tickets than too many requests in one. We'll close and consolidate "
+"requests when possible."
+msgstr ""
+"**Une demande = un ticket.** Vous pouvez avoir des tas d'idées mais vous "
+"avez peur de spammer le gestionnaire de bugs : ça ne fait rien. Il vaut "
+"mieux avoir un peu trop de tickets que trop de demandes dans un seul. On "
+"s'occupera de fermer et regrouper les demandes qui le peuvent."
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"If you report a bug, think about **providing us with the FreshRSS logs** "
+"(accessible in the FreshRSS `data/log/` folder) and the **PHP logs** (the "
+"location may vary by distribution, but consider searching in `/var/log/"
+"httpd` or `/var/log/apache`)."
+msgstr ""
+"Si vous remontez un bug, pensez à nous **fournir les logs de FreshRSS** "
+"(accessibles dans les dossier ''data/log/'' de FreshRSS) **et PHP** "
+"(l'emplacement peut varier selon les distributions, mais pensez à chercher "
+"dans ''/var/log/httpd'' ou ''/var/log/apache'')."
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"If you can't find the log files, specify it in your ticket so we know you've "
+"already searched."
+msgstr ""
+"Si vous ne trouvez pas les fichiers de logs, précisez-le dans votre ticket "
+"afin que nous sachions que vous avez déjà cherché."
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"Not all bugs require logs, but if you have any doubts, it is better to "
+"provide them to us. Logs are important and very useful for debugging!"
+msgstr ""
+"Tous les bugs ne nécessitent pas les logs, mais si vous doutez, mieux vaut "
+"nous les fournir. Les logs sont importants et très utiles pour débugguer !"
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"The logs may reveal confidential information, so **be careful not to "
+"disclose anything sensitive.**"
+msgstr ""
+"Il se peut que les logs puissent révéler des informations plus ou moins "
+"confidentielles, **faites attention à ne rien divulguer de sensible.**"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:41
+msgid ""
+"In addition, when facing a bug, you're encouraged to follow this message "
+"format (from the [Sam & Max website](http://sametmax.com/template-de-demande-"
+"daide-en-informatique/):"
+msgstr ""
+"De plus, face à un bug, je ne peux que vous encourager à suivre le format de "
+"message suivant (tiré du [site de Sam & Max](http://sametmax.com/template-de-"
+"demande-daide-en-informatique/)) :"
+
+#. type: Title ###
+#: en/./developers/02_Github.md:42
+#, no-wrap
+msgid "What's my goal?"
+msgstr "Quel est mon objectif ?"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:45
+msgid "Give the general context of what you were trying to do."
+msgstr "Donnez le contexte général de ce que vous essayiez de faire."
+
+#. type: Title ###
+#: en/./developers/02_Github.md:46
+#, no-wrap
+msgid "What have I been trying to do?"
+msgstr "Qu’est-ce que j’ai essayé de faire ?"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:49
+msgid ""
+"Explain step by step what you have done so that we can reproduce the bug."
+msgstr ""
+"Expliquez pas à pas ce que vous avez fait afin que nous puissions reproduire "
+"le bug."
+
+#. type: Title ###
+#: en/./developers/02_Github.md:50
+#, no-wrap
+msgid "What results have I achieved?"
+msgstr "Quels résultats ai-je obtenus ?"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:53
+msgid ""
+"The bug: what you see that shouldn't have happened. Here you can provide the "
+"logs."
+msgstr ""
+"Le bug : ce que vous voyez qui n'aurez pas dû se passer. Ici vous pouvez "
+"fournir les logs."
+
+#. type: Title ###
+#: en/./developers/02_Github.md:54
+#, no-wrap
+msgid "What was the expected result?"
+msgstr "Quel était le résultat attendu ?"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:57
+msgid "So that we understand what you consider to be the problem."
+msgstr ""
+"Afin que nous comprenions bien où est le problème... au moins selon vous :p"
+
+#. type: Title ###
+#: en/./developers/02_Github.md:58
+#, no-wrap
+msgid "What are my circumstances?"
+msgstr "Quelle est ma situation ?"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:61
+msgid "Remember to give the following information if you know it:"
+msgstr "Pensez à donner les informations suivantes si vous les connaissez :"
+
+#. type: Bullet: ' 1. '
+#: en/./developers/02_Github.md:67
+msgid "Which browser? Which version?"
+msgstr "Quel navigateur ? Quelle version ?"
+
+#. type: Bullet: ' 2. '
+#: en/./developers/02_Github.md:67
+msgid "Which server: Apache, Nginx? Which version?"
+msgstr "Quel serveur : Apache, Nginx ? Quelle version ?"
+
+#. type: Bullet: ' 3. '
+#: en/./developers/02_Github.md:67
+msgid "Which version of PHP?"
+msgstr "Quelle version de PHP ?"
+
+#. type: Bullet: ' 4. '
+#: en/./developers/02_Github.md:67
+msgid "Which database: SQLite, MySQL, MariaDB, PostgreSQL? Which version?"
+msgstr ""
+"Quelle base de données : SQLite, MySQL, MariaDB, PostgreSQL ? Quelle "
+"version ?"
+
+#. type: Bullet: ' 5. '
+#: en/./developers/02_Github.md:67
+msgid "Which distribution runs on the server? And... which version?"
+msgstr "Quelle distribution sur le serveur ? Et… quelle version ?"
+
+#. type: Title #
+#: en/./developers/02_Github.md:68
+#, no-wrap
+msgid "Branching"
+msgstr "Système de branches"
+
+#. type: Title ##
+#: en/./developers/02_Github.md:70
+#, no-wrap
+msgid "Basic"
+msgstr "Élémentaire"
+
+#. 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 ""
+"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 "<http://try.github.com/>"
+msgstr "<http://try.github.com/>"
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:77
+msgid "<http://sixrevisions.com/resources/git-tutorials-beginners/>"
+msgstr "<http://sixrevisions.com/resources/git-tutorials-beginners/>"
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:77
+msgid "<http://rogerdudler.github.io/git-guide/>"
+msgstr "<http://rogerdudler.github.io/git-guide/>"
+
+#. type: Title ##
+#: en/./developers/02_Github.md:78
+#, no-wrap
+msgid "Getting the latest code from the FreshRSS repository"
+msgstr "Obtenir le dernier code du répertoire FreshRSS"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:80
+msgid "First you need to add the official repo to your remote repo list:"
+msgstr ""
+"Vous devez avant tout ajouter le repo officiel à votre liste de repo remote :"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:80
+#, 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:"
+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
+#, no-wrap
+msgid "git remote -v show\n"
+msgstr "git remote -v show\n"
+
+#. 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 :"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:90
+#, no-wrap
+msgid ""
+"git checkout master\n"
+"git pull upstream master\n"
+msgstr ""
+"git checkout master\n"
+"git pull upstream master\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"
+
+#. 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: Title #
+#: en/./developers/02_Github.md:100
+#, no-wrap
+msgid "Sending a patch"
+msgstr "Proposer un patch"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:102
+#, no-wrap
+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 ""
+"# 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."
+
+#. type: Title ##
+#: en/./developers/02_Github.md:115
+#, 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:"
+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"
+
+#. type: Plain text
+#: en/./developers/02_Github.md:122
+msgid ""
+"If necessary, this can be followed by a blank line and a longer explanation."
+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/)."
+msgstr ""
+"Pour d'autres conseils, voir [ici](https://chris.beams.io/posts/git-commit/)."
+
+#. type: Title #
+#: en/./developers/03_Backend/02_Minz.md:1
+#, no-wrap
+msgid "Models"
+msgstr "Modèles"
+
+#. type: Title #
+#: en/./developers/03_Backend/02_Minz.md:5
+#, no-wrap
+msgid "Controllers and actions"
+msgstr "Contrôleurs et actions"
+
+#. type: Title ###
+#: en/./developers/03_Backend/02_Minz.md:9
+#: en/./developers/03_Backend/05_Extensions.md:69
+#, no-wrap
+msgid "Views"
+msgstr "Vues"
+
+#. type: Title ###
+#: en/./developers/03_Backend/02_Minz.md:13
+#: en/./developers/03_Backend/05_Extensions.md:39
+#, no-wrap
+msgid "Routing"
+msgstr "Routage"
+
+#. type: Title #
+#: en/./developers/03_Backend/02_Minz.md:17
+#, no-wrap
+msgid "Writing URL"
+msgstr "Écriture des URL"
+
+#. type: Title #
+#: en/./developers/03_Backend/02_Minz.md:21
+#: en/./developers/04_Frontend/01_View_files.md:13
+#, no-wrap
+msgid "Internationalisation"
+msgstr "Internationalisation"
+
+#. type: Title #
+#: en/./developers/03_Backend/02_Minz.md:25
+#, no-wrap
+msgid "Understanding internals"
+msgstr "Comprendres les mécanismes internes"
+
+#. 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: 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: Title #
+#: en/./developers/03_Backend/04_Changing_source_code.md:9
+#, no-wrap
+msgid "Authentication"
+msgstr "Gestion de l'authentification"
+
+#. type: Title #
+#: en/./developers/03_Backend/04_Changing_source_code.md:13
+#, no-wrap
+msgid "Logs"
+msgstr "Gestion des logs"
+
+#. type: Title #
+#: en/./developers/03_Backend/05_Extensions.md:1
+#, no-wrap
+msgid "Writing extensions for FreshRSS"
+msgstr "Écriture d'extensions pour FreshRSS"
+
+#. type: Title ##
+#: en/./developers/03_Backend/05_Extensions.md:3
+#, no-wrap
+msgid "About FreshRSS"
+msgstr "Présentation de FreshRSS"
+
+#. 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)."
+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:"
+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"
+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
+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: 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: '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: '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."
+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
+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/03_Backend/05_Extensions.md:25
+#, no-wrap
+msgid "Understanding basic mechanics (Minz and MVC)"
+msgstr "Comprendre les mécaniques de base (Minz et MVC)"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:28
+#, no-wrap
+msgid "**TODO** : move to 02_Minz.md\n"
+msgstr "**TODO** : bouger dans 02_Minz.md\n"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:30
+msgid ""
+"This data sheet should refer to the official FreshRSS and Minz documentation "
+"(the PHP framework on which FreshRSS is based). Unfortunately, this "
+"documentation does not yet exist. In a few words, here are the main things "
+"you should know. It is not necessary to read all the chapters in this "
+"section if you don't need to use a feature in your extension (if you don't "
+"need to translate your extension, no need to know more about the "
+"`Minz_Translate` module for example)."
+msgstr ""
+"Cette fiche technique devrait renvoyer vers la documentation officielle de "
+"FreshRSS et de Minz (le framework PHP sur lequel repose FreshRSS). "
+"Malheureusement cette documentation n'existe pas encore. Voici donc en "
+"quelques mots les principaux éléments à connaître. Il n'est pas nécessaire "
+"de lire l'ensemble des chapitres de cette section si vous n'avez pas à "
+"utiliser une fonctionnalité dans votre extension (si vous n'avez pas besoin "
+"de traduire votre extension, pas besoin d'en savoir plus sur le module "
+"`Minz_Translate` par exemple)."
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:31
+#, no-wrap
+msgid "MVC Architecture"
+msgstr "Architecture MVC"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:34
+msgid ""
+"Minz relies on and imposes an MVC architecture on projects using it. This "
+"architecture consists of three main components:"
+msgstr ""
+"Minz repose et impose une architecture MVC pour les projets l'utilisant. On "
+"distingue dans cette architecture trois composants principaux :"
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:38
+msgid ""
+"The model: this is the base object that we will manipulate. In FreshRSS, "
+"categories, flows and articles are templates. The part of the code that "
+"makes it possible to manipulate them in a database is also part of the model "
+"but is separated from the base model: we speak of DAO (for \"Data Access "
+"Object\"). The templates are stored in a `Models` folder."
+msgstr ""
+"Le Modèle : c'est l'objet de base que l'on va manipuler. Dans FreshRSS, les "
+"catégories, les flux et les articles sont des modèles. La partie du code qui "
+"permet de les manipuler en base de données fait aussi partie du modèle mais "
+"est séparée du modèle de base : on parle de DAO (pour « Data Access Object "
+"»). Les modèles sont stockés dans un répertoire `Models`."
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:38
+msgid ""
+"The view: this is what the user sees. The view is therefore simply HTML code "
+"mixed with PHP to display dynamic information. The views are stored in a "
+"`views` folder."
+msgstr ""
+"La Vue : c'est ce qui représente ce que verra l'utilisateur. La vue est donc "
+"simplement du code HTML que l'on mixe avec du PHP pour afficher les "
+"informations dynamiques. Les vues sont stockées dans un répertoire `views`."
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:38
+msgid ""
+"The controller: this is what makes it possible to link models and views. "
+"Typically, a controller will load templates from the database (like a list "
+"of items) to \"pass\" them to a view for display. Controllers are stored in "
+"a `Controllers` directory."
+msgstr ""
+"Le Contrôleur : c'est ce qui permet de lier modèles et vues entre eux. "
+"Typiquement, un contrôleur va charger des modèles à partir de la base de "
+"données (une liste d'articles par exemple) pour les « passer » à une vue "
+"afin qu'elle les affiche. Les contrôleurs sont stockés dans un répertoire "
+"`Controllers`."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:42
+msgid ""
+"In order to link a URL to a controller, first you have to go through a "
+"\"routing\" phase. In FreshRSS, this is particularly simple because it "
+"suffices to specify the name of the controller to load into the URL using a "
+"`c` parameter. For example, the address http://exemple.com?c=hello will "
+"execute the code contained in the `hello` controller."
+msgstr ""
+"Afin de lier une URL à un contrôleur, on doit passer par une phase dite de « "
+"routage ». Dans FreshRSS, cela est particulièrement simple car il suffit "
+"d'indiquer le nom du contrôleur à charger dans l'URL à l'aide d'un paramètre "
+"`c`. Par exemple, l'adresse http://exemple.com?c=hello va exécuter le code "
+"contenu dans le contrôleur `hello`."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:44
+msgid ""
+"One concept that has not yet been discussed is the \"actions\" system. An "
+"action is executed *on* a controller. Concretely, a controller is "
+"represented by a class and its actions by methods. To execute an action, it "
+"is necessary to specify an `a` parameter in the URL."
+msgstr ""
+"Une notion qui n'a pas encore été évoquée est le système d'« actions ». Une "
+"action est exécutée *sur* un contrôleur. Concrètement, un contrôleur va être "
+"représenté par une classe et ses actions par des méthodes. Pour exécuter une "
+"action, il est nécessaire d'indiquer un paramètre `a` dans l'URL."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:46
+#: en/./developers/03_Backend/05_Extensions.md:165
+msgid "Code example:"
+msgstr "Exemple de code :"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:47
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"class FreshRSS_hello_Controller extends Minz_ActionController {\n"
+"\tpublic function indexAction() {\n"
+"\t\t$this->view->a_variable = 'FooBar';\n"
+"\t}\n"
+"\n"
+"\tpublic function worldAction() {\n"
+"\t\t$this->view->a_variable = 'Hello World!';\n"
+"\t}\n"
+"}\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"class FreshRSS_hello_Controller extends Minz_ActionController {\n"
+"\tpublic function indexAction() {\n"
+"\t\t$this->view->a_variable = 'FooBar';\n"
+"\t}\n"
+"\n"
+"\tpublic function worldAction() {\n"
+"\t\t$this->view->a_variable = 'Hello World!';\n"
+"\t}\n"
+"}\n"
+"\n"
+"?>\n"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:64
+msgid ""
+"When loading the address http://exemple.com?c=hello&a=world, the `world` "
+"action is executed on the `hello` controller."
+msgstr ""
+"Si l'on charge l'adresse http://exemple.com?c=hello&a=world, l'action "
+"`world` va donc être exécutée sur le contrôleur `hello`."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:66
+msgid ""
+"Note: if `c` or `a` is not specified, the default value for each of these "
+"variables is `index`. So the address http://exemple.com?c=hello will execute "
+"the `index` action of the `hello` controller."
+msgstr ""
+"Note : si `c` ou `a` n'est pas précisée, la valeur par défaut de chacune de "
+"ces variables est `index`. Ainsi l'adresse http://exemple.com?c=hello va "
+"exécuter l'action `index` du contrôleur `hello`."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:68
+msgid ""
+"From now on, the `hello/world` naming convention will be used to refer to a "
+"controller/action pair."
+msgstr ""
+"Plus loin, sera utilisée la convention `hello/world` pour évoquer un couple "
+"contrôleur/action."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:72
+msgid ""
+"Each view is associated with a controller and an action. The view associated "
+"with `hello/world` will be stored in a very specific file: `views/hello/"
+"world. phtml`. This convention is imposed by Minz."
+msgstr ""
+"Chaque vue est associée à un contrôleur et à une action. La vue associée à "
+"`hello/world` va être stockée dans un fichier bien spécifique : `views/hello/"
+"world.phtml`. Cette convention est imposée par Minz."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:74
+msgid ""
+"As explained above, the views consist of HTML mixed with PHP. Code example:"
+msgstr ""
+"Comme expliqué plus haut, les vues sont du code HTML mixé à du PHP. Exemple "
+"de code :"
+
+#. type: Code fence info string
+#: en/./developers/03_Backend/05_Extensions.md:75
+#: en/./developers/03_Backend/05_Extensions.md:120
+#: en/./developers/03_Backend/05_Extensions.md:248
+#: en/./developers/03_Backend/05_Extensions.md:284
+#: en/./developers/03_Backend/05_Extensions.md:351
+#, no-wrap
+msgid "html"
+msgstr "html"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:75
+#, no-wrap
+msgid ""
+"<p>\n"
+"\tThis is a parameter passed from the controller: <?= $this->a_variable ?>\n"
+"</p>\n"
+msgstr ""
+"<p>\n"
+"\tPhrase passée en paramètre : <?= $this->a_variable ?>\n"
+"</p>\n"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:82
+#, no-wrap
+msgid "The variable `$this->a_variable` is passed by the controller (see previous example). The difference is that in the controller it is necessary to pass `$this->view`, while in the view `$this` suffices.\n"
+msgstr "La variable `$this->a_variable` a été passée précédemment par le contrôleur (voir exemple précédent). La différence est que dans le contrôleur il est nécessaire de passer par `$this->view` et que dans la vue `$this` suffit.\n"
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:83
+#, no-wrap
+msgid "Working with GET / POST"
+msgstr "Accéder aux paramètres GET / POST"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:87
+msgid ""
+"It is often necessary to take advantage of parameters passed by GET or POST. "
+"In Minz, these parameters are accessible using the `Minz_Request` class. "
+"Code example:"
+msgstr ""
+"Il est souvent nécessaire de profiter des paramètres passés par GET ou par "
+"POST. Dans Minz, ces paramètres sont accessibles de façon indistincts à "
+"l'aide de la classe `Minz_Request`. Exemple de code :"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:88
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"$default_value = 'foo';\n"
+"$param = Minz_Request::param('bar', $default_value);\n"
+"\n"
+"// Display the value of the parameter `bar` (passed via GET or POST)\n"
+"// or \"foo\" if the parameter does not exist.\n"
+"echo $param;\n"
+"\n"
+"// Sets the value of the `bar` parameter\n"
+"Minz_Request::_param('bar', 'baz');\n"
+"\n"
+"// Will necessarily display \"baz\" since we have just forced its value.\n"
+"// Note that the second parameter (default) is optional.\n"
+"echo Minz_Request::param('bar');\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"$default_value = 'foo';\n"
+"$param = Minz_Request::param('bar', $default_value);\n"
+"\n"
+"// Affichera la valeur du paramètre `bar` (passé via GET ou POST)\n"
+"// ou \"foo\" si le paramètre n'existe pas.\n"
+"echo $param;\n"
+"\n"
+"// Force la valeur du paramètre `bar`\n"
+"Minz_Request::_param('bar', 'baz');\n"
+"\n"
+"// Affichera forcément \"baz\" puisque nous venons de forcer sa valeur.\n"
+"// Notez que le second paramètre (valeur par défaut) est facultatif.\n"
+"echo Minz_Request::param('bar');\n"
+"\n"
+"?>\n"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:109
+msgid ""
+"The `Minz_Request::isPost()` method can be used to execute a piece of code "
+"only if it is a POST request."
+msgstr ""
+"La méthode `Minz_Request::isPost()` peut être utile pour n'exécuter un "
+"morceau de code que s'il s'agit d'une requête POST."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:111
+msgid ""
+"Note: it is preferable to use `Minz_Request` only in controllers. It is "
+"likely that you will encounter this method in FreshRSS views, or even in "
+"templates, but be aware that this is **not** good practice."
+msgstr ""
+"Note : il est préférable de n'utiliser `Minz_Request` que dans les "
+"contrôleurs. Il est probable que vous rencontriez cette méthode dans les "
+"vues de FreshRSS, voire dans les modèles, mais sachez qu'il ne s'agit "
+"**pas** d'une bonne pratique."
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:112
+#, no-wrap
+msgid "Access session settings"
+msgstr "Accéder aux paramètres de session"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:115
+msgid ""
+"The access to session parameters is strangely similar to the GET / POST "
+"parameters but passes through the `Minz_Session` class this time! There is "
+"no example here because you can repeat the previous example by changing all "
+"`Minz_Request` to `Minz_Session`."
+msgstr ""
+"L'accès aux paramètres de session est étrangement similaire aux paramètres "
+"GET / POST mais passe par la classe `Minz_Session` cette fois-ci ! Il n'y a "
+"pas d'exemple ici car vous pouvez reprendre le précédent en changeant tous "
+"les `Minz_Request` par des `Minz_Session`."
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:116
+#, no-wrap
+msgid "Working with URLs"
+msgstr "Gestion des URL"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:119
+msgid ""
+"To take full advantage of the Minz routing system, it is strongly "
+"discouraged to write hard URLs in your code. For example, the following view "
+"should be avoided:"
+msgstr ""
+"Pour profiter pleinement du système de routage de Minz, il est fortement "
+"déconseillé d'écrire les URL en dur dans votre code. Par exemple, la vue "
+"suivante doit être évitée :"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:120
+#, no-wrap
+msgid ""
+"<p>\n"
+"\tGo to page <a href=\"http://example.com?c=hello&amp;a=world\">Hello world</a>!\n"
+"</p>\n"
+msgstr ""
+"<p>\n"
+"\tAccéder à la page <a href=\"http://exemple.com?c=hello&amp;a=world\">Hello world</a>!\n"
+"</p>\n"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:127
+msgid ""
+"If one day it was decided to use a \"url rewriting\" system to have "
+"addresses in a http://exemple.com/controller/action format, all previous "
+"addresses would become ineffective!"
+msgstr ""
+"Si un jour il est décidé d'utiliser un système d'« url rewriting » pour "
+"avoir des adresses au format http://exemple.com/controller/action, toutes "
+"les adresses précédentes deviendraient ineffectives !"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:129
+msgid ""
+"So use the `Minz_Url` class and its `display()` method instead. `Minz_Url::"
+"display()` takes an array of the following form as its argument:"
+msgstr ""
+"Préférez donc l'utilisation de la classe `Minz_Url` et de sa méthode "
+"`display()`. `Minz_Url::display()` prend en paramètre un tableau de la forme "
+"suivante :"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:130
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"\t'params' => [\n"
+"\t\t'foo' => 'bar',\n"
+"\t],\n"
+"];\n"
+"\n"
+"// Show something like .?c=hello&amp;a=world&amp;foo=bar\n"
+"echo Minz_Url::display($url_array);\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"\t'params' => [\n"
+"\t\t'foo' => 'bar',\n"
+"\t],\n"
+"];\n"
+"\n"
+"// Affichera quelque chose comme .?c=hello&amp;a=world&amp;foo=bar\n"
+"echo Minz_Url::display($url_array);\n"
+"\n"
+"?>\n"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:148
+msgid ""
+"Since this can become a bit tedious to use in the long run, especially in "
+"views, it is preferable to use the `_url()` shortcut:"
+msgstr ""
+"Comme cela peut devenir un peu pénible à utiliser à la longue, surtout dans "
+"les vues, il est préférable d'utiliser le raccourci `_url()` :"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:149
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"// Displays the same as above\n"
+"echo _url('hello', 'world', 'foo', 'bar');\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"// Affichera la même chose que précédemment\n"
+"echo _url('hello', 'world', 'foo', 'bar');\n"
+"\n"
+"?>\n"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:159
+msgid ""
+"Note: as a general rule, the shortened form (`_url()`) should be used in "
+"views, while the long form (`Minz_Url::display()`) should be used in "
+"controllers."
+msgstr ""
+"Note : en règle générale, la forme raccourcie (`_url()`) doit être utilisée "
+"dans les vues tandis que la forme longue (`Minz_Url::display()`) doit être "
+"utilisée dans les contrôleurs."
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:160
+#, no-wrap
+msgid "Redirections"
+msgstr "Redirections"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:163
+msgid ""
+"It is often necessary to redirect a user to another page. To do so, the "
+"`Minz_Request` class offers another useful method: `forward()`. This method "
+"takes the same URL format as the one seen just before as its argument."
+msgstr ""
+"Il est souvent nécessaire de rediriger un utilisateur vers une autre page. "
+"Pour cela, la classe `Minz_Request` dispose d'une autre méthode utile : "
+"`forward()`. Cette méthode prend en argument le même format d'URL que celui "
+"vu juste avant."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:166
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"];\n"
+"\n"
+"// Tells Minz to redirect the user to the hello / world page.\n"
+"// Note that this is a redirection in the Minz sense of the term, not a redirection that the browser will have to manage (HTTP code 301 or 302)\n"
+"// The code that follows forward() will thus be executed!\n"
+"Minz_Request::forward($url_array);\n"
+"\n"
+"// To perform a type 302 redirect, add \"true\".\n"
+"// The code that follows will never be executed.\n"
+"Minz_Request::forward($url_array, true);\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"];\n"
+"\n"
+"// Indique à Minz de rediriger l'utilisateur vers la page hello/world.\n"
+"// Notez qu'il s'agit d'une redirection au sens Minz du terme, pas d'une redirection que le navigateur va avoir à gérer (code HTTP 301 ou 302)\n"
+"// Le code qui suit forward() va ainsi être exécuté !\n"
+"Minz_Request::forward($url_array);\n"
+"\n"
+"// Pour effectuer une redirection type 302, ajoutez \"true\".\n"
+"// Le code qui suivra ne sera alors jamais exécuté.\n"
+"Minz_Request::forward($url_array, true);\n"
+"\n"
+"?>\n"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:187
+msgid ""
+"It is very common to want display a message to the user while performing a "
+"redirect, to tell the user how the action was carried out (validation of a "
+"form for example). Such a message is passed through a `notification` session "
+"variable (note: we will talk about feedback from now on to avoid confusion "
+"with a notification that can occur at any time). To facilitate this kind of "
+"very frequent action, there are two shortcuts that both perform a 302 "
+"redirect by assigning a feedback message:"
+msgstr ""
+"Il est très fréquent de vouloir effectuer une redirection tout en affichant "
+"un message à l'utilisateur pour lui indiquer comment s'est déroulée l'action "
+"effectuée juste avant (validation d'un formulaire par exemple). Un tel "
+"message est passé par une variable de session `notification` (note : nous "
+"parlerons plutôt de « feedback » désormais pour éviter la confusion avec une "
+"notification qui peut survenir à tout moment). Pour faciliter ce genre "
+"d'action très fréquente, il existe deux raccourcis qui effectuent tout deux "
+"une redirection type 302 en affectant un message de feedback :"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:188
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"];\n"
+"$feedback_good = 'All went well!';\n"
+"$feedback_bad = 'Oops, something went wrong.';\n"
+"\n"
+"Minz_Request::good($feedback_good, $url_array);\n"
+"\n"
+"// or\n"
+"\n"
+"Minz_Request::bad($feedback_bad, $url_array);\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"];\n"
+"$feedback_good = 'Tout s\\'est bien passé !';\n"
+"$feedback_bad = 'Oups, quelque chose n\\'a pas marché.';\n"
+"\n"
+"Minz_Request::good($feedback_good, $url_array);\n"
+"\n"
+"// ou\n"
+"\n"
+"Minz_Request::bad($feedback_bad, $url_array);\n"
+"\n"
+"?>\n"
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:207
+#, no-wrap
+msgid "Translation Management"
+msgstr "Gestion de la traduction"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:210
+msgid ""
+"It is common (and that's an understatement) to want to show some text to the "
+"user. In the previous example, for example, we display feedback to the user "
+"based on the result of form validation. The problem is that FreshRSS has "
+"users of different nationalities. It is therefore necessary to be able to "
+"manage different languages in order not to remain confined to English or "
+"French."
+msgstr ""
+"Il est fréquent (et c'est un euphémisme) de vouloir afficher des phrases à "
+"l'utilisateur. Dans l'exemple précédent par exemple, nous affichions un "
+"feedback à l'utilisateur en fonction du résultat d'une validation de "
+"formulaire. Le problème est que FreshRSS possède des utilisateurs de "
+"différentes nationalités. Il est donc nécessaire de pouvoir gérer "
+"différentes langues pour ne pas rester cantonné à l'Anglais ou au Français."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:212
+msgid ""
+"The solution is to use the `Minz_Translate` class, which allows dynamic "
+"translation of FreshRSS (or any Minz-based application). Before using this "
+"module, it is necessary to know where to find the strings to be translated. "
+"Each language has its own subdirectory in a parent directory named `i18n`. "
+"For example, English language files are located in `i18n/fr/`. There are "
+"seven different files:"
+msgstr ""
+"La solution consiste à utiliser la classe `Minz_Translate` qui permet de "
+"traduire dynamiquement FreshRSS (ou toute application basée sur Minz). Avant "
+"d'utiliser ce module, il est nécessaire de savoir où trouver les chaînes de "
+"caractères à traduire. Chaque langue possède son propre sous-répertoire dans "
+"un répertoire parent nommé `i18n`. Par exemple, les fichiers de langue en "
+"Français sont situés dans `i18n/fr/`. Il existe sept fichiers différents :"
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`admin.php` for anything related to FreshRSS administration"
+msgstr ""
+"`admin.php` pour tout ce qui est relatif à l'administration de FreshRSS ;"
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`conf.php` for configuration"
+msgstr "`conf.php` pour l'aspect configuration ;"
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`feedback.php` contains translations of feedback messages"
+msgstr "`feedback.php` contient les traductions des messages de feedback ;"
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`gen.php` stores what is global to FreshRSS (gen for \"general\")"
+msgstr "`gen.php` stocke ce qui est global à FreshRSS (gen pour « general ») ;"
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`index.php` for the main page that lists feeds and the About page"
+msgstr ""
+"`index.php` pour la page principale qui liste les flux et la page « À propos "
+"» ;"
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`install.php` contains strings related FreshRSS installation"
+msgstr ""
+"`install.php` contient les phrases relatives à l'installation de FreshRSS ;"
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`sub.php` for subscription management (sub for \"subscription\")"
+msgstr ""
+"`sub.php` pour l'aspect gestion des abonnements (sub pour « subscription »)."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:222
+msgid ""
+"This organization makes it possible to avoid a single huge translation file."
+msgstr ""
+"Cette organisation permet de ne pas avoir un unique énorme fichier de "
+"traduction."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:224
+msgid ""
+"The translation files are quite simple: it's only a matter of returning a "
+"PHP table containing the translations. As an example, here's an extract from "
+"`app/i18n/fr/gen.php`:"
+msgstr ""
+"Les fichiers de traduction sont assez simples : il s'agit seulement de "
+"retourner un tableau PHP contenant les traductions. Extrait du fichier `app/"
+"i18n/fr/gen.php` :"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:225
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"return array(\n"
+"\t'action' => [\n"
+"\t\t'actualize' => 'Actualiser',\n"
+"\t\t'back_to_rss_feeds' => '← Retour à vos flux RSS',\n"
+"\t\t'cancel' => 'Annuler',\n"
+"\t\t'create' => 'Créer',\n"
+"\t\t'disable' => 'Désactiver',\n"
+"\t),\n"
+"\t'freshrss' => array(\n"
+"\t\t'_' => 'FreshRSS',\n"
+"\t\t'about' => 'À propos de FreshRSS',\n"
+"\t),\n"
+"];\n"
+"\n"
+"?>\n"
+msgstr ""
+"<?php\n"
+"\n"
+"return array(\n"
+"\t'action' => [\n"
+"\t\t'actualize' => 'Actualiser',\n"
+"\t\t'back_to_rss_feeds' => '← Retour à vos flux RSS',\n"
+"\t\t'cancel' => 'Annuler',\n"
+"\t\t'create' => 'Créer',\n"
+"\t\t'disable' => 'Désactiver',\n"
+"\t),\n"
+"\t'freshrss' => array(\n"
+"\t\t'_' => 'FreshRSS',\n"
+"\t\t'about' => 'À propos de FreshRSS',\n"
+"\t),\n"
+"];\n"
+"\n"
+"?>\n"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:247
+msgid ""
+"To access these translations, `Minz_Translate` will help us with its "
+"`Minz_Translate::t()` method. As this can be a bit long to type, a shortcut "
+"has been introduced that **must** be used in all circumstances: `_t()`. "
+"Code example:"
+msgstr ""
+"Pour accéder à ces traductions, `Minz_Translate` va nous aider à l'aide de "
+"sa méthode `Minz_Translate::t()`. Comme cela peut être un peu long à taper, "
+"il a été introduit un raccourci qui **doit** être utilisé en toutes "
+"circonstances : `_t()`. Exemple de code :"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:248
+#, no-wrap
+msgid ""
+"<p>\n"
+"\t<a href=\"<?= _url('index', 'index') ?>\">\n"
+"\t\t<?= _t('gen.action.back_to_rss_feeds') ?>\n"
+"\t</a>\n"
+"</p>\n"
+msgstr ""
+"<p>\n"
+"\t<a href=\"<?= _url('index', 'index') ?>\">\n"
+"\t\t<?= _t('gen.action.back_to_rss_feeds') ?>\n"
+"\t</a>\n"
+"</p>\n"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:257
+msgid ""
+"The string to pass to the `_t()` function consists of a series of "
+"identifiers separated by dots. The first identifier indicates from which "
+"file to extract the translation (in this case, `gen.php`), while the "
+"following ones indicate table entries. Thus `action` is an entry of the main "
+"array and `back_to_rss_feeds` is an entry of the `action` array. This allows "
+"us to further organize our translation files."
+msgstr ""
+"La chaîne à passer à la fonction `_t()` consiste en une série d'identifiants "
+"séparés par des points. Le premier identifiant indique de quel fichier on "
+"veut extraire la traduction (dans notre cas présent, de `gen.php`), tandis "
+"que les suivantes indiquent des entrées de tableaux. Ainsi `action` est une "
+"entrée du tableau principal et `back_to_rss_feeds` est une entrée du tableau "
+"`action`. Cela permet d'organiser encore un peu plus nos fichiers de "
+"traduction."
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:259
+msgid ""
+"There is a small special case that sometimes makes life easier: the `_` "
+"identifier. This must necessarily be present at the end of the chain and "
+"gives a value to the higher-level identifier. It's pretty hard to explain "
+"but very simple to understand. In the example given above, a `_` is "
+"associated with the value `FreshRSS`: this means that there is no need to "
+"write `_t('gen.freshrss._')` but `_t('gen.freshrss')` suffices."
+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
+#, 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."
+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
+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/03_Backend/05_Extensions.md:268
+#, no-wrap
+msgid "Basic files and folders"
+msgstr "Les fichiers et répertoires de base"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:273
+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/03_Backend/05_Extensions.md:275
+msgid ""
+"The main directory of an extension must contain at least two **mandatory** "
+"files:"
+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."
+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
+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`."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:284
+msgid ""
+"In the file `freshrss/extensions/xExtension-HelloWorld/extension.php` you "
+"need the structure:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:284
+#, no-wrap
+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:292
+msgid ""
+"There is an example HelloWorld extension that you can download from [our "
+"GitHub repo](https://github.com/FreshRSS/xExtension-HelloWorld)."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:294
+msgid ""
+"You may also need additional files or subdirectories depending on your needs:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:300
+msgid ""
+"`configure.phtml` is the file containing the form to parameterize your "
+"extension"
+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)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:300
+msgid "A `Controllers` directory containing additional controllers"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:300
+msgid "An `i18n` directory containing additional translations"
+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"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:302
+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:303
+#, no-wrap
+msgid "The metadata.json file"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:306
+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:313
+msgid "`name`: the name of your extension"
+msgstr "`name` : le nom de votre extension ;"
+
+#. 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"
+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: 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: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:313
+msgid ""
+"`entrypoint`: Indicates the entry point of your extension. It must match the "
+"name of the class contained in the file `extension.php` without the suffix` "
+"Extension` (so if the entry point is `HelloWorld`, your class will be "
+"called` HelloWorldExtension`)"
+msgstr ""
+"`entrypoint` : indique le point d'entrée de votre extension. Il doit "
+"correspondre au nom de la classe contenue dans le fichier `extension.php` "
+"sans le suffixe `Extension` (donc si le point d'entrée est `HelloWorld`, "
+"votre classe s'appellera `HelloWorldExtension`) ;"
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:313
+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."
+
+#. 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 »"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:319
+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:321
+msgid "A __system__ extension in comparison is enabled for every account."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:322
+#, no-wrap
+msgid "Writing your own extension.php"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:327
+msgid ""
+"This file is the entry point of your extension. It must contain a specific "
+"class to function. As mentioned above, the name of the class must be your "
+"`entrypoint` suffixed by` Extension` (`HelloWorldExtension` for example). "
+"In addition, this class must be inherited from the `Minz_Extension` class to "
+"benefit from extensions-specific methods."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:329
+msgid "Your class will benefit from four methods to redefine:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:334
+msgid ""
+"`install()` is called when a user clicks the button to activate your "
+"extension. It allows, for example, to update the database of a user in order "
+"to make it compatible with the extension. It returns `true` if everything "
+"went well or, if not, a string explaining the problem."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:334
+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."
+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."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:334
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:336
+msgid ""
+"In addition, you will have a number of methods directly inherited from "
+"`Minz_Extension` that you should not redefine:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:340
+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()`."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:340
+msgid ""
+"`getFileUrl($filename, $type)` will return the URL to a file in the `static` "
+"directory. The first parameter is the name of the file (without `static /`), "
+"the second is the type of file to be used (`css` or` js`)."
+msgstr ""
+
+#. 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` "
+"<base_name>Controller.php` and the name of the "
+"`FreshExtension_<base_name>_Controller` class."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:346
+msgid "`registerViews()`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:346
+msgid "`registerTranslates()`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:346
+msgid "`registerHook($hook_name, $hook_function)`"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:347
+#, no-wrap
+msgid "The \"hooks\" system"
+msgstr "Le système « hooks »"
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:350
+msgid ""
+"You can register at the FreshRSS event system in an extensions `init()` "
+"method, to manipulate data when some of the core functions are executed."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:351
+#, 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('<h1>Hello World</h1>' . $entry->content());\n"
+"\t\treturn $entry;\n"
+"\t}\n"
+"}\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:365
+msgid "The following events are available:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:376
+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:376
+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:376
+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:376
+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:376
+msgid ""
+"`menu_admin_entry` (`function() -> string`): add an entry at the end of the "
+"\"Administration\" menu, the returned string must be valid HTML (e.g. `<li "
+"class=\"item active\"><a href=\"url\">New entry</a></li>`)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:376
+msgid ""
+"`menu_configuration_entry` (`function() -> string`): add an entry at the end "
+"of the \"Configuration\" menu, the returned string must be valid HTML (e.g. "
+"`<li class=\"item active\"><a href=\"url\">New entry</a></li>`)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:376
+msgid ""
+"`menu_other_entry` (`function() -> string`): add an entry at the end of the "
+"header dropdown menu (i.e. after the \"About\" entry), the returned string "
+"must be valid HTML (e.g. `<li class=\"item active\"><a href=\"url\">New "
+"entry</a></li>`)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:376
+msgid ""
+"`nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** "
+"add documentation"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:376
+msgid "`post_update` (`function(none) -> none`): **TODO** add documentation"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:376
+msgid ""
+"`simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** "
+"add documentation"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:377
+#, no-wrap
+msgid "Writing your own configure.phtml"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:380
+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/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"
+
+#. 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:4
+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: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
+#, no-wrap
+msgid "Check the dev status"
+msgstr "S'assurer de l'état de dev"
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:10
+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: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: Title #
+#: en/./developers/05_Release_new_version.md:13
+#, no-wrap
+msgid "Git process"
+msgstr "Processus Git"
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:15
+#, no-wrap
+msgid ""
+"$ git checkout master\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 master\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:27
+#, no-wrap
+msgid "Updating `update.freshrss.org`"
+msgstr "Mise à jour de update.freshrss.org"
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:30
+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:32
+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:33
+#, no-wrap
+msgid "Writing the update script"
+msgstr "Écriture du script de mise à jour"
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:36
+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 `master` 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 `master` (ce "
+"script ne doit pas inclure de code spécifique à une version particulière !) "
+"et `update_util.php` contenant une liste de fonctions utiles à tous les "
+"scripts."
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:38
+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: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
+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:46
+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:46
+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: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()`) ;"
+
+#. 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)."
+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:47
+#, no-wrap
+msgid "Updating the versions file"
+msgstr "Mise à jour du fichier de versions"
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:50
+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:52
+msgid "Here's an example of a `versions.php` file:"
+msgstr "Voici un exemple de fichier `versions.php` :"
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:53
+#, no-wrap
+msgid ""
+"<?php\n"
+"return array(\n"
+"\t// STABLE\n"
+"\t'0.8.0' => '1.0.0',\n"
+"\t'0.8.1' => '1.0.0',\n"
+"\t'1.0.0' => '1.0.1', // 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 ""
+"<?php\n"
+"return array(\n"
+"\t// STABLE\n"
+"\t'0.8.0' => '1.0.0',\n"
+"\t'0.8.1' => '1.0.0',\n"
+"\t'1.0.0' => '1.0.1', // 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: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 `master`;"
+msgstr "les versions `x.y.z-dev` sont **toutes** mises à jour vers `master` ;"
+
+#. 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
+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: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."
+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:76
+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:77
+#, no-wrap
+msgid "Deployment"
+msgstr "Déploiement"
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:80
+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:82
+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:83
+#, no-wrap
+msgid "Updating the FreshRSS services"
+msgstr "Mise à jour des services FreshRSS"
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:86
+msgid "Two services need to be updated immediately after the update."
+msgstr ""
+"Deux services sont à mettre à jour immédiatement après la mise à jour de "
+"update.freshrss.org :"
+
+#. type: Bullet: '* '
+#: en/./developers/05_Release_new_version.md:89
+msgid "rss.freshrss.org;"
+msgstr "rss.freshrss.org ;"
+
+#. 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: Title #
+#: en/./developers/05_Release_new_version.md:90
+#, no-wrap
+msgid "Publicly announce the release"
+msgstr "Annoncer publiquement la sortie"
+
+#. 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!"
+msgstr ""
+"Lorsque tout fonctionne, il est temps d'annoncer la sortie au monde entier !"
+
+#. type: Bullet: '* '
+#: en/./developers/05_Release_new_version.md:98
+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: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))"
+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: Title #
+#: en/./developers/05_Release_new_version.md:99
+#, no-wrap
+msgid "Starting the next development version"
+msgstr "Lancer la prochaine version de développement"
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:101
+#, no-wrap
+msgid ""
+"$ git checkout master\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 master\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:110
+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: Plain text
+#: en/./index.md:2
+msgid "![FreshRSS logo](img/logo_freshrss.png)"
+msgstr "![Logo de FreshRSS](img/logo_freshrss.png)"
+
+#. type: Plain text
+#: en/./index.md:4
+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:6
+msgid "FreshRSS has a lot of features including:"
+msgstr ""
+"FreshRSS a été conçu comme un agrégateur puissant et propose des tas de "
+"fonctionnalités :"
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+msgid "RSS and Atom aggregation"
+msgstr "Agrégation des flux RSS et Atom."
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+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:18
+msgid "Filter and search functionality helps to easily find articles"
+msgstr ""
+"Le système de filtrage et de recherche permettent de cibler exactement les "
+"articles que vous souhaitez lire."
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+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: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: '* '
+#: 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: Bullet: '* '
+#: en/./index.md:18
+msgid ""
+"The application is \"responsive,\" which means it adapts to small screens so "
+"you can bring articles in your pocket"
+msgstr ""
+"« *Responsive design* » : l’application s’adapte aux petits écrans pour "
+"emporter FreshRSS dans votre poche."
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+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"
+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 :"
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+msgid ""
+"[User documentation](./users/02_First_steps.html), where you can discover "
+"all the possibilities offered by FreshRSS"
+msgstr ""
+"La [documentation utilisateurs](./users/02_First_steps.md) pour découvrir "
+"les fonctionnalités de FreshRSS."
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+msgid ""
+"[Administrator documentation](./admins/01_Index.html) for detailed "
+"installation and maintenance related tasks"
+msgstr ""
+"La [documentation administrateurs](../en/admins/01_Installation.md) (en "
+"anglais) pour l’installation et la maintenance de FreshRSS."
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+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"
+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
+msgid ""
+"[Contributor guidelines](./contributing.md) for those who want to help "
+"improve FreshRSS"
+msgstr ""
+"Le [guide de contribution](./contributing.md) pour nous aider à développer "
+"FreshRSS."
+
+#. type: Plain text
+#: en/./users/02_First_steps.md:2
+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."
+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."
+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
+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
+msgid ""
+"Once you have added your feeds to FreshRSS, it is time to read them. There "
+"are three availalbe 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: '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"
+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"
+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
+msgid ""
+"[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/./users/02_First_steps.md:18
+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:"
+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)"
+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)"
+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)"
+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: '* '
+#: en/./users/02_First_steps.md:27
+msgid ""
+"[Filter articles](03_Main_view.md#filtering-articles) for a fast access to a "
+"selection"
+msgstr ""
+"[Filtrez les articles](03_Main_view.md#filtrer-les-articles) pour accéder "
+"rapidement à ceux que vous voulez lire en priorité"
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+msgid ""
+"[Search an article](03_Main_view.md#searching-articles) 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/./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: Title #
+#: en/./users/03_Main_view.md:1
+#, no-wrap
+msgid "Normal view"
+msgstr "La vue normale"
+
+#. type: Title #
+#: en/./users/03_Main_view.md:5
+#, no-wrap
+msgid "Global view"
+msgstr "La vue globale"
+
+#. type: Title #
+#: en/./users/03_Main_view.md:9
+#, no-wrap
+msgid "Reader view"
+msgstr "La vue lecture"
+
+#. type: Title #
+#: en/./users/03_Main_view.md:13
+#, no-wrap
+msgid "Refreshing feeds"
+msgstr "Rafraîchir les flux"
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:16
+msgid ""
+"To take full advantage of FreshRSS, it needs to retrieve new items from the "
+"feeds you have subscribed to. There are several ways to do this."
+msgstr ""
+"Pour profiter pleinement de FreshRSS, il faut qu’il récupère les nouveaux "
+"articles disponibles des flux auxquels vous avez souscrit. Pour cela, il "
+"existe plusieurs méthodes."
+
+#. type: Title ##
+#: en/./users/03_Main_view.md:17
+#, no-wrap
+msgid "Automatic update"
+msgstr "Mise à jour automatique"
+
+#. 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."
+msgstr ""
+"C’est la méthode recommandée car il n’y a pas besoin d’y penser, elle se "
+"fait toute seule, à la fréquence que vous avez choisi."
+
+#. type: Title ###
+#: en/./users/03_Main_view.md:21
+#, no-wrap
+msgid "With the actualize_script.php script"
+msgstr "Par le script actualize_script.php"
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:24
+msgid ""
+"This method is only available if you have access to the scheduled tasks of "
+"the machine on which your FreshRSS instance is installed."
+msgstr ""
+"Cette méthode n’est possible que si vous avez accès aux tâches planifiées de "
+"la machine sur laquelle est installée votre instance de FreshRSS."
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:26
+msgid ""
+"The script is named *actualize_script.php* and is located in the *app* "
+"folder. The scheduled task syntax will not be explained here. However, here "
+"is [a quick introduction to crontab](http://www.adminschoice.com/crontab-"
+"quick-reference/) that might help you."
+msgstr ""
+"Le script qui permet de mettre à jour les articles s’appelle "
+"*actualize_script.php* et se trouve dans le répertoire *app* de votre "
+"instance de FreshRSS. La syntaxe des tâches planifiées ne sera pas expliqué "
+"ici, cependant voici [une introduction rapide à crontab](http://www."
+"adminschoice.com/crontab-quick-reference/) qui peut vous aider."
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:28
+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: Code fence info string
+#: en/./users/03_Main_view.md:29 en/./users/03_Main_view.md:61
+#: en/./users/03_Main_view.md:79 en/./users/03_Main_view.md:85
+#: en/./users/03_Main_view.md:93
+#, no-wrap
+msgid "cron"
+msgstr "cron"
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:29
+#, no-wrap
+msgid "0 * * * * php /path/to/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log 2>&1\n"
+msgstr "0 * * * * php /chemin/vers/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log 2>&1\n"
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:34
+msgid ""
+"Special parameters to configure the script - all parameters can be combined:"
+msgstr ""
+"« Paramètres de configuration du script; Ils sont utilisables "
+"simultanément : »"
+
+#. 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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:42
+msgid ""
+"- Parameter \"ajax\" https://freshrss.example.net/i/?"
+"c=feed&a=actualize&ajax=1 Only a status site is returned and not a complete "
+"website. Example: \"OK\""
+msgstr ""
+
+#. type: 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\"."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:50
+msgid ""
+"- Parameter \"token\" https://freshrss.example.net/i/?"
+"c=feed&a=actualize&token=542345872345734 Security parameter to prevent "
+"unauthorized refreshes. For detailed Documentation see \"Form authentication"
+"\"."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/03_Main_view.md:51
+#, no-wrap
+msgid "Online cron"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:54
+msgid ""
+"If you do not have access to the installation server scheduled task, you can "
+"still automate the update process."
+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."
+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
+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 :"
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:61
+#, no-wrap
+msgid "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
+msgstr "0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'\n"
+
+#. type: Title ###
+#: en/./users/03_Main_view.md:65
+#, no-wrap
+msgid "Form authentication"
+msgstr "Authentification par formulaire"
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:68
+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”)."
+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)"
+msgstr ""
+"![Configuration de l’accès anonymes](../img/users/anonymous_access.1.png)"
+
+#. 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."
+msgstr ""
+"L’url précédente devient donc accessible à n’importe qui et vous pouvez "
+"utiliser la tâche cron de la partie précédente."
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:74
+msgid ""
+"You can also configure an authentication token to grant special access on "
+"the server."
+msgstr ""
+"Vous pouvez aussi configurer un jeton d’authentification pour accorder un "
+"droit spécial sur votre serveur."
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:76
+msgid "![Token configuration](../img/users/token.1.png)"
+msgstr "![Configuration du token](../img/users/token.1.png)"
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:78
+msgid "The scheduled task syntax should look as follows:"
+msgstr "La tâche cron à utiliser sera de la forme suivante :"
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:79
+#, 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
+msgid ""
+"You can also target a different user by adding their username to the query "
+"string, with `&user=insert-username`:"
+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
+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 !**"
+
+#. 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: 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."
+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: Plain text
+#: en/./users/03_Main_view.md:104
+msgid ""
+"This update occurs on all feeds. To trigger it, simply click on the update "
+"link in the navigation menu."
+msgstr ""
+"Cette mise à jour se fait pour l’ensemble des flux de l’instance. Pour "
+"initier cette mise à jour, il suffit de cliquer sur le lien de mise à jour "
+"disponible dans le menu de navigation."
+
+#. type: Plain text
+#: en/./users/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
+msgid ""
+"When the update starts, a progress bar appears and changes while feeds are "
+"processed."
+msgstr ""
+"Lorsque la mise à jour démarre, une barre de progression apparait et "
+"s’actualise au fur et à mesure de la récupération des articles."
+
+#. type: Plain text
+#: en/./users/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
+msgid ""
+"This update occurs on the selected feed only. To trigger it, simply click on "
+"the update link in the feed menu."
+msgstr ""
+"Cette mise à jour se fait pour le flux sélectionné uniquement. Pour initier "
+"cette mise à jour, il suffit de cliquer sur le lien de mise à jour "
+"disponible dans le menu du flux."
+
+#. type: Plain text
+#: en/./users/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: Plain text
+#: en/./users/03_Main_view.md:120
+msgid ""
+"When the number of articles stored by FreshRSS inevitably grows larger, it's "
+"important to use efficient filters to display only a subset of the articles. "
+"There are several methods that filter with different criteria. Usually those "
+"methods can be combined."
+msgstr ""
+"Avec le nombre croissant d’articles stockés par FreshRSS, il devient "
+"important d’avoir des filtres efficaces pour n’afficher qu’une partie des "
+"articles. Il existe plusieurs méthodes qui filtrent selon des critères "
+"différents. Ces méthodes peuvent être combinées dans la plus part des cas."
+
+#. type: Title ##
+#: en/./users/03_Main_view.md:121
+#, no-wrap
+msgid "By category"
+msgstr "Par catégorie"
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:124
+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/03_Main_view.md:127
+msgid ""
+"*Main feed* displays only articles from feeds marked as available in that "
+"category"
+msgstr ""
+"*Flux principal* qui affiche uniquement les articles des flux marqués comme "
+"visible dans cette catégorie"
+
+#. type: Bullet: ' * '
+#: en/./users/03_Main_view.md:127
+msgid "*Favourites* displays only articles marked as favourites"
+msgstr ""
+"*Favoris* qui affiche uniquement les articles, tous flux confondus, marqués "
+"comme favoris"
+
+#. type: Title ##
+#: en/./users/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"
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:142
+msgid ""
+"Each article has two attributes that can be combined. The first attribute "
+"indicates whether or not the article has been read. The second attribute "
+"indicates if the article was marked as favorite or not."
+msgstr ""
+"Chaque article possède deux attributs qui peuvent être combinés. Le premier "
+"attribut indique si l’article a été lu ou non. Le second attribut indique si "
+"l’article a été noté comme favori ou non."
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:144
+msgid ""
+"In version 0.7, attribute filters are available in the article display "
+"dropdown list. With this version, it's not possible to combine filters. For "
+"instance, it's not possible to display only read and favorite articles."
+msgstr ""
+"Dans la version 0.7.x, les filtres sur les attributs sont accessibles depuis "
+"la liste déroulante qui gère l’affichage des articles. Dans cette version, "
+"il n’est pas possible de combiner les filtres. Par exemple, on ne peut pas "
+"afficher les articles lus qui ont été notés comme favori."
+
+#. type: Plain text
+#: en/./users/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: 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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:150
+msgid "![Attribute filters in 0.8](../img/users/status.filter.0.8.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:152
+msgid "By default, this filter displays only unread articles"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/03_Main_view.md:153
+#, no-wrap
+msgid "By content"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:156
+msgid ""
+"It is possible to filter articles by their content by inputting a string in "
+"the search field."
+msgstr ""
+
+#. 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:"
+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é'`"
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:199
+#, no-wrap
+msgid ""
+"* by date of discovery, using the [ISO 8601 time interval format](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals): `date:<date-interval>`\n"
+"\t* From a specific day, or month, or year:\n"
+"\t\t* `date:2014-03-30`\n"
+"\t\t* `date:2014-03` or `date:201403`\n"
+"\t\t* `date:2014`\n"
+"\t* From a specific time of a given day:\n"
+"\t\t* `date:2014-05-30T13`\n"
+"\t\t* `date:2014-05-30T13:30`\n"
+"\t* Between two given dates:\n"
+"\t\t* `date:2014-02/2014-04`\n"
+"\t\t* `date:2014-02--2014-04`\n"
+"\t\t* `date:2014-02/04`\n"
+"\t\t* `date:2014-02-03/05`\n"
+"\t\t* `date:2014-02-03T22:00/22:15`\n"
+"\t\t* `date:2014-02-03T22:00/15`\n"
+"\t* After a given date:\n"
+"\t\t* `date:2014-03/`\n"
+"\t* Before a given date:\n"
+"\t\t* `date:/2014-03`\n"
+"\t* For a specific duration after a given date:\n"
+"\t\t* `date:2014-03/P1W`\n"
+"\t* For a specific duration before a given date:\n"
+"\t\t* `date:P1W/2014-05-25T23:59:59`\n"
+"\t* For the past duration before now (the trailing slash is optional):\n"
+"\t\t* `date:P1Y/` or `date:P1Y` (past year)\n"
+"\t\t* `date:P2M/` (past two months)\n"
+"\t\t* `date:P3W/` (past three weeks)\n"
+"\t\t* `date:P4D/` (past four days)\n"
+"\t\t* `date:PT5H/` (past five hours)\n"
+"\t\t* `date:PT30M/` (past thirty minutes)\n"
+"\t\t* `date:PT90S/` (past ninety seconds)\n"
+"\t\t* `date:P1DT1H/` (past one day and one hour)\n"
+"* by date of publication, using the same format: `pubdate:<date-interval>`\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:201
+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/03_Main_view.md:204
+msgid ""
+"Some operators can be used negatively, to exclude articles, with the same "
+"syntax as above, but prefixed by a `!` or `-`: `-author:name`, `-intitle:"
+"keyword`, `-inurl:keyword`, `-#tag`, `!keyword`."
+msgstr ""
+"Certains opérateurs peuvent être utilisé négativement, pour exclure des "
+"articles, avec la même syntaxe que ci-dessus, mais préfixé par `!` ou `-` :`-"
+"author:nom`, `-intitle:mot`, `-inurl:mot`, `-#tag`, `!mot`."
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:206
+msgid ""
+"It is also possible to combine keywords to create a more precise filter. For "
+"example, you can enter multiple instances of `author:`, `intitle:`, `inurl:"
+"`, `#`, and free-text."
+msgstr ""
+"Il est également possible de combiner les mots-clefs pour faire un filtrage "
+"encore plus précis, et il est autorisé d’avoir plusieurs instances de : "
+"`author:`, `intitle:`, `inurl:`, `#`, et texte libre."
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:208
+msgid ""
+"Combining several search criteria implies a logical *and*, but the keyword ` "
+"OR ` can be used to combine several search criteria with a logical *or* "
+"instead: `author:Dupont OR author:Dupond`"
+msgstr ""
+"Combiner plusieurs critères implique un *et* logique, mais le mot clef ` OR "
+"` peut être utiliser pour combiner plusieurs critères avec un *ou* logique :"
+"`author:Dupont OR author:Dupond`"
+
+#. type: 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"
+
+#. type: Title #
+#: en/./users/04_Subscriptions.md:9
+#, no-wrap
+msgid "Use bookmarklet"
+msgstr "Utiliser le « bookmarklet »"
+
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:12
+msgid ""
+"Bookmarklets are little scripts that you can execute to perform various "
+"tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds."
+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\"."
+
+#. type: Bullet: ' 2. '
+#: en/./users/04_Subscriptions.md:16
+msgid "Click on \"Subscription tools\"."
+msgstr "Cliquez sur \"Outils d'abonnement\"."
+
+#. type: Bullet: ' 3. '
+#: en/./users/04_Subscriptions.md:16
+msgid ""
+"Drag the \"Subscribe\" button to your bookmark toolbar or right click and "
+"choose your browser's \"Bookmark link\" action."
+msgstr ""
+"Glissez le bouton \"S'abonner\" dans la barre d'outils des signets ou "
+"cliquez droit et choisissez l'action \"Lien vers les signets\" de votre "
+"navigateur."
+
+#. type: Title #
+#: en/./users/04_Subscriptions.md:17
+#, no-wrap
+msgid "Feed management"
+msgstr "Organisation des flux"
+
+#. type: Title #
+#: en/./users/05_Configuration.md:2
+#, no-wrap
+msgid "Display"
+msgstr "Personnaliser la vue"
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:4
+#, no-wrap
+msgid "Language"
+msgstr "Langue"
+
+#. 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)."
+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)."
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:11
+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."
+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: cz, de, en, es, fr, he, it, kr, nl, oc, pt-br, ru, "
+"tr, zh-cn."
+msgstr ""
+"Les langues disponibles sont : cz, de, en, es, fr, he, it, kr, nl, oc, pt-"
+"br, ru, tr, zh-cn."
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:14
+#, no-wrap
+msgid "Theme"
+msgstr "Thème"
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:17
+msgid ""
+"There's no accounting for tastes, which is why FreshRSS offers eight "
+"official themes:"
+msgstr ""
+"Les goûts et les couleurs, ça ne se discute pas. C'est pourquoi FreshRSS "
+"propose huit thèmes officiels :"
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Blue Lagoon* by **Mister aiR**"
+msgstr "*Blue Lagoon* par **Mister aiR**"
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Dark* by **AD**"
+msgstr "*Dark* par **AD**"
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Flat design* by **Marien Fressinaud**"
+msgstr "*Flat design* par **Marien Fressinaud**"
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Origine* by **Marien Fressinaud**"
+msgstr "*Origine* par **Marien Fressinaud**"
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Origine-compact* by **Kevin Papst**"
+msgstr "*Origine-compact* par **Kevin Papst**"
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Pafat* by **Plopoyop**"
+msgstr "*Pafat* par **Plopoyop**"
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Screwdriver* by **Mister aiR**"
+msgstr "*Screwdriver* par **Mister aiR**"
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Swage* by **Patrick Crandol**"
+msgstr "*Swage* par **Patrick Crandol**"
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:28
+msgid ""
+"If you can't find any themes you like, it's always possible to [create your "
+"own](../developers/04_Frontend/02_Design.md)."
+msgstr ""
+"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
+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 ""
+"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
+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 ""
+"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: Bullet: ' * '
+#: en/./users/05_Configuration.md:39
+msgid "**No limit** displays the content on 100% of the available space"
+msgstr ""
+"**Pas de limite** qui affiche le contenu sur 100% de la place disponible"
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:40
+#, 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."
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:45
+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/./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."
+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: Plain text
+#: en/./users/05_Configuration.md:52
+msgid ""
+"If you disable every item in the top line, you'll still be able to see it "
+"since it contains the feed name and the article title. But if you do the "
+"same thing for the bottom line, it will be empty."
+msgstr ""
+"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
+#, no-wrap
+msgid "HTML5 notification timout"
+msgstr "Temps d'affichage de la notification HTML5"
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:56
+msgid ""
+"After automatically updating the feeds, FreshRSS can pop up a notification "
+"using the HTML5 notification API."
+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
+msgid ""
+"The duration of this notification can be set. By default, the value is 0."
+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
+#, no-wrap
+msgid "Show the navigation button"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:62
+msgid ""
+"By default, FreshRSS displays buttons to ease the article navigation when "
+"browsing on mobile. The drawback is that they eat up some precious space."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:64
+msgid ""
+"![navigation button configuration](../img/users/configuration.navigation."
+"button.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:66
+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"
+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: Plain text
+#: en/./users/05_Configuration.md:78
+msgid ""
+"To make your life easier, you can share articles straight from FreshRSS."
+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.)."
+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)"
+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:"
+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."
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:90
+msgid "Press the ```✚``` button to add it to the list."
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:90
+msgid ""
+"Configure the method in the list. All names can be modified in the display. "
+"Some methods need the sharing URL to be able to work properly (ex: Shaarli)."
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:90 en/./users/05_Configuration.md:95
+msgid "Submit your changes."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:92
+msgid "To remove an item from the list, follow those simple steps:"
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:95
+msgid "Press the ```❌``` button next to the share method you want to remove."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:96
+#, no-wrap
+msgid "Shortcuts"
+msgstr "Raccourcis"
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:100
+msgid ""
+"To ease the use of the application, FreshRSS comes with a lot of predefined "
+"keyboard shortcuts. They allow actions to improve the user experience with "
+"a keyboard."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:102
+msgid ""
+"Of course, if you're not satisfied with the key mapping, you can change you "
+"configuration to fit your needs."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:104
+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 ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:109
+msgid ""
+"Navigation: they allow navigation through articles, feeds, and categories."
+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."
+msgstr ""
+
+#. 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: 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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:114
+msgid "The same process applies to the user queries."
+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."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:118
+#, no-wrap
+msgid "User queries"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:122
+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."
+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."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:125
+#, no-wrap
+msgid "Users"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:129
+#, no-wrap
+msgid "Authentication methods"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/05_Configuration.md:131
+#, no-wrap
+msgid "HTTP Authentication (Apache)"
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:137
+msgid "User control is based on the `.htaccess` file."
+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."
+msgstr ""
+
+#. type: Bullet: ' 3. '
+#: en/./users/05_Configuration.md:137
+msgid ""
+"If you want to limit all access to registered users only, place the file in "
+"the FreshRSS directory itself or in a parent directory. Note that WebSub and "
+"API will not work!"
+msgstr ""
+
+#. type: Bullet: ' 4. '
+#: en/./users/05_Configuration.md:137
+msgid "Example `.htaccess` file for a user \"marie\":"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:138
+#, 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: Plain text
+#: en/./users/05_Configuration.md:147
+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/05_Configuration.md:148
+#, no-wrap
+msgid "Subscription management"
+msgstr "Gestion des flux"
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:150
+#, no-wrap
+msgid "Information"
+msgstr "Informations"
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:158
+#, no-wrap
+msgid "Login"
+msgstr "Identification"
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:162
+#, no-wrap
+msgid "Advanced"
+msgstr "Avancé"
+
+#. type: Title ###
+#: en/./users/05_Configuration.md:164
+#, no-wrap
+msgid "Retrieve a truncated stream from within FreshRSS"
+msgstr "Récupérer un flux tronqué à partir de FreshRSS"
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:167
+msgid ""
+"This question comes up regularly, so we'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/./users/05_Configuration.md:169
+msgid ""
+"Please be aware that this way you'll generate much more traffic to the "
+"originating sites, and they might block you accordingly. FreshRSS "
+"performance is also negatively affected, because you'll have to fetch the "
+"full article content one by one. So it's a feature to use sparingly!"
+msgstr ""
+"Sachez aussi que par cette manière vous générez beaucoup plus de trafic vers "
+"les sites d'origines et qu'ils peuvent vous bloquer par conséquent. Les "
+"performances de FreshRSS sont aussi moins bonnes car vous devez alors aller "
+"chercher le contenu des articles un par un. C'est donc une fonctionnalité à "
+"utiliser avec parcimonie !"
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:171
+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)."
+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)."
+
+#. type: Title ####
+#: en/./users/05_Configuration.md:172
+#, no-wrap
+msgid "Example: Rue89"
+msgstr "Exemple : Rue89"
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:175
+msgid ""
+"To find this path, you have to go to the address of one of the truncated "
+"articles (for example, http://www.rue89.com/2013/10/15/prof-maths-jai-"
+"atteint-lextase-dihn-pedagogie-inversee-246635). You look have to look for "
+"the \"block\" of HTML that corresponds to article content (in the source "
+"code!)."
+msgstr ""
+"Pour trouver ce chemin, il faut se rendre à l'adresse d'un des articles "
+"tronqués (par exemple http://www.rue89.com/2013/10/15/prof-maths-jai-atteint-"
+"lextase-dihn-pedagogie-inversee-246635). Il faut alors chercher le \"bloc\" "
+"HTML correspondant au contenu de l'article (dans le code source !)"
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:177
+#, no-wrap
+msgid "Here we find that the block that encompasses nothing but the content of the article is ```<div class=\"content clearfix\">```. We'll only use the `.content` class here. Nevertheless, as said above, it's best to start the path with an id. If we go back to the parent block, we find ```<div id=\"article\">``` and that's perfect! The path will be ```#article .content```.\n"
+msgstr "On trouve ici que le bloc qui englobe uniquement le contenu de l'article est ```<div class=\"content clearfix\">```. On ne va garder que la classe `.content` ici. Néanmoins, comme je le disais plus haut, il est préférable de commencer le chemin avec un id. Si on remonte au bloc parent, il s'agit du bloc ```<div id=\"article\">``` et c'est parfait ! Le chemin sera donc ```#article .content```.\n"
+
+#. type: Title ####
+#: en/./users/05_Configuration.md:178
+#, no-wrap
+msgid "Add the corresponding classes to the article CSS path on the feed configuration page. Examples:"
+msgstr "Liste de correspondances site → chemin css"
+
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:184
+msgid "Rue89: ```#article .content```"
+msgstr "Rue89 : ```#article .content```"
+
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:184
+msgid "PCINpact: ```#actu_content```"
+msgstr "PCINpact : ```#actu_content```"
+
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:184
+msgid "Lesnumériques: ```article#body div.text.clearfix```"
+msgstr "Lesnumériques : ```article#body div.text.clearfix```"
+
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:184
+msgid "Phoronix: ```#main .content```"
+msgstr "Phoronix : ```#main .content```"
+
+#. type: Title ###
+#: en/./users/05_Configuration.md:185
+#, no-wrap
+msgid "Retrieve a truncated stream with external tools"
+msgstr "Récupérer un flux tronqué à l'aide d'outils externes"
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:188
+msgid ""
+"Complimentary 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: Bullet: '* '
+#: en/./users/05_Configuration.md:190
+msgid "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)"
+msgstr "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)"
+
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:190
+msgid "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)"
+msgstr "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)"
+
+#. type: Title #
+#: en/./users/06_Fever_API.md:1
+#, no-wrap
+msgid "FreshRSS - Fever API implementation"
+msgstr "FreshRSS - API compatible Fever"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:5
+msgid ""
+"See the [page about our Google Reader compatible API](06_Mobile_access.md) "
+"for another possibility and 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: 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
+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/./users/06_Fever_API.md:12
+#, no-wrap
+msgid "Usage & Authentication"
+msgstr "Utilisation et authentification"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:16
+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."
+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
+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/./users/06_Fever_API.md:19 en/./users/06_Mobile_access.md:44
+#, no-wrap
+msgid "Compatible clients"
+msgstr "Clients compatibles"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:22
+msgid "Tested with:"
+msgstr "Testé avec :"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:25
+#, 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"
+
+#. 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"
+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
+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"
+
+#. type: Title ##
+#: en/./users/06_Fever_API.md:35
+#, no-wrap
+msgid "Features"
+msgstr "Fonctionnalités"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:38
+msgid "The following features are implemented:"
+msgstr "Les fonctionnalités suivantes sont implémentées :"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "fetching categories"
+msgstr "récupération des catégories"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "fetching feeds"
+msgstr "récupération des flux"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+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/./users/06_Fever_API.md:48
+msgid "fetching favicons"
+msgstr "récupération des favicons"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "setting read marker for item(s)"
+msgstr "marquage des entrées comme lues"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "setting starred marker for item(s)"
+msgstr "marquage des entrées comme favoris"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "setting read marker for feed"
+msgstr "marquage d'un flux comme lu"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "setting read marker for category"
+msgstr "marquage d'une catégorie comme lue"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "supports FreshRSS extensions, which use the `entry_before_display` hook"
+msgstr "support des extensions grace au hook `entry_before_display`"
+
+#. type: 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."
+
+#. type: Title ##
+#: en/./users/06_Fever_API.md:53
+#, no-wrap
+msgid "Testing and debugging"
+msgstr "Tester et déboguer"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:56
+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/./users/06_Fever_API.md:58
+msgid ""
+"Configure a POST request to the URL https://freshrss.example.net/api/fever."
+"php?api which should give you the result:"
+msgstr ""
+"Envoyer une requête POST à l'adresse https://freshrss.example.net/api/fever."
+"php?api devrait vous renvoyer le résultat suivant :"
+
+#. type: Code fence info string
+#: en/./users/06_Fever_API.md:58 en/./users/06_Fever_API.md:80
+#, no-wrap
+msgid "json"
+msgstr "json"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:58
+#, no-wrap
+msgid ""
+"{\n"
+"\t\"api_version\": 3,\n"
+"\t\"auth\": 0\n"
+"}\n"
+msgstr ""
+"{\n"
+"\t\"api_version\": 3,\n"
+"\t\"auth\": 0\n"
+"}\n"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:65
+msgid "Great, the base setup seems to work!"
+msgstr "Super, la configuration de base fonctionne !"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:68
+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: Code fence info string
+#: en/./users/06_Fever_API.md:69 en/./users/06_Fever_API.md:75
+#: en/./users/06_Mobile_access.md:69
+#: en/./users/07_Frequently_Asked_Questions.md:37
+#: en/./users/07_Frequently_Asked_Questions.md:45
+#, no-wrap
+msgid "sh"
+msgstr "sh"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:69
+#, no-wrap
+msgid "api_key=`echo -n \"kevin:freshrss\" | md5sum | cut -d' ' -f1`\n"
+msgstr "api_key=`echo -n \"kevin:freshrss\" | md5sum | cut -d' ' -f1`\n"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:74
+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: 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"
+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 :"
+
+#. 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"
+msgstr ""
+"{\n"
+"\t\"api_version\": 3,\n"
+"\t\"auth\": 1,\n"
+"\t\"last_refreshed_on_time\": \"1520013061\"\n"
+"}\n"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:88
+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/./users/06_Fever_API.md:90
+msgid "Some basic calls are:"
+msgstr "Voici quelques exemples simples d'appels réalisables :"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&items"
+msgstr "https://freshrss.example.net/api/fever.php?api&items"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&feeds"
+msgstr "https://freshrss.example.net/api/fever.php?api&feeds"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&groups"
+msgstr "https://freshrss.example.net/api/fever.php?api&groups"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&unread_item_ids"
+msgstr "https://freshrss.example.net/api/fever.php?api&unread_item_ids"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&saved_item_ids"
+msgstr "https://freshrss.example.net/api/fever.php?api&saved_item_ids"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&items&since_id=some_id"
+msgstr "https://freshrss.example.net/api/fever.php?api&items&since_id=some_id"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&items&max_id=some_id"
+msgstr "https://freshrss.example.net/api/fever.php?api&items&max_id=some_id"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid ""
+"https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id"
+msgstr ""
+"https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id"
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid ""
+"https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id"
+msgstr ""
+"https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:102
+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/./users/06_Fever_API.md:103
+#, no-wrap
+msgid "Debugging"
+msgstr "Déboguer"
+
+#. 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:"
+msgstr ""
+"Si rien ne fonctionne correctement et que votre client se comporte "
+"étrangement, vous pouvez ajouter les quelques lignes suivantes au début du "
+"fichier `fever.api` pour déterminer la cause des problèmes rencontrés :"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:107
+#, no-wrap
+msgid "file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' . json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);\n"
+msgstr "file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' . json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);\n"
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:112
+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/./users/06_Fever_API.md:113
+#, no-wrap
+msgid "Credits"
+msgstr "Remerciements"
+
+#. 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)."
+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)."
+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: '1. '
+#: en/./users/06_Mobile_access.md:9
+msgid ""
+"Under the section “Authentication”, enable the option “Allow API access "
+"(required for mobile apps)”."
+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"
+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."
+msgstr ""
+"Le reste de cette page concerne l’API compatible Google Reader. Voir la "
+"[page sur l’API compatible Fever](06_Fever_API.md) pour une autre "
+"possibilité."
+
+#. type: Title #
+#: en/./users/06_Mobile_access.md:14
+#, no-wrap
+msgid "Testing"
+msgstr "Tester"
+
+#. type: Bullet: '3. '
+#: en/./users/06_Mobile_access.md:21
+msgid ""
+"Under the section “Profile”, click on the link like `https://rss.example.net/"
+"api/` next to the field “API password”."
+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"
+msgstr ""
+"4. Cliquer sur le premier lien “Check full server configuration”:\n"
+"\t* Si vous obtenez `PASS`, tout est bon : passer à l’étape 6.\n"
+"\t* Si vous obtenez *Bad Request!* ou *Not Found*, alors votre serveur ne semble pas accepter les slashs `/` qui sont encodés `%2F`. Passer à l’étape 5.\n"
+"\t* Si vous obtenez un autre message d’erreur, passer à l’étape 5.\n"
+
+#. type: Title #
+#: en/./users/06_Mobile_access.md:23
+#, no-wrap
+msgid "Fix server configuration"
+msgstr "Déboguer la configuration du serveur"
+
+#. type: Plain text
+#: en/./users/06_Mobile_access.md:42
+#, no-wrap
+msgid ""
+"5. Click on the second link “Check partial server configuration (without `%2F` support)”:\n"
+"\t* If you get `PASS`, then the problem is indeed that your server does not accept slashes `/` that are escaped `%2F`.\n"
+"\t\t* With Apache, remember the directive [`AllowEncodedSlashes On`](http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes)\n"
+"\t\t* Or use a client that does not escape slashes (such as EasyRSS), in which case proceed to step 6.\n"
+"\t* If you get *Service Unavailable!*, then check from step 1 again.\n"
+"\t* With __Apache__:\n"
+"\t\t* If you get *FAIL getallheaders!*, the combination of your PHP version and your Web server does not provide access to [`getallheaders`](http://php.net/getallheaders)\n"
+"\t\t\t* Turn on Apache `mod_setenvif` (often enabled by default), or `mod_rewrite` with the following procedure:\n"
+"\t\t\t\t* Allow [`FileInfo` in `.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride): see the [server setup](../admins/02_Installation.md) again.\n"
+"\t\t\t\t* Enable [`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html):\n"
+"\t\t\t\t\t* With Debian / Ubuntu: `sudo a2enmod rewrite`\n"
+"\t* With __nginx__:\n"
+"\t\t* If you get *Bad Request!*, check your server `PATH_INFO` configuration.\n"
+"\t\t* If you get *File not found!*, check your server `fastcgi_split_path_info`.\n"
+"\t* If you get *FAIL 64-bit or GMP extension!*, then your PHP version does not pass the requirement of being 64-bit and/or have PHP [GMP](http://php.net/gmp) extension.\n"
+"\t\t* The easiest is to add the GMP extension. On Debian / Ubuntu: `sudo apt install php-gmp`\n"
+"\t* Update and try again from step 3.\n"
+msgstr ""
+"5. Cliquer sur le second lien “Check partial server configuration (without `%2F` support)”:\n"
+"\t* Si vous obtenez `PASS`, alors le problème est bien que votre serveur n’accepte pas les slashs `/` qui sont encodés `%2F`.\n"
+"\t\t* Avec Apache, vérifiez la directive [`AllowEncodedSlashes On`](http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes)\n"
+"\t\t* Ou utilisez un client qui n’encode pas les slashs (comme EasyRSS), auquel cas passer à l’étape 6.\n"
+"\t* Si vous obtenez *Service Unavailable!*, retourner à l’étape 6.\n"
+"\t* Avec __Apache__:\n"
+"\t\t* Si vous obtenez *FAIL getallheaders!*, alors la combinaison de votre version de PHP et de votre serveur Web ne permet pas l’accès à [`getallheaders`](http://php.net/getallheaders)\n"
+"\t\t\t* Activer Apache `mod_setenvif` (souvent activé par défault), ou `mod_rewrite` avec la procédure suivante :\n"
+"\t\t\t\t* Autoriser [`FileInfo` dans `.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride) : revoir [l’installation du serveur](01_Installation.md).\n"
+"\t\t\t\t* Activer [`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html) :\n"
+"\t\t\t\t\t* Sur Debian / Ubuntu : `sudo a2enmod rewrite`\n"
+"\t* Avec __nginx__:\n"
+"\t\t* Si vous obtenez *Bad Request!*, vérifier la configuration `PATH_INFO` de votre serveur.\n"
+"\t\t* Si vous obtenez *File not found!*, vérifier la configuration `fastcgi_split_path_info` de votre serveur.\n"
+"\t* Si vous obtenez *FAIL 64-bit or GMP extension!*, alors votre installation PHP soit n’est pas en 64 bit, soit n’a pas l’extension PHP [GMP](http://php.net/gmp) activée.\n"
+"\t\t* Le plus simple est d’activer l’extension GMP. Sur Debian / Ubuntu : `sudo apt install php-gmp`\n"
+"\t* Mettre à jour et retourner à l’étape 3.\n"
+
+#. type: Plain text
+#: en/./users/06_Mobile_access.md:48
+#, no-wrap
+msgid ""
+"6. On the same FreshRSS API page, note the address given under “Your API address”, like `https://freshrss.example.net/api/greader.php`\n"
+"\t* Type the API address in a client, together with your FreshRSS username, and the corresponding special API password.\n"
+msgstr ""
+"6. Sur la même page de l'API FreshRSS, notez l'adresse donnée sous \"Votre adresse API\", comme `https://freshrss.example.net/api/greader.php`\n"
+"\t* Saisissez l'adresse de l'API dans le client sélectionné puis votre nom d'utilisateur et votre mot de passe spécialement créé pour l'API.\n"
+
+#. type: Plain text
+#: en/./users/06_Mobile_access.md:63
+#, no-wrap
+msgid ""
+"7. Pick a client supporting a Google Reader-like API. Selection:\n"
+"\t* Android\n"
+"\t\t* [News+](https://play.google.com/store/apps/details?id=com.noinnion.android.newsplus) with [News+ Google Reader extension](https://play.google.com/store/apps/details?id=com.noinnion.android.newsplus.extension.google_reader) (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://play.google.com/store/apps/details?id=com.noinnion.android.newsplus) avec [News+ Google Reader extension](https://play.google.com/store/apps/details?id=com.noinnion.android.newsplus.extension.google_reader) (Closed source)\n"
+"\t\t* [FeedMe 3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) (Propriétaire)\n"
+"\t\t* [EasyRSS](https://github.com/Alkarex/EasyRSS) (Libre, [F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/))\n"
+"\t* Linux\n"
+"\t\t* [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Libre)\n"
+"\t* MacOS\n"
+"\t\t* [Vienna RSS](http://www.vienna-rss.com/) (Libre)\n"
+"\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
+"\t* iOS\n"
+"\t\t* [Reeder](https://www.reederapp.com/) (Commercial)\n"
+"\t* Firefox\n"
+"\t\t* [FreshRSS-Notify](https://addons.mozilla.org/firefox/addon/freshrss-notify-webextension/) (Libre)\n"
+
+#. type: Title #
+#: en/./users/06_Mobile_access.md:65
+#, no-wrap
+msgid "Google Reader compatible API"
+msgstr "API compatible Google Reader"
+
+#. type: Plain text
+#: en/./users/06_Mobile_access.md:68
+msgid "Examples of basic queries:"
+msgstr "Exemples de requêtes simples :"
+
+#. type: Plain text
+#: en/./users/06_Mobile_access.md:69
+#, no-wrap
+msgid ""
+"# Initial login, using API password (Email and Passwd can be given either as GET, or POST - better)\n"
+"curl 'https://freshrss.example.net/api/greader.php/accounts/ClientLogin?Email=alice&Passwd=Abcdef123456'\n"
+"SID=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
+"Auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
+"\n"
+"# Examples of read-only requests\n"
+"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/subscription/list?output=json'\n"
+"\n"
+"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/unread-count?output=json'\n"
+"\n"
+"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/tag/list?output=json'\n"
+"\n"
+"# Retrieve a token for requests making modifications\n"
+"curl -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/token'\n"
+"8e6845e089457af25303abc6f53356eb60bdb5f8ZZZZZZZZZZZZZZZZZ\n"
+"\n"
+"# Get articles, piped to jq for easier JSON reading\n"
+"curl -s -H \"Authorization:GoogleLogin auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
+" 'https://freshrss.example.net/api/greader.php/reader/api/0/stream/contents/reading-list' | jq .\n"
+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
+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."
+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
+msgid ""
+"Of course, ```/i``` has a purpose! It's used for performance and usability:"
+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
+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 ""
+"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
+msgid ""
+"The ```./p/``` public root can be served without any HTTP access "
+"restrictions. Whereas it could be implemented in ```./p/i/```."
+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
+msgid ""
+"It avoids problems while serving public resources like ```favicon.ico```, "
+"```robots.txt```, etc."
+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
+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 ""
+"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/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/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."
+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/07_Frequently_Asked_Questions.md:19
+msgid "The same principle applies to `favicon.ico` and `.htaccess`."
+msgstr ""
+"L'explication est la même pour les fichiers ```favicon.ico``` et ```."
+"htaccess```."
+
+#. type: Title ##
+#: en/./users/07_Frequently_Asked_Questions.md:20
+#, no-wrap
+msgid "Why do I have errors while registering a feed?"
+msgstr "Pourquoi j'ai des erreurs quand j'essaye d'enregistrer un flux ?"
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:26
+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 ""
+"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."
+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."
+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
+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."
+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
+#, no-wrap
+msgid "How can you change a forgotten password?"
+msgstr "Comment changer un mot de passe oublié ?"
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:35
+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 ""
+"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
+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:"
+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
+#, no-wrap
+msgid "./cli/update_user.php --user <username> --password <password>\n"
+msgstr ""
+"./cli/update_user.php --user <username> --password <password>\n"
+"\n"
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:41
+msgid ""
+"For more information on that matter, please refer to the [dedicated "
+"documentation](../../cli/README.md)."
+msgstr ""
+"Pour plus d'information à ce sujet, il existe la [documentation dédiée]"
+"(../../cli/README.md)."
+
+#. type: Title ##
+#: en/./users/07_Frequently_Asked_Questions.md:42
+#, 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 can't write to "
+"some data sub-directories. The following command should be executed as root "
+"to fix this problem:"
+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"
+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: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:53
+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."
+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
+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 ""
+"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
+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:59
+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 ""
+"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_"
+
+#, 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](/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.\n"
+#~ ">>>>>>> 8bdf7b09f208346481cba5e08edc55dfab8c8d63\n"
+#~ 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 http://demo.freshrss."
+#~ "org/ pointe vers le répertoire ```./p``` et le ```robots.txt``` se trouve "
+#~ "bien à la racine du site : http://demo.freshrss.org/robots.txt."
+
+#~ msgid "Here's a list of feeds which don't work:"
+#~ msgstr "Voici une liste des flux qui ne fonctionnent pas :"
+
+#~ msgid ""
+#~ "http://foulab.org/fr/rss/Foulab_News: is not a W3C valid feed (November "
+#~ "2014)"
+#~ msgstr ""
+#~ "http://foulab.org/fr/rss/Foulab_News : ne passe pas la validation W3C "
+#~ "(novembre 2014)"
+
+#~ msgid ""
+#~ "http://eu.battle.net/hearthstone/fr/feed/news: is not a W3C valid feed "
+#~ "(November 2014)"
+#~ msgstr ""
+#~ "http://eu.battle.net/hearthstone/fr/feed/news : ne passe pas la "
+#~ "validation W3C (novembre 2014)"
+
+#~ msgid ""
+#~ "http://webseriesmag.blogs.liberation.fr/we/atom.xml: is not working for "
+#~ "the user but passes validation (November 2014)"
+#~ msgstr ""
+#~ "http://webseriesmag.blogs.liberation.fr/we/atom.xml : ne fonctionne pas "
+#~ "chez l'utilisateur mais passe l'ensemble des validations ci-dessus "
+#~ "(novembre 2014)"
+
+#~ msgid "Problem to solve"
+#~ msgstr "Problème à résoudre"
+
+#~ msgid "Préparer la sortie"
+#~ msgstr "Préparer la sortie"
+
+#~ msgid "S'assurer de l'état de dev"
+#~ msgstr "S'assurer de l'état de dev"
+
+#~ msgid ""
+#~ "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."
+#~ 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."
+
+#~ msgid ""
+#~ "Il faut aussi **vous assurer que le fichier CHANGELOG est à jour** dans "
+#~ "la branche de dev avec les mises à jour de la ou les version(s) à sortir."
+#~ msgstr ""
+#~ "Il faut aussi **vous assurer que le fichier CHANGELOG est à jour** dans "
+#~ "la branche de dev avec les mises à jour de la ou les version(s) à sortir."
+
+#~ msgid "Processus Git"
+#~ msgstr "Processus Git"
+
+#~ msgid "Écriture du script de mise à jour"
+#~ msgstr "Écriture du script de mise à jour"
+
+#~ msgid "Il existe ensuite 5 fonctions à remplir :"
+#~ msgstr "Il existe ensuite 5 fonctions à remplir :"
+
+#~ msgid ""
+#~ "- `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 ; - `need_info_update()` retourne `true` si l'utilisateur doit "
+#~ "intervenir durant la mise à jour ou `false` sinon ; - `ask_info_update()` "
+#~ "affiche un formulaire à l'utilisateur si `need_info_update()` a retourné "
+#~ "`true` ; - `save_info_update()` est chargée de sauvegarder les "
+#~ "informations renseignées par l'utilisateur (issues du formulaire de "
+#~ "`ask_info_update()`) ; - `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)."
+#~ 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 ; - `need_info_update()` retourne `true` si l'utilisateur doit "
+#~ "intervenir durant la mise à jour ou `false` sinon ; - `ask_info_update()` "
+#~ "affiche un formulaire à l'utilisateur si `need_info_update()` a retourné "
+#~ "`true` ; - `save_info_update()` est chargée de sauvegarder les "
+#~ "informations renseignées par l'utilisateur (issues du formulaire de "
+#~ "`ask_info_update()`) ; - `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)."
+
+#~ msgid "Mise à jour du fichier de versions"
+#~ msgstr "Mise à jour du fichier de versions"
+
+#~ msgid ""
+#~ "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."
+#~ 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."
+
+#~ msgid "Et voici comment fonctionne cette table :"
+#~ msgstr "Et voici comment fonctionne cette table :"
+
+#~ msgid ""
+#~ "- à gauche se trouve la version N, à droite la version N+1 ; - les "
+#~ "versions `x.y.z-dev` sont **toutes** mises à jour vers `dev` ; - les "
+#~ "versions stables sont mises à jour vers des versions stables ; - il est "
+#~ "possible de sauter plusieurs versions d'un coup à condition que les "
+#~ "scripts de mise à jour le prennent en charge ; - 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."
+#~ msgstr ""
+#~ "- à gauche se trouve la version N, à droite la version N+1 ; - les "
+#~ "versions `x.y.z-dev` sont **toutes** mises à jour vers `dev` ; - les "
+#~ "versions stables sont mises à jour vers des versions stables ; - il est "
+#~ "possible de sauter plusieurs versions d'un coup à condition que les "
+#~ "scripts de mise à jour le prennent en charge ; - 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."
+
+#~ msgid ""
+#~ "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."
+#~ 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."
+
+#~ msgid ""
+#~ "Lorsque vous serez satisfait, mettez à jour update.freshrss.org avec le "
+#~ "nouveau script et en testant de nouveau puis passez à la suite."
+#~ msgstr ""
+#~ "Lorsque vous serez satisfait, mettez à jour update.freshrss.org avec le "
+#~ "nouveau script et en testant de nouveau puis passez à la suite."
+
+#~ msgid "Mise à jour des services FreshRSS"
+#~ msgstr "Mise à jour des services FreshRSS"
+
+#~ msgid ""
+#~ "Deux services sont à mettre à jour immédiatement après la mise à jour de "
+#~ "update.freshrss.org :"
+#~ msgstr ""
+#~ "Deux services sont à mettre à jour immédiatement après la mise à jour de "
+#~ "update.freshrss.org :"
+
+#~ msgid "Annoncer publiquement la sortie"
+#~ msgstr "Annoncer publiquement la sortie"
+
+#~ msgid ""
+#~ "Lorsque tout fonctionne, il est temps d'annoncer la sortie au monde "
+#~ "entier !"
+#~ msgstr ""
+#~ "Lorsque tout fonctionne, il est temps d'annoncer la sortie au monde "
+#~ "entier !"
+
+#~ msgid ""
+#~ "- sur GitHub en créant [une nouvelle release](https://github.com/FreshRSS/"
+#~ "FreshRSS/releases/new) ; - 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)). - sur Twitter (compte "
+#~ "[@FreshRSS](https://twitter.com/FreshRSS)) ; - et sur mailing@freshrss."
+#~ "org ;"
+#~ msgstr ""
+#~ "- sur GitHub en créant [une nouvelle release](https://github.com/FreshRSS/"
+#~ "FreshRSS/releases/new) ; - 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)). - sur Twitter (compte "
+#~ "[@FreshRSS](https://twitter.com/FreshRSS)) ; - et sur mailing@freshrss."
+#~ "org ;"
+
+#~ msgid "Lancer la prochaine version de développement"
+#~ msgstr "Lancer la prochaine version de développement"
+
+#~ msgid ""
+#~ "Pensez aussi à mettre à jour update.freshrss.org pour qu'il prenne en "
+#~ "compte la version de développement actuelle."
+#~ msgstr ""
+#~ "Pensez aussi à mettre à jour update.freshrss.org pour qu'il prenne en "
+#~ "compte la version de développement actuelle."
+
+#~ msgid "With brackets"
+#~ msgstr "Le cas des parenthèses"
+
+#~ msgid ""
+#~ "- 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!"
+#~ msgstr ""
+#~ "- Agrégation des flux RSS et Atom.- Utilisez les favoris pour marquer les "
+#~ "articles qui vous ont plu ou que vous souhaitez lire plus tard.- Le "
+#~ "système de filtrage et de recherche permettent de cibler exactement les "
+#~ "articles que vous souhaitez lire.- Les statistiques permettent de savoir "
+#~ "en un coup d’œil quels sont les sites qui publient le plus, ou à "
+#~ "l’inverse, le moins.- Importation / exportation des flux au format OPML.- "
+#~ "Multi-thèmes pour changer l’habillage de FreshRSS.- « *Responsive design* "
+#~ "» : l’application s’adapte aux petits écrans pour emporter FreshRSS dans "
+#~ "votre poche.- Multi-utilisateurs pour héberger plusieurs personnes sur "
+#~ "une même installation.- API Google Reader pour pouvoir y brancher des "
+#~ "applications Android.- Auto-hébergeable : le code source est libre "
+#~ "(AGPL3) et vous pouvez donc l’héberger sur votre propre serveur.- Et bien "
+#~ "d’autres !"
diff --git a/docs/i18n/templates/freshrss.pot b/docs/i18n/templates/freshrss.pot
new file mode 100644
index 000000000..2dbd80cb6
--- /dev/null
+++ b/docs/i18n/templates/freshrss.pot
@@ -0,0 +1,4964 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: https://github.com/FreshRSS/FreshRSS/issues\n"
+"POT-Creation-Date: 2019-12-07 10:49+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. 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
+msgid "Report a bug"
+msgstr ""
+
+#. type: Plain text
+#: en/./contributing.md:11
+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
+msgid ""
+"Search for it on [the bug "
+"tracker](https://github.com/FreshRSS/FreshRSS/issues) (don't forget to use "
+"the search bar)."
+msgstr ""
+
+#. type: Bullet: '2. '
+#: en/./contributing.md:15
+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
+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
+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
+msgid "Give an explicit title to the ticket so it will be easier to find it later."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./contributing.md:20
+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
+msgid "We also need some information:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./contributing.md:27
+msgid "Your FreshRSS version (on the about page or in the `constants.php` file)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./contributing.md:27
+msgid "Your server configuration: the type of hosting and the PHP version"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./contributing.md:27
+msgid "Your storage system (SQLite, MySQL, MariaDB, PostgreSQL)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./contributing.md:27
+msgid ""
+"If possible, the related logs (PHP logs and FreshRSS logs under "
+"`data/users/your_user/log.txt`)"
+msgstr ""
+
+#. type: Title ##
+#: en/./contributing.md:28
+#, no-wrap
+msgid "Fix a bug"
+msgstr ""
+
+#. type: Plain text
+#: en/./contributing.md:31
+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
+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
+msgid ""
+"[Fork the project "
+"repository](https://help.github.com/articles/fork-a-repo/)."
+msgstr ""
+
+#. type: Bullet: '3. '
+#: en/./contributing.md:36
+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, and ideally prefixed by the related "
+"ticket id. For instance, `783-contributing-file` to fix [ticket "
+"#783](https://github.com/FreshRSS/FreshRSS/issues/783)."
+msgstr ""
+
+#. type: Bullet: '4. '
+#: en/./contributing.md:36
+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
+msgid ""
+"If you have to write code, please follow [our coding style "
+"recommendations](developers/01_First_steps.md)."
+msgstr ""
+
+#. type: Plain text
+#: en/./contributing.md:40
+#, 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 ""
+
+#. type: Title ##
+#: en/./contributing.md:41
+#, no-wrap
+msgid "Submit an idea"
+msgstr ""
+
+#. type: Plain text
+#: en/./contributing.md:44
+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 implement it. The greatest ideas often come from the shyest "
+"suggestions!"
+msgstr ""
+
+#. type: Plain text
+#: en/./contributing.md:46
+msgid "If your idea is nice, we'll have a look at it."
+msgstr ""
+
+#. type: Title ##
+#: en/./contributing.md:47
+#, no-wrap
+msgid "Contribute to internationalization (i18n)"
+msgstr ""
+
+#. 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 ""
+
+#. type: Plain text
+#: en/./contributing.md:52
+msgid "Translations are present in the subdirectories of `./app/i18n/`."
+msgstr ""
+
+#. type: Plain text
+#: en/./contributing.md:54
+msgid ""
+"We're working on a better way to handle internationalization, but don't "
+"hesitate to suggest any ideas!"
+msgstr ""
+
+#. type: Title ##
+#: en/./contributing.md:55
+#, no-wrap
+msgid "Contribute to documentation"
+msgstr ""
+
+#. type: Plain text
+#: en/./contributing.md:58
+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/master/docs)!"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/01_First_steps.md:1
+#, no-wrap
+msgid "Environment configuration (Docker)"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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 "
+"Composer."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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 "
+"documented below. If you already have a working PHP environment, you "
+"probably don't need it."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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 "
+"to be executed as root user. You don't have to type these characters. A path "
+"may be indicated before these characters to help you identify where they "
+"need to be executed. For instance, `app$ echo 'Hello World'` indicates that "
+"you have to execute `echo` command in the `app/` directory."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:12
+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
+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
+#, no-wrap
+msgid "console"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:15
+#, no-wrap
+msgid ""
+"$ git clone https://github.com/FreshRSS/FreshRSS.git\n"
+"$ cd FreshRSS\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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 "
+"consequence."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:23
+msgid "Then, the only command you need to know is the following:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:24
+#, no-wrap
+msgid "$ make start\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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`."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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 ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:33
+#, no-wrap
+msgid ""
+"You can stop the containers by typing <kbd>Control</kbd> + <kbd>c</kbd> or "
+"with the following command, in another terminal:\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:34
+#, no-wrap
+msgid "$ make stop\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:39
+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
+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
+#, no-wrap
+msgid "$ TAG=arm make start\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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)."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:49
+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
+#, no-wrap
+msgid ""
+"$ make build\n"
+"$ # or\n"
+"$ TAG=arm make build\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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. `local-arm`)."
+msgstr ""
+
+#. type: Title #
+#: en/./developers/01_First_steps.md:58
+#, 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:381 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 ""
+
+#. type: Title #
+#: en/./developers/01_First_steps.md:62
+#, no-wrap
+msgid "Extensions"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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)."
+msgstr ""
+
+#. type: Title #
+#: en/./developers/01_First_steps.md:66
+#, no-wrap
+msgid "Coding style"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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 "
+"the project, but we should fix it every time an opportunity presents itself."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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."
+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"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:76
+msgid "Code indentation must use tabs."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:77
+#, no-wrap
+msgid "Alignment"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_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."
+msgstr ""
+
+#. type: Code fence info string
+#: en/./developers/01_First_steps.md:81 en/./developers/01_First_steps.md:111 en/./developers/01_First_steps.md:123 en/./developers/01_First_steps.md:158 en/./developers/01_First_steps.md:173 en/./developers/01_First_steps.md:186 en/./developers/01_First_steps.md:196 en/./developers/01_First_steps.md:213 en/./developers/01_First_steps.md:228 en/./developers/03_Backend/05_Extensions.md:47 en/./developers/03_Backend/05_Extensions.md:88 en/./developers/03_Backend/05_Extensions.md:130 en/./developers/03_Backend/05_Extensions.md:149 en/./developers/03_Backend/05_Extensions.md:166 en/./developers/03_Backend/05_Extensions.md:188 en/./developers/03_Backend/05_Extensions.md:225 en/./developers/05_Release_new_version.md:53 en/./users/06_Fever_API.md:107
+#, no-wrap
+msgid "php"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:81
+#, no-wrap
+msgid ""
+"$result = a_function_with_a_really_long_name($param1, $param2,\n"
+" $param3, $param4);\n"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:86
+#, no-wrap
+msgid "End of line"
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:91
+msgid ""
+"You can verify if there is any unintended white space at the end of line "
+"with the following Git command:"
+msgstr ""
+
+#. type: Code fence info string
+#: en/./developers/01_First_steps.md:92 en/./developers/02_Github.md:80 en/./developers/02_Github.md:85 en/./developers/02_Github.md:90 en/./developers/02_Github.md:96 en/./developers/02_Github.md:102 en/./developers/05_Release_new_version.md:15 en/./developers/05_Release_new_version.md:101
+#, no-wrap
+msgid "bash"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:92
+#, 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/01_First_steps.md:99 en/./developers/01_First_steps.md:220
+#, no-wrap
+msgid "End of file"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:102
+msgid "Every file must end by an empty line."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:103
+#, no-wrap
+msgid "Commas, dots and semi-columns"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:106
+msgid ""
+"There should no space before those characters, but there should be one "
+"after."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:107 en/./developers/01_First_steps.md:210
+#, no-wrap
+msgid "Operators"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:110
+msgid "There should be a space before and after every operator."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:111
+#, no-wrap
+msgid ""
+"if ($a == 10) {\n"
+"\t// do something\n"
+"}\n"
+"\n"
+"echo $a ? 1 : 0;\n"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:119
+#, no-wrap
+msgid "Parentheses"
+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."
+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"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:133
+#, no-wrap
+msgid "With chained functions"
+msgstr ""
+
+#. 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 "
+"code if not properly formatted. In those cases, we add a new indent level "
+"for the complete instruction and reset the indent for a new instruction on "
+"the same level."
+msgstr ""
+
+#. type: Code fence info string
+#: en/./developers/01_First_steps.md:137
+#, no-wrap
+msgid "javascript"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:137
+#, no-wrap
+msgid ""
+"// First instruction\n"
+"shortcut.add(shortcuts.mark_read, function () {\n"
+"\t\t//...\n"
+"\t}, {\n"
+"\t\t'disable_in_input': true\n"
+"\t});\n"
+"// Second instruction\n"
+"shortcut.add(\"shift+\" + shortcuts.mark_read, function () {\n"
+"\t\t//...\n"
+"\t}, {\n"
+"\t\t'disable_in_input': true\n"
+"\t});\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_First_steps.md:152
+#, no-wrap
+msgid "Line length"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:155
+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
+msgid "With functions, parameters can be declared on multiple lines."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:158
+#, no-wrap
+msgid ""
+"function my_function($param_1, $param_2,\n"
+" $param_3, $param_4) {\n"
+"\t// do something\n"
+"}\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_First_steps.md:165
+#, no-wrap
+msgid "Naming"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:168
+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
+msgid "Functions and variables"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:172
+msgid "Functions and variables must follow the \"snake case\" naming convention."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:173
+#, no-wrap
+msgid ""
+"// a function\n"
+"function function_name() {\n"
+"\t// do something\n"
+"}\n"
+"// a variable\n"
+"$variable_name;\n"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:182
+#, no-wrap
+msgid "Methods"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:185
+msgid "Methods must follow the \"lower camel case\" naming convention."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:186
+#, no-wrap
+msgid ""
+"private function methodName() {\n"
+"\t// do something\n"
+"}\n"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/01_First_steps.md:192
+#, no-wrap
+msgid "Classes"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:195
+msgid "Classes must follow the \"upper camel case\" naming convention."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:196
+#, no-wrap
+msgid "abstract class ClassName {}\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_First_steps.md:200
+#, no-wrap
+msgid "Encoding"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:203
+msgid "Files must be encoded with the UTF-8 character set."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/01_First_steps.md:204
+#, no-wrap
+msgid "PHP compatibility"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:207
+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
+msgid "Miscellaneous"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:212
+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
+#, no-wrap
+msgid ""
+"if ($a == 10 ||\n"
+" $a == 20) {\n"
+"\t// do something\n"
+"}\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:223
+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
+msgid "Arrays"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/01_First_steps.md:227
+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
+#, no-wrap
+msgid ""
+"$variable = [\n"
+"\t\"value 1\",\n"
+"\t\"value 2\",\n"
+"\t\"value 3\",\n"
+"];\n"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/02_Github.md:1
+#, no-wrap
+msgid "Reporting a bug or a suggestion"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:4
+msgid ""
+"Despite the care given to FreshRSS, it's still possible that bugs occur. The "
+"project is young and development is dynamic, so it can be corrected "
+"quickly. You might also have a feature in mind that 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:6
+msgid ""
+"If you're convinced that you should be heard, here's how you can go about "
+"it."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/02_Github.md:7
+#, no-wrap
+msgid "On GitHub"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:10
+msgid ""
+"GitHub is the ideal platform to submit your requests. It allows us to "
+"discuss a problem or suggestion with others and it often generates new "
+"ideas. Let's not neglect this \"social\" aspect!"
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./developers/02_Github.md:16
+msgid "[Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/issues)"
+msgstr ""
+
+#. type: Bullet: ' 2. '
+#: en/./developers/02_Github.md:16
+msgid ""
+"Start by checking if a similar request hasn't already been made. If so, "
+"please feel free to add your voice to the request."
+msgstr ""
+
+#. type: Bullet: ' 3. '
+#: en/./developers/02_Github.md:16
+msgid ""
+"If your request is new, [open a new bug "
+"ticket](https://github.com/FreshRSS/FreshRSS/issues/new)"
+msgstr ""
+
+#. type: Bullet: ' 4. '
+#: en/./developers/02_Github.md:16
+msgid ""
+"Finally, write your request. If you're fluent in English, it's the preferred "
+"language because it allows for discussion with the largest number of people."
+msgstr ""
+
+#. type: Bullet: ' 5. '
+#: en/./developers/02_Github.md:16
+msgid "Please follow the tips below to make it easier to let your ticket be heard."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/02_Github.md:17
+#, no-wrap
+msgid "Informal"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:20
+msgid ""
+"Not everyone likes or uses GitHub for a variety of legitimate reasons. That "
+"is why you can also contact us in a more informal way."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:26
+msgid ""
+"On [our Mattermost "
+"chat](https://framateam.org/signup_user_complete/?id=e2680d3e3128b9fac8fdb3003b0024ee)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:26
+msgid ""
+"On [the mailing "
+"lists](https://freshrss.org/announce-of-the-mailing-lists.html)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:26
+msgid "At events / meetings around Free Software"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:26
+msgid "Over a beer in a bar"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:26
+msgid "Etc."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/02_Github.md:27
+#, no-wrap
+msgid "Tips"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:30
+msgid "Here are some tips to help you present your bug report or suggestion:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid "**Pay attention to spelling**. Even if it's not always easy, try your best!"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"**Give an explicit title to your request**, even if it's a bit long. This "
+"not only helps us understand your request, but also to find your ticket "
+"later."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"**One request = one ticket.** You may have lots of ideas while being afraid "
+"to spam the bug manager: it doesn't matter. It's better to have a few too "
+"many tickets than too many requests in one. We'll close and consolidate "
+"requests when possible."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"If you report a bug, think about **providing us with the FreshRSS logs** "
+"(accessible in the FreshRSS `data/log/` folder) and the **PHP logs** (the "
+"location may vary by distribution, but consider searching in "
+"`/var/log/httpd` or `/var/log/apache`)."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"If you can't find the log files, specify it in your ticket so we know you've "
+"already searched."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"Not all bugs require logs, but if you have any doubts, it is better to "
+"provide them to us. Logs are important and very useful for debugging!"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:39
+msgid ""
+"The logs may reveal confidential information, so **be careful not to "
+"disclose anything sensitive.**"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:41
+msgid ""
+"In addition, when facing a bug, you're encouraged to follow this message "
+"format (from the [Sam & Max "
+"website](http://sametmax.com/template-de-demande-daide-en-informatique/):"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_Github.md:42
+#, no-wrap
+msgid "What's my goal?"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:45
+msgid "Give the general context of what you were trying to do."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_Github.md:46
+#, no-wrap
+msgid "What have I been trying to do?"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:49
+msgid "Explain step by step what you have done so that we can reproduce the bug."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_Github.md:50
+#, no-wrap
+msgid "What results have I achieved?"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:53
+msgid ""
+"The bug: what you see that shouldn't have happened. Here you can provide the "
+"logs."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_Github.md:54
+#, no-wrap
+msgid "What was the expected result?"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:57
+msgid "So that we understand what you consider to be the problem."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/02_Github.md:58
+#, no-wrap
+msgid "What are my circumstances?"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:61
+msgid "Remember to give the following information if you know it:"
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./developers/02_Github.md:67
+msgid "Which browser? Which version?"
+msgstr ""
+
+#. type: Bullet: ' 2. '
+#: en/./developers/02_Github.md:67
+msgid "Which server: Apache, Nginx? Which version?"
+msgstr ""
+
+#. type: Bullet: ' 3. '
+#: en/./developers/02_Github.md:67
+msgid "Which version of PHP?"
+msgstr ""
+
+#. type: Bullet: ' 4. '
+#: en/./developers/02_Github.md:67
+msgid "Which database: SQLite, MySQL, MariaDB, PostgreSQL? Which version?"
+msgstr ""
+
+#. type: Bullet: ' 5. '
+#: en/./developers/02_Github.md:67
+msgid "Which distribution runs on the server? And... which version?"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/02_Github.md:68
+#, no-wrap
+msgid "Branching"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/02_Github.md:70
+#, no-wrap
+msgid "Basic"
+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 "<http://try.github.com/>"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:77
+msgid "<http://sixrevisions.com/resources/git-tutorials-beginners/>"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/02_Github.md:77
+msgid "<http://rogerdudler.github.io/git-guide/>"
+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:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:80
+#, no-wrap
+msgid "git remote add upstream git@github.com:FreshRSS/FreshRSS.git\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:85
+msgid "You can verify the remote repo is successfully added by using:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:85
+#, no-wrap
+msgid "git remote -v show\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:90
+msgid "Now you can pull the latest development code:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:90
+#, no-wrap
+msgid ""
+"git checkout master\n"
+"git pull upstream master\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/02_Github.md:95
+#, no-wrap
+msgid "Starting a new development branch"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:96
+#, no-wrap
+msgid "git checkout -b my-development-branch\n"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/02_Github.md:100
+#, no-wrap
+msgid "Sending a patch"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:102
+#, no-wrap
+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:114
+msgid "Now you can create a PR based on your branch."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/02_Github.md:115
+#, no-wrap
+msgid "How to write a commit message"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:118
+msgid ""
+"A commit message should succintly describe the changes on the first "
+"line. For example:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:120
+#, no-wrap
+msgid "> Fix broken icon\n"
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/02_Github.md:123
+msgid "For further tips, see [here](https://chris.beams.io/posts/git-commit/)."
+msgstr ""
+
+#. type: Title #
+#: en/./developers/03_Backend/02_Minz.md:1
+#, no-wrap
+msgid "Models"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/03_Backend/02_Minz.md:5
+#, no-wrap
+msgid "Controllers and actions"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/02_Minz.md:9 en/./developers/03_Backend/05_Extensions.md:69
+#, no-wrap
+msgid "Views"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/02_Minz.md:13 en/./developers/03_Backend/05_Extensions.md:39
+#, no-wrap
+msgid "Routing"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/03_Backend/02_Minz.md:17
+#, no-wrap
+msgid "Writing URL"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/03_Backend/02_Minz.md:21 en/./developers/04_Frontend/01_View_files.md:13
+#, no-wrap
+msgid "Internationalisation"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/03_Backend/02_Minz.md:25
+#, no-wrap
+msgid "Understanding internals"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/03_Backend/04_Changing_source_code.md:1
+#, no-wrap
+msgid "Accessing the database"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/03_Backend/04_Changing_source_code.md:5
+#, no-wrap
+msgid "Writing an action and its related view"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/03_Backend/04_Changing_source_code.md:9
+#, no-wrap
+msgid "Authentication"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/03_Backend/04_Changing_source_code.md:13
+#, no-wrap
+msgid "Logs"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/03_Backend/05_Extensions.md:1
+#, no-wrap
+msgid "Writing extensions for FreshRSS"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/03_Backend/05_Extensions.md:3
+#, no-wrap
+msgid "About FreshRSS"
+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)."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/03_Backend/05_Extensions.md:7
+#, no-wrap
+msgid "The problem"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:10
+msgid "FreshRSS is limited in its technical possibilities by various factors:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:14
+msgid "The number of developers"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:14
+msgid "The will to integrate certain changes"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:14
+msgid "The level of \"hacking\" required to integrate marginal features"
+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\"."
+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:"
+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"
+msgstr ""
+
+#. type: Bullet: '2. '
+#: en/./developers/03_Backend/05_Extensions.md:22
+msgid "Unofficial integration of novelties"
+msgstr ""
+
+#. type: Bullet: '3. '
+#: en/./developers/03_Backend/05_Extensions.md:22
+msgid "No forking or main developer approval required."
+msgstr ""
+
+#. 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 ""
+
+#. type: Title ##
+#: en/./developers/03_Backend/05_Extensions.md:25
+#, no-wrap
+msgid "Understanding basic mechanics (Minz and MVC)"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:28
+#, no-wrap
+msgid "**TODO** : move to 02_Minz.md\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:30
+msgid ""
+"This data sheet should refer to the official FreshRSS and Minz documentation "
+"(the PHP framework on which FreshRSS is based). Unfortunately, this "
+"documentation does not yet exist. In a few words, here are the main things "
+"you should know. It is not necessary to read all the chapters in this "
+"section if you don't need to use a feature in your extension (if you don't "
+"need to translate your extension, no need to know more about the "
+"`Minz_Translate` module for example)."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:31
+#, no-wrap
+msgid "MVC Architecture"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:34
+msgid ""
+"Minz relies on and imposes an MVC architecture on projects using it. This "
+"architecture consists of three main components:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:38
+msgid ""
+"The model: this is the base object that we will manipulate. In FreshRSS, "
+"categories, flows and articles are templates. The part of the code that "
+"makes it possible to manipulate them in a database is also part of the model "
+"but is separated from the base model: we speak of DAO (for \"Data Access "
+"Object\"). The templates are stored in a `Models` folder."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:38
+msgid ""
+"The view: this is what the user sees. The view is therefore simply HTML code "
+"mixed with PHP to display dynamic information. The views are stored in a "
+"`views` folder."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:38
+msgid ""
+"The controller: this is what makes it possible to link models and "
+"views. Typically, a controller will load templates from the database (like a "
+"list of items) to \"pass\" them to a view for display. Controllers are "
+"stored in a `Controllers` directory."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:42
+msgid ""
+"In order to link a URL to a controller, first you have to go through a "
+"\"routing\" phase. In FreshRSS, this is particularly simple because it "
+"suffices to specify the name of the controller to load into the URL using a "
+"`c` parameter. For example, the address http://exemple.com?c=hello will "
+"execute the code contained in the `hello` controller."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:44
+msgid ""
+"One concept that has not yet been discussed is the \"actions\" system. An "
+"action is executed *on* a controller. Concretely, a controller is "
+"represented by a class and its actions by methods. To execute an action, it "
+"is necessary to specify an `a` parameter in the URL."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:46 en/./developers/03_Backend/05_Extensions.md:165
+msgid "Code example:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:47
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"class FreshRSS_hello_Controller extends Minz_ActionController {\n"
+"\tpublic function indexAction() {\n"
+"\t\t$this->view->a_variable = 'FooBar';\n"
+"\t}\n"
+"\n"
+"\tpublic function worldAction() {\n"
+"\t\t$this->view->a_variable = 'Hello World!';\n"
+"\t}\n"
+"}\n"
+"\n"
+"?>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:64
+msgid ""
+"When loading the address http://exemple.com?c=hello&a=world, the `world` "
+"action is executed on the `hello` controller."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:66
+msgid ""
+"Note: if `c` or `a` is not specified, the default value for each of these "
+"variables is `index`. So the address http://exemple.com?c=hello will execute "
+"the `index` action of the `hello` controller."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:68
+msgid ""
+"From now on, the `hello/world` naming convention will be used to refer to a "
+"controller/action pair."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:72
+msgid ""
+"Each view is associated with a controller and an action. The view associated "
+"with `hello/world` will be stored in a very specific file: "
+"`views/hello/world. phtml`. This convention is imposed by Minz."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:74
+msgid "As explained above, the views consist of HTML mixed with PHP. Code example:"
+msgstr ""
+
+#. type: Code fence info string
+#: en/./developers/03_Backend/05_Extensions.md:75 en/./developers/03_Backend/05_Extensions.md:120 en/./developers/03_Backend/05_Extensions.md:248 en/./developers/03_Backend/05_Extensions.md:284 en/./developers/03_Backend/05_Extensions.md:351
+#, no-wrap
+msgid "html"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:75
+#, no-wrap
+msgid ""
+"<p>\n"
+"\tThis is a parameter passed from the controller: <?= $this->a_variable ?>\n"
+"</p>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:82
+#, no-wrap
+msgid ""
+"The variable `$this->a_variable` is passed by the controller (see previous "
+"example). The difference is that in the controller it is necessary to pass "
+"`$this->view`, while in the view `$this` suffices.\n"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:83
+#, no-wrap
+msgid "Working with GET / POST"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:87
+msgid ""
+"It is often necessary to take advantage of parameters passed by GET or "
+"POST. In Minz, these parameters are accessible using the `Minz_Request` "
+"class. Code example:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:88
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"$default_value = 'foo';\n"
+"$param = Minz_Request::param('bar', $default_value);\n"
+"\n"
+"// Display the value of the parameter `bar` (passed via GET or POST)\n"
+"// or \"foo\" if the parameter does not exist.\n"
+"echo $param;\n"
+"\n"
+"// Sets the value of the `bar` parameter\n"
+"Minz_Request::_param('bar', 'baz');\n"
+"\n"
+"// Will necessarily display \"baz\" since we have just forced its value.\n"
+"// Note that the second parameter (default) is optional.\n"
+"echo Minz_Request::param('bar');\n"
+"\n"
+"?>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:109
+msgid ""
+"The `Minz_Request::isPost()` method can be used to execute a piece of code "
+"only if it is a POST request."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:111
+msgid ""
+"Note: it is preferable to use `Minz_Request` only in controllers. It is "
+"likely that you will encounter this method in FreshRSS views, or even in "
+"templates, but be aware that this is **not** good practice."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:112
+#, no-wrap
+msgid "Access session settings"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:115
+msgid ""
+"The access to session parameters is strangely similar to the GET / POST "
+"parameters but passes through the `Minz_Session` class this time! There is "
+"no example here because you can repeat the previous example by changing all "
+"`Minz_Request` to `Minz_Session`."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:116
+#, no-wrap
+msgid "Working with URLs"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:119
+msgid ""
+"To take full advantage of the Minz routing system, it is strongly "
+"discouraged to write hard URLs in your code. For example, the following view "
+"should be avoided:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:120
+#, no-wrap
+msgid ""
+"<p>\n"
+"\tGo to page <a href=\"http://example.com?c=hello&amp;a=world\">Hello "
+"world</a>!\n"
+"</p>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:127
+msgid ""
+"If one day it was decided to use a \"url rewriting\" system to have "
+"addresses in a http://exemple.com/controller/action format, all previous "
+"addresses would become ineffective!"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:129
+msgid ""
+"So use the `Minz_Url` class and its `display()` method "
+"instead. `Minz_Url::display()` takes an array of the following form as its "
+"argument:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:130
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"\t'params' => [\n"
+"\t\t'foo' => 'bar',\n"
+"\t],\n"
+"];\n"
+"\n"
+"// Show something like .?c=hello&amp;a=world&amp;foo=bar\n"
+"echo Minz_Url::display($url_array);\n"
+"\n"
+"?>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:148
+msgid ""
+"Since this can become a bit tedious to use in the long run, especially in "
+"views, it is preferable to use the `_url()` shortcut:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:149
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"// Displays the same as above\n"
+"echo _url('hello', 'world', 'foo', 'bar');\n"
+"\n"
+"?>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:159
+msgid ""
+"Note: as a general rule, the shortened form (`_url()`) should be used in "
+"views, while the long form (`Minz_Url::display()`) should be used in "
+"controllers."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:160
+#, no-wrap
+msgid "Redirections"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:163
+msgid ""
+"It is often necessary to redirect a user to another page. To do so, the "
+"`Minz_Request` class offers another useful method: `forward()`. This method "
+"takes the same URL format as the one seen just before as its argument."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:166
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"];\n"
+"\n"
+"// Tells Minz to redirect the user to the hello / world page.\n"
+"// Note that this is a redirection in the Minz sense of the term, not a "
+"redirection that the browser will have to manage (HTTP code 301 or 302)\n"
+"// The code that follows forward() will thus be executed!\n"
+"Minz_Request::forward($url_array);\n"
+"\n"
+"// To perform a type 302 redirect, add \"true\".\n"
+"// The code that follows will never be executed.\n"
+"Minz_Request::forward($url_array, true);\n"
+"\n"
+"?>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:187
+msgid ""
+"It is very common to want display a message to the user while performing a "
+"redirect, to tell the user how the action was carried out (validation of a "
+"form for example). Such a message is passed through a `notification` session "
+"variable (note: we will talk about feedback from now on to avoid confusion "
+"with a notification that can occur at any time). To facilitate this kind of "
+"very frequent action, there are two shortcuts that both perform a 302 "
+"redirect by assigning a feedback message:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:188
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"$url_array = [\n"
+"\t'c' => 'hello',\n"
+"\t'a' => 'world',\n"
+"];\n"
+"$feedback_good = 'All went well!';\n"
+"$feedback_bad = 'Oops, something went wrong.';\n"
+"\n"
+"Minz_Request::good($feedback_good, $url_array);\n"
+"\n"
+"// or\n"
+"\n"
+"Minz_Request::bad($feedback_bad, $url_array);\n"
+"\n"
+"?>\n"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:207
+#, no-wrap
+msgid "Translation Management"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:210
+msgid ""
+"It is common (and that's an understatement) to want to show some text to the "
+"user. In the previous example, for example, we display feedback to the user "
+"based on the result of form validation. The problem is that FreshRSS has "
+"users of different nationalities. It is therefore necessary to be able to "
+"manage different languages in order not to remain confined to English or "
+"French."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:212
+msgid ""
+"The solution is to use the `Minz_Translate` class, which allows dynamic "
+"translation of FreshRSS (or any Minz-based application). Before using this "
+"module, it is necessary to know where to find the strings to be "
+"translated. Each language has its own subdirectory in a parent directory "
+"named `i18n`. For example, English language files are located in "
+"`i18n/fr/`. There are seven different files:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`admin.php` for anything related to FreshRSS administration"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`conf.php` for configuration"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`feedback.php` contains translations of feedback messages"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`gen.php` stores what is global to FreshRSS (gen for \"general\")"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`index.php` for the main page that lists feeds and the About page"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`install.php` contains strings related FreshRSS installation"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:220
+msgid "`sub.php` for subscription management (sub for \"subscription\")"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:222
+msgid "This organization makes it possible to avoid a single huge translation file."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:224
+msgid ""
+"The translation files are quite simple: it's only a matter of returning a "
+"PHP table containing the translations. As an example, here's an extract from "
+"`app/i18n/fr/gen.php`:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:225
+#, no-wrap
+msgid ""
+"<?php\n"
+"\n"
+"return array(\n"
+"\t'action' => [\n"
+"\t\t'actualize' => 'Actualiser',\n"
+"\t\t'back_to_rss_feeds' => '← Retour à vos flux RSS',\n"
+"\t\t'cancel' => 'Annuler',\n"
+"\t\t'create' => 'Créer',\n"
+"\t\t'disable' => 'Désactiver',\n"
+"\t),\n"
+"\t'freshrss' => array(\n"
+"\t\t'_' => 'FreshRSS',\n"
+"\t\t'about' => 'À propos de FreshRSS',\n"
+"\t),\n"
+"];\n"
+"\n"
+"?>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:247
+msgid ""
+"To access these translations, `Minz_Translate` will help us with its "
+"`Minz_Translate::t()` method. As this can be a bit long to type, a shortcut "
+"has been introduced that **must** be used in all circumstances: `_t()`. "
+"Code example:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:248
+#, no-wrap
+msgid ""
+"<p>\n"
+"\t<a href=\"<?= _url('index', 'index') ?>\">\n"
+"\t\t<?= _t('gen.action.back_to_rss_feeds') ?>\n"
+"\t</a>\n"
+"</p>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:257
+msgid ""
+"The string to pass to the `_t()` function consists of a series of "
+"identifiers separated by dots. The first identifier indicates from which "
+"file to extract the translation (in this case, `gen.php`), while the "
+"following ones indicate table entries. Thus `action` is an entry of the main "
+"array and `back_to_rss_feeds` is an entry of the `action` array. This allows "
+"us to further organize our translation files."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:259
+msgid ""
+"There is a small special case that sometimes makes life easier: the `_` "
+"identifier. This must necessarily be present at the end of the chain and "
+"gives a value to the higher-level identifier. It's pretty hard to explain "
+"but very simple to understand. In the example given above, a `_` is "
+"associated with the value `FreshRSS`: this means that there is no need to "
+"write `_t('gen.freshrss._')` but `_t('gen.freshrss')` suffices."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:260
+#, no-wrap
+msgid "Configuration management"
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/03_Backend/05_Extensions.md:262
+#, no-wrap
+msgid "Write an extension for FreshRSS"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:265
+msgid ""
+"Here we are! We've talked about the most useful features of Minz and how to "
+"run FreshRSS correctly and it's about time to address the extensions "
+"themselves."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:267
+msgid ""
+"An extension allows you to easily add functionality to FreshRSS without "
+"having to touch the core of the project directly."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:268
+#, no-wrap
+msgid "Basic files and folders"
+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."
+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:"
+msgstr ""
+
+#. 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."
+msgstr ""
+
+#. 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 ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:282
+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`."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:284
+msgid ""
+"In the file `freshrss/extensions/xExtension-HelloWorld/extension.php` you "
+"need the structure:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:284
+#, no-wrap
+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:292
+msgid ""
+"There is an example HelloWorld extension that you can download from [our "
+"GitHub repo](https://github.com/FreshRSS/xExtension-HelloWorld)."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:294
+msgid ""
+"You may also need additional files or subdirectories depending on your "
+"needs:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:300
+msgid ""
+"`configure.phtml` is the file containing the form to parameterize your "
+"extension"
+msgstr ""
+
+#. 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)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:300
+msgid "A `Controllers` directory containing additional controllers"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:300
+msgid "An `i18n` directory containing additional translations"
+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"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:302
+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:303
+#, no-wrap
+msgid "The metadata.json file"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:306
+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:313
+msgid "`name`: the name of your extension"
+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"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:313
+msgid "`description`: a description of your extension"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:313
+msgid "`version`: the current version number of the extension"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:313
+msgid ""
+"`entrypoint`: Indicates the entry point of your extension. It must match the "
+"name of the class contained in the file `extension.php` without the suffix` "
+"Extension` (so if the entry point is `HelloWorld`, your class will be "
+"called` HelloWorldExtension`)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:313
+msgid ""
+"`type`: Defines the type of your extension. There are two types: `system` "
+"and` user`. We will study this difference right after."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:315
+msgid "Only the `name` and` entrypoint` fields are required."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:316
+#, no-wrap
+msgid "Choosing between `system` and `user`"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:319
+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:321
+msgid "A __system__ extension in comparison is enabled for every account."
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:322
+#, no-wrap
+msgid "Writing your own extension.php"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:327
+msgid ""
+"This file is the entry point of your extension. It must contain a specific "
+"class to function. As mentioned above, the name of the class must be your "
+"`entrypoint` suffixed by` Extension` (`HelloWorldExtension` for example). "
+"In addition, this class must be inherited from the `Minz_Extension` class to "
+"benefit from extensions-specific methods."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:329
+msgid "Your class will benefit from four methods to redefine:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:334
+msgid ""
+"`install()` is called when a user clicks the button to activate your "
+"extension. It allows, for example, to update the database of a user in order "
+"to make it compatible with the extension. It returns `true` if everything "
+"went well or, if not, a string explaining the problem."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:334
+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."
+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."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:334
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:336
+msgid ""
+"In addition, you will have a number of methods directly inherited from "
+"`Minz_Extension` that you should not redefine:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:340
+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()`."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:340
+msgid ""
+"`getFileUrl($filename, $type)` will return the URL to a file in the `static` "
+"directory. The first parameter is the name of the file (without `static /`), "
+"the second is the type of file to be used (`css` or` js`)."
+msgstr ""
+
+#. 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` "
+"<base_name>Controller.php` and the name of the "
+"`FreshExtension_<base_name>_Controller` class."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:346
+msgid "`registerViews()`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:346
+msgid "`registerTranslates()`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:346
+msgid "`registerHook($hook_name, $hook_function)`"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:347
+#, no-wrap
+msgid "The \"hooks\" system"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:350
+msgid ""
+"You can register at the FreshRSS event system in an extensions `init()` "
+"method, to manipulate data when some of the core functions are executed."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:351
+#, 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('<h1>Hello World</h1>' . $entry->content());\n"
+"\t\treturn $entry;\n"
+"\t}\n"
+"}\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:365
+msgid "The following events are available:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:376
+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:376
+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:376
+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:376
+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:376
+msgid ""
+"`menu_admin_entry` (`function() -> string`): add an entry at the end of the "
+"\"Administration\" menu, the returned string must be valid HTML (e.g. `<li "
+"class=\"item active\"><a href=\"url\">New entry</a></li>`)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:376
+msgid ""
+"`menu_configuration_entry` (`function() -> string`): add an entry at the end "
+"of the \"Configuration\" menu, the returned string must be valid HTML "
+"(e.g. `<li class=\"item active\"><a href=\"url\">New entry</a></li>`)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:376
+msgid ""
+"`menu_other_entry` (`function() -> string`): add an entry at the end of the "
+"header dropdown menu (i.e. after the \"About\" entry), the returned string "
+"must be valid HTML (e.g. `<li class=\"item active\"><a href=\"url\">New "
+"entry</a></li>`)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:376
+msgid ""
+"`nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** "
+"add documentation"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:376
+msgid "`post_update` (`function(none) -> none`): **TODO** add documentation"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/03_Backend/05_Extensions.md:376
+msgid ""
+"`simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** "
+"add documentation"
+msgstr ""
+
+#. type: Title ###
+#: en/./developers/03_Backend/05_Extensions.md:377
+#, no-wrap
+msgid "Writing your own configure.phtml"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/03_Backend/05_Extensions.md:380
+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/04_Frontend/01_View_files.md:1
+#, no-wrap
+msgid "The .phtml files"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/04_Frontend/01_View_files.md:5
+#, no-wrap
+msgid "Writing a URL"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/04_Frontend/01_View_files.md:9
+#, no-wrap
+msgid "Displaying an icon"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/04_Frontend/02_Design.md:1
+#, no-wrap
+msgid "Template file"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/04_Frontend/02_Design.md:5
+#, no-wrap
+msgid "Writing a new theme"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/04_Frontend/02_Design.md:9
+#, no-wrap
+msgid "Overriding icons"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/05_Release_new_version.md:1
+#, no-wrap
+msgid "Preparing the release"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:4
+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."
+msgstr ""
+
+#. type: Title #
+#: en/./developers/05_Release_new_version.md:7
+#, no-wrap
+msgid "Check the dev status"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:10
+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: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 ""
+
+#. type: Title #
+#: en/./developers/05_Release_new_version.md:13
+#, no-wrap
+msgid "Git process"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:15
+#, no-wrap
+msgid ""
+"$ git checkout master\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`"
+msgstr ""
+
+#. 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."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:32
+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:33
+#, no-wrap
+msgid "Writing the update script"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:36
+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 `master` branch (this script must not include "
+"code specific to a particular version!) and `update_util.php`, which "
+"contains a list of functions useful for all scripts."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:38
+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:40
+msgid "There are then 5 functions that have to be executed:"
+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;"
+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;"
+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`;"
+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);"
+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)."
+msgstr ""
+
+#. type: Title ##
+#: en/./developers/05_Release_new_version.md:47
+#, no-wrap
+msgid "Updating the versions file"
+msgstr ""
+
+#. 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 ""
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:52
+msgid "Here's an example of a `versions.php` file:"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:53
+#, no-wrap
+msgid ""
+"<?php\n"
+"return array(\n"
+"\t// STABLE\n"
+"\t'0.8.0' => '1.0.0',\n"
+"\t'0.8.1' => '1.0.0',\n"
+"\t'1.0.0' => '1.0.1', // 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:68
+msgid "And here's how this table works:"
+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;"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/05_Release_new_version.md:74
+msgid "the `x.y.z.z-dev` versions are **all** updated to `master`;"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/05_Release_new_version.md:74
+msgid "stable versions are updated to stable versions;"
+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;"
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:76
+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:77
+#, no-wrap
+msgid "Deployment"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:80
+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:82
+msgid ""
+"When you're satisfied, update update.freshrss.org with the new script, test "
+"it again, and then move on."
+msgstr ""
+
+#. type: Title #
+#: en/./developers/05_Release_new_version.md:83
+#, no-wrap
+msgid "Updating the FreshRSS services"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:86
+msgid "Two services need to be updated immediately after the update."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/05_Release_new_version.md:89
+msgid "rss.freshrss.org;"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/05_Release_new_version.md:89
+msgid "demo.freshrss.org (public login: `demo` / `demodemo`)."
+msgstr ""
+
+#. type: Title #
+#: en/./developers/05_Release_new_version.md:90
+#, no-wrap
+msgid "Publicly announce the release"
+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!"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/05_Release_new_version.md:98
+msgid ""
+"on GitHub by creating[a new "
+"release](https://github.com/FreshRSS/FreshRSS/releases/new)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/05_Release_new_version.md:98
+msgid ""
+"on the freshrss.org blog, at least for stable versions (write the article "
+"on[FreshRSS/freshrss.org](https://github.com/FreshRSS/freshrss.org))"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/05_Release_new_version.md:98
+msgid "on Twitter ([@FreshRSS](https://twitter.com/FreshRSS) account)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./developers/05_Release_new_version.md:98
+msgid "and on mailing@freshrss.org"
+msgstr ""
+
+#. type: Title #
+#: en/./developers/05_Release_new_version.md:99
+#, no-wrap
+msgid "Starting the next development version"
+msgstr ""
+
+#. type: Plain text
+#: en/./developers/05_Release_new_version.md:101
+#, no-wrap
+msgid ""
+"$ git checkout master\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:110
+msgid ""
+"Also remember to update update.freshrss.org so that it takes the current "
+"development version into account."
+msgstr ""
+
+#. type: Plain text
+#: en/./index.md:2
+msgid "![FreshRSS logo](img/logo_freshrss.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./index.md:4
+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 ""
+
+#. type: Plain text
+#: en/./index.md:6
+msgid "FreshRSS has a lot of features including:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+msgid "RSS and Atom aggregation"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+msgid "Mark article as favorite if you liked it or if you want to read it later"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+msgid "Filter and search functionality helps to easily find articles"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+msgid "Statistics to show you the publishing frequency all the websites you follow"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+msgid "Import/export of your feeds into OPML format"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+msgid "Several themes created by the community"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+msgid "\"Google Reader\"-like API to connect Android applications"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+msgid ""
+"The application is \"responsive,\" which means it adapts to small screens so "
+"you can bring articles in your pocket"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+msgid ""
+"Self-hosted: the code is free (under AGPL3 licence), so you can host your "
+"own instance of FreshRSS"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+msgid "Multi-user, so you can also host for your friends and family"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:18
+msgid "And a lot more!"
+msgstr ""
+
+#. type: Plain text
+#: en/./index.md:20
+msgid "This documentation is split into different sections:"
+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"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+msgid ""
+"[Administrator documentation](./admins/01_Index.html) for detailed "
+"installation and maintenance related tasks"
+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"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./index.md:24
+msgid ""
+"[Contributor guidelines](./contributing.md) for those who want to help "
+"improve FreshRSS"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/02_First_steps.md:2
+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."
+msgstr ""
+
+#. 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."
+msgstr ""
+
+#. 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 ""
+
+#. type: Bullet: '1. '
+#: en/./users/02_First_steps.md:10
+msgid "[Add a feed manually](04_Subscriptions.md#adding-a-feed)"
+msgstr ""
+
+#. type: Bullet: '2. '
+#: en/./users/02_First_steps.md:10
+msgid "[Import an OPML or JSON file](04_Subscriptions.md#import-and-export)"
+msgstr ""
+
+#. type: Bullet: '3. '
+#: en/./users/02_First_steps.md:10
+msgid "[Use the bookmarklet](04_Subscriptions.md#use-bookmarklet)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/02_First_steps.md:12
+msgid ""
+"Once you have added your feeds to FreshRSS, it is time to read them. There "
+"are three availalbe reading modes:"
+msgstr ""
+
+#. 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"
+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"
+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"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/02_First_steps.md:18
+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:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+msgid "[Organize your feeds in categories](04_Subscriptions.md#feed-management)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+msgid "[Change the home page](05_Configuration.md#changing-the-view)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+msgid "[Choose the reading options](05_Configuration.md#reading-options)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+msgid "[Refresh feeds](03_Main_view.md#refreshing-feeds)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+msgid ""
+"[Filter articles](03_Main_view.md#filtering-articles) for a fast access to a "
+"selection"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+msgid ""
+"[Search an article](03_Main_view.md#searching-articles) published some time "
+"ago"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+msgid "[Access your feeds on a mobile device](06_Mobile_access.md)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+msgid "[Add some extensions](https://github.com/FreshRSS/Extensions)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/02_First_steps.md:27
+msgid "[Frequently asked questions](07_Frequently_Asked_Questions.md)"
+msgstr ""
+
+#. type: Title #
+#: en/./users/03_Main_view.md:1
+#, no-wrap
+msgid "Normal view"
+msgstr ""
+
+#. type: Title #
+#: en/./users/03_Main_view.md:5
+#, no-wrap
+msgid "Global view"
+msgstr ""
+
+#. type: Title #
+#: en/./users/03_Main_view.md:9
+#, no-wrap
+msgid "Reader view"
+msgstr ""
+
+#. type: Title #
+#: en/./users/03_Main_view.md:13
+#, no-wrap
+msgid "Refreshing feeds"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:16
+msgid ""
+"To take full advantage of FreshRSS, it needs to retrieve new items from the "
+"feeds you have subscribed to. There are several ways to do this."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/03_Main_view.md:17
+#, no-wrap
+msgid "Automatic update"
+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."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/03_Main_view.md:21
+#, no-wrap
+msgid "With the actualize_script.php script"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:24
+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/03_Main_view.md:26
+msgid ""
+"The script is named *actualize_script.php* and is located in the *app* "
+"folder. The scheduled task syntax will not be explained here. However, here "
+"is [a quick introduction to "
+"crontab](http://www.adminschoice.com/crontab-quick-reference/) that might "
+"help you."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:28
+msgid "Here is an example to trigger article update every hour."
+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"
+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"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:34
+msgid "Special parameters to configure the script - all parameters can be combined:"
+msgstr ""
+
+#. 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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:42
+msgid ""
+"- Parameter \"ajax\" "
+"https://freshrss.example.net/i/?c=feed&a=actualize&ajax=1 Only a status site "
+"is returned and not a complete website. Example: \"OK\""
+msgstr ""
+
+#. type: 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\"."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:50
+msgid ""
+"- Parameter \"token\" "
+"https://freshrss.example.net/i/?c=feed&a=actualize&token=542345872345734 "
+"Security parameter to prevent unauthorized refreshes. For detailed "
+"Documentation see \"Form authentication\"."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/03_Main_view.md:51
+#, no-wrap
+msgid "Online cron"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:54
+msgid ""
+"If you do not have access to the installation server scheduled task, you can "
+"still automate the update process."
+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."
+msgstr ""
+
+#. type: Title ####
+#: en/./users/03_Main_view.md:57
+#, no-wrap
+msgid "No authentication"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:60
+msgid ""
+"This is the most straightforward since you have a public instance; there is "
+"nothing special to configure:"
+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"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/03_Main_view.md:65
+#, no-wrap
+msgid "Form authentication"
+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”)."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:70
+msgid "![Anonymous access configuration](../img/users/anonymous_access.1.png)"
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:74
+msgid ""
+"You can also configure an authentication token to grant special access on "
+"the server."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:76
+msgid "![Token configuration](../img/users/token.1.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:78
+msgid "The scheduled task syntax should look as follows:"
+msgstr ""
+
+#. 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 ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:84
+msgid ""
+"You can also target a different user by adding their username to the query "
+"string, with `&user=insert-username`:"
+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 ""
+
+#. type: Title ###
+#: en/./users/03_Main_view.md:89
+#, no-wrap
+msgid "HTTP authentication"
+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!**"
+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"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/03_Main_view.md:97
+#, no-wrap
+msgid "Manual update"
+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."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/03_Main_view.md:101
+#, no-wrap
+msgid "Complete update"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:104
+msgid ""
+"This update occurs on all feeds. To trigger it, simply click on the update "
+"link in the navigation menu."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:106
+msgid "![Navigation menu](../img/users/refresh.1.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:108
+msgid ""
+"When the update starts, a progress bar appears and changes while feeds are "
+"processed."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:110
+msgid "![Progress bar](../img/users/refresh.5.png)"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/03_Main_view.md:111
+#, no-wrap
+msgid "Partial update"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:114
+msgid ""
+"This update occurs on the selected feed only. To trigger it, simply click on "
+"the update link in the feed menu."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:116
+msgid "![Feed menu](../img/users/refresh.2.png)"
+msgstr ""
+
+#. type: Title #
+#: en/./users/03_Main_view.md:117
+#, no-wrap
+msgid "Filtering articles"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:120
+msgid ""
+"When the number of articles stored by FreshRSS inevitably grows larger, it's "
+"important to use efficient filters to display only a subset of the "
+"articles. There are several methods that filter with different "
+"criteria. Usually those methods can be combined."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/03_Main_view.md:121
+#, no-wrap
+msgid "By category"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:124
+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/03_Main_view.md:127
+msgid ""
+"*Main feed* displays only articles from feeds marked as available in that "
+"category"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/03_Main_view.md:127
+msgid "*Favourites* displays only articles marked as favourites"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/03_Main_view.md:128
+#, no-wrap
+msgid "By feed"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:131
+msgid "There are several methods to filter articles by feed:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/03_Main_view.md:136
+msgid "by clicking the feed title in the side panel"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/03_Main_view.md:136
+msgid "by clicking the feed title in the article details"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/03_Main_view.md:136
+msgid "by filtering in the feed options from the side panel"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/03_Main_view.md:136
+msgid "by filtering in the feed configuration"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:138
+msgid "![Feed filter](../img/users/feed.filter.1.png)"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/03_Main_view.md:139
+#, no-wrap
+msgid "By status"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:142
+msgid ""
+"Each article has two attributes that can be combined. The first attribute "
+"indicates whether or not the article has been read. The second attribute "
+"indicates if the article was marked as favorite or not."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:144
+msgid ""
+"In version 0.7, attribute filters are available in the article display "
+"dropdown list. With this version, it's not possible to combine filters. For "
+"instance, it's not possible to display only read and favorite articles."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:146
+msgid "![Attribute filters in 0.7](../img/users/status.filter.0.7.png)"
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:150
+msgid "![Attribute filters in 0.8](../img/users/status.filter.0.8.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:152
+msgid "By default, this filter displays only unread articles"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/03_Main_view.md:153
+#, no-wrap
+msgid "By content"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:156
+msgid ""
+"It is possible to filter articles by their content by inputting a string in "
+"the search field."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/03_Main_view.md:157
+#, no-wrap
+msgid "With the search field"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:160
+msgid "You can use the search field to further refine results:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/03_Main_view.md:199
+msgid "by author: `author:name` or `author:'composed name'`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/03_Main_view.md:199
+msgid "by title: `intitle:keyword` or `intitle:'composed keyword'`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/03_Main_view.md:199
+msgid "by URL: `inurl:keyword` or `inurl:'composed keyword'`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/03_Main_view.md:199
+msgid "by tag: `#tag`"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/03_Main_view.md:199
+msgid "by free-text: `keyword` or `'composed keyword'`"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:199
+#, no-wrap
+msgid ""
+"* by date of discovery, using the [ISO 8601 time interval "
+"format](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals): "
+"`date:<date-interval>`\n"
+"\t* From a specific day, or month, or year:\n"
+"\t\t* `date:2014-03-30`\n"
+"\t\t* `date:2014-03` or `date:201403`\n"
+"\t\t* `date:2014`\n"
+"\t* From a specific time of a given day:\n"
+"\t\t* `date:2014-05-30T13`\n"
+"\t\t* `date:2014-05-30T13:30`\n"
+"\t* Between two given dates:\n"
+"\t\t* `date:2014-02/2014-04`\n"
+"\t\t* `date:2014-02--2014-04`\n"
+"\t\t* `date:2014-02/04`\n"
+"\t\t* `date:2014-02-03/05`\n"
+"\t\t* `date:2014-02-03T22:00/22:15`\n"
+"\t\t* `date:2014-02-03T22:00/15`\n"
+"\t* After a given date:\n"
+"\t\t* `date:2014-03/`\n"
+"\t* Before a given date:\n"
+"\t\t* `date:/2014-03`\n"
+"\t* For a specific duration after a given date:\n"
+"\t\t* `date:2014-03/P1W`\n"
+"\t* For a specific duration before a given date:\n"
+"\t\t* `date:P1W/2014-05-25T23:59:59`\n"
+"\t* For the past duration before now (the trailing slash is optional):\n"
+"\t\t* `date:P1Y/` or `date:P1Y` (past year)\n"
+"\t\t* `date:P2M/` (past two months)\n"
+"\t\t* `date:P3W/` (past three weeks)\n"
+"\t\t* `date:P4D/` (past four days)\n"
+"\t\t* `date:PT5H/` (past five hours)\n"
+"\t\t* `date:PT30M/` (past thirty minutes)\n"
+"\t\t* `date:PT90S/` (past ninety seconds)\n"
+"\t\t* `date:P1DT1H/` (past one day and one hour)\n"
+"* by date of publication, using the same format: `pubdate:<date-interval>`\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:201
+msgid "Be careful not to enter a space between the operator and the search value."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/03_Main_view.md:204
+msgid ""
+"Some operators can be used negatively, to exclude articles, with the same "
+"syntax as above, but prefixed by a `!` or `-`: `-author:name`, "
+"`-intitle:keyword`, `-inurl:keyword`, `-#tag`, `!keyword`."
+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."
+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`"
+msgstr ""
+
+#. type: Title #
+#: en/./users/04_Subscriptions.md:1
+#, no-wrap
+msgid "Adding a feed"
+msgstr ""
+
+#. type: Title #
+#: en/./users/04_Subscriptions.md:5
+#, no-wrap
+msgid "Import and export"
+msgstr ""
+
+#. type: Title #
+#: en/./users/04_Subscriptions.md:9
+#, no-wrap
+msgid "Use bookmarklet"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/04_Subscriptions.md:12
+msgid ""
+"Bookmarklets are little scripts that you can execute to perform various "
+"tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds."
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/04_Subscriptions.md:16
+msgid "Open \"Subscriptions management\"."
+msgstr ""
+
+#. type: Bullet: ' 2. '
+#: en/./users/04_Subscriptions.md:16
+msgid "Click on \"Subscription tools\"."
+msgstr ""
+
+#. type: Bullet: ' 3. '
+#: en/./users/04_Subscriptions.md:16
+msgid ""
+"Drag the \"Subscribe\" button to your bookmark toolbar or right click and "
+"choose your browser's \"Bookmark link\" action."
+msgstr ""
+
+#. type: Title #
+#: en/./users/04_Subscriptions.md:17
+#, no-wrap
+msgid "Feed management"
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:2
+#, no-wrap
+msgid "Display"
+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)."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:11
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:13
+msgid ""
+"Available languages are: cz, de, en, es, fr, he, it, kr, nl, oc, pt-br, ru, "
+"tr, zh-cn."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:14
+#, no-wrap
+msgid "Theme"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:17
+msgid ""
+"There's no accounting for tastes, which is why FreshRSS offers eight "
+"official themes:"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Blue Lagoon* by **Mister aiR**"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Dark* by **AD**"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Flat design* by **Marien Fressinaud**"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Origine* by **Marien Fressinaud**"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Origine-compact* by **Kevin Papst**"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Pafat* by **Plopoyop**"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Screwdriver* by **Mister aiR**"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:26
+msgid "*Swage* by **Patrick Crandol**"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:28
+msgid ""
+"If you can't find any themes you like, it's always possible to [create your "
+"own](../developers/04_Frontend/02_Design.md)."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:30
+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"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:34
+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"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:39
+msgid "**Large** displays content up to a maximum width of 1000 pixels"
+msgstr ""
+
+#. type: Bullet: ' * '
+#: en/./users/05_Configuration.md:39
+msgid "**No limit** displays the content on 100% of the available space"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:40
+#, no-wrap
+msgid "Article icons"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:43
+msgid "Please note that this section only affects normal view."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:45
+msgid "![Article icons configuration](../img/users/configuration.article.icons.png)"
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:52
+msgid ""
+"If you disable every item in the top line, you'll still be able to see it "
+"since it contains the feed name and the article title. But if you do the "
+"same thing for the bottom line, it will be empty."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:53
+#, no-wrap
+msgid "HTML5 notification timout"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:56
+msgid ""
+"After automatically updating the feeds, FreshRSS can pop up a notification "
+"using the HTML5 notification API."
+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."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:59
+#, no-wrap
+msgid "Show the navigation button"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:62
+msgid ""
+"By default, FreshRSS displays buttons to ease the article navigation when "
+"browsing on mobile. The drawback is that they eat up some precious space."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:64
+msgid ""
+"![navigation button "
+"configuration](../img/users/configuration.navigation.button.png)"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:66
+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"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:71 en/./users/05_Configuration.md:154
+#, no-wrap
+msgid "Archival"
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:75
+#, no-wrap
+msgid "Sharing"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:78
+msgid "To make your life easier, you can share articles straight from FreshRSS."
+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.)."
+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)"
+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:"
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:90
+msgid "Select the desired sharing method in the drop-down list."
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:90
+msgid "Press the ```✚``` button to add it to the list."
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:90
+msgid ""
+"Configure the method in the list. All names can be modified in the "
+"display. Some methods need the sharing URL to be able to work properly (ex: "
+"Shaarli)."
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:90 en/./users/05_Configuration.md:95
+msgid "Submit your changes."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:92
+msgid "To remove an item from the list, follow those simple steps:"
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:95
+msgid "Press the ```❌``` button next to the share method you want to remove."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:96
+#, no-wrap
+msgid "Shortcuts"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:100
+msgid ""
+"To ease the use of the application, FreshRSS comes with a lot of predefined "
+"keyboard shortcuts. They allow actions to improve the user experience with "
+"a keyboard."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:102
+msgid ""
+"Of course, if you're not satisfied with the key mapping, you can change you "
+"configuration to fit your needs."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:104
+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 ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:109
+msgid "Navigation: they allow navigation through articles, feeds, and categories."
+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."
+msgstr ""
+
+#. 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: 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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:114
+msgid "The same process applies to the user queries."
+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."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:118
+#, no-wrap
+msgid "User queries"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:122
+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."
+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."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:125
+#, no-wrap
+msgid "Users"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:129
+#, no-wrap
+msgid "Authentication methods"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/05_Configuration.md:131
+#, no-wrap
+msgid "HTTP Authentication (Apache)"
+msgstr ""
+
+#. type: Bullet: ' 1. '
+#: en/./users/05_Configuration.md:137
+msgid "User control is based on the `.htaccess` file."
+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."
+msgstr ""
+
+#. type: Bullet: ' 3. '
+#: en/./users/05_Configuration.md:137
+msgid ""
+"If you want to limit all access to registered users only, place the file in "
+"the FreshRSS directory itself or in a parent directory. Note that WebSub and "
+"API will not work!"
+msgstr ""
+
+#. type: Bullet: ' 4. '
+#: en/./users/05_Configuration.md:137
+msgid "Example `.htaccess` file for a user \"marie\":"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:138
+#, 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: Plain text
+#: en/./users/05_Configuration.md:147
+msgid ""
+"More information can be found in the [Apache "
+"documentation](http://httpd.apache.org/docs/trunk/howto/auth.html#gettingitworking)."
+msgstr ""
+
+#. type: Title #
+#: en/./users/05_Configuration.md:148
+#, no-wrap
+msgid "Subscription management"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:150
+#, no-wrap
+msgid "Information"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:158
+#, no-wrap
+msgid "Login"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/05_Configuration.md:162
+#, no-wrap
+msgid "Advanced"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/05_Configuration.md:164
+#, no-wrap
+msgid "Retrieve a truncated stream from within FreshRSS"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:167
+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 ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:169
+msgid ""
+"Please be aware that this way you'll generate much more traffic to the "
+"originating sites, and they might block you accordingly. FreshRSS "
+"performance is also negatively affected, because you'll have to fetch the "
+"full article content one by one. So it's a feature to use sparingly!"
+msgstr ""
+
+#. 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)."
+msgstr ""
+
+#. type: Title ####
+#: en/./users/05_Configuration.md:172
+#, no-wrap
+msgid "Example: Rue89"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:175
+msgid ""
+"To find this path, you have to go to the address of one of the truncated "
+"articles (for example, "
+"http://www.rue89.com/2013/10/15/prof-maths-jai-atteint-lextase-dihn-pedagogie-inversee-246635). "
+"You look have to look for the \"block\" of HTML that corresponds to article "
+"content (in the source code!)."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:177
+#, no-wrap
+msgid ""
+"Here we find that the block that encompasses nothing but the content of the "
+"article is ```<div class=\"content clearfix\">```. We'll only use the "
+"`.content` class here. Nevertheless, as said above, it's best to start the "
+"path with an id. If we go back to the parent block, we find ```<div "
+"id=\"article\">``` and that's perfect! The path will be ```#article "
+".content```.\n"
+msgstr ""
+
+#. type: Title ####
+#: en/./users/05_Configuration.md:178
+#, no-wrap
+msgid ""
+"Add the corresponding classes to the article CSS path on the feed "
+"configuration page. Examples:"
+msgstr ""
+
+#. 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```"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:184
+msgid "Lesnumériques: ```article#body div.text.clearfix```"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:184
+msgid "Phoronix: ```#main .content```"
+msgstr ""
+
+#. type: Title ###
+#: en/./users/05_Configuration.md:185
+#, no-wrap
+msgid "Retrieve a truncated stream with external tools"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/05_Configuration.md:188
+msgid "Complimentary tools can be used to retrieve full article content, such as:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:190
+msgid "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/05_Configuration.md:190
+msgid "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)"
+msgstr ""
+
+#. type: Title #
+#: en/./users/06_Fever_API.md:1
+#, no-wrap
+msgid "FreshRSS - Fever API implementation"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:5
+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"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:11
+msgid ""
+"There are many RSS clients that support the Fever API, but they seem to "
+"understand the Fever API a bit differently. If your favourite client "
+"doesn't work properly with this API, please create an issue and we'll have a "
+"look. But we can **only** do that for free clients."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/06_Fever_API.md:12
+#, no-wrap
+msgid "Usage & Authentication"
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:18
+msgid ""
+"Then point your mobile application to the `fever.php` address "
+"(e.g. `https://freshrss.example.net/api/fever.php`)."
+msgstr ""
+
+#. type: Title #
+#: en/./users/06_Fever_API.md:19 en/./users/06_Mobile_access.md:44
+#, no-wrap
+msgid "Compatible clients"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:22
+msgid "Tested with:"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:25
+#, no-wrap
+msgid ""
+"* Android\n"
+" * "
+"[Readably](https://play.google.com/store/apps/details?id=com.isaiasmatewos.readably) "
+"(Closed source)\n"
+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"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:33
+#, no-wrap
+msgid ""
+"* MacOS\n"
+" * [ReadKit](https://apps.apple.com/app/readkit/id588726889) (Commercial)\n"
+msgstr ""
+
+#. type: Title ##
+#: en/./users/06_Fever_API.md:35
+#, no-wrap
+msgid "Features"
+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"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "fetching feeds"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid ""
+"fetching RSS items (new, favorites, unread, by_id, by_feed, by_category, "
+"since)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "fetching favicons"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "setting read marker for item(s)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "setting starred marker for item(s)"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "setting read marker for feed"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "setting read marker for category"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:48
+msgid "supports FreshRSS extensions, which use the `entry_before_display` hook"
+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."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/06_Fever_API.md:53
+#, no-wrap
+msgid "Testing and debugging"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:56
+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/./users/06_Fever_API.md:58
+msgid ""
+"Configure a POST request to the URL "
+"https://freshrss.example.net/api/fever.php?api which should give you the "
+"result:"
+msgstr ""
+
+#. type: Code fence info string
+#: en/./users/06_Fever_API.md:58 en/./users/06_Fever_API.md:80
+#, no-wrap
+msgid "json"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:58
+#, no-wrap
+msgid ""
+"{\n"
+"\t\"api_version\": 3,\n"
+"\t\"auth\": 0\n"
+"}\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:65
+msgid "Great, the base setup seems to work!"
+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"
+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"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:74
+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: 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"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:80
+msgid "This should give:"
+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"
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Fever_API.md:90
+msgid "Some basic calls are:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&items"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&feeds"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&groups"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&unread_item_ids"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&saved_item_ids"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/06_Fever_API.md:100
+msgid "https://freshrss.example.net/api/fever.php?api&items&since_id=some_id"
+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 ""
+
+#. 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"
+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"
+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."
+msgstr ""
+
+#. type: Title ###
+#: en/./users/06_Fever_API.md:103
+#, no-wrap
+msgid "Debugging"
+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:"
+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"
+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`."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/06_Fever_API.md:113
+#, no-wrap
+msgid "Credits"
+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)."
+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)."
+msgstr ""
+
+#. type: Title #
+#: en/./users/06_Mobile_access.md:3
+#, no-wrap
+msgid "Enable the API in FreshRSS"
+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)”."
+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"
+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."
+msgstr ""
+
+#. type: Title #
+#: en/./users/06_Mobile_access.md:14
+#, no-wrap
+msgid "Testing"
+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”."
+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"
+msgstr ""
+
+#. type: Title #
+#: en/./users/06_Mobile_access.md:23
+#, no-wrap
+msgid "Fix server configuration"
+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"
+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://play.google.com/store/apps/details?id=com.noinnion.android.newsplus) "
+"with [News+ Google Reader "
+"extension](https://play.google.com/store/apps/details?id=com.noinnion.android.newsplus.extension.google_reader) "
+"(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 ""
+
+#. type: Title #
+#: en/./users/06_Mobile_access.md:65
+#, no-wrap
+msgid "Google Reader compatible API"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/06_Mobile_access.md:68
+msgid "Examples of basic queries:"
+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"
+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."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/07_Frequently_Asked_Questions.md:3
+#, no-wrap
+msgid "What is `/i` at the end of the application URL?"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:6
+msgid "Of course, ```/i``` has a purpose! It's used for performance and usability:"
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/07_Frequently_Asked_Questions.md:11
+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/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 ""
+
+#. type: Bullet: '* '
+#: en/./users/07_Frequently_Asked_Questions.md:11
+msgid ""
+"It avoids problems while serving public resources like ```favicon.ico```, "
+"```robots.txt```, etc."
+msgstr ""
+
+#. type: Bullet: '* '
+#: en/./users/07_Frequently_Asked_Questions.md:11
+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: Title ##
+#: en/./users/07_Frequently_Asked_Questions.md:12
+#, no-wrap
+msgid "Why is `robots.txt` located in a sub-folder?"
+msgstr ""
+
+#. type: Plain text
+#: 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 ""
+
+#. 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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:19
+msgid "The same principle applies to `favicon.ico` and `.htaccess`."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/07_Frequently_Asked_Questions.md:20
+#, no-wrap
+msgid "Why do I have errors while registering a feed?"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:26
+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: 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."
+msgstr ""
+
+#. 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."
+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."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/07_Frequently_Asked_Questions.md:31
+#, no-wrap
+msgid "How can you change a forgotten password?"
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:37
+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:"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:37
+#, no-wrap
+msgid "./cli/update_user.php --user <username> --password <password>\n"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:41
+msgid ""
+"For more information on that matter, please refer to the [dedicated "
+"documentation](../../cli/README.md)."
+msgstr ""
+
+#. type: Title ##
+#: en/./users/07_Frequently_Asked_Questions.md:42
+#, no-wrap
+msgid "Permissions under SELinux"
+msgstr ""
+
+#. 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 can't write to "
+"some data sub-directories. The following command should be executed as root "
+"to fix this problem:"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:45
+#, no-wrap
+msgid ""
+"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/07_Frequently_Asked_Questions.md:50
+#, no-wrap
+msgid "Why do I have a blank page while trying to configure the sharing options?"
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:53
+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."
+msgstr ""
+
+#. type: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:55
+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: Plain text
+#: en/./users/07_Frequently_Asked_Questions.md:57
+msgid "Examples with _uBlock_:"
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./users/07_Frequently_Asked_Questions.md:59
+msgid ""
+"Whitelist your FreshRSS instance by adding it in _uBlock > Open the "
+"dashboard > Whitelist_."
+msgstr ""
+
+#. type: Bullet: '- '
+#: en/./users/07_Frequently_Asked_Questions.md:59
+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 ""
diff --git a/docs/po4a.conf b/docs/po4a.conf
new file mode 100644
index 000000000..68055bb2c
--- /dev/null
+++ b/docs/po4a.conf
@@ -0,0 +1,23 @@
+# WARNING: this file is generated with translation-update.sh
+# DO NOT modify this file manually!
+[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/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/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/05_Release_new_version.md $lang:$lang/./developers/05_Release_new_version.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/./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"
diff --git a/lib/Minz/ExtensionManager.php b/lib/Minz/ExtensionManager.php
index 2240b7642..e6b8dafb0 100644
--- a/lib/Minz/ExtensionManager.php
+++ b/lib/Minz/ExtensionManager.php
@@ -15,6 +15,10 @@ class Minz_ExtensionManager {
// List of available hooks. Please keep this list sorted.
private static $hook_list = array(
+ 'check_url_before_add' => array( // function($url) -> Url | null
+ 'list' => array(),
+ 'signature' => 'OneToOne',
+ ),
'entry_before_display' => array( // function($entry) -> Entry | null
'list' => array(),
'signature' => 'OneToOne',
@@ -23,6 +27,10 @@ class Minz_ExtensionManager {
'list' => array(),
'signature' => 'OneToOne',
),
+ 'feed_before_actualize' => array( // function($feed) -> Feed | null
+ 'list' => array(),
+ 'signature' => 'OneToOne',
+ ),
'feed_before_insert' => array( // function($feed) -> Feed | null
'list' => array(),
'signature' => 'OneToOne',
diff --git a/lib/Minz/Helper.php b/lib/Minz/Helper.php
index c328d9e6b..5fddbf91c 100644
--- a/lib/Minz/Helper.php
+++ b/lib/Minz/Helper.php
@@ -8,17 +8,6 @@
* La classe Helper représente une aide pour des tâches récurrentes
*/
class Minz_Helper {
- /**
- * Annule les effets des magic_quotes pour une variable donnée
- * @param $var variable à traiter (tableau ou simple variable)
- */
- public static function stripslashes_r($var) {
- if (is_array($var)) {
- return array_map(array('Minz_Helper', 'stripslashes_r'), $var);
- } else {
- return stripslashes($var);
- }
- }
/**
* Wrapper for htmlspecialchars.
diff --git a/lib/Minz/Request.php b/lib/Minz/Request.php
index 9235f873a..ef641a0e9 100644
--- a/lib/Minz/Request.php
+++ b/lib/Minz/Request.php
@@ -11,6 +11,7 @@ class Minz_Request {
private static $controller_name = '';
private static $action_name = '';
private static $params = array();
+ private static $headers = array();
private static $default_controller_name = 'index';
private static $default_action_name = 'index';
@@ -100,7 +101,7 @@ class Minz_Request {
* Initialise la Request
*/
public static function init() {
- self::magicQuotesOff();
+ static::$headers = $_SERVER;
self::initJSON();
}
@@ -113,13 +114,15 @@ class Minz_Request {
/**
* Return true if the request is over HTTPS, false otherwise (HTTP)
+ *
+ * @return boolean
*/
public static function isHttps() {
- if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
- return strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https';
- } else {
- return isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on';
+ $header = static::getHeader('HTTP_X_FORWARDED_PROTO');
+ if (null !== $header) {
+ return 'https' === strtolower($header);
}
+ return 'on' === static::getHeader('HTTPS');
}
/**
@@ -128,45 +131,89 @@ class Minz_Request {
* @return the base url (e.g. http://example.com/)
*/
public static function guessBaseUrl() {
- $url = 'http';
+ $protocol = static::extractProtocol();
+ $host = static::extractHost();
+ $port = static::extractPortForUrl();
+ $prefix = static::extractPrefix();
+ $path = static::extractPath();
- $https = self::isHttps();
+ return filter_var("{$protocol}://{$host}{$port}{$prefix}{$path}", FILTER_SANITIZE_URL);
+ }
- if (!empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
- $host = parse_url('http://' . $_SERVER['HTTP_X_FORWARDED_HOST'], PHP_URL_HOST);
- } elseif (!empty($_SERVER['HTTP_HOST'])) {
- //Might contain a port number, and mind IPv6 addresses
- $host = parse_url('http://' . $_SERVER['HTTP_HOST'], PHP_URL_HOST);
- } elseif (!empty($_SERVER['SERVER_NAME'])) {
- $host = $_SERVER['SERVER_NAME'];
- } else {
- $host = 'localhost';
+ /**
+ * @return string
+ */
+ private static function extractProtocol() {
+ if (static::isHttps()) {
+ return 'https';
}
+ return 'http';
+ }
- if (!empty($_SERVER['HTTP_X_FORWARDED_PORT'])) {
- $port = intval($_SERVER['HTTP_X_FORWARDED_PORT']);
- } elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
- $port = strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https' ? 443 : 80;
- } elseif (!empty($_SERVER['SERVER_PORT'])) {
- $port = intval($_SERVER['SERVER_PORT']);
- } else {
- $port = $https ? 443 : 80;
+ /**
+ * @return string
+ */
+ private static function extractHost() {
+ if (null !== $host = static::getHeader('HTTP_X_FORWARDED_HOST')) {
+ return parse_url("http://{$host}", PHP_URL_HOST);
}
+ if (null !== $host = static::getHeader('HTTP_HOST')) {
+ // Might contain a port number, and mind IPv6 addresses
+ return parse_url("http://{$host}", PHP_URL_HOST);
+ }
+ if (null !== $host = static::getHeader('SERVER_NAME')) {
+ return $host;
+ }
+ return 'localhost';
+ }
- if ($https) {
- $url .= 's://' . $host . ($port == 443 ? '' : ':' . $port);
- } else {
- $url .= '://' . $host . ($port == 80 ? '' : ':' . $port);
+ /**
+ * @return integer
+ */
+ private static function extractPort() {
+ if (null !== $port = static::getHeader('HTTP_X_FORWARDED_PORT')) {
+ return intval($port);
}
- if (!empty($_SERVER['HTTP_X_FORWARDED_PREFIX'])) {
- $url .= rtrim($_SERVER['HTTP_X_FORWARDED_PREFIX'], '/ ');
+ if (null !== $proto = static::getHeader('HTTP_X_FORWARDED_PROTO')) {
+ return 'https' === strtolower($proto) ? 443 : 80;
}
- if (isset($_SERVER['REQUEST_URI'])) {
- $path = $_SERVER['REQUEST_URI'];
- $url .= substr($path, -1) === '/' ? substr($path, 0, -1) : dirname($path);
+ if (null !== $port = static::getHeader('SERVER_PORT')) {
+ return intval($port);
}
+ return static::isHttps() ? 443 : 80;
+ }
- return filter_var($url, FILTER_SANITIZE_URL);
+ /**
+ * @return string
+ */
+ private static function extractPortForUrl() {
+ if (static::isHttps() && 443 !== $port = static::extractPort()) {
+ return ":{$port}";
+ }
+ if (!static::isHttps() && 80 !== $port = static::extractPort()) {
+ return ":{$port}";
+ }
+ return '';
+ }
+
+ /**
+ * @return string
+ */
+ private static function extractPrefix() {
+ if (null !== $prefix = static::getHeader('HTTP_X_FORWARDED_PREFIX')) {
+ return rtrim($prefix, '/ ');
+ }
+ return '';
+ }
+
+ /**
+ * @return string
+ */
+ private static function extractPath() {
+ if (null !== $path = static::getHeader('REQUEST_URI')) {
+ return '/' === substr($path, -1) ? substr($path, 0, -1) : dirname($path);
+ }
+ return '';
}
/**
@@ -242,40 +289,44 @@ class Minz_Request {
* $default si $_GET[$param] n'existe pas
*/
public static function fetchGET($param = false, $default = false) {
- if ($param === false) {
+ if (false === $param) {
return $_GET;
- } elseif (isset($_GET[$param])) {
+ }
+ if (isset($_GET[$param])) {
return $_GET[$param];
- } else {
- return $default;
}
+ return $default;
}
/**
* Allows receiving POST data as application/json
*/
private static function initJSON() {
- $contentType = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '';
- if ($contentType == '') { //PHP < 5.3.16
- $contentType = isset($_SERVER['HTTP_CONTENT_TYPE']) ? $_SERVER['HTTP_CONTENT_TYPE'] : '';
+ if ('application/json' !== static::extractContentType()) {
+ return;
+ }
+ if ('' === $ORIGINAL_INPUT = file_get_contents('php://input', false, null, 0, 1048576)) {
+ return;
}
- $contentType = strtolower(trim($contentType));
- if ($contentType === 'application/json') {
- $ORIGINAL_INPUT = file_get_contents('php://input', false, null, 0, 1048576);
- if ($ORIGINAL_INPUT != '') {
- $json = json_decode($ORIGINAL_INPUT, true);
- if ($json != null) {
- foreach ($json as $k => $v) {
- if (!isset($_POST[$k])) {
- $_POST[$k] = $v;
- }
- }
- }
+ if (null === $json = json_decode($ORIGINAL_INPUT, true)) {
+ return;
+ }
+
+ foreach ($json as $k => $v) {
+ if (!isset($_POST[$k])) {
+ $_POST[$k] = $v;
}
}
}
/**
+ * @return string
+ */
+ private static function extractContentType() {
+ return strtolower(trim(static::getHeader('CONTENT_TYPE')));
+ }
+
+ /**
* Permet de récupérer une variable de type $_POST
* @param $param nom de la variable
* @param $default valeur par défaut à attribuer à la variable
@@ -284,31 +335,39 @@ class Minz_Request {
* $default si $_POST[$param] n'existe pas
*/
public static function fetchPOST($param = false, $default = false) {
- if ($param === false) {
+ if (false === $param) {
return $_POST;
- } elseif (isset($_POST[$param])) {
+ }
+ if (isset($_POST[$param])) {
return $_POST[$param];
- } else {
- return $default;
}
+ return $default;
}
/**
- * Méthode désactivant les magic_quotes pour les variables
- * $_GET
- * $_POST
- * $_COOKIE
+ * @return mixed
*/
- private static function magicQuotesOff() {
- if (get_magic_quotes_gpc()) {
- $_GET = Minz_Helper::stripslashes_r($_GET);
- $_POST = Minz_Helper::stripslashes_r($_POST);
- $_COOKIE = Minz_Helper::stripslashes_r($_COOKIE);
+ public static function getHeader($header, $default = null) {
+ if (isset(static::$headers[$header])) {
+ return static::$headers[$header];
}
+ return $default;
}
+ /**
+ * @return boolean
+ */
public static function isPost() {
- return isset($_SERVER['REQUEST_METHOD']) &&
- $_SERVER['REQUEST_METHOD'] === 'POST';
+ return 'POST' === static::getHeader('REQUEST_METHOD');
+ }
+
+ /**
+ * @return array
+ */
+ public static function getPreferredLanguage() {
+ if (preg_match_all('/(^|,)\s*(?P<lang>[^;,]+)/', static::getHeader('HTTP_ACCEPT_LANGUAGE'), $matches)) {
+ return $matches['lang'];
+ }
+ return array('en');
}
}
diff --git a/lib/SimplePie/SimplePie.php b/lib/SimplePie/SimplePie.php
index d684c1a2c..87626f369 100644
--- a/lib/SimplePie/SimplePie.php
+++ b/lib/SimplePie/SimplePie.php
@@ -33,7 +33,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @version 1.5.2
+ * @version 1.5.3
* @copyright 2004-2017 Ryan Parman, Geoffrey Sneddon, Ryan McCue
* @author Ryan Parman
* @author Geoffrey Sneddon
@@ -50,7 +50,7 @@ define('SIMPLEPIE_NAME', 'SimplePie');
/**
* SimplePie Version
*/
-define('SIMPLEPIE_VERSION', '1.5.2');
+define('SIMPLEPIE_VERSION', '1.5.3');
/**
* SimplePie Build
diff --git a/lib/SimplePie/SimplePie/Locator.php b/lib/SimplePie/SimplePie/Locator.php
index 3876a2da6..12bc15e15 100644
--- a/lib/SimplePie/SimplePie/Locator.php
+++ b/lib/SimplePie/SimplePie/Locator.php
@@ -402,7 +402,7 @@ class SimplePie_Locator
{
break;
}
- if (preg_match('/(rss|rdf|atom|xml)/i', $value))
+ if (preg_match('/(feed|rss|rdf|atom|xml)/i', $value))
{
$this->checked_feeds++;
$headers = array(
diff --git a/lib/SimplePie/SimplePie/Parse/Date.php b/lib/SimplePie/SimplePie/Parse/Date.php
index b29274c64..18e60e281 100644
--- a/lib/SimplePie/SimplePie/Parse/Date.php
+++ b/lib/SimplePie/SimplePie/Parse/Date.php
@@ -145,6 +145,14 @@ class SimplePie_Parse_Date
'Παρ' => 5,
'Σαβ' => 6,
'Κυρ' => 7,
+ // Russian
+ 'Пн.' => 1,
+ 'Вт.' => 2,
+ 'Ср.' => 3,
+ 'Чт.' => 4,
+ 'Пт.' => 5,
+ 'Сб.' => 6,
+ 'Вс.' => 7,
);
/**
@@ -290,6 +298,31 @@ class SimplePie_Parse_Date
'Οκτ' => 10,
'Νοέ' => 11,
'Δεκ' => 12,
+ // Russian
+ 'Янв' => 1,
+ 'января' => 1,
+ 'Фев' => 2,
+ 'февраля' => 2,
+ 'Мар' => 3,
+ 'марта' => 3,
+ 'Апр' => 4,
+ 'апреля' => 4,
+ 'Май' => 5,
+ 'мая' => 5,
+ 'Июн' => 6,
+ 'июня' => 6,
+ 'Июл' => 7,
+ 'июля' => 7,
+ 'Авг' => 8,
+ 'августа' => 8,
+ 'Сен' => 9,
+ 'сентября' => 9,
+ 'Окт' => 10,
+ 'октября' => 10,
+ 'Ноя' => 11,
+ 'ноября' => 11,
+ 'Дек' => 12,
+ 'декабря' => 12,
);
/**
@@ -541,8 +574,8 @@ class SimplePie_Parse_Date
*/
public function __construct()
{
- $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')';
- $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')';
+ $this->day_pcre = '(' . implode('|', array_keys($this->day)) . ')';
+ $this->month_pcre = '(' . implode('|', array_keys($this->month)) . ')';
static $cache;
if (!isset($cache[get_class($this)]))
@@ -690,7 +723,7 @@ class SimplePie_Parse_Date
}
// Convert the number of seconds to an integer, taking decimals into account
- $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));
+ $second = round((int)$match[6] + (int)$match[7] / (10 ** strlen($match[7])));
return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
}
diff --git a/p/scripts/main.js b/p/scripts/main.js
index 361bed02a..9ebc4c247 100644
--- a/p/scripts/main.js
+++ b/p/scripts/main.js
@@ -461,34 +461,58 @@ function next_entry(skipping) {
function prev_feed() {
let found = false;
+ let adjacent = null;
const feeds = document.querySelectorAll('#aside_feed .feed');
for (let i = feeds.length - 1; i >= 0; i--) {
const feed = feeds[i];
- if (found && getComputedStyle(feed).display !== 'none') {
- delayedClick(feed.querySelector('a.item-title'));
- break;
- } else if (feed.classList.contains('active')) {
+ if (feed.classList.contains('active')) {
found = true;
+ continue;
+ }
+ if (!found) {
+ continue;
+ }
+ if (getComputedStyle(feed).display === 'none') {
+ continue;
+ }
+ if (feed.dataset.unread != 0) {
+ return delayedClick(feed.querySelector('a.item-title'));
+ } else if (adjacent === null) {
+ adjacent = feed;
}
}
- if (!found) {
+ if (found) {
+ delayedClick(adjacent.querySelector('a.item-title'));
+ } else {
last_feed();
}
}
function next_feed() {
let found = false;
+ let adjacent = null;
const feeds = document.querySelectorAll('#aside_feed .feed');
for (let i = 0; i < feeds.length; i++) {
const feed = feeds[i];
- if (found && getComputedStyle(feed).display !== 'none') {
- delayedClick(feed.querySelector('a.item-title'));
- break;
- } else if (feed.classList.contains('active')) {
+ if (feed.classList.contains('active')) {
found = true;
+ continue;
+ }
+ if (!found) {
+ continue;
+ }
+ if (getComputedStyle(feed).display === 'none') {
+ continue;
+ }
+ if (feed.dataset.unread != 0) {
+ return delayedClick(feed.querySelector('a.item-title'));
+ } else if (adjacent === null) {
+ adjacent = feed;
}
}
- if (!found) {
+ if (found) {
+ delayedClick(adjacent.querySelector('a.item-title'));
+ } else {
first_feed();
}
}