aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml34
-rw-r--r--CHANGELOG.md30
-rw-r--r--CREDITS.md10
-rw-r--r--README.fr.md20
-rw-r--r--README.md23
-rw-r--r--app/Controllers/categoryController.php4
-rwxr-xr-xapp/Controllers/feedController.php17
-rw-r--r--app/Controllers/importExportController.php17
-rwxr-xr-xapp/Controllers/indexController.php4
-rw-r--r--app/Controllers/subscriptionController.php7
-rw-r--r--app/Controllers/userController.php50
-rw-r--r--app/Exceptions/ZipException.php2
-rw-r--r--app/Models/CategoryDAO.php10
-rw-r--r--app/Models/ConfigurationSetter.php10
-rw-r--r--app/Models/Context.php8
-rw-r--r--app/Models/DatabaseDAO.php2
-rw-r--r--app/Models/DatabaseDAOPGSQL.php2
-rw-r--r--app/Models/DatabaseDAOSQLite.php2
-rw-r--r--app/Models/Entry.php1
-rw-r--r--app/Models/EntryDAO.php100
-rw-r--r--app/Models/EntryDAOPGSQL.php7
-rw-r--r--app/Models/EntryDAOSQLite.php57
-rw-r--r--app/Models/Feed.php28
-rw-r--r--app/Models/FeedDAO.php20
-rw-r--r--app/Models/Share.php2
-rw-r--r--app/Models/StatsDAO.php2
-rw-r--r--app/Models/Themes.php8
-rw-r--r--app/Models/UserDAO.php6
-rw-r--r--app/SQL/install.sql.sqlite.php38
-rw-r--r--app/i18n/cz/conf.php2
-rw-r--r--app/i18n/cz/gen.php9
-rw-r--r--app/i18n/cz/sub.php11
-rw-r--r--app/i18n/de/conf.php2
-rw-r--r--app/i18n/de/gen.php5
-rw-r--r--app/i18n/de/sub.php11
-rw-r--r--app/i18n/en/conf.php2
-rw-r--r--app/i18n/en/gen.php50
-rw-r--r--app/i18n/en/sub.php11
-rwxr-xr-xapp/i18n/es/admin.php181
-rwxr-xr-xapp/i18n/es/conf.php174
-rwxr-xr-xapp/i18n/es/feedback.php109
-rwxr-xr-xapp/i18n/es/gen.php189
-rwxr-xr-xapp/i18n/es/index.php61
-rwxr-xr-xapp/i18n/es/install.php119
-rwxr-xr-xapp/i18n/es/sub.php62
-rw-r--r--app/i18n/fr/gen.php9
-rw-r--r--app/i18n/fr/sub.php11
-rw-r--r--app/i18n/it/conf.php2
-rw-r--r--app/i18n/it/gen.php47
-rw-r--r--app/i18n/it/sub.php11
-rw-r--r--app/i18n/kr/admin.php181
-rw-r--r--app/i18n/kr/conf.php174
-rw-r--r--app/i18n/kr/feedback.php109
-rw-r--r--app/i18n/kr/gen.php189
-rw-r--r--app/i18n/kr/index.php61
-rw-r--r--app/i18n/kr/install.php119
-rw-r--r--app/i18n/kr/sub.php73
-rw-r--r--app/i18n/nl/conf.php2
-rw-r--r--app/i18n/nl/gen.php9
-rw-r--r--app/i18n/nl/sub.php11
-rw-r--r--app/i18n/pt-br/admin.php181
-rw-r--r--app/i18n/pt-br/conf.php174
-rw-r--r--app/i18n/pt-br/feedback.php109
-rw-r--r--app/i18n/pt-br/gen.php188
-rw-r--r--app/i18n/pt-br/index.php61
-rw-r--r--app/i18n/pt-br/install.php119
-rw-r--r--app/i18n/pt-br/sub.php62
-rw-r--r--app/i18n/ru/conf.php2
-rw-r--r--app/i18n/ru/gen.php5
-rw-r--r--app/i18n/ru/sub.php103
-rw-r--r--app/i18n/tr/conf.php2
-rw-r--r--app/i18n/tr/gen.php7
-rw-r--r--app/i18n/tr/sub.php11
-rw-r--r--app/i18n/zh-cn/conf.php2
-rw-r--r--app/i18n/zh-cn/gen.php10
-rw-r--r--app/i18n/zh-cn/sub.php11
-rw-r--r--app/install.php10
-rw-r--r--app/layout/aside_subscription.phtml6
-rw-r--r--app/views/subscription/bookmarklet.phtml13
-rw-r--r--app/views/update/checkInstall.phtml2
-rw-r--r--cli/README.md5
-rw-r--r--cli/_update-or-create-user.php56
-rwxr-xr-xcli/create-user.php29
-rwxr-xr-xcli/do-install.php9
-rwxr-xr-xcli/list-users.php3
-rwxr-xr-xcli/reconfigure.php3
-rwxr-xr-xcli/update-user.php23
-rw-r--r--constants.php6
-rw-r--r--data/shares.php2
-rw-r--r--docs/en/developers/03_Backend/05_Extensions.md2
-rw-r--r--docs/en/users/01_Installation.md7
-rw-r--r--docs/fr/developers/02_Github.md2
-rw-r--r--docs/fr/developers/03_Backend/05_Extensions.md2
-rw-r--r--docs/fr/users/01_Installation.md7
-rw-r--r--lib/Minz/ActionController.php6
-rw-r--r--lib/Minz/ActionException.php2
-rw-r--r--lib/Minz/Configuration.php4
-rw-r--r--lib/Minz/ControllerNotActionControllerException.php2
-rw-r--r--lib/Minz/ControllerNotExistException.php2
-rw-r--r--lib/Minz/CurrentPagePaginationException.php2
-rw-r--r--lib/Minz/Dispatcher.php2
-rw-r--r--lib/Minz/FileNotExistException.php2
-rw-r--r--lib/Minz/FrontController.php4
-rw-r--r--lib/Minz/Helper.php4
-rw-r--r--lib/Minz/Model.php2
-rw-r--r--lib/Minz/ModelArray.php3
-rw-r--r--lib/Minz/ModelPdo.php2
-rw-r--r--lib/Minz/PDOConnectionException.php2
-rw-r--r--lib/Minz/Paginator.php8
-rw-r--r--lib/Minz/Translate.php4
-rw-r--r--lib/Minz/View.php2
-rw-r--r--lib/favicons.php1
-rw-r--r--lib/lib_date.php5
-rw-r--r--lib/lib_install.php5
-rw-r--r--lib/lib_rss.php12
-rw-r--r--p/api/greader.php62
-rw-r--r--p/api/index.php3
-rw-r--r--p/api/pshb.php2
-rw-r--r--p/scripts/category.js2
-rw-r--r--p/scripts/global_view.js3
-rw-r--r--p/scripts/main.js39
-rw-r--r--p/themes/base-theme/README.md2
-rw-r--r--p/themes/base-theme/template.css16
-rw-r--r--phpcs.xml100
-rw-r--r--tests/app/Models/CategoryTest.php12
-rw-r--r--tests/app/Models/SearchTest.php216
-rw-r--r--tests/app/Models/UserQueryTest.php62
-rw-r--r--tests/bootstrap.php2
128 files changed, 3808 insertions, 550 deletions
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 000000000..5c43e5666
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,34 @@
+language: php
+php:
+ - '5.4'
+ - '5.5'
+ - '5.6'
+ - '7.0'
+ - '7.1'
+ - hhvm
+ - nightly
+
+install:
+ # newest version without https://github.com/squizlabs/PHP_CodeSniffer/pull/1404
+ - pear install PHP_CodeSniffer-3.0.0RC4
+
+script:
+ - phpenv rehash
+ - phpcs . --standard=phpcs.xml --warning-severity=0 --extensions=php -p
+
+env: # important! otherwise no job will be allowed to fail
+matrix:
+ # PHP 5.3 only runs on Ubuntu 12.04 (precise), not 14.04 (trusty)
+ include:
+ - php: "5.3"
+ dist: precise
+ fast_finish: true
+ allow_failures:
+ - php: "5.3"
+ dist: precise
+ - php: "5.4"
+ - php: "5.5"
+ - php: "5.6"
+ - php: "7.0"
+ - php: hhvm
+ - php: nightly
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 620bccc92..9dbdbe960 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,35 @@
# Changelog
+## 2017-10-01 FreshRSS 1.8.0
+
+* Compatibility:
+ * Minimal PHP version increased to PHP 5.3.8+ to fix sanitize bug [#1604](https://github.com/FreshRSS/FreshRSS/issues/1604)
+ * Add support for PHP 7.1 in the API [#1584](https://github.com/FreshRSS/FreshRSS/issues/1584), [#1594](https://github.com/FreshRSS/FreshRSS/pull/1594)
+* UI
+ * New page for subscription tools [#1534](https://github.com/FreshRSS/FreshRSS/issues/1354)
+ * Adjustments to the padding of the tree of categories and feeds [1589](https://github.com/FreshRSS/FreshRSS/pull/1589)
+ * Fix feed column position after lazy-loading images [#1616](https://github.com/FreshRSS/FreshRSS/pull/1616)
+ * Force UI controls for HTML5 video and audio [#1642](https://github.com/FreshRSS/FreshRSS/pull/1642)
+ * Fix share menu on small screens [#1645](https://github.com/FreshRSS/FreshRSS/pull/1645)
+ * Go back to previous view when collapsing article [#1177](https://github.com/FreshRSS/FreshRSS/issues/1177)
+* CLI
+ * New command `./cli/update-user` to update user settings [#1600](https://github.com/FreshRSS/FreshRSS/issues/1600)
+* I18n
+ * Korean [#1578](https://github.com/FreshRSS/FreshRSS/pull/1578)
+ * Portuguese (Brazilian) [#1648](https://github.com/FreshRSS/FreshRSS/pull/1648)
+ * Fix month abbreviations [#1560](https://github.com/FreshRSS/FreshRSS/issues/1560)
+* Bug fixing
+ * Fix API compatibility bug between PostgreSQL and EasyRSS [#1603](https://github.com/FreshRSS/FreshRSS/pull/1603)
+ * Fix PostgreSQL error when adding entries with duplicated GUID [#1610](https://github.com/FreshRSS/FreshRSS/issues/1610), [#1614](https://github.com/FreshRSS/FreshRSS/issues/1614)
+ * Fix for RSS feeds containing HTML in author field [#1590](https://github.com/FreshRSS/FreshRSS/issues/1590)
+ * Fix logout issue in global view due to CSRF [#1591](https://github.com/FreshRSS/FreshRSS/issues/1591)
+* Misc.
+ * Travis continuous integration [#1619](https://github.com/FreshRSS/FreshRSS/pull/1619)
+ * Allow longer database usernames [#1597](https://github.com/FreshRSS/FreshRSS/issues/1597)
+
+
## 2017-06-03 FreshRSS 1.7.0
+
* Features:
* Deferred insertion of new articles, for better chronological order [#530](https://github.com/FreshRSS/FreshRSS/issues/530)
* Better search:
@@ -30,6 +59,7 @@
* Simplified Chinese [#1541](https://github.com/FreshRSS/FreshRSS/pull/1541)
* Improve English [#1465](https://github.com/FreshRSS/FreshRSS/pull/1465)
* Improve Dutch [#1559](https://github.com/FreshRSS/FreshRSS/pull/1559)
+ * Added Spanish language [#1631] (https://github.com/FreshRSS/FreshRSS/pull/1631/)
* Security
* Do not require write access to check availability of new versions [#1450](https://github.com/FreshRSS/FreshRSS/issues/1450)
* Misc.
diff --git a/CREDITS.md b/CREDITS.md
index 97651ab20..cbbef73d6 100644
--- a/CREDITS.md
+++ b/CREDITS.md
@@ -6,14 +6,17 @@ People are sorted by name so please keep this order.
---
-* [Alexandre Alapetite](https://github.com/Alkarex): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=Alkarex), [Web](http://alexandre.alapetite.fr/)
+* [Adrien Dorsaz](https://github.com/Trim): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=Trim), [Web](https://adorsaz.ch/)
+* [Alexandre Alapetite](https://github.com/Alkarex): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=Alkarex), [Web](https://alexandre.alapetite.fr/)
* [Alexis Degrugillier](https://github.com/aledeg): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=aledeg)
* [Alwaysin](https://github.com/Alwaysin): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=Alwaysin)
* [Amaury Carrade](https://github.com/AmauryCarrade): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=AmauryCarrade), [Web](https://amaury.carrade.eu/)
+* [Anton Smirnov](https://github.com/sandfoxme): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:sandfoxme), [Web](http://sandfox.me/)
* [ASMfreaK](https://github.com/ASMfreaK): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=ASMfreaK)
* [Crupuk](https://github.com/Crupuk): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:Crupuk)
* [Damstre](https://github.com/Damstre): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:Damstre)
* [danc](https://github.com/danc): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=danc), [Web](http://tintouli.free.fr/)
+* [David Souza](https://github.com/araujo0205): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:araujo0205), [Web](http://davidsouza.tech/)
* [dswd](https://github.com/dswd): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:dswd)
* [ealdraed](https://github.com/ealdraed): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=ealdraed)
* [Frans de Jonge](https://github.com/Frenzie): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=Frenzie), [Web](http://fransdejonge.com/)
@@ -30,18 +33,19 @@ People are sorted by name so please keep this order.
* [Luc Didry](https://github.com/ldidry): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=ldidry), [Web](https://www.fiat-tux.fr/)
* [marcomrc](https://github.com/marcomrc): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=marcomrc)
* [Marcus Rohrmoser](https://github.com/mro): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=mro), [Web](http://mro.name/~me)
-* [Marien Fressinaud](https://github.com/marienfressinaud): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=marienfressinaud), [Web](http://marienfressinaud.fr/)
+* [Marien Fressinaud](https://github.com/marienfressinaud): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=marienfressinaud), [Web](https://marienfressinaud.fr/)
* [Melvyn Laïly](https://github.com/yaurthek): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=yaurthek), [Web](http://x2a.yt/)
+* [MSZ](https://github.com/mszkb): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=mszkb)
* [Nicolas Elie](https://github.com/nicolaselie): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=nicolaselie)
* [Nicolas Lœuillet](https://github.com/nicosomb): [contributions](https://github.com/FreshRSS/documentation/commits?author=nicosomb), [Web](http://www.loeuillet.org/)
* [plopoyop](https://github.com/plopoyop): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=plopoyop)
* [Paulius Šukys](https://github.com/psukys): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:psukys), [Web](http://sukys.eu)
* [purexo](https://github.com/purexo): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:purexo), [Web](https://purexo.mom/)
* [Quentin Dufour](https://github.com/superboum): [contributions](https://github.com/FreshRSS/documentation/commits?author=superboum), [Web](http://quentin.dufour.io/)
+* [Ramón Cutanda](https://github.com/rcutanda): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:rcutanda)
* [romibi](https://github.com/romibi): [contributions](https://github.com/FreshRSS/FreshRSS/commits/dev?author=romibi)
* [subic](https://github.com/subic): [contributions](https://github.com/FreshRSS/documentation/commits?author=subic)
* [Tets42](https://github.com/Tets42): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=Tets42)
* [Thomas Citharel](https://github.com/tcitworld): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:tomgue), [Web](https://www.tcit.fr/)
* [tomgue](https://github.com/tomgue): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=tomgue)
* [Wanabo](https://github.com/Wanabo): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=Wanabo)
-* [mszkb](https://github.com/mszkb): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=mszkb)
diff --git a/README.fr.md b/README.fr.md
index b7a28fd91..8f19b280a 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -10,7 +10,7 @@ Il supporte [PubSubHubbub](https://code.google.com/p/pubsubhubbub/) pour des not
Il y a une API pour les clients (mobiles), ainsi qu’une [interface en ligne de commande](./cli/README.md).
Enfin, il permet l’ajout d’[extensions](#extensions) pour encore plus de personnalisation.
-* Site officiel : http://freshrss.org
+* Site officiel : https://freshrss.org
* Démo : http://demo.freshrss.org/
* Licence : [GNU AGPL 3](http://www.gnu.org/licenses/agpl-3.0.html)
@@ -32,8 +32,8 @@ Nous sommes une communauté amicale.
* Serveur modeste, par exemple sous Linux ou Windows
* Fonctionne même sur un Raspberry Pi 1 avec des temps de réponse < 1s (testé sur 150 flux, 22k articles)
* Serveur Web Apache2 (recommandé), ou nginx, lighttpd (non testé sur les autres)
-* PHP 5.3.3+ (PHP 5.4+ recommandé, et PHP 5.5+ pour les performances, et PHP 7+ pour d’encore meilleures performances)
- * Requis : [cURL](http://php.net/curl), [DOM](http://php.net/dom), [XML](http://php.net/xml), et [PDO_MySQL](http://php.net/pdo-mysql) ou [PDO_SQLite](http://php.net/pdo-sqlite) ou [PDO_PGSQL](http://php.net/pdo-pgsql)
+* PHP 5.3.8+ (PHP 5.4+ recommandé, et PHP 5.5+ pour les performances, et PHP 7+ pour d’encore meilleures performances)
+ * Requis : [cURL](http://php.net/curl), [DOM](http://php.net/dom), [XML](http://php.net/xml), [session](http://php.net/session), [ctype](http://php.net/ctype), et [PDO_MySQL](http://php.net/pdo-mysql) ou [PDO_SQLite](http://php.net/pdo-sqlite) ou [PDO_PGSQL](http://php.net/pdo-pgsql)
* Recommandés : [JSON](http://php.net/json), [GMP](http://php.net/gmp) (pour accès API sur plateformes < 64 bits), [IDN](http://php.net/intl.idn) (pour les noms de domaines internationalisés), [mbstring](http://php.net/mbstring) et/ou [iconv](http://php.net/iconv) (pour conversion d’encodages), [ZIP](http://php.net/zip) (pour import/export), [zlib](http://php.net/zlib) (pour les flux compressés)
* MySQL 5.5.3+ (recommandé), ou SQLite 3.7.4+, ou PostgreSQL 9.2+
* Un navigateur Web récent tel Firefox, Internet Explorer 11 / Edge, Chrome, Opera, Safari.
@@ -42,8 +42,7 @@ Nous sommes une communauté amicale.
![Capture d’écran de FreshRSS](./docs/img/FreshRSS-screenshot.png)
# Documentation
-* http://doc.freshrss.org/fr/
-* https://github.com/FreshRSS/documentation
+* https://freshrss.github.io/FreshRSS/fr/
# Installation
1. Récupérez l’application FreshRSS via la commande git ou [en téléchargeant l’archive](../releases)
@@ -107,7 +106,7 @@ sudo chown -R :www-data . && sudo chmod -R g+r . && sudo chmod -R g+w ./data/
## Contrôle d’accès
Il est requis pour le mode multi-utilisateur, et recommandé dans tous les cas, de limiter l’accès à votre FreshRSS. Au choix :
-* En utilisant l’identification par formulaire (requiert JavaScript, et PHP 5.3.7+ recommandé – fonctionne avec certaines versions de PHP 5.3.3+)
+* En utilisant l’identification par formulaire (requiert JavaScript, et PHP 5.5+ recommandé)
* En utilisant un contrôle d’accès HTTP défini par votre serveur Web
* Voir par exemple la [documentation d’Apache sur l’authentification](http://httpd.apache.org/docs/trunk/howto/auth.html)
* Créer dans ce cas un fichier `./p/i/.htaccess` avec un fichier `.htpasswd` correspondant.
@@ -139,13 +138,12 @@ Créer `/etc/cron.d/FreshRSS` avec :
# Sauvegarde
-* Il faut conserver vos fichiers `./data/config.php` ainsi que `./data/*_user.php`
-* Vous pouvez exporter votre liste de flux depuis FreshRSS au format OPML
- * soit depuis l’interface Web, soit [en ligne de commande](./cli/README.md)
+* Il faut conserver vos fichiers `./data/config.php` ainsi que `./data/users/*/config.php`
+* Vous pouvez exporter votre liste de flux au format OPML soit depuis l’interface Web, soit [en ligne de commande](./cli/README.md)
* Pour sauvegarder les articles eux-mêmes, vous pouvez utiliser [phpMyAdmin](http://www.phpmyadmin.net) ou les outils de MySQL :
```bash
-mysqldump -u utilisateur -p --databases freshrss > freshrss.sql
+mysqldump --skip-comments --disable-keys --user=<db_user> --password --host <db_host> --result-file=freshrss.dump.sql --databases <freshrss_db>
```
@@ -157,7 +155,7 @@ Voir le [dépôt dédié à ces extensions](https://github.com/FreshRSS/Extensio
# Bibliothèques incluses
* [SimplePie](http://simplepie.org/)
* [MINZ](https://github.com/marienfressinaud/MINZ)
-* [php-http-304](http://alexandre.alapetite.fr/doc-alex/php-http-304/)
+* [php-http-304](https://alexandre.alapetite.fr/doc-alex/php-http-304/)
* [jQuery](http://jquery.com/)
* [lib_opml](https://github.com/marienfressinaud/lib_opml)
* [jQuery Plugin Sticky-Kit](http://leafo.net/sticky-kit/)
diff --git a/README.md b/README.md
index 8b87ecb8f..14ca65a51 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
+[![Build Status][travis-badge]][travis-link]
+
* [Version française](README.fr.md)
# FreshRSS
@@ -32,8 +34,8 @@ We are a friendly community.
* Light server running Linux or Windows
* It even works on Raspberry Pi 1 with response time under a second (tested with 150 feeds, 22k articles)
* A web server: Apache2 (recommended), nginx, lighttpd (not tested on others)
-* PHP 5.3.3+ (PHP 5.4+ recommended, and PHP 5.5+ for performance, and PHP 7 for even higher performance)
- * Required extensions: [cURL](http://php.net/curl), [DOM](http://php.net/dom), [XML](http://php.net/xml), and [PDO_MySQL](http://php.net/pdo-mysql) or [PDO_SQLite](http://php.net/pdo-sqlite) or [PDO_PGSQL](http://php.net/pdo-pgsql)
+* PHP 5.3.8+ (PHP 5.4+ recommended, and PHP 5.5+ for performance, and PHP 7 for even higher performance)
+ * Required extensions: [cURL](http://php.net/curl), [DOM](http://php.net/dom), [XML](http://php.net/xml), [session](http://php.net/session), [ctype](http://php.net/ctype), and [PDO_MySQL](http://php.net/pdo-mysql) or [PDO_SQLite](http://php.net/pdo-sqlite) or [PDO_PGSQL](http://php.net/pdo-pgsql)
* Recommended extensions: [JSON](http://php.net/json), [GMP](http://php.net/gmp) (for API access on platforms < 64 bits), [IDN](http://php.net/intl.idn) (for Internationalized Domain Names), [mbstring](http://php.net/mbstring) and/or [iconv](http://php.net/iconv) (for charset conversion), [ZIP](http://php.net/zip) (for import/export), [zlib](http://php.net/zlib) (for compressed feeds)
* MySQL 5.5.3+ (recommended), or SQLite 3.7.4+, or PostgreSQL 9.2+
* A recent browser like Firefox, Internet Explorer 11 / Edge, Chrome, Opera, Safari.
@@ -42,8 +44,7 @@ We are a friendly community.
![FreshRSS screenshot](./docs/img/FreshRSS-screenshot.png)
# Documentation
-* http://doc.freshrss.org/en/
-* https://github.com/FreshRSS/documentation
+* https://freshrss.github.io/FreshRSS/en/
# Installation
1. Get FreshRSS with git or [by downloading the archive](https://github.com/FreshRSS/FreshRSS/archive/master.zip)
@@ -109,7 +110,7 @@ See more commands and git commands in the [Command-Line Interface documentation]
## Access control
It is needed for the multi-user mode to limit access to FreshRSS. You can:
-* use form authentication (need JavaScript and PHP 5.3.7+, works with some PHP 5.3.3+)
+* use form authentication (needs JavaScript, and PHP 5.5+ recommended)
* use HTTP authentication supported by your web server
* See [Apache documentation](http://httpd.apache.org/docs/trunk/howto/auth.html)
* In that case, create a `./p/i/.htaccess` file with a matching `.htpasswd` file.
@@ -141,13 +142,12 @@ Create `/etc/cron.d/FreshRSS` with:
# Backup
-* You need to keep `./data/config.php`, and `./data/*_user.php` files
-* You can export your feed list in OPML format from FreshRSS
- * either from the Web interface, or from the [Command-Line Interface](./cli/README.md)
+* You need to keep `./data/config.php`, and `./data/users/*/config.php` files
+* You can export your feed list in OPML format either from the Web interface, or from the [Command-Line Interface](./cli/README.md)
* To save articles, you can use [phpMyAdmin](http://www.phpmyadmin.net) or MySQL tools:
```bash
-mysqldump -u user -p --databases freshrss > freshrss.sql
+mysqldump --skip-comments --disable-keys --user=<db_user> --password --host <db_host> --result-file=freshrss.dump.sql --databases <freshrss_db>
```
@@ -159,7 +159,7 @@ See the [repository dedicated to those extensions](https://github.com/FreshRSS/E
# Included libraries
* [SimplePie](http://simplepie.org/)
* [MINZ](https://github.com/marienfressinaud/MINZ)
-* [php-http-304](http://alexandre.alapetite.fr/doc-alex/php-http-304/)
+* [php-http-304](https://alexandre.alapetite.fr/doc-alex/php-http-304/)
* [jQuery](http://jquery.com/)
* [lib_opml](https://github.com/marienfressinaud/lib_opml)
* [jQuery Plugin Sticky-Kit](http://leafo.net/sticky-kit/)
@@ -183,3 +183,6 @@ Any client supporting a Google Reader-like API. Selection:
* [EasyRSS](https://github.com/Alkarex/EasyRSS) (Open source, F-Droid)
* Linux
* [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Open source)
+
+[travis-badge]:https://travis-ci.org/FreshRSS/FreshRSS.svg?branch=master
+[travis-link]:https://travis-ci.org/FreshRSS/FreshRSS
diff --git a/app/Controllers/categoryController.php b/app/Controllers/categoryController.php
index 922f92844..f3b35a323 100644
--- a/app/Controllers/categoryController.php
+++ b/app/Controllers/categoryController.php
@@ -127,11 +127,11 @@ class FreshRSS_category_Controller extends Minz_ActionController {
Minz_Request::bad(_t('feedback.sub.category.no_id'), $url_redirect);
}
- if ($id === FreshRSS_CategoryDAO::defaultCategoryId) {
+ if ($id === FreshRSS_CategoryDAO::DEFAULTCATEGORYID) {
Minz_Request::bad(_t('feedback.sub.category.not_delete_default'), $url_redirect);
}
- if ($feedDAO->changeCategory($id, FreshRSS_CategoryDAO::defaultCategoryId) === false) {
+ if ($feedDAO->changeCategory($id, FreshRSS_CategoryDAO::DEFAULTCATEGORYID) === false) {
Minz_Request::bad(_t('feedback.sub.category.error'), $url_redirect);
}
diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php
index c9b6deaa7..45cba9e98 100755
--- a/app/Controllers/feedController.php
+++ b/app/Controllers/feedController.php
@@ -42,7 +42,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
if ($cat == null) {
$catDAO->checkDefault();
}
- $cat_id = $cat == null ? FreshRSS_CategoryDAO::defaultCategoryId : $cat->id();
+ $cat_id = $cat == null ? FreshRSS_CategoryDAO::DEFAULTCATEGORYID : $cat->id();
$feed = new FreshRSS_Feed($url); //Throws FreshRSS_BadUrl_Exception
$feed->_httpAuth($http_auth);
@@ -320,11 +320,16 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
}
// For this feed, check existing GUIDs already in database.
$existingHashForGuids = $entryDAO->listHashForFeedGuids($feed->id(), $newGuids);
- unset($newGuids);
+ $newGuids = array();
$oldGuids = array();
// Add entries in database if possible.
foreach ($entries as $entry) {
+ if (isset($newGuids[$entry->guid()])) {
+ continue; //Skip subsequent articles with same GUID
+ }
+ $newGuids[$entry->guid()] = true;
+
$entry_date = $entry->date(true);
if (isset($existingHashForGuids[$entry->guid()])) {
$existingHash = $existingHashForGuids[$entry->guid()];
@@ -420,8 +425,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
$feedDAO->updateFeed($feed->id(), array('url' => $feed->url()));
}
}
- }
- elseif ($feed->url() !== $url) { // HTTP 301 Moved Permanently
+ } elseif ($feed->url() !== $url) { // HTTP 301 Moved Permanently
Minz_Log::notice('Feed ' . $url . ' moved permanently to ' . $feed->url());
$feedDAO->updateFeed($feed->id(), array('url' => $feed->url()));
}
@@ -537,7 +541,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
}
if ($cat_id <= 1) {
$catDAO->checkDefault();
- $cat_id = FreshRSS_CategoryDAO::defaultCategoryId;
+ $cat_id = FreshRSS_CategoryDAO::DEFAULTCATEGORYID;
}
$feedDAO = FreshRSS_Factory::createFeedDao();
@@ -566,6 +570,9 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
if (self::moveFeed($feed_id, $cat_id)) {
// TODO: return something useful
+ // Log a notice to prevent "Empty IF statement" warning in PHP_CodeSniffer
+ Minz_Log::notice('Moved feed `' . $feed_id . '` ' .
+ 'in the category `' . $cat_id . '`');;
} else {
Minz_Log::warning('Cannot move feed `' . $feed_id . '` ' .
'in the category `' . $cat_id . '`');
diff --git a/app/Controllers/importExportController.php b/app/Controllers/importExportController.php
index 2bc68848c..a76dd9a2b 100644
--- a/app/Controllers/importExportController.php
+++ b/app/Controllers/importExportController.php
@@ -152,8 +152,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController {
// And finally, we get import status and redirect to the home page
Minz_Session::_param('actualize_feeds', true);
- $content_notif = $error === true ? _t('feedback.import_export.feeds_imported_with_errors') :
- _t('feedback.import_export.feeds_imported');
+ $content_notif = $error === true ? _t('feedback.import_export.feeds_imported_with_errors') : _t('feedback.import_export.feeds_imported');
Minz_Request::good($content_notif);
}
@@ -427,7 +426,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController {
}
// For this feed, check existing GUIDs already in database.
$existingHashForGuids = $this->entryDAO->listHashForFeedGuids($feed->id(), $newGuids);
- unset($newGuids);
+ $newGuids = array();
// Then, articles are imported.
$this->entryDAO->beginTransaction();
@@ -439,8 +438,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController {
$feed_id = $article_to_feed[$item['id']];
$author = isset($item['author']) ? $item['author'] : '';
- $key_content = ($google_compliant && !isset($item['content'])) ?
- 'summary' : 'content';
+ $key_content = ($google_compliant && !isset($item['content'])) ? 'summary' : 'content';
$tags = $item['categories'];
if ($google_compliant) {
// Remove tags containing "/state/com.google" which are useless.
@@ -457,6 +455,11 @@ class FreshRSS_importExport_Controller extends Minz_ActionController {
$entry->_id(min(time(), $entry->date(true)) . uSecString());
$entry->_tags($tags);
+ if (isset($newGuids[$entry->guid()])) {
+ continue; //Skip subsequent articles with same GUID
+ }
+ $newGuids[$entry->guid()] = true;
+
$entry = Minz_ExtensionManager::callHook('entry_before_insert', $entry);
if ($entry == null) {
// An extension has returned a null value, there is nothing to insert.
@@ -501,7 +504,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController {
try {
// Create a Feed object and add it in database.
$feed = new FreshRSS_Feed($url);
- $feed->_category(FreshRSS_CategoryDAO::defaultCategoryId);
+ $feed->_category(FreshRSS_CategoryDAO::DEFAULTCATEGORYID);
$feed->_name($name);
$feed->_website($website);
@@ -640,7 +643,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController {
* @param FreshRSS_Feed $feed feed of which we want to get entries.
* @return string the JSON file content.
*/
- private function generateEntries($type, $feed = NULL, $maxFeedEntries = 50) {
+ private function generateEntries($type, $feed = null, $maxFeedEntries = 50) {
$this->view->categories = $this->catDAO->listCategories();
if ($type == 'starred') {
diff --git a/app/Controllers/indexController.php b/app/Controllers/indexController.php
index 5ca147ff3..e8dde36fa 100755
--- a/app/Controllers/indexController.php
+++ b/app/Controllers/indexController.php
@@ -46,9 +46,7 @@ class FreshRSS_index_Controller extends Minz_ActionController {
}
$first_entry = $nb_entries > 0 ? $entries[0] : null;
- FreshRSS_Context::$id_max = $first_entry === null ?
- (time() - 1) . '000000' :
- $first_entry->id();
+ FreshRSS_Context::$id_max = $first_entry === null ? (time() - 1) . '000000' : $first_entry->id();
if (FreshRSS_Context::$order === 'ASC') {
// In this case we do not know but we guess id_max
$id_max = (time() - 1) . '000000';
diff --git a/app/Controllers/subscriptionController.php b/app/Controllers/subscriptionController.php
index aa9f18663..6af048b84 100644
--- a/app/Controllers/subscriptionController.php
+++ b/app/Controllers/subscriptionController.php
@@ -113,4 +113,11 @@ class FreshRSS_subscription_Controller extends Minz_ActionController {
}
}
}
+
+ /**
+ * This action displays the bookmarklet page.
+ */
+ public function bookmarkletAction() {
+ Minz_View::prependTitle(_t('sub.title.subscription_tools') . ' . ');
+ }
}
diff --git a/app/Controllers/userController.php b/app/Controllers/userController.php
index 3cbbd8633..a58501186 100644
--- a/app/Controllers/userController.php
+++ b/app/Controllers/userController.php
@@ -44,6 +44,29 @@ class FreshRSS_user_Controller extends Minz_ActionController {
return preg_match('/^' . self::USERNAME_PATTERN . '$/', $username) === 1;
}
+ public static function updateContextUser($passwordPlain, $apiPasswordPlain, $userConfigUpdated = array()) {
+ if ($passwordPlain != '') {
+ $passwordHash = self::hashPassword($passwordPlain);
+ FreshRSS_Context::$user_conf->passwordHash = $passwordHash;
+ }
+
+ if ($apiPasswordPlain != '') {
+ $apiPasswordHash = self::hashPassword($apiPasswordPlain);
+ FreshRSS_Context::$user_conf->apiPasswordHash = $apiPasswordHash;
+ }
+
+ if (is_array($userConfigUpdated)) {
+ foreach ($userConfigUpdated as $configName => $configValue) {
+ if ($configValue !== null) {
+ FreshRSS_Context::$user_conf->_param($configName, $configValue);
+ }
+ }
+ }
+
+ $ok = FreshRSS_Context::$user_conf->save();
+ return $ok;
+ }
+
/**
* This action displays the user profile page.
*/
@@ -55,30 +78,17 @@ class FreshRSS_user_Controller extends Minz_ActionController {
));
if (Minz_Request::isPost()) {
- $ok = true;
-
$passwordPlain = Minz_Request::param('newPasswordPlain', '', true);
- if ($passwordPlain != '') {
- Minz_Request::_param('newPasswordPlain'); //Discard plain-text password ASAP
- $_POST['newPasswordPlain'] = '';
- $passwordHash = self::hashPassword($passwordPlain);
- $ok &= ($passwordHash != '');
- FreshRSS_Context::$user_conf->passwordHash = $passwordHash;
- }
- Minz_Session::_param('passwordHash', FreshRSS_Context::$user_conf->passwordHash);
+ Minz_Request::_param('newPasswordPlain'); //Discard plain-text password ASAP
+ $_POST['newPasswordPlain'] = '';
- $passwordPlain = Minz_Request::param('apiPasswordPlain', '', true);
- if ($passwordPlain != '') {
- $passwordHash = self::hashPassword($passwordPlain);
- $ok &= ($passwordHash != '');
- FreshRSS_Context::$user_conf->apiPasswordHash = $passwordHash;
- }
+ $apiPasswordPlain = Minz_Request::param('apiPasswordPlain', '', true);
- $current_token = FreshRSS_Context::$user_conf->token;
- $token = Minz_Request::param('token', $current_token);
- FreshRSS_Context::$user_conf->token = $token;
+ $ok = self::updateContextUser($passwordPlain, $apiPasswordPlain, array(
+ 'token' => Minz_Request::param('token', null),
+ ));
- $ok &= FreshRSS_Context::$user_conf->save();
+ Minz_Session::_param('passwordHash', FreshRSS_Context::$user_conf->passwordHash);
if ($ok) {
Minz_Request::good(_t('feedback.profile.updated'),
diff --git a/app/Exceptions/ZipException.php b/app/Exceptions/ZipException.php
index 8441daedf..ad01b87ea 100644
--- a/app/Exceptions/ZipException.php
+++ b/app/Exceptions/ZipException.php
@@ -2,7 +2,7 @@
class FreshRSS_Zip_Exception extends Exception {
private $zipErrorCode = 0;
-
+
public function __construct($zipErrorCode) {
parent::__construct('ZIP error! ' . $url, 2141);
$this->zipErrorCode = $zipErrorCode;
diff --git a/app/Models/CategoryDAO.php b/app/Models/CategoryDAO.php
index c2d57c241..f219c275f 100644
--- a/app/Models/CategoryDAO.php
+++ b/app/Models/CategoryDAO.php
@@ -2,7 +2,7 @@
class FreshRSS_CategoryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
- const defaultCategoryId = 1;
+ const DEFAULTCATEGORYID = 1;
public function addCategory($valuesTmp) {
$sql = 'INSERT INTO `' . $this->prefix . 'category`(name) VALUES(?)';
@@ -53,7 +53,7 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo implements FreshRSS_Searchable
}
public function deleteCategory($id) {
- if ($id <= self::defaultCategoryId) {
+ if ($id <= self::DEFAULTCATEGORYID) {
return false;
}
$sql = 'DELETE FROM `' . $this->prefix . 'category` WHERE id=?';
@@ -123,7 +123,7 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo implements FreshRSS_Searchable
}
public function getDefault() {
- $sql = 'SELECT * FROM `' . $this->prefix . 'category` WHERE id=' . self::defaultCategoryId;
+ $sql = 'SELECT * FROM `' . $this->prefix . 'category` WHERE id=' . self::DEFAULTCATEGORYID;
$stm = $this->bd->prepare($sql);
$stm->execute();
@@ -137,11 +137,11 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo implements FreshRSS_Searchable
}
}
public function checkDefault() {
- $def_cat = $this->searchById(self::defaultCategoryId);
+ $def_cat = $this->searchById(self::DEFAULTCATEGORYID);
if ($def_cat == null) {
$cat = new FreshRSS_Category(_t('gen.short.default_category'));
- $cat->_id(self::defaultCategoryId);
+ $cat->_id(self::DEFAULTCATEGORYID);
$values = array(
'id' => $cat->id(),
diff --git a/app/Models/ConfigurationSetter.php b/app/Models/ConfigurationSetter.php
index 70e1dea2e..ca4709903 100644
--- a/app/Models/ConfigurationSetter.php
+++ b/app/Models/ConfigurationSetter.php
@@ -56,8 +56,7 @@ class FreshRSS_ConfigurationSetter {
switch ($value) {
case 'all':
$data['default_view'] = $value;
- $data['default_state'] = (FreshRSS_Entry::STATE_READ +
- FreshRSS_Entry::STATE_NOT_READ);
+ $data['default_state'] = (FreshRSS_Entry::STATE_READ + FreshRSS_Entry::STATE_NOT_READ);
break;
case 'adaptive':
case 'unread':
@@ -163,7 +162,7 @@ class FreshRSS_ConfigurationSetter {
if (!in_array($value, array('global', 'normal', 'reader'))) {
$value = 'normal';
}
- $data['view_mode'] = $value;
+ $data['view_mode'] = $value;
}
/**
@@ -326,7 +325,7 @@ class FreshRSS_ConfigurationSetter {
if (!in_array($value, array('silent', 'development', 'production'))) {
$value = 'production';
}
- $data['environment'] = $value;
+ $data['environment'] = $value;
}
private function _limits(&$data, $values) {
@@ -361,8 +360,7 @@ class FreshRSS_ConfigurationSetter {
$value = intval($value);
$limits = $limits_keys[$key];
- if (
- (!isset($limits['min']) || $value >= $limits['min']) &&
+ if ((!isset($limits['min']) || $value >= $limits['min']) &&
(!isset($limits['max']) || $value <= $limits['max'])
) {
$data['limits'][$key] = $value;
diff --git a/app/Models/Context.php b/app/Models/Context.php
index fd0e79fc1..2ca8f80b0 100644
--- a/app/Models/Context.php
+++ b/app/Models/Context.php
@@ -250,9 +250,7 @@ class FreshRSS_Context {
}
// If no feed have been found, next_get is the current category.
- self::$next_get = empty($another_unread_id) ?
- 'c_' . self::$current_get['category'] :
- 'f_' . $another_unread_id;
+ self::$next_get = empty($another_unread_id) ? 'c_' . self::$current_get['category'] : 'f_' . $another_unread_id;
break;
case 'c':
// We search the next category with at least one unread article.
@@ -275,9 +273,7 @@ class FreshRSS_Context {
}
// No unread category? The main stream will be our destination!
- self::$next_get = empty($another_unread_id) ?
- 'a' :
- 'c_' . $another_unread_id;
+ self::$next_get = empty($another_unread_id) ? 'a' : 'c_' . $another_unread_id;
break;
}
}
diff --git a/app/Models/DatabaseDAO.php b/app/Models/DatabaseDAO.php
index 0d85718e3..6ba5bca3e 100644
--- a/app/Models/DatabaseDAO.php
+++ b/app/Models/DatabaseDAO.php
@@ -9,7 +9,7 @@ class FreshRSS_DatabaseDAO extends Minz_ModelPdo {
$stm = $this->bd->prepare($sql);
$stm->execute();
$res = $stm->fetchAll(PDO::FETCH_ASSOC);
-
+
$tables = array(
$this->prefix . 'category' => false,
$this->prefix . 'feed' => false,
diff --git a/app/Models/DatabaseDAOPGSQL.php b/app/Models/DatabaseDAOPGSQL.php
index a4edaa448..2a18db970 100644
--- a/app/Models/DatabaseDAOPGSQL.php
+++ b/app/Models/DatabaseDAOPGSQL.php
@@ -12,7 +12,7 @@ class FreshRSS_DatabaseDAOPGSQL extends FreshRSS_DatabaseDAO {
$values = array($dbowner);
$stm->execute($values);
$res = $stm->fetchAll(PDO::FETCH_ASSOC);
-
+
$tables = array(
$this->prefix . 'category' => false,
$this->prefix . 'feed' => false,
diff --git a/app/Models/DatabaseDAOSQLite.php b/app/Models/DatabaseDAOSQLite.php
index 7f53f967d..2e1df132e 100644
--- a/app/Models/DatabaseDAOSQLite.php
+++ b/app/Models/DatabaseDAOSQLite.php
@@ -9,7 +9,7 @@ class FreshRSS_DatabaseDAOSQLite extends FreshRSS_DatabaseDAO {
$stm = $this->bd->prepare($sql);
$stm->execute();
$res = $stm->fetchAll(PDO::FETCH_ASSOC);
-
+
$tables = array(
'category' => false,
'feed' => false,
diff --git a/app/Models/Entry.php b/app/Models/Entry.php
index 26cd24797..df3d59bea 100644
--- a/app/Models/Entry.php
+++ b/app/Models/Entry.php
@@ -189,6 +189,7 @@ class FreshRSS_Entry extends Minz_Model {
);
} catch (Exception $e) {
// rien à faire, on garde l'ancien contenu(requête a échoué)
+ Minz_Log::warning($e->getMessage());
}
}
}
diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php
index 7e836097a..bebafe500 100644
--- a/app/Models/EntryDAO.php
+++ b/app/Models/EntryDAO.php
@@ -146,13 +146,13 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
public function addEntry($valuesTmp) {
if ($this->addEntryPrepared == null) {
$sql = 'INSERT INTO `' . $this->prefix . 'entrytmp` (id, guid, title, author, '
- . ($this->isCompressed() ? 'content_bin' : 'content')
- . ', link, date, `lastSeen`, hash, is_read, is_favorite, id_feed, tags) '
- . 'VALUES(:id, :guid, :title, :author, '
- . ($this->isCompressed() ? 'COMPRESS(:content)' : ':content')
- . ', :link, :date, :last_seen, '
- . $this->sqlHexDecode(':hash')
- . ', :is_read, :is_favorite, :id_feed, :tags)';
+ . ($this->isCompressed() ? 'content_bin' : 'content')
+ . ', link, date, `lastSeen`, hash, is_read, is_favorite, id_feed, tags) '
+ . 'VALUES(:id, :guid, :title, :author, '
+ . ($this->isCompressed() ? 'COMPRESS(:content)' : ':content')
+ . ', :link, :date, :last_seen, '
+ . $this->sqlHexDecode(':hash')
+ . ', :is_read, :is_favorite, :id_feed, :tags)';
$this->addEntryPrepared = $this->bd->prepare($sql);
}
if ($this->addEntryPrepared) {
@@ -203,8 +203,13 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
public function commitNewEntries() {
$sql = 'SET @rank=(SELECT MAX(id) - COUNT(*) FROM `' . $this->prefix . 'entrytmp`); ' . //MySQL-specific
- 'INSERT IGNORE INTO `' . $this->prefix . 'entry` (id, guid, title, author, content_bin, link, date, `lastSeen`, hash, is_read, is_favorite, id_feed, tags) ' .
- 'SELECT @rank:=@rank+1 AS id, guid, title, author, content_bin, link, date, `lastSeen`, hash, is_read, is_favorite, id_feed, tags FROM `' . $this->prefix . 'entrytmp` ORDER BY date; ' .
+ 'INSERT IGNORE INTO `' . $this->prefix . 'entry`
+ (
+ id, guid, title, author, content_bin, link, date, `lastSeen`, hash, is_read, is_favorite, id_feed, tags
+ ) ' .
+ 'SELECT @rank:=@rank+1 AS id, guid, title, author, content_bin, link, date, `lastSeen`, hash, is_read, is_favorite, id_feed, tags
+ FROM `' . $this->prefix . 'entrytmp`
+ ORDER BY date; ' .
'DELETE FROM `' . $this->prefix . 'entrytmp` WHERE id <= @rank;';
$hadTransaction = $this->bd->inTransaction();
if (!$hadTransaction) {
@@ -226,13 +231,13 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
if ($this->updateEntryPrepared === null) {
$sql = 'UPDATE `' . $this->prefix . 'entry` '
- . 'SET title=:title, author=:author, '
- . ($this->isCompressed() ? 'content_bin=COMPRESS(:content)' : 'content=:content')
- . ', link=:link, date=:date, `lastSeen`=:last_seen, '
- . 'hash=' . $this->sqlHexDecode(':hash')
- . ', ' . ($valuesTmp['is_read'] === null ? '' : 'is_read=:is_read, ')
- . 'tags=:tags '
- . 'WHERE id_feed=:id_feed AND guid=:guid';
+ . 'SET title=:title, author=:author, '
+ . ($this->isCompressed() ? 'content_bin=COMPRESS(:content)' : 'content=:content')
+ . ', link=:link, date=:date, `lastSeen`=:last_seen, '
+ . 'hash=' . $this->sqlHexDecode(':hash')
+ . ', ' . ($valuesTmp['is_read'] === null ? '' : 'is_read=:is_read, ')
+ . 'tags=:tags '
+ . 'WHERE id_feed=:id_feed AND guid=:guid';
$this->updateEntryPrepared = $this->bd->prepare($sql);
}
@@ -295,8 +300,8 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
}
FreshRSS_UserDAO::touch();
$sql = 'UPDATE `' . $this->prefix . 'entry` '
- . 'SET is_favorite=? '
- . 'WHERE id IN (' . str_repeat('?,', count($ids) - 1). '?)';
+ . 'SET is_favorite=? '
+ . 'WHERE id IN (' . str_repeat('?,', count($ids) - 1). '?)';
$values = array($is_favorite ? 1 : 0);
$values = array_merge($values, $ids);
$stm = $this->bd->prepare($sql);
@@ -322,14 +327,14 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
*/
protected function updateCacheUnreads($catId = false, $feedId = false) {
$sql = 'UPDATE `' . $this->prefix . 'feed` f '
- . 'LEFT OUTER JOIN ('
- . 'SELECT e.id_feed, '
- . 'COUNT(*) AS nbUnreads '
- . 'FROM `' . $this->prefix . 'entry` e '
- . 'WHERE e.is_read=0 '
- . 'GROUP BY e.id_feed'
- . ') x ON x.id_feed=f.id '
- . 'SET f.`cache_nbUnreads`=COALESCE(x.nbUnreads, 0)';
+ . 'LEFT OUTER JOIN ('
+ . 'SELECT e.id_feed, '
+ . 'COUNT(*) AS nbUnreads '
+ . 'FROM `' . $this->prefix . 'entry` e '
+ . 'WHERE e.is_read=0 '
+ . 'GROUP BY e.id_feed'
+ . ') x ON x.id_feed=f.id '
+ . 'SET f.`cache_nbUnreads`=COALESCE(x.nbUnreads, 0)';
$hasWhere = false;
$values = array();
if ($feedId !== false) {
@@ -558,9 +563,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
public function searchByGuid($id_feed, $guid) {
// un guid est unique pour un flux donné
$sql = 'SELECT id, guid, title, author, '
- . ($this->isCompressed() ? 'UNCOMPRESS(content_bin) AS content' : 'content')
- . ', link, date, is_read, is_favorite, id_feed, tags '
- . 'FROM `' . $this->prefix . 'entry` WHERE id_feed=? AND guid=?';
+ . ($this->isCompressed() ? 'UNCOMPRESS(content_bin) AS content' : 'content')
+ . ', link, date, is_read, is_favorite, id_feed, tags '
+ . 'FROM `' . $this->prefix . 'entry` WHERE id_feed=? AND guid=?';
$stm = $this->bd->prepare($sql);
$values = array(
@@ -576,9 +581,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
public function searchById($id) {
$sql = 'SELECT id, guid, title, author, '
- . ($this->isCompressed() ? 'UNCOMPRESS(content_bin) AS content' : 'content')
- . ', link, date, is_read, is_favorite, id_feed, tags '
- . 'FROM `' . $this->prefix . 'entry` WHERE id=?';
+ . ($this->isCompressed() ? 'UNCOMPRESS(content_bin) AS content' : 'content')
+ . ', link, date, is_read, is_favorite, id_feed, tags '
+ . 'FROM `' . $this->prefix . 'entry` WHERE id=?';
$stm = $this->bd->prepare($sql);
$values = array($id);
@@ -600,16 +605,14 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
if (!($state & FreshRSS_Entry::STATE_READ)) {
$search .= 'AND ' . $alias . 'is_read=0 ';
}
- }
- elseif ($state & FreshRSS_Entry::STATE_READ) {
+ } elseif ($state & FreshRSS_Entry::STATE_READ) {
$search .= 'AND ' . $alias . 'is_read=1 ';
}
if ($state & FreshRSS_Entry::STATE_FAVORITE) {
if (!($state & FreshRSS_Entry::STATE_NOT_FAVORITE)) {
$search .= 'AND ' . $alias . 'is_favorite=1 ';
}
- }
- elseif ($state & FreshRSS_Entry::STATE_NOT_FAVORITE) {
+ } elseif ($state & FreshRSS_Entry::STATE_NOT_FAVORITE) {
$search .= 'AND ' . $alias . 'is_favorite=0 ';
}
@@ -621,7 +624,8 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
throw new FreshRSS_EntriesGetter_Exception('Bad order in Entry->listByType: [' . $order . ']!');
}
/*if ($firstId === '' && parent::$sharedDbType === 'mysql') {
- $firstId = $order === 'DESC' ? '9000000000'. '000000' : '0'; //MySQL optimization. TODO: check if this is needed again, after the filtering for old articles has been removed in 0.9-dev
+ //MySQL optimization. TODO: check if this is needed again, after the filtering for old articles has been removed in 0.9-dev
+ $firstId = $order === 'DESC' ? '9000000000'. '000000' : '0';
}*/
if ($firstId !== '') {
$search .= 'AND ' . $alias . 'id ' . ($order === 'DESC' ? '<=' : '>=') . $firstId . ' ';
@@ -759,13 +763,13 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
list($values, $sql) = $this->sqlListWhere($type, $id, $state, $order, $limit, $firstId, $filter, $date_min);
$sql = 'SELECT e0.id, e0.guid, e0.title, e0.author, '
- . ($this->isCompressed() ? 'UNCOMPRESS(content_bin) AS content' : 'content')
- . ', e0.link, e0.date, e0.is_read, e0.is_favorite, e0.id_feed, e0.tags '
- . 'FROM `' . $this->prefix . 'entry` e0 '
- . 'INNER JOIN ('
- . $sql
- . ') e2 ON e2.id=e0.id '
- . 'ORDER BY e0.id ' . $order;
+ . ($this->isCompressed() ? 'UNCOMPRESS(content_bin) AS content' : 'content')
+ . ', e0.link, e0.date, e0.is_read, e0.is_favorite, e0.id_feed, e0.tags '
+ . 'FROM `' . $this->prefix . 'entry` e0 '
+ . 'INNER JOIN ('
+ . $sql
+ . ') e2 ON e2.id=e0.id '
+ . 'ORDER BY e0.id ' . $order;
$stm = $this->bd->prepare($sql);
$stm->execute($values);
@@ -839,7 +843,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
public function countUnreadRead() {
$sql = 'SELECT COUNT(e.id) AS count FROM `' . $this->prefix . 'entry` e INNER JOIN `' . $this->prefix . 'feed` f ON e.id_feed=f.id WHERE priority > 0'
- . ' UNION SELECT COUNT(e.id) AS count FROM `' . $this->prefix . 'entry` e INNER JOIN `' . $this->prefix . 'feed` f ON e.id_feed=f.id WHERE priority > 0 AND is_read=0';
+ . ' UNION SELECT COUNT(e.id) AS count FROM `' . $this->prefix . 'entry` e INNER JOIN `' . $this->prefix . 'feed` f ON e.id_feed=f.id WHERE priority > 0 AND is_read=0';
$stm = $this->bd->prepare($sql);
$stm->execute();
$res = $stm->fetchAll(PDO::FETCH_COLUMN, 0);
@@ -870,9 +874,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
public function countUnreadReadFavorites() {
$sql = 'SELECT c FROM ('
- . 'SELECT COUNT(id) AS c, 1 as o FROM `' . $this->prefix . 'entry` WHERE is_favorite=1 '
- . 'UNION SELECT COUNT(id) AS c, 2 AS o FROM `' . $this->prefix . 'entry` WHERE is_favorite=1 AND is_read=0'
- . ') u ORDER BY o';
+ . 'SELECT COUNT(id) AS c, 1 as o FROM `' . $this->prefix . 'entry` WHERE is_favorite=1 '
+ . 'UNION SELECT COUNT(id) AS c, 2 AS o FROM `' . $this->prefix . 'entry` WHERE is_favorite=1 AND is_read=0'
+ . ') u ORDER BY o';
$stm = $this->bd->prepare($sql);
$stm->execute();
$res = $stm->fetchAll(PDO::FETCH_COLUMN, 0);
diff --git a/app/Models/EntryDAOPGSQL.php b/app/Models/EntryDAOPGSQL.php
index b25993c47..405774abf 100644
--- a/app/Models/EntryDAOPGSQL.php
+++ b/app/Models/EntryDAOPGSQL.php
@@ -11,7 +11,7 @@ class FreshRSS_EntryDAOPGSQL extends FreshRSS_EntryDAOSQLite {
}
protected function autoUpdateDb($errorInfo) {
- if (isset($errorInfo[0])) {
+ if (isset($errorInfo[0])) {
if ($errorInfo[0] === '42P01' && stripos($errorInfo[2], 'entrytmp') !== false) { //undefined_table
return $this->createEntryTempTable();
}
@@ -30,7 +30,10 @@ maxrank bigint := (SELECT MAX(id) FROM `' . $this->prefix . 'entrytmp`);
rank bigint := (SELECT maxrank - COUNT(*) FROM `' . $this->prefix . 'entrytmp`);
BEGIN
INSERT INTO `' . $this->prefix . 'entry` (id, guid, title, author, content, link, date, `lastSeen`, hash, is_read, is_favorite, id_feed, tags)
- (SELECT rank + row_number() OVER(ORDER BY date) AS id, guid, title, author, content, link, date, `lastSeen`, hash, is_read, is_favorite, id_feed, tags FROM `' . $this->prefix . 'entrytmp` ORDER BY date);
+ (SELECT rank + row_number() OVER(ORDER BY date) AS id, guid, title, author, content, link, date, `lastSeen`, hash, is_read, is_favorite, id_feed, tags
+ FROM `' . $this->prefix . 'entrytmp` AS etmp
+ WHERE NOT EXISTS (SELECT 1 FROM `' . $this->prefix . 'entry` AS ereal WHERE etmp.id_feed = ereal.id_feed AND etmp.guid = ereal.guid)
+ ORDER BY date);
DELETE FROM `' . $this->prefix . 'entrytmp` WHERE id <= maxrank;
END $$;';
$hadTransaction = $this->bd->inTransaction();
diff --git a/app/Models/EntryDAOSQLite.php b/app/Models/EntryDAOSQLite.php
index ad7bcd865..8dad54322 100644
--- a/app/Models/EntryDAOSQLite.php
+++ b/app/Models/EntryDAOSQLite.php
@@ -27,11 +27,58 @@ class FreshRSS_EntryDAOSQLite extends FreshRSS_EntryDAO {
public function commitNewEntries() {
$sql = '
-CREATE TEMP TABLE `tmp` AS SELECT id, guid, title, author, content, link, date, `lastSeen`, hash, is_read, is_favorite, id_feed, tags FROM `' . $this->prefix . 'entrytmp` ORDER BY date;
-INSERT OR IGNORE INTO `' . $this->prefix . 'entry` (id, guid, title, author, content, link, date, `lastSeen`, hash, is_read, is_favorite, id_feed, tags)
- SELECT rowid + (SELECT MAX(id) - COUNT(*) FROM `tmp`) AS id, guid, title, author, content, link, date, `lastSeen`, hash, is_read, is_favorite, id_feed, tags FROM `tmp` ORDER BY date;
-DELETE FROM `' . $this->prefix . 'entrytmp` WHERE id <= (SELECT MAX(id) FROM `tmp`);
-DROP TABLE `tmp`;';
+ CREATE TEMP TABLE `tmp` AS
+ SELECT
+ id,
+ guid,
+ title,
+ author,
+ content,
+ link,
+ date,
+ `lastSeen`,
+ hash, is_read,
+ is_favorite,
+ id_feed,
+ tags
+ FROM `' . $this->prefix . 'entrytmp`
+ ORDER BY date;
+ INSERT OR IGNORE INTO `' . $this->prefix . 'entry`
+ (
+ id,
+ guid,
+ title,
+ author,
+ content,
+ link,
+ date,
+ `lastSeen`,
+ hash,
+ is_read,
+ is_favorite,
+ id_feed,
+ tags
+ )
+ SELECT rowid + (SELECT MAX(id) - COUNT(*) FROM `tmp`) AS
+ id,
+ guid,
+ title,
+ author,
+ content,
+ link,
+ date,
+ `lastSeen`,
+ hash,
+ is_read,
+ is_favorite,
+ id_feed,
+ tags
+ FROM `tmp`
+ ORDER BY date;
+ DELETE FROM `' . $this->prefix . 'entrytmp`
+ WHERE id <= (SELECT MAX(id)
+ FROM `tmp`);
+ DROP TABLE `tmp`;';
$hadTransaction = $this->bd->inTransaction();
if (!$hadTransaction) {
$this->bd->beginTransaction();
diff --git a/app/Models/Feed.php b/app/Models/Feed.php
index 52d49db6e..d8fe03197 100644
--- a/app/Models/Feed.php
+++ b/app/Models/Feed.php
@@ -22,7 +22,7 @@ class FreshRSS_Feed extends Minz_Model {
private $hubUrl = '';
private $selfUrl = '';
- public function __construct($url, $validate=true) {
+ public function __construct($url, $validate = true) {
if ($validate) {
$this->_url($url);
} else {
@@ -165,7 +165,7 @@ class FreshRSS_Feed extends Minz_Model {
public function _id($value) {
$this->id = $value;
}
- public function _url($value, $validate=true) {
+ public function _url($value, $validate = true) {
$this->hash = null;
if ($validate) {
$value = checkUrl($value);
@@ -182,7 +182,7 @@ class FreshRSS_Feed extends Minz_Model {
public function _name($value) {
$this->name = $value === null ? '' : $value;
}
- public function _website($value, $validate=true) {
+ public function _website($value, $validate = true) {
if ($validate) {
$value = checkUrl($value);
}
@@ -254,7 +254,9 @@ class FreshRSS_Feed extends Minz_Model {
if ((!$mtime) || $feed->error()) {
$errorMessage = $feed->error();
- throw new FreshRSS_Feed_Exception(($errorMessage == '' ? 'Unknown error for feed' : $errorMessage) . ' [' . $url . ']');
+ throw new FreshRSS_Feed_Exception(
+ ($errorMessage == '' ? 'Unknown error for feed' : $errorMessage) . ' [' . $url . ']'
+ );
}
$links = $feed->get_links('self');
@@ -324,9 +326,11 @@ class FreshRSS_Feed extends Minz_Model {
if (strpos($mime, 'image/') === 0) {
$content .= '<p class="enclosure"><img src="' . $elink . '" alt="" /></p>';
} elseif (strpos($mime, 'audio/') === 0) {
- $content .= '<p class="enclosure"><audio preload="none" src="' . $elink . '" controls="controls"></audio> <a download="" href="' . $elink . '">💾</a></p>';
+ $content .= '<p class="enclosure"><audio preload="none" src="' . $elink
+ . '" controls="controls"></audio> <a download="" href="' . $elink . '">💾</a></p>';
} elseif (strpos($mime, 'video/') === 0) {
- $content .= '<p class="enclosure"><video preload="none" src="' . $elink . '" controls="controls"></video> <a download="" href="' . $elink . '">💾</a></p>';
+ $content .= '<p class="enclosure"><video preload="none" src="' . $elink
+ . '" controls="controls"></video> <a download="" href="' . $elink . '">💾</a></p>';
} elseif (strpos($mime, 'application/') === 0 || strpos($mime, 'text/') === 0) {
$content .= '<p class="enclosure"><a download="" href="' . $elink . '">💾</a></p>';
} else {
@@ -339,7 +343,7 @@ class FreshRSS_Feed extends Minz_Model {
$this->id(),
$item->get_id(false, false),
$title === null ? '' : $title,
- $author === null ? '' : html_only_entity_decode($author->name),
+ $author === null ? '' : html_only_entity_decode(strip_tags($author->name)),
$content === null ? '' : $content,
$link === null ? '' : $link,
$date ? $date : time()
@@ -481,10 +485,12 @@ class FreshRSS_Feed extends Minz_Model {
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => 'FreshRSS/' . FRESHRSS_VERSION . ' (' . PHP_OS . '; ' . FRESHRSS_WEBSITE . ')',
- CURLOPT_POSTFIELDS => 'hub.verify=sync'
- . '&hub.mode=' . ($state ? 'subscribe' : 'unsubscribe')
- . '&hub.topic=' . urlencode($url)
- . '&hub.callback=' . urlencode($callbackUrl)
+ CURLOPT_POSTFIELDS => http_build_query(array(
+ 'hub.verify' => 'sync',
+ 'hub.mode' => $state ? 'subscribe' : 'unsubscribe',
+ 'hub.topic' => $url,
+ 'hub.callback' => $callbackUrl,
+ ))
)
);
$response = curl_exec($ch);
diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php
index d278122e3..0de6d98be 100644
--- a/app/Models/FeedDAO.php
+++ b/app/Models/FeedDAO.php
@@ -2,7 +2,23 @@
class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
public function addFeed($valuesTmp) {
- $sql = 'INSERT INTO `' . $this->prefix . 'feed` (url, category, name, website, description, `lastUpdate`, priority, `httpAuth`, error, keep_history, ttl) VALUES(?, ?, ?, ?, ?, ?, 10, ?, 0, -2, -2)';
+ $sql = '
+ INSERT INTO `' . $this->prefix . 'feed`
+ (
+ url,
+ category,
+ name,
+ website,
+ description,
+ `lastUpdate`,
+ priority,
+ `httpAuth`,
+ error,
+ keep_history,
+ ttl
+ )
+ VALUES
+ (?, ?, ?, ?, ?, ?, 10, ?, 0, -2, -2)';
$stm = $this->bd->prepare($sql);
$valuesTmp['url'] = safe_ascii($valuesTmp['url']);
@@ -380,7 +396,7 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
if ($catID === null) {
$category = isset($dao['category']) ? $dao['category'] : 0;
} else {
- $category = $catID ;
+ $category = $catID;
}
$myFeed = new FreshRSS_Feed(isset($dao['url']) ? $dao['url'] : '', false);
diff --git a/app/Models/Share.php b/app/Models/Share.php
index 1c8a7e767..86b1b9ed9 100644
--- a/app/Models/Share.php
+++ b/app/Models/Share.php
@@ -87,7 +87,7 @@ class FreshRSS_Share {
* decentralized ones.
* @param $help_url is an optional url to give help on this option.
*/
- private function __construct($type, $url_transform, $transform = array(),
+ private function __construct($type, $url_transform, $transform,
$form_type, $help_url = '') {
$this->type = $type;
$this->name = _t('gen.share.' . $type);
diff --git a/app/Models/StatsDAO.php b/app/Models/StatsDAO.php
index 2ce4f2944..67ada73f7 100644
--- a/app/Models/StatsDAO.php
+++ b/app/Models/StatsDAO.php
@@ -364,7 +364,7 @@ SQL;
'feb',
'mar',
'apr',
- 'may',
+ 'may_',
'jun',
'jul',
'aug',
diff --git a/app/Models/Themes.php b/app/Models/Themes.php
index 5a6ec0a05..8920fbf7e 100644
--- a/app/Models/Themes.php
+++ b/app/Models/Themes.php
@@ -25,7 +25,7 @@ class FreshRSS_Themes extends Minz_Model {
}
public static function get_infos($theme_id) {
- $theme_dir = PUBLIC_PATH . self::$themesUrl . $theme_id ;
+ $theme_dir = PUBLIC_PATH . self::$themesUrl . $theme_id;
if (is_dir($theme_dir)) {
$json_filename = $theme_dir . '/metadata.json';
if (file_exists($json_filename)) {
@@ -109,10 +109,8 @@ class FreshRSS_Themes extends Minz_Model {
}
$url = $name . '.svg';
- $url = isset(self::$themeIcons[$url]) ? (self::$themeIconsUrl . $url) :
- (self::$defaultIconsUrl . $url);
+ $url = isset(self::$themeIcons[$url]) ? (self::$themeIconsUrl . $url) : (self::$defaultIconsUrl . $url);
- return $urlOnly ? Minz_Url::display($url) :
- '<img class="icon" src="' . Minz_Url::display($url) . '" alt="' . $alts[$name] . '" />';
+ return $urlOnly ? Minz_Url::display($url) : '<img class="icon" src="' . Minz_Url::display($url) . '" alt="' . $alts[$name] . '" />';
}
}
diff --git a/app/Models/UserDAO.php b/app/Models/UserDAO.php
index 310c7c096..c921d54c9 100644
--- a/app/Models/UserDAO.php
+++ b/app/Models/UserDAO.php
@@ -83,17 +83,17 @@ class FreshRSS_UserDAO extends Minz_ModelPdo {
}
public static function exist($username) {
- return is_dir(join_path(DATA_PATH , 'users', $username));
+ return is_dir(join_path(DATA_PATH, 'users', $username));
}
public static function touch($username = '') {
if (!FreshRSS_user_Controller::checkUsername($username)) {
$username = Minz_Session::param('currentUser', '_');
}
- return touch(join_path(DATA_PATH , 'users', $username, 'config.php'));
+ return touch(join_path(DATA_PATH, 'users', $username, 'config.php'));
}
public static function mtime($username) {
- return @filemtime(join_path(DATA_PATH , 'users', $username, 'config.php'));
+ return @filemtime(join_path(DATA_PATH, 'users', $username, 'config.php'));
}
}
diff --git a/app/SQL/install.sql.sqlite.php b/app/SQL/install.sql.sqlite.php
index c4e4af006..d485e2120 100644
--- a/app/SQL/install.sql.sqlite.php
+++ b/app/SQL/install.sql.sqlite.php
@@ -82,8 +82,42 @@ $SQL_CREATE_TABLE_ENTRYTMP = array(
global $SQL_INSERT_FEEDS;
$SQL_INSERT_FEEDS = array(
-'INSERT OR IGNORE INTO `feed` (url, category, name, website, description, ttl) VALUES("http://freshrss.org/feeds/all.atom.xml", 1, "FreshRSS.org", "http://freshrss.org/", "FreshRSS, a free, self-hostable aggregator…", 86400);',
-'INSERT OR IGNORE INTO `feed` (url, category, name, website, description, ttl) VALUES("https://github.com/FreshRSS/FreshRSS/releases.atom", 1, "FreshRSS releases", "https://github.com/FreshRSS/FreshRSS/", "FreshRSS releases @ GitHub", 86400);',
+'INSERT OR IGNORE INTO `feed`
+ (
+ url,
+ category,
+ name,
+ website,
+ description,
+ ttl
+ )
+ VALUES
+ (
+ "http://freshrss.org/feeds/all.atom.xml",
+ 1,
+ "FreshRSS.org",
+ "http://freshrss.org/",
+ "FreshRSS, a free, self-hostable aggregator…",
+ 86400
+ );',
+'INSERT OR IGNORE INTO `feed`
+ (
+ url,
+ category,
+ name,
+ website,
+ description,
+ ttl
+ )
+ VALUES
+ (
+ "https://github.com/FreshRSS/FreshRSS/releases.atom",
+ 1,
+ "FreshRSS releases",
+ "https://github.com/FreshRSS/FreshRSS/",
+ "FreshRSS releases @ GitHub",
+ 86400
+ );',
);
define('SQL_DROP_TABLES', 'DROP TABLE IF EXISTS `entrytmp`, `entry`, `feed`, `category`');
diff --git a/app/i18n/cz/conf.php b/app/i18n/cz/conf.php
index fd414e246..9a4410679 100644
--- a/app/i18n/cz/conf.php
+++ b/app/i18n/cz/conf.php
@@ -104,7 +104,7 @@ return array(
'when' => 'Označit článek jako přečtený…',
),
'show' => array(
- '_' => 'Počet zobrazených článků',
+ '_' => 'Počet zobrazených článků',
'adaptive' => 'Vyberte zobrazení',
'all_articles' => 'Zobrazit všechny články',
'unread' => 'Zobrazit jen nepřečtené',
diff --git a/app/i18n/cz/gen.php b/app/i18n/cz/gen.php
index e6aadfc02..a9c7dc875 100644
--- a/app/i18n/cz/gen.php
+++ b/app/i18n/cz/gen.php
@@ -25,7 +25,7 @@ return array(
'keep_logged_in' => 'Zapamatovat přihlášení <small>(%s dny)</small>',
'login' => 'Login',
'logout' => 'Odhlášení',
- 'password' => array(
+ 'password' => array(
'_' => 'Heslo',
'format' => '<small>Alespoň 7 znaků</small>',
),
@@ -79,7 +79,8 @@ return array(
'last_year' => 'Minulý rok',
'mar' => 'bře',
'march' => 'Bře',
- 'may' => 'Kvě',
+ 'may_' => 'Kvě',
+ 'may' => 'Květen',
'mon' => 'Po',
'month' => 'měsíce',
'nov' => 'lis',
@@ -116,11 +117,15 @@ return array(
'cz' => 'Čeština',
'de' => 'Deutsch',
'en' => 'English',
+ 'es' => 'Español',
'fr' => 'Français',
'it' => 'Italiano',
+ 'kr' => '한국어',
'nl' => 'Nederlands',
+ 'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
'tr' => 'Türkçe',
+ 'zh-cn' => '简体中文',
),
'menu' => array(
'about' => 'O aplikaci',
diff --git a/app/i18n/cz/sub.php b/app/i18n/cz/sub.php
index 274cf16e1..09b23d222 100644
--- a/app/i18n/cz/sub.php
+++ b/app/i18n/cz/sub.php
@@ -1,6 +1,11 @@
<?php
return array(
+ '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
+ 'title' => 'Bookmarklet',// TODO
+ ),
'category' => array(
'_' => 'Kategorie',
'add' => 'Přidat kategorii',
@@ -39,6 +44,10 @@ return array(
'website' => 'URL webové stránky',
'pubsubhubbub' => 'Okamžité oznámení s PubSubHubbub',
),
+ '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
+ 'title' => 'Firefox feed reader',// TODO
+ ),
'import_export' => array(
'export' => 'Export',
'export_opml' => 'Exportovat seznam kanálů (OPML)',
@@ -54,9 +63,11 @@ return array(
'bookmark' => 'Přihlásit (FreshRSS bookmark)',
'import_export' => 'Import / export',
'subscription_management' => 'Správa subskripcí',
+ 'subscription_tools' => 'Subscription tools',// TODO
),
'title' => array(
'_' => 'Správa subskripcí',
'feed_management' => 'Správa RSS kanálů',
+ 'subscription_tools' => 'Subscription tools',// TODO
),
);
diff --git a/app/i18n/de/conf.php b/app/i18n/de/conf.php
index bfc24d2d2..ac7c08e98 100644
--- a/app/i18n/de/conf.php
+++ b/app/i18n/de/conf.php
@@ -104,7 +104,7 @@ return array(
'when' => 'Artikel als gelesen markieren…',
),
'show' => array(
- '_' => 'Artikel zum Anzeigen',
+ '_' => 'Artikel zum Anzeigen',
'adaptive' => 'Anzeige anpassen',
'all_articles' => 'Alle Artikel zeigen',
'unread' => 'Nur ungelesene zeigen',
diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php
index 4b171a04d..43d0a2c05 100644
--- a/app/i18n/de/gen.php
+++ b/app/i18n/de/gen.php
@@ -79,6 +79,7 @@ return array(
'last_year' => 'Letztes Jahr',
'mar' => 'Mär',
'march' => 'März',
+ 'may_' => 'Mai',
'may' => 'Mai',
'mon' => 'Mo',
'month' => 'Monat(en)',
@@ -116,11 +117,15 @@ return array(
'cz' => 'Čeština',
'de' => 'Deutsch',
'en' => 'English',
+ 'es' => 'Español',
'fr' => 'Français',
'it' => 'Italiano',
+ 'kr' => '한국어',
'nl' => 'Nederlands',
+ 'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
'tr' => 'Türkçe',
+ 'zh-cn' => '简体中文',
),
'menu' => array(
'about' => 'Über',
diff --git a/app/i18n/de/sub.php b/app/i18n/de/sub.php
index cc98fd25c..c16d09db1 100644
--- a/app/i18n/de/sub.php
+++ b/app/i18n/de/sub.php
@@ -1,6 +1,11 @@
<?php
return array(
+ '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
+ 'title' => 'Bookmarklet',// TODO
+ ),
'category' => array(
'_' => 'Kategorie',
'add' => 'Eine Kategorie hinzufügen',
@@ -39,6 +44,10 @@ return array(
'website' => 'Webseiten-URL',
'pubsubhubbub' => 'Sofortbenachrichtigung mit PubSubHubbub',
),
+ '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
+ 'title' => 'Firefox feed reader',// TODO
+ ),
'import_export' => array(
'export' => 'Exportieren',
'export_opml' => 'Liste der Feeds exportieren (OPML)',
@@ -54,9 +63,11 @@ return array(
'bookmark' => 'Abonnieren (FreshRSS-Lesezeichen)',
'import_export' => 'Importieren / Exportieren',
'subscription_management' => 'Abonnementverwaltung',
+ 'subscription_tools' => 'Subscription tools',// TODO
),
'title' => array(
'_' => 'Abonnementverwaltung',
'feed_management' => 'Verwaltung der RSS-Feeds',
+ 'subscription_tools' => 'Subscription tools',// TODO
),
);
diff --git a/app/i18n/en/conf.php b/app/i18n/en/conf.php
index f4618a1ff..e4eeb74b7 100644
--- a/app/i18n/en/conf.php
+++ b/app/i18n/en/conf.php
@@ -104,7 +104,7 @@ return array(
'when' => 'Mark article as read…',
),
'show' => array(
- '_' => 'Articles to display',
+ '_' => 'Articles to display',
'adaptive' => 'Adjust showing',
'all_articles' => 'Show all articles',
'unread' => 'Show only unread',
diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php
index 05281769f..095eb17d3 100644
--- a/app/i18n/en/gen.php
+++ b/app/i18n/en/gen.php
@@ -54,41 +54,42 @@ return array(
'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r',
'Oct' => '\\O\\c\\t\\o\\b\\e\\r',
'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',
- 'apr' => 'apr',
- 'april' => 'Apr',
- 'aug' => 'aug',
- 'august' => 'Aug',
+ 'apr' => 'Apr.',
+ 'april' => 'April',
+ 'aug' => 'Aug.',
+ 'august' => 'August',
'before_yesterday' => 'Before yesterday',
- 'dec' => 'dec',
- 'december' => 'Dec',
- 'feb' => 'feb',
- 'february' => 'Feb',
+ 'dec' => 'Dec.',
+ 'december' => 'December',
+ 'feb' => 'Feb.',
+ 'february' => 'February',
'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' => 'jan',
- 'january' => 'Jan',
- 'jul' => 'jul',
- 'july' => 'Jul',
- 'jun' => 'jun',
- 'june' => 'Jun',
+ 'jan' => 'Jan.',
+ 'january' => 'January',
+ 'jul' => 'July',
+ 'july' => 'July',
+ 'jun' => 'June',
+ 'june' => 'June',
'last_3_month' => 'Last three months',
'last_6_month' => 'Last six months',
'last_month' => 'Last month',
'last_week' => 'Last week',
'last_year' => 'Last year',
- 'mar' => 'mar',
- 'march' => 'Mar',
+ 'mar' => 'Mar.',
+ 'march' => 'March',
+ 'may_' => 'May',
'may' => 'May',
'mon' => 'Mon',
'month' => 'months',
- 'nov' => 'nov',
- 'november' => 'Nov',
- 'oct' => 'oct',
- 'october' => 'Oct',
+ 'nov' => 'Nov.',
+ 'november' => 'November',
+ 'oct' => 'Oct.',
+ 'october' => 'October',
'sat' => 'Sat',
- 'sep' => 'sep',
- 'september' => 'Sep',
+ 'sep' => 'Sept.',
+ 'september' => 'September',
'sun' => 'Sun',
'thu' => 'Thu',
'today' => 'Today',
@@ -116,12 +117,15 @@ return array(
'cz' => 'Čeština',
'de' => 'Deutsch',
'en' => 'English',
+ 'es' => 'Español',
'fr' => 'Français',
'it' => 'Italiano',
+ 'kr' => '한국어',
'nl' => 'Nederlands',
+ 'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
'tr' => 'Türkçe',
- 'zh-cn' => '简体中文'
+ 'zh-cn' => '简体中文',
),
'menu' => array(
'about' => 'About',
diff --git a/app/i18n/en/sub.php b/app/i18n/en/sub.php
index 86600e882..ca696280a 100644
--- a/app/i18n/en/sub.php
+++ b/app/i18n/en/sub.php
@@ -1,6 +1,11 @@
<?php
return array(
+ '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.',
+ 'label' => 'Subscribe',
+ 'title' => 'Bookmarklet',
+ ),
'category' => array(
'_' => 'Category',
'add' => 'Add a category',
@@ -39,6 +44,10 @@ return array(
'website' => 'Website URL',
'pubsubhubbub' => 'Instant notification with PubSubHubbub',
),
+ '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.',
+ 'title' => 'Firefox feed reader',
+ ),
'import_export' => array(
'export' => 'Export',
'export_opml' => 'Export list of feeds (OPML)',
@@ -54,9 +63,11 @@ return array(
'bookmark' => 'Subscribe (FreshRSS bookmark)',
'import_export' => 'Import / export',
'subscription_management' => 'Subscriptions management',
+ 'subscription_tools' => 'Subscription tools',
),
'title' => array(
'_' => 'Subscriptions management',
'feed_management' => 'RSS feeds management',
+ 'subscription_tools' => 'Subscription tools',
),
);
diff --git a/app/i18n/es/admin.php b/app/i18n/es/admin.php
new file mode 100755
index 000000000..c9d9368eb
--- /dev/null
+++ b/app/i18n/es/admin.php
@@ -0,0 +1,181 @@
+<?php
+
+return array(
+ 'auth' => array(
+ 'allow_anonymous' => 'Permitir la lectura anónima de los artículos del usuario por defecto (%s)',
+ 'allow_anonymous_refresh' => 'Permitir la actualización anónima de los artículos',
+ 'api_enabled' => 'Concederle acceso a la <abbr>API</abbr> <small>(necesario para apps de móvil)</small>',
+ 'form' => 'Formulario Web (el más habitual, requiere JavaScript)',
+ 'http' => 'HTTP (para usuarios avanzados con HTTPS)',
+ 'none' => 'Ninguno (peligroso)',
+ 'title' => 'Identificación',
+ 'title_reset' => 'Reinicio de la identificación',
+ 'token' => 'Clave de identificación',
+ 'token_help' => 'Permite el acceso a la salida RSS del usuario por defecto sin necesidad de identificación:',
+ 'type' => 'Método de identificación',
+ 'unsafe_autologin' => 'Permite la identificación automática insegura usando el formato: ',
+ ),
+ 'check_install' => array(
+ 'cache' => array(
+ 'nok' => 'Comprueba los permisos en el directorio <em>./data/cache</em> . El servidor HTTP debe contar con permiso de escritura',
+ 'ok' => 'Los permisos en el cache son correctos.',
+ ),
+ 'categories' => array(
+ 'nok' => 'La tabla Categorías está configurada de forma incorrecta.',
+ 'ok' => 'La tabla Categorías está correcta.',
+ ),
+ 'connection' => array(
+ 'nok' => 'No se pudo establecer una conexión con la base de datos.',
+ 'ok' => 'La conexión con la base de datos es correcta.',
+ ),
+ 'ctype' => array(
+ 'nok' => 'No se puedo encontrar la librería necesaria para compropbar el tipo de caracteres (php-ctype).',
+ 'ok' => 'Dispones de la librería necesaria para la verificación del tipo de caracteres (ctype).',
+ ),
+ 'curl' => array(
+ 'nok' => 'No se pudo encontrar la librería cURL (paquete php-curl).',
+ 'ok' => 'Dispones de la librería cURL.',
+ ),
+ 'data' => array(
+ 'nok' => 'Comprueba los permisos en el directorio <em>./data</em>. El servidor HTTP debe contar con permisos de escritura.',
+ 'ok' => 'Los permisos en el directorio data son correctos.',
+ ),
+ 'database' => 'Instalación de la base de datos',
+ 'dom' => array(
+ 'nok' => 'No se ha podido localizar la librería necesaria para explorar el DOM (paquete php-xml).',
+ 'ok' => 'Dispones de la librería necesaria para explorar el DOM.',
+ ),
+ 'entries' => array(
+ 'nok' => 'La tabla de entrada no está configurada correctamente.',
+ 'ok' => 'La tabla de entrada está correcta.',
+ ),
+ 'favicons' => array(
+ 'nok' => 'Comprueba los permisos en el directorio <em>./data/favicons</em>. El servidor HTTP debe contar con permisos de escritura.',
+ 'ok' => 'Los permisos en el directorio favicons son correctos.',
+ ),
+ 'feeds' => array(
+ 'nok' => 'La tabla Feed está configurada de forma incorrecta.',
+ 'ok' => 'La tabla Feed está correcta.',
+ ),
+ 'fileinfo' => array(
+ 'nok' => 'No se ha podido localizar la librería PHP fileinfo (paquete fileinfo).',
+ 'ok' => 'Dispones de la librería fileinfo.',
+ ),
+ 'files' => 'Instalación de Archivos',
+ 'json' => array(
+ 'nok' => 'No se ha podido localizar JSON (paquete php5-json).',
+ 'ok' => 'Dispones de la extensión JSON.',
+ ),
+ 'minz' => array(
+ 'nok' => 'No se ha podido localizar el entorno Minz.',
+ 'ok' => 'Dispones del entorno Minz.',
+ ),
+ 'pcre' => array(
+ 'nok' => 'No se ha podido localizar la librería para las expresiones regulares (php-pcre).',
+ 'ok' => 'Dispones de la librería necesaria para expresiones regulares (PCRE).',
+ ),
+ 'pdo' => array(
+ 'nok' => 'No se ha podido localiar PDO o uno de los controladores compatibles (pdo_mysql, pdo_sqlite, pdo_pgsql).',
+ '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.',
+ ),
+ 'tables' => array(
+ 'nok' => 'Falta al menos una tabla en la base de datos.',
+ 'ok' => 'Todas las tablas necesarias están disponibles en la base de datos.',
+ ),
+ 'title' => 'Verificación de instalación',
+ 'tokens' => array(
+ 'nok' => 'Comprueba los permisos en el directorio <em>./data/tokens</em>. El servidor HTTP debe contar con permisos de escritura.',
+ 'ok' => 'Los permisos en el directorio de tokens de identificación son correctos.',
+ ),
+ 'users' => array(
+ 'nok' => 'Comprueba los permisos en el directorio <em>./data/users</em>. El servidor HTTP debe contar con permisos de escritura.',
+ 'ok' => 'Los permisos en el directorio users son correctos.',
+ ),
+ 'zip' => array(
+ 'nok' => 'No se ha podido localizar la extensión ZIP (paquete php-zip).',
+ 'ok' => 'Dispones de la extensión ZIP.',
+ ),
+ ),
+ 'extensions' => array(
+ 'disabled' => 'Desactivado',
+ 'empty_list' => 'No hay extensiones instaladas',
+ 'enabled' => 'Activado',
+ '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)',
+ ),
+ 'title' => 'Extensiones',
+ 'user' => 'Extensiones de usuario',
+ ),
+ 'stats' => array(
+ '_' => 'Estadísticas',
+ 'all_feeds' => 'Todas las fuentes',
+ 'category' => 'Categoría',
+ 'entry_count' => 'Cómputo total',
+ 'entry_per_category' => 'Entradas por categoría',
+ 'entry_per_day' => 'Entradas por día (últimos 30 días)',
+ 'entry_per_day_of_week' => 'Por día de la semana (mnedia: %.2f mensajes)',
+ 'entry_per_hour' => 'Por hora (media: %.2f mensajes)',
+ 'entry_per_month' => 'Por mes (media: %.2f mensajes)',
+ 'entry_repartition' => 'Reparto de entradas',
+ 'feed' => 'Fuente',
+ 'feed_per_category' => 'Fuentes por categoría',
+ 'idle' => 'Fuentes inactivas',
+ 'main' => 'Estadísticas principales',
+ 'main_stream' => 'Salida principal',
+ 'menu' => array(
+ 'idle' => 'Fuentes inactivas',
+ 'main' => 'Estadísticas principañes',
+ 'repartition' => 'Reparto de artículos',
+ ),
+ 'no_idle' => 'No hay fuentes inactivas',
+ 'number_entries' => '%d artículos',
+ 'percent_of_total' => '%% del total',
+ 'repartition' => 'Reprto de artículos',
+ 'status_favorites' => 'Favoritos',
+ 'status_read' => 'Leídos',
+ 'status_total' => 'Total',
+ 'status_unread' => 'Pendientes',
+ 'title' => 'Estadísticas',
+ 'top_feed' => 'Las 10 fuentes más activas',
+ ),
+ 'system' => array(
+ '_' => 'Configuración del sistema',
+ 'auto-update-url' => 'URL de auto-actualización',
+ 'instance-name' => 'Nombre de la fuente',
+ 'max-categories' => 'Límite de categorías por usuario',
+ 'max-feeds' => 'Límite de fuentes por usuario',
+ 'registration' => array(
+ 'help' => '0 significa que no hay límite en la cuenta',
+ 'number' => 'Número máximo de cuentas',
+ ),
+ ),
+ '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',
+ ),
+ 'user' => array(
+ 'articles_and_size' => '%s articles (%s)',
+ 'create' => 'Crear nuevo usuario',
+ 'language' => 'Idioma',
+ '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',
+ 'title' => 'Administrar usuarios',
+ 'user_list' => 'Lista de usuarios',
+ 'username' => 'Nombre de usuario',
+ 'users' => 'Usuarios',
+ ),
+);
diff --git a/app/i18n/es/conf.php b/app/i18n/es/conf.php
new file mode 100755
index 000000000..aad5cc66d
--- /dev/null
+++ b/app/i18n/es/conf.php
@@ -0,0 +1,174 @@
+<?php
+
+return array(
+ 'archiving' => array(
+ '_' => 'Archivo',
+ 'advanced' => 'Avanzado',
+ 'delete_after' => 'Eliminar artículos tras',
+ 'help' => 'Hay más opciones disponibles en los ajustes de la fuente',
+ 'keep_history_by_feed' => 'Número mínimo de artículos a conservar por fuente',
+ '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',
+ 'purge_now' => 'Limpiar ahora',
+ 'title' => 'Archivo',
+ 'ttl' => 'No actualizar automáticamente más de',
+ ),
+ 'display' => array(
+ '_' => 'Visualización',
+ 'icon' => array(
+ 'bottom_line' => 'Línea inferior',
+ 'entry' => 'Iconos de artículos',
+ 'publication_date' => 'Fecha de publicación',
+ 'related_tags' => 'Etiquetas relacionadas',
+ 'sharing' => 'Compartir',
+ 'top_line' => 'Línea superior',
+ ),
+ 'language' => 'Idioma',
+ 'notif_html5' => array(
+ 'seconds' => 'segundos (0 significa sin límite de espera)',
+ 'timeout' => 'Notificación de fin de espera HTML5',
+ ),
+ 'theme' => 'Tema',
+ 'title' => 'Visualización',
+ 'width' => array(
+ 'content' => 'Ancho de contenido',
+ 'large' => 'Grande',
+ 'medium' => 'Mediano',
+ 'no_limit' => 'Sin límite',
+ 'thin' => 'Estrecho',
+ ),
+ ),
+ 'query' => array(
+ '_' => 'Consultas de usuario',
+ 'deprecated' => 'Esta consulta ya no es válida. La categoría referenciada o fuente ha sido eliminada.',
+ '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.',
+ 'number' => 'Consulta n° %d',
+ 'order_asc' => 'Mostrar primero los artículos más antiguos',
+ 'order_desc' => 'Mostrar primero los artículos más recientes',
+ 'search' => 'Buscar "%s"',
+ 'state_0' => 'Mostrar todos los artículos',
+ 'state_1' => 'Mostrar artículos leídos',
+ 'state_2' => 'Mostrar artículos pendientes',
+ 'state_3' => 'Mostrar todos los artículos',
+ 'state_4' => 'Mostrar artículos favoritos',
+ 'state_5' => 'Mostrar artículos favoritos leídos',
+ 'state_6' => 'Mostrar artículos favoritos pendientes',
+ 'state_7' => 'Mostrar artículos favoritos',
+ 'state_8' => 'Mostrar artículos no favoritos',
+ 'state_9' => 'Mostrar artículos no favoritos leídos',
+ 'state_10' => 'Mostrar artículos no favoritos pendientes',
+ 'state_11' => 'Mostrar artículos no favoritos',
+ 'state_12' => 'Mostrar todos los artículos',
+ 'state_13' => 'Mostrar artículos leídos',
+ 'state_14' => 'Mostrar artículos sin leer',
+ 'state_15' => 'Mostrar todos los artículos',
+ 'title' => 'Consultas de usuario',
+ ),
+ 'profile' => array(
+ '_' => 'Administración de perfiles',
+ 'delete' => array(
+ '_' => 'Borrar cuenta',
+ 'warn' => 'Tu cuenta y todos los datos asociados serán eliminados.',
+ ),
+ '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',
+ ),
+ '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',
+ 'auto_remove_article' => 'Ocultar artículos tras la lectura',
+ 'mark_updated_article_unread' => 'Marcar artículos actualizados como no leídos',
+ 'confirm_enabled' => 'Mostrar ventana de confirmación al usar la función “marcar todos como leídos”',
+ 'display_articles_unfolded' => 'Mostrar los artículos sin expandir por defecto',
+ 'display_categories_unfolded' => 'Mostrar categorías expandidas por defecto',
+ 'hide_read_feeds' => 'Ocultar categorías & fuentes sin artículos no leídos (no funciona con la configuración "Mostrar todos los artículos")',
+ 'img_with_lazyload' => 'Usar el modo de "carga perezosa" para las imágenes',
+ 'sides_close_article' => 'Pinchar fuera del área de texto del artículo lo cerrará',
+ 'jump_next' => 'saltar al siguiente archivo sin leer emparentado (fuente o categoría)',
+ 'number_divided_when_reader' => 'Dividido en 2 en la vista de lectura.',
+ 'read' => array(
+ 'article_open_on_website' => 'cuando el artículo se abra en su web original',
+ 'article_viewed' => 'cuando se muestre el artículo',
+ 'scroll' => 'durante el desplazamiento',
+ 'upon_reception' => 'al recibir el artículo',
+ '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',
+ ),
+ 'sort' => array(
+ '_' => 'Orden',
+ 'newer_first' => 'Nuevos primero',
+ 'older_first' => 'Antiguos primero',
+ ),
+ 'sticky_post' => 'Pegar el artículo a la parte superior al abrirlo',
+ 'title' => 'Lectura',
+ 'view' => array(
+ 'default' => 'Vista por defecto',
+ 'global' => 'Vista Global',
+ 'normal' => 'Vista Normal',
+ 'reader' => 'Vista de Lectura',
+ ),
+ ),
+ 'sharing' => array(
+ '_' => 'Compartir',
+ 'blogotext' => 'Blogotext',
+ 'diaspora' => 'Diaspora*',
+ 'email' => 'Email',
+ 'facebook' => 'Facebook',
+ 'g+' => 'Google+',
+ 'more_information' => 'Más información',
+ 'print' => 'Print',
+ 'shaarli' => 'Shaarli',
+ 'share_name' => 'Compartir nombre a mostrar',
+ 'share_url' => 'Compatir URL a usar',
+ 'title' => 'Compartir',
+ 'twitter' => 'Twitter',
+ 'wallabag' => 'wallabag',
+ ),
+ '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.',
+ 'close_dropdown' => 'Cerrar menús',
+ 'collapse_article' => 'Contraer',
+ 'first_article' => 'Saltar al primer artículo',
+ 'focus_search' => 'Acceso a la casilla de búsqueda',
+ 'help' => 'Mostrar documentación',
+ 'javascript' => 'JavaScript debe estar activado para poder usar atajos de teclado',
+ 'last_article' => 'Saltar al último artículo',
+ 'load_more' => 'Cargar más artículos',
+ 'mark_read' => 'Marcar como leído',
+ 'mark_favorite' => 'Marcar como favorito',
+ '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.',
+ 'next_article' => 'Saltar al siguiente artículo',
+ 'other_action' => 'Otras acciones',
+ 'previous_article' => 'Saltar al artículo anterior',
+ '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',
+ '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.',
+ ),
+ 'user' => array(
+ 'articles_and_size' => '%s artículos (%s)',
+ 'current' => 'Usuario actual',
+ 'is_admin' => 'es administrador',
+ 'users' => 'Usuarios',
+ ),
+);
diff --git a/app/i18n/es/feedback.php b/app/i18n/es/feedback.php
new file mode 100755
index 000000000..136e70179
--- /dev/null
+++ b/app/i18n/es/feedback.php
@@ -0,0 +1,109 @@
+<?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',
+ ),
+ '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.',
+ 'set' => 'El formulario será desde ahora tu sistema de identificación por defecto.',
+ ),
+ 'login' => array(
+ 'invalid' => 'Identificación incorrecta',
+ 'success' => 'Conexión',
+ ),
+ 'logout' => array(
+ 'success' => 'Desconexión',
+ ),
+ 'no_password_set' => 'Esta opción no está disponible porque no se ha definido una contraseña de administrador.',
+ ),
+ 'conf' => array(
+ 'error' => 'Hubo un error durante el guardado de la configuración.',
+ 'query_created' => 'Se ha creado la petición "%s".',
+ 'shortcuts_updated' => 'Se han actualizado los atajos de teclado',
+ 'updated' => 'Se ha actualizado la configuración',
+ ),
+ 'extensions' => array(
+ 'already_enabled' => '%s ya está activado',
+ 'disable' => array(
+ 'ko' => '%s no se puede desactivar. <a href="%s">Revisa el registro de FressRSS</a> para más información.',
+ 'ok' => '%s ha quedado desactivado',
+ ),
+ 'enable' => array(
+ 'ko' => '%s no se puede activar. <a href="%s">Revisa el registro de FressRSS</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',
+ ),
+ '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.',
+ 'feeds_imported' => 'Se han importado tus fuentes y quedarán actualizadas',
+ 'feeds_imported_with_errors' => 'Se importaron tus fuentes; pero hubo algunos errores',
+ 'file_cannot_be_uploaded' => 'No es posible enviar el archivo',
+ 'no_zip_extension' => 'La extensión ZIP no está disponible en tu servidor.',
+ 'zip_error' => 'Hubo un error durante la importación ZIP.',
+ ),
+ 'sub' => array(
+ 'actualize' => 'Actualización',
+ 'category' => array(
+ 'created' => 'Se ha creado la categoría %s.',
+ 'deleted' => 'Se ha eliminado la categoría.',
+ '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',
+ 'over_max' => 'Has alcanzado el límite de categorías (%d)',
+ 'updated' => 'La categoría se ha actualizado.',
+ ),
+ 'feed' => array(
+ 'actualized' => '<em>%s</em> ha sido actualizada',
+ 'actualizeds' => 'Las fuentes RSS se han actualizado',
+ 'added' => 'Fuente RSS agregada <em>%s</em>',
+ '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 FressRSS </a> para más información.',
+ 'invalid_url' => 'La URL <em>%s</em> es inválida',
+ 'marked_read' => 'Fuentes marcadas como leídas',
+ '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',
+ ),
+ 'purge_completed' => 'Limpieza completada (se han eliminado %d artículos)',
+ ),
+ 'update' => array(
+ 'can_apply' => 'FreshRSS se va a actualizar a la <strong>versión %s</strong>.',
+ 'error' => 'Hubo un error durante el proceso de actualización: %s',
+ 'file_is_nok' => 'Disponible la nueva <strong>versión %s</strong>. Sin embargo, debes revisar los permisos en el directorio <em>%s</em>. El servidor HTTP debe contar con permisos de escritura',
+ 'finished' => '¡Actualización completada!',
+ 'none' => 'No hay actualizaciones para procesar',
+ 'server_not_found' => 'No se ha podido conectar con el servidor de actualizaciones. [%s]',
+ ),
+ 'user' => array(
+ 'created' => array(
+ '_' => 'Se ha creado el usuario %s',
+ 'error' => 'No se ha podido crear al usuario %s',
+ ),
+ 'deleted' => array(
+ '_' => 'El usuario %s ha sido eliminado',
+ 'error' => 'El usuario %s no ha podido ser eliminado',
+ ),
+ ),
+ 'profile' => array(
+ 'error' => 'Tu perfil no puede ser modificado',
+ 'updated' => 'Tu perfil ha sido modificado',
+ ),
+);
diff --git a/app/i18n/es/gen.php b/app/i18n/es/gen.php
new file mode 100755
index 000000000..68fdaf429
--- /dev/null
+++ b/app/i18n/es/gen.php
@@ -0,0 +1,189 @@
+<?php
+
+return array(
+ 'action' => array(
+ 'actualize' => 'Actualizar',
+ 'back_to_rss_feeds' => '← regresar a tus fuentes RSS',
+ 'cancel' => 'Cancelar',
+ 'create' => 'Crear',
+ 'disable' => 'Desactivar',
+ 'empty' => 'Vaciar',
+ 'enable' => 'Activar',
+ 'export' => 'Exportar',
+ 'filter' => 'Filtrar',
+ 'import' => 'Importar',
+ 'manage' => 'Administrar',
+ 'mark_read' => 'Marcar como leído',
+ 'mark_favorite' => 'Marcar como favorita',
+ 'remove' => 'Borrar',
+ 'see_website' => 'Ver web',
+ 'submit' => 'Enviar',
+ 'truncate' => 'Borrar todos los artículos',
+ ),
+ 'auth' => array(
+ '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>',
+ ),
+ 'registration' => array(
+ '_' => 'Nueva cuenta',
+ 'ask' => '¿Crear una cuenta?',
+ 'title' => 'Creación de 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>',
+ ),
+ ),
+ 'date' => array(
+ 'Apr' => '\\A\\b\\r\\i\\l',
+ 'Aug' => '\\A\\g\\o\\s\\t\\o',
+ 'Dec' => '\\D\\i\\c\\i\\e\\m\\b\\r\\e',
+ 'Feb' => '\\F\\e\\b\\r\\e\\r\\o',
+ 'Jan' => '\\E\\n\\e\\r\\o',
+ 'Jul' => '\\J\\u\\l\\i\\o',
+ 'Jun' => '\\J\\u\\n\\i\\o',
+ 'Mar' => '\\M\\a\\r\\z\\o',
+ 'May' => '\\M\\a\\y\\o',
+ 'Nov' => '\\N\\o\\v\\i\\e\\m\\b\\r\\e',
+ 'Oct' => '\\O\\c\\t\\u\\b\\r\\e',
+ 'Sep' => '\\S\\e\\p\\t\\i\\e\\m\\b\\r\\e',
+ 'apr' => 'abr',
+ 'april' => 'abril',
+ 'aug' => 'ago',
+ 'august' => 'agosto',
+ 'before_yesterday' => 'Anteayer',
+ 'dec' => 'dic',
+ 'december' => 'diciembre',
+ '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',
+ 'fri' => 'Vie',
+ 'jan' => 'ene',
+ 'january' => 'ene',
+ 'jul' => 'jul',
+ 'july' => 'julio',
+ 'jun' => 'jun',
+ 'june' => 'junio',
+ 'last_3_month' => 'Últimos tres meses',
+ 'last_6_month' => 'Últimos seis meses',
+ 'last_month' => 'Mes pasado',
+ 'last_week' => 'Semana pasada',
+ 'last_year' => 'Año pasado',
+ 'mar' => 'mar',
+ 'march' => 'marzo',
+ 'may_' => 'may',
+ 'may' => 'mayo',
+ 'mon' => 'Lun',
+ 'month' => 'meses',
+ 'nov' => 'nov',
+ 'november' => 'noviembre',
+ 'oct' => 'oct',
+ 'october' => 'octubre',
+ 'sat' => 'Sab',
+ 'sep' => 'sep',
+ 'september' => 'septiembre',
+ 'sun' => 'Dom',
+ 'thu' => 'Jue',
+ 'today' => 'Hoy',
+ 'tue' => 'Mar',
+ 'wed' => 'Mie',
+ 'yesterday' => 'Ayer',
+ ),
+ 'freshrss' => array(
+ '_' => 'FreshRSS',
+ 'about' => 'Acerca de FreshRSS',
+ ),
+ 'js' => array(
+ 'category_empty' => 'Vaciar categoría',
+ 'confirm_action' => '¿Seguyro que quieres hacerlo? No hay marcha atrás...',
+ 'confirm_action_feed_cat' => '¿Seguro que quieres hacerlo? Perderás todos los favoritos relacionados y las peticiones de usuario. ¡Y no hay marcha atrás!',
+ 'feedback' => array(
+ 'body_new_articles' => 'Hay %%d nuevos artículos para leer en FreshRSS.',
+ 'request_failed' => 'La petición ha fallado. Puede ser debido a problemas de conexión a internet.',
+ 'title_new_articles' => 'FreshRSS: ¡Nuevos artículos!',
+ ),
+ 'new_article' => 'Hay nuevos artículos disponibles. Pincha para refrescar la página.',
+ 'should_be_activated' => 'JavaScript debe estar activado',
+ ),
+ 'lang' => array(
+ 'cz' => 'Čeština',
+ 'de' => 'Deutsch',
+ 'en' => 'English',
+ 'es' => 'Español',
+ 'fr' => 'Français',
+ 'it' => 'Italiano',
+ 'kr' => '한국어',
+ 'nl' => 'Nederlands',
+ 'pt-br' => 'Português (Brasil)',
+ 'ru' => 'Русский',
+ 'tr' => 'Türkçe',
+ 'zh-cn' => '简体中文',
+ ),
+ 'menu' => array(
+ 'about' => 'Acerca de',
+ 'admin' => 'Administración',
+ 'archiving' => 'Archivo',
+ 'authentication' => 'Identificación',
+ 'check_install' => 'Verificación de instalación',
+ 'configuration' => 'Configuración',
+ 'display' => 'Visualización',
+ 'extensions' => 'Extensiones',
+ 'logs' => 'Registros',
+ 'queries' => 'Peticiones de usuario',
+ 'reading' => 'Lectura',
+ 'search' => 'Buscar palabras o #etiquetas',
+ 'sharing' => 'Compartir',
+ 'shortcuts' => 'Atajos',
+ 'stats' => 'Estadísticas',
+ 'system' => 'Configuración del sistema',
+ 'update' => 'Actualización',
+ 'user_management' => 'Administrar usuarios',
+ 'user_profile' => 'Perfil',
+ ),
+ 'pagination' => array(
+ 'first' => 'Primero',
+ 'last' => 'Último',
+ 'load_more' => 'Cargar más artículos',
+ 'mark_all_read' => 'Marcar todo como leído',
+ 'next' => 'Siguiente',
+ 'nothing_to_load' => 'No hay más artículos',
+ 'previous' => 'Anterior',
+ ),
+ 'share' => array(
+ 'blogotext' => 'Blogotext',
+ 'diaspora' => 'Diaspora*',
+ 'email' => 'Email',
+ 'facebook' => 'Facebook',
+ 'g+' => 'Google+',
+ 'movim' => 'Movim',
+ 'print' => 'Print',
+ 'shaarli' => 'Shaarli',
+ 'twitter' => 'Twitter',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
+ 'jdh' => 'Journal du hacker',
+ 'Known' => 'Known based sites',
+ 'gnusocial' => 'GNU social',
+ ),
+ 'short' => array(
+ 'attention' => '¡Aviso!',
+ 'blank_to_disable' => 'Deja en blanco para desactivar',
+ 'by_author' => 'Por <em>%s</em>',
+ 'by_default' => 'Por defecto',
+ 'damn' => '¡Córcholis!',
+ 'default_category' => 'Sin categorizar',
+ 'no' => 'No',
+ 'not_applicable' => 'No disponible',
+ 'ok' => '¡Vale!',
+ 'or' => 'o',
+ 'yes' => 'Sí',
+ ),
+);
diff --git a/app/i18n/es/index.php b/app/i18n/es/index.php
new file mode 100755
index 000000000..03054e23a
--- /dev/null
+++ b/app/i18n/es/index.php
@@ -0,0 +1,61 @@
+<?php
+
+return array(
+ 'about' => array(
+ '_' => 'Acerca de',
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
+ '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>.',
+ 'freshrss_description' => 'FreshRSS es un agregador de fuentes RSS de alojamiento privado al estilo de <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> o <a href="http://projet.idleman.fr/leed/">Leed</a>. Es una herramienta potente, pero ligera y fácil de usar y configurar.',
+ 'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">en Github</a>',
+ 'license' => 'Licencia',
+ 'project_website' => 'Web del proyecto',
+ 'title' => 'Acerca de',
+ 'version' => 'Versión',
+ 'website' => 'Web',
+ ),
+ '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',
+ ),
+ 'log' => array(
+ '_' => 'Registros',
+ 'clear' => 'Limpiar registros',
+ 'empty' => 'El archivo de registro está vacío',
+ 'title' => 'Registros',
+ ),
+ 'menu' => array(
+ 'about' => 'Acerca de FreshRSS',
+ 'add_query' => 'Añadir petición',
+ 'before_one_day' => 'Con más de 1 día',
+ 'before_one_week' => 'Con más de una semana',
+ 'favorites' => 'Favoritos (%s)',
+ 'global_view' => 'Vista Global',
+ 'main_stream' => 'Salida Principal',
+ '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',
+ 'newer_first' => 'Nuevos primero',
+ 'non-starred' => 'Mostrar todos menos los favoritos',
+ 'normal_view' => 'Vista normal',
+ 'older_first' => 'Más antiguos primero',
+ 'queries' => 'Peticiones de usuario',
+ 'read' => 'Mostrar solo los leídos',
+ 'reader_view' => 'Vista de lectura',
+ 'rss_view' => 'Fuente RSS',
+ 'search_short' => 'Buscar',
+ 'starred' => 'Mostrar solo los favoritos',
+ 'stats' => 'Estadísticas',
+ 'subscription' => 'Administración de suscripciones',
+ 'unread' => 'Mostar solo no leídos',
+ ),
+ 'share' => 'Compartir',
+ 'tag' => array(
+ 'related' => 'Etiquetas relacionadas',
+ ),
+);
diff --git a/app/i18n/es/install.php b/app/i18n/es/install.php
new file mode 100755
index 000000000..cd6f63432
--- /dev/null
+++ b/app/i18n/es/install.php
@@ -0,0 +1,119 @@
+<?php
+
+return array(
+ 'action' => array(
+ 'finish' => 'Completar instalación',
+ 'fix_errors_before' => 'Por favor, soluciona los errores detectados antes de continuar con el siguiente paso.',
+ 'keep_install' => 'Conservar la configuración anterior',
+ 'next_step' => 'Ir al siguiente paso',
+ 'reinstall' => 'Reinstalar FreshRSS',
+ ),
+ 'auth' => array(
+ 'form' => 'Formulario Web (método más habitual, requiere JavaScript)',
+ 'http' => 'HTTP (para usuarios avanzados con HTTPS)',
+ 'none' => 'Ninguna (peligroso)',
+ 'password_form' => 'Contraseña<br /><small>(para el método de acceso mediante formulario web)</small>',
+ 'password_format' => 'Al menos 7 caracteres',
+ '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.',
+ ),
+ 'host' => 'Servidor',
+ 'prefix' => 'Prefijo de la tabla',
+ 'password' => 'Contraseña de la base de datos',
+ 'type' => 'Tipo de base de datos',
+ 'username' => 'Nombre de usuario de la 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.',
+ 'ok' => 'Los permisos del directorio cache son correctos.',
+ ),
+ 'ctype' => array(
+ 'nok' => 'No se ha podido localizar la librería para la verificación del tipo de caracteres (php-ctype).',
+ 'ok' => 'Cuentas con la librería necesaria para la verificación del tipo de caracteres (ctype).',
+ ),
+ 'curl' => array(
+ 'nok' => 'No se ha podido localizar la librería cURL (paquete php-curl).',
+ 'ok' => 'Dispones de la librería cURL.',
+ ),
+ 'data' => array(
+ 'nok' => 'Comprueba los permisos del directorio <em>./data</em>. El servidor HTTP debe contar con permisos de escritura.',
+ 'ok' => 'Los permisos del directorio data son correctos.',
+ ),
+ 'dom' => array(
+ 'nok' => 'No se ha podido localizar la librería necesaria para explorar la DOM.',
+ 'ok' => 'Dispones de la librería necesaria para explorar la DOM.',
+ ),
+ 'favicons' => array(
+ 'nok' => 'Verifica los permisos en el directorio <em>./data/favicons</em>. El servidor HTTP debe contar con permisos de escritura.',
+ 'ok' => 'Los permisos del directorio favicons son correctos.',
+ ),
+ 'fileinfo' => array(
+ 'nok' => 'No se ha podido localizar la librería PHP fileinfo (paquete fileinfo).',
+ 'ok' => 'Dispones de la librería fileinfo.',
+ ),
+ 'http_referer' => array(
+ 'nok' => 'Por favor, comprueba que no estás alterando tu configuración HTTP REFERER.',
+ 'ok' => 'La configuración HTTP REFERER es conocida y se corresponde con la de tu servidor.',
+ ),
+ 'json' => array(
+ 'nok' => 'No se ha podido localizar la librería para procesar JSON.',
+ 'ok' => 'Dispones de la librería recomendada para procesar JSON.',
+ ),
+ 'minz' => array(
+ 'nok' => 'No se ha podido localizar el entorno Minz.',
+ 'ok' => 'Dispones del entorno Minz.',
+ ),
+ 'pcre' => array(
+ 'nok' => 'No se ha podido encontrar la librería necesaria para las expresiones regulares (php-pcre).',
+ 'ok' => 'Dispones de la librería necesaria para las expresiones regulares (PCRE).',
+ ),
+ 'pdo' => array(
+ 'nok' => 'No se ha podido localizar PDO o uno de los controladores compatibles (pdo_mysql, pdo_sqlite, pdo_pgsql).',
+ 'ok' => 'Dispones de PDO y al menos uno de los controladores compatibles (pdo_mysql, pdo_sqlite, pdo_pgsql).',
+ ),
+ 'php' => array(
+ 'nok' => 'Dispones de la versión PHP %s, pero FreshRSS necesita de, al menos, la versión %s.',
+ 'ok' => 'Dispones de la versión PHP %s, que es compatible con FreshRSS.',
+ ),
+ 'users' => array(
+ 'nok' => 'Revisa los permisos en el directorio <em>./data/users</em>. El servidor HTTP debe contar con permisos de escritura.',
+ 'ok' => 'Los permisos en el directorio users son correctos.',
+ ),
+ 'xml' => array(
+ 'nok' => 'No se ha podido localizar la librería necesaria para procesar XML.',
+ 'ok' => 'Dispones de la librería necesaria para procesar XML.',
+ ),
+ ),
+ 'conf' => array(
+ '_' => 'Configuración general',
+ 'ok' => 'La configuración general se ha guardado.',
+ ),
+ 'congratulations' => '¡Enhorabuena!',
+ 'default_user' => 'Nombre de usuario para el usuario por defecto <small>(máximo de 16 caracteres alfanuméricos)</small>',
+ 'delete_articles_after' => 'Eliminar los artículos tras',
+ 'fix_errors_before' => 'Por favor, soluciona los errores detectados antes de proceder con el siguiente paso.',
+ 'javascript_is_better' => 'FreshRSS funciona mejor con JavaScript activado',
+ 'js' => 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.',
+ ),
+ '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!',
+);
diff --git a/app/i18n/es/sub.php b/app/i18n/es/sub.php
new file mode 100755
index 000000000..c18f0b786
--- /dev/null
+++ b/app/i18n/es/sub.php
@@ -0,0 +1,62 @@
+<?php
+
+return array(
+ 'category' => array(
+ '_' => 'Categoría',
+ 'add' => 'Añadir a la categoría',
+ 'empty' => 'Vaciar categoría',
+ 'new' => 'Nueva categoría',
+ ),
+ 'feed' => array(
+ 'add' => 'Añadir fuente RSS',
+ 'advanced' => 'Avanzado',
+ 'archiving' => 'Archivo',
+ 'auth' => array(
+ 'configuration' => 'Identificación',
+ 'help' => 'Permitir acceso a fuentes RSS protegidas con HTTP',
+ 'http' => 'Identificación HTTP',
+ 'password' => 'Contraseña HTTP',
+ 'username' => 'Nombre de usuario HTTP',
+ ),
+ '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.',
+ 'in_main_stream' => 'Mostrar en salida principal',
+ 'informations' => 'Información',
+ 'keep_history' => '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>.',
+ 'no_selected' => 'No hay funentes seleccionadas.',
+ 'number_entries' => '%d artículos',
+ 'stats' => 'Estadísticas',
+ 'think_to_add' => 'Puedes añadir fuentes.',
+ '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',
+ 'pubsubhubbub' => 'Notificación inmedaiata con PubSubHubbub',
+ ),
+ 'import_export' => array(
+ 'export' => 'Exportar',
+ 'export_opml' => 'Exportar la lista de fuentes (OPML)',
+ 'export_starred' => 'Exportar tus favoritos',
+ '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)',
+ 'import' => 'Importar',
+ 'starred_list' => 'Lista de artículos favoritos',
+ 'title' => 'Importar / exportar',
+ ),
+ 'menu' => array(
+ 'bookmark' => 'Suscribirse (favorito FreshRSS)',
+ 'import_export' => 'Importar / exportar',
+ 'subscription_management' => 'Administración de suscripciones',
+ ),
+ 'title' => array(
+ '_' => 'Administración de suscripciones',
+ 'feed_management' => 'Administración de fuentes RSS',
+ ),
+);
diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php
index 43825f798..16935c3c4 100644
--- a/app/i18n/fr/gen.php
+++ b/app/i18n/fr/gen.php
@@ -77,9 +77,10 @@ return array(
'last_month' => 'Depuis le mois dernier',
'last_week' => 'Depuis la semaine dernière',
'last_year' => 'Depuis l’année dernière',
- 'mar' => 'mar.',
+ 'mar' => 'mars',
'march' => 'mars',
- 'may' => 'mai.',
+ 'may_' => 'mai',
+ 'may' => 'mai',
'mon' => 'lun.',
'month' => 'mois',
'nov' => 'nov.',
@@ -116,11 +117,15 @@ return array(
'cz' => 'Čeština',
'de' => 'Deutsch',
'en' => 'English',
+ 'es' => 'Español',
'fr' => 'Français',
'it' => 'Italiano',
+ 'kr' => '한국어',
'nl' => 'Nederlands',
+ 'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
'tr' => 'Türkçe',
+ 'zh-cn' => '简体中文',
),
'menu' => array(
'about' => 'À propos',
diff --git a/app/i18n/fr/sub.php b/app/i18n/fr/sub.php
index bb3f2fefc..9135b2b7c 100644
--- a/app/i18n/fr/sub.php
+++ b/app/i18n/fr/sub.php
@@ -1,6 +1,11 @@
<?php
return array(
+ '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.',
+ 'label' => 'S’abonner',
+ 'title' => 'Bookmarklet',
+ ),
'category' => array(
'_' => 'Catégorie',
'add' => 'Ajouter une catégorie',
@@ -39,6 +44,10 @@ return array(
'website' => 'URL du site',
'pubsubhubbub' => 'Notification instantanée par PubSubHubbub',
),
+ '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.',
+ 'title' => 'Lecteur de flux dans Firefox',
+ ),
'import_export' => array(
'export' => 'Exporter',
'export_opml' => 'Exporter la liste des flux (OPML)',
@@ -54,9 +63,11 @@ return array(
'bookmark' => 'S’abonner (bookmark FreshRSS)',
'import_export' => 'Importer / exporter',
'subscription_management' => 'Gestion des abonnements',
+ 'subscription_tools' => 'Outils d’abonnement',
),
'title' => array(
'_' => 'Gestion des abonnements',
'feed_management' => 'Gestion des flux RSS',
+ 'subscription_tools' => 'Outils d’abonnement',
),
);
diff --git a/app/i18n/it/conf.php b/app/i18n/it/conf.php
index e6ce86ef9..15837ae8a 100644
--- a/app/i18n/it/conf.php
+++ b/app/i18n/it/conf.php
@@ -104,7 +104,7 @@ return array(
'when' => 'Segna articoli come letti…',
),
'show' => array(
- '_' => 'Articoli da visualizzare',
+ '_' => 'Articoli da visualizzare',
'adaptive' => 'Adatta visualizzazione',
'all_articles' => 'Mostra tutti gli articoli',
'unread' => 'Mostra solo non letti',
diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php
index ec6de84de..ae39d7324 100644
--- a/app/i18n/it/gen.php
+++ b/app/i18n/it/gen.php
@@ -54,41 +54,42 @@ return array(
'Nov' => '\\N\\o\\v\\e\\m\\b\\r\\e',
'Oct' => '\\O\\t\\t\\o\\b\\r\\e',
'Sep' => '\\S\\e\\t\\t\\e\\m\\b\\r\\e',
- 'apr' => 'apr',
- 'april' => 'Apr',
- 'aug' => 'aug',
- 'august' => 'Aug',
+ 'apr' => 'apr.',
+ 'april' => 'aprile',
+ 'aug' => 'ag.',
+ 'august' => 'agosto',
'before_yesterday' => 'Meno recenti',
- 'dec' => 'dec',
- 'december' => 'Dec',
- 'feb' => 'feb',
- 'february' => 'Feb',
+ 'dec' => 'dic.',
+ 'december' => 'dicembre',
+ 'feb' => 'febbr.',
+ 'february' => 'febbraio',
'format_date' => 'j\\ %s Y',
'format_date_hour' => 'j\\ %s Y \\o\\r\\e H\\:i',
'fri' => 'Fri',
- 'jan' => 'jan',
- 'january' => 'Jan',
+ 'jan' => 'genn.',
+ 'january' => 'gennaio',
'jul' => 'jul',
- 'july' => 'Jul',
+ 'july' => 'luglio',
'jun' => 'jun',
- 'june' => 'Jun',
+ 'june' => 'giugno',
'last_3_month' => 'Ultimi 3 mesi',
'last_6_month' => 'Ultimi 6 mesi',
'last_month' => 'Ultimo mese',
'last_week' => 'Ultima settimana',
'last_year' => 'Ultimo anno',
- 'mar' => 'mar',
- 'march' => 'Mar',
- 'may' => 'May',
+ 'mar' => 'mar.',
+ 'march' => 'marzo',
+ 'may_' => 'May',
+ 'may' => 'maggio',
'mon' => 'Mon',
'month' => 'mesi',
- 'nov' => 'nov',
- 'november' => 'Nov',
- 'oct' => 'oct',
- 'october' => 'Oct',
+ 'nov' => 'nov.',
+ 'november' => 'novembre',
+ 'oct' => 'ott.',
+ 'october' => 'ottobre',
'sat' => 'Sat',
- 'sep' => 'sep',
- 'september' => 'Sep',
+ 'sep' => 'sett.',
+ 'september' => 'settembre',
'sun' => 'Sun',
'thu' => 'Thu',
'today' => 'Oggi',
@@ -116,11 +117,15 @@ return array(
'cz' => 'Čeština',
'de' => 'Deutsch',
'en' => 'English',
+ 'es' => 'Español',
'fr' => 'Français',
'it' => 'Italiano',
+ 'kr' => '한국어',
'nl' => 'Nederlands',
+ 'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
'tr' => 'Türkçe',
+ 'zh-cn' => '简体中文',
),
'menu' => array(
'about' => 'Informazioni',
diff --git a/app/i18n/it/sub.php b/app/i18n/it/sub.php
index 758e322c5..e730e2bc8 100644
--- a/app/i18n/it/sub.php
+++ b/app/i18n/it/sub.php
@@ -1,6 +1,11 @@
<?php
return array(
+ '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
+ 'title' => 'Bookmarklet',// TODO
+ ),
'category' => array(
'_' => 'Categoria',
'add' => 'Aggiungi una categoria',
@@ -39,6 +44,10 @@ return array(
'website' => 'URL del sito',
'pubsubhubbub' => 'Notifica istantanea con PubSubHubbub',
),
+ '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
+ 'title' => 'Firefox feed reader',// TODO
+ ),
'import_export' => array(
'export' => 'Esporta',
'export_opml' => 'Esporta tutta la lista dei feed (OPML)',
@@ -54,9 +63,11 @@ return array(
'bookmark' => 'Bookmark (trascina nei preferiti)',
'import_export' => 'Importa / esporta',
'subscription_management' => 'Gestione sottoscrizioni',
+ 'subscription_tools' => 'Subscription tools',// TODO
),
'title' => array(
'_' => 'Gestione sottoscrizioni',
'feed_management' => 'Gestione RSS feeds',
+ 'subscription_tools' => 'Subscription tools',// TODO
),
);
diff --git a/app/i18n/kr/admin.php b/app/i18n/kr/admin.php
new file mode 100644
index 000000000..13f4695e1
--- /dev/null
+++ b/app/i18n/kr/admin.php
@@ -0,0 +1,181 @@
+<?php
+
+return array(
+ 'auth' => array(
+ 'allow_anonymous' => '누구나 기본 사용자의 글을 읽을 수 있도록 합니다(%s)',
+ 'allow_anonymous_refresh' => '누구나 피드를 갱신할 수 있도록 합니다',
+ 'api_enabled' => '<abbr>API</abbr> 사용을 허가합니다<small>(모바일 애플리케이션을 사용할 때 필요합니다)</small>',
+ 'form' => '웹폼 (전통적인 방식, 자바스크립트 필요)',
+ 'http' => 'HTTP (HTTPS를 사용하는 고급 사용자용)',
+ 'none' => '사용하지 않음 (위험)',
+ 'title' => '인증',
+ 'title_reset' => '인증 초기화',
+ 'token' => '인증 토큰',
+ 'token_help' => '기본 사용자의 RSS에 인증 없이 접근할 수 있도록 합니다:',
+ 'type' => '인증',
+ 'unsafe_autologin' => '다음과 같은 안전하지 않은 방식의 로그인을 허가합니다: ',
+ ),
+ 'check_install' => array(
+ 'cache' => array(
+ 'nok' => '<em>./data/cache</em> 디렉토리의 권한을 확인하세요. HTTP 서버가 쓰기 권한을 가지고 있어야 합니다',
+ 'ok' => 'cache 디렉토리의 권한이 올바르게 설정되었습니다.',
+ ),
+ 'categories' => array(
+ 'nok' => 'category 테이블 설정이 잘못되었습니다.',
+ 'ok' => 'category 테이블이 올바르게 설정되었습니다.',
+ ),
+ 'connection' => array(
+ 'nok' => '데이터베이스에 연결할 수 없습니다.',
+ 'ok' => '데이터베이스와의 연결이 올바르게 설정되었습니다.',
+ ),
+ 'ctype' => array(
+ 'nok' => '문자열 타입 검사에 필요한 라이브러리를 찾을 수 없습니다 (php-ctype).',
+ 'ok' => '문자열 타입 검사에 필요한 라이브러리가 설치되어 있습니다 (ctype).',
+ ),
+ 'curl' => array(
+ 'nok' => 'cURL 라이브러리를 찾을 수 없습니다 (php-curl 패키지).',
+ 'ok' => 'cURL 라이브러리가 설치되어 있습니다.',
+ ),
+ 'data' => array(
+ 'nok' => '<em>./data</em> 디렉토리의 권한을 확인하세요. HTTP 서버가 쓰기 권한을 가지고 있어야 합니다',
+ 'ok' => 'data 디렉토리의 권한이 올바르게 설정되었습니다.',
+ ),
+ 'database' => '데이터베이스 설치 요구사항',
+ 'dom' => array(
+ 'nok' => 'DOM을 다룰 수 있는 라이브러리를 찾을 수 없습니다 (php-xml 패키지).',
+ 'ok' => 'DOM을 다룰 수 있는 라이브러리가 설치되어 있습니다.',
+ ),
+ 'entries' => array(
+ 'nok' => 'entry 테이블 설정이 잘못되었습니다.',
+ 'ok' => 'entry 테이블이 올바르게 설정되었습니다.',
+ ),
+ 'favicons' => array(
+ 'nok' => '<em>./data/favicons</em> 디렉토리의 권한을 확인하세요. HTTP 서버가 쓰기 권한을 가지고 있어야 합니다',
+ 'ok' => 'favicons 디렉토리의 권한이 올바르게 설정되어 있습니다.',
+ ),
+ 'feeds' => array(
+ 'nok' => 'feed 테이블 설정이 잘못되었습니다.',
+ 'ok' => 'feed 테이블이 올바르게 설정되었습니다',
+ ),
+ 'fileinfo' => array(
+ 'nok' => 'fileinfo 라이브러리를 찾을 수 없습니다 (fileinfo 패키지).',
+ 'ok' => 'fileinfo 라이브러리가 설치되어 있습니다.',
+ ),
+ 'files' => '파일 시스템 설치 요구사항',
+ 'json' => array(
+ 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php5-json 패키지).',
+ 'ok' => 'JSON 확장 기능이 설치되어 있습니다.',
+ ),
+ 'minz' => array(
+ 'nok' => 'Minz 프레임워크를 찾을 수 없습니다.',
+ 'ok' => 'Minz 프레임워크가 설치되어 있습니다.',
+ ),
+ 'pcre' => array(
+ 'nok' => '정규표현식을 위한 라이브러리를 찾을 수 없습니다 (php-pcre).',
+ 'ok' => '정규표현식을 위한 라이브러리가 설치되어 있습니다 (PCRE).',
+ ),
+ 'pdo' => array(
+ 'nok' => '지원가능한 드라이버나 PDO를 찾을 수 없습니다 (pdo_mysql, pdo_sqlite, pdo_pgsql).',
+ 'ok' => '최소 하나의 지원가능한 드라이버와 PDO가 설치되어 있습니다 (pdo_mysql, pdo_sqlite, pdo_pgsql).',
+ ),
+ 'php' => array(
+ '_' => 'PHP 설치 요구사항',
+ 'nok' => 'PHP 버전은 %s 이지만, FreshRSS에는 최소 %s의 버전이 필요합니다.',
+ 'ok' => 'PHP 버전은 %s 이고, FreshRSS와 호환가능 합니다.',
+ ),
+ 'tables' => array(
+ 'nok' => '하나 이상의 테이블을 데이터베이스에서 찾을 수 없습니다.',
+ 'ok' => '데이터베이스에 모든 테이블이 존재합니다.',
+ ),
+ 'title' => '설치 요구사항 확인',
+ 'tokens' => array(
+ 'nok' => '<em>./data/tokens</em> 디렉토리의 권한을 확인하세요. HTTP 서버가 쓰기 권한을 가지고 있어야 합니다',
+ 'ok' => 'tokens 디렉토리의 권한이 올바르게 설정되어 있습니다',
+ ),
+ 'users' => array(
+ 'nok' => '<em>./data/users</em> 디렉토리의 권한을 확인하세요. HTTP 서버가 쓰기 권한을 가지고 있어야 합니다',
+ 'ok' => 'users 디렉토리의 권한이 올바르게 설정되어 있습니다.',
+ ),
+ 'zip' => array(
+ 'nok' => 'ZIP 확장 기능을 찾을 수 없습니다 (php-zip 패키지).',
+ 'ok' => 'ZIP 확장 기능이 설치되어 있습니다.',
+ ),
+ ),
+ 'extensions' => array(
+ 'disabled' => '비활성화됨',
+ 'empty_list' => '설치된 확장 기능이 없습니다',
+ 'enabled' => '활성화됨',
+ 'no_configure_view' => '이 확장 기능은 설정이 없습니다.',
+ 'system' => array(
+ '_' => '시스템 확장 기능',
+ 'no_rights' => '시스템 확장 기능 (이 확장 기능에 대한 권한이 없습니다)',
+ ),
+ 'title' => '확장 기능',
+ 'user' => '사용자 확장 기능',
+ ),
+ 'stats' => array(
+ '_' => '통계',
+ 'all_feeds' => '모든 피드',
+ 'category' => '카테고리',
+ 'entry_count' => '글 개수',
+ 'entry_per_category' => '카테고리별 글 개수',
+ 'entry_per_day' => '일일 글 개수 (최근 30 일)',
+ 'entry_per_day_of_week' => '요일별 (평균: %.2f 개의 글)',
+ 'entry_per_hour' => '시간별 (평균: %.2f 개의 글)',
+ 'entry_per_month' => '월별 (평균: %.2f 개의 글)',
+ 'entry_repartition' => '글 분류',
+ 'feed' => '피드',
+ 'feed_per_category' => '카테고리별 피드 개수',
+ 'idle' => '유휴 피드',
+ 'main' => '주요 통계',
+ 'main_stream' => '메인 스트림',
+ 'menu' => array(
+ 'idle' => '유휴 피드',
+ 'main' => '주요 통계',
+ 'repartition' => '글 분류',
+ ),
+ 'no_idle' => '유휴 피드가 없습니다!',
+ 'number_entries' => '%d 개의 글',
+ 'percent_of_total' => '전체에서의 비율 (%%)',
+ 'repartition' => '글 분류',
+ 'status_favorites' => '즐겨찾기',
+ 'status_read' => '읽음',
+ 'status_total' => '전체',
+ 'status_unread' => '읽지 않음',
+ 'title' => '통계',
+ 'top_feed' => '상위 10 개 피드',
+ ),
+ 'system' => array(
+ '_' => '시스템 설정',
+ 'auto-update-url' => '자동 업데이트 서버 URL',
+ '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)',
+ 'create' => '새 사용자 생성',
+ 'language' => '언어',
+ 'number' => '%d 개의 계정이 생성되었습니다',
+ 'numbers' => '%d 개의 계정이 생성되었습니다',
+ 'password_form' => '암호<br /><small>(웹폼 로그인 방식 사용시)</small>',
+ 'password_format' => '7 글자 이상이어야 합니다',
+ 'title' => '사용자 관리',
+ 'user_list' => '사용자 목록',
+ 'username' => '사용자 이름',
+ 'users' => '전체 사용자',
+ ),
+);
diff --git a/app/i18n/kr/conf.php b/app/i18n/kr/conf.php
new file mode 100644
index 000000000..35d412078
--- /dev/null
+++ b/app/i18n/kr/conf.php
@@ -0,0 +1,174 @@
+<?php
+
+return array(
+ 'archiving' => array(
+ '_' => '보관',
+ 'advanced' => '고급 설정',
+ 'delete_after' => '다음 기간보다 오래된 글 삭제',
+ 'help' => '더 자세한 옵션은 개별 피드 설정에 있습니다',
+ 'keep_history_by_feed' => '피드별 최소 유지 글 개수',
+ 'optimize' => '데이터베이스 최적화',
+ 'optimize_help' => '데이터베이스 크기를 줄이기 위해 가끔씩 수행해주세요',
+ 'purge_now' => '지금 삭제',
+ 'title' => '보관',
+ 'ttl' => '다음 시간이 지나기 전에 새로고침 금지',
+ ),
+ 'display' => array(
+ '_' => '표시',
+ 'icon' => array(
+ 'bottom_line' => '하단',
+ 'entry' => '문서 아이콘',
+ 'publication_date' => '발행일',
+ 'related_tags' => '관련 태그',
+ 'sharing' => '공유',
+ 'top_line' => '상단',
+ ),
+ 'language' => '언어',
+ 'notif_html5' => array(
+ 'seconds' => '초 (0: 타임아웃 없음)',
+ 'timeout' => 'HTML5 알림 타임아웃',
+ ),
+ 'theme' => '테마',
+ 'title' => '표시',
+ 'width' => array(
+ 'content' => '내용 표시 너비',
+ 'large' => '넓음',
+ 'medium' => '보통',
+ 'no_limit' => '제한 없음',
+ 'thin' => '얇음',
+ ),
+ ),
+ 'query' => array(
+ '_' => '사용자 쿼리',
+ 'deprecated' => '이 쿼리는 더 이상 유효하지 않습니다. 해당하는 카테고리나 피드가 삭제되었습니다.',
+ 'filter' => '적용된 필터:',
+ 'get_all' => '모든 글 표시',
+ 'get_category' => '"%s" 카테고리 표시',
+ 'get_favorite' => '즐겨찾기에 등록된 글 표시',
+ 'get_feed' => '"%s" 피드 표시',
+ 'no_filter' => '필터가 없습니다',
+ 'none' => '아직 사용자 쿼리를 만들지 않았습니다.',
+ 'number' => '쿼리 #%d',
+ 'order_asc' => '오래된 글 먼저 표시',
+ 'order_desc' => '최근 글 먼저 표시',
+ 'search' => '"%s"의 검색 결과',
+ 'state_0' => '모든 글 표시',
+ 'state_1' => '읽은 글 표시',
+ 'state_2' => '읽지 않은 글 표시',
+ 'state_3' => '모든 글 표시',
+ 'state_4' => '즐겨찾기에 등록된 글 표시',
+ 'state_5' => '즐겨찾기에 등록된 읽은 글 표시',
+ 'state_6' => '즐겨찾기에 등록된 읽지 않은 글 표시',
+ 'state_7' => '즐겨찾기에 등록된 글 표시',
+ 'state_8' => '즐겨찾기에 등록되지 않은 글 표시',
+ 'state_9' => '즐겨찾기에 등록되지 않고 읽은 글 표시',
+ 'state_10' => '즐겨찾기에 등록되지 않고 읽지 않은 글 표시',
+ 'state_11' => '즐겨찾기에 등록되지 않은 글 표시',
+ 'state_12' => '모든 글 표시',
+ 'state_13' => '읽은 글 표시',
+ 'state_14' => '읽지 않은 글 표시',
+ 'state_15' => '모든 글 표시',
+ 'title' => '사용자 쿼리',
+ ),
+ 'profile' => array(
+ '_' => '프로필 관리',
+ 'delete' => array(
+ '_' => '계정 삭제',
+ 'warn' => '당신의 계정과 관련된 모든 데이터가 삭제됩니다.',
+ ),
+ 'password_api' => 'API 암호<br /><small>(예: 모바일 애플리케이션)</small>',
+ 'password_form' => '암호<br /><small>(웹폼 로그인 방식 사용시)</small>',
+ 'password_format' => '7 글자 이상이어야 합니다',
+ 'title' => '프로필',
+ ),
+ 'reading' => array(
+ '_' => '읽기',
+ 'after_onread' => '“모두 읽음으로 표시” 후,',
+ 'articles_per_page' => '페이지당 글 수',
+ 'auto_load_more' => '페이지 하단에 다다르면 글 더 불러오기',
+ 'auto_remove_article' => '글을 읽은 후 숨기기',
+ 'mark_updated_article_unread' => '갱신 된 글을 읽지 않음으로 표시',
+ 'confirm_enabled' => '“모두 읽음으로 표시” 실행시 확인 창 표시',
+ 'display_articles_unfolded' => '글을 펼쳐진 상태로 보여주기',
+ 'display_categories_unfolded' => '카테고리를 접힌 상태로 보여주기',
+ 'hide_read_feeds' => '읽지 않은 글이 없는 카테고리와 피드 감추기 (“모든 글 표시”가 설정된 경우 동작하지 않습니다)',
+ 'img_with_lazyload' => '그림을 불러오는 데에 "lazy load" 모드 사용하기',
+ 'sides_close_article' => '글 영역 바깥을 클릭하면 글 접기',
+ 'jump_next' => '다음 읽지 않은 항목으로 이동 (피드 또는 카테고리)',
+ 'number_divided_when_reader' => '읽기 모드에서는 절반만 표시됩니다.',
+ 'read' => array(
+ 'article_open_on_website' => '글이 게재된 웹사이트를 방문했을 때',
+ 'article_viewed' => '글을 읽었을 때',
+ 'scroll' => '스크롤을 하며 지나갈 때',
+ 'upon_reception' => '글을 가져오자마자',
+ 'when' => '읽음으로 표시…',
+ ),
+ 'show' => array(
+ '_' => '글 표시 방식',
+ 'adaptive' => '읽지 않은 글이 없으면 모든 글 표시',
+ 'all_articles' => '모든 글 표시',
+ 'unread' => '읽지 않은 글만 표시',
+ ),
+ 'sort' => array(
+ '_' => '정렬 순서',
+ 'newer_first' => '최근 글 먼저',
+ 'older_first' => '오래된 글 먼저',
+ ),
+ 'sticky_post' => '글이 펼쳐진 경우 최상단에 고정하기',
+ 'title' => '읽기',
+ 'view' => array(
+ 'default' => '기본 보기 모드',
+ 'global' => '전체 모드',
+ 'normal' => '일반 모드',
+ 'reader' => '읽기 모드',
+ ),
+ ),
+ 'sharing' => array(
+ '_' => '공유',
+ 'blogotext' => 'Blogotext',
+ 'diaspora' => 'Diaspora*',
+ 'email' => '메일',
+ 'facebook' => 'Facebook',
+ 'g+' => 'Google+',
+ 'more_information' => '자세한 정보',
+ 'print' => '인쇄',
+ 'shaarli' => 'Shaarli',
+ 'share_name' => '표시할 이름',
+ 'share_url' => '사용할 공유 URL',
+ 'title' => '공유',
+ 'twitter' => 'Twitter',
+ 'wallabag' => 'wallabag',
+ ),
+ 'shortcut' => array(
+ '_' => '단축키',
+ 'article_action' => '글 관련 동작',
+ 'auto_share' => '공유',
+ 'auto_share_help' => '공유 옵션이 하나만 설정되어 있다면 해당 공유 옵션을 사용하고, 그렇지 않다면 공유 옵션을 번호로 선택할 수 있습니다.',
+ 'close_dropdown' => '메뉴 닫기',
+ 'collapse_article' => '접기',
+ 'first_article' => '첫 글 보기',
+ 'focus_search' => '검색창 사용하기',
+ 'help' => '도움말 보기',
+ 'javascript' => '단축키를 사용하기 위해선 자바스크립트를 사용하도록 설정하여야 합니다',
+ 'last_article' => '마지막 글 보기',
+ 'load_more' => '글 더 불러오기',
+ 'mark_read' => '읽음으로 표시',
+ 'mark_favorite' => '즐겨찾기에 등록',
+ 'navigation' => '탐색',
+ 'navigation_help' => '"Shift" 키를 누른 상태에선 탐색 단축키가 피드에 적용됩니다.<br/>"Alt" 키를 누른 상태에선 탐색 단축키가 카테고리에 적용됩니다.',
+ 'next_article' => '다음 글 보기',
+ 'other_action' => '다른 동작',
+ 'previous_article' => '이전 글 보기',
+ 'see_on_website' => '글이 게재된 웹사이트에서 보기',
+ 'shift_for_all_read' => '+ <code>shift</code>를 누른 상태에선 모두 읽음으로 표시',
+ 'title' => '단축키',
+ 'user_filter' => '사용자 필터 사용하기',
+ 'user_filter_help' => '사용자 필터가 하나만 설정되어 있다면 해당 필터를 사용하고, 그렇지 않다면 필터를 번호로 선택할 수 있습니다.',
+ ),
+ 'user' => array(
+ 'articles_and_size' => '%s 개의 글 (%s)',
+ 'current' => '현재 사용자',
+ 'is_admin' => '관리자입니다',
+ 'users' => '전체 사용자',
+ ),
+);
diff --git a/app/i18n/kr/feedback.php b/app/i18n/kr/feedback.php
new file mode 100644
index 000000000..a70923761
--- /dev/null
+++ b/app/i18n/kr/feedback.php
@@ -0,0 +1,109 @@
+<?php
+
+return array(
+ 'admin' => array(
+ 'optimization_complete' => '최적화가 완료되었습니다',
+ ),
+ 'access' => array(
+ 'denied' => '이 페이지에 접근할 수 있는 권한이 없습니다',
+ 'not_found' => '이 페이지는 존재하지 않습니다',
+ ),
+ 'auth' => array(
+ 'form' => array(
+ 'not_set' => '인증 시스템을 설정하는 동안 문제가 발생했습니다. 잠시 후 다시 시도하세요.',
+ 'set' => '웹폼이 이제 기본 인증 시스템으로 설정되었습니다.',
+ ),
+ 'login' => array(
+ 'invalid' => '유효하지 않은 로그인입니다',
+ 'success' => '접속되었습니다',
+ ),
+ 'logout' => array(
+ 'success' => '접속이 해제되었습니다',
+ ),
+ 'no_password_set' => '관리자 암호가 설정되지 않았습니다. 이 기능은 사용할 수 없습니다.',
+ ),
+ 'conf' => array(
+ 'error' => '설정을 저장하는 동안 문제가 발생했습니다',
+ 'query_created' => '쿼리 "%s" 가 생성되었습니다.',
+ 'shortcuts_updated' => '단축키가 갱신되었습니다',
+ 'updated' => '설정이 저장되었습니다',
+ ),
+ 'extensions' => array(
+ 'already_enabled' => '%s 확장 기능은 이미 활성화되어 있습니다',
+ 'disable' => array(
+ 'ko' => '%s 확장 기능을 비활성화 할 수 없습니다. 자세한 내용은 <a href="%s">FressRSS 로그</a>를 참고하세요.',
+ 'ok' => '%s 확장 기능이 비활성화되었습니다',
+ ),
+ 'enable' => array(
+ 'ko' => '%s 확장 기능을 활성화 할 수 없습니다. 자세한 내용은 <a href="%s">FressRSS 로그</a>를 참고하세요.',
+ 'ok' => '%s 확장 기능이 활성화되었습니다',
+ ),
+ 'no_access' => '%s 확장 기능에 접근 권한이 없습니다',
+ 'not_enabled' => '%s 확장 기능이 활성화되지 않았습니다',
+ 'not_found' => '%s 확장 기능이 존재하지 않습니다',
+ ),
+ 'import_export' => array(
+ 'export_no_zip_extension' => 'ZIP 확장 기능을 서버에서 찾을 수 없습니다. 파일을 하나씩 내보내세요.',
+ 'feeds_imported' => '피드를 성공적으로 불러왔습니다',
+ 'feeds_imported_with_errors' => '피드를 불러왔지만, 문제가 발생했습니다',
+ 'file_cannot_be_uploaded' => '파일을 업로드할 수 없습니다!',
+ 'no_zip_extension' => 'ZIP 확장 기능을 서버에서 찾을 수 없습니다.',
+ 'zip_error' => 'ZIP 파일을 불러오는 동안 문제가 발생했습니다.',
+ ),
+ 'sub' => array(
+ 'actualize' => 'Updating',
+ 'category' => array(
+ 'created' => '%s 카테고리가 생성되었습니다.',
+ 'deleted' => '카테고리가 삭제되었습니다.',
+ 'emptied' => '카테고리를 비웠습니다',
+ 'error' => '카테고리를 변경할 수 없습니다',
+ 'name_exists' => '같은 카테고리 이름이 이미 존재합니다.',
+ 'no_id' => '카테고리 id를 명시해야 합니다.',
+ 'no_name' => '카테고리 이름을 명시해야 합니다.',
+ 'not_delete_default' => '기본 카테고리는 삭제할 수 없습니다!',
+ 'not_exist' => '카테고리가 존재하지 않습니다!',
+ 'over_max' => '카테고리 개수 제한에 다다랐습니다 (%d)',
+ 'updated' => '카테고리가 변경되었습니다.',
+ ),
+ 'feed' => array(
+ 'actualized' => '<em>%s</em> 피드에서 새 글을 가져왔습니다',
+ 'actualizeds' => 'RSS 피드에서 새 글을 가져왔습니다',
+ 'added' => '<em>%s</em> 피드가 추가되었습니다',
+ 'already_subscribed' => '이미 <em>%s</em> 피드를 구독 중입니다',
+ 'deleted' => '피드가 삭제되었습니다',
+ 'error' => '피드를 변경할 수 없습니다',
+ 'internal_problem' => 'RSS 피드를 추가할 수 없습니다. 자세한 내용은 <a href="%s">FressRSS 로그</a>를 참고하세요.',
+ 'invalid_url' => 'URL (<em>%s</em>)이 유효하지 않습니다',
+ 'marked_read' => '피드가 읽음으로 표시되었습니다',
+ 'n_actualized' => '%d 개의 피드에서 새 글을 가져왔습니다',
+ 'n_entries_deleted' => '%d 개의 글을 삭제했습니다',
+ 'no_refresh' => '새 글을 가져올 피드가 없습니다…',
+ 'not_added' => '<em>%s</em> 피드를 추가할 수 없습니다',
+ 'over_max' => '피드 개수 제한에 다다랐습니다 (%d)',
+ 'updated' => '피드가 변경되었습니다',
+ ),
+ 'purge_completed' => '삭제 완료 (%d 개의 글을 삭제했습니다)',
+ ),
+ 'update' => array(
+ 'can_apply' => 'FreshRSS가 <strong>%s</strong> 버전으로 업데이트됩니다.',
+ 'error' => '업데이트 과정에서 문제가 발생했습니다: %s',
+ 'file_is_nok' => '<strong>%s</strong> 버전을 사용할 수 있지만, <em>%s</em> 디렉토리의 권한을 확인하세요. HTTP 서버가 쓰기 권한을 가지고 있어야 합니다',
+ 'finished' => '업데이트를 완료했습니다!',
+ 'none' => '적용할 업데이트가 없습니다',
+ 'server_not_found' => '업데이트 서버를 찾을 수 없습니다. [%s]',
+ ),
+ 'user' => array(
+ 'created' => array(
+ '_' => '%s 사용자가 생성되었습니다',
+ 'error' => '%s 사용자를 생성할 수 없습니다',
+ ),
+ 'deleted' => array(
+ '_' => '%s 사용자를 삭제했습니다',
+ 'error' => '%s 사용자를 삭제할 수 없습니다',
+ ),
+ ),
+ 'profile' => array(
+ 'error' => '프로필을 변경할 수 없습니다',
+ 'updated' => '프로필을 변경했습니다',
+ ),
+);
diff --git a/app/i18n/kr/gen.php b/app/i18n/kr/gen.php
new file mode 100644
index 000000000..35d5e8143
--- /dev/null
+++ b/app/i18n/kr/gen.php
@@ -0,0 +1,189 @@
+<?php
+
+return array(
+ 'action' => array(
+ 'actualize' => '새 글 가져오기',
+ 'back_to_rss_feeds' => '← RSS 피드로 돌아가기',
+ 'cancel' => '취소',
+ 'create' => '생성',
+ 'disable' => '비활성화',
+ 'empty' => '비우기',
+ 'enable' => '활성화',
+ 'export' => '내보내기',
+ 'filter' => '해당하는 글 보기',
+ 'import' => '불러오기',
+ 'manage' => '관리',
+ 'mark_read' => '읽음으로 표시',
+ 'mark_favorite' => '즐겨찾기에 등록',
+ 'remove' => '삭제',
+ 'see_website' => '웹사이트 열기',
+ 'submit' => '설정 저장',
+ 'truncate' => '모든 글 삭제',
+ ),
+ 'auth' => array(
+ '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(
+ 'Apr' => '\\A\\p\\r\\i\\l',
+ 'Aug' => '\\A\\u\\g\\u\\s\\t',
+ 'Dec' => '\\D\\e\\c\\e\\m\\b\\e\\r',
+ 'Feb' => '\\F\\e\\b\\r\\u\\a\\r\\y',
+ 'Jan' => '\\J\\a\\n\\u\\a\\r\\y',
+ 'Jul' => '\\J\\u\\l\\y',
+ 'Jun' => '\\J\\u\\n\\e',
+ 'Mar' => '\\M\\a\\r\\c\\h',
+ 'May' => '\\M\\a\\y',
+ 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r',
+ 'Oct' => '\\O\\c\\t\\o\\b\\e\\r',
+ 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',
+ 'apr' => '4월',
+ 'april' => '4월',
+ 'aug' => '8월',
+ 'august' => '8월',
+ 'before_yesterday' => '어제 이전',
+ 'dec' => '12월',
+ 'december' => '12월',
+ 'feb' => '2월',
+ 'february' => '2월',
+ 'format_date' => 'Y년 m월 d일',
+ 'format_date_hour' => 'Y년 m월 d일 H시 i분',
+ 'fri' => '금',
+ 'jan' => '1월',
+ 'january' => '1월',
+ 'jul' => '7월',
+ 'july' => '7월',
+ 'jun' => '6월',
+ 'june' => '6월',
+ 'last_3_month' => '최근 3 개월',
+ 'last_6_month' => '최근 6 개월',
+ 'last_month' => '최근 한 달',
+ 'last_week' => '최근 한 주',
+ 'last_year' => '최근 일 년',
+ 'mar' => '3월',
+ 'march' => '3월',
+ 'may_' => '5월',
+ 'may' => '5월',
+ 'mon' => '월',
+ 'month' => '개월',
+ 'nov' => '11월',
+ 'november' => '11월',
+ 'oct' => '10월',
+ 'october' => '10월',
+ 'sat' => '토',
+ 'sep' => '9월',
+ 'september' => '9월',
+ 'sun' => '일',
+ 'thu' => '목',
+ 'today' => '오늘',
+ 'tue' => '화',
+ 'wed' => '수',
+ 'yesterday' => '어제',
+ ),
+ 'freshrss' => array(
+ '_' => 'FreshRSS',
+ 'about' => '정보',
+ ),
+ 'js' => array(
+ 'category_empty' => '빈 카테고리',
+ 'confirm_action' => '정말 이 작업을 수행하시겠습니까? 이 작업은 되돌릴 수 없습니다!',
+ 'confirm_action_feed_cat' => '정말 이 작업을 수행하시겠습니까? 관련된 즐겨찾기와 사용자 쿼리가 삭제됩니다. 이 작업은 되돌릴 수 없습니다!!',
+ 'feedback' => array(
+ 'body_new_articles' => '%%d 개의 새 글이 FreshRSS에 있습니다.',
+ 'request_failed' => '요청한 작업을 수행할 수 없습니다. 인터넷 연결에 문제가 발생한 것 같습니다.',
+ 'title_new_articles' => 'FreshRSS: 새 글이 있습니다!',
+ ),
+ 'new_article' => '새 글이 있습니다. 여기를 클릭하면 페이지를 다시 불러옵니다.',
+ 'should_be_activated' => '자바스크립트를 사용하도록 설정해야합니다',
+ ),
+ 'lang' => array(
+ 'cz' => 'Čeština',
+ 'de' => 'Deutsch',
+ 'en' => 'English',
+ 'es' => 'Español',
+ 'fr' => 'Français',
+ 'it' => 'Italiano',
+ 'kr' => '한국어',
+ 'nl' => 'Nederlands',
+ 'pt-br' => 'Português (Brasil)',
+ 'ru' => 'Русский',
+ 'tr' => 'Türkçe',
+ 'zh-cn' => '简体中文',
+ ),
+ 'menu' => array(
+ 'about' => '정보',
+ 'admin' => '관리',
+ 'archiving' => '보관',
+ 'authentication' => '인증',
+ 'check_install' => '설치 요구사항 확인',
+ 'configuration' => '설정',
+ 'display' => '표시',
+ 'extensions' => '확장 기능',
+ 'logs' => '로그',
+ 'queries' => '사용자 쿼리',
+ 'reading' => '읽기',
+ 'search' => '단어 또는 #태그 검색',
+ 'sharing' => '공유',
+ 'shortcuts' => '단축키',
+ 'stats' => '통계',
+ 'system' => '시스템 설정',
+ 'update' => '업데이트',
+ 'user_management' => '사용자 관리',
+ 'user_profile' => '프로필',
+ ),
+ 'pagination' => array(
+ 'first' => 'First',
+ 'last' => 'Last',
+ 'load_more' => '글 더 불러오기',
+ 'mark_all_read' => '모두 읽음으로 표시',
+ 'next' => 'Next',
+ 'nothing_to_load' => '더 이상 글이 없습니다',
+ 'previous' => 'Previous',
+ ),
+ 'share' => array(
+ 'blogotext' => 'Blogotext',
+ 'diaspora' => 'Diaspora*',
+ 'email' => '메일',
+ 'facebook' => 'Facebook',
+ 'g+' => 'Google+',
+ 'movim' => 'Movim',
+ 'print' => '인쇄',
+ 'shaarli' => 'Shaarli',
+ 'twitter' => 'Twitter',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
+ 'jdh' => 'Journal du hacker',
+ 'Known' => 'Known based sites',
+ 'gnusocial' => 'GNU social',
+ ),
+ 'short' => array(
+ 'attention' => '경고!',
+ 'blank_to_disable' => '빈 칸으로 두면 비활성화',
+ 'by_author' => 'By <em>%s</em>',
+ 'by_default' => '기본값',
+ 'damn' => '이런!',
+ 'default_category' => '분류 없음',
+ 'no' => '아니요',
+ 'not_applicable' => '사용할 수 없음',
+ 'ok' => 'Ok!',
+ 'or' => '또는',
+ 'yes' => '네',
+ ),
+);
diff --git a/app/i18n/kr/index.php b/app/i18n/kr/index.php
new file mode 100644
index 000000000..cc03f91c2
--- /dev/null
+++ b/app/i18n/kr/index.php
@@ -0,0 +1,61 @@
+<?php
+
+return array(
+ 'about' => array(
+ '_' => '정보',
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
+ 'bugs_reports' => '버그 제보하기',
+ 'credits' => '크레딧',
+ 'credits_content' => 'FreshRSS는 <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> 프레임워크를 사용하진 않지만, 일부 디자인 요소를 가져왔습니다. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">아이콘들</a>은 <a href="https://www.gnome.org/">GNOME 프로젝트</a>에서 가져왔습니다. <em>Open Sans</em> 글꼴은 <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a>가 제작하였습니다. FreshRSS는 PHP 프레임워크인 <a href="https://github.com/marienfressinaud/MINZ">Minz</a>에 기반하고 있습니다.',
+ 'freshrss_description' => 'FreshRSS는 <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> 또는 <a href="http://projet.idleman.fr/leed/">Leed</a>와 같은 셀프 호스팅 기반의 RSS 피드 수집기입니다. FreshRSS는 강력하고 다양한 설정을 할 수 있으면서 도 가볍고 사용하기 쉽습니다.',
+ 'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">Github 저장소에 제보</a>',
+ 'license' => '라이센스',
+ 'project_website' => '프로젝트 웹사이트',
+ 'title' => '정보',
+ 'version' => '버전',
+ 'website' => '웹사이트',
+ ),
+ 'feed' => array(
+ 'add' => '피드를 추가하세요.',
+ 'empty' => '글이 없습니다.',
+ 'rss_of' => '%s의 피드',
+ 'title' => 'RSS 피드',
+ 'title_global' => '전체 모드',
+ 'title_fav' => '즐겨찾기',
+ ),
+ 'log' => array(
+ '_' => '로그',
+ 'clear' => '로그 모두 지우기',
+ 'empty' => '로그 파일이 비어있습니다',
+ 'title' => '로그',
+ ),
+ 'menu' => array(
+ 'about' => 'FreshRSS 정보',
+ 'add_query' => '쿼리 만들기',
+ 'before_one_day' => '하루 이전',
+ 'before_one_week' => '한 주 이전',
+ 'favorites' => '즐겨찾기 (%s)',
+ 'global_view' => '전체 모드',
+ 'main_stream' => '메인 스트림',
+ 'mark_all_read' => '모두 읽음으로 표시',
+ 'mark_cat_read' => '카테고리를 읽음으로 표시',
+ 'mark_feed_read' => '피드를 읽음으로 표시',
+ 'newer_first' => '최근 글 먼저',
+ 'non-starred' => '즐겨찾기를 제외하고 표시',
+ 'normal_view' => '일반 모드',
+ 'older_first' => '오래된 글 먼저',
+ 'queries' => '사용자 쿼리',
+ 'read' => '읽은 글만 표시',
+ 'reader_view' => '읽기 모드',
+ 'rss_view' => 'RSS 피드',
+ 'search_short' => '검색',
+ 'starred' => '즐겨찾기만 표시',
+ 'stats' => '통계',
+ 'subscription' => '구독 관리',
+ 'unread' => '읽지 않은 글만 표시',
+ ),
+ 'share' => '공유',
+ 'tag' => array(
+ 'related' => '관련 태그',
+ ),
+);
diff --git a/app/i18n/kr/install.php b/app/i18n/kr/install.php
new file mode 100644
index 000000000..2eea71ff9
--- /dev/null
+++ b/app/i18n/kr/install.php
@@ -0,0 +1,119 @@
+<?php
+
+return array(
+ 'action' => array(
+ 'finish' => '설치 완료',
+ 'fix_errors_before' => '다음 단계로 가기 전에 문제를 해결하세요.',
+ 'keep_install' => '이전 설정 유지',
+ 'next_step' => '다음 단계',
+ 'reinstall' => 'FreshRSS 다시 설치',
+ ),
+ 'auth' => array(
+ 'form' => '웹폼 (전통적인 방식, 자바스크립트 필요)',
+ 'http' => 'HTTP (HTTPS를 사용하는 고급 사용자용)',
+ 'none' => '사용하지 않음 (위험)',
+ 'password_form' => '암호<br /><small>(웹폼 로그인 방식 사용시)</small>',
+ 'password_format' => '7 글자 이상이어야 합니다',
+ 'type' => '인증 방식',
+ ),
+ 'bdd' => array(
+ '_' => '데이터베이스',
+ 'conf' => array(
+ '_' => '데이터베이스 설정',
+ 'ko' => '데이터베이스 정보를 확인하세요.',
+ 'ok' => '데이터베이스 설정이 저장되었습니다.',
+ ),
+ 'host' => '데이터베이스 서버',
+ 'prefix' => '테이블 접두어',
+ 'password' => '데이터베이스 암호',
+ 'type' => '데이터베이스 종류',
+ 'username' => '데이터베이스 사용자 이름',
+ ),
+ 'check' => array(
+ '_' => '설치 요구사항 확인',
+ 'already_installed' => 'FreshRSS가 이미 설치되어 있는 것을 감지했습니다!',
+ 'cache' => array(
+ 'nok' => '<em>./data/cache</em> 디렉토리의 권한을 확인하세요. HTTP 서버가 쓰기 권한을 가지고 있어야 합니다',
+ 'ok' => 'cache 디렉토리의 권한이 올바르게 설정되었습니다.',
+ ),
+ 'ctype' => array(
+ 'nok' => '문자열 타입 검사에 필요한 라이브러리를 찾을 수 없습니다 (php-ctype).',
+ 'ok' => '문자열 타입 검사에 필요한 라이브러리가 설치되어 있습니다 (ctype).',
+ ),
+ 'curl' => array(
+ 'nok' => 'cURL 라이브러리를 찾을 수 없습니다 (php-curl 패키지).',
+ 'ok' => 'cURL 라이브러리가 설치되어 있습니다.',
+ ),
+ 'data' => array(
+ 'nok' => '<em>./data</em> 디렉토리의 권한을 확인하세요. HTTP 서버가 쓰기 권한을 가지고 있어야 합니다',
+ 'ok' => 'data 디렉토리의 권한이 올바르게 설정되었습니다.',
+ ),
+ 'dom' => array(
+ 'nok' => 'DOM을 다룰 수 있는 라이브러리를 찾을 수 없습니다 (php-xml 패키지).',
+ 'ok' => 'DOM을 다룰 수 있는 라이브러리가 설치되어 있습니다.',
+ ),
+ 'favicons' => array(
+ 'nok' => '<em>./data/favicons</em> 디렉토리의 권한을 확인하세요. HTTP 서버가 쓰기 권한을 가지고 있어야 합니다',
+ 'ok' => 'favicons 디렉토리의 권한이 올바르게 설정되어 있습니다.',
+ ),
+ 'fileinfo' => array(
+ 'nok' => 'fileinfo 라이브러리를 찾을 수 없습니다 (fileinfo 패키지).',
+ 'ok' => 'fileinfo 라이브러리가 설치되어 있습니다.',
+ ),
+ 'http_referer' => array(
+ 'nok' => 'HTTP REFERER가 변경되지 않았는지 확인해주세요.',
+ 'ok' => 'HTTP REFERER가 서버와 일치하는 것을 확인했습니다.',
+ ),
+ 'json' => array(
+ 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php5-json 패키지).',
+ 'ok' => 'JSON 확장 기능이 설치되어 있습니다.',
+ ),
+ 'minz' => array(
+ 'nok' => 'Minz 프레임워크를 찾을 수 없습니다.',
+ 'ok' => 'Minz 프레임워크가 설치되어 있습니다.',
+ ),
+ 'pcre' => array(
+ 'nok' => '정규표현식을 위한 라이브러리를 찾을 수 없습니다 (php-pcre).',
+ 'ok' => '정규표현식을 위한 라이브러리가 설치되어 있습니다 (PCRE).',
+ ),
+ 'pdo' => array(
+ 'nok' => '지원가능한 드라이버나 PDO를 찾을 수 없습니다 (pdo_mysql, pdo_sqlite, pdo_pgsql).',
+ 'ok' => '최소 하나의 지원가능한 드라이버와 PDO가 설치되어 있습니다 (pdo_mysql, pdo_sqlite, pdo_pgsql).',
+ ),
+ 'php' => array(
+ 'nok' => 'PHP 버전은 %s 이지만, FreshRSS에는 최소 %s의 버전이 필요합니다.',
+ 'ok' => 'PHP 버전은 %s 이고, FreshRSS와 호환가능 합니다.',
+ ),
+ 'users' => array(
+ 'nok' => '<em>./data/users</em> 디렉토리의 권한을 확인하세요. HTTP 서버가 쓰기 권한을 가지고 있어야 합니다',
+ 'ok' => 'users 디렉토리의 권한이 올바르게 설정되어 있습니다.',
+ ),
+ 'xml' => array(
+ 'nok' => 'XML 해석을 위한 라이브러리르 찾을 수 없습니다.',
+ 'ok' => 'XML 해석을 위한 라이브러리가 설치되어 있습니다.',
+ ),
+ ),
+ 'conf' => array(
+ '_' => '일반 설정',
+ 'ok' => '일반 설정이 저장되었습니다.',
+ ),
+ 'congratulations' => '축하합니다!',
+ 'default_user' => '기본 사용자 이름<small>(알파벳과 숫자를 포함할 수 있고 최대 16 글자)</small>',
+ 'delete_articles_after' => '다음 기간보다 오래된 글 삭제',
+ 'fix_errors_before' => '다음 단계로 가기 전에 문제를 해결하세요.',
+ 'javascript_is_better' => 'FreshRSS는 자바스크립트를 사용할 때 더욱 쾌적하고 강력합니다',
+ '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' => '마침',
+);
diff --git a/app/i18n/kr/sub.php b/app/i18n/kr/sub.php
new file mode 100644
index 000000000..8af29422d
--- /dev/null
+++ b/app/i18n/kr/sub.php
@@ -0,0 +1,73 @@
+<?php
+
+return array(
+ 'bookmarklet' => array(
+ 'documentation' => '이 버튼을 즐겨찾기 막대로 끌어다 놓거나 마우스 오른쪽 클릭으로 나타나는 메뉴에서 "이 링크를 즐겨찾기에 추가"를 선택하세요. 그리고 피드를 구독하길 원하는 페이지에서 "구독하기" 버튼을 클릭하세요.',
+ 'label' => '구독하기',
+ 'title' => '북마클릿',
+ ),
+ 'category' => array(
+ '_' => '카테고리',
+ 'add' => '카테고리 추가',
+ 'empty' => '빈 카테고리',
+ 'new' => '새 카테고리',
+ ),
+ 'feed' => array(
+ 'add' => 'RSS 피드 추가',
+ 'advanced' => '고급 설정',
+ 'archiving' => '보관',
+ 'auth' => array(
+ 'configuration' => '로그인',
+ 'help' => 'HTTP 접속이 제한되는 RSS 피드에 접근합니다',
+ 'http' => 'HTTP 인증',
+ 'password' => 'HTTP 암호',
+ 'username' => 'HTTP 사용자 이름',
+ ),
+ 'css_help' => '글의 일부가 포함된 RSS 피드를 가져옵니다 (주의, 시간이 좀 더 걸립니다!)',
+ 'css_path' => '웹사이트 상의 글 본문에 해당하는 CSS 경로',
+ 'description' => '설명',
+ 'empty' => '이 피드는 비어있습니다. 피드가 계속 운영되고 있는지 확인하세요.',
+ 'error' => '이 피드에 문제가 발생했습니다. 이 피드에 접근 권한이 있는지 확인하세요.',
+ 'in_main_stream' => '메인 스트림에 표시하기',
+ 'informations' => '정보',
+ 'keep_history' => '최소 유지 글 개수',
+ 'moved_category_deleted' => '카테고리를 삭제하면, 해당 카테고리 아래에 있던 피드들은 자동적으로 <em>%s</em> 아래로 분류됩니다.',
+ 'no_selected' => '선택된 피드가 없습니다.',
+ 'number_entries' => '%d 개의 글',
+ 'stats' => '통계',
+ 'think_to_add' => '피드를 추가할 수 있습니다.',
+ 'title' => '제목',
+ 'title_add' => 'RSS 피드 추가',
+ 'ttl' => '다음 시간이 지나기 전에 새로고침 금지',
+ 'url' => '피드 URL',
+ 'validator' => '피드 유효성 검사',
+ 'website' => '웹사이트 URL',
+ 'pubsubhubbub' => 'PubSubHubbub을 사용한 즉시 알림',
+ ),
+ '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>의 설명을 따르세요.',
+ 'title' => 'Firefox 피드 리더',
+ ),
+ 'import_export' => array(
+ 'export' => '내보내기',
+ 'export_opml' => '피드 목록 내보내기 (OPML)',
+ 'export_starred' => '즐겨찾기 내보내기',
+ 'feed_list' => '%s 개의 글 목록',
+ 'file_to_import' => '불러올 파일<br />(OPML, JSON 또는 ZIP)',
+ 'file_to_import_no_zip' => '불러올 파일<br />(OPML 또는 JSON)',
+ 'import' => '불러오기',
+ 'starred_list' => '즐겨찾기에 등록된 글 목록',
+ 'title' => '불러오기 / 내보내기',
+ ),
+ 'menu' => array(
+ 'bookmark' => '구독하기 (FreshRSS 북마클릿)',
+ 'import_export' => '불러오기 / 내보내기',
+ 'subscription_management' => '구독 관리',
+ 'subscription_tools' => '구독 도구',
+ ),
+ 'title' => array(
+ '_' => '구독 관리',
+ 'feed_management' => 'RSS 피드 관리',
+ 'subscription_tools' => '구독 도구',
+ ),
+);
diff --git a/app/i18n/nl/conf.php b/app/i18n/nl/conf.php
index 77f6307ed..e4db5ec3d 100644
--- a/app/i18n/nl/conf.php
+++ b/app/i18n/nl/conf.php
@@ -104,7 +104,7 @@ return array(
'when' => 'Markeer artikel als gelezen…',
),
'show' => array(
- '_' => 'Artikelen om te tonen',
+ '_' => 'Artikelen om te tonen',
'adaptive' => 'Pas weergave aan',
'all_articles' => 'Bekijk alle artikelen',
'unread' => 'Bekijk alleen ongelezen',
diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php
index 07d444ec3..1617936ab 100644
--- a/app/i18n/nl/gen.php
+++ b/app/i18n/nl/gen.php
@@ -77,8 +77,9 @@ return array(
'last_month' => 'Vorige maand',
'last_week' => 'Vorige week',
'last_year' => 'Vorig jaar',
- 'mar' => 'mar',
- 'march' => 'Mar',
+ 'mar' => 'mrt',
+ 'march' => 'Mrt',
+ 'may_' => 'Mei',
'may' => 'Mei',
'mon' => 'Ma',
'month' => 'maanden',
@@ -116,11 +117,15 @@ return array(
'cz' => 'Čeština',
'de' => 'Deutsch',
'en' => 'English',
+ 'es' => 'Español',
'fr' => 'Français',
'it' => 'Italiano',
+ 'kr' => '한국어',
'nl' => 'Nederlands',
+ 'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
'tr' => 'Türkçe',
+ 'zh-cn' => '简体中文',
),
'menu' => array(
'about' => 'Over',
diff --git a/app/i18n/nl/sub.php b/app/i18n/nl/sub.php
index e0cebbb4e..bfa0911b7 100644
--- a/app/i18n/nl/sub.php
+++ b/app/i18n/nl/sub.php
@@ -1,6 +1,11 @@
<?php
/* Dutch translation by Wanabo. http://www.nieuwskop.be */
return array(
+ '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
+ 'title' => 'Bookmarklet',// TODO
+ ),
'category' => array(
'_' => 'Categorie',
'add' => 'Voeg categorie toe',
@@ -39,6 +44,10 @@ return array(
'validator' => 'Controleer de geldigheid van de feed',
'website' => 'Website URL',
),
+ '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
+ 'title' => 'Firefox feed reader',// TODO
+ ),
'import_export' => array(
'export' => 'Exporteer',
'export_opml' => 'Exporteer lijst van feeds (OPML)',
@@ -54,9 +63,11 @@ return array(
'bookmark' => 'Abonneer (FreshRSS bladwijzer)',
'import_export' => 'Importeer / exporteer',
'subscription_management' => 'Abonnementenbeheer',
+ 'subscription_tools' => 'Subscription tools',// TODO
),
'title' => array(
'_' => 'Abonnementenbeheer',
'feed_management' => 'RSS-feedbeheer',
+ 'subscription_tools' => 'Subscription tools',// TODO
),
);
diff --git a/app/i18n/pt-br/admin.php b/app/i18n/pt-br/admin.php
new file mode 100644
index 000000000..1076534b2
--- /dev/null
+++ b/app/i18n/pt-br/admin.php
@@ -0,0 +1,181 @@
+<?php
+
+return array(
+ 'auth' => array(
+ 'allow_anonymous' => 'Permitir a leitura anónima dos artidos pelo usuário padrão (%s)',
+ 'allow_anonymous_refresh' => 'Permitir atualização anónima dos artigos',
+ 'api_enabled' => 'Permitir acesso à <abbr>API</abbr> <small>(Necessáiro para aplicativos móveis)</small>',
+ 'form' => 'Formulário Web(traditional, Necessita de JavaScript)',
+ 'http' => 'HTTP (Para usuários avançados com HTTPS)',
+ 'none' => 'Nenhum (Perigoso)',
+ 'title' => 'Autenticação',
+ 'title_reset' => 'Reset autenticação',
+ 'token' => 'Token de autenticação ',
+ 'token_help' => 'Permitir acesso a saída RSS para o usuário padrão sem autenticação',
+ 'type' => 'Método de autenticação',
+ 'unsafe_autologin' => 'Permitir login automática insegura usando o seguinte formato: ',
+ ),
+ 'check_install' => array(
+ '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.',
+ 'ok' => 'Permissões no diretório cache estão corretos.',
+ ),
+ 'categories' => array(
+ 'nok' => 'Tabela Category está configurada incorretamente.',
+ 'ok' => 'Tabela Category está ok.',
+ ),
+ 'connection' => array(
+ 'nok' => 'Conexão ao banco de dados não pode ser estabelecida.',
+ 'ok' => 'Conexão ao banco de dados está ok.',
+ ),
+ 'ctype' => array(
+ 'nok' => 'Não foi possível encontrar uma biblioteca necessária para verificação do tipo de caractere (php-ctype).',
+ 'ok' => 'Você tem a biblioteca necessária para verificação do tipo de caractere (ctype).',
+ ),
+ 'curl' => array(
+ 'nok' => 'Não foi possível encontrar a biblioteca cURL (php-curl).',
+ 'ok' => 'Você tem a biblioteca cURL.',
+ ),
+ 'data' => array(
+ 'nok' => 'Verifique as permissões no diretório <em>./data</em>. O servidor HTTP deve ter direitos para escrever dentro desta pasta.',
+ 'ok' => 'Permissões no diretório data estão corretos.',
+ ),
+ 'database' => 'Instalação do banco de dados',
+ 'dom' => array(
+ 'nok' => 'Não foi possível encontrar uma biblioteca necessária para navegar pelo DOM (php-xml).',
+ 'ok' => 'Você tem a biblioteca necessária para navegar pelo DOM.',
+ ),
+ 'entries' => array(
+ 'nok' => 'Tabela Entry está configurada incorretamente.',
+ 'ok' => 'Tabela Entry está ok.',
+ ),
+ 'favicons' => array(
+ 'nok' => 'Verifique as permissões no diretório <em>./data/favicons</em>. O servidor HTTP deve ter direitos para escrever dentro desta pasta.',
+ 'ok' => 'Permissões no diretório favicons estão corretos.',
+ ),
+ 'feeds' => array(
+ 'nok' => 'Tabela Feed está configurada incorretamente.',
+ 'ok' => 'Tabela Feed está ok.',
+ ),
+ 'fileinfo' => array(
+ 'nok' => 'Não foi possível encontrar a biblioteca fileinfo do PHP (fileinfo).',
+ 'ok' => 'Você tem a biblioteca fileinfo.',
+ ),
+ 'files' => 'Instalação de arquivos',
+ 'json' => array(
+ 'nok' => 'Não foi possível encontrar JSON (php5-json).',
+ 'ok' => 'Você tem a extensão JSON.',
+ ),
+ 'minz' => array(
+ 'nok' => 'Não foi possível encontrar o framework Minz.',
+ 'ok' => 'Você tem o framework Minz.',
+ ),
+ 'pcre' => array(
+ 'nok' => 'Não foi possível encontrar uma biblioteca necessário para expressões regulares (php-pcre).',
+ 'ok' => 'Você tem a biblioteca necessária para expressões regulares (php-pcre).',
+ ),
+ 'pdo' => array(
+ 'nok' => 'Não foi encontrado o PDO ou um dos drivers suportados (pdo_mysql, pdo_sqlite, pdo_pgsql).',
+ '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.',
+ ),
+ 'tables' => array(
+ 'nok' => 'Há uma ou mais tabelas inexistentes no banco de dados.',
+ 'ok' => 'As tabelas apropriadas existem no banco de dados.',
+ ),
+ 'title' => 'Verificação de instalação',
+ 'tokens' => array(
+ 'nok' => 'Verifique as permissões no diretório <em>./data/tokens</em>. O servidor HTTP deve ter direitos para escrever dentro desta pasta.',
+ 'ok' => 'Permissões no diretório tokens estão corretos.',
+ ),
+ 'users' => array(
+ 'nok' => 'Verifiquei as permissões no diretório <em>./data/users</em>. O servidor HTTP deve ter direitos para escrever dentro desta pasta.',
+ 'ok' => 'Permissões no diretório users estão corretos.',
+ ),
+ 'zip' => array(
+ 'nok' => 'Não foi possível localizar a extensão ZIP (php-zip).',
+ 'ok' => 'Você tem a extensão ZIP.',
+ ),
+ ),
+ 'extensions' => array(
+ 'disabled' => 'Desabilitado',
+ 'empty_list' => 'Não há extensões instaladas',
+ 'enabled' => 'Habilitada',
+ '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)',
+ ),
+ 'title' => 'Extensões',
+ 'user' => 'Extensões do usuário',
+ ),
+ 'stats' => array(
+ '_' => 'Estatísticas',
+ 'all_feeds' => 'Todos os feeds',
+ 'category' => 'Categoria',
+ 'entry_count' => 'Contagem de entrada',
+ 'entry_per_category' => 'Entradas por categoria',
+ 'entry_per_day' => 'Entradas por dia (últimos 30 dias)',
+ 'entry_per_day_of_week' => 'Por dia da semana(média: %.2f mensagens)',
+ '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_per_category' => 'Feeds por categoria',
+ 'idle' => 'Feeds inativos',
+ 'main' => 'Estatísticas principais',
+ 'main_stream' => 'Stream principal',
+ 'menu' => array(
+ 'idle' => 'Feeds inativos',
+ 'main' => 'Estatísticas principais',
+ 'repartition' => 'Repartição de artigos',
+ ),
+ 'no_idle' => 'Não há nenhum feed inativo!',
+ 'number_entries' => '%d artigos',
+ 'percent_of_total' => '%% do total',
+ 'repartition' => 'Repartição de artigos',
+ 'status_favorites' => 'Favoritos',
+ 'status_read' => 'Lido',
+ 'status_total' => 'Total',
+ 'status_unread' => 'Não lidos',
+ 'title' => 'Estatísticas',
+ 'top_feed' => 'Top10 feeds',
+ ),
+ 'system' => array(
+ '_' => 'Configuração do sistema',
+ 'auto-update-url' => 'URL do servidor para atualização automática',
+ 'instance-name' => 'Nome da instância',
+ 'max-categories' => 'Limite de categorias por usuário',
+ 'max-feeds' => 'Limite de Feeds por usuário',
+ 'registration' => array(
+ 'help' => '0 significa que não há limite para a conta',
+ 'number' => 'Máximo número de contas',
+ ),
+ ),
+ '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',
+ ),
+ 'user' => array(
+ 'articles_and_size' => '%s artigos (%s)',
+ 'create' => 'Criar novo usuário',
+ 'language' => 'Idioma',
+ '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',
+ 'title' => 'Gerenciar usuários',
+ 'user_list' => 'Lista de usuários',
+ 'username' => 'Usuário',
+ 'users' => 'Usuários',
+ ),
+);
diff --git a/app/i18n/pt-br/conf.php b/app/i18n/pt-br/conf.php
new file mode 100644
index 000000000..4eaf599db
--- /dev/null
+++ b/app/i18n/pt-br/conf.php
@@ -0,0 +1,174 @@
+<?php
+
+return array(
+ 'archiving' => array(
+ '_' => 'Arquivar',
+ 'advanced' => 'Avançado',
+ 'delete_after' => 'Remover artigos depois',
+ 'help' => 'Mais opções estão disponíveis nas configurações individuais do feed',
+ 'keep_history_by_feed' => 'Número mínimo de artigos para deixar no feed',
+ 'optimize' => 'Otimizar banco de dados',
+ 'optimize_help' => 'Faça ocasionalmente para reduzir o tamanho do banco de dados',
+ 'purge_now' => 'Purge agora',
+ 'title' => 'Arquivar',
+ 'ttl' => 'Não atualize automaticamente mais frequente que',
+ ),
+ 'display' => array(
+ '_' => 'Exibição',
+ 'icon' => array(
+ 'bottom_line' => 'Linha inferior',
+ 'entry' => 'Ícones de artigos',
+ 'publication_date' => 'Data da publicação',
+ 'related_tags' => 'Tags relacionadas',
+ 'sharing' => 'Compartilhar',
+ 'top_line' => 'Linha superior',
+ ),
+ 'language' => 'Ídioma',
+ 'notif_html5' => array(
+ 'seconds' => 'segundos (0 significa sem timeout)',
+ 'timeout' => 'Notificação em HTML5 de timeout',
+ ),
+ 'theme' => 'Tema',
+ 'title' => 'Exibição',
+ 'width' => array(
+ 'content' => 'Largura do conteúdo',
+ 'large' => 'Largo',
+ 'medium' => 'Médio',
+ 'no_limit' => 'Sem lmite',
+ 'thin' => 'Fino',
+ ),
+ ),
+ 'query' => array(
+ '_' => 'Queries do usuário',
+ 'deprecated' => 'Esta não é mais válida. A categoria ou feed relacionado foi deletado.',
+ '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',
+ 'order_asc' => 'Exibir artigos mais antigos primeiro',
+ 'order_desc' => 'Exibir artigos mais novos primeiro',
+ 'search' => 'Busca por "%s"',
+ 'state_0' => 'Exibir todos os artigos',
+ 'state_1' => 'Exibir artigos lidos',
+ 'state_2' => 'Exibir artigos não lidos',
+ 'state_3' => 'Exibir todos os artigos',
+ 'state_4' => 'Exibir artigos favoritos',
+ 'state_5' => 'Exibir artigos favoritos lidos',
+ 'state_6' => 'Exibir artigos favoritos não lidos',
+ 'state_7' => 'Exibir artigos favoritos',
+ 'state_8' => 'Exibir artigos que não são favoritos',
+ 'state_9' => 'Exibir artigos que não são favoritos lidos',
+ 'state_10' => 'Exibir artigos que não são favoritos não lidos',
+ 'state_11' => 'Exibir artigos que não são favoritos',
+ 'state_12' => 'Exibir todos os artigos',
+ 'state_13' => 'Exibir artigos lidos',
+ 'state_14' => 'Exibir artigos não lidos',
+ 'state_15' => 'Exibir todos os artigos',
+ 'title' => 'Queries de usuários',
+ ),
+ 'profile' => array(
+ '_' => 'Gerenciamento de perfil',
+ 'delete' => array(
+ '_' => 'Remover conta',
+ 'warn' => 'Sua conta e todos os dados relacionados serão removidos.',
+ ),
+ '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',
+ ),
+ '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',
+ 'auto_remove_article' => 'Esconder artigos depois de lidos',
+ 'mark_updated_article_unread' => 'Marcar artigos atualizados como não lidos',
+ 'confirm_enabled' => 'Exibir uma caixa de diálogo de confirmação quando acionar "marcar todos como lido"',
+ 'display_articles_unfolded' => 'Mostrar aritogs abertos por padrão',
+ 'display_categories_unfolded' => 'Mostrar artigos fechados por padrão',
+ 'hide_read_feeds' => 'Esconder categorias e feeds com nenhum artigo não lido (não funciona com a configuração "Mostrar todos os artigos”)',
+ 'img_with_lazyload' => 'Utilizar o modo "lazy load" para carregar as imagens',
+ 'sides_close_article' => 'Clicando fora da área do texto do artigo fecha o mesmo',
+ 'jump_next' => 'Vá para o próximo irmão não lido (feed ou categoria)',
+ 'number_divided_when_reader' => 'Dividido por 2 no modo de leitura .',
+ 'read' => array(
+ 'article_open_on_website' => 'quando o artigo é aberto no site original',
+ 'article_viewed' => 'Quando o artigo é visualizado',
+ 'scroll' => 'enquando scrolling',
+ 'upon_reception' => 'ao receber um artigo',
+ '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',
+ ),
+ 'sort' => array(
+ '_' => 'Ordem de visualização',
+ 'newer_first' => 'Novos primeiro',
+ 'older_first' => 'Antigos primeiro',
+ ),
+ 'sticky_post' => 'Coloque o artigo no topo quando aberto',
+ 'title' => 'Lendo',
+ 'view' => array(
+ 'default' => 'Visualização padrão',
+ 'global' => 'Visualização global',
+ 'normal' => 'Visualização normal',
+ 'reader' => 'Visualização de leitura',
+ ),
+ ),
+ 'sharing' => array(
+ '_' => 'Compartilhando',
+ 'blogotext' => 'Blogotext',
+ 'diaspora' => 'Diaspora*',
+ 'email' => 'Email',
+ 'facebook' => 'Facebook',
+ 'g+' => 'Google+',
+ 'more_information' => 'Mais informação',
+ 'print' => 'Imprimir',
+ 'shaarli' => 'Shaarli',
+ 'share_name' => 'Nome de visualização para compartilhar',
+ 'share_url' => 'URL utilizada para compartilhar',
+ 'title' => 'Compartilhando',
+ 'twitter' => 'Twitter',
+ 'wallabag' => 'wallabag',
+ ),
+ '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.',
+ 'close_dropdown' => 'Fechar menus',
+ 'collapse_article' => 'Fechar',
+ 'first_article' => 'Ir para o primeiro artigo',
+ 'focus_search' => 'Acessar a caixa de busca',
+ 'help' => 'Mostrar documentação',
+ 'javascript' => 'JavaScript deve ser habilitado para utilizar atalhos',
+ 'last_article' => 'Ir para o último artigo',
+ 'load_more' => 'Carregar mais artigos',
+ 'mark_read' => 'Marcar como lido',
+ 'mark_favorite' => 'Marcar como favorito',
+ '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.',
+ 'next_article' => 'Pule para o próximo artigo',
+ 'other_action' => 'Outras ações',
+ 'previous_article' => 'Pule para o artigo anterior',
+ 'see_on_website' => 'Visualize o site original',
+ 'shift_for_all_read' => '+ <code>shift</code> para marcar todos os artigos como lido',
+ '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.',
+ ),
+ 'user' => array(
+ 'articles_and_size' => '%s artigos (%s)',
+ 'current' => 'Usuário atual',
+ 'is_admin' => 'é administrador',
+ 'users' => 'Usuários',
+ ),
+);
diff --git a/app/i18n/pt-br/feedback.php b/app/i18n/pt-br/feedback.php
new file mode 100644
index 000000000..0959ad38e
--- /dev/null
+++ b/app/i18n/pt-br/feedback.php
@@ -0,0 +1,109 @@
+<?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',
+ ),
+ 'auth' => array(
+ 'form' => array(
+ 'not_set' => 'Um problema ocorreu durante o sistema de configuração para autenticação. Por favor tente mais tarde.',
+ 'set' => 'Formulário é agora seu sistema de autenticação padrão.',
+ ),
+ 'login' => array(
+ 'invalid' => 'Login está incorreto',
+ 'success' => 'Vocé está conectado',
+ ),
+ 'logout' => array(
+ 'success' => 'Você está desconectado',
+ ),
+ 'no_password_set' => 'A senha do administrador não foi definida. Este recurso não está disponível.',
+ ),
+ 'conf' => array(
+ 'error' => 'Um erro ocorreu durante o salvamento das configurações',
+ 'query_created' => 'Query "%s" foi criada.',
+ 'shortcuts_updated' => 'Atalhos foram criados',
+ 'updated' => 'Configuração foi atualizada',
+ ),
+ 'extensions' => array(
+ 'already_enabled' => '%s já está habilitado',
+ 'disable' => array(
+ 'ko' => '%s não pode ser desabilitado. <a href="%s">verifique os logs do FressRSS</a> para detalhes.',
+ 'ok' => '%s agora está desabilitado',
+ ),
+ 'enable' => array(
+ 'ko' => '%s não pode ser habilitado. <a href="%s">verifique os logs do FressRSS</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',
+ ),
+ '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.',
+ 'feeds_imported' => 'Seus feeds foram importados e serão atualizados agora',
+ 'feeds_imported_with_errors' => 'Seus feeds foram importados, mas alguns erros ocorreram',
+ 'file_cannot_be_uploaded' => 'Arquivo não pôde ser enviado',
+ 'no_zip_extension' => 'extensão ZIP não está presente em seu servidor.',
+ 'zip_error' => 'Um erro ocorreu durante a importação do arquivo ZIP.',
+ ),
+ 'sub' => array(
+ 'actualize' => 'Atualizando',
+ 'category' => array(
+ 'created' => 'Categoria %s foi criada.',
+ 'deleted' => 'Categoria foi deletada.',
+ '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!',
+ 'over_max' => 'Você atingiu seu limite de categorias (%d)',
+ 'updated' => 'Categoria foi atualizada.',
+ ),
+ 'feed' => array(
+ 'actualized' => '<em>%s</em> foi atualizado',
+ 'actualizeds' => 'RSS feeds foi atualizado',
+ 'added' => 'RSS feed <em>%s</em> foi adicionado',
+ '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 FressRSS logs</a> para detalhes.',
+ 'invalid_url' => 'URL <em>%s</em> é inválida',
+ 'marked_read' => 'Feeds foram marcados como lidos',
+ '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',
+ ),
+ 'purge_completed' => 'Limpeza completa (%d artigos deletados)',
+ ),
+ 'update' => array(
+ 'can_apply' => 'FreshRSS será atualizado para a <strong>versão %s</strong>.',
+ 'error' => 'O processo de atualização encontrou um erro: %s',
+ 'file_is_nok' => 'Nova <strong>versão %s</strong> disponível, mas verifique as permissões no diretório <em>%s</em>. Servidor HTTP deve ter direitos para escrever dentro',
+ 'finished' => 'Atualização completa!',
+ 'none' => 'Nenhuma atualização para aplicar',
+ 'server_not_found' => 'Servidor de atualização não pôde ser localizado. [%s]',
+ ),
+ 'user' => array(
+ 'created' => array(
+ '_' => 'Usuário %s foi criado',
+ 'error' => 'Usuário %s não pode ser criado',
+ ),
+ 'deleted' => array(
+ '_' => 'Usuário %s foi deletado',
+ 'error' => 'Usuário %s não pode ser deletado',
+ ),
+ ),
+ 'profile' => array(
+ 'error' => 'Your profile cannot be modified',
+ 'updated' => 'Your profile has been modified',
+ ),
+);
diff --git a/app/i18n/pt-br/gen.php b/app/i18n/pt-br/gen.php
new file mode 100644
index 000000000..1a74e1437
--- /dev/null
+++ b/app/i18n/pt-br/gen.php
@@ -0,0 +1,188 @@
+<?php
+
+return array(
+ 'action' => array(
+ 'actualize' => 'Atualizar',
+ 'back_to_rss_feeds' => '← Volte para o seu feeds RSS',
+ 'cancel' => 'Cancelar',
+ 'create' => 'Criar',
+ 'disable' => 'Desabilitar',
+ 'empty' => 'Vazio',
+ 'enable' => 'Habilitar',
+ 'export' => 'Exportar',
+ 'filter' => 'Filtrar',
+ 'import' => 'Importar',
+ 'manage' => 'Gerenciar',
+ 'mark_read' => 'Marcar como lido',
+ 'mark_favorite' => 'Marcar como favorito',
+ 'remove' => 'Remover',
+ 'see_website' => 'Ver o site',
+ 'submit' => 'Enviar',
+ 'truncate' => 'Deletar todos os artigos',
+ ),
+ 'auth' => array(
+ 'email' => 'Endereço de e-mail',
+ 'keep_logged_in' => 'Mantenha logado por <small>(%s days)</small>',
+ 'login' => 'Login',
+ 'logout' => 'Logout',
+ 'password' => array(
+ '_' => 'Senha',
+ 'format' => '<small>Ao menos 7 caracteres</small>',
+ ),
+ 'registration' => array(
+ '_' => 'Nova conta',
+ 'ask' => 'Criar novoa conta?',
+ 'title' => 'Criação de conta',
+ ),
+ 'reset' => 'Reset autenticação',
+ 'username' => array(
+ '_' => 'Usuário',
+ 'admin' => 'Usuário administrador',
+ 'format' => '<small>máximo 16 caracteres alphanumericos</small>',
+ ),
+ ),
+ 'date' => array(
+ 'Apr' => '\\A\\b\\r\\i\\l',
+ 'Aug' => '\\A\\g\\o\\s\\t\\o',
+ 'Dec' => '\\D\\e\\z\\e\\m\\b\\r\\o',
+ 'Feb' => '\\F\\e\\v\\e\\r\\e\\i\\r\\o',
+ 'Jan' => '\\J\\a\\n\\e\\i\\r\\o',
+ 'Jul' => '\\J\\u\\l\\h\\o',
+ 'Jun' => '\\J\\u\\n\\h\\o',
+ 'Mar' => '\\M\\a\\r\\ç\\o',
+ 'May' => '\\M\\a\\i\\o',
+ 'Nov' => '\\N\\o\\v\\e\\m\\b\\r\\o',
+ 'Oct' => '\\O\\u\\t\\u\\b\\r\\o',
+ 'Sep' => '\\S\\e\\t\\e\\m\\b\\r\\o',
+ 'apr' => 'abr',
+ 'april' => 'Abr',
+ 'aug' => 'ago',
+ 'august' => 'Ago',
+ 'before_yesterday' => 'Antes de ontem',
+ 'dec' => 'dez',
+ 'december' => 'Dez',
+ 'feb' => 'fev',
+ 'february' => 'Fev',
+ 'format_date' => 'j \\d\\e %s \\d\\e Y',
+ 'format_date_hour' => 'j \\d\\e %s \\d\\e Y\\, H\\:i',
+ 'fri' => 'Sex',
+ 'jan' => 'jan',
+ 'january' => 'Jan',
+ 'jul' => 'jul',
+ 'july' => 'Jul',
+ 'jun' => 'jun',
+ 'june' => 'Jun',
+ 'last_3_month' => 'Últimos três meses',
+ 'last_6_month' => 'Últimos seis meses',
+ 'last_month' => 'Últimos mês',
+ 'last_week' => 'Última semana',
+ 'last_year' => 'Último ano',
+ 'mar' => 'mar',
+ 'march' => 'Mar',
+ 'may' => 'Mai',
+ 'mon' => 'Seg',
+ 'month' => 'meses',
+ 'nov' => 'nov',
+ 'november' => 'Nov',
+ 'oct' => 'out',
+ 'october' => 'Out',
+ 'sat' => 'Sab',
+ 'sep' => 'set',
+ 'september' => 'Set',
+ 'sun' => 'Dom',
+ 'thu' => 'Qui',
+ 'today' => 'Hoje',
+ 'tue' => 'Ter',
+ 'wed' => 'Qua',
+ 'yesterday' => 'Ontem',
+ ),
+ 'freshrss' => array(
+ '_' => 'FreshRSS',
+ 'about' => 'Sobre FreshRSS',
+ ),
+ 'js' => array(
+ 'category_empty' => 'Categoria vazia',
+ 'confirm_action' => 'Você tem certeza que deseja efetuar esta ação? Ela não poderá ser cancelada!',
+ 'confirm_action_feed_cat' => 'Você tem certeza que deseja efetuar esta ação ? Você irá perder favoritos e queries de usuários. Não poderá ser cancelado!',
+ 'feedback' => array(
+ 'body_new_articles' => 'Há %%d novos artigos para ler no FreshRSS.',
+ 'request_failed' => 'Uma solicitação falhou, isto pode ter sido causado por problemas de conexão com a internet.',
+ 'title_new_articles' => 'FreshRSS: novos artigos!',
+ ),
+ 'new_article' => 'Há novos artigos disponíveis, clique para atualizar a página.',
+ 'should_be_activated' => 'JavaScript precisa estar ativo',
+ ),
+ 'lang' => array(
+ 'cz' => 'Čeština',
+ 'de' => 'Deutsch',
+ 'en' => 'English',
+ 'es' => 'Español',
+ 'fr' => 'Français',
+ 'it' => 'Italiano',
+ 'kr' => '한국어',
+ 'nl' => 'Nederlands',
+ 'pt-br' => 'Português (Brasil)',
+ 'ru' => 'Русский',
+ 'tr' => 'Türkçe',
+ 'zh-cn' => '简体中文'
+ ),
+ 'menu' => array(
+ 'about' => 'Sobre',
+ 'admin' => 'Administração',
+ 'archiving' => 'Arquivar',
+ 'authentication' => 'Autenticação',
+ 'check_install' => 'Verificação de instalação',
+ 'configuration' => 'Configuração',
+ 'display' => 'Visualização',
+ 'extensions' => 'Extensões',
+ 'logs' => 'Logs',
+ 'queries' => 'Queries de usuário',
+ 'reading' => 'Leitura',
+ 'search' => 'Procurar por palavras ou #tags',
+ 'sharing' => 'Compartilhamento',
+ 'shortcuts' => 'Atalhos',
+ 'stats' => 'Estatísticas',
+ 'system' => 'Configuração do sistema',
+ 'update' => 'Atualização',
+ 'user_management' => 'Gerenciamento de usuários',
+ 'user_profile' => 'Perfil',
+ ),
+ 'pagination' => array(
+ 'first' => 'Primeiro',
+ 'last' => 'Último',
+ 'load_more' => 'Carregar mais artigos',
+ 'mark_all_read' => 'Marcar todos como lidos',
+ 'next' => 'Próximo',
+ 'nothing_to_load' => 'Não há mais artigos',
+ 'previous' => 'Anterior',
+ ),
+ 'share' => array(
+ 'blogotext' => 'Blogotext',
+ 'diaspora' => 'Diaspora*',
+ 'email' => 'Email',
+ 'facebook' => 'Facebook',
+ 'g+' => 'Google+',
+ 'movim' => 'Movim',
+ 'print' => 'Imprimir',
+ 'shaarli' => 'Shaarli',
+ 'twitter' => 'Twitter',
+ 'wallabag' => 'wallabag v1',
+ 'wallabagv2' => 'wallabag v2',
+ 'jdh' => 'Journal du hacker',
+ 'Known' => 'Known based sites',
+ 'gnusocial' => 'GNU social',
+ ),
+ 'short' => array(
+ 'attention' => 'Atencão!',
+ 'blank_to_disable' => 'Deixe em branco para desativar',
+ 'by_author' => 'Por <em>%s</em>',
+ 'by_default' => 'Por padrão',
+ 'damn' => 'Buumm!',
+ 'default_category' => 'Sem categoria',
+ 'no' => 'Não',
+ 'not_applicable' => 'Não disponível',
+ 'ok' => 'Ok!',
+ 'or' => 'ou',
+ 'yes' => 'Sim',
+ ),
+);
diff --git a/app/i18n/pt-br/index.php b/app/i18n/pt-br/index.php
new file mode 100644
index 000000000..610f00840
--- /dev/null
+++ b/app/i18n/pt-br/index.php
@@ -0,0 +1,61 @@
+<?php
+
+return array(
+ 'about' => array(
+ '_' => 'Sobre',
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
+ '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.',
+ 'freshrss_description' => 'FreshRSS é um RSS feeds aggregator para um host próprio como o <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> ou <a href="http://projet.idleman.fr/leed/">Leed</a>. É leve e fácil de utilizar enquanto é uma ferramenta poderosa e configurável. ',
+ 'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">no Github</a>',
+ 'license' => 'licença',
+ 'project_website' => 'Site do projeto',
+ 'title' => 'Sobre',
+ 'version' => 'Versão',
+ 'website' => 'Site',
+ ),
+ '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',
+ ),
+ 'log' => array(
+ '_' => 'Logs',
+ 'clear' => 'Limpar logs',
+ 'empty' => 'Arquivo de log está vazio',
+ 'title' => 'Logs',
+ ),
+ 'menu' => array(
+ 'about' => 'Sobre o FreshRSS',
+ 'add_query' => 'Adicionar uma query',
+ 'before_one_day' => 'Antes de um dia',
+ 'before_one_week' => 'Antes de uma semana',
+ 'favorites' => 'Favoritos (%s)',
+ 'global_view' => 'Visualização global',
+ 'main_stream' => 'Stream principal',
+ 'mark_all_read' => 'Marcar todos como lidos',
+ 'mark_cat_read' => 'Marcar categoria como lida',
+ 'mark_feed_read' => 'Marcar feed com lido',
+ 'newer_first' => 'Novos primeiro',
+ 'non-starred' => 'Mostrar todos, exceto favoritos',
+ 'normal_view' => 'visualização normal',
+ 'older_first' => 'Antigos primeiro',
+ 'queries' => 'Queries do usuário',
+ 'read' => 'Mostrar apenas lidos',
+ 'reader_view' => 'Visualização de leitura',
+ 'rss_view' => 'RSS feed',
+ 'search_short' => 'Buscar',
+ 'starred' => 'Mostrar apenas os favoritos',
+ 'stats' => 'Estatísticas',
+ 'subscription' => 'Gerenciamento de inscrições',
+ 'unread' => 'Mostrar apenas os não lidos',
+ ),
+ 'share' => 'Compartilhar',
+ 'tag' => array(
+ 'related' => 'Tags relacionadas',
+ ),
+);
diff --git a/app/i18n/pt-br/install.php b/app/i18n/pt-br/install.php
new file mode 100644
index 000000000..3ca5fb854
--- /dev/null
+++ b/app/i18n/pt-br/install.php
@@ -0,0 +1,119 @@
+<?php
+
+return array(
+ 'action' => array(
+ 'finish' => 'Instalação completa',
+ 'fix_errors_before' => 'Por favor resolva os erros antes de ir para o próximo passo.',
+ 'keep_install' => 'Mantenha as configurações anteriores',
+ 'next_step' => 'Vá para o próximo passo',
+ 'reinstall' => 'Reinstale o FreshRSS',
+ ),
+ 'auth' => array(
+ 'form' => 'Formulário web(tradicional, necessita JavaScript)',
+ 'http' => 'HTTP (Para usuários avançados com HTTPS)',
+ 'none' => 'None (perigoso)',
+ 'password_form' => 'Senha<br /><small>(Para o método do login pelo formulário)</small>',
+ 'password_format' => 'Ao menos 7 caracteres',
+ '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.',
+ ),
+ 'host' => 'Host',
+ 'prefix' => 'Prefixo da tabela',
+ 'password' => 'Senha do banco de dados',
+ 'type' => 'Tipo do banco de dados',
+ 'username' => 'Usuário do 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.',
+ 'ok' => 'Permissões no diretório cache estão corretos.',
+ ),
+ 'ctype' => array(
+ 'nok' => 'Não foi possível encontrar uma biblioteca necessária para verificação do tipo de caractere (php-ctype).',
+ 'ok' => 'Você tem a biblioteca necessária para verificação do tipo de caractere (ctype).',
+ ),
+ 'curl' => array(
+ 'nok' => 'Não foi possível encontrar a biblioteca cURL (php-curl).',
+ 'ok' => 'Você tem a biblioteca cURL.',
+ ),
+ 'data' => array(
+ 'nok' => 'Verifique as permissões no diretório <em>./data</em>. O servidor HTTP deve ter direitos para escrever dentro desta pasta.',
+ 'ok' => 'Permissões no diretório data estão corretos.',
+ ),
+ 'dom' => array(
+ 'nok' => 'Não foi possível encontrar uma biblioteca necessária para navegar pelo DOM (php-xml).',
+ 'ok' => 'Você tem a biblioteca necessária para navegar pelo DOM.',
+ ),
+ 'favicons' => array(
+ 'nok' => 'Verifique as permissões no diretório <em>./data/favicons</em>. O servidor HTTP deve ter direitos para escrever dentro desta pasta.',
+ 'ok' => 'Permissões no diretório favicons estão corretos.',
+ ),
+ 'fileinfo' => array(
+ 'nok' => 'Não foi possível encontrar a biblioteca fileinfo do PHP (fileinfo).',
+ 'ok' => 'Você tem a biblioteca fileinfo.',
+ ),
+ 'http_referer' => array(
+ 'nok' => 'Por favor verifique se você não está alterando seu HTTP REFERER.',
+ 'ok' => 'Seu HTTP REFERER é conhecido e corresponde ao seu servidor.',
+ ),
+ 'json' => array(
+ 'nok' => 'Não foi possível encontrar JSON (php5-json).',
+ 'ok' => 'Você tem a extensão JSON.',
+ ),
+ 'minz' => array(
+ 'nok' => 'Não foi possível encontrar o framework Minz.',
+ 'ok' => 'Você tem o framework Minz.',
+ ),
+ 'pcre' => array(
+ 'nok' => 'Não foi possível encontrar uma biblioteca necessário para expressões regulares (php-pcre).',
+ 'ok' => 'Você tem a biblioteca necessária para expressões regulares (php-pcre).',
+ ),
+ 'pdo' => array(
+ 'nok' => 'Não foi encontrado o PDO ou um dos drivers suportados (pdo_mysql, pdo_sqlite, pdo_pgsql).',
+ 'ok' => 'Você tem o PDO e ao menos um dos drivers suportados (pdo_mysql, pdo_sqlite, pdo_pgsql).',
+ ),
+ 'php' => array(
+ '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.',
+ ),
+ 'users' => array(
+ 'nok' => 'Verifiquei as permissões no diretório <em>./data/users</em>. O servidor HTTP deve ter direitos para escrever dentro desta pasta.',
+ 'ok' => 'Permissões no diretório users estão corretos.',
+ ),
+ 'xml' => 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.',
+ ),
+ ),
+ 'conf' => array(
+ '_' => 'Configurações gerais',
+ 'ok' => 'Configurações gerais foram salvas.',
+ ),
+ 'congratulations' => 'Parabéns!',
+ 'default_user' => 'Usuário do usuário padrão <small>(máximo de 16 caracteres alphanumericos)</small>',
+ 'delete_articles_after' => 'Remover artigos depois',
+ 'fix_errors_before' => 'Por favor solucione os erros antes de ir para o próximo passo.',
+ 'javascript_is_better' => 'FreshRSS é mais agradável com o JavaScript ativo',
+ 'js' => 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.',
+ ),
+ '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',
+);
diff --git a/app/i18n/pt-br/sub.php b/app/i18n/pt-br/sub.php
new file mode 100644
index 000000000..61a80d41e
--- /dev/null
+++ b/app/i18n/pt-br/sub.php
@@ -0,0 +1,62 @@
+<?php
+
+return array(
+ 'category' => array(
+ '_' => 'Categoria',
+ 'add' => 'Adicionar uma categoria',
+ 'empty' => 'Categoria vazia',
+ 'new' => 'Nova categoria',
+ ),
+ 'feed' => array(
+ 'add' => 'Adicionar um RSS feed',
+ 'advanced' => 'Avançado',
+ 'archiving' => 'Arquivar',
+ 'auth' => array(
+ 'configuration' => 'Login',
+ 'help' => 'Permite acesso a feeds RSS protegidos por HTTP',
+ 'http' => 'Autenticação HTTP',
+ 'password' => 'Senha HTTP',
+ 'username' => 'Usuário HTTP',
+ ),
+ '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.',
+ 'in_main_stream' => 'Mostrar na tela principal',
+ 'informations' => 'Informações',
+ 'keep_history' => '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>.',
+ 'no_selected' => 'Nenhum feed selecionado.',
+ 'number_entries' => '%d artigos',
+ 'stats' => 'Estatísticas',
+ 'think_to_add' => 'Você deve adicionar alguns feeds.',
+ 'title' => 'Título',
+ 'title_add' => 'Adicionar o RSS feed',
+ 'ttl' => 'Não atualize automáticamente mais que',
+ 'url' => 'Feed URL',
+ 'validator' => 'Verifique a validade do feed',
+ 'website' => 'URL do site',
+ 'pubsubhubbub' => 'Notificação instantânea com PubSubHubbub',
+ ),
+ 'import_export' => array(
+ 'export' => 'Exportar',
+ 'export_opml' => 'Exporta a lista dos feeds (OPML)',
+ 'export_starred' => 'Exportar seus favoritos',
+ '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)',
+ 'import' => 'Importar',
+ 'starred_list' => 'Listar artigos favoritos',
+ 'title' => 'Importar / exportar',
+ ),
+ 'menu' => array(
+ 'bookmark' => 'Inscreva-se (FreshRSS favoritos)',
+ 'import_export' => 'Importar / exportar',
+ 'subscription_management' => 'Gerenciamento de inscrições',
+ ),
+ 'title' => array(
+ '_' => 'Gerenciamento de inscrições',
+ 'feed_management' => 'Gerenciamento dos RSS feeds',
+ ),
+);
diff --git a/app/i18n/ru/conf.php b/app/i18n/ru/conf.php
index 3cf0a5ea9..9c61754ae 100644
--- a/app/i18n/ru/conf.php
+++ b/app/i18n/ru/conf.php
@@ -104,7 +104,7 @@ return array(
'when' => 'Mark article as read…',
),
'show' => array(
- '_' => 'Articles to display',
+ '_' => 'Articles to display',
'adaptive' => 'Adjust showing',
'all_articles' => 'Show all articles',
'unread' => 'Show only unread',
diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php
index c913b8720..3a728016d 100644
--- a/app/i18n/ru/gen.php
+++ b/app/i18n/ru/gen.php
@@ -79,6 +79,7 @@ return array(
'last_year' => 'Last year',
'mar' => 'mar',
'march' => 'Mar',
+ 'may_' => 'May',
'may' => 'May',
'mon' => 'Mon',
'month' => 'months',
@@ -116,11 +117,15 @@ return array(
'cz' => 'Čeština',
'de' => 'Deutsch',
'en' => 'English',
+ 'es' => 'Español',
'fr' => 'Français',
'it' => 'Italiano',
+ 'kr' => '한국어',
'nl' => 'Nederlands',
+ 'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
'tr' => 'Türkçe',
+ 'zh-cn' => '简体中文',
),
'menu' => array(
'about' => 'About',
diff --git a/app/i18n/ru/sub.php b/app/i18n/ru/sub.php
index 789433ee6..fa28a3ec4 100644
--- a/app/i18n/ru/sub.php
+++ b/app/i18n/ru/sub.php
@@ -1,62 +1,73 @@
<?php
return array(
+ '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
+ 'title' => 'Bookmarklet',// TODO
+ ),
'category' => array(
- '_' => 'Category',
- 'add' => 'Add a category',
- 'empty' => 'Empty category',
- 'new' => 'New category',
+ '_' => 'Category',// TODO
+ 'add' => 'Add a category',// TODO
+ 'empty' => 'Empty category',// TODO
+ 'new' => 'New category',// TODO
),
'feed' => array(
- 'add' => 'Add a RSS feed',
- 'advanced' => 'Advanced',
- 'archiving' => 'Archivage',
+ 'add' => 'Add a RSS feed',// TODO
+ 'advanced' => 'Advanced',// TODO
+ 'archiving' => 'Archivage',// TODO
'auth' => array(
- 'configuration' => 'Login',
- 'help' => 'Connection allows to access HTTP protected RSS feeds',
- 'http' => 'HTTP Authentication',
- 'password' => 'HTTP password',
- 'username' => 'HTTP username',
+ 'configuration' => 'Login',// TODO
+ 'help' => 'Connection allows to access HTTP protected RSS feeds',// TODO
+ 'http' => 'HTTP Authentication',// TODO
+ 'password' => 'HTTP password',// TODO
+ 'username' => 'HTTP username',// TODO
),
- 'css_help' => 'Retrieves truncated RSS feeds (caution, requires more time!)',
- 'css_path' => 'Articles CSS path on original website',
- 'description' => 'Description',
- '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 actualize it.',
- 'in_main_stream' => 'Show in main stream',
- 'informations' => 'Information',
- 'keep_history' => 'Minimum number of articles to keep',
- 'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',
- 'no_selected' => 'No feed selected.',
- 'number_entries' => '%d articles',
- 'stats' => 'Statistics',
- 'think_to_add' => 'You may add some feeds.',
- 'title' => 'Title',
- 'title_add' => 'Add a RSS feed',
- 'ttl' => 'Do not automatically refresh more often than',
- 'url' => 'Feed URL',
- 'validator' => 'Check the validity of the feed',
- 'website' => 'Website URL',
- 'pubsubhubbub' => 'Instant notification with PubSubHubbub',
+ 'css_help' => 'Retrieves truncated RSS feeds (caution, requires more time!)',// TODO
+ 'css_path' => 'Articles CSS path on original website',// TODO
+ 'description' => 'Description',// TODO
+ 'empty' => 'This feed is empty. Please verify that it is still maintained.',// TODO
+ 'error' => 'This feed has encountered a problem. Please verify that it is always reachable then actualize it.',// TODO
+ 'in_main_stream' => 'Show in main stream',// TODO
+ 'informations' => 'Information',// TODO
+ 'keep_history' => 'Minimum number of articles to keep',// TODO
+ 'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',// TODO
+ 'no_selected' => 'No feed selected.',// TODO
+ 'number_entries' => '%d articles',// TODO
+ 'stats' => 'Statistics',// TODO
+ 'think_to_add' => 'You may add some feeds.',// TODO
+ 'title' => 'Title',// TODO
+ 'title_add' => 'Add a RSS feed',// TODO
+ 'ttl' => 'Do not automatically refresh more often than',// TODO
+ 'url' => 'Feed URL',// TODO
+ 'validator' => 'Check the validity of the feed',// TODO
+ 'website' => 'Website URL',// TODO
+ 'pubsubhubbub' => 'Instant notification with PubSubHubbub',// TODO
+ ),
+ '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
+ 'title' => 'Firefox feed reader',// TODO
),
'import_export' => array(
- 'export' => 'Export',
- 'export_opml' => 'Export list of feeds (OPML)',
- 'export_starred' => 'Export your favourites',
- '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)',
- 'import' => 'Import',
- 'starred_list' => 'List of favourite articles',
- 'title' => 'Import / export',
+ 'export' => 'Export',// TODO
+ 'export_opml' => 'Export list of feeds (OPML)',// TODO
+ 'export_starred' => 'Export your favourites',// TODO
+ 'feed_list' => 'List of %s articles',// TODO
+ 'file_to_import' => 'File to import<br />(OPML, JSON or ZIP)',// TODO
+ 'file_to_import_no_zip' => 'File to import<br />(OPML or JSON)',// TODO
+ 'import' => 'Import',// TODO
+ 'starred_list' => 'List of favourite articles',// TODO
+ 'title' => 'Import / export',// TODO
),
'menu' => array(
- 'bookmark' => 'Subscribe (FreshRSS bookmark)',
- 'import_export' => 'Import / export',
- 'subscription_management' => 'Subscriptions management',
+ 'bookmark' => 'Subscribe (FreshRSS bookmark)',// TODO
+ 'import_export' => 'Import / export',// TODO
+ 'subscription_management' => 'Subscriptions management',// TODO
+ 'subscription_tools' => 'Subscription tools',// TODO
),
'title' => array(
- '_' => 'Subscriptions management',
- 'feed_management' => 'RSS feeds management',
+ '_' => 'Subscriptions management',// TODO
+ 'feed_management' => 'RSS feeds management',// TODO
+ 'subscription_tools' => 'Subscription tools',// TODO
),
);
diff --git a/app/i18n/tr/conf.php b/app/i18n/tr/conf.php
index 9930c3637..e4c094be2 100644
--- a/app/i18n/tr/conf.php
+++ b/app/i18n/tr/conf.php
@@ -104,7 +104,7 @@ return array(
'when' => 'Makaleyi okundu olarak işaretle…',
),
'show' => array(
- '_' => 'Gösterilecek makaleler',
+ '_' => 'Gösterilecek makaleler',
'adaptive' => 'Ayarlanmış gösterim',
'all_articles' => 'Tüm makaleleri göster',
'unread' => 'Sadece okunmamış makaleleri göster',
diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php
index 4da0206ec..81f926840 100644
--- a/app/i18n/tr/gen.php
+++ b/app/i18n/tr/gen.php
@@ -79,7 +79,8 @@ return array(
'last_year' => 'Geçen yıl',
'mar' => 'mar',
'march' => 'Mar',
- 'may' => 'May',
+ 'may_' => 'May',
+ 'may' => 'Mayıs',
'mon' => 'Pzt',
'month' => 'ay',
'nov' => 'kas',
@@ -116,11 +117,15 @@ return array(
'cz' => 'Čeština',
'de' => 'Deutsch',
'en' => 'English',
+ 'es' => 'Español',
'fr' => 'Français',
'it' => 'Italiano',
+ 'kr' => '한국어',
'nl' => 'Nederlands',
+ 'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
'tr' => 'Türkçe',
+ 'zh-cn' => '简体中文',
),
'menu' => array(
'about' => 'Hakkında',
diff --git a/app/i18n/tr/sub.php b/app/i18n/tr/sub.php
index 7592096d9..e928fae72 100644
--- a/app/i18n/tr/sub.php
+++ b/app/i18n/tr/sub.php
@@ -1,6 +1,11 @@
<?php
return array(
+ '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
+ 'title' => 'Bookmarklet',// TODO
+ ),
'category' => array(
'_' => 'Kategori',
'add' => 'Kategori ekle',
@@ -39,6 +44,10 @@ return array(
'website' => 'Site URL',
'pubsubhubbub' => 'PubSubHubbub 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
+ 'title' => 'Firefox feed reader',// TODO
+ ),
'import_export' => array(
'export' => 'Dışa aktar',
'export_opml' => 'Akış listesini dışarı aktar (OPML)',
@@ -54,9 +63,11 @@ return array(
'bookmark' => 'Abonelik (FreshRSS yer imleri)',
'import_export' => 'İçe / dışa aktar',
'subscription_management' => 'Abonelik yönetimi',
+ 'subscription_tools' => 'Subscription tools',// TODO
),
'title' => array(
'_' => 'Abonelik yönetimi',
'feed_management' => 'RSS akış yönetimi',
+ 'subscription_tools' => 'Subscription tools',// TODO
),
);
diff --git a/app/i18n/zh-cn/conf.php b/app/i18n/zh-cn/conf.php
index 6ac0bb5e7..fb62c48ef 100644
--- a/app/i18n/zh-cn/conf.php
+++ b/app/i18n/zh-cn/conf.php
@@ -104,7 +104,7 @@ return array(
'when' => '将文章设为已读…',
),
'show' => array(
- '_' => '文章显示',
+ '_' => '文章显示',
'adaptive' => '智能显示',
'all_articles' => '显示所有文章',
'unread' => '只显示未读',
diff --git a/app/i18n/zh-cn/gen.php b/app/i18n/zh-cn/gen.php
index a4ef03bc9..a69f02b3f 100644
--- a/app/i18n/zh-cn/gen.php
+++ b/app/i18n/zh-cn/gen.php
@@ -79,6 +79,7 @@ return array(
'last_year' => '去年',
'mar' => '三月',
'march' => '三月',
+ 'may_' => '五月',
'may' => '五月',
'mon' => '周一',
'month' => '个月',
@@ -115,13 +116,16 @@ return array(
'lang' => array(
'cz' => 'Čeština',
'de' => 'Deutsch',
- 'en' => 'English1',
+ 'en' => 'English',
+ 'es' => 'Español',
'fr' => 'Français',
- 'it' => 'Italiano1',
+ 'it' => 'Italiano',
+ 'kr' => '한국어',
'nl' => 'Nederlands',
+ 'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
'tr' => 'Türkçe',
- 'zh-cn' => '简体中文'
+ 'zh-cn' => '简体中文',
),
'menu' => array(
'about' => '关于',
diff --git a/app/i18n/zh-cn/sub.php b/app/i18n/zh-cn/sub.php
index 0c599e986..159bcd919 100644
--- a/app/i18n/zh-cn/sub.php
+++ b/app/i18n/zh-cn/sub.php
@@ -1,6 +1,11 @@
<?php
return array(
+ '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
+ 'title' => 'Bookmarklet',// TODO
+ ),
'category' => array(
'_' => '分类',
'add' => '添加分类',
@@ -39,6 +44,10 @@ return array(
'website' => '网站 URL',
'pubsubhubbub' => 'PubSubHubbub 即时通知',
),
+ '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
+ 'title' => 'Firefox feed reader',// TODO
+ ),
'import_export' => array(
'export' => '导出',
'export_opml' => '导出 RSS 源列表 (OPML)',
@@ -54,9 +63,11 @@ return array(
'bookmark' => '订阅 (FreshRSS 书签)',
'import_export' => '导入/导出',
'subscription_management' => '订阅管理',
+ 'subscription_tools' => 'Subscription tools',// TODO
),
'title' => array(
'_' => '订阅管理',
'feed_management' => 'RSS 源管理',
+ 'subscription_tools' => 'Subscription tools',// TODO
),
);
diff --git a/app/install.php b/app/install.php
index 9e474ca73..870c93908 100644
--- a/app/install.php
+++ b/app/install.php
@@ -11,7 +11,7 @@ session_set_cookie_params(0, dirname(empty($_SERVER['REQUEST_URI']) ? '/' : dirn
session_start();
if (isset($_GET['step'])) {
- define('STEP',(int)$_GET['step']);
+ define('STEP', (int)$_GET['step']);
} else {
define('STEP', 0);
}
@@ -124,7 +124,7 @@ function saveStep2() {
$_SESSION['title'] = $system_default_config->title;
$_SESSION['old_entries'] = param('old_entries', $user_default_config->old_entries);
$_SESSION['auth_type'] = param('auth_type', 'form');
- $_SESSION['default_user'] = substr(preg_replace('/[^a-zA-Z0-9]/', '', param('default_user', '')), 0, 16);
+ $_SESSION['default_user'] = substr(preg_replace('/[^0-9a-zA-Z_]/', '', param('default_user', '')), 0, 38);
$password_plain = param('passwordPlain', false);
if ($password_plain !== false && cryptAvailable()) {
@@ -410,7 +410,7 @@ function printStep1() {
<?php if ($res['php'] == 'ok') { ?>
<p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.php.ok', PHP_VERSION); ?></p>
<?php } else { ?>
- <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.php.nok', PHP_VERSION, '5.3.3'); ?></p>
+ <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.php.nok', PHP_VERSION, '5.3.8'); ?></p>
<?php } ?>
<?php if ($res['minz'] == 'ok') { ?>
@@ -631,7 +631,7 @@ function printStep3() {
<div class="form-group">
<label class="group-name" for="user"><?php echo _t('install.bdd.username'); ?></label>
<div class="group-controls">
- <input type="text" id="user" name="user" maxlength="16" pattern="[0-9A-Za-z_.-]{1,16}" value="<?php echo isset($_SESSION['bd_user']) ? $_SESSION['bd_user'] : ''; ?>" tabindex="3" />
+ <input type="text" id="user" name="user" maxlength="64" pattern="[0-9A-Za-z_.-]{1,64}" value="<?php echo isset($_SESSION['bd_user']) ? $_SESSION['bd_user'] : ''; ?>" tabindex="3" />
</div>
</div>
@@ -652,7 +652,7 @@ function printStep3() {
<div class="form-group">
<label class="group-name" for="prefix"><?php echo _t('install.bdd.prefix'); ?></label>
<div class="group-controls">
- <input type="text" id="prefix" name="prefix" maxlength="16" pattern="[0-9A-Za-z_]{1,16}" value="<?php echo isset($_SESSION['bd_prefix']) ? $_SESSION['bd_prefix'] : $system_default_config->db['prefix']; ?>" tabindex="6" />
+ <input type="text" id="prefix" name="prefix" maxlength="16" pattern="[0-9A-Za-z_]{1,16}" value="<?php echo isset($_SESSION['bd_prefix']) ? $_SESSION['bd_prefix'] : $system_default_config->db['prefix']; ?>" tabindex="6" />
</div>
</div>
</div>
diff --git a/app/layout/aside_subscription.phtml b/app/layout/aside_subscription.phtml
index e14afe2a7..6d2a5ac8f 100644
--- a/app/layout/aside_subscription.phtml
+++ b/app/layout/aside_subscription.phtml
@@ -9,9 +9,7 @@
<a href="<?php echo _url('importExport', 'index'); ?>"><?php echo _t('sub.menu.import_export'); ?></a>
</li>
- <li class="item">
- <a class="bookmarkClick" href="javascript:(function(){var%20url%20=%20location.href;var%20otherWindow=window.open('about:blank','_blank');otherWindow.opener=null;otherWindow.location='<?php echo Minz_Url::display(array('c' => 'feed', 'a' => 'add'), 'html', true); ?>&amp;url_rss='+encodeURIComponent(url);})();">
- <?php echo _t('sub.menu.bookmark'); ?>
- </a>
+ <li class="item<?php echo Minz_Request::controllerName() == 'bookmarklet' ? ' active' : ''; ?>">
+ <a href="<?php echo _url('subscription', 'bookmarklet'); ?>"><?php echo _t('sub.menu.subscription_tools'); ?></a>
</li>
</ul>
diff --git a/app/views/subscription/bookmarklet.phtml b/app/views/subscription/bookmarklet.phtml
new file mode 100644
index 000000000..162501be6
--- /dev/null
+++ b/app/views/subscription/bookmarklet.phtml
@@ -0,0 +1,13 @@
+<?php $this->partial('aside_subscription'); ?>
+
+<div class="post">
+ <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a>
+
+ <legend><?php echo _t('sub.bookmarklet.title'); ?></legend>
+ <p><a class="btn btn-important" href="javascript:(function(){var%20url%20=%20location.href;var%20otherWindow=window.open('about:blank','_blank');otherWindow.opener=null;otherWindow.location='<?php echo Minz_Url::display(array('c' => 'feed', 'a' => 'add'), 'html', true); ?>&amp;url_rss='+encodeURIComponent(url);})();"><?php echo _t('sub.bookmarklet.label'); ?></a></p>
+ <?php echo _t('sub.bookmarklet.documentation'); ?>
+
+ <legend><?php echo _t('sub.firefox.title'); ?></legend>
+ <p><?php echo _t('sub.firefox.documentation'); ?></p>
+ <pre>browser.contentHandlers.types.number.uri → <?php echo Minz_Url::display(array('c' => 'feed', 'a' => 'add'), 'html', true); ?>&amp;url_rss=%s</pre>
+</div> \ No newline at end of file
diff --git a/app/views/update/checkInstall.phtml b/app/views/update/checkInstall.phtml
index 543ab43de..33d78cbe7 100644
--- a/app/views/update/checkInstall.phtml
+++ b/app/views/update/checkInstall.phtml
@@ -9,7 +9,7 @@
<p class="alert <?php echo $status ? 'alert-success' : 'alert-error'; ?>">
<?php
if ($key === 'php') {
- echo _t('admin.check_install.' . $key . '.' . ($status ? 'ok' : 'nok'), PHP_VERSION, '5.3.3');
+ echo _t('admin.check_install.' . $key . '.' . ($status ? 'ok' : 'nok'), PHP_VERSION, '5.3.8');
} else {
echo _t('admin.check_install.' . $key . '.' . ($status ? 'ok' : 'nok'));
}
diff --git a/cli/README.md b/cli/README.md
index 1ac8c95ce..ce1be10a7 100644
--- a/cli/README.md
+++ b/cli/README.md
@@ -43,9 +43,12 @@ cd /usr/share/FreshRSS
./cli/reconfigure.php
# Same parameters as for do-install.php. Used to update an existing installation.
-./cli/create-user.php --user username ( --password 'password' --api-password 'api_password' --language en --email user@example.net --token 'longRandomString' --no-default-feeds )
+./cli/create-user.php --user username ( --password 'password' --api_password 'api_password' --language en --email user@example.net --token 'longRandomString' --no_default_feeds --purge_after_months 3 --feed_min_articles_default 50 --feed_ttl_default 3600 --since_hours_posts_per_rss 168 --min_posts_per_rss 2 --max_posts_per_rss 400 )
# --language can be: 'en' (default), 'fr', or one of the [supported languages](../app/i18n/)
+./cli/update-user.php --user username ( ... )
+# Same options as create-user.php, except --no_default_feeds which is only available for create-user.php
+
./cli/delete-user.php --user username
./cli/list-users.php
diff --git a/cli/_update-or-create-user.php b/cli/_update-or-create-user.php
new file mode 100644
index 000000000..15397f1f6
--- /dev/null
+++ b/cli/_update-or-create-user.php
@@ -0,0 +1,56 @@
+<?php
+require('_cli.php');
+
+$params = array(
+ 'user:',
+ 'password:',
+ 'api_password:',
+ 'language:',
+ 'email:',
+ 'token:',
+ 'purge_after_months:',
+ 'feed_min_articles_default:',
+ 'feed_ttl_default:',
+ 'since_hours_posts_per_rss:',
+ 'min_posts_per_rss:',
+ 'max_posts_per_rss:',
+ );
+
+if (!$isUpdate) {
+ $params[] = 'no_default_feeds'; //Only for creating new users
+}
+
+$options = getopt('', $params);
+
+if (empty($options['user'])) {
+ fail('Usage: ' . basename($_SERVER['SCRIPT_FILENAME']) .
+ " --user username ( --password 'password' --api_password 'api_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" .
+ " --since_hours_posts_per_rss 168 --min_posts_per_rss 2 --max_posts_per_rss 400 )");
+}
+
+function strParam($name) {
+ global $options;
+ return isset($options[$name]) ? strval($options[$name]) : null;
+}
+
+function intParam($name) {
+ global $options;
+ return isset($options[$name]) && ctype_digit($options[$name]) ? intval($options[$name]) : null;
+}
+
+$values = array(
+ 'language' => strParam('language'),
+ 'mail_login' => strParam('email'),
+ 'token' => strParam('token'),
+ 'old_entries' => intParam('purge_after_months'),
+ 'keep_history_default' => intParam('feed_min_articles_default'),
+ 'ttl_default' => intParam('feed_ttl_default'),
+ 'since_hours_posts_per_rss' => intParam('since_hours_posts_per_rss'),
+ 'min_posts_per_rss' => intParam('min_posts_per_rss'),
+ 'max_posts_per_rss' => intParam('max_posts_per_rss'),
+ );
+
+$values = array_filter($values);
diff --git a/cli/create-user.php b/cli/create-user.php
index c9e350c14..1b6be3153 100755
--- a/cli/create-user.php
+++ b/cli/create-user.php
@@ -1,24 +1,12 @@
#!/usr/bin/php
<?php
-require('_cli.php');
-
-$options = getopt('', array(
- 'user:',
- 'password:',
- 'api-password:',
- 'language:',
- 'email:',
- 'token:',
- 'no-default-feeds',
- ));
-
-if (empty($options['user'])) {
- fail('Usage: ' . basename(__FILE__) . " --user username ( --password 'password' --api-password 'api_password'" .
- " --language en --email user@example.net --token 'longRandomString --no-default-feeds' )");
-}
+$isUpdate = false;
+require('_update-or-create-user.php');
+
$username = $options['user'];
if (!FreshRSS_user_Controller::checkUsername($username)) {
- fail('FreshRSS error: invalid username “' . $username . '”');
+ fail('FreshRSS error: invalid username “' . $username .
+ '”! Must be matching ' . FreshRSS_user_Controller::USERNAME_PATTERN);
}
$usernames = listUsers();
@@ -30,11 +18,8 @@ echo 'FreshRSS creating user “', $username, "”…\n";
$ok = FreshRSS_user_Controller::createUser($username,
empty($options['password']) ? '' : $options['password'],
- empty($options['api-password']) ? '' : $options['api-password'],
- array(
- 'language' => empty($options['language']) ? '' : $options['language'],
- 'token' => empty($options['token']) ? '' : $options['token'],
- ),
+ empty($options['api_password']) ? '' : $options['api_password'],
+ $values,
!isset($options['no-default-feeds']));
if (!$ok) {
diff --git a/cli/do-install.php b/cli/do-install.php
index 143ca5c3e..74bbdfcd4 100755
--- a/cli/do-install.php
+++ b/cli/do-install.php
@@ -81,14 +81,17 @@ if ($requirements['all'] !== 'ok') {
}
if (!FreshRSS_user_Controller::checkUsername($options['default_user'])) {
- fail('FreshRSS invalid default username (must be ASCII alphanumeric): ' . $options['default_user']);
+ fail('FreshRSS error: invalid default username “' . $options['default_user']
+ . '”! Must be matching ' . FreshRSS_user_Controller::USERNAME_PATTERN);
}
if (isset($options['auth_type']) && !in_array($options['auth_type'], array('form', 'http_auth', 'none'))) {
- fail('FreshRSS invalid authentication method (auth_type must be one of { form, http_auth, none }: ' . $options['auth_type']);
+ fail('FreshRSS invalid authentication method (auth_type must be one of { form, http_auth, none }): '
+ . $options['auth_type']);
}
-if (file_put_contents(join_path(DATA_PATH, 'config.php'), "<?php\n return " . var_export($config, true) . ";\n") === false) {
+if (file_put_contents(join_path(DATA_PATH, 'config.php'),
+ "<?php\n return " . var_export($config, true) . ";\n") === false) {
fail('FreshRSS could not write configuration file!: ' . join_path(DATA_PATH, 'config.php'));
}
diff --git a/cli/list-users.php b/cli/list-users.php
index 610a9dd7b..00a0b2b2c 100755
--- a/cli/list-users.php
+++ b/cli/list-users.php
@@ -4,7 +4,8 @@ require('_cli.php');
$users = listUsers();
sort($users);
-if (FreshRSS_Context::$system_conf->default_user !== '' && in_array(FreshRSS_Context::$system_conf->default_user, $users, true)) {
+if (FreshRSS_Context::$system_conf->default_user !== ''
+ && in_array(FreshRSS_Context::$system_conf->default_user, $users, true)) {
array_unshift($users, FreshRSS_Context::$system_conf->default_user);
$users = array_unique($users);
}
diff --git a/cli/reconfigure.php b/cli/reconfigure.php
index c6902da67..466d35373 100755
--- a/cli/reconfigure.php
+++ b/cli/reconfigure.php
@@ -51,7 +51,8 @@ if (!FreshRSS_user_Controller::checkUsername($config->default_user)) {
}
if (isset($config->auth_type) && !in_array($config->auth_type, array('form', 'http_auth', 'none'))) {
- fail('FreshRSS invalid authentication method (auth_type must be one of { form, http_auth, none }: ' . $config->auth_type);
+ fail('FreshRSS invalid authentication method (auth_type must be one of { form, http_auth, none }: '
+ . $config->auth_type);
}
$config->save();
diff --git a/cli/update-user.php b/cli/update-user.php
new file mode 100755
index 000000000..ac674484c
--- /dev/null
+++ b/cli/update-user.php
@@ -0,0 +1,23 @@
+#!/usr/bin/php
+<?php
+$isUpdate = true;
+require('_update-or-create-user.php');
+
+$username = cliInitUser($options['user']);
+
+echo 'FreshRSS updating user “', $username, "”…\n";
+
+$ok = FreshRSS_user_Controller::updateContextUser(
+ empty($options['password']) ? '' : $options['password'],
+ empty($options['api_password']) ? '' : $options['api_password'],
+ $values);
+
+if (!$ok) {
+ fail('FreshRSS could not update user!');
+}
+
+invalidateHttpCache($username);
+
+accessRights();
+
+done($ok);
diff --git a/constants.php b/constants.php
index ef60baea0..be70188e0 100644
--- a/constants.php
+++ b/constants.php
@@ -1,7 +1,7 @@
<?php
-define('FRESHRSS_VERSION', '1.7.0');
-define('FRESHRSS_WEBSITE', 'http://freshrss.org');
-define('FRESHRSS_WIKI', 'http://doc.freshrss.org');
+define('FRESHRSS_VERSION', '1.8.0');
+define('FRESHRSS_WEBSITE', 'https://freshrss.org');
+define('FRESHRSS_WIKI', 'https://freshrss.github.io/FreshRSS/');
// PHP text output compression http://php.net/ob_gzhandler (better to do it at Web server level)
define('PHP_COMPRESSION', false);
diff --git a/data/shares.php b/data/shares.php
index 16e528d14..d73ae3826 100644
--- a/data/shares.php
+++ b/data/shares.php
@@ -4,7 +4,7 @@
* This is a configuration file. You shouldn't modify it unless you know what
* you are doing. If you want to add a share type, this is where you need to do
* it.
- *
+ *
* 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
diff --git a/docs/en/developers/03_Backend/05_Extensions.md b/docs/en/developers/03_Backend/05_Extensions.md
index c5c00ff08..b0b5793df 100644
--- a/docs/en/developers/03_Backend/05_Extensions.md
+++ b/docs/en/developers/03_Backend/05_Extensions.md
@@ -2,7 +2,7 @@
## About FreshRSS
-FreshRSS is an RSS / Atom feeds aggregator written in PHP since October 2012. The official site is located at [freshrss.org](http://freshrss.org) and its repository is hosted by Github: [github.com/FreshRSS/FreshRSS](https://github.com/FreshRSS/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).
## Problem to solve
diff --git a/docs/en/users/01_Installation.md b/docs/en/users/01_Installation.md
index 6c979fd42..b2a717629 100644
--- a/docs/en/users/01_Installation.md
+++ b/docs/en/users/01_Installation.md
@@ -7,18 +7,15 @@ You need to verify that your server can run FreshRSS before installing it. If yo
| Software | Recommended | Works also with |
| ----------- | ---------------- | ----------------------------- |
| Web server | **Apache 2** | Nginx |
-| PHP | **PHP 5.3.7+** | PHP 5.2+ |
+| PHP | **PHP 5.5+** | PHP 5.3.8+ |
| PHP modules | Required: libxml, cURL, PDO_MySQL, PCRE and ctype. \\ Required (32-bit only): GMP \\Recommanded: JSON, Zlib, mbstring, iconv, ZipArchive | |
| Database | **MySQL 5.0.3+** | SQLite 3.7.4+ |
| Browser | **Firefox** | Chrome, Opera, Safari or IE9+ |
## Important notice
-FreshRSS **CAN** work with PHP 5.3.3. To do so, we are using specific functions available in the ''password_compat'' library for the form authentication. This library is compatible with PHP >= 5.3.7 but some older version include the patch.
-It all depends on the distribution:
+FreshRSS **CAN** work with PHP 5.3.8+. To do so, we are using specific functions available in the [''password_compat'' library](https://github.com/ircmaxell/password_compat#requirements) for the form authentication.
-* CentOS and RHEL 6.5 are supported.
-* On the other hand, **Debian with PHP 5.3.3 is not**! ([For more information](https://github.com/ircmaxell/password_compat#requirements))
# Getting the appropriate version of FreshRSS
diff --git a/docs/fr/developers/02_Github.md b/docs/fr/developers/02_Github.md
index 3d4bf9639..b4fa7b301 100644
--- a/docs/fr/developers/02_Github.md
+++ b/docs/fr/developers/02_Github.md
@@ -18,7 +18,7 @@ GitHub est la plate-forme à privilégier pour vos demandes. En effet, cela nous
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](http://freshrss.org/announce-of-the-mailing-lists.html)
+* 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.
diff --git a/docs/fr/developers/03_Backend/05_Extensions.md b/docs/fr/developers/03_Backend/05_Extensions.md
index 0478d77b8..a3dc5ad20 100644
--- a/docs/fr/developers/03_Backend/05_Extensions.md
+++ b/docs/fr/developers/03_Backend/05_Extensions.md
@@ -2,7 +2,7 @@
## 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](http://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
diff --git a/docs/fr/users/01_Installation.md b/docs/fr/users/01_Installation.md
index 86daa636a..765cb9481 100644
--- a/docs/fr/users/01_Installation.md
+++ b/docs/fr/users/01_Installation.md
@@ -7,17 +7,14 @@ Il est toutefois de votre responsabilité de vérifier que votre hébergement pe
| Logiciel | Recommandé | Fonctionne aussi avec |
| -------- | ----------- | --------------------- |
| Serveur web | **Apache 2** | Nginx |
- | PHP | **PHP 5.3.7+** | PHP 5.2+ |
+ | PHP | **PHP 5.5+** | PHP 5.3.8+ |
| Modules PHP | Requis : libxml, cURL, PDO_MySQL, PCRE et ctype \\ Requis (32 bits seulement) : GMP \\ Recommandé : JSON, Zlib, mbstring et iconv, ZipArchive | |
| Base de données | **MySQL 5.0.3+** | SQLite 3.7.4+ |
| Navigateur | **Firefox** | Chrome, Opera, Safari or IE 9+ |
## Note importante
-FreshRSS **PEUT** fonctionner sur la version de PHP 5.3.3. En effet, nous utilisons des fonctions spécifiques pour la connexion par formulaire et notamment la bibliothèque ''password_compat''. Celle-ci est compatible avec PHP >= 5.3.7 ou certaines versions plus anciennes incluant un patch spécifique. Cela dépend de la distribution :
-
-* CentOS et la Red Hat Enterprise Linux 6.5 sont supportés.
-* En revanche, **Debian avec PHP 5.3.3 n'est pas supporté !** ([Plus d'informations](https://github.com/ircmaxell/password_compat#requirements))
+FreshRSS **PEUT** fonctionner sur la version de PHP 5.3.8+. En effet, nous utilisons des fonctions spécifiques pour la connexion par formulaire et notamment la [bibliothèque ''password_compat''](https://github.com/ircmaxell/password_compat#requirements).
# Choisir la bonne version de FreshRSS
diff --git a/lib/Minz/ActionController.php b/lib/Minz/ActionController.php
index b47c54554..232a4ef9b 100644
--- a/lib/Minz/ActionController.php
+++ b/lib/Minz/ActionController.php
@@ -1,5 +1,5 @@
<?php
-/**
+/**
* MINZ - Copyright 2011 Marien Fressinaud
* Sous licence AGPL3 <http://www.gnu.org/licenses/>
*/
@@ -24,7 +24,7 @@ class Minz_ActionController {
public function view () {
return $this->view;
}
-
+
/**
* Méthodes à redéfinir (ou non) par héritage
* firstAction est la première méthode exécutée par le Dispatcher
@@ -34,5 +34,3 @@ class Minz_ActionController {
public function firstAction () { }
public function lastAction () { }
}
-
-
diff --git a/lib/Minz/ActionException.php b/lib/Minz/ActionException.php
index c566a076f..f1f70c1bc 100644
--- a/lib/Minz/ActionException.php
+++ b/lib/Minz/ActionException.php
@@ -3,7 +3,7 @@ class Minz_ActionException extends Minz_Exception {
public function __construct ($controller_name, $action_name, $code = self::ERROR) {
$message = '`' . $action_name . '` cannot be invoked on `'
. $controller_name . '`';
-
+
parent::__construct ($message, $code);
}
}
diff --git a/lib/Minz/Configuration.php b/lib/Minz/Configuration.php
index d695d4a53..5470dc85f 100644
--- a/lib/Minz/Configuration.php
+++ b/lib/Minz/Configuration.php
@@ -104,7 +104,7 @@ class Minz_Configuration {
/**
* Create a new Minz_Configuration object.
- *
+ *
* @param $namespace the name of the current configuration.
* @param $config_filename the file containing configuration values.
* @param $default_filename the file containing default values, null by default.
@@ -145,7 +145,7 @@ class Minz_Configuration {
/**
* Return the value of the given param.
- *
+ *
* @param $key the name of the param.
* @param $default default value to return if key does not exist.
* @return the value corresponding to the key.
diff --git a/lib/Minz/ControllerNotActionControllerException.php b/lib/Minz/ControllerNotActionControllerException.php
index 535a1377e..1a8e0729c 100644
--- a/lib/Minz/ControllerNotActionControllerException.php
+++ b/lib/Minz/ControllerNotActionControllerException.php
@@ -3,7 +3,7 @@ class Minz_ControllerNotActionControllerException extends Minz_Exception {
public function __construct ($controller_name, $code = self::ERROR) {
$message = 'Controller `' . $controller_name
. '` isn\'t instance of ActionController';
-
+
parent::__construct ($message, $code);
}
}
diff --git a/lib/Minz/ControllerNotExistException.php b/lib/Minz/ControllerNotExistException.php
index 523867d11..24a09a635 100644
--- a/lib/Minz/ControllerNotExistException.php
+++ b/lib/Minz/ControllerNotExistException.php
@@ -3,7 +3,7 @@ class Minz_ControllerNotExistException extends Minz_Exception {
public function __construct ($controller_name, $code = self::ERROR) {
$message = 'Controller `' . $controller_name
. '` doesn\'t exist';
-
+
parent::__construct ($message, $code);
}
}
diff --git a/lib/Minz/CurrentPagePaginationException.php b/lib/Minz/CurrentPagePaginationException.php
index 74214d879..3e3d9d1b4 100644
--- a/lib/Minz/CurrentPagePaginationException.php
+++ b/lib/Minz/CurrentPagePaginationException.php
@@ -2,7 +2,7 @@
class Minz_CurrentPagePaginationException extends Minz_Exception {
public function __construct ($page) {
$message = 'Page number `' . $page . '` doesn\'t exist';
-
+
parent::__construct ($message, self::ERROR);
}
}
diff --git a/lib/Minz/Dispatcher.php b/lib/Minz/Dispatcher.php
index 125ce5757..bdb1c76f6 100644
--- a/lib/Minz/Dispatcher.php
+++ b/lib/Minz/Dispatcher.php
@@ -1,5 +1,5 @@
<?php
-/**
+/**
* MINZ - Copyright 2011 Marien Fressinaud
* Sous licence AGPL3 <http://www.gnu.org/licenses/>
*/
diff --git a/lib/Minz/FileNotExistException.php b/lib/Minz/FileNotExistException.php
index f8dfbdf66..f97f161af 100644
--- a/lib/Minz/FileNotExistException.php
+++ b/lib/Minz/FileNotExistException.php
@@ -2,7 +2,7 @@
class Minz_FileNotExistException extends Minz_Exception {
public function __construct ($file_name, $code = self::ERROR) {
$message = 'File not found: `' . $file_name.'`';
-
+
parent::__construct ($message, $code);
}
}
diff --git a/lib/Minz/FrontController.php b/lib/Minz/FrontController.php
index 952d983c9..066278b7c 100644
--- a/lib/Minz/FrontController.php
+++ b/lib/Minz/FrontController.php
@@ -119,12 +119,12 @@ class Minz_FrontController {
switch($conf->environment) {
case 'production':
error_reporting(E_ALL);
- ini_set('display_errors','Off');
+ ini_set('display_errors', 'Off');
ini_set('log_errors', 'On');
break;
case 'development':
error_reporting(E_ALL);
- ini_set('display_errors','On');
+ ini_set('display_errors', 'On');
ini_set('log_errors', 'On');
break;
case 'silent':
diff --git a/lib/Minz/Helper.php b/lib/Minz/Helper.php
index f4a547c4e..c328d9e6b 100644
--- a/lib/Minz/Helper.php
+++ b/lib/Minz/Helper.php
@@ -1,5 +1,5 @@
<?php
-/**
+/**
* MINZ - Copyright 2011 Marien Fressinaud
* Sous licence AGPL3 <http://www.gnu.org/licenses/>
*/
@@ -13,7 +13,7 @@ class Minz_Helper {
* @param $var variable à traiter (tableau ou simple variable)
*/
public static function stripslashes_r($var) {
- if (is_array($var)){
+ if (is_array($var)) {
return array_map(array('Minz_Helper', 'stripslashes_r'), $var);
} else {
return stripslashes($var);
diff --git a/lib/Minz/Model.php b/lib/Minz/Model.php
index adbaba942..1310888cf 100644
--- a/lib/Minz/Model.php
+++ b/lib/Minz/Model.php
@@ -1,5 +1,5 @@
<?php
-/**
+/**
* MINZ - Copyright 2011 Marien Fressinaud
* Sous licence AGPL3 <http://www.gnu.org/licenses/>
*/
diff --git a/lib/Minz/ModelArray.php b/lib/Minz/ModelArray.php
index ff23dbc83..1ac2b313d 100644
--- a/lib/Minz/ModelArray.php
+++ b/lib/Minz/ModelArray.php
@@ -25,8 +25,7 @@ class Minz_ModelArray {
protected function loadArray() {
if (!file_exists($this->filename)) {
throw new Minz_FileNotExistException($this->filename, Minz_Exception::WARNING);
- }
- elseif (($handle = $this->getLock()) === false) {
+ } elseif (($handle = $this->getLock()) === false) {
throw new Minz_PermissionDeniedException($this->filename);
} else {
$data = include($this->filename);
diff --git a/lib/Minz/ModelPdo.php b/lib/Minz/ModelPdo.php
index caab1d114..d769e0ff4 100644
--- a/lib/Minz/ModelPdo.php
+++ b/lib/Minz/ModelPdo.php
@@ -39,7 +39,7 @@ class Minz_ModelPdo {
if ($currentUser === null) {
$currentUser = Minz_Session::param('currentUser');
}
- if (self::$useSharedBd && self::$sharedBd != null &&
+ if (self::$useSharedBd && self::$sharedBd != null &&
($currentUser == null || $currentUser === self::$sharedCurrentUser)) {
$this->bd = self::$sharedBd;
$this->prefix = self::$sharedPrefix;
diff --git a/lib/Minz/PDOConnectionException.php b/lib/Minz/PDOConnectionException.php
index faf2e0fe9..064748708 100644
--- a/lib/Minz/PDOConnectionException.php
+++ b/lib/Minz/PDOConnectionException.php
@@ -3,7 +3,7 @@ class Minz_PDOConnectionException extends Minz_Exception {
public function __construct ($string_connection, $user, $code = self::ERROR) {
$message = 'Access to database is denied for `' . $user . '`'
. ' (`' . $string_connection . '`)';
-
+
parent::__construct ($message, $code);
}
}
diff --git a/lib/Minz/Paginator.php b/lib/Minz/Paginator.php
index 5858e76a5..795085a30 100644
--- a/lib/Minz/Paginator.php
+++ b/lib/Minz/Paginator.php
@@ -1,5 +1,5 @@
<?php
-/**
+/**
* MINZ - Copyright 2011 Marien Fressinaud
* Sous licence AGPL3 <http://www.gnu.org/licenses/>
*/
@@ -51,7 +51,7 @@ class Minz_Paginator {
*/
public function render ($view, $getteur) {
$view = APP_PATH . '/views/helpers/'.$view;
-
+
if (file_exists ($view)) {
include ($view);
}
@@ -129,7 +129,7 @@ class Minz_Paginator {
$begin = ($this->currentPage - 1) * $this->nbItemsPerPage;
$counter = 0;
$i = 0;
-
+
foreach ($this->items as $key => $item) {
if ($i >= $begin) {
$array[$key] = $item;
@@ -164,7 +164,7 @@ class Minz_Paginator {
if (is_array ($items)) {
$this->items = $items;
}
-
+
$this->_nbPage ();
}
public function _nbItemsPerPage ($nbItemsPerPage) {
diff --git a/lib/Minz/Translate.php b/lib/Minz/Translate.php
index baddcb424..d9cd59f7e 100644
--- a/lib/Minz/Translate.php
+++ b/lib/Minz/Translate.php
@@ -1,5 +1,5 @@
<?php
-/**
+/**
* MINZ - Copyright 2011 Marien Fressinaud
* Sous licence AGPL3 <http://www.gnu.org/licenses/>
*/
@@ -153,7 +153,7 @@ class Minz_Translate {
* @param additional parameters for variable keys.
* @return the value corresponding to the key.
* If no value is found, return the key itself.
- */
+ */
public static function t($key) {
$group = explode('.', $key);
diff --git a/lib/Minz/View.php b/lib/Minz/View.php
index 8c5230ab6..d6bf6ea2c 100644
--- a/lib/Minz/View.php
+++ b/lib/Minz/View.php
@@ -262,5 +262,3 @@ class Minz_View {
}
}
}
-
-
diff --git a/lib/favicons.php b/lib/favicons.php
index 48f7c9fda..a7ed966a1 100644
--- a/lib/favicons.php
+++ b/lib/favicons.php
@@ -16,6 +16,7 @@ function isImgMime($content) {
$isImage = strpos(finfo_buffer($fInfo, $content), 'image') !== false;
finfo_close($fInfo);
} catch (Exception $e) {
+ echo 'Caught exception: ', $e->getMessage(), "\n";
}
return $isImage;
}
diff --git a/lib/lib_date.php b/lib/lib_date.php
index 9533711e3..cb1f1d1e2 100644
--- a/lib/lib_date.php
+++ b/lib/lib_date.php
@@ -1,6 +1,6 @@
<?php
/**
- * Author: Alexandre Alapetite http://alexandre.alapetite.fr
+ * Author: Alexandre Alapetite https://alexandre.alapetite.fr
* 2014-06-01
* License: GNU AGPLv3 http://www.gnu.org/licenses/agpl-3.0.html
*
@@ -63,8 +63,7 @@ function _dateCeiling($isoDate) {
}
function _noDelimit($isoDate) {
- return $isoDate === null || $isoDate === '' ? null :
- str_replace(array('-', ':'), '', $isoDate); //FIXME: Bug with negative time zone
+ return $isoDate === null || $isoDate === '' ? null : str_replace(array('-', ':'), '', $isoDate); //FIXME: Bug with negative time zone
}
function _dateRelative($d1, $d2) {
diff --git a/lib/lib_install.php b/lib/lib_install.php
index bf81c15b4..7305d8e28 100644
--- a/lib/lib_install.php
+++ b/lib/lib_install.php
@@ -6,7 +6,7 @@ Minz_Configuration::register('default_system', join_path(FRESHRSS_PATH, 'config.
Minz_Configuration::register('default_user', join_path(FRESHRSS_PATH, 'config-user.default.php'));
function checkRequirements($dbType = '') {
- $php = version_compare(PHP_VERSION, '5.3.3') >= 0;
+ $php = version_compare(PHP_VERSION, '5.3.8') >= 0;
$minz = file_exists(join_path(LIB_PATH, 'Minz'));
$curl = extension_loaded('curl');
$pdo_mysql = extension_loaded('pdo_mysql');
@@ -68,8 +68,7 @@ function checkRequirements($dbType = '') {
'http_referer' => $http_referer ? 'ok' : 'ko',
'message' => $message ?: 'ok',
'all' => $php && $minz && $curl && $pdo && $pcre && $ctype && $dom && $xml &&
- $data && $cache && $users && $favicons && $http_referer && $message == '' ?
- 'ok' : 'ko'
+ $data && $cache && $users && $favicons && $http_referer && $message == '' ? 'ok' : 'ko'
);
}
diff --git a/lib/lib_rss.php b/lib/lib_rss.php
index 22136854e..09048700d 100644
--- a/lib/lib_rss.php
+++ b/lib/lib_rss.php
@@ -1,4 +1,8 @@
<?php
+if (version_compare(PHP_VERSION, '5.3.8', '<')) {
+ die('FreshRSS error: FreshRSS requires PHP 5.3.8+!');
+}
+
if (!function_exists('json_decode')) {
require_once('JSON.php');
function json_decode($var, $assoc = false) {
@@ -187,9 +191,9 @@ function customSimplePie() {
'onmouseover', 'onmousemove', 'onmouseout', 'onfocus', 'onblur',
'onkeypress', 'onkeydown', 'onkeyup', 'onselect', 'onchange', 'seamless', 'sizes', 'srcset')));
$simplePie->add_attributes(array(
- 'audio' => array('preload' => 'none'),
+ 'audio' => array('controls' => 'controls', 'preload' => 'none'),
'iframe' => array('sandbox' => 'allow-scripts allow-same-origin'),
- 'video' => array('preload' => 'none'),
+ 'video' => array('controls' => 'controls', 'preload' => 'none'),
));
$simplePie->set_url_replacements(array(
'a' => 'href',
@@ -344,6 +348,7 @@ function get_user_configuration($username) {
join_path(FRESHRSS_PATH, 'config-user.default.php'));
} catch (Minz_ConfigurationNamespaceException $e) {
// namespace already exists, do nothing.
+ Minz_Log::warning($e->getMessage());
} catch (Minz_FileNotExistException $e) {
Minz_Log::warning($e->getMessage());
return null;
@@ -362,6 +367,7 @@ function cryptAvailable() {
$hash = '$2y$04$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG';
return $hash === @crypt('password', $hash);
} catch (Exception $e) {
+ Minz_Log::warning($e->getMessage());
}
return false;
}
@@ -393,7 +399,7 @@ function check_install_php() {
$pdo_mysql = extension_loaded('pdo_mysql');
$pdo_sqlite = extension_loaded('pdo_sqlite');
return array(
- 'php' => version_compare(PHP_VERSION, '5.3.3') >= 0,
+ 'php' => version_compare(PHP_VERSION, '5.3.8') >= 0,
'minz' => file_exists(LIB_PATH . '/Minz'),
'curl' => extension_loaded('curl'),
'pdo' => $pdo_mysql || $pdo_sqlite,
diff --git a/p/api/greader.php b/p/api/greader.php
index e1f4202a7..b87fcc225 100644
--- a/p/api/greader.php
+++ b/p/api/greader.php
@@ -2,10 +2,10 @@
/**
== Description ==
Server-side API compatible with Google Reader API layer 2
- for the FreshRSS project http://freshrss.org
+ for the FreshRSS project https://freshrss.org
== Credits ==
-* 2014-03: Released by Alexandre Alapetite http://alexandre.alapetite.fr
+* 2014-03: Released by Alexandre Alapetite https://alexandre.alapetite.fr
under GNU AGPL 3 license http://www.gnu.org/licenses/agpl-3.0.html
== Documentation ==
@@ -23,7 +23,7 @@ Server-side API compatible with Google Reader API layer 2
require('../../constants.php');
require(LIB_PATH . '/lib_rss.php'); //Includes class autoloader
-$ORIGINAL_INPUT = file_get_contents('php://input', false, null, -1, 1048576);
+$ORIGINAL_INPUT = file_get_contents('php://input', false, null, 0, 1048576);
if (PHP_INT_SIZE < 8) { //32-bit
function dec2hex($dec) {
@@ -86,7 +86,7 @@ function debugInfo() {
if (function_exists('getallheaders')) {
$ALL_HEADERS = getallheaders();
} else { //nginx http://php.net/getallheaders#84262
- $ALL_HEADERS = '';
+ $ALL_HEADERS = array();
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) === 'HTTP_') {
$ALL_HEADERS[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
@@ -94,7 +94,16 @@ function debugInfo() {
}
}
global $ORIGINAL_INPUT;
- return print_r(array('date' => date('c'), 'headers' => $ALL_HEADERS, '_SERVER' => $_SERVER, '_GET' => $_GET, '_POST' => $_POST, '_COOKIE' => $_COOKIE, 'INPUT' => $ORIGINAL_INPUT), true);
+ return print_r(
+ array(
+ 'date' => date('c'),
+ 'headers' => $ALL_HEADERS,
+ '_SERVER' => $_SERVER,
+ '_GET' => $_GET,
+ '_POST' => $_POST,
+ '_COOKIE' => $_COOKIE,
+ 'INPUT' => $ORIGINAL_INPUT
+ ), true);
}
function badRequest() {
@@ -503,7 +512,7 @@ function streamContents($path, $include_target, $start_time, $count, $order, $ex
$item = array(
'id' => /*'tag:google.com,2005:reader/item/' .*/ dec2hex($entry->id()), //64-bit hexa http://code.google.com/p/google-reader-api/wiki/ItemId
'crawlTimeMsec' => substr($entry->id(), 0, -3),
- 'timestampUsec' => $entry->id(), //EasyRSS
+ 'timestampUsec' => '' . $entry->id(), //EasyRSS
'published' => $entry->date(true),
'title' => $entry->title(),
'summary' => array('content' => $entry->content()),
@@ -694,8 +703,8 @@ $pathInfo = empty($_SERVER['PATH_INFO']) ? '/Error' : urldecode($_SERVER['PATH_I
$pathInfos = explode('/', $pathInfo);
Minz_Configuration::register('system',
- DATA_PATH . '/config.php',
- FRESHRSS_PATH . '/config.default.php');
+ DATA_PATH . '/config.php',
+ FRESHRSS_PATH . '/config.default.php');
FreshRSS_Context::$system_conf = Minz_Configuration::get('system');
if (!FreshRSS_Context::$system_conf->api_enabled) {
serviceUnavailable();
@@ -715,24 +724,34 @@ Minz_Session::_param('currentUser', $user);
if (count($pathInfos) < 3) {
badRequest();
-}
-elseif ($pathInfos[1] === 'accounts') {
+} elseif ($pathInfos[1] === 'accounts') {
if (($pathInfos[2] === 'ClientLogin') && isset($_REQUEST['Email']) && isset($_REQUEST['Passwd'])) {
clientLogin($_REQUEST['Email'], $_REQUEST['Passwd']);
}
-}
-elseif ($pathInfos[1] === 'reader' && $pathInfos[2] === 'api' && isset($pathInfos[3]) && $pathInfos[3] === '0' && isset($pathInfos[4])) {
+} elseif ($pathInfos[1] === 'reader' && $pathInfos[2] === 'api' && isset($pathInfos[3]) && $pathInfos[3] === '0' && isset($pathInfos[4])) {
if ($user == '') {
unauthorized();
}
$timestamp = isset($_GET['ck']) ? intval($_GET['ck']) : 0; //ck=[unix timestamp] : Use the current Unix time here, helps Google with caching.
switch ($pathInfos[4]) {
case 'stream':
- $exclude_target = isset($_GET['xt']) ? $_GET['xt'] : ''; //xt=[exclude target] : Used to exclude certain items from the feed. For example, using xt=user/-/state/com.google/read will exclude items that the current user has marked as read, or xt=feed/[feedurl] will exclude items from a particular feed (obviously not useful in this request, but xt appears in other listing requests).
+ /* xt=[exclude target] : Used to exclude certain items from the feed.
+ * For example, using xt=user/-/state/com.google/read will exclude items
+ * that the current user has marked as read, or xt=feed/[feedurl] will
+ * exclude items from a particular feed (obviously not useful in this
+ * request, but xt appears in other listing requests). */
+ $exclude_target = isset($_GET['xt']) ? $_GET['xt'] : '';
$count = isset($_GET['n']) ? intval($_GET['n']) : 20; //n=[integer] : The maximum number of results to return.
$order = isset($_GET['r']) ? $_GET['r'] : 'd'; //r=[d|n|o] : Sort order of item results. d or n gives items in descending date order, o in ascending order.
- $start_time = isset($_GET['ot']) ? intval($_GET['ot']) : 0; //ot=[unix timestamp] : The time from which you want to retrieve items. Only items that have been crawled by Google Reader after this time will be returned.
- $continuation = isset($_GET['c']) ? $_GET['c'] : ''; //Continuation token. If a StreamContents response does not represent all items in a timestamp range, it will have a continuation attribute. The same request can be re-issued with the value of that attribute put in this parameter to get more items
+ /* ot=[unix timestamp] : The time from which you want to retrieve
+ * items. Only items that have been crawled by Google Reader after
+ * this time will be returned. */
+ $start_time = isset($_GET['ot']) ? intval($_GET['ot']) : 0;
+ /* Continuation token. If a StreamContents response does not represent
+ * all items in a timestamp range, it will have a continuation attribute.
+ * The same request can be re-issued with the value of that attribute put
+ * in this parameter to get more items */
+ $continuation = isset($_GET['c']) ? $_GET['c'] : '';
if (isset($pathInfos[5]) && $pathInfos[5] === 'contents' && isset($pathInfos[6])) {
if (isset($pathInfos[7])) {
if ($pathInfos[6] === 'feed') {
@@ -757,7 +776,10 @@ elseif ($pathInfos[1] === 'reader' && $pathInfos[2] === 'api' && isset($pathInfo
}
} elseif ($pathInfos[5] === 'items') {
if ($pathInfos[6] === 'ids' && isset($_GET['s'])) {
- $streamId = $_GET['s']; //StreamId for which to fetch the item IDs. The parameter may be repeated to fetch the item IDs from multiple streams at once (more efficient from a backend perspective than multiple requests).
+ /* StreamId for which to fetch the item IDs. The parameter may
+ * be repeated to fetch the item IDs from multiple streams at once
+ * (more efficient from a backend perspective than multiple requests). */
+ $streamId = $_GET['s'];
streamContentsItemsIds($streamId, $start_time, $count, $order, $exclude_target);
}
}
@@ -779,8 +801,12 @@ elseif ($pathInfos[1] === 'reader' && $pathInfos[2] === 'api' && isset($pathInfo
break;
case 'edit':
if (isset($_POST['s']) && isset($_POST['ac'])) {
- $streamNames = multiplePosts('s'); //StreamId to operate on. The parameter may be repeated to edit multiple subscriptions at once
- $titles = multiplePosts('t'); //Title to use for the subscription. For the `subscribe` action, if not specified then the feed's current title will be used. Can be used with the `edit` action to rename a subscription
+ //StreamId to operate on. The parameter may be repeated to edit multiple subscriptions at once
+ $streamNames = multiplePosts('s');
+ /* Title to use for the subscription. For the `subscribe` action,
+ * if not specified then the feed's current title will be used. Can
+ * be used with the `edit` action to rename a subscription */
+ $titles = multiplePosts('t');
$action = $_POST['ac']; //Action to perform on the given StreamId. Possible values are `subscribe`, `unsubscribe` and `edit`
$add = isset($_POST['a']) ? $_POST['a'] : ''; //StreamId to add the subscription to (generally a user label)
$remove = isset($_POST['r']) ? $_POST['r'] : ''; //StreamId to remove the subscription from (generally a user label)
diff --git a/p/api/index.php b/p/api/index.php
index 580c90255..08f7b6b7b 100644
--- a/p/api/index.php
+++ b/p/api/index.php
@@ -22,7 +22,8 @@ echo Minz_Url::display('/api/greader.php', 'html', true);
</dl>
<ul>
<li><a href="greader.php/check%2Fcompatibility" rel="nofollow">Check full server configuration</a></li>
-<li><a href="greader.php/check/compatibility" rel="nofollow">Check partial server configuration (without <code>%2F</code> support)</a></li>
+<li><a href="greader.php/check/compatibility" rel="nofollow">Check partial server
+configuration (without <code>%2F</code> support)</a></li>
</ul>
</body>
diff --git a/p/api/pshb.php b/p/api/pshb.php
index 4b546908a..ed8326cf5 100644
--- a/p/api/pshb.php
+++ b/p/api/pshb.php
@@ -11,7 +11,7 @@ function logMe($text) {
file_put_contents(USERS_PATH . '/_/log_pshb.txt', date('c') . "\t" . $text . "\n", FILE_APPEND);
}
-$ORIGINAL_INPUT = file_get_contents('php://input', false, null, -1, MAX_PAYLOAD);
+$ORIGINAL_INPUT = file_get_contents('php://input', false, null, 0, MAX_PAYLOAD);
//logMe(print_r(array('_SERVER' => $_SERVER, '_GET' => $_GET, '_POST' => $_POST, 'INPUT' => $ORIGINAL_INPUT), true));
diff --git a/p/scripts/category.js b/p/scripts/category.js
index fbcd83a01..caa4fa22f 100644
--- a/p/scripts/category.js
+++ b/p/scripts/category.js
@@ -92,7 +92,7 @@ function init_draggable() {
$.ajax({
type: 'POST',
url: './?c=feed&a=move',
- data : {
+ data: {
f_id: dragFeedId,
c_id: e.target.parentNode.getAttribute('data-cat-id'),
_csrf: context.csrf,
diff --git a/p/scripts/global_view.js b/p/scripts/global_view.js
index de0b9cb9f..c5aaa48b1 100644
--- a/p/scripts/global_view.js
+++ b/p/scripts/global_view.js
@@ -33,6 +33,9 @@ function load_panel(link) {
$.ajax({
type: "POST",
url: $(this).attr("formaction"),
+ data: {
+ _csrf: context.csrf,
+ },
async: false
});
window.location.reload(false);
diff --git a/p/scripts/main.js b/p/scripts/main.js
index 5be7bc36b..278ecfee9 100644
--- a/p/scripts/main.js
+++ b/p/scripts/main.js
@@ -1,6 +1,6 @@
"use strict";
-/* globals context, i18n, shortcut, shortcuts, url */
-/* jshint globalstrict: true */
+/* globals $, jQuery, context, i18n, shortcut, shortcuts, url */
+/* jshint strict:global */
var $stream = null,
isCollapsed = true,
@@ -133,7 +133,7 @@ function mark_read(active, only_not_read) {
$.ajax({
type: 'POST',
url: url,
- data : {
+ data: {
ajax: true,
_csrf: context.csrf,
},
@@ -182,7 +182,7 @@ function mark_favorite(active) {
$.ajax({
type: 'POST',
url: url,
- data : {
+ data: {
ajax: true,
_csrf: context.csrf,
},
@@ -227,6 +227,7 @@ function toggleContent(new_active, old_active) {
if (context.does_lazyload) {
new_active.find('img[data-original], iframe[data-original]').each(function () {
+ this.onload = function () { $(document.body).trigger("sticky_kit:recalc"); };
this.setAttribute('src', this.getAttribute('data-original'));
this.removeAttribute('data-original');
});
@@ -265,11 +266,9 @@ function toggleContent(new_active, old_active) {
new_pos += old_scroll;
}
- if (old_active[0] !== new_active[0]) {
- new_active.children(".flux_content").first().each(function () {
- box_to_move.scrollTop(new_pos).scrollTop();
- });
- }
+ new_active.children(".flux_content").first().each(function () {
+ box_to_move.scrollTop(new_pos).scrollTop();
+ });
} else {
if (relative_move) {
new_pos += old_scroll;
@@ -385,13 +384,8 @@ function last_category() {
}
function collapse_entry() {
- isCollapsed = !isCollapsed;
-
var flux_current = $(".flux.current");
- flux_current.toggleClass("active");
- if (isCollapsed && context.auto_mark_article) {
- mark_read(flux_current, true);
- }
+ toggleContent(flux_current, flux_current);
}
function user_filter(key) {
@@ -541,9 +535,18 @@ function init_column_categories() {
feed_web = $(this).data('fweb'),
template = $('#feed_config_template').html().replace(/------/g, feed_id).replace('http://example.net/', feed_web);
$(this).attr('href', '#dropdown-' + feed_id).prev('.dropdown-target').attr('id', 'dropdown-' + feed_id).parent().append(template);
+ $('.tree-folder-items .dropdown-close a').click(function(){
+ $('.tree').removeClass('treepadding');
+ $(document.body).trigger("sticky_kit:recalc");
+ });
}
});
+ $('.tree-folder-items .dropdown-toggle').click(function(){
+ $('.tree').addClass('treepadding');
+ $(document.body).trigger("sticky_kit:recalc");
+ });
+
init_sticky_column();
}
@@ -813,7 +816,7 @@ function updateFeed(feeds, feeds_count) {
$.ajax({
type: 'POST',
url: feed.url,
- data : {
+ data: {
_csrf: context.csrf,
noCommit: feeds.length > 0 ? 1 : 0,
},
@@ -850,7 +853,7 @@ function init_actualize() {
$.ajax({ //Empty request to force refresh server database cache
type: 'POST',
url: './?c=feed&a=actualize&id=-1',
- data : {
+ data: {
_csrf: context.csrf,
noCommit: 0,
},
@@ -1289,7 +1292,7 @@ function init_slider_observers() {
$.ajax({
type: 'GET',
url: url_slide,
- data : { ajax: true }
+ data: { ajax: true }
}).done(function (data) {
slider.html(data);
closer.addClass('active');
diff --git a/p/themes/base-theme/README.md b/p/themes/base-theme/README.md
index 9f7d635ca..632d11d05 100644
--- a/p/themes/base-theme/README.md
+++ b/p/themes/base-theme/README.md
@@ -1,7 +1,7 @@
FreshRSS-base-theme
===================
-A base theme for [FreshRSS](http://freshrss.org)
+A base theme for [FreshRSS](https://freshrss.org)
1. Custom ```base.css``` file with colors, backgrounds and borders
2. Change information in ```metadata.json``` file (at least, give a name!)
diff --git a/p/themes/base-theme/template.css b/p/themes/base-theme/template.css
index 277bb61b2..320ad2d9b 100644
--- a/p/themes/base-theme/template.css
+++ b/p/themes/base-theme/template.css
@@ -346,10 +346,15 @@ a.btn {
/*=== Tree */
.tree {
margin: 0;
- padding: 0 0 15em 0;
+ padding: 0 0 2em 0;
list-style: none;
text-align: left;
}
+
+.treepadding {
+ padding: 0 0 15em 0;
+}
+
.tree-folder-items {
padding: 0;
list-style: none;
@@ -830,6 +835,15 @@ input:checked + .slide-container .properties {
.no-mobile {
display: none;
}
+ .dropdown .dropdown-menu {
+ border-radius: 0;
+ bottom: 0;
+ position: fixed;
+ width: 100%;
+ }
+ .dropdown-menu::after {
+ display: none;
+ }
.aside .toggle_aside,
.nav-login {
display: block;
diff --git a/phpcs.xml b/phpcs.xml
new file mode 100644
index 000000000..5743466ec
--- /dev/null
+++ b/phpcs.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleset name="FreshRSS Ruleset">
+ <description>Created with the PHP Coding Standard Generator. http://edorian.github.com/php-coding-standard-generator/</description>
+ <!-- to circumvent https://github.com/squizlabs/PHP_CodeSniffer/pull/1404 -->
+ <!--<arg name="tab-width" value="10"/>-->
+ <exclude-pattern>./static</exclude-pattern>
+ <exclude-pattern>./vendor</exclude-pattern>
+ <exclude-pattern>./lib/SimplePie/</exclude-pattern>
+ <exclude-pattern>./lib/http-conditional.php</exclude-pattern>
+ <exclude-pattern>./lib/JSON.php</exclude-pattern>
+ <exclude-pattern>./lib/lib_phpQuery.php</exclude-pattern>
+ <exclude-pattern>./lib/password_compat.php</exclude-pattern>
+ <!-- Duplicate class names are not allowed -->
+ <rule ref="Generic.Classes.DuplicateClassName"/>
+ <!-- Statements must not be empty -->
+ <rule ref="Generic.CodeAnalysis.EmptyStatement"/>
+ <!-- Unconditional if-statements are not allowed -->
+ <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>
+ <!-- Do not use final statements inside final classes -->
+ <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
+ <!-- Do not override methods to call their parent -->
+ <rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>
+ <!-- One line should not have more than 80 characters -->
+ <!-- One line must never exceed 120 characters -->
+ <rule ref="Generic.Files.LineLength">
+ <!-- For language strings maximum line lengths make little sense. -->
+ <exclude-pattern>./app/i18n/</exclude-pattern>
+ <!-- Don't enforce line length on the HTML; the point is to improve legibility, not reduce it -->
+ <exclude-pattern>./app/install.php</exclude-pattern>
+ <!-- @todo remove test exclusion -->
+ <exclude-pattern>./tests/app/</exclude-pattern>
+ <!-- @todo remove SQL exclusion -->
+ <exclude-pattern>./app/SQL/install.sql.mysql.php</exclude-pattern>
+ <exclude-pattern>./app/SQL/install.sql.pgsql.php</exclude-pattern>
+ <properties>
+ <property name="lineLimit" value="80"/>
+ <property name="absoluteLineLimit" value="180"/>
+ </properties>
+ </rule>
+ <!-- When calling a function: -->
+ <!-- Do not add a space before the opening parenthesis -->
+ <!-- Do not add a space after the opening parenthesis -->
+ <!-- Do not add a space before the closing parenthesis -->
+ <!-- Do not add a space before a comma -->
+ <!-- Add a space after a comma -->
+ <rule ref="Generic.Functions.FunctionCallArgumentSpacing"/>
+ <rule ref="Generic.PHP.DisallowShortOpenTag" />
+ <rule ref="Generic.PHP.DeprecatedFunctions" />
+ <!-- Use UPPERCARE for constants -->
+ <rule ref="Generic.NamingConventions.UpperCaseConstantName"/>
+ <!-- Use lowercase for 'true', 'false' and 'null' -->
+ <rule ref="Generic.PHP.LowerCaseConstant"/>
+ <!-- Use a single string instead of concatenating -->
+ <rule ref="Generic.Strings.UnnecessaryStringConcat">
+ <properties>
+ <!-- Allow string concatenating across multiple lines -->
+ <property name="allowMultiline" value="true"/>
+ </properties>
+ </rule>
+ <!-- Use tabs for indentation -->
+ <rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/>
+ <!-- Parameters with default values must appear last in functions -->
+ <rule ref="PEAR.Functions.ValidDefaultValue"/>
+ <!-- Use 'elseif' instead of 'else if' -->
+ <rule ref="PSR2.ControlStructures.ElseIfDeclaration"/>
+ <!-- Do not add spaces after opening or before closing bracket -->
+ <rule ref="PSR2.ControlStructures.ControlStructureSpacing"/>
+ <!-- Add a new line at the end of a file -->
+ <rule ref="PSR2.Files.EndFileNewline"/>
+ <!-- Use Unix newlines -->
+ <rule ref="Generic.Files.LineEndings">
+ <properties>
+ <property name="eolChar" value="\n" />
+ </properties>
+ </rule>
+ <!-- Add space after closing parenthesis -->
+ <!-- Add body into new line -->
+ <!-- Close body in new line -->
+ <rule ref="Squiz.ControlStructures.ControlSignature">
+ <!-- No space after keyword (before opening parenthesis) -->
+ <exclude name="Squiz.ControlStructures.ControlSignature.SpaceAfterKeyword"/>
+ </rule>
+ <!-- When declaring a function: -->
+ <!-- Do not add a space before a comma -->
+ <!-- Add a space after a comma -->
+ <!-- Add a space before and after an equal sign -->
+ <rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing">
+ <properties>
+ <property name="equalsSpacing" value="1"/>
+ </properties>
+ </rule>
+ <!-- Do not add spaces when casting -->
+ <rule ref="Squiz.WhiteSpace.CastSpacing"/>
+ <!-- Operators must have a space around them -->
+ <rule ref="Squiz.WhiteSpace.OperatorSpacing"/>
+ <!-- Do not add a whitespace before a semicolon -->
+ <rule ref="Squiz.WhiteSpace.SemicolonSpacing"/>
+ <!-- Do not add whitespace at start or end of a file or end of a line -->
+ <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"/>
+</ruleset>
diff --git a/tests/app/Models/CategoryTest.php b/tests/app/Models/CategoryTest.php
index 2fd153aee..a1edb17b6 100644
--- a/tests/app/Models/CategoryTest.php
+++ b/tests/app/Models/CategoryTest.php
@@ -20,12 +20,12 @@ class FreshRSS_CategoryTest extends PHPUnit\Framework\TestCase {
public function provideValidNames() {
return array(
- array('', ''),
- array('this string does not need trimming', 'this string does not need trimming'),
- array(' this string needs trimming on left', 'this string needs trimming on left'),
- array('this string needs trimming on right ', 'this string needs trimming on right'),
- array(' this string needs trimming on both ends ', 'this string needs trimming on both ends'),
- array(str_repeat('This string needs to be shortened because its length is way too long. ', 4), str_repeat('This string needs to be shortened because its length is way too long. ', 3) . 'This string needs to be shortened because its'),
+ array('', ''),
+ array('this string does not need trimming', 'this string does not need trimming'),
+ array(' this string needs trimming on left', 'this string needs trimming on left'),
+ array('this string needs trimming on right ', 'this string needs trimming on right'),
+ array(' this string needs trimming on both ends ', 'this string needs trimming on both ends'),
+ array(str_repeat('This string needs to be shortened because its length is way too long. ', 4), str_repeat('This string needs to be shortened because its length is way too long. ', 3) . 'This string needs to be shortened because its'),
);
}
diff --git a/tests/app/Models/SearchTest.php b/tests/app/Models/SearchTest.php
index 4a7afc6f9..5c0469a48 100644
--- a/tests/app/Models/SearchTest.php
+++ b/tests/app/Models/SearchTest.php
@@ -28,8 +28,8 @@ class SearchTest extends PHPUnit\Framework\TestCase {
*/
public function provideEmptyInput() {
return array(
- array(''),
- array(null),
+ array(''),
+ array(null),
);
}
@@ -50,22 +50,22 @@ class SearchTest extends PHPUnit\Framework\TestCase {
*/
public function provideIntitleSearch() {
return array(
- array('intitle:word1', array('word1'), null),
- array('intitle:word1 word2', array('word1'), array('word2')),
- array('intitle:"word1 word2"', array('word1 word2'), null),
- array("intitle:'word1 word2'", array('word1 word2'), null),
- array('word1 intitle:word2', array('word2'), array('word1')),
- array('word1 intitle:word2 word3', array('word2'), array('word1', 'word3')),
- array('word1 intitle:"word2 word3"', array('word2 word3'), array('word1')),
- array("word1 intitle:'word2 word3'", array('word2 word3'), array('word1')),
- array('intitle:word1 intitle:word2', array('word1', 'word2'), null),
- array('intitle: word1 word2', array(), array('word1', 'word2')),
- array('intitle:123', array('123'), null),
- array('intitle:"word1 word2" word3"', array('word1 word2'), array('word3"')),
- array("intitle:'word1 word2' word3'", array('word1 word2'), array("word3'")),
- array('intitle:"word1 word2\' word3"', array("word1 word2' word3"), null),
- array("intitle:'word1 word2\" word3'", array('word1 word2" word3'), null),
- array("intitle:word1 'word2 word3' word4", array('word1'), array('word2 word3', 'word4')),
+ array('intitle:word1', array('word1'), null),
+ array('intitle:word1 word2', array('word1'), array('word2')),
+ array('intitle:"word1 word2"', array('word1 word2'), null),
+ array("intitle:'word1 word2'", array('word1 word2'), null),
+ array('word1 intitle:word2', array('word2'), array('word1')),
+ array('word1 intitle:word2 word3', array('word2'), array('word1', 'word3')),
+ array('word1 intitle:"word2 word3"', array('word2 word3'), array('word1')),
+ array("word1 intitle:'word2 word3'", array('word2 word3'), array('word1')),
+ array('intitle:word1 intitle:word2', array('word1', 'word2'), null),
+ array('intitle: word1 word2', array(), array('word1', 'word2')),
+ array('intitle:123', array('123'), null),
+ array('intitle:"word1 word2" word3"', array('word1 word2'), array('word3"')),
+ array("intitle:'word1 word2' word3'", array('word1 word2'), array("word3'")),
+ array('intitle:"word1 word2\' word3"', array("word1 word2' word3"), null),
+ array("intitle:'word1 word2\" word3'", array('word1 word2" word3'), null),
+ array("intitle:word1 'word2 word3' word4", array('word1'), array('word2 word3', 'word4')),
);
}
@@ -86,22 +86,22 @@ class SearchTest extends PHPUnit\Framework\TestCase {
*/
public function provideAuthorSearch() {
return array(
- array('author:word1', array('word1'), null),
- array('author:word1 word2', array('word1'), array('word2')),
- array('author:"word1 word2"', array('word1 word2'), null),
- array("author:'word1 word2'", array('word1 word2'), null),
- array('word1 author:word2', array('word2'), array('word1')),
- array('word1 author:word2 word3', array('word2'), array('word1', 'word3')),
- array('word1 author:"word2 word3"', array('word2 word3'), array('word1')),
- array("word1 author:'word2 word3'", array('word2 word3'), array('word1')),
- array('author:word1 author:word2', array('word1', 'word2'), null),
- array('author: word1 word2', array(), array('word1', 'word2')),
- array('author:123', array('123'), null),
- array('author:"word1 word2" word3"', array('word1 word2'), array('word3"')),
- array("author:'word1 word2' word3'", array('word1 word2'), array("word3'")),
- array('author:"word1 word2\' word3"', array("word1 word2' word3"), null),
- array("author:'word1 word2\" word3'", array('word1 word2" word3'), null),
- array("author:word1 'word2 word3' word4", array('word1'), array('word2 word3', 'word4')),
+ array('author:word1', array('word1'), null),
+ array('author:word1 word2', array('word1'), array('word2')),
+ array('author:"word1 word2"', array('word1 word2'), null),
+ array("author:'word1 word2'", array('word1 word2'), null),
+ array('word1 author:word2', array('word2'), array('word1')),
+ array('word1 author:word2 word3', array('word2'), array('word1', 'word3')),
+ array('word1 author:"word2 word3"', array('word2 word3'), array('word1')),
+ array("word1 author:'word2 word3'", array('word2 word3'), array('word1')),
+ array('author:word1 author:word2', array('word1', 'word2'), null),
+ array('author: word1 word2', array(), array('word1', 'word2')),
+ array('author:123', array('123'), null),
+ array('author:"word1 word2" word3"', array('word1 word2'), array('word3"')),
+ array("author:'word1 word2' word3'", array('word1 word2'), array("word3'")),
+ array('author:"word1 word2\' word3"', array("word1 word2' word3"), null),
+ array("author:'word1 word2\" word3'", array('word1 word2" word3'), null),
+ array("author:word1 'word2 word3' word4", array('word1'), array('word2 word3', 'word4')),
);
}
@@ -122,13 +122,13 @@ class SearchTest extends PHPUnit\Framework\TestCase {
*/
public function provideInurlSearch() {
return array(
- array('inurl:word1', array('word1'), null),
- array('inurl: word1', array(), array('word1')),
- array('inurl:123', array('123'), null),
- array('inurl:word1 word2', array('word1'), array('word2')),
- array('inurl:"word1 word2"', array('"word1'), array('word2"')),
- array('inurl:word1 word2 inurl:word3', array('word1', 'word3'), array('word2')),
- array("inurl:word1 'word2 word3' word4", array('word1'), array('word2 word3', 'word4')),
+ array('inurl:word1', array('word1'), null),
+ array('inurl: word1', array(), array('word1')),
+ array('inurl:123', array('123'), null),
+ array('inurl:word1 word2', array('word1'), array('word2')),
+ array('inurl:"word1 word2"', array('"word1'), array('word2"')),
+ array('inurl:word1 word2 inurl:word3', array('word1', 'word3'), array('word2')),
+ array("inurl:word1 'word2 word3' word4", array('word1'), array('word2 word3', 'word4')),
);
}
@@ -149,12 +149,12 @@ class SearchTest extends PHPUnit\Framework\TestCase {
*/
public function provideDateSearch() {
return array(
- array('date:2007-03-01T13:00:00Z/2008-05-11T15:30:00Z', '1172754000', '1210519800'),
- array('date:2007-03-01T13:00:00Z/P1Y2M10DT2H30M', '1172754000', '1210516199'),
- array('date:P1Y2M10DT2H30M/2008-05-11T15:30:00Z', '1172757601', '1210519800'),
- array('date:2007-03-01/2008-05-11', strtotime('2007-03-01'), strtotime('2008-05-12') - 1),
- array('date:2007-03-01/', strtotime('2007-03-01'), ''),
- array('date:/2008-05-11', '', strtotime('2008-05-12') - 1),
+ array('date:2007-03-01T13:00:00Z/2008-05-11T15:30:00Z', '1172754000', '1210519800'),
+ array('date:2007-03-01T13:00:00Z/P1Y2M10DT2H30M', '1172754000', '1210516199'),
+ array('date:P1Y2M10DT2H30M/2008-05-11T15:30:00Z', '1172757601', '1210519800'),
+ array('date:2007-03-01/2008-05-11', strtotime('2007-03-01'), strtotime('2008-05-12') - 1),
+ array('date:2007-03-01/', strtotime('2007-03-01'), ''),
+ array('date:/2008-05-11', '', strtotime('2008-05-12') - 1),
);
}
@@ -175,12 +175,12 @@ class SearchTest extends PHPUnit\Framework\TestCase {
*/
public function providePubdateSearch() {
return array(
- array('pubdate:2007-03-01T13:00:00Z/2008-05-11T15:30:00Z', '1172754000', '1210519800'),
- array('pubdate:2007-03-01T13:00:00Z/P1Y2M10DT2H30M', '1172754000', '1210516199'),
- array('pubdate:P1Y2M10DT2H30M/2008-05-11T15:30:00Z', '1172757601', '1210519800'),
- array('pubdate:2007-03-01/2008-05-11', strtotime('2007-03-01'), strtotime('2008-05-12') - 1),
- array('pubdate:2007-03-01/', strtotime('2007-03-01'), ''),
- array('pubdate:/2008-05-11', '', strtotime('2008-05-12') - 1),
+ array('pubdate:2007-03-01T13:00:00Z/2008-05-11T15:30:00Z', '1172754000', '1210519800'),
+ array('pubdate:2007-03-01T13:00:00Z/P1Y2M10DT2H30M', '1172754000', '1210516199'),
+ array('pubdate:P1Y2M10DT2H30M/2008-05-11T15:30:00Z', '1172757601', '1210519800'),
+ array('pubdate:2007-03-01/2008-05-11', strtotime('2007-03-01'), strtotime('2008-05-12') - 1),
+ array('pubdate:2007-03-01/', strtotime('2007-03-01'), ''),
+ array('pubdate:/2008-05-11', '', strtotime('2008-05-12') - 1),
);
}
@@ -201,13 +201,13 @@ class SearchTest extends PHPUnit\Framework\TestCase {
*/
public function provideTagsSearch() {
return array(
- array('#word1', array('word1'), null),
- array('# word1', array(), array('#', 'word1')),
- array('#123', array('123'), null),
- array('#word1 word2', array('word1'), array('word2')),
- array('#"word1 word2"', array('"word1'), array('word2"')),
- array('#word1 #word2', array('word1', 'word2'), null),
- array("#word1 'word2 word3' word4", array('word1'), array('word2 word3', 'word4')),
+ array('#word1', array('word1'), null),
+ array('# word1', array(), array('#', 'word1')),
+ array('#123', array('123'), null),
+ array('#word1 word2', array('word1'), array('word2')),
+ array('#"word1 word2"', array('"word1'), array('word2"')),
+ array('#word1 #word2', array('word1', 'word2'), null),
+ array("#word1 'word2 word3' word4", array('word1'), array('word2 word3', 'word4')),
);
}
@@ -240,54 +240,54 @@ class SearchTest extends PHPUnit\Framework\TestCase {
public function provideMultipleSearch() {
return array(
- array(
- 'author:word1 date:2007-03-01/2008-05-11 intitle:word2 inurl:word3 pubdate:2007-03-01/2008-05-11 #word4 #word5',
- array('word1'),
- strtotime('2007-03-01'),
- strtotime('2008-05-12') - 1,
- array('word2'),
- array('word3'),
- strtotime('2007-03-01'),
- strtotime('2008-05-12') - 1,
- array('word4', 'word5'),
- null,
- ),
- array(
- 'word6 intitle:word2 inurl:word3 pubdate:2007-03-01/2008-05-11 #word4 author:word1 #word5 date:2007-03-01/2008-05-11',
- array('word1'),
- strtotime('2007-03-01'),
- strtotime('2008-05-12') - 1,
- array('word2'),
- array('word3'),
- strtotime('2007-03-01'),
- strtotime('2008-05-12') - 1,
- array('word4', 'word5'),
- array('word6'),
- ),
- array(
- 'word6 intitle:word2 inurl:word3 pubdate:2007-03-01/2008-05-11 #word4 author:word1 #word5 word7 date:2007-03-01/2008-05-11',
- array('word1'),
- strtotime('2007-03-01'),
- strtotime('2008-05-12') - 1,
- array('word2'),
- array('word3'),
- strtotime('2007-03-01'),
- strtotime('2008-05-12') - 1,
- array('word4', 'word5'),
- array('word6', 'word7'),
- ),
- array(
- 'word6 intitle:word2 inurl:word3 pubdate:2007-03-01/2008-05-11 #word4 author:word1 #word5 "word7 word8" date:2007-03-01/2008-05-11',
- array('word1'),
- strtotime('2007-03-01'),
- strtotime('2008-05-12') - 1,
- array('word2'),
- array('word3'),
- strtotime('2007-03-01'),
- strtotime('2008-05-12') - 1,
- array('word4', 'word5'),
- array('word7 word8', 'word6'),
- ),
+ array(
+ 'author:word1 date:2007-03-01/2008-05-11 intitle:word2 inurl:word3 pubdate:2007-03-01/2008-05-11 #word4 #word5',
+ array('word1'),
+ strtotime('2007-03-01'),
+ strtotime('2008-05-12') - 1,
+ array('word2'),
+ array('word3'),
+ strtotime('2007-03-01'),
+ strtotime('2008-05-12') - 1,
+ array('word4', 'word5'),
+ null,
+ ),
+ array(
+ 'word6 intitle:word2 inurl:word3 pubdate:2007-03-01/2008-05-11 #word4 author:word1 #word5 date:2007-03-01/2008-05-11',
+ array('word1'),
+ strtotime('2007-03-01'),
+ strtotime('2008-05-12') - 1,
+ array('word2'),
+ array('word3'),
+ strtotime('2007-03-01'),
+ strtotime('2008-05-12') - 1,
+ array('word4', 'word5'),
+ array('word6'),
+ ),
+ array(
+ 'word6 intitle:word2 inurl:word3 pubdate:2007-03-01/2008-05-11 #word4 author:word1 #word5 word7 date:2007-03-01/2008-05-11',
+ array('word1'),
+ strtotime('2007-03-01'),
+ strtotime('2008-05-12') - 1,
+ array('word2'),
+ array('word3'),
+ strtotime('2007-03-01'),
+ strtotime('2008-05-12') - 1,
+ array('word4', 'word5'),
+ array('word6', 'word7'),
+ ),
+ array(
+ 'word6 intitle:word2 inurl:word3 pubdate:2007-03-01/2008-05-11 #word4 author:word1 #word5 "word7 word8" date:2007-03-01/2008-05-11',
+ array('word1'),
+ strtotime('2007-03-01'),
+ strtotime('2008-05-12') - 1,
+ array('word2'),
+ array('word3'),
+ strtotime('2007-03-01'),
+ strtotime('2008-05-12') - 1,
+ array('word4', 'word5'),
+ array('word7 word8', 'word6'),
+ ),
);
}
diff --git a/tests/app/Models/UserQueryTest.php b/tests/app/Models/UserQueryTest.php
index 5c12a12fc..1959fd492 100644
--- a/tests/app/Models/UserQueryTest.php
+++ b/tests/app/Models/UserQueryTest.php
@@ -33,14 +33,14 @@ class UserQueryTest extends PHPUnit\Framework\TestCase {
$category_name = 'some category name';
$cat = $this->getMock('FreshRSS_Category');
$cat->expects($this->atLeastOnce())
- ->method('name')
- ->withAnyParameters()
- ->willReturn($category_name);
+ ->method('name')
+ ->withAnyParameters()
+ ->willReturn($category_name);
$cat_dao = $this->getMock('FreshRSS_Searchable');
$cat_dao->expects($this->atLeastOnce())
- ->method('searchById')
- ->withAnyParameters()
- ->willReturn($cat);
+ ->method('searchById')
+ ->withAnyParameters()
+ ->willReturn($cat);
$query = array('get' => 'c_1');
$user_query = new FreshRSS_UserQuery($query, null, $cat_dao);
$this->assertEquals($category_name, $user_query->getGetName());
@@ -61,14 +61,14 @@ class UserQueryTest extends PHPUnit\Framework\TestCase {
$feed_name = 'some feed name';
$feed = $this->getMock('FreshRSS_Feed', array(), array('', false));
$feed->expects($this->atLeastOnce())
- ->method('name')
- ->withAnyParameters()
- ->willReturn($feed_name);
+ ->method('name')
+ ->withAnyParameters()
+ ->willReturn($feed_name);
$feed_dao = $this->getMock('FreshRSS_Searchable');
$feed_dao->expects($this->atLeastOnce())
- ->method('searchById')
- ->withAnyParameters()
- ->willReturn($feed);
+ ->method('searchById')
+ ->withAnyParameters()
+ ->willReturn($feed);
$query = array('get' => 'f_1');
$user_query = new FreshRSS_UserQuery($query, $feed_dao, null);
$this->assertEquals($feed_name, $user_query->getGetName());
@@ -118,12 +118,12 @@ class UserQueryTest extends PHPUnit\Framework\TestCase {
public function testToArray_whenData_returnsArray() {
$query = array(
- 'get' => 's',
- 'name' => 'some name',
- 'order' => 'some order',
- 'search' => 'some search',
- 'state' => 'some state',
- 'url' => 'some url',
+ 'get' => 's',
+ 'name' => 'some name',
+ 'order' => 'some order',
+ 'search' => 'some search',
+ 'state' => 'some state',
+ 'url' => 'some url',
);
$user_query = new FreshRSS_UserQuery($query);
$this->assertInternalType('array', $user_query->toArray());
@@ -133,7 +133,7 @@ class UserQueryTest extends PHPUnit\Framework\TestCase {
public function testHasSearch_whenSearch_returnsTrue() {
$query = array(
- 'search' => 'some search',
+ 'search' => 'some search',
);
$user_query = new FreshRSS_UserQuery($query);
$this->assertTrue($user_query->hasSearch());
@@ -166,9 +166,9 @@ class UserQueryTest extends PHPUnit\Framework\TestCase {
$cat = $this->getMock('FreshRSS_Category');
$cat_dao = $this->getMock('FreshRSS_Searchable');
$cat_dao->expects($this->atLeastOnce())
- ->method('searchById')
- ->withAnyParameters()
- ->willReturn($cat);
+ ->method('searchById')
+ ->withAnyParameters()
+ ->willReturn($cat);
$query = array('get' => 'c_1');
$user_query = new FreshRSS_UserQuery($query, null, $cat_dao);
$this->assertFalse($user_query->isDeprecated());
@@ -177,9 +177,9 @@ class UserQueryTest extends PHPUnit\Framework\TestCase {
public function testIsDeprecated_whenCategoryDoesNotExist_returnTrue() {
$cat_dao = $this->getMock('FreshRSS_Searchable');
$cat_dao->expects($this->atLeastOnce())
- ->method('searchById')
- ->withAnyParameters()
- ->willReturn(null);
+ ->method('searchById')
+ ->withAnyParameters()
+ ->willReturn(null);
$query = array('get' => 'c_1');
$user_query = new FreshRSS_UserQuery($query, null, $cat_dao);
$this->assertTrue($user_query->isDeprecated());
@@ -189,9 +189,9 @@ class UserQueryTest extends PHPUnit\Framework\TestCase {
$feed = $this->getMock('FreshRSS_Feed', array(), array('', false));
$feed_dao = $this->getMock('FreshRSS_Searchable');
$feed_dao->expects($this->atLeastOnce())
- ->method('searchById')
- ->withAnyParameters()
- ->willReturn($feed);
+ ->method('searchById')
+ ->withAnyParameters()
+ ->willReturn($feed);
$query = array('get' => 'f_1');
$user_query = new FreshRSS_UserQuery($query, $feed_dao, null);
$this->assertFalse($user_query->isDeprecated());
@@ -200,9 +200,9 @@ class UserQueryTest extends PHPUnit\Framework\TestCase {
public function testIsDeprecated_whenFeedDoesNotExist_returnTrue() {
$feed_dao = $this->getMock('FreshRSS_Searchable');
$feed_dao->expects($this->atLeastOnce())
- ->method('searchById')
- ->withAnyParameters()
- ->willReturn(null);
+ ->method('searchById')
+ ->withAnyParameters()
+ ->willReturn(null);
$query = array('get' => 'f_1');
$user_query = new FreshRSS_UserQuery($query, $feed_dao, null);
$this->assertTrue($user_query->isDeprecated());
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index 24340b15c..896929649 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -4,4 +4,4 @@ error_reporting(E_ALL);
ini_set('display_errors', 1);
require('../constants.php');
-require(LIB_PATH . '/lib_rss.php'); //Includes class autoloader \ No newline at end of file
+require(LIB_PATH . '/lib_rss.php'); //Includes class autoloader