Merge branch 'FreshRSS/dev' into export_sqlite

This commit is contained in:
Alexandre Alapetite
2019-08-22 20:19:18 +02:00
46 changed files with 1177 additions and 451 deletions

View File

@@ -30,12 +30,7 @@ env:
matrix:
fast_finish: true
include:
# PHP 5.3 only runs on Ubuntu 12.04 (precise), not 14.04 (trusty)
- php: "5.3"
dist: precise
# PHP 5.4 & 5.5 only run on Travis in 14.04 (trusty), not 16.04 (xenial)
- php: "5.4"
dist: trusty
# PHP 5.5 only runs on Travis in 14.04 (trusty), not 16.04 (xenial)
- php: "5.5"
dist: trusty
- php: "7.2"

View File

@@ -2,6 +2,28 @@
## 2019-XX-XX FreshRSS 1.14.4-dev
* Features
* New option to display article authors underneath the article title [#2487](https://github.com/FreshRSS/FreshRSS/pull/2487)
* Add e-mail capability [#2476](https://github.com/FreshRSS/FreshRSS/pull/2476)
* Compatibility
* Require at least PHP 5.5+ [#2495](https://github.com/FreshRSS/FreshRSS/pull/2495)
* Deployment
* Take advantage of `mod_authz_core` instead of `mod_access_compat` when running on Apache 2.4+ [#2461](https://github.com/FreshRSS/FreshRSS/pull/2461)
* Docker: Alpine image updated to 3.10 with PHP 7.3.8 and Apache 2.4.41 [#2238](https://github.com/FreshRSS/FreshRSS/pull/2238)
* Bug fixing
* Fix missing PHP `opcache` package in Docker Alpine [#2498](https://github.com/FreshRSS/FreshRSS/pull/2498)
* Security
* Fix referrer vulnerability when opening an article original link with a shortcut [#2506](https://github.com/FreshRSS/FreshRSS/pull/2506)
* Slight refactoring of access check [#2471](https://github.com/FreshRSS/FreshRSS/pull/2471)
* I18n
* Improve Dutch [#2503](https://github.com/FreshRSS/FreshRSS/pull/2503)
* Add Slovak [#2497](https://github.com/FreshRSS/FreshRSS/pull/2497)
* Extensions
* Additional hooks [#2482](https://github.com/FreshRSS/FreshRSS/pull/2482)
* New call to change the layout [#2467](https://github.com/FreshRSS/FreshRSS/pull/2467)
* Misc.
* Automatic check of CSS syntax in Travis CI [#2477](https://github.com/FreshRSS/FreshRSS/pull/2477)
* Remove support for sharing with Google+ [#2464](https://github.com/FreshRSS/FreshRSS/pull/2464)
## 2019-07-25 FreshRSS 1.14.3

View File

@@ -72,6 +72,7 @@ People are sorted by name so please keep this order.
* [Thomas Citharel](https://github.com/tcitworld): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:tomgue), [Web](https://www.tcit.fr/)
* [Thomas Guesnon](https://github.com/patjennings): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:patjennings), [Web](http://www.thomasguesnon.fr/)
* [thomas-gt](https://github.com/thomas-gt): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:thomas-gt)
* [Tibor Repček](https://github.com/tiborepcek): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:tiborepcek)
* [tomgue](https://github.com/tomgue): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=tomgue)
* [Twilek-de](https://github.com/Twilek-de): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:Twilek-de)
* [Uncovery](https://github.com/uncovery): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:uncovery)

View File

@@ -49,6 +49,8 @@ RUN sed -r -i "/^\s*(CustomLog|ErrorLog|Listen) /s/^/#/" /etc/apache2/apache2.co
ENV COPY_SYSLOG_TO_STDERR On
ENV CRON_MIN ''
ENV FRESHRSS_ENV ''
ENTRYPOINT ["./Docker/entrypoint.sh"]
EXPOSE 80

View File

@@ -5,7 +5,7 @@ SHELL ["/bin/ash", "-eo", "pipefail", "-c"]
RUN apk add --no-cache \
apache2 php7-apache2 \
php7 php7-curl php7-gmp php7-intl php7-mbstring php7-xml php7-zip \
php7-ctype php7-dom php7-fileinfo php7-iconv php7-json php7-session php7-simplexml php7-xmlreader php7-zlib \
php7-ctype php7-dom php7-fileinfo php7-iconv php7-json php7-opcache php7-session php7-simplexml php7-xmlreader php7-zlib \
php7-pdo_sqlite php7-pdo_mysql php7-pdo_pgsql
RUN mkdir -p /var/www/FreshRSS /run/apache2/
@@ -45,6 +45,8 @@ RUN rm -f /etc/apache2/conf.d/languages.conf /etc/apache2/conf.d/info.conf \
ENV COPY_SYSLOG_TO_STDERR On
ENV CRON_MIN ''
ENV FRESHRSS_ENV ''
ENTRYPOINT ["./Docker/entrypoint.sh"]
EXPOSE 80

View File

@@ -61,6 +61,8 @@ RUN rm /usr/bin/qemu-* /var/www/FreshRSS/Docker/qemu-*
ENV COPY_SYSLOG_TO_STDERR On
ENV CRON_MIN ''
ENV FRESHRSS_ENV ''
ENTRYPOINT ["./Docker/entrypoint.sh"]
EXPOSE 80

View File

@@ -238,6 +238,22 @@ docker run -d --restart unless-stopped --log-opt max-size=10m \
crond -f -d 6
```
## Development mode
To contribute to FreshRSS development, you can use one of the Docker images to run and serve the PHP code,
while reading the source code from your local (git) directory, like the following example:
```sh
cd /path-to-local/FreshRSS/
docker run --rm -p 8080:80 -e TZ=Europe/Paris -e FRESHRSS_ENV=development \
-v $(pwd):/var/www/FreshRSS \
freshrss/freshrss:dev
```
This will start a server on port 8080, based on your local PHP code, which will show the logs directly in your terminal.
Press <kbd>Control</kbd>+<kbd>c</kbd> to exit.
The `FRESHRSS_ENV=development` environment variable increases the level of logging and ensures that errors are displayed.
## More deployment options

View File

@@ -43,7 +43,7 @@ FreshRSS nest fourni avec aucune garantie.
* Serveur modeste, par exemple sous Linux ou Windows
* Fonctionne même sur un Raspberry Pi 1 avec des temps de réponse < 1s (testé sur 150 flux, 22k articles)
* Serveur Web Apache2 (recommandé), ou nginx, lighttpd (non testé sur les autres)
* PHP 5.3.8+ (PHP 5.4+ recommandé, et PHP 5.5+ pour les performances, ou PHP 7+ pour dencore meilleures performances)
* PHP 5.5+ (PHP 7+ recommandé pour de 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) (pour le texte Unicode), [iconv](https://secure.php.net/iconv) (pour conversion dencodages), [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 équivalent MariaDB, ou SQLite 3.7.4+, ou PostgreSQL 9.2+
@@ -219,7 +219,6 @@ Tout client supportant une API de type Fever ; Sélection :
* [bcrypt.js](https://github.com/dcodeIO/bcrypt.js)
* [phpQuery](https://github.com/phpquery/phpquery)
* [Services_JSON](https://pear.php.net/pepr/pepr-proposal-show.php?id=198)
* [password_compat](https://github.com/ircmaxell/password_compat)

View File

@@ -43,7 +43,7 @@ FreshRSS comes with absolutely no warranty.
* Light server running Linux or Windows
* It even works on Raspberry Pi 1 with response time under a second (tested with 150 feeds, 22k articles)
* A web server: Apache2 (recommended), nginx, lighttpd (not tested on others)
* PHP 5.3.8+ (PHP 5.4+ recommended, and PHP 5.5+ for performance, or PHP 7 for even higher performance)
* PHP 5.5+ (PHP 7+ recommended for 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 32-bit platforms), [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 MariaDB equivalent, or SQLite 3.7.4+, or PostgreSQL 9.2+
@@ -219,7 +219,6 @@ Supported clients are:
* [bcrypt.js](https://github.com/dcodeIO/bcrypt.js)
* [phpQuery](https://github.com/phpquery/phpquery)
* [Services_JSON](https://pear.php.net/pepr/pepr-proposal-show.php?id=198)
* [password_compat](https://github.com/ircmaxell/password_compat)
[travis-badge]:https://travis-ci.org/FreshRSS/FreshRSS.svg?branch=master
[travis-link]:https://travis-ci.org/FreshRSS/FreshRSS

View File

@@ -169,10 +169,6 @@ class FreshRSS_auth_Controller extends Minz_ActionController {
return;
}
if (!function_exists('password_verify')) {
include_once(LIB_PATH . '/password_compat.php');
}
$s = $conf->passwordHash;
$ok = password_verify($password, $s);
unset($password);

View File

@@ -9,9 +9,6 @@ class FreshRSS_user_Controller extends Minz_ActionController {
const BCRYPT_COST = 9;
public static function hashPassword($passwordPlain) {
if (!function_exists('password_hash')) {
include_once(LIB_PATH . '/password_compat.php');
}
$passwordHash = password_hash($passwordPlain, PASSWORD_BCRYPT, array('cost' => self::BCRYPT_COST));
$passwordPlain = '';
$passwordHash = preg_replace('/^\$2[xy]\$/', '\$2a\$', $passwordHash); //Compatibility with bcrypt.js

View File

@@ -219,10 +219,6 @@ class FreshRSS_FormAuth {
return false;
}
if (!function_exists('password_verify')) {
include_once(LIB_PATH . '/password_compat.php');
}
return password_verify($nonce . $hash, $challenge);
}
@@ -283,8 +279,7 @@ class FreshRSS_FormAuth {
$cookie_duration = empty($limits['cookie_duration']) ? 2592000 : $limits['cookie_duration'];
$oldest = time() - $cookie_duration;
foreach (new DirectoryIterator(DATA_PATH . '/tokens/') as $file_info) {
// $extension = $file_info->getExtension(); doesn't work in PHP < 5.3.7
$extension = pathinfo($file_info->getFilename(), PATHINFO_EXTENSION);
$extension = $file_info->getExtension();
if ($extension === 'txt' && $file_info->getMTime() < $oldest) {
@unlink($file_info->getPathname());
}

View File

@@ -191,7 +191,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
if ($this->hasNativeHex()) {
$this->addEntryPrepared->bindParam(':hash', $valuesTmp['hash']);
} else {
$valuesTmp['hashBin'] = pack('H*', $valuesTmp['hash']); //hex2bin() is PHP5.4+
$valuesTmp['hashBin'] = hex2bin($valuesTmp['hash']);
$this->addEntryPrepared->bindParam(':hash', $valuesTmp['hashBin']);
}
}
@@ -273,7 +273,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
if ($this->hasNativeHex()) {
$this->updateEntryPrepared->bindParam(':hash', $valuesTmp['hash']);
} else {
$valuesTmp['hashBin'] = pack('H*', $valuesTmp['hash']); //hex2bin() is PHP5.4+
$valuesTmp['hashBin'] = hex2bin($valuesTmp['hash']);
$this->updateEntryPrepared->bindParam(':hash', $valuesTmp['hashBin']);
}

View File

@@ -127,6 +127,7 @@ return array(
'oc' => 'Occitan',
'pt-br' => 'Português (Brasil)',
'ru' => 'Русский',
'sk' => 'Slovenčina',
'tr' => 'Türkçe',
'zh-cn' => '简体中文',
),

View File

@@ -75,7 +75,7 @@ return array(
),
'feed' => array(
'actualized' => '<em>%s</em> vernieuwd',
'actualizeds' => 'RSS feeds vernieuwd',
'actualizeds' => 'RSS-feeds vernieuwd',
'added' => 'RSS feed <em>%s</em> toegevoegd',
'already_subscribed' => 'Al geabonneerd op <em>%s</em>',
'deleted' => 'Feed verwijderd',

View File

@@ -161,23 +161,8 @@ return array(
'previous' => 'Vorige',
),
'share' => array(
'blogotext' => 'Blogotext',
'diaspora' => 'Diaspora*',
'email' => 'Email',
'facebook' => 'Facebook',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
'Known' => 'Known based sites',
'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pinboard' => 'Pinboard',
'pocket' => 'Pocket',
'print' => 'Print',
'shaarli' => 'Shaarli',
'twitter' => 'Twitter',
'wallabag' => 'wallabag v1',
'wallabagv2' => 'wallabag v2',
'Known' => 'Known-gebaseerde sites',
),
'short' => array(
'attention' => 'Attentie!',

View File

@@ -7,10 +7,10 @@ return array(
'bugs_reports' => 'Rapporteer fouten',
'credits' => 'Waarderingen',
'credits_content' => 'Sommige ontwerp elementen komen van <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> alhoewel FreshRSS dit raamwerk niet gebruikt. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Pictogrammen</a> komen van het <a href="https://www.gnome.org/">GNOME project</a>. <em>De Open Sans</em> font police is gemaakt door <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a>. FreshRSS is gebaseerd op <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, een PHP raamwerk. Nederlandse vertaling door Wanabo, <a href="http://www.nieuwskop.be" title="NieuwsKop">NieuwsKop.be</a>. Link naar de Nederlandse vertaling, <a href="https://github.com/Wanabo/FreshRSS-Dutch-translation/tree/master">FreshRSS-Dutch-translation</a>.',
'freshrss_description' => 'FreshRSS is een RSS feed aggregator om zelf te hosten zoals <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> of <a href="http://leed.idleman.fr/">Leed</a>. Het gebruikt weinig systeembronnen en is makkelijk te administreren terwijl het een krachtig en makkelijk te configureren programma is.',
'freshrss_description' => 'FreshRSS is een RSS-feed aggregator om zelf te hosten, net als <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> of <a href="http://leed.idleman.fr/">Leed</a>. Het gebruikt weinig systeembronnen en is makkelijk te beheren terwijl het een krachtig en makkelijk te configureren programma is.',
'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">op Github</a>',
'license' => 'License',
'project_website' => 'Project website',
'license' => 'Licentie',
'project_website' => 'Projectwebsite',
'title' => 'Over',
'version' => 'Versie',
'website' => 'Website',
@@ -18,8 +18,8 @@ return array(
'feed' => array(
'add' => 'U kunt wat feeds toevoegen.',
'empty' => 'Er is geen artikel om te laten zien.',
'rss_of' => 'RSS feed van %s',
'title' => 'Overzicht RSS feeds',
'rss_of' => 'RSS-feed van %s',
'title' => 'Overzicht RSS-feeds',
'title_global' => 'Globale weergave',
'title_fav' => 'Uw favorieten',
),
@@ -48,7 +48,7 @@ return array(
'queries' => 'Gebruikers queries',
'read' => 'Laat alleen gelezen zien',
'reader_view' => 'Lees modus',
'rss_view' => 'RSS feed',
'rss_view' => 'RSS-feed',
'search_short' => 'Zoeken',
'starred' => 'Laat alleen favorieten zien',
'stats' => 'Statistieken',

View File

@@ -19,25 +19,25 @@ return array(
'title' => 'Titel',
),
'feed' => array(
'add' => 'Voeg een RSS feed toe',
'add' => 'Voeg een RSS-feed toe',
'advanced' => 'Geavanceerd',
'archiving' => 'Archiveren',
'auth' => array(
'configuration' => 'Log in',
'help' => 'Verbinding toestaan toegang te krijgen tot HTTP beveiligde RSS feeds',
'help' => 'Verbinding toestaan toegang te krijgen tot HTTP beveiligde RSS-feeds',
'http' => 'HTTP Authenticatie',
'password' => 'HTTP wachtwoord',
'username' => 'HTTP gebruikers naam',
),
'clear_cache' => 'Cache altijd leegmaken',
'css_help' => 'Haalt verstoorde RSS feeds op (attentie, heeft meer tijd nodig!)',
'css_path' => 'Artikelen CSS pad op originele website',
'css_help' => 'Haalt onvolledige RSS-feeds op (attentie, heeft meer tijd nodig!)',
'css_path' => 'CSS-pad van artikelen op originele website',
'description' => 'Omschrijving',
'empty' => 'Deze feed is leeg. Controleer of deze nog actueel is.',
'error' => 'Deze feed heeft problemen. Verifieer a.u.b het doeladres en actualiseer het.',
'filteractions' => array(
'_' => 'Filter actions', //TODO - Translation
'help' => 'Write one search filter per line.', //TODO - Translation
'_' => 'Filteracties',
'help' => 'Voer één zoekfilter per lijn in.',
),
'information' => 'Informatie',
'keep_history' => 'Minimum aantal artikelen om te houden',
@@ -64,11 +64,11 @@ return array(
'think_to_add' => 'Voeg wat feeds toe.',
'timeout' => 'Time-out in seconden',
'title' => 'Titel',
'title_add' => 'Voeg een RSS feed toe',
'title_add' => 'Voeg een RSS-feed toe',
'ttl' => 'Vernieuw automatisch niet vaker dan',
'url' => 'Feed URL',
'url' => 'Feed-url',
'validator' => 'Controleer de geldigheid van de feed',
'website' => 'Website URL',
'website' => 'Website-url',
),
'firefox' => array(
'documentation' => 'Volg de stappen die <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">hier</a> beschreven worden om FreshRSS aan de Firefox-nieuwslezerlijst toe te voegen.',

199
app/i18n/sk/admin.php Normal file
View File

@@ -0,0 +1,199 @@
<?php
return array(
'auth' => array(
'allow_anonymous' => 'Povoliť čítanie článkov prednastaveného používateľa (%s) bez prihlásenia.',
'allow_anonymous_refresh' => 'Povoliť obnovenie článkov bez prihlásenia',
'api_enabled' => 'Povoliť prístup cez <abbr>API</abbr> <small>(vyžadujú mobilné aplikácie)</small>',
'form' => 'Webový formulár (traditičný, vyžaduje JavaScript)',
'http' => 'HTTP (pre pokročilých používateľov s HTTPS)',
'none' => 'Žiadny (nebezpečné)',
'title' => 'Prihlásenie',
'title_reset' => 'Reset prihlásenia',
'token' => 'Token prihlásenia',
'token_help' => 'Povoliť prístup k výstupu RSS prednastaveného používateľa bez prihlásenia:',
'type' => 'Spôsob prihlásenia',
'unsafe_autologin' => 'Povoliť nebezpečné automatické prihlásenie pomocou webového formulára: ',
),
'check_install' => array(
'cache' => array(
'nok' => 'Overte prístupové práva priečinka <em>./data/cache</em>. HTTP server musí mať právo doň zapisovať.',
'ok' => 'Prístupové práva priečinka pre vyrovnávaciu pamäť sú OK.',
),
'categories' => array(
'nok' => 'Tabuľka kategórií je nesprávne nastavená.',
'ok' => 'Tabuľka kategórií je OK.',
),
'connection' => array(
'nok' => 'Nepodarilo sa vytvoriť pripojenie k databáze.',
'ok' => 'Pripojenie k databáze je OK.',
),
'ctype' => array(
'nok' => 'Nepodarilo sa nájsť požadovanú knižnicu na kontrolu typu znakov (php-ctype).',
'ok' => 'Našla sa požadovaná knižnica na kontrolu typu znakov (ctype).',
),
'curl' => array(
'nok' => 'Nepodarilo sa nájsť knižnicu cURL (balík php-curl).',
'ok' => 'Našla sa knižnica cURL.',
),
'data' => array(
'nok' => 'Skontrolujte oprávnenia prístupu do priečinku <em>./data</em>. HTTP server musí mať právo doň zapisovať.',
'ok' => 'Oprávnenia prístupu do priečinku údajov sú OK.',
),
'database' => 'Inštalácia databázy',
'dom' => array(
'nok' => 'Nepodarilo sa nájsť požadovanú knižnicu na prehliadanie DOM.',
'ok' => 'Našla sa požadovaná knižnica na prehliadanie DOM.',
),
'entries' => array(
'nok' => 'Tabuľka článkov je nesprávne nastavená.',
'ok' => 'Tabuľka článkov je OK.',
),
'favicons' => array(
'nok' => 'Skontrolujte oprávnenia prístupu do priečinku <em>./data/favicons</em>. HTTP server musí mať právo doň zapisovať.',
'ok' => 'Oprávnenia prístupu do priečinku ikôn obľúbených sú OK.',
),
'feeds' => array(
'nok' => 'Tabuľka kanálov je nesprávne nastavená.',
'ok' => 'Tabuľka kanálov je OK.',
),
'fileinfo' => array(
'nok' => 'Nepodarilo sa nájsť knižniuc PHP fileinfo (balík fileinfo).',
'ok' => 'Našla sa knižnica fileinfo.',
),
'files' => 'Inštalácia súborov',
'json' => array(
'nok' => 'Nepodarilo sa nájsť požadovanú knižnicu na spracovanie formátu JSON.',
'ok' => 'Našla sa požadovaná knižnica na spracovanie formátu JSON.',
),
'mbstring' => array(
'nok' => 'Nepodarilo sa nájsť požadovanú knižnicu mbstring pre Unicode.',
'ok' => 'Našla sa požadovaná knižnica mbstring pre Unicode.',
),
'minz' => array(
'nok' => 'Nepodarilo sa nájsť framework Minz.',
'ok' => 'Našiel sa framework Minz.',
),
'pcre' => array(
'nok' => 'Nepodarilo sa nájsť požadovanú knižnicu pre regulárne výrazy (php-pcre).',
'ok' => 'Našla sa požadovaná knižnica pre regulárne výrazy (PCRE).',
),
'pdo' => array(
'nok' => 'Nepodarilo sa nájsť PDO alebo niektorý z podporovaných ovládačov (pdo_mysql, pdo_sqlite, pdo_pgsql).',
'ok' => 'Našiel sa PDO a aspoň jeden z podporovaných ovládačov (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
'_' => 'Inštalácia PHP',
'nok' => 'Vaša verzia PHP je %s, ale FreshRSS vyžaduje minimálne verziu %s.',
'ok' => 'Vaša verzia PHP %s je kompatibilná s FreshRSS.',
),
'tables' => array(
'nok' => 'V databáze chýba jedna alebo viacero tabuliek.',
'ok' => 'V databáze sa nachádzajú všetky potrebné tabuľky.',
),
'title' => 'Kontrola inštalácie',
'tokens' => array(
'nok' => 'Skontrolujte oprávnenia prístupu do priečinku <em>./data/tokens</em>. HTTP server musí mať právo doň zapisovať.',
'ok' => 'Oprávnenia prístupu do priečinku tokens sú OK.',
),
'users' => array(
'nok' => 'Skontrolujte oprávnenia prístupu do priečinku <em>./data/users</em>. HTTP server musí mať právo doň zapisovať.',
'ok' => 'Oprávnenia prístupu do priečinku používateľov sú OK.',
),
'zip' => array(
'nok' => 'Nepodarilo sa nájsť rozšírenie ZIP (balík php-zip).',
'ok' => 'Rozšírenie ZIP sa našlo.',
),
),
'extensions' => array(
'author' => 'Autor',
'community' => 'Rozšírenia od komunity',
'description' => 'Popis',
'disabled' => 'Zakázané',
'empty_list' => 'Žiadne nainštalované rozšírenia',
'enabled' => 'Povolené',
'latest' => 'Nainštalované',
'name' => 'Názov',
'no_configure_view' => 'Toto rozšírenie nemá nastavenia.',
'system' => array(
'_' => 'Systémové rozšírenia',
'no_rights' => 'Systémové rozšírenie (nemáte oprávnenia)',
),
'title' => 'Rozšírenia',
'update' => 'Sú dostupné aktualizácie',
'user' => 'Používateľské rozšírenia',
'version' => 'Verzia',
),
'stats' => array(
'_' => 'Štatistiky',
'all_feeds' => 'Všetky kanály',
'category' => 'Kategória',
'entry_count' => 'Počet položiek',
'entry_per_category' => 'Položiek v kategórii',
'entry_per_day' => 'Položiek za deň (posledných 30 dní)',
'entry_per_day_of_week' => 'Za deň v týždni (priemer: %.2f správy)',
'entry_per_hour' => 'Za hodinu (priemer: %.2f správy)',
'entry_per_month' => 'Za mesiac (priemer: %.2f správy)',
'entry_repartition' => 'Rozdelenie článkov',
'feed' => 'Kanál',
'feed_per_category' => 'Kanálov v kategórii',
'idle' => 'Neaktívne kanály',
'main' => 'Hlavné štatistiky',
'main_stream' => 'Všetky kanály',
'menu' => array(
'idle' => 'Neaktívne kanály',
'main' => 'Hlavné štatistiky',
'repartition' => 'Rozdelenie článkov',
),
'no_idle' => 'Žiadne neaktívne kanály!',
'number_entries' => 'Počet článkov: %d',
'percent_of_total' => 'Z celkového počtu: %%',
'repartition' => 'Rozdelenie článkov',
'status_favorites' => 'Obľúbené',
'status_read' => 'Prečítané',
'status_total' => 'Spolu',
'status_unread' => 'Neprečítané',
'title' => 'Štatistiky',
'top_feed' => 'Top 10 kanálov',
),
'system' => array(
'_' => 'Nastavenia systému',
'auto-update-url' => 'Odkaz na aktualizačný server',
'instance-name' => 'Názov inštancie',
'max-categories' => 'Limit počtu kategórií pre používateľa',
'max-feeds' => 'Limit počtu kanálov pre používateľov',
'cookie-duration' => array(
'help' => 'v sekundách',
'number' => 'Dobra, počas ktorej ste prihlásený',
),
'registration' => array(
'help' => '0 znamená žiadny limit počtu účtov',
'number' => 'Maximálny počt účtov',
),
),
'update' => array(
'_' => 'Aktualizácia systému',
'apply' => 'Použiť',
'check' => 'Skontrolovať aktualizácie',
'current_version' => 'Vaša aktuálna verzia FreshRSS: %s',
'last' => 'Posledná kontrola: %s',
'none' => 'Žiadna nová aktualizácia',
'title' => 'Aktualizácia systému',
),
'user' => array(
'articles_and_size' => '%s článkov (%s)',
'create' => 'Vytvoriť nového používateľa',
'delete_users' => 'Zmazať používateľa',
'language' => 'Jazyk',
'number' => 'Je vytvorený používateľ: %d',
'numbers' => 'Je vytvorených používateľov: %d',
'password_form' => 'Heslo<br /><small>(pre spôsob prihlásenia cez webový formulár)</small>',
'password_format' => 'Minimálne 7 znakov',
'selected' => 'Označený používateľ',
'title' => 'Správa používateľov',
'update_users' => 'Sktualizovať používateľov',
'user_list' => 'Zoznam používateľov',
'username' => 'Používateľské meno',
'users' => 'Používatelia',
),
);

188
app/i18n/sk/conf.php Normal file
View File

@@ -0,0 +1,188 @@
<?php
return array(
'archiving' => array(
'_' => 'Archivovanie',
'advanced' => 'Pokročilé',
'delete_after' => 'Vymazať články po',
'help' => 'Viac možností nájdete v nastaveniach kanála',
'keep_history_by_feed' => 'Minimálny počet článkov kanála na zachovanie',
'optimize' => 'Optimalizovať databázu',
'optimize_help' => 'Občas vykonajte na zmenšenie veľkosti databázy',
'purge_now' => 'Vyčistiť teraz',
'title' => 'Archivovanie',
'ttl' => 'Neaktualizovať častejšie ako',
),
'display' => array(
'_' => 'Zobrazenie',
'icon' => array(
'bottom_line' => 'Spodný riadok',
'display_authors' => 'Autori',
'entry' => 'Ikony článku',
'publication_date' => 'Dátum zverejnenia',
'related_tags' => 'Značky článku',
'sharing' => 'Zdieľanie',
'top_line' => 'Horný riadok',
),
'language' => 'Jazyk',
'notif_html5' => array(
'seconds' => 'sekundy (0 znamená bez limitu)',
'timeout' => 'Limit HTML5 oznámenia',
),
'show_nav_buttons' => 'Zobraziť tlačidlá oznámenia',
'theme' => 'Vzhľad',
'title' => 'Zobraziť',
'width' => array(
'content' => 'Šírka obsahu',
'large' => 'Veľká',
'medium' => 'Stredná',
'no_limit' => 'Bez obmedzenia',
'thin' => 'Úzka',
),
),
'profile' => array(
'_' => 'Správca profilu',
'delete' => array(
'_' => 'Vymazanie účtu',
'warn' => 'Váš účet a všetky údaje v ňom budú vymazané.',
),
'password_api' => 'Heslo API<br /><small>(pre mobilné aplikácie)</small>',
'password_form' => 'Heslo<br /><small>(pre spôsob prihlásenia cez webový formulár)</small>',
'password_format' => 'Najmenej 7 znakov',
'title' => 'Profil',
),
'query' => array(
'_' => 'Dopyty používateľa',
'deprecated' => 'Tento dopyt už nie je platný. Kategória alebo kanál boli vymazané.',
'display' => 'Zobraziť výsledky dopytu používateľa',
'filter' => 'Použitý filter:',
'get_all' => 'Zobraziť všetky články',
'get_category' => 'Zobraziť kategóriu "%s"',
'get_favorite' => 'Zobraziť obľúbené články',
'get_feed' => 'Zobraziť kanál "%s"',
'no_filter' => 'Žiadny filter',
'none' => 'Zatiaľ ste nevytvorili používateľský dopyt.',
'number' => 'Dopyt číslo %d',
'order_asc' => 'Zobraziť staršie články hore',
'order_desc' => 'Zobraziť novšie články hore',
'remove' => 'Vymazať dopyt používateľa',
'search' => 'Vyhľadáva sa: "%s"',
'state_0' => 'Zobraziť všetky články',
'state_1' => 'Zobraziť prečítané články',
'state_2' => 'Zobraziť neprečítané články',
'state_3' => 'Zobraziť všetky články',
'state_4' => 'Zobraziť obľúbené články',
'state_5' => 'Zobraziť prečítané obľúbené články',
'state_6' => 'Zobraziť neprečítané obľúbené články',
'state_7' => 'Zobraziť obľúbené články',
'state_8' => 'Zobraziť neobľúbené články',
'state_9' => 'Zobraziť prečítané neobľúbené články',
'state_10' => 'Zobraziť neprečítané neobľúbené články',
'state_11' => 'Zobraziť neobľúbené články',
'state_12' => 'Zobraziť všetky články',
'state_13' => 'Zobraziť prečítané články',
'state_14' => 'Zobraziť neprečítané články',
'state_15' => 'Zobraziť všetky články',
'title' => 'Používateľské dopyty',
),
'reading' => array(
'_' => 'Čítanie',
'after_onread' => 'Po “Označiť všetko ako prečítané”,',
'articles_per_page' => 'Počet článkov na jednu stranu',
'auto_load_more' => 'Načítať ďalšie články dolu na stránke',
'auto_remove_article' => 'Skryť články po prečítaní',
'confirm_enabled' => 'Zobraziť potvrdzovací dialóg po kliknutí na “Označiť všetko ako prečítané”',
'display_articles_unfolded' => 'Zobraziť články otvorené',
'display_categories_unfolded' => 'Zobraziť kategórie otvorené',
'hide_read_feeds' => 'Skryť kategórie a kanály s nulovým počtom neprečítaných článkov (nefunguje s nastaveným “Zobraziť všetky články”)',
'img_with_lazyload' => 'Pre načítanie obrázkov použiť "lazy load"',
'jump_next' => 'skočiť na ďalší neprečítaný (kanál ale kategóriu)',
'mark_updated_article_unread' => 'Označiť aktualizované články ako neprečítané',
'number_divided_when_reader' => 'V režime čítania predeliť na dve časti.',
'read' => array(
'article_open_on_website' => 'keď je článok otvorený na svojej webovej stránke',
'article_viewed' => 'keď je článok zobrazený',
'scroll' => 'počas skrolovania',
'upon_reception' => 'po načítaní článku',
'when' => 'Označiť článok ako prečítaný…',
),
'show' => array(
'_' => 'Článkov na zobrazenie',
'adaptive' => 'Vyberte zobrazenie',
'all_articles' => 'Zobraziť všetky články',
'unread' => 'Zobraziť iba neprečítané',
),
'sides_close_article' => 'Po kliknutí mimo textu článku sa článok zatvorí',
'sort' => array(
'_' => 'Poradie',
'newer_first' => 'Novšie hore',
'older_first' => 'Staršie hore',
),
'sticky_post' => 'Po otvorení posunúť článok hore',
'title' => 'Čítanie',
'view' => array(
'default' => 'Prednastavené zobrazenie',
'global' => 'Prehľadné zobrazenie',
'normal' => 'Základné zobrazenie',
'reader' => 'Zobrazenie na čítanie',
),
),
'sharing' => array(
'_' => 'Zdieľanie',
'add' => 'Pridať spôsob zdieľania',
'blogotext' => 'Blogotext',
'diaspora' => 'Diaspora*',
'email' => 'E-mail',
'facebook' => 'Facebook',
'g+' => 'Google+',
'more_information' => 'Viac informácií',
'print' => 'Tlač',
'remove' => 'Odstrániť spôsob zdieľania',
'shaarli' => 'Shaarli',
'share_name' => 'Meno pre zobrazenie',
'share_url' => 'Zdieľaný odkaz',
'title' => 'Zdieľanie',
'twitter' => 'Twitter',
'wallabag' => 'wallabag',
),
'shortcut' => array(
'_' => 'Skratky',
'article_action' => 'Akcie článku',
'auto_share' => 'Zdieľať',
'auto_share_help' => 'Ak je nastavený iba jeden spôsob zdieľania, použije sa. Inak si spôsoby zdieľania vyberá používateľ podľa čísla.',
'close_dropdown' => 'Zavrie menu',
'collapse_article' => 'Zroluje článok',
'first_article' => 'Otvorí prvý článok',
'focus_search' => 'Vyhľadávanie',
'global_view' => 'Prepne do prehľadného zobrazenia',
'help' => 'Zobrazí dokumentáciu',
'javascript' => 'JavaScript musí byť povolený, ak chcete používať skratky',
'last_article' => 'Otvorí posledný článok',
'load_more' => 'Načíta viac článkov',
'mark_favorite' => 'O(d)značí ako obľúbené',
'mark_read' => 'O(d)značí ako prečítané',
'navigation' => 'Navigácia',
'navigation_help' => 'Po stlačení skratky s klávesou "Shift", sa skratky navigácie vzťahujú na kanály.<br/>Po stlačení skratky s klávesou "Alt", sa skratky navigácie vzťahujú na kategórie.',
'navigation_no_mod_help' => 'Tieto skratky navigácie nepodporujú klávesy "Shift" a "Alt".',
'next_article' => 'Otvorí ďalší článok',
'normal_view' => 'Prepne do základného zobrazenia',
'other_action' => 'Ostatné akcie',
'previous_article' => 'Otvorí predošlý článok',
'reading_view' => 'Prepne do zobrazenia na čítanie',
'rss_view' => 'Otvorí zobrazenie RSS v novej záložke',
'see_on_website' => 'Zobrazí na webovej stránke',
'shift_for_all_read' => '+ <code>shift</code> na označenie všetkých článkov ako prečítaných',
'skip_next_article' => 'Prejde na ďalší bez otvorenia',
'skip_previous_article' => 'Prejde na predošlý bez otvorenia',
'title' => 'Skratky',
'user_filter' => 'Použiť používateľské filtre',
'user_filter_help' => 'Ak je nastavený iba jeden spôsob zdieľania, použije sa. Inak si spôsoby zdieľania vyberá používateľ podľa čísla.',
'views' => 'Zobrazenia',
),
'user' => array(
'articles_and_size' => '%s článkov (%s)',
'current' => 'Aktuálny používateľ',
'is_admin' => 'je administrátor',
'users' => 'Používatelia',
),
);

116
app/i18n/sk/feedback.php Normal file
View File

@@ -0,0 +1,116 @@
<?php
return array(
'admin' => array(
'optimization_complete' => 'Optimalizácia dokončená',
),
'access' => array(
'denied' => 'Na prístup k tejto stránke nemáte oprávnenie',
'not_found' => 'Hľadáte stránku, ktorá neexistuje',
),
'auth' => array(
'form' => array(
'not_set' => 'Nastavl problém pri nastavovaní prihlasovacieho systému. Prosím, skúste to znova neskôr.',
'set' => 'Webový formulár je teraz váš prednastavený prihlasovací spôsob.',
),
'login' => array(
'invalid' => 'Nesprávne prihlasovacie údaje',
'success' => 'Úspešne ste sa prihlásili',
),
'logout' => array(
'success' => 'Boli ste odhlásený',
),
'no_password_set' => 'Heslo administrátora nebolo nastavené. Táto funkcia nie je dostupná.',
),
'conf' => array(
'error' => 'Vyskytla sa chyba počas ukladania nastavaní',
'query_created' => 'Dopyt "%s" bol vytvorený.',
'shortcuts_updated' => 'Skratky boli aktualizované',
'updated' => 'Nastavenia boli aktualizované',
),
'extensions' => array(
'already_enabled' => '%s už je povolené',
'disable' => array(
'ko' => '%s sa nepodarilo nainštalovať. <a href="%s">Prečítajte si záznamy FreshRSS</a>, ak chcete poznať podrobnosti.',
'ok' => '%s je teraz zakázaný',
),
'enable' => array(
'ko' => '%s sa nepodarilo povoliť. <a href="%s">Prečítajte si záznamy FreshRSS</a>, ak chcete poznať podrobnosti.',
'ok' => '%s je teraz povolený',
),
'no_access' => 'Nemáte prístup k %s',
'not_enabled' => '%s nie je povolený',
'not_found' => '%s neexistuje',
),
'import_export' => array(
'export_no_zip_extension' => 'ZIP rozšírenie sa na vašom serveri nenachádza. Prosím, skúste exportovať súbory pojednom.',
'feeds_imported' => 'Váš kanál bol importovaný a bude aktualizovaný',
'feeds_imported_with_errors' => 'Vaše kanály boli importované, ale vyskytli sa chyby',
'file_cannot_be_uploaded' => 'Súbor sa nepodarilo nahrať!',
'no_zip_extension' => 'ZIP rozšírenie sa na vašom serveri nenachádza.',
'zip_error' => 'Počas importovania ZIP sa vyskytla chyba.',
),
'profile' => array(
'error' => 'Váš profil nie je možné upraviť',
'updated' => 'Váš profil bol upravený',
),
'sub' => array(
'actualize' => 'Aktualizácia',
'articles' => array(
'marked_read' => 'Vybraté články boli označené ako prečítané.',
'marked_unread' => 'Články boli označené ako neprečítané.',
),
'category' => array(
'created' => 'Kategória %s bola vytvorená.',
'deleted' => 'Kategória bola odstránená.',
'emptied' => 'Kategória bola vyprázdnená',
'error' => 'Nepodarilo sa aktualizovať kategóriu',
'name_exists' => 'Názov kategórie už existuje.',
'no_id' => 'Musíte zadať ID kategórie.',
'no_name' => 'Názov kategórie nemôže byť prázdny.',
'not_delete_default' => 'Nemôžete odstrániť prednastavenú kategóriu!',
'not_exist' => 'Kategória neexistuje!',
'over_max' => 'Dosiahli ste limit počtu kategórií (%d)',
'updated' => 'Kategória bola aktualizovaná.',
),
'feed' => array(
'actualized' => '<em>%s</em> bol aktualizovaný',
'actualizeds' => 'RSS kanál bol aktualizovaný',
'added' => 'RSS kanál <em>%s</em> bol pridaný',
'already_subscribed' => 'Tento RSS kanál už odoberáte: <em>%s</em>',
'deleted' => 'Kanál bol vymazaný',
'error' => 'Kanál sa nepodarilo aktualizovať',
'internal_problem' => 'Kanál sa nepodarilo pridať. <a href="%s">Prečítajte si záznamy FreshRSS</a>, ak chcete poznať podrobnosti. Skúste pridať kanál pomocou <code>#force_feed</code> v odkaze (URL).',
'invalid_url' => 'Odkaz <em>%s</em> je neplatný',
'n_actualized' => 'Počet aktualizovaných kanálov: %d',
'n_entries_deleted' => 'Počet vymazaných článkov: %d',
'no_refresh' => 'Žiadny kanál sa neaktualizoval…',
'not_added' => 'Kanál <em>%s</em> sa nepodarilo pridať',
'over_max' => 'Dosiahli ste limit počtu kanálov (%d)',
'updated' => 'Kanál bol aktualizovaný',
),
'purge_completed' => 'Čistenie ukončené. Počet vymazaných článkov: %d',
),
'update' => array(
'can_apply' => 'FreshRSS sa teraz aktualizuje <strong>na verziu %s</strong>.',
'error' => 'Počas aktualizácie sa vyskytla chyba: %s',
'file_is_nok' => 'Je dostupná nová <strong>verzia %s</strong>, ale skontrolujte prístupové práva priečinka <em>%s</em>. HTTP server musí mať právo doň zapisovať.',
'finished' => 'Aktualizácia prebehla úspešne!',
'none' => 'Žiadne aktualizácie',
'server_not_found' => 'Nepodarilo sa nájsť server s aktualizáciami. [%s]',
),
'user' => array(
'created' => array(
'_' => 'Používateľ %s bol vytvorený',
'error' => 'Používateľ %s nebol vytvorený',
),
'deleted' => array(
'_' => 'Používateľ %s bol vymazaný',
'error' => 'Používateľ %s nebol vymazaný',
),
'updated' => array(
'_' => 'Používateľ %s bol aktualizovaný',
'error' => 'Používateľ %s nebol aktualizovaný',
),
),
);

180
app/i18n/sk/gen.php Normal file
View File

@@ -0,0 +1,180 @@
<?php
return array(
'action' => array(
'actualize' => 'Aktualizovať',
'back_to_rss_feeds' => '← Späť na vaše RSS kanály',
'cancel' => 'Zrušiť',
'create' => 'Vytvoriť',
'disable' => 'Zakázať',
'empty' => 'Vyprázdniť',
'enable' => 'Povoliť',
'export' => 'Exportovať',
'filter' => 'Filtrovať',
'import' => 'Importovať',
'manage' => 'Spravovať',
'mark_favorite' => 'Označiť ako obľúbené',
'mark_read' => 'Označiť ako prečítané',
'remove' => 'Odstrániť',
'see_website' => 'Zobraziť webovú stránku',
'submit' => 'Poslať',
'truncate' => 'Vymazať všetky články',
'update' => 'Aktualizovať',
),
'auth' => array(
'email' => 'E-mailová adresa',
'keep_logged_in' => 'Zostať prihlásený <small>(počet dní: %s)</small>',
'login' => 'Prihlásiť',
'logout' => 'Odhlásiť',
'password' => array(
'_' => 'Heslo',
'format' => '<small>Najmenej 7 znakov</small>',
),
'registration' => array(
'_' => 'Nový účet',
'ask' => 'Vytvoriť účet?',
'title' => 'Vytvorenie účtu',
),
'reset' => 'Reset prihlásenia',
'username' => array(
'_' => 'Používateľské meno',
'admin' => 'Administrátorské používateľské meno',
'format' => '<small>maximálne 16 alfanumerických znakov</small>',
),
),
'date' => array(
'Apr' => '\\A\\p\\r\\í\\l',
'apr' => 'Apr.',
'april' => 'Apríl',
'Aug' => '\\A\\u\\g\\u\\s\\t',
'aug' => 'Aug.',
'august' => 'August',
'before_yesterday' => 'Predvčerom',
'Dec' => '\\D\\e\\c\\e\\m\\b\\e\\r',
'dec' => 'Dec.',
'december' => 'December',
'Feb' => '\\F\\e\\b\\r\\u\\á\\r',
'feb' => 'Feb.',
'february' => 'Február',
'format_date' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y',
'format_date_hour' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y \\a\\t H\\:i',
'fri' => 'Pi',
'Jan' => '\\J\\a\\n\\u\\á\\r',
'jan' => 'Jan.',
'january' => 'Január',
'Jul' => '\\J\\ú\\l',
'jul' => 'Júl',
'july' => 'Júl',
'Jun' => '\\J\\ú\\n',
'jun' => 'Jún',
'june' => 'Jún',
'last_3_month' => 'Posledné 3 mesiace',
'last_6_month' => 'Posledných 6 mesiacov',
'last_month' => 'Posledný mesiac',
'last_week' => 'Posledný týždeň',
'last_year' => 'Posledný rok',
'Mar' => '\\M\\a\\r\\e\\c',
'mar' => 'Mar.',
'march' => 'Marec',
'May' => '\\M\\á\\j',
'may' => 'Máj',
'may_' => 'Máj',
'mon' => 'Po',
'month' => 'mesiace',
'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r',
'nov' => 'Nov.',
'november' => 'November',
'Oct' => '\\O\\k\\t\\ó\\b\\e\\r',
'oct' => 'Okt.',
'october' => 'Október',
'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',
'sat' => 'So',
'sep' => 'Sept.',
'september' => 'September',
'sun' => 'Ne',
'thu' => 'Št',
'today' => 'Dnes',
'tue' => 'Ut',
'wed' => 'St',
'yesterday' => 'Včera',
),
'freshrss' => array(
'_' => 'FreshRSS',
'about' => 'O FreshRSS',
),
'js' => array(
'category_empty' => 'Prázdna kategória',
'confirm_action' => 'Určite chcete vykonať túto akciu? Zmeny budú nezvratné!',
'confirm_action_feed_cat' => 'Určite chcete vykonať túto akciu? Prídete o súvisiace obľúbené a používateľské dopyty. Zmeny budú nezvratné!',
'feedback' => array(
'body_new_articles' => 'Počet nových článkov v čítačke FreshRSS: %%d',
'request_failed' => 'Nepodarilo sa spracovať váš dopyt, pravdepodobne kvôli problému s pripojením do internetu.',
'title_new_articles' => 'FreshRSS: nové články!',
),
'new_article' => 'Našli sa nové články. Kliknite na obnovenie stránky.',
'should_be_activated' => 'Musíte povoliť JavaScript',
),
'menu' => array(
'about' => 'O FreshRSS',
'admin' => 'Administrácia',
'archiving' => 'Archivácia',
'authentication' => 'Prihlásenie',
'check_install' => 'Kontroloa inštalácie',
'configuration' => 'Nastavenia',
'display' => 'Zobrazenie',
'extensions' => 'Rozšírenia',
'logs' => 'Záznamy',
'queries' => 'Používateľské dopyty',
'reading' => 'Čítanie',
'search' => 'Hľadajte slová alebo #značky',
'sharing' => 'Zdieľanie',
'shortcuts' => 'Skratky',
'stats' => 'Štatistiky',
'system' => 'Nastavenie systému',
'update' => 'Aktualizácia',
'user_management' => 'Spravovať používateľov',
'user_profile' => 'Profil',
),
'pagination' => array(
'first' => 'Prvý',
'last' => 'Posledný',
'load_more' => 'Načítať viac článkov',
'mark_all_read' => 'Označiť všetko prečítané',
'next' => 'Ďalší',
'nothing_to_load' => 'Žiadne nové články',
'previous' => 'Predošlý',
),
'share' => array(
'blogotext' => 'Blogotext',
'diaspora' => 'Diaspora*',
'email' => 'E-mail',
'facebook' => 'Facebook',
'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
'Known' => 'Stránky založené na Known',
'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pinboard' => 'Pinboard',
'pocket' => 'Pocket',
'print' => 'Print',
'shaarli' => 'Shaarli',
'twitter' => 'Twitter',
'wallabag' => 'wallabag v1',
'wallabagv2' => 'wallabag v2',
),
'short' => array(
'attention' => 'Upozornenie!',
'blank_to_disable' => 'Ak chcete zakázať, ponechajte prázdne',
'by_author' => 'Od:',
'by_default' => 'Prednastavené',
'damn' => 'Sakra!',
'default_category' => 'Bez kategórie',
'no' => 'Nie',
'not_applicable' => 'Nie je k dispozícii',
'ok' => 'OK',
'or' => 'alebo',
'yes' => 'Áno',
),
);

63
app/i18n/sk/index.php Normal file
View File

@@ -0,0 +1,63 @@
<?php
return array(
'about' => array(
'_' => 'O FreshRSS',
'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
'bugs_reports' => 'Nahlásiť chybu',
'credits' => 'Poďakovanie',
'credits_content' => 'Niektoré časti vzhľadu pochádzajú z <a href="http://twitter.github.io/bootstrap/">Bootstrap</a>u, aj keď FreshRSS tento framework nepoužíva. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Ikony</a> sú z <a href="https://www.gnome.org/">GNOME project</a>. Font <em>Open Sans</em> zabezpečil <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a>. FreshRSS je založený na PHP frameworku <a href="https://github.com/marienfressinaud/MINZ">Minz</a>.',
'freshrss_description' => 'FreshRSS je čítačka RSS kanálov, ktorú môžete nasadiť na vlastný server podobne ako <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> alebo <a href="http://leed.idleman.fr/">Leed</a>. Ide o jednoduchý a zároveň dobre nastaviteľný nástroj.',
'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">na Github</a>e',
'license' => 'Licencia',
'project_website' => 'Webová stránka projektu',
'title' => 'O FreshRSS',
'version' => 'Verzia',
'website' => 'Webová stránka',
),
'feed' => array(
'add' => 'Môžete pridať kanály.',
'empty' => 'Žiadne články.',
'rss_of' => 'RSS kanál pre %s',
'title' => 'Vaše RSS kanály',
'title_global' => 'Prehľad',
'title_fav' => 'Vaše obľúbené',
),
'log' => array(
'_' => 'Záznamy',
'clear' => 'Vymazať záznamy',
'empty' => 'Súbor záznamu je prázdny',
'title' => 'Záznamy',
),
'menu' => array(
'about' => 'O FreshRSS',
'add_query' => 'Vytvoriť dopyt',
'before_one_day' => 'Pred 1 dňom',
'before_one_week' => 'Pred 1 týždňom',
'favorites' => 'Obľúbené (%s)',
'global_view' => 'Prehľad',
'main_stream' => 'Všetky kanály',
'mark_all_read' => 'Označiť všetko ako prečítané',
'mark_cat_read' => 'Označiť kategóriu ako prečítanú',
'mark_feed_read' => 'Označiť kanál ako prečítaný',
'mark_selection_unread' => 'Označiť označené ako prečítané',
'newer_first' => 'Novšie hore',
'non-starred' => 'Zobraziť všetko okrem obľúbených',
'normal_view' => 'Základné zobrazenie',
'older_first' => 'Staršie hore',
'queries' => 'Používateľské dopyty',
'read' => 'Zobraziť prečítané',
'reader_view' => 'Zobrazenie na čítanie',
'rss_view' => 'RSS kanál',
'search_short' => 'Hľadať',
'starred' => 'Zobraziť obľúbené',
'stats' => 'Štatistiky',
'subscription' => 'Správca odberov',
'tags' => 'Moje nálepky',
'unread' => 'Zobraziť neprečítané',
),
'share' => 'Zdieľať',
'tag' => array(
'related' => 'Značky článku',
),
);

123
app/i18n/sk/install.php Normal file
View File

@@ -0,0 +1,123 @@
<?php
return array(
'action' => array(
'finish' => 'Dokončiť inštaláciu',
'fix_errors_before' => 'Prosím, pred pokračovaním opravte chyby.',
'keep_install' => 'Použiť predošlé nastavenia',
'next_step' => 'Ďalší krok',
'reinstall' => 'Preinštalovať FreshRSS',
),
'auth' => array(
'form' => 'Webový formulár (tradičný, vyžaduje JavaScript)',
'http' => 'HTTP (pre pokročilých používateľov s HTTPS)',
'none' => 'Žiadny (nebezpečné)',
'password_form' => 'Heslo<br /><small>(pre prihlásenie cez webový formulár)</small>',
'password_format' => 'Najmenej 7 znakov',
'type' => 'Spôsob prihlásenia',
),
'bdd' => array(
'_' => 'Databáza',
'conf' => array(
'_' => 'Nastavenia databázy',
'ko' => 'Skontrolovať vaše informácie o databáze.',
'ok' => 'Nastavenia databázy boli uložené.',
),
'host' => 'Server',
'password' => 'Heslo databázy',
'prefix' => 'Predpona názvu tabuľky',
'type' => 'Druh databázy',
'username' => 'Používateľské meno databázy',
),
'check' => array(
'_' => 'Kontrola',
'already_installed' => 'Zistilo sa, že FreshRSS je už nainštalovaný!',
'cache' => array(
'nok' => 'Skontrolujte oprávnenia prístupu do priečinku <em>./data/cache</em>. HTTP server musí mať právo doň zapisovať.',
'ok' => 'Oprávnenia prístupu do priečinku vyrovnávacej pamäte sú OK.',
),
'ctype' => array(
'nok' => 'Nepodarilo sa nájsť požadovanú knižnicu na kontrolu typu znakov (php-ctype).',
'ok' => 'Našla sa požadovaná knižnica na kontrolu typu znakov (ctype).',
),
'curl' => array(
'nok' => 'Nepodarilo sa nájsť knižnicu cURL (balík php-curl).',
'ok' => 'Našla sa knižnica cURL.',
),
'data' => array(
'nok' => 'Skontrolujte oprávnenia prístupu do priečinku <em>./data</em>. HTTP server musí mať právo doň zapisovať.',
'ok' => 'Oprávnenia prístupu do priečinku údajov sú OK.',
),
'dom' => array(
'nok' => 'Nepodarilo sa nájsť požadovanú knižnicu na prehliadanie DOM.',
'ok' => 'Našla sa požadovaná knižnica na prehliadanie DOM.',
),
'favicons' => array(
'nok' => 'Skontrolujte oprávnenia prístupu do priečinku <em>./data/favicons</em>. HTTP server musí mať právo doň zapisovať.',
'ok' => 'Oprávnenia prístupu do priečinku ikôn obľúbených sú OK.',
),
'fileinfo' => array(
'nok' => 'Nepodarilo sa nájsť knižniuc PHP fileinfo (balík fileinfo).',
'ok' => 'Našla sa knižnica fileinfo.',
),
'http_referer' => array(
'nok' => 'Prosím, skontrolujte, či ste nezmenili váš HTTP REFERER.',
'ok' => 'Váš HTTP REFERER je OK.',
),
'json' => array(
'nok' => 'Nepodarilo sa nájsť požadovanú knižnicu na spracovanie formátu JSON.',
'ok' => 'Našla sa požadovaná knižnica na spracovanie formátu JSON.',
),
'mbstring' => array(
'nok' => 'Nepodarilo sa nájsť požadovanú knižnicu mbstring pre Unicode.',
'ok' => 'Našla sa požadovaná knižnica mbstring pre Unicode.',
),
'minz' => array(
'nok' => 'Nepodarilo sa nájsť framework Minz.',
'ok' => 'Našiel sa framework Minz.',
),
'pcre' => array(
'nok' => 'Nepodarilo sa nájsť požadovanú knižnicu pre regulárne výrazy (php-pcre).',
'ok' => 'Našla sa požadovaná knižnica pre regulárne výrazy (PCRE).',
),
'pdo' => array(
'nok' => 'Nepodarilo sa nájsť PDO alebo niektorý z podporovaných ovládačov (pdo_mysql, pdo_sqlite, pdo_pgsql).',
'ok' => 'Našiel sa PDO a aspoň jeden z podporovaných ovládačov (pdo_mysql, pdo_sqlite, pdo_pgsql).',
),
'php' => array(
'nok' => 'Vaša verzia PHP je %s, ale FreshRSS vyžaduje minimálne verziu %s.',
'ok' => 'Vaša verzia PHP %s je kompatibilná s FreshRSS.',
),
'users' => array(
'nok' => 'Skontrolujte oprávnenia prístupu do priečinku <em>./data/users</em>. HTTP server musí mať právo doň zapisovať.',
'ok' => 'Oprávnenia prístupu do priečinku používateľov sú OK.',
),
'xml' => array(
'nok' => 'Nepodarilo sa nájsť požadovanú knižnicu na spracovanie formátu XML.',
'ok' => 'Našla sa požadovaná knižnica na spracovanie formátu XML.',
),
),
'conf' => array(
'_' => 'Hlavné nastavenia',
'ok' => 'Hlavné nastavenia boli uložené.',
),
'congratulations' => 'Nastavenia!',
'default_user' => 'Hlavné používateľské meno <small>(najviac 16 alfanumerických znakov)</small>',
'delete_articles_after' => 'Vymazať články po',
'fix_errors_before' => 'Prosím, pred pokračovaním opravte chyby.',
'javascript_is_better' => 'FreshRSS si užijete viac, keď povolíte JavaScript',
'js' => array(
'confirm_reinstall' => 'Ak budete pokračovať v preinštalovaní FreshRSS, stratíte vaše predošlé nastavenia. Naozaj chcete pokračovať?',
),
'language' => array(
'_' => 'Jazyk',
'choose' => 'Vyberte jazyk pre FreshRSS',
'defined' => 'Jazyk bol nastavený.',
),
'not_deleted' => 'Niečo sa nepodarilo. Musíte ručne zmazať súbor <em>%s</em>.',
'ok' => 'Inštalácia bola úspešná.',
'step' => 'krok %d',
'steps' => 'Kroky',
'title' => 'Inštalácia · FreshRSS',
'this_is_the_end' => 'Toto je koniec',
);

100
app/i18n/sk/sub.php Normal file
View File

@@ -0,0 +1,100 @@
<?php
return array(
'api' => array(
'documentation' => 'Skopírujte tento odkaz a použite ho v inom programe.',
'title' => 'API',
),
'bookmarklet' => array(
'documentation' => 'Presunte toto tlačidlo do vašich záložiek, alebo kliknite pravým a zvoľte "Uložiť odkaz do záložiek". Potom kliknite na tlačidlo "Odoberať" na ktorejkoľvek stránke, ktorú chcete odoberať.',
'label' => 'Odoberať',
'title' => 'Záložka',
),
'category' => array(
'_' => 'Kategória',
'add' => 'Pridať kategóriu',
'empty' => 'Prázdna kategória',
'information' => 'Informácia',
'new' => 'Nová kategória',
'title' => 'Názov',
),
'feed' => array(
'add' => 'Pridať RSS kanál',
'advanced' => 'Pokročilé',
'archiving' => 'Archivovanie',
'auth' => array(
'configuration' => 'Prihlásenie',
'help' => 'Povoliť prístup do kanálov chránených cez HTTP.',
'http' => 'Prihlásenie cez HTTP',
'password' => 'Heslo pre HTTP',
'username' => 'Používateľské meno pre HTTP',
),
'clear_cache' => 'Vždy vymazať vyrovnávaciu pamäť',
'css_help' => 'Stiahnuť skrátenú verziu RSS kanála (pozor, vyžaduje viac času!)',
'css_path' => 'Pôvodný CSS súbor článku z webovej stránky',
'description' => 'Popis',
'empty' => 'Tento kanál je prázdny. Overte, prosím, či je ešte spravovaný autorom.',
'error' => 'Vyskytol sa problém s týmto kanálom. Overte, prosím, či kanál stále existuje, potom ho obnovte.',
'filteractions' => array(
'_' => 'Filtrovať akcie',
'help' => 'Napíšte jeden výraz hľadania na riadok.',
),
'information' => 'Informácia',
'keep_history' => 'Minimálny počet článkov na uchovanie',
'moved_category_deleted' => 'Keď vymažete kategóriu, jej kanály sa automaticky zaradia pod <em>%s</em>.',
'mute' => 'stíšiť',
'no_selected' => 'Nevybrali ste kanál.',
'number_entries' => 'Počet článkov: %d',
'priority' => array(
'_' => 'Viditeľnosť',
'archived' => 'Nezobrazovať (archivované)',
'main_stream' => 'Zobraziť v prehľade kanálov',
'normal' => 'Zobraziť vo svojej kategórii',
),
'websub' => 'Okamžité oznámenia cez WebSub',
'show' => array(
'all' => 'Zobraziť všetky kanály',
'error' => 'Zobraziť iba kanály s chybou',
),
'showing' => array(
'error' => 'Zobraziť iba kanály s chybou',
),
'ssl_verify' => 'Overiť bezpečnosť SSL',
'stats' => 'Štatistiky',
'think_to_add' => 'Mali by ste pridať kanály.',
'timeout' => 'Doba platnosti dá v sekundách',
'title' => 'Nadpis',
'title_add' => 'Pridať kanál RSS',
'ttl' => 'Automaticky neaktualizovať častejšie ako',
'url' => 'Odkaz kanála',
'validator' => 'Skontrolovať platnosť kanála',
'website' => 'Odkaz webovej stránky',
),
'firefox' => array(
'documentation' => 'Pridajte RSS kanály do Firefoxu <a href="https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox#Adding_a_new_feed_reader_manually">pomocou tohto návodu</a>.',
'title' => 'RSS čítačka vo Firefoxe',
),
'import_export' => array(
'export' => 'Exportovať',
'export_opml' => 'Exportovať zoznam kanálov (OPML)',
'export_starred' => 'Exportovať vaše obľúbené',
'export_labelled' => 'Exportovať vaše označené články',
'feed_list' => 'Zoznam článkov %s',
'file_to_import' => 'Súbor na import<br />(OPML, JSON alebo ZIP)',
'file_to_import_no_zip' => 'Súbor na import<br />(OPML alebo JSON)',
'import' => 'Importovať',
'starred_list' => 'Zoznam obľúbených článkov',
'title' => 'Import / export',
),
'menu' => array(
'bookmark' => 'Odoberať (záložka FreshRSS)',
'import_export' => 'Import / export',
'subscription_management' => 'Správa odoberaných kanálov',
'subscription_tools' => 'Nástroje na odoberanie kanálov',
),
'title' => array(
'_' => 'Správa odoberaných kanálov',
'feed_management' => 'Správa RSS kanálov',
'subscription_tools' => 'Nástroje na odoberanie kanálov',
),
);

View File

@@ -61,7 +61,7 @@ function initTranslate() {
}
function get_best_language() {
$accept = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$accept = empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? '' : $_SERVER['HTTP_ACCEPT_LANGUAGE'];
return strtolower(substr($accept, 0, 2));
}
@@ -413,7 +413,7 @@ function printStep1() {
<?php if ($res['php'] == 'ok') { ?>
<p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.php.ok', PHP_VERSION); ?></p>
<?php } else { ?>
<p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.php.nok', PHP_VERSION, '5.3.8'); ?></p>
<p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.php.nok', PHP_VERSION, '5.5.0'); ?></p>
<?php } ?>
<?php if ($res['minz'] == 'ok') { ?>

View File

@@ -1,10 +1,7 @@
<?php
$username = Minz_Session::param('currentUser', '_');
$options = 0;
if (version_compare(PHP_VERSION, '5.4.0') >= 0) {
$options = JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
}
$options = JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
$articles = array(
'id' => 'user/' . str_replace('/', '', $username) . '/state/org.freshrss/' . $this->type,

View File

@@ -9,7 +9,7 @@
<p class="alert <?php echo $status ? 'alert-success' : 'alert-error'; ?>">
<?php
if ($key === 'php') {
echo _t('admin.check_install.' . $key . '.' . ($status ? 'ok' : 'nok'), PHP_VERSION, '5.3.8');
echo _t('admin.check_install.' . $key . '.' . ($status ? 'ok' : 'nok'), PHP_VERSION, '5.5.0');
} else {
echo _t('admin.check_install.' . $key . '.' . ($status ? 'ok' : 'nok'));
}

View File

@@ -1,6 +1,8 @@
<?php
return array(
'admin.stats.feed',
'conf.query.number',
'conf.sharing.blogotext',
'conf.sharing.diaspora',
'conf.sharing.email',
@@ -9,6 +11,8 @@ return array(
'conf.sharing.shaarli',
'conf.sharing.twitter',
'conf.sharing.wallabag',
'install.bdd._',
'install.bdd.host',
'gen.date.Apr',
'gen.date.Dec',
'gen.date.Nov',
@@ -19,19 +23,25 @@ return array(
'gen.lang.en',
'gen.lang.es',
'gen.lang.fr',
'gen.lang.he',
'gen.lang.it',
'gen.lang.kr',
'gen.lang.nl',
'gen.lang.oc',
'gen.lang.pt-br',
'gen.lang.ru',
'gen.lang.sk',
'gen.lang.tr',
'gen.lang.zh-cn',
'gen.share.blogotext',
'gen.share.diaspora',
'gen.share.facebook',
'gen.share.email',
'gen.share.linkedin',
'gen.share.mastodon',
'gen.share.movim',
'gen.share.pinboard',
'gen.share.pocket',
'gen.share.print',
'gen.share.shaarli',
'gen.share.twitter',
@@ -39,6 +49,7 @@ return array(
'gen.share.wallabagv2',
'gen.share.jdh',
'gen.share.gnusocial',
'gen.short.ok',
'index.about.agpl3',
'index.about.website',
'index.about.version',

66
cli/i18n/ignore/sk.php Normal file
View File

@@ -0,0 +1,66 @@
<?php
return array(
'conf.sharing.blogotext',
'conf.sharing.diaspora',
'conf.sharing.email',
'conf.sharing.facebook',
'conf.sharing.print',
'conf.sharing.shaarli',
'conf.sharing.twitter',
'conf.sharing.wallabag',
'gen.freshrss._',
'gen.date.apr',
'gen.date.Aug',
'gen.date.aug',
'gen.date.august',
'gen.date.Dec',
'gen.date.dec',
'gen.date.december',
'gen.date.feb',
'gen.date.format_date',
'gen.date.format_date_hour',
'gen.date.jan',
'gen.date.mar',
'gen.date.Nov',
'gen.date.nov',
'gen.date.november',
'gen.date.Sep',
'gen.date.sep',
'gen.date.september',
'gen.lang.cz',
'gen.lang.de',
'gen.lang.en',
'gen.lang.es',
'gen.lang.fr',
'gen.lang.he',
'gen.lang.it',
'gen.lang.kr',
'gen.lang.nl',
'gen.lang.oc',
'gen.lang.pt-br',
'gen.lang.ru',
'gen.lang.tr',
'gen.lang.sk',
'gen.lang.zh-cn',
'gen.share.blogotext',
'gen.share.diaspora',
'gen.share.facebook',
'gen.share.email',
'gen.share.linkedin',
'gen.share.mastodon',
'gen.share.movim',
'gen.share.pinboard',
'gen.share.pocket',
'gen.share.print',
'gen.share.shaarli',
'gen.share.twitter',
'gen.share.wallabag',
'gen.share.wallabagv2',
'gen.share.jdh',
'gen.share.gnusocial',
'index.about.agpl3',
'sub.api.title',
'sub.import_export.title',
'sub.menu.import_export',
);

View File

@@ -7,15 +7,11 @@ You need to verify that your server can run FreshRSS before installing it. If yo
| Software | Recommended | Works also with |
| ----------- | ---------------- | ----------------------------- |
| Web server | **Apache 2** | Nginx |
| PHP | **PHP 5.5+** | PHP 5.3.8+ |
| PHP modules | Required: libxml, cURL, PDO_MySQL, PCRE and ctype. <br>Required (32-bit only): GMP <br> Recommanded: JSON, Zlib, mbstring, iconv, ZipArchive <br> *For the whole modules list see [Dockerfile](https://github.com/FreshRSS/FreshRSS/blob/744a9e8cf00aef7dec0acfa5f90f0dcfa2ef8837/Docker/Dockerfile-Alpine#L7-L9)* | |
| PHP | **PHP 7+** | PHP 5.5+ |
| PHP modules | Required: libxml, cURL, PDO_MySQL, PCRE and ctype. <br>Required (32-bit only): GMP <br> Recommanded: JSON, Zlib, mbstring, iconv, ZipArchive <br> *For the whole modules list see [Dockerfile](https://github.com/FreshRSS/FreshRSS/blob/master/Docker/Dockerfile-Alpine#L7-L9)* | |
| Database | **MySQL 5.5.3+** | SQLite 3.7.4+ |
| Browser | **Firefox** | Chrome, Opera, Safari, or IE11+ |
## Important notice
FreshRSS **CAN** work with PHP 5.3.8+. To do so, we are using specific functions available in the [''password_compat'' library](https://github.com/ircmaxell/password_compat#requirements) for the form authentication.
# Getting the appropriate version of FreshRSS

View File

@@ -148,26 +148,9 @@ abstract class ClassName {}
Files must be encoded with UTF-8 character set.
## PHP 5.3 compatibility
## PHP compatibility
Do not get an array item directly from a function or a method. Use a variable.
```php
// code with PHP 5.3 compatibility
$my_variable = function_returning_an_array();
echo $my_variable[0];
// code without PHP 5.3 compatibility
echo function_returning_an_array()[0];
```
Do not use short array declaration.
```php
// code with PHP 5.3 compatibility
$variable = array();
// code without PHP 5.3 compatibility
$variable = [];
```
Ensure that your code is working with a PHP version as old as what FreshRSS officially supports.
## Miscellaneous

View File

@@ -29,7 +29,7 @@ See the [page about the Fever compatible API](06_Fever_API.md) for another possi
* If you get *Service Unavailable!*, then check from step 1 again.
* With __Apache__:
* If you get *FAIL getallheaders!*, the combination of your PHP version and your Web server does not provide access to [`getallheaders`](http://php.net/getallheaders)
* Update to PHP 5.4+, or use PHP as module instead of CGI. Otherwise turn on Apache `mod_setenvif` (often enabled by default), or `mod_rewrite` with the following procedure:
* Turn on Apache `mod_setenvif` (often enabled by default), or `mod_rewrite` with the following procedure:
* Allow [`FileInfo` in `.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride): see the [server setup](../admins/02_Installation.md) again.
* Enable [`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html):
* With Debian / Ubuntu: `sudo a2enmod rewrite`

View File

@@ -148,26 +148,9 @@ abstract class NomDeLaClasse {}
Les fichiers doivent être encodés en UTF-8.
## Compatibilité avec PHP 5.3
## Compatibilité PHP
Il ne faut pas demander l'indice d'un tableau qui est retourné par une fonction ou une méthode. Il faut passer par une variable intermédiaire.
```php
// code compatible avec PHP 5.3
$ma_variable = fonction_qui_retourne_un_tableau();
echo $ma_variable[0];
// code incompatible avec PHP 5.3
echo fonction_qui_retourne_un_tableau()[0];
```
Il ne faut pas utiliser la déclaration raccourcie des tableaux.
```php
// code compatible avec PHP 5.3
$variable = array();
// code incompatible avec PHP 5.3
$variable = [];
```
Assurez-vous que votre code fonctionne avec une version de PHP aussi ancienne que celle que FreshRSS supporte officiellement.
## Divers

View File

@@ -7,15 +7,11 @@ Il est toutefois de votre responsabilité de vérifier que votre hébergement pe
| Logiciel | Recommandé | Fonctionne aussi avec |
| -------- | ----------- | --------------------- |
| Serveur web | **Apache 2** | Nginx |
| PHP | **PHP 5.5+** | PHP 5.3.8+ |
| Modules PHP | Requis : libxml, cURL, PDO_MySQL, PCRE et ctype<br>Requis (32 bits seulement) : GMP<br>Recommandé : JSON, Zlib, mbstring et iconv, ZipArchive<br>*Pour une liste complète des modules nécessaires voir le [Dockerfile](https://github.com/FreshRSS/FreshRSS/blob/744a9e8cf00aef7dec0acfa5f90f0dcfa2ef8837/Docker/Dockerfile-Alpine#L7-L9)* | |
| PHP | **PHP 7+** | PHP 5.5+ |
| Modules PHP | Requis : libxml, cURL, PDO_MySQL, PCRE et ctype<br>Requis (32 bits seulement) : GMP<br>Recommandé : JSON, Zlib, mbstring et iconv, ZipArchive<br>*Pour une liste complète des modules nécessaires voir le [Dockerfile](https://github.com/FreshRSS/FreshRSS/blob/master/Docker/Dockerfile-Alpine#L7-L9)* | |
| Base de données | **MySQL 5.5.3+** | SQLite 3.7.4+ |
| Navigateur | **Firefox** | Chrome, Opera, Safari, or IE 11+ |
## Note importante
FreshRSS **PEUT** fonctionner sur la version de PHP 5.3.8+. En effet, nous utilisons des fonctions spécifiques pour la connexion par formulaire et notamment la [bibliothèque ''password_compat''](https://github.com/ircmaxell/password_compat#requirements).
# Choisir la bonne version de FreshRSS
FreshRSS possède trois versions différentes (nous parlons de branches) qui sortent à des fréquences plus ou moins rapides. Aussi prenez le temps de comprendre à quoi correspond chacune de ces versions.

View File

@@ -29,7 +29,7 @@ Voir la [page sur lAPI compatible Fever](06_Fever_API.md) pour une autre poss
* Si vous obtenez *Service Unavailable!*, retourner à létape 6.
* Avec __Apache__:
* Si vous obtenez *FAIL getallheaders!*, alors la combinaison de votre version de PHP et de votre serveur Web ne permet pas laccès à [`getallheaders`](http://php.net/getallheaders)
* Utilisez au moins PHP 5.4+, ou utilisez PHP en tant que module plutôt que CGI. Sinon, activer Apache `mod_setenvif` (souvent activé par défault), ou `mod_rewrite` avec la procédure suivante :
* Activer Apache `mod_setenvif` (souvent activé par défault), ou `mod_rewrite` avec la procédure suivante :
* Autoriser [`FileInfo` dans `.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride) : revoir [linstallation du serveur](01_Installation.md).
* Activer [`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html) :
* Sur Debian / Ubuntu : `sudo a2enmod rewrite`

View File

@@ -198,7 +198,7 @@ class Minz_Configuration {
return false;
}
// Clear PHP 5.5+ cache for include
// Clear PHP cache for include
if (function_exists('opcache_invalidate')) {
opcache_invalidate($this->config_filename);
}

View File

@@ -115,21 +115,26 @@ class Minz_FrontController {
}
private function setReporting() {
$conf = Minz_Configuration::get('system');
switch($conf->environment) {
case 'production':
error_reporting(E_ALL);
ini_set('display_errors', 'Off');
ini_set('log_errors', 'On');
break;
case 'development':
error_reporting(E_ALL);
ini_set('display_errors', 'On');
ini_set('log_errors', 'On');
break;
case 'silent':
error_reporting(0);
break;
$envType = getenv('FRESHRSS_ENV');
if ($envType == '') {
$conf = Minz_Configuration::get('system');
$envType = $conf->environment;
}
switch ($envType) {
case 'development':
error_reporting(E_ALL);
ini_set('display_errors', 'On');
ini_set('log_errors', 'On');
break;
case 'silent':
error_reporting(0);
break;
case 'production':
default:
error_reporting(E_ALL);
ini_set('display_errors', 'Off');
ini_set('log_errors', 'On');
break;
}
}
}

View File

@@ -48,7 +48,7 @@ class Minz_ModelArray {
throw new Minz_PermissionDeniedException($this->filename);
}
if (function_exists('opcache_invalidate')) {
opcache_invalidate($this->filename); //Clear PHP 5.5+ cache for include
opcache_invalidate($this->filename); //Clear PHP cache for include
}
return true;
}

View File

@@ -111,7 +111,7 @@ class Minz_ModelPdo {
$this->bd->beginTransaction();
}
public function inTransaction() {
return $this->bd->inTransaction(); //requires PHP >= 5.3.3
return $this->bd->inTransaction();
}
public function commit() {
$this->bd->commit();

View File

@@ -6,7 +6,7 @@ Minz_Configuration::register('default_system', join_path(FRESHRSS_PATH, 'config.
Minz_Configuration::register('default_user', join_path(FRESHRSS_PATH, 'config-user.default.php'));
function checkRequirements($dbType = '') {
$php = version_compare(PHP_VERSION, '5.3.8') >= 0;
$php = version_compare(PHP_VERSION, '5.5.0') >= 0;
$minz = file_exists(join_path(LIB_PATH, 'Minz'));
$curl = extension_loaded('curl');
$pdo_mysql = extension_loaded('pdo_mysql');

View File

@@ -1,9 +1,9 @@
<?php
if (version_compare(PHP_VERSION, '5.3.8', '<')) {
die('FreshRSS error: FreshRSS requires PHP 5.3.8+!');
if (version_compare(PHP_VERSION, '5.5.0', '<')) {
die('FreshRSS error: FreshRSS requires PHP 5.5.0+!');
}
if (!function_exists('json_decode')) {
if (!function_exists('json_decode')) { //PHP bug #63520 < PHP 7
require_once(__DIR__ . '/JSON.php');
function json_decode($var, $assoc = false) {
$JSON = new Services_JSON($assoc ? SERVICES_JSON_LOOSE_TYPE : 0);
@@ -19,8 +19,6 @@ 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);
@@ -68,12 +66,7 @@ function idn_to_puny($url) {
$parts = parse_url($url);
if (!empty($parts['host'])) {
$idn = $parts['host'];
// INTL_IDNA_VARIANT_UTS46 is defined starting in PHP 5.4
if (defined('INTL_IDNA_VARIANT_UTS46')) {
$puny = idn_to_ascii($idn, 0, INTL_IDNA_VARIANT_UTS46);
} else {
$puny = idn_to_ascii($idn);
}
$puny = idn_to_ascii($idn, 0, INTL_IDNA_VARIANT_UTS46);
$pos = strpos($url, $idn);
if ($pos !== false) {
return substr_replace($url, $puny, $pos, strlen($idn));
@@ -187,17 +180,10 @@ function timestamptodate ($t, $hour = true) {
function html_only_entity_decode($text) {
static $htmlEntitiesOnly = null;
if ($htmlEntitiesOnly === null) {
if (version_compare(PHP_VERSION, '5.3.4') >= 0) {
$htmlEntitiesOnly = array_flip(array_diff(
get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'UTF-8'), //Decode HTML entities
get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES, 'UTF-8') //Preserve XML entities
));
} else {
$htmlEntitiesOnly = array_map('utf8_encode', array_flip(array_diff(
get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES), //Decode HTML entities
get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES) //Preserve XML entities
)));
}
$htmlEntitiesOnly = array_flip(array_diff(
get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'UTF-8'), //Decode HTML entities
get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES, 'UTF-8') //Preserve XML entities
));
}
return strtr($text, $htmlEntitiesOnly);
}
@@ -428,7 +414,7 @@ function check_install_php() {
$pdo_pgsql = extension_loaded('pdo_pgsql');
$pdo_sqlite = extension_loaded('pdo_sqlite');
return array(
'php' => version_compare(PHP_VERSION, '5.3.8') >= 0,
'php' => version_compare(PHP_VERSION, '5.5.0') >= 0,
'minz' => file_exists(LIB_PATH . '/Minz'),
'curl' => extension_loaded('curl'),
'pdo' => $pdo_mysql || $pdo_sqlite || $pdo_pgsql,

View File

@@ -1,279 +0,0 @@
<?php
/**
* A Compatibility library with PHP 5.5's simplified password hashing API.
*
* @author Anthony Ferrara <ircmaxell@php.net>
* @license http://www.opensource.org/licenses/mit-license.html MIT License
* @copyright 2012 The Authors
*/
namespace {
if (!defined('PASSWORD_DEFAULT')) {
define('PASSWORD_BCRYPT', 1);
define('PASSWORD_DEFAULT', PASSWORD_BCRYPT);
/**
* Hash the password using the specified algorithm
*
* @param string $password The password to hash
* @param int $algo The algorithm to use (Defined by PASSWORD_* constants)
* @param array $options The options for the algorithm to use
*
* @return string|false The hashed password, or false on error.
*/
function password_hash($password, $algo, array $options = array()) {
if (!function_exists('crypt')) {
trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING);
return null;
}
if (!is_string($password)) {
trigger_error("password_hash(): Password must be a string", E_USER_WARNING);
return null;
}
if (!is_int($algo)) {
trigger_error("password_hash() expects parameter 2 to be long, " . gettype($algo) . " given", E_USER_WARNING);
return null;
}
$resultLength = 0;
switch ($algo) {
case PASSWORD_BCRYPT:
// Note that this is a C constant, but not exposed to PHP, so we don't define it here.
$cost = 10;
if (isset($options['cost'])) {
$cost = $options['cost'];
if ($cost < 4 || $cost > 31) {
trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING);
return null;
}
}
// The length of salt to generate
$raw_salt_len = 16;
// The length required in the final serialization
$required_salt_len = 22;
$hash_format = sprintf("$2y$%02d$", $cost);
// The expected length of the final crypt() output
$resultLength = 60;
break;
default:
trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING);
return null;
}
$salt_requires_encoding = false;
if (isset($options['salt'])) {
switch (gettype($options['salt'])) {
case 'NULL':
case 'boolean':
case 'integer':
case 'double':
case 'string':
$salt = (string) $options['salt'];
break;
case 'object':
if (method_exists($options['salt'], '__tostring')) {
$salt = (string) $options['salt'];
break;
}
case 'array':
case 'resource':
default:
trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING);
return null;
}
if (PasswordCompat\binary\_strlen($salt) < $required_salt_len) {
trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", PasswordCompat\binary\_strlen($salt), $required_salt_len), E_USER_WARNING);
return null;
} elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) {
$salt_requires_encoding = true;
}
} else {
$buffer = '';
$buffer_valid = false;
if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) {
$buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM);
if ($buffer) {
$buffer_valid = true;
}
}
if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) {
$buffer = openssl_random_pseudo_bytes($raw_salt_len);
if ($buffer) {
$buffer_valid = true;
}
}
if (!$buffer_valid && @is_readable('/dev/urandom')) {
$f = fopen('/dev/urandom', 'r');
$read = PasswordCompat\binary\_strlen($buffer);
while ($read < $raw_salt_len) {
$buffer .= fread($f, $raw_salt_len - $read);
$read = PasswordCompat\binary\_strlen($buffer);
}
fclose($f);
if ($read >= $raw_salt_len) {
$buffer_valid = true;
}
}
if (!$buffer_valid || PasswordCompat\binary\_strlen($buffer) < $raw_salt_len) {
$bl = PasswordCompat\binary\_strlen($buffer);
for ($i = 0; $i < $raw_salt_len; $i++) {
if ($i < $bl) {
$buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255));
} else {
$buffer .= chr(mt_rand(0, 255));
}
}
}
$salt = $buffer;
$salt_requires_encoding = true;
}
if ($salt_requires_encoding) {
// encode string with the Base64 variant used by crypt
$base64_digits =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$bcrypt64_digits =
'./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$base64_string = base64_encode($salt);
$salt = strtr(rtrim($base64_string, '='), $base64_digits, $bcrypt64_digits);
}
$salt = PasswordCompat\binary\_substr($salt, 0, $required_salt_len);
$hash = $hash_format . $salt;
$ret = crypt($password, $hash);
if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != $resultLength) {
return false;
}
return $ret;
}
/**
* Get information about the password hash. Returns an array of the information
* that was used to generate the password hash.
*
* array(
* 'algo' => 1,
* 'algoName' => 'bcrypt',
* 'options' => array(
* 'cost' => 10,
* ),
* )
*
* @param string $hash The password hash to extract info from
*
* @return array The array of information about the hash.
*/
function password_get_info($hash) {
$return = array(
'algo' => 0,
'algoName' => 'unknown',
'options' => array(),
);
if (PasswordCompat\binary\_substr($hash, 0, 4) == '$2y$' && PasswordCompat\binary\_strlen($hash) == 60) {
$return['algo'] = PASSWORD_BCRYPT;
$return['algoName'] = 'bcrypt';
list($cost) = sscanf($hash, "$2y$%d$");
$return['options']['cost'] = $cost;
}
return $return;
}
/**
* Determine if the password hash needs to be rehashed according to the options provided
*
* If the answer is true, after validating the password using password_verify, rehash it.
*
* @param string $hash The hash to test
* @param int $algo The algorithm used for new password hashes
* @param array $options The options array passed to password_hash
*
* @return boolean True if the password needs to be rehashed.
*/
function password_needs_rehash($hash, $algo, array $options = array()) {
$info = password_get_info($hash);
if ($info['algo'] != $algo) {
return true;
}
switch ($algo) {
case PASSWORD_BCRYPT:
$cost = isset($options['cost']) ? $options['cost'] : 10;
if ($cost != $info['options']['cost']) {
return true;
}
break;
}
return false;
}
/**
* Verify a password against a hash using a timing attack resistant approach
*
* @param string $password The password to verify
* @param string $hash The hash to verify against
*
* @return boolean If the password matches the hash
*/
function password_verify($password, $hash) {
if (!function_exists('crypt')) {
trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING);
return false;
}
$ret = crypt($password, $hash);
if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != PasswordCompat\binary\_strlen($hash) || PasswordCompat\binary\_strlen($ret) <= 13) {
return false;
}
$status = 0;
for ($i = 0; $i < PasswordCompat\binary\_strlen($ret); $i++) {
$status |= (ord($ret[$i]) ^ ord($hash[$i]));
}
return $status === 0;
}
}
}
namespace PasswordCompat\binary {
/**
* Count the number of bytes in a string
*
* We cannot simply use strlen() for this, because it might be overwritten by the mbstring extension.
* In this case, strlen() will count the number of *characters* based on the internal encoding. A
* sequence of bytes might be regarded as a single multibyte character.
*
* @param string $binary_string The input string
*
* @internal
* @return int The number of bytes
*/
function _strlen($binary_string) {
if (function_exists('mb_strlen')) {
return mb_strlen($binary_string, '8bit');
}
return strlen($binary_string);
}
/**
* Get a substring based on byte limits
*
* @see _strlen()
*
* @param string $binary_string The input string
* @param int $start
* @param int $length
*
* @internal
* @return string The substring
*/
function _substr($binary_string, $start, $length) {
if (function_exists('mb_substr')) {
return mb_substr($binary_string, $start, $length, '8bit');
}
return substr($binary_string, $start, $length);
}
}

View File

@@ -43,11 +43,7 @@ if (PHP_INT_SIZE < 8) { //32-bit
}
}
if (version_compare(PHP_VERSION, '5.4.0') >= 0) {
define('JSON_OPTIONS', JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
} else {
define('JSON_OPTIONS', 0);
}
define('JSON_OPTIONS', JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
function headerVariable($headerName, $varName) {
$header = '';
@@ -182,10 +178,6 @@ function authorizationToUser() {
function clientLogin($email, $pass) { //http://web.archive.org/web/20130604091042/http://undoc.in/clientLogin.html
if (FreshRSS_user_Controller::checkUsername($email)) {
if (!function_exists('password_verify')) {
include_once(LIB_PATH . '/password_compat.php');
}
FreshRSS_Context::$user_conf = get_user_configuration($email);
if (FreshRSS_Context::$user_conf == null) {
Minz_Log::warning('Invalid API user ' . $email . ': configuration cannot be found.');

View File

@@ -720,8 +720,14 @@ function init_shortcuts() {
return true;
}
const s = context.shortcuts,
k = (ev.key.trim() || ev.code).toUpperCase();
const s = context.shortcuts;
let k = (ev.key.trim() || ev.code || 'Space').toUpperCase();
//IE11
if (k === 'SPACEBAR') k = 'SPACE';
else if (k === 'DEL') k = 'DELETE';
else if (k === 'ESC') k = 'ESCAPE';
if (location.hash.match(/^#dropdown-/)) {
const n = parseInt(k);
if (n) {
@@ -803,7 +809,11 @@ function init_shortcuts() {
if (context.auto_mark_site) {
mark_read(document.querySelector('.flux.current'), true, false);
}
window.open(document.querySelector('.flux.current a.go_website').href);
const newWindow = window.open();
if (newWindow) {
newWindow.opener = null;
newWindow.location = document.querySelector('.flux.current a.go_website').href;
}
return false;
}
if (k === s.skip_next_entry) { next_entry(true); return false; }

View File

@@ -10,7 +10,6 @@
<exclude-pattern>./lib/http-conditional.php</exclude-pattern>
<exclude-pattern>./lib/JSON.php</exclude-pattern>
<exclude-pattern>./lib/lib_phpQuery.php</exclude-pattern>
<exclude-pattern>./lib/password_compat.php</exclude-pattern>
<!-- Duplicate class names are not allowed -->
<rule ref="Generic.Classes.DuplicateClassName"/>
<!-- Statements must not be empty -->