diff options
| author | 2018-09-09 13:03:51 +0200 | |
|---|---|---|
| committer | 2018-09-09 13:03:51 +0200 | |
| commit | 44bd07e506ade204151c276fdc05994d51efdd7a (patch) | |
| tree | 2efe48133d2c874c65a99ae3a6cd92bb0dff4fe8 | |
| parent | 3306a1679c2570c30d4b662c887b4a71ce147398 (diff) | |
| parent | 1802c1e9ae7d3d55a0e37e1cc2e7c0acc25f70ba (diff) | |
Merge pull request #2001 from FreshRSS/dev1.11.2
FreshRSS 1.11.2
117 files changed, 514 insertions, 187 deletions
diff --git a/.travis.yml b/.travis.yml index 0217b61c5..24e0bf36b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,6 @@ php: - '7.1' - '7.2' - hhvm - - nightly install: # newest version without https://github.com/squizlabs/PHP_CodeSniffer/pull/1404 diff --git a/CHANGELOG.md b/CHANGELOG.md index 84ab9fc95..171943c2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ # FreshRSS changelog +## 2018-09-09 FreshRSS 1.11.2 + +* Features + * New menu to mark selected articles (view) as unread [#1966](https://github.com/FreshRSS/FreshRSS/issues/1966) + * Share with LinkedIn [#1960](https://github.com/FreshRSS/FreshRSS/pull/1960) +* Deployment + * Update Docker image to Alpine 3.8 with PHP 7.2 [#1956](https://github.com/FreshRSS/FreshRSS/pull/1956) +* Bug fixing + * Fix bugs when searching with special characters (e.g. preventing marking as read) [#1944](https://github.com/FreshRSS/FreshRSS/issues/1944) + * Avoid cutting in the middle of a multi-byte Unicode character [#1996](https://github.com/FreshRSS/FreshRSS/pull/1996) + * Fix username check in API to allow underscores [#1955](https://github.com/FreshRSS/FreshRSS/issues/1955) + * Fix Fever API to allow 32-bit architectures [#1962](https://github.com/FreshRSS/FreshRSS/issues/1962) + * Fix CSS font bug for *Origine-compact* theme [#1990](https://github.com/FreshRSS/FreshRSS/issues/1990) + * Fix last user activity for SQLite and PostgreSQL [#2008](https://github.com/FreshRSS/FreshRSS/pull/2008) + * Fix article counts with SQLite [#2009](https://github.com/FreshRSS/FreshRSS/pull/2009) + * Fix some automatic URL generation cases [#1946](https://github.com/FreshRSS/FreshRSS/issues/1946) +* Security + * Avoid feed credentials in logs [#1949](https://github.com/FreshRSS/FreshRSS/pull/1949) +* UI + * Improved mark-as-read the bottom articles during scrolling [#1973](https://github.com/FreshRSS/FreshRSS/issues/1973) + * Show all authors for articles with multiple authors [#1968](https://github.com/FreshRSS/FreshRSS/issues/1968) +* I18n + * Updated Korean [#1985](https://github.com/FreshRSS/FreshRSS/pull/1985) +* Mics. + * Auto-login after self user creation [#1928](https://github.com/FreshRSS/FreshRSS/issues/1928) + * Better test if server has public address [#2010](https://github.com/FreshRSS/FreshRSS/pull/2010) + * Allow `-` in database name at install time [#2005](https://github.com/FreshRSS/FreshRSS/pull/2005) + + ## 2018-06-16 FreshRSS 1.11.1 * Features diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 133813711..df56fad76 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,19 +1,18 @@ # How to contribute to FreshRSS? -## Join us on the mailing lists +## Chat with us -Do you want to ask us some questions? Do you want to discuss with us? Don't hesitate to subscribe to our mailing lists! +Do you want to ask us some questions? Do you want to discuss with us? +Don’t hesitate to [join our Mattermost chat](https://framateam.org/signup_user_complete/?id=e2680d3e3128b9fac8fdb3003b0024ee)! -- The first mailing is destined to generic information, it should be adapted to users. [Join mailing@freshrss.org](https://freshrss.org/mailman/listinfo/mailing). -- The second mailing is mainly for developers. [Join dev@freshrss.org](https://freshrss.org/mailman/listinfo/dev) ## Report a bug -You found a bug? Don't panic, here are some steps to report it easily: +You found a bug? Don’t panic, here are some steps to report it easily: -1. Search for it on [the bug tracker](https://github.com/FreshRSS/FreshRSS/issues) (don't forget to use the search bar). -2. If you find a similar bug, don't hesitate to post a comment to add more importance to the related ticket. -3. If you didn't find it, [open a new ticket](https://github.com/FreshRSS/FreshRSS/issues/new). +1. Search for it on [the bug tracker](https://github.com/FreshRSS/FreshRSS/issues) (don’t forget to use the search bar). +2. If you find a similar bug, don’t hesitate to post a comment to add more importance to the related ticket. +3. If you didn’t find it, [open a new ticket](https://github.com/FreshRSS/FreshRSS/issues/new). If you have to create a new ticket, try to apply the following advices: @@ -34,24 +33,24 @@ Did you want to fix a bug? To keep a great coordination between collaborators, y 3. [Create a new branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/). The name of the branch must be explicit and being prefixed by the related ticket id. For instance, `783-contributing-file` to fix [ticket #783](https://github.com/FreshRSS/FreshRSS/issues/783). 4. Make your changes to your fork and [send a pull request](https://help.github.com/articles/using-pull-requests/) on the **dev branch**. -If you have to write code, please follow [our coding style recommendations](http://doc2.freshrss.org/en/Developer_documentation/First_steps/Coding_style). +If you have to write code, please follow [our coding style recommendations](https://freshrss.github.io/FreshRSS/en/developers/01_First_steps.html). -**Tip:** if you are searching for bugs easy to fix, have a look at the « [New comers](https://github.com/FreshRSS/FreshRSS/labels/New%20comers) » ticket label. +**Tip:** if you are searching for bugs easy to fix, have a look at the « [Good first issue](https://github.com/FreshRSS/FreshRSS/issues?q=label%3A%22good+first+issue+%3Ababy%3A%22) » and/or « [Help wanted](https://github.com/FreshRSS/FreshRSS/issues?q=label%3A%22help+wanted+%3Aoctocat%3A%22) » ticket labels. ## Submit an idea You have great ideas, yes! Don't be shy and open [a new ticket](https://github.com/FreshRSS/FreshRSS/issues/new) on our bug tracker to ask if we can implement it. The greatest ideas often come from the shyest suggestions! -If your idea is nice, we'll have a look at it. +If your idea is nice, we’ll have a look at it. ## Contribute to internationalization (i18n) -If you want to improve internationalization, please open a new ticket first and follow indications from « Fix a bug » section. +If you want to improve internationalization, please open a new ticket first and follow indications from « Fix a bug » section. Translations are present in the subdirectories of `./app/i18n/`. -We are working on a better way to handle internationalization but don't hesitate to suggest any idea! +We are working on a better way to handle internationalization but don’t hesitate to suggest any idea! ## Contribute to documentation -The documentation needs a lot of improvements in order to be more useful to new contributors and we are working on it. If you want to give some help, meet us on [the dedicated repository](https://github.com/FreshRSS/documentation)! +[The documentation](https://freshrss.github.io/FreshRSS/) always needs improvements in order to be more useful to newcomers. If you want to give some help, meet us on [the dedicated sub-folder](https://github.com/FreshRSS/FreshRSS/tree/master/docs)! diff --git a/CREDITS.md b/CREDITS.md index 5307061db..d43c5a322 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -34,6 +34,7 @@ People are sorted by name so please keep this order. * [Julien Reichardt](https://github.com/j8r): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=j8r), [Web](https://blog.jrei.ch/) * [Kevin Papst](https://github.com/kevinpapst): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=kevinpapst), [Web](http://www.kevinpapst.de/) * [Luc Didry](https://github.com/ldidry): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=ldidry), [Web](https://www.fiat-tux.fr/) +* [Luc Sanchez](https://github.com/ColonelMoutarde): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=ColonelMoutarde), (https://www.luc-sanchez.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](https://marienfressinaud.fr/) @@ -47,6 +48,7 @@ People are sorted by name so please keep this order. * [perrinjerome](https://github.com/perrinjerome): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:perrinjerome) * [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) +* [primaeval](https://github.com/primaeval): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:primaeval) * [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) @@ -55,4 +57,5 @@ People are sorted by name so please keep this order. * [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) +* [Uncovery](https://github.com/uncovery): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:uncovery) * [Wanabo](https://github.com/Wanabo): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=Wanabo) diff --git a/Docker/Dockerfile b/Docker/Dockerfile index 189d7175a..cca7bb65e 100644 --- a/Docker/Dockerfile +++ b/Docker/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.7 +FROM alpine:3.8 RUN apk add --no-cache \ apache2 php7-apache2 \ diff --git a/Docker/README.md b/Docker/README.md index 133e7c3b8..f2aa3db20 100644 --- a/Docker/README.md +++ b/Docker/README.md @@ -20,7 +20,7 @@ git clone https://github.com/FreshRSS/FreshRSS.git cd ./FreshRSS/ git pull -sudo docker pull alpine:3.7 +sudo docker pull alpine:3.8 sudo docker build --tag freshrss/freshrss -f Docker/Dockerfile . ``` diff --git a/README.fr.md b/README.fr.md index 78a182d7b..ef1092e4a 100644 --- a/README.fr.md +++ b/README.fr.md @@ -37,7 +37,7 @@ Nous sommes une communauté amicale. * Serveur Web Apache2 (recommandé), ou nginx, lighttpd (non testé sur les autres) * 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](https://secure.php.net/curl), [DOM](https://secure.php.net/dom), [XML](https://secure.php.net/xml), [session](https://secure.php.net/session), [ctype](https://secure.php.net/ctype), et [PDO_MySQL](https://secure.php.net/pdo-mysql) ou [PDO_SQLite](https://secure.php.net/pdo-sqlite) ou [PDO_PGSQL](https://secure.php.net/pdo-pgsql) - * Recommandés : [JSON](https://secure.php.net/json), [GMP](https://secure.php.net/gmp) (pour accès API sur plateformes < 64 bits), [IDN](https://secure.php.net/intl.idn) (pour les noms de domaines internationalisés), [mbstring](https://secure.php.net/mbstring) et/ou [iconv](https://secure.php.net/iconv) (pour conversion d’encodages), [ZIP](https://secure.php.net/zip) (pour import/export), [zlib](https://secure.php.net/zlib) (pour les flux compressés) + * Recommandés : [JSON](https://secure.php.net/json), [GMP](https://secure.php.net/gmp) (pour accès API sur plateformes < 64 bits), [IDN](https://secure.php.net/intl.idn) (pour les noms de domaines internationalisés), [mbstring](https://secure.php.net/mbstring) (pour le texte Unicode), [iconv](https://secure.php.net/iconv) (pour conversion d’encodages), [ZIP](https://secure.php.net/zip) (pour import/export), [zlib](https://secure.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 que Firefox / IceCat, Internet Explorer 11 / Edge, Chromium / Chrome, Opera, Safari. * Fonctionne aussi sur mobile @@ -54,16 +54,15 @@ Nous sommes une communauté amicale. 4. Accédez à FreshRSS à travers votre navigateur Web et suivez les instructions d’installation * ou utilisez [l’interface en ligne de commande](cli/README.md) 5. Tout devrait fonctionner :) En cas de problème, n’hésitez pas à [nous contacter](https://github.com/FreshRSS/FreshRSS/issues). -6. Des paramètres de configuration avancée peuvent être vues dans [config.default.php](config.default.php) et modifiées dans `data/config.php`. +6. Des paramètres de configuration avancés peuvent être vus dans [config.default.php](config.default.php) et modifiés dans `data/config.php`. 7. Avec Apache, activer [`AllowEncodedSlashes`](https://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes) pour une meilleure compatibilité avec les clients mobiles. Plus d’informations sur l’installation et la configuration serveur peuvent être trouvées dans [notre documentation](https://freshrss.github.io/FreshRSS/fr/users/01_Installation.md). ## Installation automatisée -* [Docker](./Docker/) +* [](./Docker/) +* [](https://install-app.yunohost.org/?app=freshrss) * [](https://cloudron.io/button.html?app=org.freshrss.cloudronapp) -* [](https://dfabric.github.io/DPlatform-ShellCore) -* [YunoHost](https://github.com/YunoHost-Apps/freshrss_ynh) ## Exemple d’installation complète sur Linux Debian/Ubuntu ```sh @@ -37,7 +37,7 @@ We are a friendly community. * A web server: Apache2 (recommended), nginx, lighttpd (not tested on others) * PHP 5.3.8+ (PHP 5.4+ recommended, and PHP 5.5+ for performance, and PHP 7 for even higher performance) * Required extensions: [cURL](https://secure.php.net/curl), [DOM](https://secure.php.net/dom), [XML](https://secure.php.net/xml), [session](https://secure.php.net/session), [ctype](https://secure.php.net/ctype), and [PDO_MySQL](https://secure.php.net/pdo-mysql) or [PDO_SQLite](https://secure.php.net/pdo-sqlite) or [PDO_PGSQL](https://secure.php.net/pdo-pgsql) - * Recommended extensions: [JSON](https://secure.php.net/json), [GMP](https://secure.php.net/gmp) (for API access on platforms < 64 bits), [IDN](https://secure.php.net/intl.idn) (for Internationalized Domain Names), [mbstring](https://secure.php.net/mbstring) and/or [iconv](https://secure.php.net/iconv) (for charset conversion), [ZIP](https://secure.php.net/zip) (for import/export), [zlib](https://secure.php.net/zlib) (for compressed feeds) + * Recommended extensions: [JSON](https://secure.php.net/json), [GMP](https://secure.php.net/gmp) (for API access on platforms < 64 bits), [IDN](https://secure.php.net/intl.idn) (for Internationalized Domain Names), [mbstring](https://secure.php.net/mbstring) (for Unicode strings), [iconv](https://secure.php.net/iconv) (for charset conversion), [ZIP](https://secure.php.net/zip) (for import/export), [zlib](https://secure.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 / IceCat, Internet Explorer 11 / Edge, Chromium / Chrome, Opera, Safari. * Works on mobile @@ -59,11 +59,10 @@ We are a friendly community. More information about installation and server configuration can be found in [our documentation](https://freshrss.github.io/FreshRSS/en/admins/02_Installation.html). -## Automated install -* [Docker](./Docker/) +## Automated install +* [](./Docker/) +* [](https://install-app.yunohost.org/?app=freshrss) * [](https://cloudron.io/button.html?app=org.freshrss.cloudronapp) -* [](https://dfabric.github.io/DPlatform-ShellCore) -* [YunoHost](https://github.com/YunoHost-Apps/freshrss_ynh) ## Example of full installation on Linux Debian/Ubuntu ```sh diff --git a/app/Controllers/entryController.php b/app/Controllers/entryController.php index 73e181b07..16a15c447 100755 --- a/app/Controllers/entryController.php +++ b/app/Controllers/entryController.php @@ -40,6 +40,7 @@ class FreshRSS_entry_Controller extends Minz_ActionController { $get = Minz_Request::param('get'); $next_get = Minz_Request::param('nextGet', $get); $id_max = Minz_Request::param('idMax', 0); + $is_read = (bool)(Minz_Request::param('is_read', true)); FreshRSS_Context::$search = new FreshRSS_BooleanSearch(Minz_Request::param('search', '')); FreshRSS_Context::$state = Minz_Request::param('state', 0); @@ -63,39 +64,38 @@ class FreshRSS_entry_Controller extends Minz_ActionController { if (!$get) { // No get? Mark all entries as read (from $id_max) - $entryDAO->markReadEntries($id_max); + $entryDAO->markReadEntries($id_max, $is_read); } else { $type_get = $get[0]; $get = substr($get, 2); switch($type_get) { case 'c': - $entryDAO->markReadCat($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state); + $entryDAO->markReadCat($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read); break; case 'f': - $entryDAO->markReadFeed($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state); + $entryDAO->markReadFeed($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read); break; case 's': - $entryDAO->markReadEntries($id_max, true, 0, FreshRSS_Context::$search); + $entryDAO->markReadEntries($id_max, true, 0, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read); break; case 'a': - $entryDAO->markReadEntries($id_max, false, 0, FreshRSS_Context::$search, FreshRSS_Context::$state); + $entryDAO->markReadEntries($id_max, false, 0, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read); break; } if ($next_get !== 'a') { // Redirect to the correct page (category, feed or starred) - // Not "a" because it is the default value if nothing is - // given. + // Not "a" because it is the default value if nothing is given. $params['get'] = $next_get; } } } else { - $is_read = (bool)(Minz_Request::param('is_read', true)); $entryDAO->markRead($id, $is_read); } if (!$this->ajax) { - Minz_Request::good(_t('feedback.sub.feed.marked_read'), array( + Minz_Request::good(_t($is_read ? 'feedback.sub.articles.marked_read' : 'feedback.sub.articles.marked_unread'), + array( 'c' => 'index', 'a' => 'index', 'params' => $params, @@ -186,7 +186,7 @@ class FreshRSS_entry_Controller extends Minz_ActionController { $nb = $entryDAO->cleanOldEntries($feed->id(), $date_min, $feed_history); if ($nb > 0) { $nb_total += $nb; - Minz_Log::debug($nb . ' old entries cleaned in feed [' . $feed->url() . ']'); + Minz_Log::debug($nb . ' old entries cleaned in feed [' . $feed->url(false) . ']'); } } } diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php index ec88156f9..2f7495884 100755 --- a/app/Controllers/feedController.php +++ b/app/Controllers/feedController.php @@ -295,12 +295,12 @@ class FreshRSS_feed_Controller extends Minz_ActionController { if ($feed->lastUpdate() + 10 >= $mtime) { continue; //Nothing newer from other users } - //Minz_Log::debug($feed->url() . ' was updated at ' . date('c', $mtime) . ' by another user'); + //Minz_Log::debug($feed->url(false) . ' was updated at ' . date('c', $mtime) . ' by another user'); //Will take advantage of the newer cache } if (!$feed->lock()) { - Minz_Log::notice('Feed already being actualized: ' . $feed->url()); + Minz_Log::notice('Feed already being actualized: ' . $feed->url(false)); continue; } @@ -351,7 +351,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController { //This entry already exists and is unchanged. TODO: Remove the test with the zero'ed hash in FreshRSS v1.3 $oldGuids[] = $entry->guid(); } else { //This entry already exists but has been updated - //Minz_Log::debug('Entry with GUID `' . $entry->guid() . '` updated in feed ' . $feed->url() . + //Minz_Log::debug('Entry with GUID `' . $entry->guid() . '` updated in feed ' . $feed->url(false) . //', old hash ' . $existingHash . ', new hash ' . $entry->hash()); $mark_updated_article_unread = $feed->attributes('mark_updated_article_unread') !== null ? ( $feed->attributes('mark_updated_article_unread') @@ -413,7 +413,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController { $entryDAO->updateLastSeen($feed->id(), $oldGuids, $mtime); } - if ($feed_history >= 0 && rand(0, 30) === 1) { + if ($feed_history >= 0 && mt_rand(0, 30) === 1) { // TODO: move this function in web cron when available (see entry::purge) // Remove old entries once in 30. if (!$entryDAO->inTransaction()) { @@ -425,8 +425,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController { max($feed_history, count($entries) + 10)); if ($nb > 0) { $needFeedCacheRefresh = true; - Minz_Log::debug($nb . ' old entries cleaned in feed [' . - $feed->url() . ']'); + Minz_Log::debug($nb . ' old entries cleaned in feed [' . $feed->url(false) . ']'); } } @@ -442,25 +441,25 @@ class FreshRSS_feed_Controller extends Minz_ActionController { if ($feed->selfUrl() !== $url) { //https://code.google.com/p/pubsubhubbub/wiki/MovingFeedsOrChangingHubs $selfUrl = checkUrl($feed->selfUrl()); if ($selfUrl) { - Minz_Log::debug('PubSubHubbub unsubscribe ' . $feed->url()); + Minz_Log::debug('PubSubHubbub unsubscribe ' . $feed->url(false)); if (!$feed->pubSubHubbubSubscribe(false)) { //Unsubscribe - Minz_Log::warning('Error while PubSubHubbub unsubscribing from ' . $feed->url()); + Minz_Log::warning('Error while PubSubHubbub unsubscribing from ' . $feed->url(false)); } $feed->_url($selfUrl, false); - Minz_Log::notice('Feed ' . $url . ' canonical address moved to ' . $feed->url()); + Minz_Log::notice('Feed ' . $url . ' canonical address moved to ' . $feed->url(false)); $feedDAO->updateFeed($feed->id(), array('url' => $feed->url())); } } } elseif ($feed->url() !== $url) { // HTTP 301 Moved Permanently - Minz_Log::notice('Feed ' . $url . ' moved permanently to ' . $feed->url()); + Minz_Log::notice('Feed ' . $url . ' moved permanently to ' . $feed->url(false)); $feedDAO->updateFeed($feed->id(), array('url' => $feed->url())); } $feed->faviconPrepare(); if ($pubsubhubbubEnabledGeneral && $feed->pubSubHubbubPrepare()) { - Minz_Log::notice('PubSubHubbub subscribe ' . $feed->url()); + Minz_Log::notice('PubSubHubbub subscribe ' . $feed->url(false)); if (!$feed->pubSubHubbubSubscribe(true)) { //Subscribe - Minz_Log::warning('Error while PubSubHubbub subscribing to ' . $feed->url()); + Minz_Log::warning('Error while PubSubHubbub subscribing to ' . $feed->url(false)); } } $feed->unlock(); diff --git a/app/Controllers/indexController.php b/app/Controllers/indexController.php index 8567b4657..ddffdba73 100755 --- a/app/Controllers/indexController.php +++ b/app/Controllers/indexController.php @@ -139,7 +139,7 @@ class FreshRSS_index_Controller extends Minz_ActionController { } // No layout for RSS output. - $this->view->url = empty($_SERVER['QUERY_STRING']) ? '' : '?' . $_SERVER['QUERY_STRING']; + $this->view->url = PUBLIC_TO_INDEX_PATH . '/' . (empty($_SERVER['QUERY_STRING']) ? '' : '?' . $_SERVER['QUERY_STRING']); $this->view->rss_title = FreshRSS_Context::$name . ' | ' . Minz_View::title(); $this->view->_useLayout(false); header('Content-Type: application/rss+xml; charset=utf-8'); diff --git a/app/Controllers/javascriptController.php b/app/Controllers/javascriptController.php index 6336106a9..9d7acf647 100755 --- a/app/Controllers/javascriptController.php +++ b/app/Controllers/javascriptController.php @@ -47,8 +47,8 @@ class FreshRSS_javascript_Controller extends Minz_ActionController { $this->view->salt1 = sprintf('$2a$%02d$', FreshRSS_user_Controller::BCRYPT_COST); $alphabet = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; for ($i = 22; $i > 0; $i--) { - $this->view->salt1 .= $alphabet[rand(0, 63)]; + $this->view->salt1 .= $alphabet[mt_rand(0, 63)]; } - $this->view->nonce = sha1(rand()); + $this->view->nonce = sha1(mt_rand()); } } diff --git a/app/Controllers/userController.php b/app/Controllers/userController.php index 47f0ecc62..75a4303d6 100644 --- a/app/Controllers/userController.php +++ b/app/Controllers/userController.php @@ -230,6 +230,17 @@ class FreshRSS_user_Controller extends Minz_ActionController { $_POST['new_user_passwordPlain'] = ''; invalidateHttpCache(); + // If the user has admin access, it means he's already logged in + // and we don't want to login with the new account. Otherwise, the + // user just created its account himself so he probably wants to + // get started immediately. + if ($ok && !FreshRSS_Auth::hasAccess('admin')) { + $user_conf = get_user_configuration($new_user_name); + Minz_Session::_param('currentUser', $new_user_name); + Minz_Session::_param('passwordHash', $user_conf->passwordHash); + FreshRSS_Auth::giveAccess(); + } + $notif = array( 'type' => $ok ? 'good' : 'bad', 'content' => _t('feedback.user.created' . (!$ok ? '.error' : ''), $new_user_name) diff --git a/app/FreshRSS.php b/app/FreshRSS.php index 25fd429a2..2bd5135a9 100644 --- a/app/FreshRSS.php +++ b/app/FreshRSS.php @@ -66,7 +66,7 @@ class FreshRSS extends Minz_FrontController { 403, array('error' => array( _t('feedback.access.denied'), - ' [HTTP_REFERER=' . htmlspecialchars($http_referer) . ']' + ' [HTTP_REFERER=' . htmlspecialchars($http_referer, ENT_NOQUOTES, 'UTF-8') . ']' )) ); } diff --git a/app/Models/Category.php b/app/Models/Category.php index 9a44a2d09..197faf942 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -68,7 +68,7 @@ class FreshRSS_Category extends Minz_Model { $this->id = $value; } public function _name($value) { - $this->name = substr(trim($value), 0, 255); + $this->name = mb_strcut(trim($value), 0, 255, 'UTF-8'); } public function _feeds($values) { if (!is_array($values)) { diff --git a/app/Models/CategoryDAO.php b/app/Models/CategoryDAO.php index ef2c402a0..cf6b3bae3 100644 --- a/app/Models/CategoryDAO.php +++ b/app/Models/CategoryDAO.php @@ -9,7 +9,7 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo implements FreshRSS_Searchable $stm = $this->bd->prepare($sql); $values = array( - substr($valuesTmp['name'], 0, 255), + mb_strcut($valuesTmp['name'], 0, 255, 'UTF-8'), ); if ($stm && $stm->execute($values)) { diff --git a/app/Models/Entry.php b/app/Models/Entry.php index 2b6059638..ccbad5724 100644 --- a/app/Models/Entry.php +++ b/app/Models/Entry.php @@ -31,6 +31,7 @@ class FreshRSS_Entry extends Minz_Model { $this->_isRead($is_read); $this->_isFavorite($is_favorite); $this->_feedId($feedId); + $tags = mb_strcut($tags, 0, 1023, 'UTF-8'); $this->_tags(preg_split('/[\s#]/', $tags)); $this->_guid($guid); } @@ -123,11 +124,11 @@ class FreshRSS_Entry extends Minz_Model { } public function _title($value) { $this->hash = null; - $this->title = $value; + $this->title = mb_strcut($value, 0, 255, 'UTF-8'); } public function _author($value) { $this->hash = null; - $this->author = $value; + $this->author = mb_strcut($value, 0, 255, 'UTF-8'); } public function _content($value) { $this->hash = null; diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php index 59f826c3e..f0e164995 100644 --- a/app/Models/EntryDAO.php +++ b/app/Models/EntryDAO.php @@ -160,9 +160,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $valuesTmp['guid'] = substr($valuesTmp['guid'], 0, 760); $valuesTmp['guid'] = safe_ascii($valuesTmp['guid']); $this->addEntryPrepared->bindParam(':guid', $valuesTmp['guid']); - $valuesTmp['title'] = substr($valuesTmp['title'], 0, 255); + $valuesTmp['title'] = mb_strcut($valuesTmp['title'], 0, 255, 'UTF-8'); $this->addEntryPrepared->bindParam(':title', $valuesTmp['title']); - $valuesTmp['author'] = substr($valuesTmp['author'], 0, 255); + $valuesTmp['author'] = mb_strcut($valuesTmp['author'], 0, 255, 'UTF-8'); $this->addEntryPrepared->bindParam(':author', $valuesTmp['author']); $this->addEntryPrepared->bindParam(':content', $valuesTmp['content']); $valuesTmp['link'] = substr($valuesTmp['link'], 0, 1023); @@ -176,7 +176,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $valuesTmp['is_favorite'] = $valuesTmp['is_favorite'] ? 1 : 0; $this->addEntryPrepared->bindParam(':is_favorite', $valuesTmp['is_favorite'], PDO::PARAM_INT); $this->addEntryPrepared->bindParam(':id_feed', $valuesTmp['id_feed'], PDO::PARAM_INT); - $valuesTmp['tags'] = substr($valuesTmp['tags'], 0, 1023); + $valuesTmp['tags'] = mb_strcut($valuesTmp['tags'], 0, 1023, 'UTF-8'); $this->addEntryPrepared->bindParam(':tags', $valuesTmp['tags']); if ($this->hasNativeHex()) { @@ -243,9 +243,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $valuesTmp['guid'] = substr($valuesTmp['guid'], 0, 760); $this->updateEntryPrepared->bindParam(':guid', $valuesTmp['guid']); - $valuesTmp['title'] = substr($valuesTmp['title'], 0, 255); + $valuesTmp['title'] = mb_strcut($valuesTmp['title'], 0, 255, 'UTF-8'); $this->updateEntryPrepared->bindParam(':title', $valuesTmp['title']); - $valuesTmp['author'] = substr($valuesTmp['author'], 0, 255); + $valuesTmp['author'] = mb_strcut($valuesTmp['author'], 0, 255, 'UTF-8'); $this->updateEntryPrepared->bindParam(':author', $valuesTmp['author']); $this->updateEntryPrepared->bindParam(':content', $valuesTmp['content']); $valuesTmp['link'] = substr($valuesTmp['link'], 0, 1023); @@ -258,7 +258,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $this->updateEntryPrepared->bindValue(':is_read', $valuesTmp['is_read'] ? 1 : 0, PDO::PARAM_INT); } $this->updateEntryPrepared->bindParam(':id_feed', $valuesTmp['id_feed'], PDO::PARAM_INT); - $valuesTmp['tags'] = substr($valuesTmp['tags'], 0, 1023); + $valuesTmp['tags'] = mb_strcut($valuesTmp['tags'], 0, 1023, 'UTF-8'); $this->updateEntryPrepared->bindParam(':tags', $valuesTmp['tags']); if ($this->hasNativeHex()) { @@ -437,7 +437,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { * @param integer $priorityMin * @return integer affected rows */ - public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0, $filters = null, $state = 0) { + public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0, $filters = null, $state = 0, $is_read = true) { FreshRSS_UserDAO::touch(); if ($idMax == 0) { $idMax = time() . '000000'; @@ -445,14 +445,14 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { } $sql = 'UPDATE `' . $this->prefix . 'entry` e INNER JOIN `' . $this->prefix . 'feed` f ON e.id_feed=f.id ' - . 'SET e.is_read=1 ' - . 'WHERE e.is_read=0 AND e.id <= ?'; + . 'SET e.is_read=? ' + . 'WHERE e.is_read <> ? AND e.id <= ?'; if ($onlyFavorites) { $sql .= ' AND e.is_favorite=1'; } elseif ($priorityMin >= 0) { $sql .= ' AND f.priority > ' . intval($priorityMin); } - $values = array($idMax); + $values = array($is_read ? 1 : 0, $is_read ? 1 : 0, $idMax); list($searchValues, $search) = $this->sqlListEntriesWhere('e.', $filters, $state); @@ -480,7 +480,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { * @param integer $idMax fail safe article ID * @return integer affected rows */ - public function markReadCat($id, $idMax = 0, $filters = null, $state = 0) { + public function markReadCat($id, $idMax = 0, $filters = null, $state = 0, $is_read = true) { FreshRSS_UserDAO::touch(); if ($idMax == 0) { $idMax = time() . '000000'; @@ -488,9 +488,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { } $sql = 'UPDATE `' . $this->prefix . 'entry` e INNER JOIN `' . $this->prefix . 'feed` f ON e.id_feed=f.id ' - . 'SET e.is_read=1 ' - . 'WHERE f.category=? AND e.is_read=0 AND e.id <= ?'; - $values = array($id, $idMax); + . 'SET e.is_read=? ' + . 'WHERE f.category=? AND e.is_read <> ? AND e.id <= ?'; + $values = array($is_read ? 1 : 0, $id, $is_read ? 1 : 0, $idMax); list($searchValues, $search) = $this->sqlListEntriesWhere('e.', $filters, $state); @@ -518,7 +518,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { * @param integer $idMax fail safe article ID * @return integer affected rows */ - public function markReadFeed($id_feed, $idMax = 0, $filters = null, $state = 0) { + public function markReadFeed($id_feed, $idMax = 0, $filters = null, $state = 0, $is_read = true) { FreshRSS_UserDAO::touch(); if ($idMax == 0) { $idMax = time() . '000000'; @@ -527,9 +527,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $this->bd->beginTransaction(); $sql = 'UPDATE `' . $this->prefix . 'entry` ' - . 'SET is_read=1 ' - . 'WHERE id_feed=? AND is_read=0 AND id <= ?'; - $values = array($id_feed, $idMax); + . 'SET is_read=? ' + . 'WHERE id_feed=? AND is_read <> ? AND id <= ?'; + $values = array($is_read ? 1 : 0, $id_feed, $is_read ? 1 : 0, $idMax); list($searchValues, $search) = $this->sqlListEntriesWhere('', $filters, $state); @@ -909,6 +909,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $stm = $this->bd->prepare($sql); $stm->execute(); $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); + rsort($res); $all = empty($res[0]) ? 0 : $res[0]; $unread = empty($res[1]) ? 0 : $res[1]; return array('all' => $all, 'unread' => $unread, 'read' => $all - $unread); @@ -963,6 +964,7 @@ SQL; $stm = $this->bd->prepare($sql); $stm->execute(array(':priority_normal' => FreshRSS_Feed::PRIORITY_NORMAL)); $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); + rsort($res); $all = empty($res[0]) ? 0 : $res[0]; $unread = empty($res[1]) ? 0 : $res[1]; return array('all' => $all, 'unread' => $unread, 'read' => $all - $unread); diff --git a/app/Models/EntryDAOSQLite.php b/app/Models/EntryDAOSQLite.php index cca970e36..944de8470 100644 --- a/app/Models/EntryDAOSQLite.php +++ b/app/Models/EntryDAOSQLite.php @@ -101,6 +101,7 @@ DROP TABLE IF EXISTS `tmp`; * @return integer affected rows */ public function markRead($ids, $is_read = true) { + FreshRSS_UserDAO::touch(); if (is_array($ids)) { //Many IDs at once (used by API) if (true) { //Speed heuristics //TODO: Not implemented yet for SQLite (so always call IDs one by one) $affected = 0; @@ -159,19 +160,20 @@ DROP TABLE IF EXISTS `tmp`; * @param integer $priorityMin * @return integer affected rows */ - public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0, $filters = null, $state = 0) { + public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0, $filters = null, $state = 0, $is_read = true) { + FreshRSS_UserDAO::touch(); if ($idMax == 0) { $idMax = time() . '000000'; Minz_Log::debug('Calling markReadEntries(0) is deprecated!'); } - $sql = 'UPDATE `' . $this->prefix . 'entry` SET is_read=1 WHERE is_read=0 AND id <= ?'; + $sql = 'UPDATE `' . $this->prefix . 'entry` SET is_read = ? WHERE is_read <> ? AND id <= ?'; if ($onlyFavorites) { $sql .= ' AND is_favorite=1'; } elseif ($priorityMin >= 0) { $sql .= ' AND id_feed IN (SELECT f.id FROM `' . $this->prefix . 'feed` f WHERE f.priority > ' . intval($priorityMin) . ')'; } - $values = array($idMax); + $values = array($is_read ? 1 : 0, $is_read ? 1 : 0, $idMax); list($searchValues, $search) = $this->sqlListEntriesWhere('', $filters, $state); @@ -199,17 +201,18 @@ DROP TABLE IF EXISTS `tmp`; * @param integer $idMax fail safe article ID * @return integer affected rows */ - public function markReadCat($id, $idMax = 0, $filters = null, $state = 0) { + public function markReadCat($id, $idMax = 0, $filters = null, $state = 0, $is_read = true) { + FreshRSS_UserDAO::touch(); if ($idMax == 0) { $idMax = time() . '000000'; Minz_Log::debug('Calling markReadCat(0) is deprecated!'); } $sql = 'UPDATE `' . $this->prefix . 'entry` ' - . 'SET is_read=1 ' - . 'WHERE is_read=0 AND id <= ? AND ' + . 'SET is_read = ? ' + . 'WHERE is_read <> ? AND id <= ? AND ' . 'id_feed IN (SELECT f.id FROM `' . $this->prefix . 'feed` f WHERE f.category=?)'; - $values = array($idMax, $id); + $values = array($is_read ? 1 : 0, $is_read ? 1 : 0, $idMax, $id); list($searchValues, $search) = $this->sqlListEntriesWhere('', $filters, $state); diff --git a/app/Models/Feed.php b/app/Models/Feed.php index 89eb0a53c..ed381a867 100644 --- a/app/Models/Feed.php +++ b/app/Models/Feed.php @@ -59,8 +59,8 @@ class FreshRSS_Feed extends Minz_Model { return $this->hash; } - public function url() { - return $this->url; + public function url($includeCredentials = true) { + return $includeCredentials ? $this->url : SimplePie_Misc::url_remove_credentials($this->url); } public function selfUrl() { return $this->selfUrl; @@ -341,7 +341,7 @@ class FreshRSS_Feed extends Minz_Model { foreach ($feed->get_items() as $item) { $title = html_only_entity_decode(strip_tags($item->get_title())); - $author = $item->get_author(); + $authors = $item->get_authors(); $link = $item->get_permalink(); $date = @strtotime($item->get_date()); @@ -409,12 +409,19 @@ class FreshRSS_Feed extends Minz_Model { $guid = $item->get_id(false, false); $hasUniqueGuids &= empty($guids['_' . $guid]); $guids['_' . $guid] = true; + $author_names = ''; + if (is_array($authors)) { + foreach ($authors as $author) { + $author_names .= html_only_entity_decode(strip_tags($author->name == '' ? $author->email : $author->name)) . ', '; + } + } + $author_names = substr($author_names, 0, -2); $entry = new FreshRSS_Entry( $this->id(), $guid, $title === null ? '' : $title, - $author === null ? '' : html_only_entity_decode(strip_tags($author->name == null ? $author->email : $author->name)), + $author_names, $content === null ? '' : $content, $link === null ? '' : $link, $date ? $date : time() diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php index 9d980c139..285f17193 100644 --- a/app/Models/FeedDAO.php +++ b/app/Models/FeedDAO.php @@ -55,9 +55,9 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $values = array( substr($valuesTmp['url'], 0, 511), $valuesTmp['category'], - substr($valuesTmp['name'], 0, 255), + mb_strcut($valuesTmp['name'], 0, 255, 'UTF-8'), substr($valuesTmp['website'], 0, 255), - substr($valuesTmp['description'], 0, 1023), + mb_strcut($valuesTmp['description'], 0, 1023, 'UTF-8'), $valuesTmp['lastUpdate'], base64_encode($valuesTmp['httpAuth']), FreshRSS_Feed::KEEP_HISTORY_DEFAULT, diff --git a/app/i18n/cz/admin.php b/app/i18n/cz/admin.php index d414ffd07..78a4a52e4 100644 --- a/app/i18n/cz/admin.php +++ b/app/i18n/cz/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Instalace souborů', 'json' => array( - 'nok' => 'Nemáte JSON (balíček php5-json).', + 'nok' => 'Nemáte JSON (balíček php-json).', 'ok' => 'Máte rozšíření JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Nemáte framework Minz.', 'ok' => 'Máte framework Minz.', diff --git a/app/i18n/cz/feedback.php b/app/i18n/cz/feedback.php index ff9c87d12..fe85a3599 100644 --- a/app/i18n/cz/feedback.php +++ b/app/i18n/cz/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Aktualizovat', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Kategorie %s byla vytvořena.', 'deleted' => 'Kategorie byla smazána.', @@ -74,7 +78,6 @@ return array( 'error' => 'Kanál nelze aktualizovat', 'internal_problem' => 'RSS kanál nelze přidat. Pro detaily <a href="%s">zkontrolujte logy FreshRSS</a>.', // @todo 'invalid_url' => 'URL <em>%s</em> není platné', - 'marked_read' => 'Kanály byly označeny jako přečtené', 'n_actualized' => '%d kanálů bylo aktualizováno', 'n_entries_deleted' => '%d článků bylo smazáno', 'no_refresh' => 'Nelze obnovit žádné kanály…', diff --git a/app/i18n/cz/gen.php b/app/i18n/cz/gen.php index 09a8307ff..66c011da3 100644 --- a/app/i18n/cz/gen.php +++ b/app/i18n/cz/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/cz/index.php b/app/i18n/cz/index.php index cb0e5955d..48a28d4da 100644 --- a/app/i18n/cz/index.php +++ b/app/i18n/cz/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Označit vše jako přečtené', 'mark_cat_read' => 'Označit kategorii jako přečtenou', 'mark_feed_read' => 'Označit kanál jako přečtený', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Nové nejdříve', 'non-starred' => 'Zobrazit vše vyjma oblíbených', 'normal_view' => 'Normální', diff --git a/app/i18n/cz/install.php b/app/i18n/cz/install.php index ea4812ea5..acdb48ab6 100644 --- a/app/i18n/cz/install.php +++ b/app/i18n/cz/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'Pro parsování JSON chybí doporučená knihovna.', 'ok' => 'Máte doporučenou knihovnu pro parsování JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Nemáte framework Minz.', 'ok' => 'Máte framework Minz.', diff --git a/app/i18n/de/admin.php b/app/i18n/de/admin.php index f03e6cdaf..fbeb80296 100644 --- a/app/i18n/de/admin.php +++ b/app/i18n/de/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Datei-Installation', 'json' => array( - 'nok' => 'Ihnen fehlt die JSON-Erweiterung (Paket php5-json).', + 'nok' => 'Ihnen fehlt die JSON-Erweiterung (Paket php-json).', 'ok' => 'Sie haben die JSON-Erweiterung.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Ihnen fehlt das Minz-Framework.', 'ok' => 'Sie haben das Minz-Framework.', diff --git a/app/i18n/de/feedback.php b/app/i18n/de/feedback.php index 2c46bbe56..c20f58487 100644 --- a/app/i18n/de/feedback.php +++ b/app/i18n/de/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Aktualisieren', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Die Kategorie %s ist erstellt worden.', 'deleted' => 'Die Kategorie ist gelöscht worden.', @@ -74,7 +78,6 @@ return array( 'error' => 'Der Feed kann nicht aktualisiert werden', 'internal_problem' => 'Der RSS-Feed konnte nicht hinzugefügt werden. Für Details <a href="%s">prüfen Sie die FreshRSS-Protokolle</a>.', // @todo 'invalid_url' => 'Die URL <em>%s</em> ist ungültig', - 'marked_read' => 'Die Feeds sind als gelesen markiert worden', 'n_actualized' => 'Die %d Feeds sind aktualisiert worden', 'n_entries_deleted' => 'Die %d Artikel sind gelöscht worden', 'no_refresh' => 'Es gibt keinen Feed zum Aktualisieren…', diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php index 7dbaac384..eb1e74ed6 100644 --- a/app/i18n/de/gen.php +++ b/app/i18n/de/gen.php @@ -59,7 +59,7 @@ return array( 'april' => 'April', 'aug' => 'Aug', 'august' => 'August', - 'before_yesterday' => 'Vor vorgestern', + 'before_yesterday' => 'Ältere Beiträge', 'dec' => 'Dez', 'december' => 'Dezember', 'feb' => 'Feb', @@ -167,6 +167,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/de/index.php b/app/i18n/de/index.php index df92d8085..1fa3e3933 100644 --- a/app/i18n/de/index.php +++ b/app/i18n/de/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Alle als gelesen markieren', 'mark_cat_read' => 'Kategorie als gelesen markieren', 'mark_feed_read' => 'Feed als gelesen markieren', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Neuere zuerst', 'non-starred' => 'Alle außer Favoriten zeigen', 'normal_view' => 'Normale Ansicht', diff --git a/app/i18n/de/install.php b/app/i18n/de/install.php index b747d1551..d28b22840 100644 --- a/app/i18n/de/install.php +++ b/app/i18n/de/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'Ihnen fehlt eine empfohlene Bibliothek um JSON zu parsen.', 'ok' => 'Sie haben eine empfohlene Bibliothek um JSON zu parsen.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Ihnen fehlt das Minz-Framework.', 'ok' => 'Sie haben das Minz-Framework.', diff --git a/app/i18n/en/admin.php b/app/i18n/en/admin.php index 1f857dbab..9db14978f 100644 --- a/app/i18n/en/admin.php +++ b/app/i18n/en/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'File installation', 'json' => array( - 'nok' => 'Cannot find JSON (php5-json package).', + 'nok' => 'Cannot find JSON (php-json package).', 'ok' => 'You have JSON extension.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', + 'ok' => 'You have the recommended library mbstring for Unicode.', + ), 'minz' => array( 'nok' => 'Cannot find the Minz framework.', 'ok' => 'You have the Minz framework.', diff --git a/app/i18n/en/feedback.php b/app/i18n/en/feedback.php index a7fbda3a0..634b547f7 100644 --- a/app/i18n/en/feedback.php +++ b/app/i18n/en/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Updating', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', + 'marked_unread' => 'The articles have been marked as unread.', + ), 'category' => array( 'created' => 'Category %s has been created.', 'deleted' => 'Category has been deleted.', @@ -74,7 +78,6 @@ return array( 'error' => 'Feed cannot be updated', 'internal_problem' => 'The newsfeed could not be added. <a href="%s">Check FreshRSS logs</a> for details. You can try force adding by appending <code>#force_feed</code> to the URL.', 'invalid_url' => 'URL <em>%s</em> is invalid', - 'marked_read' => 'Feeds have been marked as read', 'n_actualized' => '%d feeds have been updated', 'n_entries_deleted' => '%d articles have been deleted', 'no_refresh' => 'There is no feed to refresh…', diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php index ceee25105..34e81af2e 100644 --- a/app/i18n/en/gen.php +++ b/app/i18n/en/gen.php @@ -168,6 +168,7 @@ return array( 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', 'Known' => 'Known based sites', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/en/index.php b/app/i18n/en/index.php index 29dccc9ed..1c13abdb7 100644 --- a/app/i18n/en/index.php +++ b/app/i18n/en/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Mark all as read', 'mark_cat_read' => 'Mark category as read', 'mark_feed_read' => 'Mark feed as read', + 'mark_selection_unread' => 'Mark selection as unread', 'newer_first' => 'Newer first', 'non-starred' => 'Show non-favourites', 'normal_view' => 'Normal view', diff --git a/app/i18n/en/install.php b/app/i18n/en/install.php index 40fff37dd..53d2f9be0 100644 --- a/app/i18n/en/install.php +++ b/app/i18n/en/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'Cannot find a recommended library to parse JSON.', 'ok' => 'You have a recommended library to parse JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Cannot find the Minz framework.', 'ok' => 'You have the Minz framework.', diff --git a/app/i18n/es/admin.php b/app/i18n/es/admin.php index 2884721c7..db41057bf 100755 --- a/app/i18n/es/admin.php +++ b/app/i18n/es/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Instalación de Archivos', 'json' => array( - 'nok' => 'No se ha podido localizar JSON (paquete php5-json).', + 'nok' => 'No se ha podido localizar JSON (paquete php-json).', 'ok' => 'Dispones de la extensión JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'No se ha podido localizar el entorno Minz.', 'ok' => 'Dispones del entorno Minz.', diff --git a/app/i18n/es/feedback.php b/app/i18n/es/feedback.php index 627c86afc..38548e901 100755 --- a/app/i18n/es/feedback.php +++ b/app/i18n/es/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Actualización', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Se ha creado la categoría %s.', 'deleted' => 'Se ha eliminado la categoría.', @@ -74,7 +78,6 @@ return array( 'error' => 'No es posible actualizar la fuente', 'internal_problem' => 'No ha sido posible agregar la fuente RSS. <a href="%s">Revisa el registro de FreshRSS </a> para más información.', // @todo '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…', diff --git a/app/i18n/es/gen.php b/app/i18n/es/gen.php index a5957e12f..4dc1145b2 100755 --- a/app/i18n/es/gen.php +++ b/app/i18n/es/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/es/index.php b/app/i18n/es/index.php index 03054e23a..c88152459 100755 --- a/app/i18n/es/index.php +++ b/app/i18n/es/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Marcar todo como leído', 'mark_cat_read' => 'Marcar categoría como leída', 'mark_feed_read' => 'Marcar fuente como leída', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Nuevos primero', 'non-starred' => 'Mostrar todos menos los favoritos', 'normal_view' => 'Vista normal', diff --git a/app/i18n/es/install.php b/app/i18n/es/install.php index cd6f63432..a9be807c7 100755 --- a/app/i18n/es/install.php +++ b/app/i18n/es/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'No se ha podido localizar la librería para procesar JSON.', 'ok' => 'Dispones de la librería recomendada para procesar JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'No se ha podido localizar el entorno Minz.', 'ok' => 'Dispones del entorno Minz.', diff --git a/app/i18n/fr/admin.php b/app/i18n/fr/admin.php index 6c582d719..1874f2c77 100644 --- a/app/i18n/fr/admin.php +++ b/app/i18n/fr/admin.php @@ -63,8 +63,12 @@ return array( ), 'files' => 'Installation des fichiers', 'json' => array( - 'nok' => 'Vous ne disposez pas de JSON (paquet php5-json).', - 'ok' => 'Vous disposez de l’extension JSON.', + 'nok' => 'Vous ne disposez pas de l’extension recommendée JSON (paquet php-json).', + 'ok' => 'Vous disposez de l’extension recommendée JSON.', + ), + 'mbstring' => array( + 'nok' => 'Impossible de trouver la librairie recommandée mbstring pour Unicode.', + 'ok' => 'Vouz disposez de la librairie recommandée mbstring pour Unicode.', ), 'minz' => array( 'nok' => 'Vous ne disposez pas de la librairie Minz.', diff --git a/app/i18n/fr/feedback.php b/app/i18n/fr/feedback.php index 2443ad30a..dafdd353d 100644 --- a/app/i18n/fr/feedback.php +++ b/app/i18n/fr/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Actualiser', + 'articles' => array( + 'marked_read' => 'Les articles sélectionnés ont été marqués comme lus.', + 'marked_unread' => 'Les articles sélectionnés ont été marqués comme non-lus.', + ), 'category' => array( 'created' => 'La catégorie %s a été créée.', 'deleted' => 'La catégorie a été supprimée.', @@ -74,7 +78,6 @@ return array( 'error' => 'Une erreur est survenue', 'internal_problem' => 'Le flux ne peut pas être ajouté. <a href="%s">Consulter les logs de FreshRSS</a> pour plus de détails. Vous pouvez essayer de forcer l’ajout par addition de <code>#force_feed</code> à l’URL.', 'invalid_url' => 'L’url <em>%s</em> est invalide.', - 'marked_read' => 'Les flux ont été marqués comme lus.', 'n_actualized' => '%d flux ont été mis à jour.', 'n_entries_deleted' => '%d articles ont été supprimés.', 'no_refresh' => 'Il n’y a aucun flux à actualiser…', diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php index 24c4b82fb..13e19283f 100644 --- a/app/i18n/fr/gen.php +++ b/app/i18n/fr/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/fr/index.php b/app/i18n/fr/index.php index 0a3a4abb3..bb0d14faf 100644 --- a/app/i18n/fr/index.php +++ b/app/i18n/fr/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Tout marquer comme lu', 'mark_cat_read' => 'Marquer la catégorie comme lue', 'mark_feed_read' => 'Marquer le flux comme lu', + 'mark_selection_unread' => 'Marquer la sélection comme non-lue', 'newer_first' => 'Plus récents en premier', 'non-starred' => 'Afficher les non-favoris', 'normal_view' => 'Vue normale', @@ -52,7 +53,7 @@ return array( 'starred' => 'Afficher les favoris', 'stats' => 'Statistiques', 'subscription' => 'Gestion des abonnements', - 'unread' => 'Afficher les non lus', + 'unread' => 'Afficher les non-lus', ), 'share' => 'Partager', 'tag' => array( diff --git a/app/i18n/fr/install.php b/app/i18n/fr/install.php index 09625de78..9f2d90195 100644 --- a/app/i18n/fr/install.php +++ b/app/i18n/fr/install.php @@ -65,8 +65,12 @@ return array( 'ok' => 'Le HTTP REFERER est connu et semble correspondre à votre serveur.', ), 'json' => array( - 'nok' => 'Impossible de trouver une librairie recommandée pour JSON.', - 'ok' => 'Vouz disposez de la librairie recommandée pour JSON.', + 'nok' => 'Vous ne disposez pas de l’extension recommendée JSON (paquet php-json).', + 'ok' => 'Vous disposez de l’extension recommendée JSON.', + ), + 'mbstring' => array( + 'nok' => 'Impossible de trouver la librairie recommandée mbstring pour Unicode.', + 'ok' => 'Vouz disposez de la librairie recommandée mbstring pour Unicode.', ), 'minz' => array( 'nok' => 'Vous ne disposez pas de la librairie Minz.', diff --git a/app/i18n/he/admin.php b/app/i18n/he/admin.php index 2840213c9..71f86357e 100644 --- a/app/i18n/he/admin.php +++ b/app/i18n/he/admin.php @@ -33,7 +33,7 @@ return array( 'ok' => 'הספרייה הנדרשת ל character type checking (ctype) מותקנת', ), 'curl' => array( - 'nok' => 'בURL לא מותקן (php5-curl package)', + 'nok' => 'בURL לא מותקן (php-curl package)', 'ok' => 'You have cURL extension.', // @todo ), 'data' => array( @@ -63,9 +63,13 @@ return array( ), 'files' => 'File installation', // @todo 'json' => array( - 'nok' => 'You lack JSON (php5-json package).', // @todo + 'nok' => 'You lack JSON (php-json package).', // @todo 'ok' => 'You have JSON extension.', // @todo ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'You lack the Minz framework.', // @todo 'ok' => 'יש לכם את תשתית Minz', @@ -97,7 +101,7 @@ return array( 'ok' => 'Permissions on users directory are good.', // @todo ), 'zip' => array( - 'nok' => 'You lack ZIP extension (php5-zip package).', // @todo + 'nok' => 'You lack ZIP extension (php-zip package).', // @todo 'ok' => 'You have ZIP extension.', // @todo ), ), diff --git a/app/i18n/he/feedback.php b/app/i18n/he/feedback.php index 4b79b0d45..369714795 100644 --- a/app/i18n/he/feedback.php +++ b/app/i18n/he/feedback.php @@ -53,6 +53,10 @@ return array( ), 'sub' => array( 'actualize' => 'מימוש', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Category %s has been created.', // @todo 'deleted' => 'Category has been deleted.', // @todo @@ -75,7 +79,6 @@ return array( 'error' => 'Feed cannot be updated', // @todo 'internal_problem' => 'אין אפשרות להוסיף את ההזנה. <a href="%s">בדקו את הלוגים</a> לפרטים.', // @todo 'invalid_url' => 'URL <em>%s</em> אינו תקין', - 'marked_read' => 'הזנות סומנו כנקראו', 'n_actualized' => '%d הזנות עודכנו', 'n_entries_deleted' => '%d המאמרים נמחקו', 'no_refresh' => 'אין הזנה שניתן לרענן…', diff --git a/app/i18n/he/gen.php b/app/i18n/he/gen.php index 401e13620..a59f6b178 100644 --- a/app/i18n/he/gen.php +++ b/app/i18n/he/gen.php @@ -168,6 +168,7 @@ return array( 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', 'Known' => 'Known based sites', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/he/index.php b/app/i18n/he/index.php index cef07eaf8..8ca6e76f7 100644 --- a/app/i18n/he/index.php +++ b/app/i18n/he/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'סימון הכל כנקרא', 'mark_cat_read' => 'סימון קטגוריה כנקראה', 'mark_feed_read' => 'סימון הזנה כנקראה', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'חדשים בראש', 'non-starred' => 'הצגת הכל פרט למועדפים', 'normal_view' => 'תצוגה רגילה', diff --git a/app/i18n/he/install.php b/app/i18n/he/install.php index 6d7cee661..93b8063b3 100644 --- a/app/i18n/he/install.php +++ b/app/i18n/he/install.php @@ -40,7 +40,7 @@ return array( 'ok' => 'הספרייה הנדרשת ל character type checking (ctype) מותקנת', ), 'curl' => array( - 'nok' => 'בURL לא מותקן (php5-curl package)', + 'nok' => 'בURL לא מותקן (php-curl package)', 'ok' => 'יש לכם את גירסת %s של cURL', ), 'data' => array( @@ -59,6 +59,14 @@ return array( 'nok' => 'נא לדבוק שאינך פוגעת ב HTTP REFERER שלך.', 'ok' => 'הHTTP REFERER ידוע ותאם לשרת שלך.', ), + 'json' => array( + 'nok' => 'Cannot find a recommended library to parse JSON.', //TODO + 'ok' => 'You have a recommended library to parse JSON.', //TODO + ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'You lack the Minz framework.', // @todo 'ok' => 'יש לכם את תשתית Minz', diff --git a/app/i18n/it/admin.php b/app/i18n/it/admin.php index a3034777f..5696ed571 100644 --- a/app/i18n/it/admin.php +++ b/app/i18n/it/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Installazione files', 'json' => array( - 'nok' => 'Manca il supoorto a JSON (pacchetto php5-json).', + 'nok' => 'Manca il supoorto a JSON (pacchetto php-json).', 'ok' => 'Estensione JSON presente.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Manca il framework Minz.', 'ok' => 'Framework Minz presente.', diff --git a/app/i18n/it/feedback.php b/app/i18n/it/feedback.php index 934666aa5..b0f3a814a 100644 --- a/app/i18n/it/feedback.php +++ b/app/i18n/it/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Aggiorna', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Categoria %s creata.', 'deleted' => 'Categoria cancellata', @@ -74,7 +78,6 @@ return array( 'error' => 'Feed non aggiornato', 'internal_problem' => 'RSS feed non aggiunto. <a href="%s">Verifica i logs</a> per dettagli.', // @todo 'invalid_url' => 'URL <em>%s</em> non valido', - 'marked_read' => 'Feeds segnati come letti', 'n_actualized' => '%d feeds aggiornati', 'n_entries_deleted' => '%d articoli cancellati', 'no_refresh' => 'Nessun aggiornamento disponibile…', diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php index b2e007bce..2a90693f9 100644 --- a/app/i18n/it/gen.php +++ b/app/i18n/it/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/it/index.php b/app/i18n/it/index.php index d79502c79..718093327 100644 --- a/app/i18n/it/index.php +++ b/app/i18n/it/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Segna tutto come letto', 'mark_cat_read' => 'Segna la categoria come letta', 'mark_feed_read' => 'Segna il feed come letto', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Mostra prima i recenti', 'non-starred' => 'Escludi preferiti', 'normal_view' => 'Vista elenco', diff --git a/app/i18n/it/install.php b/app/i18n/it/install.php index 18f8cc337..2d0a34885 100644 --- a/app/i18n/it/install.php +++ b/app/i18n/it/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'You lack a recommended library to parse JSON.', 'ok' => 'You have a recommended library to parse JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Manca il framework Minz.', 'ok' => 'Framework Minz presente.', diff --git a/app/i18n/kr/admin.php b/app/i18n/kr/admin.php index f9e9c9a8e..bc65b3fa2 100644 --- a/app/i18n/kr/admin.php +++ b/app/i18n/kr/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => '파일 시스템 설치 요구사항', 'json' => array( - 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php5-json 패키지).', + 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php-json 패키지).', 'ok' => 'JSON 확장 기능이 설치되어 있습니다.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Minz 프레임워크를 찾을 수 없습니다.', 'ok' => 'Minz 프레임워크가 설치되어 있습니다.', @@ -175,15 +179,15 @@ return array( 'user' => array( 'articles_and_size' => '%s 개의 글 (%s)', 'create' => '새 사용자 생성', - 'delete_users' => 'Delete user', // TODO + 'delete_users' => '사용자 삭제', 'language' => '언어', 'number' => '%d 개의 계정이 생성되었습니다', 'numbers' => '%d 개의 계정이 생성되었습니다', 'password_form' => '암호<br /><small>(웹폼 로그인 방식 사용시)</small>', 'password_format' => '7 글자 이상이어야 합니다', - 'selected' => 'Selected user', // TODO + 'selected' => '선택된 사용자', 'title' => '사용자 관리', - 'update_users' => 'Update user', // TODO + 'update_users' => '사용자 정보 변경', 'user_list' => '사용자 목록', 'username' => '사용자 이름', 'users' => '전체 사용자', diff --git a/app/i18n/kr/conf.php b/app/i18n/kr/conf.php index 558505973..f618d6c96 100644 --- a/app/i18n/kr/conf.php +++ b/app/i18n/kr/conf.php @@ -37,12 +37,12 @@ return array( 'no_limit' => '제한 없음', 'thin' => '얇음', ), - 'show_nav_buttons' => 'Show the navigation buttons', //TODO + 'show_nav_buttons' => '내비게이션 버튼 보이기', ), 'query' => array( '_' => '사용자 쿼리', 'deprecated' => '이 쿼리는 더 이상 유효하지 않습니다. 해당하는 카테고리나 피드가 삭제되었습니다.', - 'display' => 'Display user query results', // TODO + 'display' => '사용자 쿼리 결과 표시', 'filter' => '적용된 필터:', 'get_all' => '모든 글 표시', 'get_category' => '"%s" 카테고리 표시', @@ -53,7 +53,7 @@ return array( 'number' => '쿼리 #%d', 'order_asc' => '오래된 글 먼저 표시', 'order_desc' => '최근 글 먼저 표시', - 'remove' => 'Remove user query', // TODO + 'remove' => '사용자 쿼리 삭제', 'search' => '"%s"의 검색 결과', 'state_0' => '모든 글 표시', 'state_1' => '읽은 글 표시', @@ -128,7 +128,7 @@ return array( ), 'sharing' => array( '_' => '공유', - 'add' => 'Add a sharing method', // TODO + 'add' => '공유 방법 추가', 'blogotext' => 'Blogotext', 'diaspora' => 'Diaspora*', 'email' => '메일', @@ -136,7 +136,7 @@ return array( 'g+' => 'Google+', 'more_information' => '자세한 정보', 'print' => '인쇄', - 'remove' => 'Remove sharing method', // TODO + 'remove' => '공유 방법 삭제', 'shaarli' => 'Shaarli', 'share_name' => '표시할 이름', 'share_url' => '사용할 공유 URL', diff --git a/app/i18n/kr/feedback.php b/app/i18n/kr/feedback.php index f13675778..12cd673ff 100644 --- a/app/i18n/kr/feedback.php +++ b/app/i18n/kr/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => '피드를 가져오는 중입니다', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => '%s 카테고리가 생성되었습니다.', 'deleted' => '카테고리가 삭제되었습니다.', @@ -72,9 +76,8 @@ return array( 'already_subscribed' => '이미 <em>%s</em> 피드를 구독 중입니다', 'deleted' => '피드가 삭제되었습니다', 'error' => '피드를 변경할 수 없습니다', - 'internal_problem' => 'RSS 피드를 추가할 수 없습니다. 자세한 내용은 <a href="%s">FreshRSS 로그</a>를 참고하세요.', // @todo + 'internal_problem' => 'RSS 피드를 추가할 수 없습니다. 자세한 내용은 <a href="%s">FreshRSS 로그</a>를 참고하세요.', 'invalid_url' => 'URL (<em>%s</em>)이 유효하지 않습니다', - 'marked_read' => '피드가 읽음으로 표시되었습니다', 'n_actualized' => '%d 개의 피드에서 새 글을 가져왔습니다', 'n_entries_deleted' => '%d 개의 글을 삭제했습니다', 'no_refresh' => '새 글을 가져올 피드가 없습니다…', @@ -102,8 +105,8 @@ return array( 'error' => '%s 사용자를 삭제할 수 없습니다', ), 'updated' => array( - '_' => 'User %s has been updated', // TODO - 'error' => 'User %s has not been updated', // TODO + '_' => '사용자 %s의 정보가 변경되었습니다', + 'error' => '사용자 %s의 정보가 변경되지 않았습니다', ), ), 'profile' => array( diff --git a/app/i18n/kr/gen.php b/app/i18n/kr/gen.php index b40ab14c4..e664eaa42 100644 --- a/app/i18n/kr/gen.php +++ b/app/i18n/kr/gen.php @@ -19,7 +19,7 @@ return array( 'see_website' => '웹사이트 열기', 'submit' => '설정 저장', 'truncate' => '모든 글 삭제', - 'update' => 'Update', // TODO + 'update' => '변경', ), 'auth' => array( 'email' => '메일 주소', @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/kr/index.php b/app/i18n/kr/index.php index cc03f91c2..cb9684dff 100644 --- a/app/i18n/kr/index.php +++ b/app/i18n/kr/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => '모두 읽음으로 표시', 'mark_cat_read' => '카테고리를 읽음으로 표시', 'mark_feed_read' => '피드를 읽음으로 표시', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => '최근 글 먼저', 'non-starred' => '즐겨찾기를 제외하고 표시', 'normal_view' => '일반 모드', diff --git a/app/i18n/kr/install.php b/app/i18n/kr/install.php index 2eea71ff9..03a8ccdbe 100644 --- a/app/i18n/kr/install.php +++ b/app/i18n/kr/install.php @@ -65,9 +65,13 @@ return array( 'ok' => 'HTTP REFERER가 서버와 일치하는 것을 확인했습니다.', ), 'json' => array( - 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php5-json 패키지).', + 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php-json 패키지).', 'ok' => 'JSON 확장 기능이 설치되어 있습니다.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Minz 프레임워크를 찾을 수 없습니다.', 'ok' => 'Minz 프레임워크가 설치되어 있습니다.', diff --git a/app/i18n/kr/sub.php b/app/i18n/kr/sub.php index 464b64f70..de200c330 100644 --- a/app/i18n/kr/sub.php +++ b/app/i18n/kr/sub.php @@ -44,10 +44,10 @@ return array( 'main_stream' => '메인 스트림에 표시하기', 'normal' => '피드가 속한 카테고리에만 표시하기', ), - 'ssl_verify' => 'Verify SSL security', //TODO + 'ssl_verify' => 'SSL 유효성 검사', 'stats' => '통계', 'think_to_add' => '피드를 추가할 수 있습니다.', - 'timeout' => 'Timeout in seconds', //TODO + 'timeout' => '타임아웃 (초)', 'title' => '제목', 'title_add' => 'RSS 피드 추가', 'ttl' => '다음 시간이 지나기 전에 새로고침 금지', diff --git a/app/i18n/nl/admin.php b/app/i18n/nl/admin.php index a1d975305..f40db7bcb 100644 --- a/app/i18n/nl/admin.php +++ b/app/i18n/nl/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Bestanden installatie', 'json' => array( - 'nok' => 'U mist JSON (php5-json package).', + 'nok' => 'U mist JSON (php-json package).', 'ok' => 'U hebt JSON uitbreiding.', ), + 'mbstring' => array( + 'nok' => 'De voor Unicode aanbevolen bibliotheek mbstring kan niet worden gevonden.', + 'ok' => 'De voor Unicode aanbevolen bibliotheek mbstring is gevonden.', + ), 'minz' => array( 'nok' => 'U mist Minz framework.', 'ok' => 'U hebt Minz framework.', diff --git a/app/i18n/nl/feedback.php b/app/i18n/nl/feedback.php index e73f2f7bd..b16232b84 100644 --- a/app/i18n/nl/feedback.php +++ b/app/i18n/nl/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Actualiseren', + 'articles' => array( + 'marked_read' => 'De geselecteerde artikelen zijn als gelezen gemarkeerd.', + 'marked_unread' => 'De geselecteerde artikelen zijn als ongelezen gemarkeerd.', + ), 'category' => array( 'created' => 'Categorie %s is gemaakt.', 'deleted' => 'Categorie is verwijderd.', @@ -74,7 +78,6 @@ return array( 'error' => 'Feed kan niet worden vernieuwd', 'internal_problem' => 'De feed kon niet worden toegevoegd. <a href="%s">Controleer de FreshRSS-logbestanden</a> voor details. Toevoegen forceren kan worden geprobeerd door <code>#force_feed</code> aan de URL toe te voegen.', 'invalid_url' => 'URL <em>%s</em> is ongeldig', - 'marked_read' => 'Feeds zijn gemarkeerd als gelezen', 'n_actualized' => '%d feeds zijn vernieuwd', 'n_entries_deleted' => '%d artikelen zijn verwijderd', 'no_refresh' => 'Er is geen feed om te vernieuwen…', diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php index 683209cb9..ccbd86579 100644 --- a/app/i18n/nl/gen.php +++ b/app/i18n/nl/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/nl/index.php b/app/i18n/nl/index.php index e0184a0d0..67b3886ea 100644 --- a/app/i18n/nl/index.php +++ b/app/i18n/nl/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Markeer alles als gelezen', 'mark_cat_read' => 'Markeer categorie als gelezen', 'mark_feed_read' => 'Markeer feed als gelezen', + 'mark_selection_unread' => 'Markeer selectie als ongelezen', 'newer_first' => 'Nieuwste eerst', 'non-starred' => 'Laat alles zien behalve favorieten', 'normal_view' => 'Normale weergave', diff --git a/app/i18n/nl/install.php b/app/i18n/nl/install.php index 419ee4c9b..2d2f38913 100644 --- a/app/i18n/nl/install.php +++ b/app/i18n/nl/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'U mist een benodigede bibliotheek om JSON te gebruiken.', 'ok' => 'U hebt de benodigde bibliotheek om JSON te gebruiken.', ), + 'mbstring' => array( + 'nok' => 'De voor Unicode aanbevolen bibliotheek mbstring kan niet worden gevonden.', + 'ok' => 'De voor Unicode aanbevolen bibliotheek mbstring is gevonden.', + ), 'minz' => array( 'nok' => 'U mist het Minz framework.', 'ok' => 'U hebt het Minz framework.', diff --git a/app/i18n/pt-br/admin.php b/app/i18n/pt-br/admin.php index 16aa027a8..51c5d381f 100644 --- a/app/i18n/pt-br/admin.php +++ b/app/i18n/pt-br/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Instalação de arquivos', 'json' => array( - 'nok' => 'Não foi possível encontrar JSON (php5-json).', + 'nok' => 'Não foi possível encontrar JSON (php-json).', 'ok' => 'Você tem a extensão JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Não foi possível encontrar o framework Minz.', 'ok' => 'Você tem o framework Minz.', diff --git a/app/i18n/pt-br/feedback.php b/app/i18n/pt-br/feedback.php index 2057cf985..a2d66384e 100644 --- a/app/i18n/pt-br/feedback.php +++ b/app/i18n/pt-br/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Atualizando', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Categoria %s foi criada.', 'deleted' => 'Categoria foi deletada.', @@ -74,7 +78,6 @@ return array( 'error' => 'O feed não pode ser atualizado', 'internal_problem' => 'O RSS feed não pôde ser adicionado. <a href="%s">Verifique os FreshRSS logs</a> para detalhes.', // @todo '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…', diff --git a/app/i18n/pt-br/gen.php b/app/i18n/pt-br/gen.php index 932b6066d..558482f07 100644 --- a/app/i18n/pt-br/gen.php +++ b/app/i18n/pt-br/gen.php @@ -167,6 +167,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/pt-br/index.php b/app/i18n/pt-br/index.php index 610f00840..2eff8d948 100644 --- a/app/i18n/pt-br/index.php +++ b/app/i18n/pt-br/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Marcar todos como lidos', 'mark_cat_read' => 'Marcar categoria como lida', 'mark_feed_read' => 'Marcar feed com lido', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Novos primeiro', 'non-starred' => 'Mostrar todos, exceto favoritos', 'normal_view' => 'visualização normal', diff --git a/app/i18n/pt-br/install.php b/app/i18n/pt-br/install.php index 3ca5fb854..65bddf62c 100644 --- a/app/i18n/pt-br/install.php +++ b/app/i18n/pt-br/install.php @@ -65,9 +65,13 @@ return array( 'ok' => 'Seu HTTP REFERER é conhecido e corresponde ao seu servidor.', ), 'json' => array( - 'nok' => 'Não foi possível encontrar JSON (php5-json).', + 'nok' => 'Não foi possível encontrar JSON (php-json).', 'ok' => 'Você tem a extensão JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Não foi possível encontrar o framework Minz.', 'ok' => 'Você tem o framework Minz.', diff --git a/app/i18n/ru/admin.php b/app/i18n/ru/admin.php index 4f5e937d7..91da8adcf 100644 --- a/app/i18n/ru/admin.php +++ b/app/i18n/ru/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Установка файлов', 'json' => array( - 'nok' => 'У вас не установлена библиотека для работы с JSON (пакет php5-json).', + 'nok' => 'У вас не установлена библиотека для работы с JSON (пакет php-json).', 'ok' => 'У вас установлена библиотека для работы с JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'У вас не установлен фрейворк Minz.', 'ok' => 'У вас установлен фрейворк Minz.', diff --git a/app/i18n/ru/feedback.php b/app/i18n/ru/feedback.php index 6d4e5e3fe..693a40b34 100644 --- a/app/i18n/ru/feedback.php +++ b/app/i18n/ru/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Actualise', //TODO + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Category %s has been created.', //TODO 'deleted' => 'Category has been deleted.', //TODO @@ -74,7 +78,6 @@ return array( 'error' => 'Feed cannot be updated', //TODO 'internal_problem' => 'The newsfeed could not be added. <a href="%s">Check FreshRSS logs</a> for details. You can try force adding by appending <code>#force_feed</code> to the URL.', //TODO 'invalid_url' => 'URL <em>%s</em> is invalid', //TODO - 'marked_read' => 'Feeds have been marked as read', //TODO 'n_actualized' => '%d feeds have been updated', //TODO 'n_entries_deleted' => '%d articles have been deleted', //TODO 'no_refresh' => 'There is no feed to refresh…', //TODO diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php index ef9217d73..911410a1c 100644 --- a/app/i18n/ru/gen.php +++ b/app/i18n/ru/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/ru/index.php b/app/i18n/ru/index.php index eb6413e3c..9bb327786 100644 --- a/app/i18n/ru/index.php +++ b/app/i18n/ru/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Mark all as read', 'mark_cat_read' => 'Mark category as read', 'mark_feed_read' => 'Mark feed as read', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Newer first', 'non-starred' => 'Show all but favorites', 'normal_view' => 'Normal view', diff --git a/app/i18n/ru/install.php b/app/i18n/ru/install.php index 1dea2cd66..c1d0e81e8 100644 --- a/app/i18n/ru/install.php +++ b/app/i18n/ru/install.php @@ -64,6 +64,10 @@ return array( 'nok' => 'Убедитесь, что вы не изменяете ваш HTTP REFERER.', 'ok' => 'Ваш HTTP REFERER известен и соотвествует вашему серверу.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'У вас не установлен фрейворк Minz.', 'ok' => 'У вас установлен фрейворк Minz.', diff --git a/app/i18n/tr/admin.php b/app/i18n/tr/admin.php index f982bf644..f481bb294 100644 --- a/app/i18n/tr/admin.php +++ b/app/i18n/tr/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Dosya kurulumu', 'json' => array( - 'nok' => 'JSON eklentisi eksik (php5-json package).', + 'nok' => 'JSON eklentisi eksik (php-json package).', 'ok' => 'JSON eklentisi sorunsuz.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Minz framework eksik.', 'ok' => 'Minz framework sorunsuz.', diff --git a/app/i18n/tr/feedback.php b/app/i18n/tr/feedback.php index df7d1b264..278abe978 100644 --- a/app/i18n/tr/feedback.php +++ b/app/i18n/tr/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Güncelleme', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Kategori %s oluşturuldu.', 'deleted' => 'Kategori silindi.', @@ -74,7 +78,6 @@ return array( 'error' => 'Akış güncellenemiyor', 'internal_problem' => 'RSS akışı eklenemiyor. Detaylar için <a href="%s">FreshRSS log kayıtlarını</a> kontrol edin.', // @todo 'invalid_url' => 'URL <em>%s</em> geçersiz', - 'marked_read' => 'Akışlar okundu olarak işaretlendi', 'n_actualized' => '%d akışları güncellendi', 'n_entries_deleted' => '%d makaleleri silindi', 'no_refresh' => 'Yenilenecek akış yok…', diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php index d99081396..2e1761517 100644 --- a/app/i18n/tr/gen.php +++ b/app/i18n/tr/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/tr/index.php b/app/i18n/tr/index.php index cb36d6717..1357c05e7 100644 --- a/app/i18n/tr/index.php +++ b/app/i18n/tr/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Hepsini okundu olarak işaretle', 'mark_cat_read' => 'Kategoriyi okundu olarak işaretle', 'mark_feed_read' => 'Akışı okundu olarak işaretle', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Önce yeniler', 'non-starred' => 'Favori dışındakileri göster', 'normal_view' => 'Normal görünüm', diff --git a/app/i18n/tr/install.php b/app/i18n/tr/install.php index 4ae0ad7e3..f90e43f1d 100644 --- a/app/i18n/tr/install.php +++ b/app/i18n/tr/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'Tavsiye edilen JSON çözümleme kütüphanesi eksik.', 'ok' => 'Tavsiye edilen JSON çözümleme kütüphanesi sorunsuz.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Minz framework eksik.', 'ok' => 'Minz framework sorunsuz.', diff --git a/app/i18n/zh-cn/admin.php b/app/i18n/zh-cn/admin.php index 1072dc972..1f007f964 100644 --- a/app/i18n/zh-cn/admin.php +++ b/app/i18n/zh-cn/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => '文件相关', 'json' => array( - 'nok' => '找不到 JSON 扩展 (php5-json ) 。', + 'nok' => '找不到 JSON 扩展 (php-json ) 。', 'ok' => '已找到 JSON 扩展', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => '找不到 Minz 框架。', 'ok' => '已找到 Minz 框架。', diff --git a/app/i18n/zh-cn/feedback.php b/app/i18n/zh-cn/feedback.php index 1db879891..e9f7b4aac 100644 --- a/app/i18n/zh-cn/feedback.php +++ b/app/i18n/zh-cn/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => '获取', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => '分类 %s 已创建。', 'deleted' => '分类已删除。', @@ -74,7 +78,6 @@ return array( 'error' => 'RSS 源更新失败', 'internal_problem' => 'RSS 源添加失败。<a href="%s">检查 FreshRSS 日志</a> 查看详情。', // @todo 'invalid_url' => 'URL <em>%s</em> 无效', - 'marked_read' => 'RSS 源已被设为已读', 'n_actualized' => '%d 个 RSS 源已更新', 'n_entries_deleted' => '%d 篇文章已删除', 'no_refresh' => '没有可刷新的 RSS 源…', diff --git a/app/i18n/zh-cn/gen.php b/app/i18n/zh-cn/gen.php index 9289d8571..4ea2d73ab 100644 --- a/app/i18n/zh-cn/gen.php +++ b/app/i18n/zh-cn/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/zh-cn/index.php b/app/i18n/zh-cn/index.php index 6729524f5..2b76961ef 100644 --- a/app/i18n/zh-cn/index.php +++ b/app/i18n/zh-cn/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => '全部设为已读', 'mark_cat_read' => '此分类设为已读', 'mark_feed_read' => '此源设为已读', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => '由新到旧', 'non-starred' => '显示未收藏', 'normal_view' => '普通视图', diff --git a/app/i18n/zh-cn/install.php b/app/i18n/zh-cn/install.php index 1e172f0d5..fe34a44c0 100644 --- a/app/i18n/zh-cn/install.php +++ b/app/i18n/zh-cn/install.php @@ -68,6 +68,10 @@ return array( 'nok' => '找不到推荐的 JSON 解析库。', 'ok' => '已找到推荐的 JSON 解析库。', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => '找不到 Minz 框架。', 'ok' => '已找到 Minz 框架。', diff --git a/app/install.php b/app/install.php index c30f8d583..eec65be9c 100644 --- a/app/install.php +++ b/app/install.php @@ -462,6 +462,12 @@ function printStep1() { <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.xml.nok'); ?></p> <?php } ?> + <?php if ($res['mbstring'] == 'ok') { ?> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.mbstring.ok'); ?></p> + <?php } else { ?> + <p class="alert alert-warn"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.mbstring.nok'); ?></p> + <?php } ?> + <?php if ($res['fileinfo'] == 'ok') { ?> <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.fileinfo.ok'); ?></p> <?php } else { ?> @@ -645,7 +651,7 @@ function printStep3() { <div class="form-group"> <label class="group-name" for="base"><?php echo _t('install.bdd'); ?></label> <div class="group-controls"> - <input type="text" id="base" name="base" maxlength="64" pattern="[0-9A-Za-z_]{1,64}" value="<?php echo isset($_SESSION['bd_base']) ? $_SESSION['bd_base'] : ''; ?>" tabindex="5" /> + <input type="text" id="base" name="base" maxlength="64" pattern="[0-9A-Za-z_-]{1,64}" value="<?php echo isset($_SESSION['bd_base']) ? $_SESSION['bd_base'] : ''; ?>" tabindex="5" /> </div> </div> diff --git a/app/layout/header.phtml b/app/layout/header.phtml index e589ed7ef..e75a25efa 100644 --- a/app/layout/header.phtml +++ b/app/layout/header.phtml @@ -25,7 +25,8 @@ if (FreshRSS_Auth::accessNeedsAction()) { <?php if (FreshRSS_Auth::hasAccess() || FreshRSS_Context::$system_conf->allow_anonymous) { ?> <form action="<?php echo _url('index', 'index'); ?>" method="get"> <div class="stick"> - <input type="search" name="search" id="search" class="extend" value="<?php echo FreshRSS_Context::$search; ?>" placeholder="<?php echo _t('gen.menu.search'); ?>" /> + <input type="search" name="search" id="search" class="extend" value="<?php + echo htmlspecialchars(htmlspecialchars_decode(FreshRSS_Context::$search, ENT_QUOTES), ENT_COMPAT, 'UTF-8'); ?>" placeholder="<?php echo _t('gen.menu.search'); ?>" /> <?php $get = Minz_Request::param('get', ''); ?> <?php if ($get != '') { ?> diff --git a/app/layout/nav_menu.phtml b/app/layout/nav_menu.phtml index ab82c723f..88f882db9 100644 --- a/app/layout/nav_menu.phtml +++ b/app/layout/nav_menu.phtml @@ -62,9 +62,10 @@ <?php $get = FreshRSS_Context::currentGet(); $string_mark = _t('index.menu.mark_all_read'); - if ($get[0] == 'f') { + $string_unmark = _t('index.menu.mark_selection_unread'); + if ($get[0] === 'f') { $string_mark = _t('index.menu.mark_feed_read'); - } elseif ($get[0] == 'c') { + } elseif ($get[0] === 'c') { $string_mark = _t('index.menu.mark_cat_read'); } @@ -75,10 +76,14 @@ 'get' => $get, 'nextGet' => FreshRSS_Context::$next_get, 'idMax' => FreshRSS_Context::$id_max, - 'search' => FreshRSS_Context::$search, + 'search' => htmlspecialchars_decode(FreshRSS_Context::$search, ENT_QUOTES), 'state' => FreshRSS_Context::$state, - ) + ), ); + + $mark_unread_url = $mark_read_url; + $mark_unread_url['params']['is_read'] = false; + $mark_unread_url['params']['nextGet'] = $get; ?> <div class="stick" id="nav_menu_read_all"> @@ -110,6 +115,7 @@ $mark_before_today['params']['idMax'] = $today . '000000'; $mark_before_one_week = $mark_read_url; $mark_before_one_week['params']['idMax'] = ($today - 604800) . '000000'; + $mark_unread_enabled = FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_READ) or !FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_NOT_READ); ?> <li class="item"> <button class="as-link <?php echo $confirm; ?>" @@ -123,6 +129,13 @@ formaction="<?php echo Minz_Url::display($mark_before_one_week); ?>" type="submit"><?php echo _t('index.menu.before_one_week'); ?></button> </li> + <li class="separator"></li> + <li class="item"> + <button class="as-link <?php echo $mark_unread_enabled ? $confirm : '" disabled="disabled'; ?>" + form="mark-read-menu" + formaction="<?php echo Minz_Url::display($mark_unread_url); ?>" + type="submit"><?php echo $string_unmark; ?></button> + </li> </ul> </div> </form> @@ -162,7 +175,8 @@ <div class="item search"> <form action="<?php echo _url('index', 'index'); ?>" method="get"> - <input type="search" name="search" class="extend" value="<?php echo FreshRSS_Context::$search; ?>" placeholder="<?php echo _t('index.menu.search_short'); ?>" /> + <input type="search" name="search" class="extend" value="<?php + echo htmlspecialchars(htmlspecialchars_decode(FreshRSS_Context::$search, ENT_QUOTES), ENT_COMPAT, 'UTF-8'); ?>" placeholder="<?php echo _t('index.menu.search_short'); ?>" /> <?php $get = Minz_Request::param('get', ''); ?> <?php if($get != '') { ?> diff --git a/app/shares.php b/app/shares.php index 8c6b4eac6..55deed785 100644 --- a/app/shares.php +++ b/app/shares.php @@ -131,4 +131,10 @@ return array( 'form' => 'simple', 'method' => 'GET', ), + 'linkedin' => array( + 'url' => 'https://www.linkedin.com/shareArticle?url=~LINK~&title=~TITLE~&source=FreshRSS', + 'transform' => array('rawurlencode'), + 'form' => 'simple', + 'method' => 'GET', + ), ); diff --git a/app/views/helpers/export/opml.phtml b/app/views/helpers/export/opml.phtml index 236cca303..edb4d4eda 100644 --- a/app/views/helpers/export/opml.phtml +++ b/app/views/helpers/export/opml.phtml @@ -16,11 +16,11 @@ foreach ($this->categories as $key => $cat) { foreach ($cat['feeds'] as $feed) { $opml_array['body'][$key]['@outlines'][] = array( - 'text' => htmlspecialchars_decode($feed->name()), + 'text' => htmlspecialchars_decode($feed->name(), ENT_QUOTES), 'type' => 'rss', - 'xmlUrl' => htmlspecialchars_decode($feed->url()), - 'htmlUrl' => htmlspecialchars_decode($feed->website()), - 'description' => htmlspecialchars_decode($feed->description()), + 'xmlUrl' => htmlspecialchars_decode($feed->url(), ENT_QUOTES), + 'htmlUrl' => htmlspecialchars_decode($feed->website(), ENT_QUOTES), + 'description' => htmlspecialchars_decode($feed->description(), ENT_QUOTES), ); } } diff --git a/app/views/helpers/index/normal/entry_bottom.phtml b/app/views/helpers/index/normal/entry_bottom.phtml index 793c644f9..6417da4cb 100644 --- a/app/views/helpers/index/normal/entry_bottom.phtml +++ b/app/views/helpers/index/normal/entry_bottom.phtml @@ -81,7 +81,7 @@ <ul class="dropdown-menu"> <li class="dropdown-close"><a href="#close">❌</a></li><?php foreach($tags as $tag) { - ?><li class="item"><a href="<?php echo _url('index', 'index', 'search', '#' . htmlspecialchars_decode($tag)); ?>"><?php echo $tag; ?></a></li><?php + ?><li class="item"><a href="<?php echo _url('index', 'index', 'search', '#' . htmlspecialchars_decode($tag, ENT_QUOTES)); ?>"><?php echo $tag; ?></a></li><?php } ?> </ul> </div> diff --git a/app/views/helpers/javascript_vars.phtml b/app/views/helpers/javascript_vars.phtml index 1b9b614d2..d7b3e4360 100644 --- a/app/views/helpers/javascript_vars.phtml +++ b/app/views/helpers/javascript_vars.phtml @@ -56,4 +56,4 @@ echo htmlspecialchars(json_encode(array( 'icons' => array( 'close' => _i('close'), ), -), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES); +), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES, 'UTF-8'); diff --git a/app/views/helpers/pagination.phtml b/app/views/helpers/pagination.phtml index 893451af9..fc37ce3f5 100755 --- a/app/views/helpers/pagination.phtml +++ b/app/views/helpers/pagination.phtml @@ -11,7 +11,7 @@ 'get' => FreshRSS_Context::currentGet(), 'nextGet' => FreshRSS_Context::$next_get, 'idMax' => FreshRSS_Context::$id_max, - 'search' => FreshRSS_Context::$search, + 'search' => htmlspecialchars_decode(FreshRSS_Context::$search, ENT_QUOTES), 'state' => FreshRSS_Context::$state, ) ); diff --git a/app/views/stats/index.phtml b/app/views/stats/index.phtml index a36f812a8..2ff3e6c52 100644 --- a/app/views/stats/index.phtml +++ b/app/views/stats/index.phtml @@ -88,6 +88,6 @@ echo htmlspecialchars(json_encode(array( 'dataCount' => $this->count, 'feedByCategory' => $this->feedByCategory, 'entryByCategory' => $this->entryByCategory, -), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES); +), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES, 'UTF-8'); ?></script> <script src="../scripts/stats.js?<?php echo @filemtime(PUBLIC_PATH . '/scripts/stats.js'); ?>"></script> diff --git a/app/views/stats/repartition.phtml b/app/views/stats/repartition.phtml index 5ebcdce5a..4bce418c9 100644 --- a/app/views/stats/repartition.phtml +++ b/app/views/stats/repartition.phtml @@ -69,6 +69,6 @@ echo htmlspecialchars(json_encode(array( 'days' => $this->days, 'repartitionMonth' => $this->repartitionMonth, 'months' => $this->months, -), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES); +), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES, 'UTF-8'); ?></script> <script src="../scripts/repartition.js?<?php echo @filemtime(PUBLIC_PATH . '/scripts/repartition.js'); ?>"></script> diff --git a/cli/README.md b/cli/README.md index 0d1c0a7d4..c314bd388 100644 --- a/cli/README.md +++ b/cli/README.md @@ -35,7 +35,7 @@ cd /usr/share/FreshRSS ./cli/prepare.php # Ensure the needed directories in ./data/ -./cli/do-install.php --default_user admin ( --auth_type form --environment production --base_url https://rss.example.net/ --language en --title FreshRSS --allow_anonymous --api_enabled --db-type mysql --db-host localhost:3306 --db-user freshrss --db-password dbPassword123 --db-base freshrss --db-prefix freshrss ) +./cli/do-install.php --default_user admin ( --auth_type form --environment production --base_url https://rss.example.net --language en --title FreshRSS --allow_anonymous --api_enabled --db-type mysql --db-host localhost:3306 --db-user freshrss --db-password dbPassword123 --db-base freshrss --db-prefix freshrss ) # --auth_type can be: 'form' (default), 'http_auth' (using the Web server access control), 'none' (dangerous) # --db-type can be: 'sqlite' (default), 'mysql' (MySQL or MariaDB), 'pgsql' (PostgreSQL) # --base_url should be a public (routable) URL if possible, and is used for push (PubSubHubbub), for some API functions (e.g. favicons), and external URLs in FreshRSS. diff --git a/cli/do-install.php b/cli/do-install.php index 4ebba0469..7435ab9f1 100755 --- a/cli/do-install.php +++ b/cli/do-install.php @@ -33,7 +33,7 @@ $options = getopt('', array_merge($params, $dBparams)); if (empty($options['default_user'])) { fail('Usage: ' . basename(__FILE__) . " --default_user admin ( --auth_type form" . - " --environment production --base_url https://rss.example.net/" . + " --environment production --base_url https://rss.example.net" . " --language en --title FreshRSS --allow_anonymous --api_enabled" . " --db-type mysql --db-host localhost:3306 --db-user freshrss --db-password dbPassword123" . " --db-base freshrss --db-prefix freshrss_ --disable_update )"); diff --git a/constants.php b/constants.php index 7fedc0d59..2bd64708f 100644 --- a/constants.php +++ b/constants.php @@ -2,7 +2,7 @@ //NB: Do not edit; use ./constants.local.php instead. //<Not customisable> -define('FRESHRSS_VERSION', '1.11.1'); +define('FRESHRSS_VERSION', '1.11.2'); define('FRESHRSS_WEBSITE', 'https://freshrss.org'); define('FRESHRSS_WIKI', 'https://freshrss.github.io/FreshRSS/'); diff --git a/data/PubSubHubbub/feeds/index.html b/data/PubSubHubbub/feeds/index.html new file mode 100644 index 000000000..85faaa37e --- /dev/null +++ b/data/PubSubHubbub/feeds/index.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB"> +<head> +<meta charset="UTF-8" /> +<meta http-equiv="Refresh" content="0; url=/" /> +<title>Redirection</title> +<meta name="robots" content="noindex" /> +</head> + +<body> +<p><a href="/">Redirection</a></p> +</body> +</html> diff --git a/data/PubSubHubbub/index.html b/data/PubSubHubbub/index.html new file mode 100644 index 000000000..85faaa37e --- /dev/null +++ b/data/PubSubHubbub/index.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB"> +<head> +<meta charset="UTF-8" /> +<meta http-equiv="Refresh" content="0; url=/" /> +<title>Redirection</title> +<meta name="robots" content="noindex" /> +</head> + +<body> +<p><a href="/">Redirection</a></p> +</body> +</html> diff --git a/data/PubSubHubbub/keys/index.html b/data/PubSubHubbub/keys/index.html new file mode 100644 index 000000000..85faaa37e --- /dev/null +++ b/data/PubSubHubbub/keys/index.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB"> +<head> +<meta charset="UTF-8" /> +<meta http-equiv="Refresh" content="0; url=/" /> +<title>Redirection</title> +<meta name="robots" content="noindex" /> +</head> + +<body> +<p><a href="/">Redirection</a></p> +</body> +</html> diff --git a/data/users/_/index.html b/data/users/_/index.html new file mode 100644 index 000000000..85faaa37e --- /dev/null +++ b/data/users/_/index.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB"> +<head> +<meta charset="UTF-8" /> +<meta http-equiv="Refresh" content="0; url=/" /> +<title>Redirection</title> +<meta name="robots" content="noindex" /> +</head> + +<body> +<p><a href="/">Redirection</a></p> +</body> +</html> diff --git a/docs/fr/developers/01_First_steps.md b/docs/fr/developers/01_First_steps.md index 400523e23..d2bf9d315 100644 --- a/docs/fr/developers/01_First_steps.md +++ b/docs/fr/developers/01_First_steps.md @@ -4,11 +4,7 @@ ## Docker -L'image Docker contenant l'environnement de développement de FreshRSS est accessible via : - -`$ docker pull marienfressinaud/freshrss` - -Vous pouvez lire [le fichier README du dépôt dédié](https://github.com/FreshRSS/docker-freshrss). +Le développement et le deploiement de FreshRSS peuvent se faire [via Docker](https://github.com/FreshRSS/FreshRSS/tree/dev/Docker). # Architecture du projet diff --git a/lib/Minz/Url.php b/lib/Minz/Url.php index 99c0443c1..1c222ce25 100644 --- a/lib/Minz/Url.php +++ b/lib/Minz/Url.php @@ -27,6 +27,10 @@ class Minz_Url { $url_string = Minz_Request::getBaseUrl(); if ($url_string == '') { $url_string = Minz_Request::guessBaseUrl(); + if (PUBLIC_RELATIVE === '..') { + //TODO: Implement proper resolver of relative parts such as /test/./../ + $url_string = dirname($url_string); + } } if ($isArray) { $url_string .= PUBLIC_TO_INDEX_PATH; @@ -39,7 +43,7 @@ class Minz_Url { } if ($isArray) { - $url_string .= self::printUri($url, $encodage); + $url_string .= '/' . self::printUri($url, $encodage); } elseif ($encodage === 'html') { $url_string = Minz_Helper::htmlspecialchars_utf8($url_string . $url); } else { diff --git a/lib/lib_install.php b/lib/lib_install.php index 7305d8e28..d51a37e58 100644 --- a/lib/lib_install.php +++ b/lib/lib_install.php @@ -41,6 +41,7 @@ function checkRequirements($dbType = '') { $dom = class_exists('DOMDocument'); $xml = function_exists('xml_parser_create'); $json = function_exists('json_encode'); + $mbstring = extension_loaded('mbstring'); $data = DATA_PATH && is_writable(DATA_PATH); $cache = CACHE_PATH && is_writable(CACHE_PATH); $users = USERS_PATH && is_writable(USERS_PATH); @@ -61,6 +62,7 @@ function checkRequirements($dbType = '') { 'dom' => $dom ? 'ok' : 'ko', 'xml' => $xml ? 'ok' : 'ko', 'json' => $json ? 'ok' : 'ko', + 'mbstring' => $mbstring ? 'ok' : 'ko', 'data' => $data ? 'ok' : 'ko', 'cache' => $cache ? 'ok' : 'ko', 'users' => $users ? 'ok' : 'ko', diff --git a/lib/lib_rss.php b/lib/lib_rss.php index 5f460862e..44123b746 100644 --- a/lib/lib_rss.php +++ b/lib/lib_rss.php @@ -21,6 +21,12 @@ if (!function_exists('json_encode')) { defined('JSON_UNESCAPED_UNICODE') or define('JSON_UNESCAPED_UNICODE', 256); //PHP 5.3 +if (!function_exists('mb_strcut')) { + function mb_strcut($str, $start, $length = null, $encoding = 'UTF-8') { + return substr($str, $start, $length); + } +} + /** * Build a directory path by concatenating a list of directory names. * @@ -103,24 +109,29 @@ function safe_ascii($text) { * localhost address. * * @param $address the address to test, can be an IP or a URL. - * @return true if server is accessible, false else. + * @return true if server is accessible, false otherwise. * @todo improve test with a more valid technique (e.g. test with an external server?) */ function server_is_public($address) { $host = parse_url($address, PHP_URL_HOST); $is_public = !in_array($host, array( - '127.0.0.1', 'localhost', 'localhost.localdomain', '[::1]', + 'ip6-localhost', 'localhost6', 'localhost6.localdomain6', )); - return $is_public; -} + if ($is_public) { + $ip = gethostbyname($host); + $is_public &= !preg_match('/^(10|127|172[.]16|192[.]168)[.]/', $ip); + $is_public &= !preg_match('/^(\[)?(::1$|fc00::|fe80::)/i', $ip); + } + return (bool)$is_public; +} function format_number($n, $precision = 0) { // number_format does not seem to be Unicode-compatible @@ -405,6 +416,7 @@ function check_install_php() { 'fileinfo' => extension_loaded('fileinfo'), 'dom' => class_exists('DOMDocument'), 'json' => extension_loaded('json'), + 'mbstring' => extension_loaded('mbstring'), 'zip' => extension_loaded('zip'), ); } diff --git a/p/api/fever.php b/p/api/fever.php index d1482e8a1..55baa6d16 100644 --- a/p/api/fever.php +++ b/p/api/fever.php @@ -69,14 +69,16 @@ class FeverDAO extends Minz_ModelPdo if (!empty($entry_ids)) { $bindEntryIds = $this->bindParamArray('id', $entry_ids, $values); $sql .= " id IN($bindEntryIds)"; - } else if (!empty($max_id)) { + } elseif ($max_id != null) { $sql .= ' id < :id'; $values[':id'] = $max_id; $order = ' ORDER BY id DESC'; - } else { + } elseif ($since_id != null) { $sql .= ' id > :id'; $values[':id'] = $since_id; $order = ' ORDER BY id ASC'; + } else { + $sql .= ' 1=1'; } if (!empty($feed_ids)) { @@ -204,14 +206,14 @@ class FeverAPI $response_arr['saved_item_ids'] = $this->getSavedItemIds(); } - if (isset($_REQUEST['mark'], $_REQUEST['as'], $_REQUEST['id']) && is_numeric($_REQUEST['id'])) { + $id = isset($_REQUEST['id']) ? '' . $_REQUEST['id'] : ''; + if (isset($_REQUEST['mark'], $_REQUEST['as'], $_REQUEST['id']) && ctype_digit($id)) { $method_name = 'set' . ucfirst($_REQUEST['mark']) . 'As' . ucfirst($_REQUEST['as']); $allowedMethods = array( 'setFeedAsRead', 'setGroupAsRead', 'setItemAsRead', 'setItemAsSaved', 'setItemAsUnread', 'setItemAsUnsaved' ); if (in_array($method_name, $allowedMethods)) { - $id = intval($_REQUEST['id']); switch (strtolower($_REQUEST['mark'])) { case 'item': $this->{$method_name}($id); @@ -471,17 +473,18 @@ class FeverAPI if (isset($_REQUEST['max_id'])) { // use the max_id argument to request the previous $item_limit items - if (is_numeric($_REQUEST['max_id'])) { - $max = $_REQUEST['max_id'] > 0 ? intval($_REQUEST['max_id']) : 0; - if ($max) { - $max_id = $max; - } + $max_id = '' . $_REQUEST['max_id']; + if (!ctype_digit($max_id)) { + $max_id = null; } } else if (isset($_REQUEST['with_ids'])) { $entry_ids = explode(',', $_REQUEST['with_ids']); } else { // use the since_id argument to request the next $item_limit items - $since_id = isset($_REQUEST['since_id']) && is_numeric($_REQUEST['since_id']) ? intval($_REQUEST['since_id']) : 0; + $since_id = '' . $_REQUEST['since_id']; + if (!ctype_digit($since_id)) { + $since_id = null; + } } $items = array(); diff --git a/p/api/greader.php b/p/api/greader.php index 5ab6c8115..4affc2826 100644 --- a/p/api/greader.php +++ b/p/api/greader.php @@ -176,7 +176,7 @@ function authorizationToUser() { } function clientLogin($email, $pass) { //http://web.archive.org/web/20130604091042/http://undoc.in/clientLogin.html - if (ctype_alnum($email)) { + if (FreshRSS_user_Controller::checkUsername($email)) { if (!function_exists('password_verify')) { include_once(LIB_PATH . '/password_compat.php'); } @@ -28,7 +28,7 @@ $txt_mtime = @filemtime($txt); header('Content-Type: image/x-icon'); -if ($ico_mtime == false || $ico_mtime < $txt_mtime || ($ico_mtime < time() - (rand(15, 20) * 86400))) { +if ($ico_mtime == false || $ico_mtime < $txt_mtime || ($ico_mtime < time() - (mt_rand(15, 20) * 86400))) { if ($txt_mtime == false) { show_default_favicon(1800); exit(); @@ -49,6 +49,6 @@ if ($ico_mtime == false || $ico_mtime < $txt_mtime || ($ico_mtime < time() - (ra header('Content-Disposition: inline; filename="' . $id . '.ico"'); -if (!httpConditional($ico_mtime, rand(14, 21) * 86400, 2)) { +if (!httpConditional($ico_mtime, mt_rand(14, 21) * 86400, 2)) { readfile($ico); } diff --git a/p/themes/BlueLagoon/BlueLagoon.css b/p/themes/BlueLagoon/BlueLagoon.css index 186258752..424970501 100644 --- a/p/themes/BlueLagoon/BlueLagoon.css +++ b/p/themes/BlueLagoon/BlueLagoon.css @@ -115,6 +115,9 @@ form th { } /*=== Buttons */ +button.as-link[disabled] { + color:#555 !important; +} .dropdown-menu .input select, .dropdown-menu .input input { background:#444; diff --git a/p/themes/Dark/dark.css b/p/themes/Dark/dark.css index 348b00009..38a78a277 100644 --- a/p/themes/Dark/dark.css +++ b/p/themes/Dark/dark.css @@ -113,6 +113,9 @@ form th { } /*=== Buttons */ +button.as-link[disabled] { + color:#445 !important; +} .stick { vertical-align: middle; font-size: 0; diff --git a/p/themes/Origine-compact/origine-compact.css b/p/themes/Origine-compact/origine-compact.css index 8447e2486..26129415a 100644 --- a/p/themes/Origine-compact/origine-compact.css +++ b/p/themes/Origine-compact/origine-compact.css @@ -1,11 +1,5 @@ @charset "UTF-8"; -/*=== FONTS */ -@font-face { - font-family: "OpenSans"; - src: url("../fonts/openSans.woff") format("woff"); -} - /*=== GENERAL */ /*============*/ html, body { diff --git a/p/themes/Screwdriver/screwdriver.css b/p/themes/Screwdriver/screwdriver.css index 969695f13..a142c3860 100644 --- a/p/themes/Screwdriver/screwdriver.css +++ b/p/themes/Screwdriver/screwdriver.css @@ -115,6 +115,9 @@ form th { } /*=== Buttons */ +button.as-link[disabled] { + color:#555 !important; +} .dropdown-menu .input select, .dropdown-menu .input input { background:#444; diff --git a/p/themes/base-theme/template.css b/p/themes/base-theme/template.css index 9b8ad902b..26143a5d5 100644 --- a/p/themes/base-theme/template.css +++ b/p/themes/base-theme/template.css @@ -118,6 +118,9 @@ button.as-link:active { font-size: 1.1em; text-align: left; } +button.as-link[disabled] { + color:#DDD !important; +} /*=== Tables */ table { @@ -630,7 +633,8 @@ br + br + br { #bigMarkAsRead { display: block; width: 100%; - padding: 1em 0; + padding: 1em 0 100% 0; + padding: 1em 0 100vh 0; text-align: center; font-size: 1.4em; } |
