From 8a5050289ef695dc4d388eecee692ad9d83e00ce Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Thu, 3 Jul 2014 21:20:11 +0200 Subject: New install logic Now the install.php is kept in ./app/ and the trigger is ./data/do-install.php There is no need anymore to have write access in ./p/i/ --- app/install.php | 1115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1115 insertions(+) create mode 100644 app/install.php (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php new file mode 100644 index 000000000..9863dd556 --- /dev/null +++ b/app/install.php @@ -0,0 +1,1115 @@ + +define('SQL_BACKUP006', 'RENAME TABLE `%1$scategory` TO `%1$scategory006`, `%1$sfeed` TO `%1$sfeed006`, `%1$sentry` TO `%1$sentry006`;'); + +define('SQL_SHOW_COLUMNS_UPDATEv006', 'SHOW columns FROM `%1$sentry006` LIKE "id2";'); + +define('SQL_UPDATEv006', ' +ALTER TABLE `%1$scategory006` ADD id2 SMALLINT; + +SET @i = 0; +UPDATE `%1$scategory006` SET id2=(@i:=@i+1) ORDER BY id; + +ALTER TABLE `%1$sfeed006` ADD id2 SMALLINT, ADD category2 SMALLINT; + +SET @i = 0; +UPDATE `%1$sfeed006` SET id2=(@i:=@i+1) ORDER BY name; + +UPDATE `%1$sfeed006` f +INNER JOIN `%1$scategory006` c ON f.category = c.id +SET f.category2 = c.id2; + +INSERT IGNORE INTO `%2$scategory` (name) +SELECT name +FROM `%1$scategory006` +ORDER BY id2; + +INSERT IGNORE INTO `%2$sfeed` (url, category, name, website, description, priority, pathEntries, httpAuth, keep_history) +SELECT url, category2, name, website, description, priority, pathEntries, httpAuth, IF(keep_history = 1, -1, -2) +FROM `%1$sfeed006` +ORDER BY id2; + +ALTER TABLE `%1$sentry006` ADD id2 bigint; + +UPDATE `%1$sentry006` SET id2 = ((date * 1000000) + (rand() * 100000000)); + +INSERT IGNORE INTO `%2$sentry` (id, guid, title, author, link, date, is_read, is_favorite, id_feed, tags) +SELECT e0.id2, e0.guid, e0.title, e0.author, e0.link, e0.date, e0.is_read, e0.is_favorite, f0.id2, e0.tags +FROM `%1$sentry006` e0 +INNER JOIN `%1$sfeed006` f0 ON e0.id_feed = f0.id; +'); + +define('SQL_CONVERT_SELECTv006', ' +SELECT e0.id2, e0.content +FROM `%1$sentry006` e0 +INNER JOIN `%2$sentry` e1 ON e0.id2 = e1.id +WHERE e1.content_bin IS NULL'); + +define('SQL_CONVERT_UPDATEv006', 'UPDATE `%1$sentry` SET ' + . (isset($_SESSION['bd_type']) && $_SESSION['bd_type'] === 'mysql' ? 'content_bin=COMPRESS(?)' : 'content=?') + . ' WHERE id=?;'); + +define('SQL_DROP_BACKUPv006', 'DROP TABLE IF EXISTS `%1$sentry006`, `%1$sfeed006`, `%1$scategory006`;'); + +define('SQL_UPDATE_CACHED_VALUES', ' +UPDATE `%1$sfeed` f +INNER JOIN ( + SELECT e.id_feed, + COUNT(CASE WHEN e.is_read = 0 THEN 1 END) AS nbUnreads, + COUNT(e.id) AS nbEntries + FROM `%1$sentry` e + GROUP BY e.id_feed +) x ON x.id_feed=f.id +SET f.cache_nbEntries=x.nbEntries, f.cache_nbUnreads=x.nbUnreads +'); + +define('SQL_UPDATE_HISTORYv007b', 'UPDATE `%1$sfeed` SET keep_history = CASE WHEN keep_history = 0 THEN -2 WHEN keep_history = 1 THEN -1 ELSE keep_history END;'); + +define('SQL_GET_FEEDS', 'SELECT id, url, website FROM `%1$sfeed`;'); +// + +// gestion internationalisation +$translates = array (); +$actual = 'en'; +function initTranslate () { + global $translates; + global $actual; + + $actual = isset($_SESSION['language']) ? $_SESSION['language'] : getBetterLanguage('en'); + + $file = APP_PATH . '/i18n/' . $actual . '.php'; + if (file_exists($file)) { + $translates = array_merge($translates, include($file)); + } + + $file = APP_PATH . '/i18n/install.' . $actual . '.php'; + if (file_exists($file)) { + $translates = array_merge($translates, include($file)); + } +} + +function getBetterLanguage ($fallback) { + $available = availableLanguages (); + $accept = $_SERVER['HTTP_ACCEPT_LANGUAGE']; + $language = strtolower (substr ($accept, 0, 2)); + + if (isset ($available[$language])) { + return $language; + } else { + return $fallback; + } +} +function availableLanguages () { + return array ( + 'en' => 'English', + 'fr' => 'Français' + ); +} +function _t ($key) { + global $translates; + $translate = $key; + if (isset ($translates[$key])) { + $translate = $translates[$key]; + } + + $args = func_get_args (); + unset($args[0]); + + return vsprintf ($translate, $args); +} + +/*** SAUVEGARDES ***/ +function saveLanguage () { + if (!empty ($_POST)) { + if (!isset ($_POST['language'])) { + return false; + } + + $_SESSION['language'] = $_POST['language']; + + header ('Location: index.php?step=1'); + } +} +function saveStep2 () { + if (!empty ($_POST)) { + if (empty ($_POST['title']) || + empty ($_POST['old_entries']) || + empty ($_POST['auth_type']) || + empty ($_POST['default_user'])) { + return false; + } + + $_SESSION['salt'] = sha1(uniqid(mt_rand(), true).implode('', stat(__FILE__))); + $_SESSION['title'] = substr(trim($_POST['title']), 0, 25); + $_SESSION['old_entries'] = $_POST['old_entries']; + if ((!ctype_digit($_SESSION['old_entries'])) || ($_SESSION['old_entries'] < 1)) { + $_SESSION['old_entries'] = 3; + } + $_SESSION['mail_login'] = filter_var($_POST['mail_login'], FILTER_VALIDATE_EMAIL); + $_SESSION['default_user'] = substr(preg_replace('/[^a-zA-Z0-9]/', '', $_POST['default_user']), 0, 16); + $_SESSION['auth_type'] = $_POST['auth_type']; + if (!empty($_POST['passwordPlain'])) { + if (!function_exists('password_hash')) { + include_once(LIB_PATH . '/password_compat.php'); + } + $passwordHash = password_hash($_POST['passwordPlain'], PASSWORD_BCRYPT, array('cost' => BCRYPT_COST)); + $passwordHash = preg_replace('/^\$2[xy]\$/', '\$2a\$', $passwordHash); //Compatibility with bcrypt.js + $_SESSION['passwordHash'] = $passwordHash; + } + + $token = ''; + if ($_SESSION['mail_login']) { + $token = sha1($_SESSION['salt'] . $_SESSION['mail_login']); + } + + $config_array = array ( + 'language' => $_SESSION['language'], + 'theme' => $_SESSION['theme'], + 'old_entries' => $_SESSION['old_entries'], + 'mail_login' => $_SESSION['mail_login'], + 'passwordHash' => $_SESSION['passwordHash'], + 'token' => $token, + ); + + $configPath = DATA_PATH . '/' . $_SESSION['default_user'] . '_user.php'; + @unlink($configPath); //To avoid access-rights problems + file_put_contents($configPath, " array( + 'environment' => empty($_SESSION['environment']) ? 'production' : $_SESSION['environment'], + 'salt' => $_SESSION['salt'], + 'base_url' => '', + 'title' => $_SESSION['title'], + 'default_user' => $_SESSION['default_user'], + 'auth_type' => $_SESSION['auth_type'], + 'allow_anonymous' => isset($_SESSION['allow_anonymous']) ? $_SESSION['allow_anonymous'] : false, + 'allow_anonymous_refresh' => false, + 'unsafe_autologin_enabled' => false, + 'api_enabled' => false, + ), + 'db' => array( + 'type' => $_SESSION['bd_type'], + 'host' => $_SESSION['bd_host'], + 'user' => $_SESSION['bd_user'], + 'password' => $_SESSION['bd_password'], + 'base' => $_SESSION['bd_base'], + 'prefix' => $_SESSION['bd_prefix'], + ), + ); + + @unlink(DATA_PATH . '/config.php'); //To avoid access-rights problems + file_put_contents(DATA_PATH . '/config.php', " 'SET NAMES utf8', + ); + break; + case 'sqlite': + return false; //No update for SQLite needed so far + default: + return false; + } + + $c = new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); + + $stm = $c->prepare(SQL_SHOW_TABLES); + $stm->execute(); + $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); + if (!in_array($_SESSION['bd_prefix'] . 'entry006', $res)) { + return false; + } + + $sql = sprintf(SQL_SHOW_COLUMNS_UPDATEv006, $_SESSION['bd_prefix']); + $stm = $c->prepare($sql); + $stm->execute(); + $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); + if (!in_array('id2', $res)) { + if (!$perform) { + return true; + } + $sql = sprintf(SQL_UPDATEv006, $_SESSION['bd_prefix'], $_SESSION['bd_prefix_user']); + $stm = $c->prepare($sql, array(PDO::ATTR_EMULATE_PREPARES => true)); + $stm->execute(); + } + + $sql = sprintf(SQL_CONVERT_SELECTv006, $_SESSION['bd_prefix'], $_SESSION['bd_prefix_user']); + if (!$perform) { + $sql .= ' LIMIT 1'; + } + $stm = $c->prepare($sql); + $stm->execute(); + if (!$perform) { + $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); + return count($res) > 0; + } else { + @set_time_limit(300); + } + + $c2 = new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); + $sql = sprintf(SQL_CONVERT_UPDATEv006, $_SESSION['bd_prefix_user']); + $stm2 = $c2->prepare($sql); + while ($row = $stm->fetch(PDO::FETCH_ASSOC)) { + $id = $row['id2']; + $content = unserialize(gzinflate(base64_decode($row['content']))); + $stm2->execute(array($content, $id)); + } + + return true; + } catch (PDOException $e) { + return false; + } + return false; +} + +function newPdo() { + switch ($_SESSION['bd_type']) { + case 'mysql': + $str = 'mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_base']; + $driver_options = array( + PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', + ); + break; + case 'sqlite': + $str = 'sqlite:' . DATA_PATH . '/' . $_SESSION['bd_base'] . '.sqlite'; + $driver_options = array( + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + ); + break; + default: + return false; + } + return new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); +} + +function postUpdate() { + $c = newPdo(); + + if ($_SESSION['bd_type'] !== 'sqlite') { //No update for SQLite needed yet + $sql = sprintf(SQL_UPDATE_HISTORYv007b, $_SESSION['bd_prefix_user']); + $stm = $c->prepare($sql); + $stm->execute(); + + $sql = sprintf(SQL_UPDATE_CACHED_VALUES, $_SESSION['bd_prefix_user']); + $stm = $c->prepare($sql); + $stm->execute(); + } + + // + $sql = sprintf(SQL_GET_FEEDS, $_SESSION['bd_prefix_user']); + $stm = $c->prepare($sql); + $stm->execute(); + $res = $stm->fetchAll(PDO::FETCH_ASSOC); + foreach ($res as $feed) { + if (empty($feed['url'])) { + continue; + } + $hash = hash('crc32b', $_SESSION['salt'] . $feed['url']); + @file_put_contents(DATA_PATH . '/favicons/' . $hash . '.txt', + empty($feed['website']) ? $feed['url'] : $feed['website']); + } + // +} + +function deleteInstall () { + $res = unlink (DATA_PATH . 'do-install.txt'); + if ($res) { + header ('Location: index.php'); + } + + $needs = array('bd_type', 'bd_host', 'bd_base', 'bd_user', 'bd_password', 'bd_prefix'); + foreach ($needs as $need) { + if (!isset($_SESSION[$need])) { + return false; + } + } + + try { + $c = newPdo(); + $sql = sprintf(SQL_DROP_BACKUPv006, $_SESSION['bd_prefix']); + $stm = $c->prepare($sql); + $stm->execute(); + + return true; + } catch (PDOException $e) { + return false; + } + return false; +} + +function moveOldFiles() { + $mvs = array( + '/app/configuration/application.ini' => '/data/application.ini', //v0.6 + '/public/data/Configuration.array.php' => '/data/Configuration.array.php', //v0.6 + ); + $ok = true; + foreach ($mvs as $fFrom => $fTo) { + if (file_exists(FRESHRSS_PATH . $fFrom)) { + if (copy(FRESHRSS_PATH . $fFrom, FRESHRSS_PATH . $fTo)) { + @unlink(FRESHRSS_PATH . $fFrom); + } else { + $ok = false; + } + } + } + return $ok; +} + +function delTree($dir) { //http://php.net/rmdir#110489 + if (!is_dir($dir)) { + return true; + } + $files = array_diff(scandir($dir), array('.', '..')); + foreach ($files as $file) { + $f = $dir . '/' . $file; + if (is_dir($f)) { + @chmod($f, 0777); + delTree($f); + } + else unlink($f); + } + return rmdir($dir); +} + +/*** VÉRIFICATIONS ***/ +function checkStep () { + $s0 = checkStep0 (); + $s1 = checkStep1 (); + $s2 = checkStep2 (); + $s3 = checkStep3 (); + if (STEP > 0 && $s0['all'] != 'ok') { + header ('Location: index.php?step=0'); + } elseif (STEP > 1 && $s1['all'] != 'ok') { + header ('Location: index.php?step=1'); + } elseif (STEP > 2 && $s2['all'] != 'ok') { + header ('Location: index.php?step=2'); + } elseif (STEP > 3 && $s3['all'] != 'ok') { + header ('Location: index.php?step=3'); + } + $_SESSION['actualize_feeds'] = true; +} +function checkStep0 () { + moveOldFiles(); + + if (file_exists(DATA_PATH . '/config.php')) { + $ini_array = include(DATA_PATH . '/config.php'); + } elseif (file_exists(DATA_PATH . '/application.ini')) { //v0.6 + $ini_array = parse_ini_file(DATA_PATH . '/application.ini', true); + $ini_array['general']['title'] = empty($ini_array['general']['title']) ? '' : stripslashes($ini_array['general']['title']); + } else { + $ini_array = null; + } + + if ($ini_array) { + $ini_general = isset($ini_array['general']) ? $ini_array['general'] : null; + if ($ini_general) { + $keys = array('environment', 'salt', 'title', 'default_user', 'allow_anonymous', 'auth_type'); + foreach ($keys as $key) { + if ((empty($_SESSION[$key])) && isset($ini_general[$key])) { + $_SESSION[$key] = $ini_general[$key]; + } + } + } + $ini_db = isset($ini_array['db']) ? $ini_array['db'] : null; + if ($ini_db) { + $keys = array('type', 'host', 'user', 'password', 'base', 'prefix'); + foreach ($keys as $key) { + if ((!isset($_SESSION['bd_' . $key])) && isset($ini_db[$key])) { + $_SESSION['bd_' . $key] = $ini_db[$key]; + } + } + } + } + + if (isset($_SESSION['default_user']) && file_exists(DATA_PATH . '/' . $_SESSION['default_user'] . '_user.php')) { + $userConfig = include(DATA_PATH . '/' . $_SESSION['default_user'] . '_user.php'); + } elseif (file_exists(DATA_PATH . '/Configuration.array.php')) { + $userConfig = include(DATA_PATH . '/Configuration.array.php'); //v0.6 + if (empty($_SESSION['auth_type'])) { + $_SESSION['auth_type'] = empty($userConfig['mail_login']) ? 'none' : 'persona'; + } + if (!isset($_SESSION['allow_anonymous'])) { + $_SESSION['allow_anonymous'] = empty($userConfig['anon_access']) ? false : ($userConfig['anon_access'] === 'yes'); + } + } else { + $userConfig = array(); + } + if (empty($_SESSION['auth_type'])) { //v0.7b + $_SESSION['auth_type'] = ''; + } + + $keys = array('language', 'theme', 'old_entries', 'mail_login', 'passwordHash'); + foreach ($keys as $key) { + if ((!isset($_SESSION[$key])) && isset($userConfig[$key])) { + $_SESSION[$key] = $userConfig[$key]; + } + } + + $languages = availableLanguages (); + $language = isset ($_SESSION['language']) && + isset ($languages[$_SESSION['language']]); + + if (empty($_SESSION['passwordHash'])) { //v0.7b + $_SESSION['passwordHash'] = ''; + } + if (empty($_SESSION['theme'])) { + $_SESSION['theme'] = 'Origine'; + } else { + switch (strtolower($_SESSION['theme'])) { + case 'default': //v0.7b + $_SESSION['theme'] = 'Origine'; + break; + case 'flat-design': //v0.7b + $_SESSION['theme'] = 'Flat'; + break; + case 'default_dark': //v0.7b + $_SESSION['theme'] = 'Dark'; + break; + } + } + + return array ( + 'language' => $language ? 'ok' : 'ko', + 'all' => $language ? 'ok' : 'ko' + ); +} + +function checkStep1 () { + $php = version_compare (PHP_VERSION, '5.2.1') >= 0; + $minz = file_exists (LIB_PATH . '/Minz'); + $curl = extension_loaded ('curl'); + $pdo = extension_loaded ('pdo_mysql'); + $pcre = extension_loaded ('pcre'); + $ctype = extension_loaded ('ctype'); + $dom = class_exists('DOMDocument'); + $data = DATA_PATH && is_writable (DATA_PATH); + $cache = CACHE_PATH && is_writable (CACHE_PATH); + $log = LOG_PATH && is_writable (LOG_PATH); + $favicons = is_writable (DATA_PATH . '/favicons'); + $persona = is_writable (DATA_PATH . '/persona'); + + return array ( + 'php' => $php ? 'ok' : 'ko', + 'minz' => $minz ? 'ok' : 'ko', + 'curl' => $curl ? 'ok' : 'ko', + 'pdo-mysql' => $pdo ? 'ok' : 'ko', + 'pcre' => $pcre ? 'ok' : 'ko', + 'ctype' => $ctype ? 'ok' : 'ko', + 'dom' => $dom ? 'ok' : 'ko', + 'data' => $data ? 'ok' : 'ko', + 'cache' => $cache ? 'ok' : 'ko', + 'log' => $log ? 'ok' : 'ko', + 'favicons' => $favicons ? 'ok' : 'ko', + 'persona' => $persona ? 'ok' : 'ko', + 'all' => $php && $minz && $curl && $pdo && $pcre && $ctype && $dom && $data && $cache && $log && $favicons && $persona ? 'ok' : 'ko' + ); +} + +function checkStep2 () { + $conf = !empty($_SESSION['salt']) && + !empty($_SESSION['title']) && + !empty($_SESSION['old_entries']) && + isset($_SESSION['mail_login']) && + !empty($_SESSION['default_user']); + $defaultUser = empty($_POST['default_user']) ? null : $_POST['default_user']; + if ($defaultUser === null) { + $defaultUser = empty($_SESSION['default_user']) ? '' : $_SESSION['default_user']; + } + $data = is_writable(DATA_PATH . '/' . $defaultUser . '_user.php'); + if ($data) { + @unlink(DATA_PATH . '/Configuration.array.php'); //v0.6 + } + + return array ( + 'conf' => $conf ? 'ok' : 'ko', + 'data' => $data ? 'ok' : 'ko', + 'all' => $conf && $data ? 'ok' : 'ko' + ); +} +function checkStep3 () { + $conf = is_writable(DATA_PATH . '/config.php'); + + $bd = isset ($_SESSION['bd_type']) && + isset ($_SESSION['bd_host']) && + isset ($_SESSION['bd_user']) && + isset ($_SESSION['bd_password']) && + isset ($_SESSION['bd_base']) && + isset ($_SESSION['bd_prefix']) && + isset ($_SESSION['bd_error']); + $conn = empty($_SESSION['bd_error']); + + return array ( + 'bd' => $bd ? 'ok' : 'ko', + 'conn' => $conn ? 'ok' : 'ko', + 'conf' => $conf ? 'ok' : 'ko', + 'all' => $bd && $conn && $conf ? 'ok' : 'ko' + ); +} + +function checkBD () { + $ok = false; + + try { + $str = ''; + $driver_options = null; + switch ($_SESSION['bd_type']) { + case 'mysql': + $driver_options = array( + PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' + ); + + try { // on ouvre une connexion juste pour créer la base si elle n'existe pas + $str = 'mysql:host=' . $_SESSION['bd_host'] . ';'; + $c = new PDO ($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); + $sql = sprintf (SQL_CREATE_DB, $_SESSION['bd_base']); + $res = $c->query ($sql); + } catch (PDOException $e) { + } + + // on écrase la précédente connexion en sélectionnant la nouvelle BDD + $str = 'mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_base']; + break; + case 'sqlite': + $str = 'sqlite:' . DATA_PATH . '/' . $_SESSION['bd_base'] . '.sqlite'; + $driver_options = array( + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + ); + break; + default: + return false; + } + + $c = new PDO ($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); + + if ($_SESSION['bd_type'] !== 'sqlite') { //No SQL backup for SQLite + $stm = $c->prepare(SQL_SHOW_TABLES); + $stm->execute(); + $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); + if (in_array($_SESSION['bd_prefix'] . 'entry', $res) && !in_array($_SESSION['bd_prefix'] . 'entry006', $res)) { + $sql = sprintf(SQL_BACKUP006, $_SESSION['bd_prefix']); //v0.6 + $res = $c->query($sql); //Backup tables + } + } + + if (defined('SQL_CREATE_TABLES')) { + $sql = sprintf(SQL_CREATE_TABLES, $_SESSION['bd_prefix_user'], _t('default_category')); + $stm = $c->prepare($sql); + $ok = $stm->execute(); + } else { + global $SQL_CREATE_TABLES; + if (is_array($SQL_CREATE_TABLES)) { + $ok = true; + foreach ($SQL_CREATE_TABLES as $instruction) { + $sql = sprintf($instruction, $_SESSION['bd_prefix_user'], _t('default_category')); + $stm = $c->prepare($sql); + $ok &= $stm->execute(); + } + } + } + } catch (PDOException $e) { + $ok = false; + $_SESSION['bd_error'] = $e->getMessage(); + } + + if (!$ok) { + @unlink(DATA_PATH . '/config.php'); + } + + return $ok; +} + +/*** AFFICHAGE ***/ +function printStep0 () { + global $actual; +?> + +

+ + +
+ +
+ +
+ +
+
+ +
+
+ + + + + +
+
+
+ + + + +

+ +

+ + + +

+ +

+ + + +

+ +

+ + + + +

+ +

+ + + +

+ +

+ + + +

+ +

+ + + +

+ +

+ + + +

+ +

+ + + +

+ +

+ + + +

+ +

+ + + +

+ +

+ + + +

+ +

+ + + + + +

+ + + +

+ + +
+ + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+
+ + + + + +
+
+
+ + +

+ +

+ + +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+
+ + + + + +
+
+
+ +
+ + + +

+ +
+
+ + +
+
+ + +

+ +
+
+ +
+
+ +
+ +

+ + +

+ + + + + + + <?php echo _t ('freshrss_installation'); ?> + + + + + +
+
+

+

+
+
+ +
+ + +
+ +
+
+ + -- cgit v1.2.3 From 2501bb337e75c41f97570f25775e20131faf2f2a Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Thu, 3 Jul 2014 22:11:25 +0200 Subject: Preparation #2 for SQLite https://github.com/marienfressinaud/FreshRSS/issues/100 --- app/Models/EntryDAOSQLite.php | 42 ++++++++++++++++++++++++++++++++++++++++++ app/Models/EntryDAO_SQLite.php | 42 ------------------------------------------ app/Models/Factory.php | 2 +- app/SQL/install.sql.sqlite.php | 2 +- app/install.php | 16 ++++++++++++---- 5 files changed, 56 insertions(+), 48 deletions(-) create mode 100644 app/Models/EntryDAOSQLite.php delete mode 100644 app/Models/EntryDAO_SQLite.php (limited to 'app/install.php') diff --git a/app/Models/EntryDAOSQLite.php b/app/Models/EntryDAOSQLite.php new file mode 100644 index 000000000..45d3a3ea9 --- /dev/null +++ b/app/Models/EntryDAOSQLite.php @@ -0,0 +1,42 @@ +markRead($id, $is_read); + } + return $affected; + } + } else { + $this->bd->beginTransaction(); + $sql = 'UPDATE `' . $this->prefix . 'entry` e SET e.is_read = ? WHERE e.id=? AND e.is_read<>?'; + $values = array($is_read ? 1 : 0, $ids, $is_read ? 1 : 0); + $stm = $this->bd->prepare($sql); + if (!($stm && $stm->execute ($values))) { + $info = $stm == null ? array(2 => 'syntax error') : $stm->errorInfo(); + Minz_Log::record('SQL error markRead: ' . $info[2], Minz_Log::ERROR); + $this->bd->rollBack (); + return false; + } + $affected = $stm->rowCount(); + if ($affected > 0) { + $sql = 'UPDATE `' . $this->prefix . 'feed` f SET f.cache_nbUnreads=f.cache_nbUnreads' . ($is_read ? '-' : '+') . '1 ' + . 'WHERE f.id=(SELECT e.id_feed FROM `' . $this->prefix . 'entry` e WHERE e.id=?)'; + $values = array($ids); + $stm = $this->bd->prepare($sql); + if (!($stm && $stm->execute ($values))) { + $info = $stm == null ? array(2 => 'syntax error') : $stm->errorInfo(); + Minz_Log::record('SQL error markRead: ' . $info[2], Minz_Log::ERROR); + $this->bd->rollBack (); + return false; + } + } + $this->bd->commit(); + return $affected; + } + } +} diff --git a/app/Models/EntryDAO_SQLite.php b/app/Models/EntryDAO_SQLite.php deleted file mode 100644 index f148f3c63..000000000 --- a/app/Models/EntryDAO_SQLite.php +++ /dev/null @@ -1,42 +0,0 @@ -markRead($id, $is_read); - } - return $affected; - } - } else { - $this->bd->beginTransaction(); - $sql = 'UPDATE `' . $this->prefix . 'entry` e SET e.is_read = ? WHERE e.id=? AND e.is_read<>?'; - $values = array($is_read ? 1 : 0, $ids, $is_read ? 1 : 0); - $stm = $this->bd->prepare($sql); - if (!($stm && $stm->execute ($values))) { - $info = $stm == null ? array(2 => 'syntax error') : $stm->errorInfo(); - Minz_Log::record('SQL error markRead: ' . $info[2], Minz_Log::ERROR); - $this->bd->rollBack (); - return false; - } - $affected = $stm->rowCount(); - if ($affected > 0) { - $sql = 'UPDATE `' . $this->prefix . 'feed` f SET f.cache_nbUnreads=f.cache_nbUnreads' . ($is_read ? '-' : '+') . '1 ' - . 'WHERE f.id=(SELECT e.id_feed FROM `' . $this->prefix . 'entry` e WHERE e.id=?)'; - $values = array($ids); - $stm = $this->bd->prepare($sql); - if (!($stm && $stm->execute ($values))) { - $info = $stm == null ? array(2 => 'syntax error') : $stm->errorInfo(); - Minz_Log::record('SQL error markRead: ' . $info[2], Minz_Log::ERROR); - $this->bd->rollBack (); - return false; - } - } - $this->bd->commit(); - return $affected; - } - } -} diff --git a/app/Models/Factory.php b/app/Models/Factory.php index bea89c114..3ef68c41d 100644 --- a/app/Models/Factory.php +++ b/app/Models/Factory.php @@ -5,7 +5,7 @@ class FreshRSS_Factory { public static function createEntryDao() { $db = Minz_Configuration::dataBase(); if ($db['type'] === 'sqlite') { - return new FreshRSS_EntryDAO_SQLite(); + return new FreshRSS_EntryDAOSQLite(); } else { return new FreshRSS_EntryDAO(); } diff --git a/app/SQL/install.sql.sqlite.php b/app/SQL/install.sql.sqlite.php index 5bd294fde..8cdec981f 100644 --- a/app/SQL/install.sql.sqlite.php +++ b/app/SQL/install.sql.sqlite.php @@ -49,7 +49,7 @@ $SQL_CREATE_TABLES = array( 'CREATE INDEX IF NOT EXISTS entry_is_favorite_index ON `%1$sentry`(`is_favorite`);', 'CREATE INDEX IF NOT EXISTS entry_is_read_index ON `%1$sentry`(`is_read`);', -'INSERT OR IGNORE INTO `%1$scategory` (id, name) VALUES(1, "%1$s");', +'INSERT OR IGNORE INTO `%1$scategory` (id, name) VALUES(1, "%2$s");', ); define('SQL_DROP_TABLES', 'DROP TABLES %1$sentry, %1$sfeed, %1$scategory'); diff --git a/app/install.php b/app/install.php index 9863dd556..357a8e340 100644 --- a/app/install.php +++ b/app/install.php @@ -366,7 +366,7 @@ function newPdo() { ); break; case 'sqlite': - $str = 'sqlite:' . DATA_PATH . '/' . $_SESSION['bd_base'] . '.sqlite'; + $str = 'sqlite:' . DATA_PATH . '/' . $_SESSION['default_user'] . '.sqlite'; $driver_options = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ); @@ -407,7 +407,7 @@ function postUpdate() { } function deleteInstall () { - $res = unlink (DATA_PATH . 'do-install.txt'); + $res = unlink (DATA_PATH . '/do-install.txt'); if ($res) { header ('Location: index.php'); } @@ -665,7 +665,7 @@ function checkBD () { $str = 'mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_base']; break; case 'sqlite': - $str = 'sqlite:' . DATA_PATH . '/' . $_SESSION['bd_base'] . '.sqlite'; + $str = 'sqlite:' . DATA_PATH . '/' . $_SESSION['default_user'] . '.sqlite'; $driver_options = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ); @@ -921,7 +921,7 @@ function printStep3 () {
-
+
@@ -968,6 +969,13 @@ function printStep3 () {
+
+
-- cgit v1.2.3 From 52763ed97d0fd3ca96d11cbec361f5f4cf79fec4 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Thu, 10 Jul 2014 18:46:38 +0200 Subject: Fix a bug during installation - If MySQL database was configured and user choosed SQLite, an error was raised at the first submit. - Cast STEP into integer --- app/install.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php index 357a8e340..3767e3d91 100644 --- a/app/install.php +++ b/app/install.php @@ -10,13 +10,17 @@ session_set_cookie_params(0, dirname(empty($_SERVER['REQUEST_URI']) ? '/' : dirn session_start(); if (isset ($_GET['step'])) { - define ('STEP', $_GET['step']); + define ('STEP', (int)$_GET['step']); } else { define ('STEP', 1); } define('SQL_CREATE_DB', 'CREATE DATABASE IF NOT EXISTS %1$s DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;'); +if (STEP === 3 && isset($_POST['type'])) { + $_SESSION['bd_type'] = $_POST['type']; +} + if (isset($_SESSION['bd_type'])) { switch ($_SESSION['bd_type']) { case 'mysql': @@ -216,9 +220,6 @@ function saveStep2 () { function saveStep3 () { if (!empty ($_POST)) { - - $_SESSION['bd_type'] = isset ($_POST['type']) ? $_POST['type'] : ''; - if ($_SESSION['bd_type'] === 'sqlite') { $_SESSION['bd_base'] = $_SESSION['default_user']; $_SESSION['bd_host'] = ''; -- cgit v1.2.3 From d3f730287d28ecdbb8bff6445bca5944794503fd Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Fri, 1 Aug 2014 21:36:35 +0200 Subject: Install script was not keeping all config settings https://github.com/marienfressinaud/FreshRSS/issues/537 --- app/install.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php index 3767e3d91..66d663114 100644 --- a/app/install.php +++ b/app/install.php @@ -249,11 +249,11 @@ function saveStep3 () { 'base_url' => '', 'title' => $_SESSION['title'], 'default_user' => $_SESSION['default_user'], - 'auth_type' => $_SESSION['auth_type'], 'allow_anonymous' => isset($_SESSION['allow_anonymous']) ? $_SESSION['allow_anonymous'] : false, - 'allow_anonymous_refresh' => false, - 'unsafe_autologin_enabled' => false, - 'api_enabled' => false, + 'allow_anonymous_refresh' => isset($_SESSION['allow_anonymous_refresh']) ? $_SESSION['allow_anonymous_refresh'] : false, + 'auth_type' => $_SESSION['auth_type'], + 'api_enabled' => isset($_SESSION['api_enabled']) ? $_SESSION['api_enabled'] : false, + 'unsafe_autologin_enabled' => isset($_SESSION['unsafe_autologin_enabled']) ? $_SESSION['unsafe_autologin_enabled'] : false, ), 'db' => array( 'type' => $_SESSION['bd_type'], @@ -499,7 +499,7 @@ function checkStep0 () { if ($ini_array) { $ini_general = isset($ini_array['general']) ? $ini_array['general'] : null; if ($ini_general) { - $keys = array('environment', 'salt', 'title', 'default_user', 'allow_anonymous', 'auth_type'); + $keys = array('environment', 'salt', 'title', 'default_user', 'allow_anonymous', 'allow_anonymous_refresh', 'auth_type', 'api_enabled', 'unsafe_autologin_enabled'); foreach ($keys as $key) { if ((empty($_SESSION[$key])) && isset($ini_general[$key])) { $_SESSION[$key] = $ini_general[$key]; -- cgit v1.2.3 From e05e9a87021862b334bccedb3d2383e9fa568a9b Mon Sep 17 00:00:00 2001 From: Alexis Degrugillier Date: Sun, 3 Aug 2014 08:47:18 -0400 Subject: Refactor install file to check available databases Now it checks for any pdo driver supported instead of only mysql --- app/i18n/install.en.php | 4 ++-- app/i18n/install.fr.php | 4 ++-- app/install.php | 18 +++++++++++++----- 3 files changed, 17 insertions(+), 9 deletions(-) (limited to 'app/install.php') diff --git a/app/i18n/install.en.php b/app/i18n/install.en.php index 553a79921..50208fcef 100644 --- a/app/i18n/install.en.php +++ b/app/i18n/install.en.php @@ -28,8 +28,8 @@ return array ( 'minz_is_nok' => 'You lack the Minz framework. You should execute build.sh script or download it on Github and install in %s directory the content of its /lib directory.', 'curl_is_ok' => 'You have version %s of cURL', 'curl_is_nok' => 'You lack cURL (php5-curl package)', - 'pdomysql_is_ok' => 'You have PDO and its driver for MySQL', - 'pdomysql_is_nok' => 'You lack PDO or its driver for MySQL (php5-mysql package)', + 'pdo_is_ok' => 'You have PDO and at least one of the supported drivers (pdo_mysql, pdo_sqlite)', + 'pdo_is_nok' => 'You lack PDO or one of the supported drivers (pdo_mysql, pdo_sqlite)', 'dom_is_ok' => 'You have the required library to browse the DOM', 'dom_is_nok' => 'You lack a required library to browse the DOM (php-xml package)', 'pcre_is_ok' => 'You have the required library for regular expressions (PCRE)', diff --git a/app/i18n/install.fr.php b/app/i18n/install.fr.php index 470d83e1a..9c039f904 100644 --- a/app/i18n/install.fr.php +++ b/app/i18n/install.fr.php @@ -28,8 +28,8 @@ return array ( 'minz_is_nok' => 'Vous ne disposez pas de la librairie Minz. Vous devriez exécuter le script build.sh ou bien la télécharger sur Github et installer dans le répertoire %s le contenu de son répertoire /lib.', 'curl_is_ok' => 'Vous disposez de cURL dans sa version %s', 'curl_is_nok' => 'Vous ne disposez pas de cURL (paquet php5-curl)', - 'pdomysql_is_ok' => 'Vous disposez de PDO et de son driver pour MySQL (paquet php5-mysql)', - 'pdomysql_is_nok' => 'Vous ne disposez pas de PDO ou de son driver pour MySQL', + 'pdo_is_ok' => 'Vous disposez de PDO et d’au moins un des drivers supportés (pdo_mysql, pdo_sqlite)', + 'pdo_is_nok' => 'Vous ne disposez pas de PDO ou d’un des drivers supportés (pdo_mysql, pdo_sqlite)', 'dom_is_ok' => 'Vous disposez du nécessaire pour parcourir le DOM', 'dom_is_nok' => 'Il manque une librairie pour parcourir le DOM (paquet php-xml)', 'pcre_is_ok' => 'Vous disposez du nécessaire pour les expressions régulières (PCRE)', diff --git a/app/install.php b/app/install.php index 66d663114..eaa1100c1 100644 --- a/app/install.php +++ b/app/install.php @@ -574,7 +574,9 @@ function checkStep1 () { $php = version_compare (PHP_VERSION, '5.2.1') >= 0; $minz = file_exists (LIB_PATH . '/Minz'); $curl = extension_loaded ('curl'); - $pdo = extension_loaded ('pdo_mysql'); + $pdo_mysql = extension_loaded ('pdo_mysql'); + $pdo_sqlite = extension_loaded ('pdo_sqlite'); + $pdo = $pdo_mysql || $pdo_sqlite; $pcre = extension_loaded ('pcre'); $ctype = extension_loaded ('ctype'); $dom = class_exists('DOMDocument'); @@ -588,7 +590,9 @@ function checkStep1 () { 'php' => $php ? 'ok' : 'ko', 'minz' => $minz ? 'ok' : 'ko', 'curl' => $curl ? 'ok' : 'ko', - 'pdo-mysql' => $pdo ? 'ok' : 'ko', + 'pdo-mysql' => $pdo_mysql ? 'ok' : 'ko', + 'pdo-sqlite' => $pdo_sqlite ? 'ok' : 'ko', + 'pdo' => $pdo ? 'ok' : 'ko', 'pcre' => $pcre ? 'ok' : 'ko', 'ctype' => $ctype ? 'ok' : 'ko', 'dom' => $dom ? 'ok' : 'ko', @@ -766,10 +770,10 @@ function printStep1 () {

- -

+ +

-

+

@@ -923,14 +927,18 @@ function printStep3 () {
-- cgit v1.2.3 From b6e89d4e06814541802c428c4df0e28633f551cd Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Sat, 9 Aug 2014 14:23:15 +0200 Subject: Refactor install.php - Remove all references to update functions - Improve step2 by checking if password exists (form) or mail (persona) - Add a param($key, $default=falsse) function to get $_POST vars - Fix coding style (mainly spaces) --- app/install.php | 897 +++++++++++++++++++------------------------------------- 1 file changed, 300 insertions(+), 597 deletions(-) (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php index eaa1100c1..f563d58d3 100644 --- a/app/install.php +++ b/app/install.php @@ -9,10 +9,10 @@ session_name('FreshRSS'); session_set_cookie_params(0, dirname(empty($_SERVER['REQUEST_URI']) ? '/' : dirname($_SERVER['REQUEST_URI'])), null, false, true); session_start(); -if (isset ($_GET['step'])) { - define ('STEP', (int)$_GET['step']); +if (isset($_GET['step'])) { + define('STEP',(int)$_GET['step']); } else { - define ('STEP', 1); + define('STEP', 0); } define('SQL_CREATE_DB', 'CREATE DATABASE IF NOT EXISTS %1$s DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;'); @@ -23,88 +23,28 @@ if (STEP === 3 && isset($_POST['type'])) { if (isset($_SESSION['bd_type'])) { switch ($_SESSION['bd_type']) { - case 'mysql': - include(APP_PATH . '/SQL/install.sql.mysql.php'); - break; - case 'sqlite': - include(APP_PATH . '/SQL/install.sql.sqlite.php'); - break; + case 'mysql': + include(APP_PATH . '/SQL/install.sql.mysql.php'); + break; + case 'sqlite': + include(APP_PATH . '/SQL/install.sql.sqlite.php'); + break; } } -// -define('SQL_BACKUP006', 'RENAME TABLE `%1$scategory` TO `%1$scategory006`, `%1$sfeed` TO `%1$sfeed006`, `%1$sentry` TO `%1$sentry006`;'); - -define('SQL_SHOW_COLUMNS_UPDATEv006', 'SHOW columns FROM `%1$sentry006` LIKE "id2";'); - -define('SQL_UPDATEv006', ' -ALTER TABLE `%1$scategory006` ADD id2 SMALLINT; - -SET @i = 0; -UPDATE `%1$scategory006` SET id2=(@i:=@i+1) ORDER BY id; - -ALTER TABLE `%1$sfeed006` ADD id2 SMALLINT, ADD category2 SMALLINT; - -SET @i = 0; -UPDATE `%1$sfeed006` SET id2=(@i:=@i+1) ORDER BY name; - -UPDATE `%1$sfeed006` f -INNER JOIN `%1$scategory006` c ON f.category = c.id -SET f.category2 = c.id2; - -INSERT IGNORE INTO `%2$scategory` (name) -SELECT name -FROM `%1$scategory006` -ORDER BY id2; - -INSERT IGNORE INTO `%2$sfeed` (url, category, name, website, description, priority, pathEntries, httpAuth, keep_history) -SELECT url, category2, name, website, description, priority, pathEntries, httpAuth, IF(keep_history = 1, -1, -2) -FROM `%1$sfeed006` -ORDER BY id2; - -ALTER TABLE `%1$sentry006` ADD id2 bigint; - -UPDATE `%1$sentry006` SET id2 = ((date * 1000000) + (rand() * 100000000)); - -INSERT IGNORE INTO `%2$sentry` (id, guid, title, author, link, date, is_read, is_favorite, id_feed, tags) -SELECT e0.id2, e0.guid, e0.title, e0.author, e0.link, e0.date, e0.is_read, e0.is_favorite, f0.id2, e0.tags -FROM `%1$sentry006` e0 -INNER JOIN `%1$sfeed006` f0 ON e0.id_feed = f0.id; -'); - -define('SQL_CONVERT_SELECTv006', ' -SELECT e0.id2, e0.content -FROM `%1$sentry006` e0 -INNER JOIN `%2$sentry` e1 ON e0.id2 = e1.id -WHERE e1.content_bin IS NULL'); - -define('SQL_CONVERT_UPDATEv006', 'UPDATE `%1$sentry` SET ' - . (isset($_SESSION['bd_type']) && $_SESSION['bd_type'] === 'mysql' ? 'content_bin=COMPRESS(?)' : 'content=?') - . ' WHERE id=?;'); - -define('SQL_DROP_BACKUPv006', 'DROP TABLE IF EXISTS `%1$sentry006`, `%1$sfeed006`, `%1$scategory006`;'); - -define('SQL_UPDATE_CACHED_VALUES', ' -UPDATE `%1$sfeed` f -INNER JOIN ( - SELECT e.id_feed, - COUNT(CASE WHEN e.is_read = 0 THEN 1 END) AS nbUnreads, - COUNT(e.id) AS nbEntries - FROM `%1$sentry` e - GROUP BY e.id_feed -) x ON x.id_feed=f.id -SET f.cache_nbEntries=x.nbEntries, f.cache_nbUnreads=x.nbUnreads -'); - -define('SQL_UPDATE_HISTORYv007b', 'UPDATE `%1$sfeed` SET keep_history = CASE WHEN keep_history = 0 THEN -2 WHEN keep_history = 1 THEN -1 ELSE keep_history END;'); +function param($key, $default = false) { + if (isset($_POST[$key])) { + return $_POST[$key]; + } else { + return $default; + } +} -define('SQL_GET_FEEDS', 'SELECT id, url, website FROM `%1$sfeed`;'); -// // gestion internationalisation -$translates = array (); +$translates = array(); $actual = 'en'; -function initTranslate () { +function initTranslate() { global $translates; global $actual; @@ -121,81 +61,93 @@ function initTranslate () { } } -function getBetterLanguage ($fallback) { - $available = availableLanguages (); +function getBetterLanguage($fallback) { + $available = availableLanguages(); $accept = $_SERVER['HTTP_ACCEPT_LANGUAGE']; - $language = strtolower (substr ($accept, 0, 2)); + $language = strtolower(substr($accept, 0, 2)); - if (isset ($available[$language])) { + if (isset($available[$language])) { return $language; } else { return $fallback; } } -function availableLanguages () { - return array ( + +function availableLanguages() { + return array( 'en' => 'English', 'fr' => 'Français' ); } -function _t ($key) { + +function _t($key) { global $translates; $translate = $key; - if (isset ($translates[$key])) { + if (isset($translates[$key])) { $translate = $translates[$key]; } - $args = func_get_args (); + $args = func_get_args(); unset($args[0]); - return vsprintf ($translate, $args); + return vsprintf($translate, $args); } + /*** SAUVEGARDES ***/ -function saveLanguage () { - if (!empty ($_POST)) { - if (!isset ($_POST['language'])) { +function saveLanguage() { + if (!empty($_POST)) { + if (!isset($_POST['language'])) { return false; } $_SESSION['language'] = $_POST['language']; - header ('Location: index.php?step=1'); + header('Location: index.php?step=1'); } } -function saveStep2 () { - if (!empty ($_POST)) { - if (empty ($_POST['title']) || - empty ($_POST['old_entries']) || - empty ($_POST['auth_type']) || - empty ($_POST['default_user'])) { - return false; - } - $_SESSION['salt'] = sha1(uniqid(mt_rand(), true).implode('', stat(__FILE__))); - $_SESSION['title'] = substr(trim($_POST['title']), 0, 25); - $_SESSION['old_entries'] = $_POST['old_entries']; - if ((!ctype_digit($_SESSION['old_entries'])) || ($_SESSION['old_entries'] < 1)) { - $_SESSION['old_entries'] = 3; - } - $_SESSION['mail_login'] = filter_var($_POST['mail_login'], FILTER_VALIDATE_EMAIL); - $_SESSION['default_user'] = substr(preg_replace('/[^a-zA-Z0-9]/', '', $_POST['default_user']), 0, 16); - $_SESSION['auth_type'] = $_POST['auth_type']; - if (!empty($_POST['passwordPlain'])) { +function saveStep2() { + if (!empty($_POST)) { + $_SESSION['title'] = substr(trim(param('title', _t('freshrss'))), 0, 25); + $_SESSION['old_entries'] = param('old_entries', 3); + $_SESSION['auth_type'] = param('auth_type', 'form'); + $_SESSION['default_user'] = substr(preg_replace('/[^a-zA-Z0-9]/', '', param('default_user', '')), 0, 16); + $_SESSION['mail_login'] = filter_var(param('mail_login', ''), FILTER_VALIDATE_EMAIL); + + $password_plain = param('passwordPlain', false); + if ($password_plain !== false) { if (!function_exists('password_hash')) { include_once(LIB_PATH . '/password_compat.php'); } - $passwordHash = password_hash($_POST['passwordPlain'], PASSWORD_BCRYPT, array('cost' => BCRYPT_COST)); + $passwordHash = password_hash($password_plain, PASSWORD_BCRYPT, array('cost' => BCRYPT_COST)); $passwordHash = preg_replace('/^\$2[xy]\$/', '\$2a\$', $passwordHash); //Compatibility with bcrypt.js $_SESSION['passwordHash'] = $passwordHash; } + if (empty($_SESSION['title']) || + empty($_SESSION['old_entries']) || + empty($_SESSION['auth_type']) || + empty($_SESSION['default_user'])) { + return false; + } + + if (($_SESSION['auth_type'] === 'form' && empty($_SESSION['passwordHash'])) || + ($_SESSION['auth_type'] === 'persona' && empty($_SESSION['mail_login']))) { + return false; + } + + $_SESSION['salt'] = sha1(uniqid(mt_rand(), true).implode('', stat(__FILE__))); + if ((!ctype_digit($_SESSION['old_entries'])) ||($_SESSION['old_entries'] < 1)) { + $_SESSION['old_entries'] = 3; + } + $token = ''; if ($_SESSION['mail_login']) { $token = sha1($_SESSION['salt'] . $_SESSION['mail_login']); } - $config_array = array ( + $config_array = array( 'language' => $_SESSION['language'], 'theme' => $_SESSION['theme'], 'old_entries' => $_SESSION['old_entries'], @@ -214,12 +166,12 @@ function saveStep2 () { file_put_contents($personaFile, $_SESSION['default_user']); } - header ('Location: index.php?step=3'); + header('Location: index.php?step=3'); } } -function saveStep3 () { - if (!empty ($_POST)) { +function saveStep3() { + if (!empty($_POST)) { if ($_SESSION['bd_type'] === 'sqlite') { $_SESSION['bd_base'] = $_SESSION['default_user']; $_SESSION['bd_host'] = ''; @@ -228,10 +180,10 @@ function saveStep3 () { $_SESSION['bd_prefix'] = ''; $_SESSION['bd_prefix_user'] = ''; //No prefix for SQLite } else { - if (empty ($_POST['type']) || - empty ($_POST['host']) || - empty ($_POST['user']) || - empty ($_POST['base'])) { + if (empty($_POST['type']) || + empty($_POST['host']) || + empty($_POST['user']) || + empty($_POST['base'])) { $_SESSION['bd_error'] = 'Missing parameters!'; } $_SESSION['bd_base'] = substr($_POST['base'], 0, 64); @@ -239,7 +191,7 @@ function saveStep3 () { $_SESSION['bd_user'] = $_POST['user']; $_SESSION['bd_password'] = $_POST['pass']; $_SESSION['bd_prefix'] = substr($_POST['prefix'], 0, 16); - $_SESSION['bd_prefix_user'] = $_SESSION['bd_prefix'] . (empty($_SESSION['default_user']) ? '' : ($_SESSION['default_user'] . '_')); + $_SESSION['bd_prefix_user'] = $_SESSION['bd_prefix'] .(empty($_SESSION['default_user']) ? '' :($_SESSION['default_user'] . '_')); } $ini_array = array( @@ -268,15 +220,11 @@ function saveStep3 () { @unlink(DATA_PATH . '/config.php'); //To avoid access-rights problems file_put_contents(DATA_PATH . '/config.php', " 'SET NAMES utf8', - ); - break; - case 'sqlite': - return false; //No update for SQLite needed so far - default: - return false; - } - - $c = new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); - - $stm = $c->prepare(SQL_SHOW_TABLES); - $stm->execute(); - $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); - if (!in_array($_SESSION['bd_prefix'] . 'entry006', $res)) { - return false; - } - - $sql = sprintf(SQL_SHOW_COLUMNS_UPDATEv006, $_SESSION['bd_prefix']); - $stm = $c->prepare($sql); - $stm->execute(); - $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); - if (!in_array('id2', $res)) { - if (!$perform) { - return true; - } - $sql = sprintf(SQL_UPDATEv006, $_SESSION['bd_prefix'], $_SESSION['bd_prefix_user']); - $stm = $c->prepare($sql, array(PDO::ATTR_EMULATE_PREPARES => true)); - $stm->execute(); - } - - $sql = sprintf(SQL_CONVERT_SELECTv006, $_SESSION['bd_prefix'], $_SESSION['bd_prefix_user']); - if (!$perform) { - $sql .= ' LIMIT 1'; - } - $stm = $c->prepare($sql); - $stm->execute(); - if (!$perform) { - $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); - return count($res) > 0; - } else { - @set_time_limit(300); - } - - $c2 = new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); - $sql = sprintf(SQL_CONVERT_UPDATEv006, $_SESSION['bd_prefix_user']); - $stm2 = $c2->prepare($sql); - while ($row = $stm->fetch(PDO::FETCH_ASSOC)) { - $id = $row['id2']; - $content = unserialize(gzinflate(base64_decode($row['content']))); - $stm2->execute(array($content, $id)); - } - - return true; - } catch (PDOException $e) { - return false; - } - return false; -} - function newPdo() { switch ($_SESSION['bd_type']) { - case 'mysql': - $str = 'mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_base']; - $driver_options = array( - PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', - ); - break; - case 'sqlite': - $str = 'sqlite:' . DATA_PATH . '/' . $_SESSION['default_user'] . '.sqlite'; - $driver_options = array( - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - ); - break; - default: - return false; + case 'mysql': + $str = 'mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_base']; + $driver_options = array( + PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', + ); + break; + case 'sqlite': + $str = 'sqlite:' . DATA_PATH . '/' . $_SESSION['default_user'] . '.sqlite'; + $driver_options = array( + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + ); + break; + default: + return false; } return new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); } -function postUpdate() { - $c = newPdo(); - - if ($_SESSION['bd_type'] !== 'sqlite') { //No update for SQLite needed yet - $sql = sprintf(SQL_UPDATE_HISTORYv007b, $_SESSION['bd_prefix_user']); - $stm = $c->prepare($sql); - $stm->execute(); - - $sql = sprintf(SQL_UPDATE_CACHED_VALUES, $_SESSION['bd_prefix_user']); - $stm = $c->prepare($sql); - $stm->execute(); - } - - // - $sql = sprintf(SQL_GET_FEEDS, $_SESSION['bd_prefix_user']); - $stm = $c->prepare($sql); - $stm->execute(); - $res = $stm->fetchAll(PDO::FETCH_ASSOC); - foreach ($res as $feed) { - if (empty($feed['url'])) { - continue; - } - $hash = hash('crc32b', $_SESSION['salt'] . $feed['url']); - @file_put_contents(DATA_PATH . '/favicons/' . $hash . '.txt', - empty($feed['website']) ? $feed['url'] : $feed['website']); - } - // -} - -function deleteInstall () { - $res = unlink (DATA_PATH . '/do-install.txt'); - if ($res) { - header ('Location: index.php'); - } - - $needs = array('bd_type', 'bd_host', 'bd_base', 'bd_user', 'bd_password', 'bd_prefix'); - foreach ($needs as $need) { - if (!isset($_SESSION[$need])) { - return false; - } - } - - try { - $c = newPdo(); - $sql = sprintf(SQL_DROP_BACKUPv006, $_SESSION['bd_prefix']); - $stm = $c->prepare($sql); - $stm->execute(); +function deleteInstall() { + $res = unlink(DATA_PATH . '/do-install.txt'); - return true; - } catch (PDOException $e) { + if (!$res) { return false; } - return false; -} -function moveOldFiles() { - $mvs = array( - '/app/configuration/application.ini' => '/data/application.ini', //v0.6 - '/public/data/Configuration.array.php' => '/data/Configuration.array.php', //v0.6 - ); - $ok = true; - foreach ($mvs as $fFrom => $fTo) { - if (file_exists(FRESHRSS_PATH . $fFrom)) { - if (copy(FRESHRSS_PATH . $fFrom, FRESHRSS_PATH . $fTo)) { - @unlink(FRESHRSS_PATH . $fFrom); - } else { - $ok = false; - } - } - } - return $ok; + header('Location: index.php'); } -function delTree($dir) { //http://php.net/rmdir#110489 - if (!is_dir($dir)) { - return true; - } - $files = array_diff(scandir($dir), array('.', '..')); - foreach ($files as $file) { - $f = $dir . '/' . $file; - if (is_dir($f)) { - @chmod($f, 0777); - delTree($f); - } - else unlink($f); - } - return rmdir($dir); -} /*** VÉRIFICATIONS ***/ -function checkStep () { - $s0 = checkStep0 (); - $s1 = checkStep1 (); - $s2 = checkStep2 (); - $s3 = checkStep3 (); +function checkStep() { + $s0 = checkStep0(); + $s1 = checkStep1(); + $s2 = checkStep2(); + $s3 = checkStep3(); if (STEP > 0 && $s0['all'] != 'ok') { - header ('Location: index.php?step=0'); + header('Location: index.php?step=0'); } elseif (STEP > 1 && $s1['all'] != 'ok') { - header ('Location: index.php?step=1'); + header('Location: index.php?step=1'); } elseif (STEP > 2 && $s2['all'] != 'ok') { - header ('Location: index.php?step=2'); + header('Location: index.php?step=2'); } elseif (STEP > 3 && $s3['all'] != 'ok') { - header ('Location: index.php?step=3'); + header('Location: index.php?step=3'); } $_SESSION['actualize_feeds'] = true; } -function checkStep0 () { - moveOldFiles(); - - if (file_exists(DATA_PATH . '/config.php')) { - $ini_array = include(DATA_PATH . '/config.php'); - } elseif (file_exists(DATA_PATH . '/application.ini')) { //v0.6 - $ini_array = parse_ini_file(DATA_PATH . '/application.ini', true); - $ini_array['general']['title'] = empty($ini_array['general']['title']) ? '' : stripslashes($ini_array['general']['title']); - } else { - $ini_array = null; - } - - if ($ini_array) { - $ini_general = isset($ini_array['general']) ? $ini_array['general'] : null; - if ($ini_general) { - $keys = array('environment', 'salt', 'title', 'default_user', 'allow_anonymous', 'allow_anonymous_refresh', 'auth_type', 'api_enabled', 'unsafe_autologin_enabled'); - foreach ($keys as $key) { - if ((empty($_SESSION[$key])) && isset($ini_general[$key])) { - $_SESSION[$key] = $ini_general[$key]; - } - } - } - $ini_db = isset($ini_array['db']) ? $ini_array['db'] : null; - if ($ini_db) { - $keys = array('type', 'host', 'user', 'password', 'base', 'prefix'); - foreach ($keys as $key) { - if ((!isset($_SESSION['bd_' . $key])) && isset($ini_db[$key])) { - $_SESSION['bd_' . $key] = $ini_db[$key]; - } - } - } - } - - if (isset($_SESSION['default_user']) && file_exists(DATA_PATH . '/' . $_SESSION['default_user'] . '_user.php')) { - $userConfig = include(DATA_PATH . '/' . $_SESSION['default_user'] . '_user.php'); - } elseif (file_exists(DATA_PATH . '/Configuration.array.php')) { - $userConfig = include(DATA_PATH . '/Configuration.array.php'); //v0.6 - if (empty($_SESSION['auth_type'])) { - $_SESSION['auth_type'] = empty($userConfig['mail_login']) ? 'none' : 'persona'; - } - if (!isset($_SESSION['allow_anonymous'])) { - $_SESSION['allow_anonymous'] = empty($userConfig['anon_access']) ? false : ($userConfig['anon_access'] === 'yes'); - } - } else { - $userConfig = array(); - } - if (empty($_SESSION['auth_type'])) { //v0.7b - $_SESSION['auth_type'] = ''; - } - - $keys = array('language', 'theme', 'old_entries', 'mail_login', 'passwordHash'); - foreach ($keys as $key) { - if ((!isset($_SESSION[$key])) && isset($userConfig[$key])) { - $_SESSION[$key] = $userConfig[$key]; - } - } - - $languages = availableLanguages (); - $language = isset ($_SESSION['language']) && - isset ($languages[$_SESSION['language']]); - if (empty($_SESSION['passwordHash'])) { //v0.7b - $_SESSION['passwordHash'] = ''; - } - if (empty($_SESSION['theme'])) { - $_SESSION['theme'] = 'Origine'; - } else { - switch (strtolower($_SESSION['theme'])) { - case 'default': //v0.7b - $_SESSION['theme'] = 'Origine'; - break; - case 'flat-design': //v0.7b - $_SESSION['theme'] = 'Flat'; - break; - case 'default_dark': //v0.7b - $_SESSION['theme'] = 'Dark'; - break; - } - } +function checkStep0() { + $languages = availableLanguages(); + $language = isset($_SESSION['language']) && + isset($languages[$_SESSION['language']]); - return array ( + return array( 'language' => $language ? 'ok' : 'ko', 'all' => $language ? 'ok' : 'ko' ); } -function checkStep1 () { - $php = version_compare (PHP_VERSION, '5.2.1') >= 0; - $minz = file_exists (LIB_PATH . '/Minz'); - $curl = extension_loaded ('curl'); - $pdo_mysql = extension_loaded ('pdo_mysql'); - $pdo_sqlite = extension_loaded ('pdo_sqlite'); +function checkStep1() { + $php = version_compare(PHP_VERSION, '5.2.1') >= 0; + $minz = file_exists(LIB_PATH . '/Minz'); + $curl = extension_loaded('curl'); + $pdo_mysql = extension_loaded('pdo_mysql'); + $pdo_sqlite = extension_loaded('pdo_sqlite'); $pdo = $pdo_mysql || $pdo_sqlite; - $pcre = extension_loaded ('pcre'); - $ctype = extension_loaded ('ctype'); + $pcre = extension_loaded('pcre'); + $ctype = extension_loaded('ctype'); $dom = class_exists('DOMDocument'); - $data = DATA_PATH && is_writable (DATA_PATH); - $cache = CACHE_PATH && is_writable (CACHE_PATH); - $log = LOG_PATH && is_writable (LOG_PATH); - $favicons = is_writable (DATA_PATH . '/favicons'); - $persona = is_writable (DATA_PATH . '/persona'); + $data = DATA_PATH && is_writable(DATA_PATH); + $cache = CACHE_PATH && is_writable(CACHE_PATH); + $log = LOG_PATH && is_writable(LOG_PATH); + $favicons = is_writable(DATA_PATH . '/favicons'); + $persona = is_writable(DATA_PATH . '/persona'); - return array ( + return array( 'php' => $php ? 'ok' : 'ko', 'minz' => $minz ? 'ok' : 'ko', 'curl' => $curl ? 'ok' : 'ko', @@ -601,44 +323,49 @@ function checkStep1 () { 'log' => $log ? 'ok' : 'ko', 'favicons' => $favicons ? 'ok' : 'ko', 'persona' => $persona ? 'ok' : 'ko', - 'all' => $php && $minz && $curl && $pdo && $pcre && $ctype && $dom && $data && $cache && $log && $favicons && $persona ? 'ok' : 'ko' + 'all' => $php && $minz && $curl && $pdo && $pcre && $ctype && $dom && + $data && $cache && $log && $favicons && $persona ? 'ok' : 'ko' ); } -function checkStep2 () { - $conf = !empty($_SESSION['salt']) && - !empty($_SESSION['title']) && +function checkStep2() { + $conf = !empty($_SESSION['title']) && !empty($_SESSION['old_entries']) && isset($_SESSION['mail_login']) && !empty($_SESSION['default_user']); + + $form = $_SESSION['auth_type'] != 'form' || !empty($_SESSION['passwordHash']); + + $persona = $_SESSION['auth_type'] != 'persona' || !empty($_SESSION['mail_login']); + $defaultUser = empty($_POST['default_user']) ? null : $_POST['default_user']; if ($defaultUser === null) { $defaultUser = empty($_SESSION['default_user']) ? '' : $_SESSION['default_user']; } $data = is_writable(DATA_PATH . '/' . $defaultUser . '_user.php'); - if ($data) { - @unlink(DATA_PATH . '/Configuration.array.php'); //v0.6 - } - return array ( + return array( 'conf' => $conf ? 'ok' : 'ko', + 'form' => $form ? 'ok' : 'ko', + 'persona' => $persona ? 'ok' : 'ko', 'data' => $data ? 'ok' : 'ko', - 'all' => $conf && $data ? 'ok' : 'ko' + 'all' => $conf && $form && $persona && $data ? 'ok' : 'ko' ); } -function checkStep3 () { + +function checkStep3() { $conf = is_writable(DATA_PATH . '/config.php'); - $bd = isset ($_SESSION['bd_type']) && - isset ($_SESSION['bd_host']) && - isset ($_SESSION['bd_user']) && - isset ($_SESSION['bd_password']) && - isset ($_SESSION['bd_base']) && - isset ($_SESSION['bd_prefix']) && - isset ($_SESSION['bd_error']); + $bd = isset($_SESSION['bd_type']) && + isset($_SESSION['bd_host']) && + isset($_SESSION['bd_user']) && + isset($_SESSION['bd_password']) && + isset($_SESSION['bd_base']) && + isset($_SESSION['bd_prefix']) && + isset($_SESSION['bd_error']); $conn = empty($_SESSION['bd_error']); - return array ( + return array( 'bd' => $bd ? 'ok' : 'ko', 'conn' => $conn ? 'ok' : 'ko', 'conf' => $conf ? 'ok' : 'ko', @@ -646,51 +373,41 @@ function checkStep3 () { ); } -function checkBD () { +function checkBD() { $ok = false; try { $str = ''; $driver_options = null; switch ($_SESSION['bd_type']) { - case 'mysql': - $driver_options = array( - PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' - ); - - try { // on ouvre une connexion juste pour créer la base si elle n'existe pas - $str = 'mysql:host=' . $_SESSION['bd_host'] . ';'; - $c = new PDO ($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); - $sql = sprintf (SQL_CREATE_DB, $_SESSION['bd_base']); - $res = $c->query ($sql); - } catch (PDOException $e) { - } - - // on écrase la précédente connexion en sélectionnant la nouvelle BDD - $str = 'mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_base']; - break; - case 'sqlite': - $str = 'sqlite:' . DATA_PATH . '/' . $_SESSION['default_user'] . '.sqlite'; - $driver_options = array( - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - ); - break; - default: - return false; - } - - $c = new PDO ($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); + case 'mysql': + $driver_options = array( + PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' + ); - if ($_SESSION['bd_type'] !== 'sqlite') { //No SQL backup for SQLite - $stm = $c->prepare(SQL_SHOW_TABLES); - $stm->execute(); - $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); - if (in_array($_SESSION['bd_prefix'] . 'entry', $res) && !in_array($_SESSION['bd_prefix'] . 'entry006', $res)) { - $sql = sprintf(SQL_BACKUP006, $_SESSION['bd_prefix']); //v0.6 - $res = $c->query($sql); //Backup tables + try { // on ouvre une connexion juste pour créer la base si elle n'existe pas + $str = 'mysql:host=' . $_SESSION['bd_host'] . ';'; + $c = new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); + $sql = sprintf(SQL_CREATE_DB, $_SESSION['bd_base']); + $res = $c->query($sql); + } catch (PDOException $e) { } + + // on écrase la précédente connexion en sélectionnant la nouvelle BDD + $str = 'mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_base']; + break; + case 'sqlite': + $str = 'sqlite:' . DATA_PATH . '/' . $_SESSION['default_user'] . '.sqlite'; + $driver_options = array( + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + ); + break; + default: + return false; } + $c = new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); + if (defined('SQL_CREATE_TABLES')) { $sql = sprintf(SQL_CREATE_TABLES, $_SESSION['bd_prefix_user'], _t('default_category')); $stm = $c->prepare($sql); @@ -719,20 +436,20 @@ function checkBD () { } /*** AFFICHAGE ***/ -function printStep0 () { +function printStep0() { global $actual; ?> - -

+ +

- +
- +
+
- +
- +
- +
- +
- + + - +
@@ -887,25 +608,45 @@ function printStep2 () {
- + />
- +
- - + /> +
+ +
- - + + - +
@@ -913,29 +654,29 @@ function printStep2 () { - -

+ +

-

+

- +
- +
+
- +
- +
- +
- +
- +
- +
- +
- +
@@ -988,10 +729,10 @@ function printStep3 () {
- - + + - +
@@ -999,74 +740,40 @@ function printStep3 () { - - - - -

- -
-
- - -
-
- - -

- -
-
- -
-
- -
+

+ -

- +

-

- @@ -1075,7 +782,7 @@ case 6: - <?php echo _t ('freshrss_installation'); ?> + <?php echo _t('freshrss_installation'); ?> @@ -1083,20 +790,19 @@ case 6:
-

-

+

+

@@ -1104,25 +810,22 @@ case 6: switch (STEP) { case 0: default: - printStep0 (); + printStep0(); break; case 1: - printStep1 (); + printStep1(); break; case 2: - printStep2 (); + printStep2(); break; case 3: - printStep3 (); + printStep3(); break; case 4: - printStep4 (); + printStep4(); break; case 5: - printStep5 (); - break; - case 6: - printStep6 (); + printStep5(); break; } ?> -- cgit v1.2.3 From a05fc42827c14083d912fdc22d06e6c012c0ac04 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Tue, 16 Sep 2014 11:12:36 +0200 Subject: Fix theme path for installation --- app/install.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php index f563d58d3..55b8a0065 100644 --- a/app/install.php +++ b/app/install.php @@ -783,7 +783,7 @@ case 5: <?php echo _t('freshrss_installation'); ?> - + -- cgit v1.2.3 From 2aba7e037d9cbdbe1ed7b39a11658b3ffce8ab6e Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Tue, 16 Sep 2014 12:05:58 +0200 Subject: Add a "toggle password" button during installation --- app/install.php | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php index 55b8a0065..8986e9965 100644 --- a/app/install.php +++ b/app/install.php @@ -608,7 +608,10 @@ function printStep2() {
- /> +
+ /> + +
@@ -622,6 +625,25 @@ function printStep2() {
-- cgit v1.2.3 From 530a1d4b6b043f6b6976bb7ad25b380c29d5b5a4 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Mon, 6 Oct 2014 14:23:17 +0200 Subject: Update i18n with strings from i18n.freshrss.org No more seperation between normal and install files. I will work on that later! --- app/i18n/en.php | 927 ++++++++++++++++++++++++------------------------ app/i18n/fr.php | 927 ++++++++++++++++++++++++------------------------ app/i18n/install.en.php | 69 ---- app/i18n/install.fr.php | 68 ---- app/install.php | 5 - 5 files changed, 944 insertions(+), 1052 deletions(-) delete mode 100644 app/i18n/install.en.php delete mode 100644 app/i18n/install.fr.php (limited to 'app/install.php') diff --git a/app/i18n/en.php b/app/i18n/en.php index 0456049a9..9e968998a 100644 --- a/app/i18n/en.php +++ b/app/i18n/en.php @@ -1,456 +1,473 @@ 'Login', - 'keep_logged_in' => 'Keep me logged in (1 month)', - 'login_with_persona' => 'Login with Persona', - 'login_persona_problem' => 'Connection problem with Persona?', - 'logout' => 'Logout', - 'search' => 'Search words or #tags', - 'search_short' => 'Search', - - 'configuration' => 'Configuration', - 'users' => 'Users', - 'categories' => 'Categories', - 'category' => 'Category', - 'feed' => 'Feed', - 'feeds' => 'Feeds', - 'shortcuts' => 'Shortcuts', - 'queries' => 'User queries', - 'query_search' => 'Search for "%s"', - 'query_order_asc' => 'Display oldest articles first', - 'query_order_desc' => 'Display newest articles first', - 'query_get_category' => 'Display "%s" category', - 'query_get_feed' => 'Display "%s" feed', - 'query_get_all' => 'Display all articles', - 'query_get_favorite' => 'Display favorite articles', - 'query_state_0' => 'Display all articles', - 'query_state_1' => 'Display read articles', - 'query_state_2' => 'Display unread articles', - 'query_state_3' => 'Display all articles', - 'query_state_4' => 'Display favorite articles', - 'query_state_5' => 'Display read favorite articles', - 'query_state_6' => 'Display unread favorite articles', - 'query_state_7' => 'Display favorite articles', - 'query_state_8' => 'Display not favorite articles', - 'query_state_9' => 'Display read not favorite articles', - 'query_state_10' => 'Display unread not favorite articles', - 'query_state_11' => 'Display not favorite articles', - 'query_state_12' => 'Display all articles', - 'query_state_13' => 'Display read articles', - 'query_state_14' => 'Display unread articles', - 'query_state_15' => 'Display all articles', - 'query_number' => 'Query n°%d', - 'add_query' => 'Add a query', - 'query_created' => 'Query "%s" has been created.', - 'no_query' => 'You haven’t created any user query yet.', - 'query_filter' => 'Filter applied:', - 'no_query_filter' => 'No filter', - 'query_deprecated' => 'This query is no longer valid. The referenced category or feed has been deleted.', - 'about' => 'About', - 'stats' => 'Statistics', - 'stats_idle' => 'Idle feeds', - 'stats_main' => 'Main statistics', - 'stats_repartition' => 'Articles repartition', - 'stats_entry_per_hour' => 'Per hour', - 'stats_entry_per_day_of_week' => 'Per day of week', - 'stats_entry_per_month' => 'Per month', - 'stats_percent_of_total' => '%% of total', - - 'last_week' => 'Last week', - 'last_month' => 'Last month', - 'last_3_month' => 'Last three months', - 'last_6_month' => 'Last six months', - 'last_year' => 'Last year', - - 'your_rss_feeds' => 'Your RSS feeds', - 'add_rss_feed' => 'Add a RSS feed', - 'no_rss_feed' => 'No RSS feed', - 'import_export' => 'Import / export', - 'bookmark' => 'Subscribe (FreshRSS bookmark)', - - 'subscription_management' => 'Subscriptions management', - 'main_stream' => 'Main stream', - 'all_feeds' => 'All feeds', - 'favorite_feeds' => 'Favourites (%s)', - 'not_read' => '%d unread', - 'not_reads' => '%d unread', - - 'filter' => 'Filter', - 'see_website' => 'See website', - 'administration' => 'Manage', - 'actualize' => 'Actualize', - - 'mark_read' => 'Mark as read', - 'mark_favorite' => 'Mark as favourite', - 'mark_all_read' => 'Mark all as read', - 'mark_feed_read' => 'Mark feed as read', - 'mark_cat_read' => 'Mark category as read', - 'before_one_day' => 'Before one day', - 'before_one_week' => 'Before one week', - 'display' => 'Display', - 'normal_view' => 'Normal view', - 'reader_view' => 'Reading view', - 'global_view' => 'Global view', - 'rss_view' => 'RSS feed', - 'show_all_articles' => 'Show all articles', - 'show_not_reads' => 'Show only unread', - 'show_adaptive' => 'Adjust showing', - 'show_read' => 'Show only read', - 'show_favorite' => 'Show only favorites', - 'show_not_favorite' => 'Show all but favorites', - 'older_first' => 'Oldest first', - 'newer_first' => 'Newer first', - - // Pagination - 'first' => 'First', - 'previous' => 'Previous', - 'next' => 'Next', - 'last' => 'Last', - - // CONTROLLERS - 'article_published_on' => 'This article originally appeared on %s', - 'article_published_on_author' => 'This article originally appeared on %s by %s', - - 'access_denied' => 'You don’t have permission to access this page', - 'page_not_found' => 'You are looking for a page which doesn’t exist', - 'error_occurred' => 'An error occurred', - 'error_occurred_update' => 'Nothing was changed', - - 'default_category' => 'Uncategorized', - 'categories_updated' => 'Categories have been updated', - 'categories_management' => 'Categories management', - 'feed_updated' => 'Feed has been updated', - 'rss_feed_management' => 'RSS feeds management', - 'configuration_updated' => 'Configuration has been updated', - 'sharing_management' => 'Sharing options management', - 'bad_opml_file' => 'Your OPML file is invalid', - 'shortcuts_updated' => 'Shortcuts have been updated', - 'shortcuts_navigation' => 'Navigation', - 'shortcuts_navigation_help' => 'With the "Shift" modifier, navigation shortcuts apply on feeds.
With the "Alt" modifier, navigation shortcuts apply on categories.', - 'shortcuts_article_action' => 'Article actions', - 'shortcuts_other_action' => 'Other actions', - 'feeds_marked_read' => 'Feeds have been marked as read', - 'updated' => 'Modifications have been updated', - - 'already_subscribed' => 'You have already subscribed to %s', - 'feed_added' => 'RSS feed %s has been added', - 'feed_not_added' => '%s could not be added', - 'internal_problem_feed' => 'The RSS feed could not be added. Check FressRSS logs for details.', - 'invalid_url' => 'URL %s is invalid', - 'feed_actualized' => '%s has been updated', - 'n_feeds_actualized' => '%d feeds have been updated', - 'feeds_actualized' => 'RSS feeds have been updated', - 'no_feed_actualized' => 'No RSS feed has been updated', - 'n_entries_deleted' => '%d articles have been deleted', - 'feeds_imported_with_errors' => 'Your feeds have been imported but some errors occurred', - 'feeds_imported' => 'Your feeds have been imported and will now be updated', - 'category_emptied' => 'Category has been emptied', - 'feed_deleted' => 'Feed has been deleted', - 'feed_validator' => 'Check the validity of the feed', - - 'optimization_complete' => 'Optimization complete', - - 'your_rss_feeds' => 'Your RSS feeds', - 'your_favorites' => 'Your favourites', - 'public' => 'Public', - 'invalid_login' => 'Login is invalid', - - 'file_is_nok' => 'Check permissions on %s directory. HTTP server must have rights to write into.', - - // VIEWS - 'save' => 'Save', - 'delete' => 'Delete', - 'cancel' => 'Cancel', - 'submit' => 'Submit', - - 'back_to_rss_feeds' => '← Go back to your RSS feeds', - 'feeds_moved_category_deleted' => 'When you delete a category, their feeds are automatically classified under %s.', - 'category_number' => 'Category n°%d', - 'ask_empty' => 'Clear?', - 'number_feeds' => '%d feeds', - 'can_not_be_deleted' => 'Cannot be deleted', - 'add_category' => 'Add a category', - 'new_category' => 'New category', - - 'javascript_for_shortcuts' => 'JavaScript must be enabled in order to use shortcuts', - 'javascript_should_be_activated'=> 'JavaScript must be enabled', - 'shift_for_all_read' => '+ shift to mark all articles as read', - 'see_on_website' => 'See on original website', - 'next_article' => 'Skip to the next article', - 'last_article' => 'Skip to the last article', - 'previous_article' => 'Skip to the previous article', - 'first_article' => 'Skip to the first article', - 'next_page' => 'Skip to the next page', - 'previous_page' => 'Skip to the previous page', - 'collapse_article' => 'Collapse', - 'auto_share' => 'Share', - 'auto_share_help' => 'If there is only one sharing mode, it is used. Else modes are accessible by their number.', - 'focus_search' => 'Access search box', - 'user_filter' => 'Access user filters', - 'user_filter_help' => 'If there is only one user filter, it is used. Else filters are accessible by their number.', - 'help' => 'Display documentation', - 'close_dropdown' => 'Close drop-down lists', - - 'file_to_import' => 'File to import
(OPML, Json or Zip)', - 'file_to_import_no_zip' => 'File to import
(OPML or Json)', - 'import' => 'Import', - 'file_cannot_be_uploaded' => 'File cannot be uploaded!', - 'zip_error' => 'An error occured during Zip import.', - 'no_zip_extension' => 'Zip extension is not present on your server.', - 'export' => 'Export', - 'export_opml' => 'Export list of feeds (OPML)', - 'export_starred' => 'Export your favourites', - 'export_no_zip_extension' => 'Zip extension is not present on your server. Please try to export files one by one.', - 'starred_list' => 'List of favourite articles', - 'feed_list' => 'List of %s articles', - 'or' => 'or', - - 'informations' => 'Information', - 'damn' => 'Damn!', - 'ok' => 'Ok!', - 'attention' => 'Be careful!', - 'feed_in_error' => 'This feed has encountered a problem. Please verify that it is always reachable then actualize it.', - 'feed_empty' => 'This feed is empty. Please verify that it is still maintained.', - 'feed_description' => 'Description', - 'website_url' => 'Website URL', - 'feed_url' => 'Feed URL', - 'articles' => 'articles', - 'number_articles' => '%d articles', - 'by_feed' => 'by feed', - 'by_default' => 'By default', - 'keep_history' => 'Minimum number of articles to keep', - 'ttl' => 'Do not automatically refresh more often than', - 'categorize' => 'Store in a category', - 'truncate' => 'Delete all articles', - 'advanced' => 'Advanced', - 'show_in_all_flux' => 'Show in main stream', - 'yes' => 'Yes', - 'no' => 'No', - 'css_path_on_website' => 'Articles CSS path on original website', - 'retrieve_truncated_feeds' => 'Retrieves truncated RSS feeds (attention, requires more time!)', - 'http_authentication' => 'HTTP Authentication', - 'http_username' => 'HTTP username', - 'http_password' => 'HTTP password', - 'blank_to_disable' => 'Leave blank to disable', - 'share_name' => 'Share name to display', - 'share_url' => 'Share URL to use', - 'not_yet_implemented' => 'Not yet implemented', - 'access_protected_feeds' => 'Connection allows to access HTTP protected RSS feeds', - 'no_selected_feed' => 'No feed selected.', - 'think_to_add' => 'You may add some feeds.', - - 'current_user' => 'Current user', - 'default_user' => 'Username of the default user (maximum 16 alphanumeric characters)', - 'password_form' => 'Password
(for the Web-form login method)', - 'password_api' => 'Password API
(e.g., for mobile apps)', - 'persona_connection_email' => 'Login mail address
(for Mozilla Persona)', - 'allow_anonymous' => 'Allow anonymous reading of the articles of the default user (%s)', - 'allow_anonymous_refresh' => 'Allow anonymous refresh of the articles', - 'unsafe_autologin' => 'Allow unsafe automatic login using the format: ', - 'api_enabled' => 'Allow API access (required for mobile apps)', - 'auth_token' => 'Authentication token', - 'explain_token' => 'Allows to access RSS output of the default user without authentication.
%s?output=rss&token=%s', - 'login_configuration' => 'Login', - 'is_admin' => 'is administrator', - 'auth_type' => 'Authentication method', - 'auth_none' => 'None (dangerous)', - 'auth_form' => 'Web form (traditional, requires JavaScript)', - 'http_auth' => 'HTTP (for advanced users with HTTPS)', - 'auth_persona' => 'Mozilla Persona (modern, requires JavaScript)', - 'users_list' => 'List of users', - 'create_user' => 'Create new user', - 'username' => 'Username', - 'username_admin' => 'Administrator username', - 'password' => 'Password', - 'create' => 'Create', - 'user_created' => 'User %s has been created', - 'user_deleted' => 'User %s has been deleted', - - 'language' => 'Language', - 'month' => 'months', - 'archiving_configuration' => 'Archiving', - 'delete_articles_every' => 'Remove articles after', - 'purge_now' => 'Purge now', - 'purge_completed' => 'Purge completed (%d articles deleted)', - 'archiving_configuration_help' => 'More options are available in the individual stream settings', - 'reading_configuration' => 'Reading', - 'display_configuration' => 'Display', - 'articles_per_page' => 'Number of articles per page', - 'number_divided_when_reader' => 'Divided by 2 in the reading view.', - 'default_view' => 'Default view', - 'articles_to_display' => 'Articles to display', - 'sort_order' => 'Sort order', - 'auto_load_more' => 'Load next articles at the page bottom', - 'display_articles_unfolded' => 'Show articles unfolded by default', - 'display_categories_unfolded' => 'Show categories folded by default', - 'hide_read_feeds' => 'Hide categories & feeds with no unread article (does not work with “Show all articles” configuration)', - 'after_onread' => 'After “mark all as read”,', - 'jump_next' => 'jump to next unread sibling (feed or category)', - 'article_icons' => 'Article icons', - 'top_line' => 'Top line', - 'bottom_line' => 'Bottom line', - 'html5_notif_timeout' => 'HTML5 notification timeout', - 'seconds_(0_means_no_timeout)' => 'seconds (0 means no timeout)', - 'img_with_lazyload' => 'Use "lazy load" mode to load pictures', - 'sticky_post' => 'Stick the article to the top when opened', - 'reading_confirm' => 'Display a confirmation dialog on “mark all as read” actions', - 'auto_read_when' => 'Mark article as read…', - 'article_viewed' => 'when article is viewed', - 'article_open_on_website' => 'when article is opened on its original website', - 'scroll' => 'while scrolling', - 'upon_reception' => 'upon reception of the article', - 'your_shaarli' => 'Your Shaarli', - 'your_wallabag' => 'Your wallabag', - 'your_diaspora_pod' => 'Your Diaspora* pod', - 'sharing' => 'Sharing', - 'share' => 'Share', - 'by_email' => 'By email', - 'optimize_bdd' => 'Optimize database', - 'optimize_todo_sometimes' => 'To do occasionally to reduce the size of the database', - 'theme' => 'Theme', - 'content_width' => 'Content width', - 'width_thin' => 'Thin', - 'width_medium' => 'Medium', - 'width_large' => 'Large', - 'width_no_limit' => 'No limit', - 'more_information' => 'More information', - 'activate_sharing' => 'Activate sharing', - 'shaarli' => 'Shaarli', - 'blogotext' => 'Blogotext', - 'wallabag' => 'wallabag', - 'diaspora' => 'Diaspora*', - 'twitter' => 'Twitter', - 'g+' => 'Google+', - 'facebook' => 'Facebook', - 'email' => 'Email', - 'print' => 'Print', - - 'article' => 'Article', - 'title' => 'Title', - 'author' => 'Author', - 'publication_date' => 'Date of publication', - 'by' => 'by', - - 'load_more' => 'Load more articles', - 'nothing_to_load' => 'There are no more articles', - - 'rss_feeds_of' => 'RSS feed of %s', - - 'refresh' => 'Refresh', - 'no_feed_to_refresh' => 'There is no feed to refresh…', - - 'today' => 'Today', - 'yesterday' => 'Yesterday', - 'before_yesterday' => 'Before yesterday', - 'new_article' => 'There are new available articles, click to refresh the page.', - 'by_author' => 'By %s', - 'related_tags' => 'Related tags', - 'no_feed_to_display' => 'There is no article to show.', - - 'about_freshrss' => 'About FreshRSS', - 'project_website' => 'Project website', - 'lead_developer' => 'Lead developer', - 'website' => 'Website', - 'bugs_reports' => 'Bugs reports', - 'github_or_email' => 'on Github or by mail', - 'license' => 'License', - 'agpl3' => 'AGPL 3', - 'freshrss_description' => 'FreshRSS is a RSS feeds aggregator to self-host like Kriss Feed or Leed. It is light and easy to take in hand while being powerful and configurable tool.', - 'credits' => 'Credits', - 'credits_content' => 'Some design elements come from Bootstrap although FreshRSS doesn’t use this framework. Icons come from GNOME project. Open Sans font police has been created by Steve Matteson. Favicons are collected with getFavicon API. FreshRSS is based on Minz, a PHP framework.', - 'version' => 'Version', - - 'logs' => 'Logs', - 'logs_empty' => 'Log file is empty', - 'clear_logs' => 'Clear the logs', - - 'forbidden_access' => 'Access is forbidden!', - 'login_required' => 'Login required:', - - 'confirm_action' => 'Are you sure you want to perform this action? It cannot be cancelled!', - 'confirm_action_feed_cat' => 'Are you sure you want to perform this action? You may lose related favorites and user queries. It cannot be cancelled!', - 'notif_title_new_articles' => 'FreshRSS: new articles!', - 'notif_body_new_articles' => 'There are \d new articles to read on FreshRSS.', - - // DATE - 'january' => 'January', - 'february' => 'February', - 'march' => 'March', - 'april' => 'April', - 'may' => 'May', - 'june' => 'June', - 'july' => 'July', - 'august' => 'August', - 'september' => 'September', - 'october' => 'October', - 'november' => 'November', - 'december' => 'December', - 'january' => 'Jan', - 'february' => 'Feb', - 'march' => 'Mar', - 'april' => 'Apr', - 'may' => 'May', - 'june' => 'Jun', - 'july' => 'Jul', - 'august' => 'Aug', - 'september' => 'Sep', - 'october' => 'Oct', - 'november' => 'Nov', - 'december' => 'Dec', - 'sun' => 'Sun', - 'mon' => 'Mon', - 'tue' => 'Tue', - 'wed' => 'Wed', - 'thu' => 'Thu', - 'fri' => 'Fri', - 'sat' => 'Sat', - // special format for date() function - 'Jan' => '\J\a\n\u\a\r\y', - 'Feb' => '\F\e\b\r\u\a\r\y', - 'Mar' => '\M\a\r\c\h', - 'Apr' => '\A\p\r\i\l', - 'May' => '\M\a\y', - 'Jun' => '\J\u\n\e', - 'Jul' => '\J\u\l\y', - 'Aug' => '\A\u\g\u\s\t', - 'Sep' => '\S\e\p\t\e\m\b\e\r', - 'Oct' => '\O\c\t\o\b\e\r', - 'Nov' => '\N\o\v\e\m\b\e\r', - 'Dec' => '\D\e\c\e\m\b\e\r', - // format for date() function, %s allows to indicate month in letter - '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', - - 'status_favorites' => 'Favourites', - 'status_read' => 'Read', - 'status_unread' => 'Unread', - 'status_total' => 'Total', - - 'stats_entry_repartition' => 'Entries repartition', - 'stats_entry_per_day' => 'Entries per day (last 30 days)', - 'stats_feed_per_category' => 'Feeds per category', - 'stats_entry_per_category' => 'Entries per category', - 'stats_top_feed' => 'Top ten feeds', - 'stats_entry_count' => 'Entry count', - 'stats_no_idle' => 'There is no idle feed!', - - 'update' => 'Update', - 'update_system' => 'Update system', - 'update_check' => 'Check for new updates', - 'update_last' => 'Last verification: %s', - 'update_can_apply' => 'An update is available.', - 'update_apply' => 'Apply', - 'update_server_not_found' => 'Update server cannot be found. [%s]', - 'no_update' => 'No update to apply', - 'update_problem' => 'The update process has encountered an error: %s', - 'update_finished' => 'Update completed!', - - 'auth_reset' => 'Authentication reset', - 'auth_will_reset' => 'Authentication system will be reset: a form will be used instead of Persona.', - 'auth_not_persona' => 'Only Persona system can be reset.', - 'auth_no_password_set' => 'Administrator password hasn’t been set. This feature isn’t available.', - 'auth_form_set' => 'Form is now your default authentication system.', - 'auth_form_not_set' => 'A problem occured during authentication system configuration. Please retry later.', -); + return array ( + 'about' => 'About', + 'about_freshrss' => 'About FreshRSS', + 'access_denied' => 'You don’t have permission to access this page', + 'access_protected_feeds' => 'Connection allows to access HTTP protected RSS feeds', + 'activate_sharing' => 'Activate sharing', + 'actualize' => 'Actualize', + 'add_category' => 'Add a category', + 'add_query' => 'Add a query', + 'add_rss_feed' => 'Add a RSS feed', + 'administration' => 'Manage', + 'advanced' => 'Advanced', + 'after_onread' => 'After “mark all as read”,', + 'agpl3' => 'AGPL 3', + 'allow_anonymous' => 'Allow anonymous reading of the articles of the default user (%s)', + 'allow_anonymous_refresh' => 'Allow anonymous refresh of the articles', + 'all_feeds' => 'All feeds', + 'already_subscribed' => 'You have already subscribed to %s', + 'api_enabled' => 'Allow API access (required for mobile apps)', + 'apr' => 'apr', + 'Apr' => '\\A\\p\\r\\i\\l', + 'april' => 'Apr', + 'archiving_configuration' => 'Archiving', + 'archiving_configuration_help' => 'More options are available in the individual stream settings', + 'article' => 'Article', + 'articles' => 'articles', + 'articles_per_page' => 'Number of articles per page', + 'articles_to_display' => 'Articles to display', + 'article_icons' => 'Article icons', + 'article_open_on_website' => 'when article is opened on its original website', + 'article_published_on' => 'This article originally appeared on %s', + 'article_published_on_author' => 'This article originally appeared on %s by %s', + 'article_viewed' => 'when article is viewed', + 'ask_empty' => 'Clear?', + 'attention' => 'Attention!', + 'aug' => 'aug', + 'Aug' => '\\A\\u\\g\\u\\s\\t', + 'august' => 'Aug', + 'author' => 'Author', + 'auth_form' => 'Web form (traditional, requires JavaScript)', + 'auth_form_not_set' => 'A problem occured during authentication system configuration. Please retry later.', + 'auth_form_set' => 'Form is now your default authentication system.', + 'auth_none' => 'None (dangerous)', + 'auth_not_persona' => 'Only Persona system can be reset.', + 'auth_no_password_set' => 'Administrator password hasn’t been set. This feature isn’t available.', + 'auth_persona' => 'Mozilla Persona (modern, requires JavaScript)', + 'auth_reset' => 'Authentication reset', + 'auth_token' => 'Authentication token', + 'auth_type' => 'Authentication method', + 'auth_will_reset' => 'Authentication system will be reset: a form will be used instead of Persona.', + 'auto_load_more' => 'Load next articles at the page bottom', + 'auto_read_when' => 'Mark article as read…', + 'auto_share' => 'Share', + 'auto_share_help' => 'If there is only one sharing mode, it is used. Else modes are accessible by their number.', + 'back_to_rss_feeds' => '← Go back to your RSS feeds', + 'bad_opml_file' => 'Your OPML file is invalid', + 'base_url' => 'Base URL', + 'bdd' => 'Database', + 'bdd_configuration' => 'Database configuration', + 'bdd_conf_is_ko' => 'Verify your database information.', + 'bdd_conf_is_ok' => 'Database configuration has been saved.', + 'bdd_type' => 'Type of database', + 'before_one_day' => 'Before one day', + 'before_one_week' => 'Before one week', + 'before_yesterday' => 'Before yesterday', + 'blank_to_disable' => 'Leave blank to disable', + 'blogotext' => 'Blogotext', + 'bookmark' => 'Subscribe (FreshRSS bookmark)', + 'bottom_line' => 'Bottom line', + 'bugs_reports' => 'Bugs reports', + 'by' => 'by', + 'by_author' => 'By %s', + 'by_default' => 'By default', + 'by_email' => 'By email', + 'by_feed' => 'by feed', + 'cache_is_ok' => 'Permissions on cache directory are good', + 'cancel' => 'Cancel', + 'can_not_be_deleted' => 'Cannot be deleted', + 'categories' => 'Categories', + 'categories_management' => 'Categories management', + 'categories_updated' => 'Categories have been updated', + 'categorize' => 'Store in a category', + 'category' => 'Category', + 'category_created' => 'Category %s has been created.', + 'category_deleted' => 'Category has been deleted.', + 'category_emptied' => 'Category has been emptied', + 'category_empty' => 'Empty category', + 'category_name_exists' => 'Category name already exists.', + 'category_not_delete_default' => 'You cannot delete the default category!', + 'category_not_exist' => 'The category does not exist!', + 'category_no_id' => 'You must precise the id of the category.', + 'category_no_name' => 'Category name cannot be empty.', + 'category_number' => 'Category n°%d', + 'category_updated' => 'Category has been updated.', + 'change_value' => 'You should change this value by any other', + 'checks' => 'Checks', + 'choose_language' => 'Choose a language for FreshRSS', + 'clear_logs' => 'Clear the logs', + 'collapse_article' => 'Collapse', + 'configuration' => 'Configuration', + 'configuration_updated' => 'Configuration has been updated', + 'confirm_action' => 'Are you sure you want to perform this action? It cannot be cancelled!', + 'confirm_action_feed_cat' => 'Are you sure you want to perform this action? You may lost related favorites and user queries. It cannot be cancelled!', + 'congratulations' => 'Congratulations!', + 'content_width' => 'Content width', + 'create' => 'Create', + 'create_user' => 'Create new user', + 'credits' => 'Credits', + 'credits_content' => 'Some design elements come from Bootstrap although FreshRSS doesn’t use this framework. Icons come from GNOME project. Open Sans font police has been created by Steve Matteson. Favicons are collected with getFavicon API. FreshRSS is based on Minz, a PHP framework.', + 'css_path_on_website' => 'Articles CSS path on original website', + 'ctype_is_nok' => 'You lack a required library for character type checking (php-ctype)', + 'ctype_is_ok' => 'You have the required library for character type checking (ctype)', + 'curl_is_nok' => 'You lack cURL (php5-curl package)', + 'curl_is_ok' => 'You have version %s of cURL', + 'current_user' => 'Current user', + 'damn' => 'Damn!', + 'data_is_ok' => 'Permissions on data directory are good', + 'Dec' => '\\D\\e\\c\\e\\m\\b\\e\\r', + 'dec' => 'dec', + 'december' => 'Dec', + 'default_category' => 'Uncategorized', + 'default_user' => 'Username of the default user (maximum 16 alphanumeric characters)', + 'default_view' => 'Default view', + 'delete' => 'Delete', + 'delete_articles_every' => 'Remove articles after', + 'diaspora' => 'Diaspora*', + 'display' => 'Display', + 'display_articles_unfolded' => 'Show articles unfolded by default', + 'display_categories_unfolded' => 'Show categories folded by default', + 'display_configuration' => 'Display', + 'dom_is_nok' => 'You lack a required library to browse the DOM (php-xml package)', + 'dom_is_ok' => 'You have the required library to browse the DOM', + 'do_not_change_if_doubt' => 'Don’t change if you doubt about it', + 'email' => 'Email', + 'error_occurred' => 'An error occurred', + 'error_occurred_update' => 'Nothing was changed', + 'explain_token' => 'Allows to access RSS output of the default user without authentication.
%s?output=rss&token=%s', + 'export' => 'Export', + 'export_no_zip_extension' => 'Zip extension is not present on your server. Please try to export files one by one.', + 'export_opml' => 'Export list of feeds (OPML)', + 'export_starred' => 'Export your favourites', + 'facebook' => 'Facebook', + 'favicons_is_ok' => 'Permissions on favicons directory are good', + 'favorite_feeds' => 'Favourites (%s)', + 'feb' => 'feb', + 'Feb' => '\\F\\e\\b\\r\\u\\a\\r\\y', + 'february' => 'Feb', + 'feed' => 'Feed', + 'feeds' => 'Feeds', + 'feeds_actualized' => 'RSS feeds have been updated', + 'feeds_imported' => 'Your feeds have been imported and will now be updated', + 'feeds_imported_with_errors' => 'Your feeds have been imported but some errors occurred', + 'feeds_marked_read' => 'Feeds have been marked as read', + 'feeds_moved_category_deleted' => 'When you delete a category, their feeds are automatically classified under %s.', + 'feed_actualized' => '%s has been updated', + 'feed_added' => 'RSS feed %s has been added', + 'feed_deleted' => 'Feed has been deleted', + 'feed_description' => 'Description', + 'feed_empty' => 'This feed is empty. Please verify that it is still maintained.', + 'feed_in_error' => 'This feed has encountered a problem. Please verify that it is always reachable then actualize it.', + 'feed_list' => 'List of %s articles', + 'feed_not_added' => '%s could not be added', + 'feed_updated' => 'Feed has been updated', + 'feed_url' => 'Feed URL', + 'feed_validator' => 'Check the validity of the feed', + 'file_cannot_be_uploaded' => 'File cannot be uploaded!', + 'file_is_nok' => 'Check permissions on %s directory. HTTP server must have rights to write into', + 'file_to_import' => 'File to import
(OPML, Json or Zip)', + 'file_to_import_no_zip' => 'File to import
(OPML or Json)', + 'filter' => 'Filter', + 'finish_installation' => 'Complete installation', + 'first' => 'First', + 'first_article' => 'Skip to the first article', + 'fix_errors_before' => 'Fix errors before skip to the next step.', + 'focus_search' => 'Access search box', + 'forbidden_access' => 'Access is forbidden!', + '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', + 'freshrss' => 'FreshRSS', + 'freshrss_description' => 'FreshRSS is a RSS feeds aggregator to self-host like Kriss Feed or Leed. It is light and easy to take in hand while being powerful and configurable tool.', + 'freshrss_installation' => 'Installation · FreshRSS', + 'fri' => 'Fri', + 'g+' => 'Google+', + 'general_configuration' => 'General configuration', + 'general_conf_is_ok' => 'General configuration has been saved.', + 'github_or_email' => 'on Github or by mail', + 'global_view' => 'Global view', + 'help' => 'Display documentation', + 'hide_read_feeds' => 'Hide categories & feeds with no unread article (does not work with “Show all articles” configuration)', + 'host' => 'Host', + 'html5_notif_timeout' => 'HTML5 notification timeout', + 'http_auth' => 'HTTP (for advanced users with HTTPS)', + 'http_authentication' => 'HTTP Authentication', + 'http_password' => 'HTTP password', + 'http_referer_is_nok' => 'Please check that you are not altering your HTTP REFERER.', + 'http_referer_is_ok' => 'Your HTTP REFERER is known and corresponds to your server.', + 'http_username' => 'HTTP username', + 'img_with_lazyload' => 'Use "lazy load" mode to load pictures', + 'import' => 'Import', + 'import_export' => 'Import / export', + 'informations' => 'Information', + 'installation_is_ok' => 'The installation process was successful.
The final step will now attempt to delete any file and database backup created during the update process.
You may choose to skip this step by deleting ./data/do-install.txt manually.', + 'installation_step' => 'Installation — step %d · FreshRSS', + 'install_not_deleted' => 'Something went wrong; you must delete the file %s manually.', + 'internal_problem_feed' => 'The RSS feed could not be added. Check FressRSS logs for details.', + 'invalid_login' => 'Login is invalid', + 'invalid_url' => 'URL %s is invalid', + 'is_admin' => 'is administrator', + 'jan' => 'jan', + 'Jan' => '\\J\\a\\n\\u\\a\\r\\y', + 'january' => 'Jan', + 'javascript_for_shortcuts' => 'JavaScript must be enabled in order to use shortcuts', + 'javascript_is_better' => 'FreshRSS is more pleasant with JavaScript enabled', + 'javascript_should_be_activated' => 'JavaScript must be enabled', + 'Jul' => '\\J\\u\\l\\y', + 'jul' => 'jul', + 'july' => 'Jul', + 'jump_next' => 'jump to next unread sibling (feed or category)', + 'Jun' => '\\J\\u\\n\\e', + 'jun' => 'jun', + 'june' => 'Jun', + 'keep_history' => 'Minimum number of articles to keep', + 'keep_logged_in' => 'Keep me logged in (1 month)', + 'language' => 'Language', + 'language_defined' => 'Language has been defined.', + 'last' => 'Last', + 'last_3_month' => 'Last three months', + 'last_6_month' => 'Last six months', + 'last_article' => 'Skip to the last article', + 'last_month' => 'Last month', + 'last_week' => 'Last week', + 'last_year' => 'Last year', + 'lead_developer' => 'Lead developer', + 'license' => 'License', + 'load_more' => 'Load more articles', + 'login' => 'Login', + 'login_configuration' => 'Login', + 'login_persona_problem' => 'Connection problem with Persona?', + 'login_required' => 'Login required:', + 'login_with_persona' => 'Login with Persona', + 'logout' => 'Logout', + 'logs' => 'Logs', + 'logs_empty' => 'Log file is empty', + 'log_is_ok' => 'Permissions on logs directory are good', + 'main_stream' => 'Main stream', + 'Mar' => '\\M\\a\\r\\c\\h', + 'mar' => 'mar', + 'march' => 'Mar', + 'mark_all_read' => 'Mark all as read', + 'mark_cat_read' => 'Mark category as read', + 'mark_favorite' => 'Mark as favourite', + 'mark_feed_read' => 'Mark feed as read', + 'mark_read' => 'Mark as read', + 'May' => '\\M\\a\\y', + 'may' => 'May', + 'minz_is_nok' => 'You lack the Minz framework. You should execute build.sh script or download it on Github and install in %s directory the content of its /lib directory.', + 'minz_is_ok' => 'You have the Minz framework', + 'mon' => 'Mon', + 'month' => 'months', + 'more_information' => 'More information', + 'newer_first' => 'Newer first', + 'new_article' => 'There are new available articles, click to refresh the page.', + 'new_category' => 'New category', + 'next' => 'Next', + 'next_article' => 'Skip to the next article', + 'next_page' => 'Skip to the next page', + 'next_step' => 'Go to the next step', + 'no' => 'No', + 'normal_view' => 'Normal view', + 'nothing_to_load' => 'There are no more articles', + 'notif_body_new_articles' => 'There are \\d new articles to read on FreshRSS.', + 'notif_title_new_articles' => 'FreshRSS: new articles!', + 'not_read' => '%d unread', + 'not_reads' => '%d unread', + 'not_yet_implemented' => 'Not yet implemented', + 'nov' => 'nov', + 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r', + 'november' => 'Nov', + 'no_feed_actualized' => 'No RSS feed has been updated', + 'no_feed_to_display' => 'There is no article to show.', + 'no_feed_to_refresh' => 'There is no feed to refresh…', + 'no_query' => 'You haven’t created any user query yet.', + 'no_query_filter' => 'No filter', + 'no_rss_feed' => 'No RSS feed', + 'no_selected_feed' => 'No feed selected.', + 'no_update' => 'No update to apply', + 'no_zip_extension' => 'Zip extension is not present on your server.', + 'number_articles' => '%d articles', + 'number_divided_when_reader' => 'Divided by 2 in the reading view.', + 'number_feeds' => '%d feeds', + 'n_entries_deleted' => '%d articles have been deleted', + 'n_feeds_actualized' => '%d feeds have been updated', + 'oct' => 'oct', + 'Oct' => '\\O\\c\\t\\o\\b\\e\\r', + 'october' => 'Oct', + 'ok' => 'Ok!', + 'older_first' => 'Oldest first', + 'oops' => 'Oops!', + 'optimization_complete' => 'Optimization complete', + 'optimize_bdd' => 'Optimize database', + 'optimize_todo_sometimes' => 'To do occasionally to reduce the size of the database', + 'or' => 'or', + 'page_not_found' => 'You are looking for a page which doesn’t exist', + 'password' => 'Password', + 'password_api' => 'Password API
(e.g., for mobile apps)', + 'password_form' => 'Password
(for the Web-form login method)', + 'pcre_is_nok' => 'You lack a required library for regular expressions (php-pcre)', + 'pcre_is_ok' => 'You have the required library for regular expressions (PCRE)', + 'pdo_is_nok' => 'You lack PDO or one of the supported drivers (pdo_mysql, pdo_sqlite)', + 'pdo_is_ok' => 'You have PDO and at least one of the supported drivers (pdo_mysql, pdo_sqlite)', + 'persona_connection_email' => 'Login mail address
(for Mozilla Persona)', + 'persona_is_ok' => 'Permissions on Mozilla Persona directory are good', + 'php_is_nok' => 'Your PHP version is %s but FreshRSS requires at least version %s', + 'php_is_ok' => 'Your PHP version is %s, which is compatible with FreshRSS', + 'prefix' => 'Table prefix', + 'previous' => 'Previous', + 'previous_article' => 'Skip to the previous article', + 'previous_page' => 'Skip to the previous page', + 'print' => 'Print', + 'project_website' => 'Project website', + 'public' => 'Public', + 'publication_date' => 'Date of publication', + 'purge_completed' => 'Purge completed (%d articles deleted)', + 'purge_now' => 'Purge now', + 'queries' => 'User queries', + 'query_created' => 'Query "%s" has been created.', + 'query_deprecated' => 'This query is no longer valid. The referenced category or feed has been deleted.', + 'query_filter' => 'Filter applied:', + 'query_get_all' => 'Display all articles', + 'query_get_category' => 'Display "%s" category', + 'query_get_favorite' => 'Display favorite articles', + 'query_get_feed' => 'Display "%s" feed', + 'query_number' => 'Query n°%d', + 'query_order_asc' => 'Display oldest articles first', + 'query_order_desc' => 'Display newest articles first', + 'query_search' => 'Search for "%s"', + 'query_state_0' => 'Display all articles', + 'query_state_1' => 'Display read articles', + 'query_state_2' => 'Display unread articles', + 'query_state_3' => 'Display all articles', + 'query_state_4' => 'Display favorite articles', + 'query_state_5' => 'Display read favorite articles', + 'query_state_6' => 'Display unread favorite articles', + 'query_state_7' => 'Display favorite articles', + 'query_state_8' => 'Display not favorite articles', + 'query_state_9' => 'Display read not favorite articles', + 'query_state_10' => 'Display unread not favorite articles', + 'query_state_11' => 'Display not favorite articles', + 'query_state_12' => 'Display all articles', + 'query_state_13' => 'Display read articles', + 'query_state_14' => 'Display unread articles', + 'query_state_15' => 'Display all articles', + 'random_string' => 'Random string', + 'reader_view' => 'Reading view', + 'reading_configuration' => 'Reading', + 'reading_confirm' => 'Display a confirmation dialog on “mark all as read” actions', + 'refresh' => 'Refresh', + 'related_tags' => 'Related tags', + 'retrieve_truncated_feeds' => 'Retrieves truncated RSS feeds (attention, requires more time!)', + 'rss_feeds_of' => 'RSS feed of %s', + 'rss_feed_management' => 'RSS feeds management', + 'rss_view' => 'RSS feed', + 'sat' => 'Sat', + 'save' => 'Save', + 'scroll' => 'while scrolling', + 'search' => 'Search words or #tags', + 'search_short' => 'Search', + 'seconds_(0_means_no_timeout)' => 'seconds (0 means no timeout)', + 'see_on_website' => 'See on original website', + 'see_website' => 'See website', + 'sep' => 'sep', + 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r', + 'september' => 'Sep', + 'shaarli' => 'Shaarli', + 'share' => 'Share', + 'share_name' => 'Share name to display', + 'share_url' => 'Share URL to use', + 'sharing' => 'Sharing', + 'sharing_management' => 'Sharing options management', + 'shift_for_all_read' => '+ shift to mark all articles as read', + 'shortcuts' => 'Shortcuts', + 'shortcuts_article_action' => 'Article actions', + 'shortcuts_navigation' => 'Navigation', + 'shortcuts_navigation_help' => 'With the "Shift" modifier, navigation shortcuts apply on feeds.
With the "Alt" modifier, navigation shortcuts apply on categories.', + 'shortcuts_other_action' => 'Other actions', + 'shortcuts_updated' => 'Shortcuts have been updated', + 'show_adaptive' => 'Adjust showing', + 'show_all_articles' => 'Show all articles', + 'show_favorite' => 'Show only favorites', + 'show_in_all_flux' => 'Show in main stream', + 'show_not_favorite' => 'Show all but favorites', + 'show_not_reads' => 'Show only unread', + 'show_read' => 'Show only read', + 'sort_order' => 'Sort order', + 'starred_list' => 'List of favourite articles', + 'stats' => 'Statistics', + 'stats_entry_count' => 'Entry count', + 'stats_entry_per_category' => 'Entries per category', + 'stats_entry_per_day' => 'Entries per day (last 30 days)', + 'stats_entry_per_day_of_week' => 'Per day of week', + 'stats_entry_per_hour' => 'Per hour', + 'stats_entry_per_month' => 'Per month', + 'stats_entry_repartition' => 'Entries repartition', + 'stats_feed_per_category' => 'Feeds per category', + 'stats_idle' => 'Idle feeds', + 'stats_main' => 'Main statistics', + 'stats_no_idle' => 'There is no idle feed!', + 'stats_percent_of_total' => '%% of total', + 'stats_repartition' => 'Articles repartition', + 'stats_top_feed' => 'Top ten feeds', + 'status_favorites' => 'Favourites', + 'status_read' => 'Read', + 'status_total' => 'Total', + 'status_unread' => 'Unread', + 'steps' => 'Steps', + 'sticky_post' => 'Stick the article to the top when opened', + 'submit' => 'Submit', + 'subscription_management' => 'Subscriptions management', + 'sun' => 'Sun', + 'theme' => 'Theme', + 'think_to_add' => 'You may add some feeds.', + 'this_is_the_end' => 'This is the end', + 'thu' => 'Thu', + 'title' => 'Title', + 'today' => 'Today', + 'top_line' => 'Top line', + 'truncate' => 'Delete all articles', + 'ttl' => 'Do not automatically refresh more often than', + 'tue' => 'Tue', + 'twitter' => 'Twitter', + 'unsafe_autologin' => 'Allow unsafe automatic login using the format: ', + 'update' => 'Update', + 'updated' => 'Modifications have been updated', + 'update_apply' => 'Apply', + 'update_can_apply' => 'An update is available.', + 'update_check' => 'Check for new updates', + 'update_end' => 'Update process is completed, now you can go to the final step.', + 'update_finished' => 'Update completed!', + 'update_last' => 'Last verification: %s', + 'update_long' => 'This can take a long time, depending on the size of your database. You may have to wait for this page to time out (~5 minutes) and then refresh this page.', + 'update_problem' => 'The update process has encountered an error: %s', + 'update_server_not_found' => 'Update server cannot be found. [%s]', + 'update_start' => 'Start update process', + 'update_system' => 'Update system', + 'upon_reception' => 'upon reception of the article', + 'username' => 'Username', + 'username_admin' => 'Administrator username', + 'users' => 'Users', + 'users_list' => 'List of users', + 'user_created' => 'User %s has been created', + 'user_deleted' => 'User %s has been deleted', + 'user_filter' => 'Access user filters', + 'user_filter_help' => 'If there is only one user filter, it is used. Else filters are accessible by their number.', + 'version' => 'Version', + 'version_update' => 'Update', + 'wallabag' => 'wallabag', + 'website' => 'Website', + 'website_url' => 'Website URL', + 'wed' => 'Wed', + 'width_large' => 'Large', + 'width_medium' => 'Medium', + 'width_no_limit' => 'No limit', + 'width_thin' => 'Thin', + 'yes' => 'Yes', + 'yesterday' => 'Yesterday', + 'your_diaspora_pod' => 'Your Diaspora* pod', + 'your_favorites' => 'Your favourites', + 'your_rss_feeds' => 'Your RSS feeds', + 'your_shaarli' => 'Your Shaarli', + 'your_wallabag' => 'Your wallabag', + 'zip_error' => 'An error occured during Zip import.', +); \ No newline at end of file diff --git a/app/i18n/fr.php b/app/i18n/fr.php index adc79d0e2..072094026 100644 --- a/app/i18n/fr.php +++ b/app/i18n/fr.php @@ -1,456 +1,473 @@ 'Connexion', - 'keep_logged_in' => 'Rester connecté (1 mois)', - 'login_with_persona' => 'Connexion avec Persona', - 'login_persona_problem' => 'Problème de connexion à Persona ?', - 'logout' => 'Déconnexion', - 'search' => 'Rechercher des mots ou des #tags', - 'search_short' => 'Rechercher', - - 'configuration' => 'Configuration', - 'users' => 'Utilisateurs', - 'categories' => 'Catégories', - 'category' => 'Catégorie', - 'feed' => 'Flux', - 'feeds' => 'Flux', - 'shortcuts' => 'Raccourcis', - 'queries' => 'Filtres utilisateurs', - 'query_search' => 'Recherche de "%s"', - 'query_order_asc' => 'Afficher les articles les plus anciens en premier', - 'query_order_desc' => 'Afficher les articles les plus récents en premier', - 'query_get_category' => 'Afficher la catégorie "%s"', - 'query_get_feed' => 'Afficher le flux "%s"', - 'query_get_all' => 'Afficher tous les articles', - 'query_get_favorite' => 'Afficher les articles favoris', - 'query_state_0' => 'Afficher tous les articles', - 'query_state_1' => 'Afficher les articles lus', - 'query_state_2' => 'Afficher les articles non lus', - 'query_state_3' => 'Afficher tous les articles', - 'query_state_4' => 'Afficher les articles favoris', - 'query_state_5' => 'Afficher les articles lus et favoris', - 'query_state_6' => 'Afficher les articles non lus et favoris', - 'query_state_7' => 'Afficher les articles favoris', - 'query_state_8' => 'Afficher les articles non favoris', - 'query_state_9' => 'Afficher les articles lus et non favoris', - 'query_state_10' => 'Afficher les articles non lus et non favoris', - 'query_state_11' => 'Afficher les articles non favoris', - 'query_state_12' => 'Afficher tous les articles', - 'query_state_13' => 'Afficher les articles lus', - 'query_state_14' => 'Afficher les articles non lus', - 'query_state_15' => 'Afficher tous les articles', - 'query_number' => 'Filtre n°%d', - 'add_query' => 'Créer un filtre', - 'query_created' => 'Le filtre "%s" a bien été créé.', - 'no_query' => 'Vous n’avez pas encore créé de filtre.', - 'query_filter' => 'Filtres appliqués :', - 'no_query_filter' => 'Aucun filtre appliqué', - 'query_deprecated' => 'Ce filtre n’est plus valide. La catégorie ou le flux concerné a été supprimé.', - 'about' => 'À propos', - 'stats' => 'Statistiques', - 'stats_idle' => 'Flux inactifs', - 'stats_main' => 'Statistiques principales', - 'stats_repartition' => 'Répartition des articles', - 'stats_entry_per_hour' => 'Par heure', - 'stats_entry_per_day_of_week' => 'Par jour de la semaine', - 'stats_entry_per_month' => 'Par mois', - 'stats_percent_of_total' => '%% du total', - - 'last_week' => 'Depuis la semaine dernière', - 'last_month' => 'Depuis le mois dernier', - 'last_3_month' => 'Depuis les trois derniers mois', - 'last_6_month' => 'Depuis les six derniers mois', - 'last_year' => 'Depuis l’année dernière', - - 'your_rss_feeds' => 'Vos flux RSS', - 'add_rss_feed' => 'Ajouter un flux RSS', - 'no_rss_feed' => 'Aucun flux RSS', - 'import_export' => 'Importer / exporter', - 'bookmark' => 'S’abonner (bookmark FreshRSS)', - - 'subscription_management' => 'Gestion des abonnements', - 'main_stream' => 'Flux principal', - 'all_feeds' => 'Tous les flux', - 'favorite_feeds' => 'Favoris (%s)', - 'not_read' => '%d non lu', - 'not_reads' => '%d non lus', - - 'filter' => 'Filtrer', - 'see_website' => 'Voir le site', - 'administration' => 'Gérer', - 'actualize' => 'Actualiser', - - 'mark_read' => 'Marquer comme lu', - 'mark_favorite' => 'Mettre en favori', - 'mark_all_read' => 'Tout marquer comme lu', - 'mark_feed_read' => 'Marquer le flux comme lu', - 'mark_cat_read' => 'Marquer la catégorie comme lue', - 'before_one_day' => 'Antérieurs à 1 jour', - 'before_one_week' => 'Antérieurs à 1 semaine', - 'display' => 'Affichage', - 'normal_view' => 'Vue normale', - 'reader_view' => 'Vue lecture', - 'global_view' => 'Vue globale', - 'rss_view' => 'Flux RSS', - 'show_all_articles' => 'Afficher tous les articles', - 'show_not_reads' => 'Afficher les non lus', - 'show_adaptive' => 'Adapter l’affichage', - 'show_read' => 'Afficher les lus', - 'show_favorite' => 'Afficher les favoris', - 'show_not_favorite' => 'Afficher tout sauf les favoris', - 'older_first' => 'Plus anciens en premier', - 'newer_first' => 'Plus récents en premier', - - // Pagination - 'first' => 'Début', - 'previous' => 'Précédent', - 'next' => 'Suivant', - 'last' => 'Fin', - - // CONTROLLERS - 'article_published_on' => 'Article publié initialement sur %s', - 'article_published_on_author' => 'Article publié initialement sur %s par %s', - - 'access_denied' => 'Vous n’avez pas le droit d’accéder à cette page !', - 'page_not_found' => 'La page que vous cherchez n’existe pas !', - 'error_occurred' => 'Une erreur est survenue !', - 'error_occurred_update' => 'Rien n’a été modifié !', - - 'default_category' => 'Sans catégorie', - 'categories_updated' => 'Les catégories ont été mises à jour.', - 'categories_management' => 'Gestion des catégories', - 'feed_updated' => 'Le flux a été mis à jour.', - 'rss_feed_management' => 'Gestion des flux RSS', - 'configuration_updated' => 'La configuration a été mise à jour.', - 'sharing_management' => 'Gestion des options de partage', - 'bad_opml_file' => 'Votre fichier OPML n’est pas valide.', - 'shortcuts_updated' => 'Les raccourcis ont été mis à jour.', - 'shortcuts_navigation' => 'Navigation', - 'shortcuts_navigation_help' => 'Avec le modificateur "Shift", les raccourcis de navigation s’appliquent aux flux.
Avec le modificateur "Alt", les raccourcis de navigation s’appliquent aux catégories.', - 'shortcuts_article_action' => 'Actions associées à l’article courant', - 'shortcuts_other_action' => 'Autres actions', - 'feeds_marked_read' => 'Les flux ont été marqués comme lus.', - 'updated' => 'Modifications enregistrées.', - - 'already_subscribed' => 'Vous êtes déjà abonné à %s', - 'feed_added' => 'Le flux %s a bien été ajouté.', - 'feed_not_added' => '%s n’a pas pu être ajouté.', - 'internal_problem_feed' => 'Le flux ne peut pas être ajouté. Consulter les logs de FreshRSS pour plus de détails.', - 'invalid_url' => 'L’url %s est invalide.', - 'feed_actualized' => '%s a été mis à jour.', - 'n_feeds_actualized' => '%d flux ont été mis à jour.', - 'feeds_actualized' => 'Les flux ont été mis à jour.', - 'no_feed_actualized' => 'Aucun flux n’a pu être mis à jour.', - 'n_entries_deleted' => '%d articles ont été supprimés.', - 'feeds_imported_with_errors' => 'Vos flux ont été importés mais des erreurs sont survenues.', - 'feeds_imported' => 'Vos flux ont été importés et vont maintenant être actualisés.', - 'category_emptied' => 'La catégorie a été vidée.', - 'feed_deleted' => 'Le flux a été supprimé.', - 'feed_validator' => 'Vérifier la valididé du flux', - - 'optimization_complete' => 'Optimisation terminée.', - - 'your_rss_feeds' => 'Vos flux RSS', - 'your_favorites' => 'Vos favoris', - 'public' => 'Public', - 'invalid_login' => 'L’identifiant est invalide !', - - 'file_is_nok' => 'Veuillez vérifier les droits sur le répertoire %s. Le serveur HTTP doit être capable d’écrire dedans.', - - // VIEWS - 'save' => 'Enregistrer', - 'delete' => 'Supprimer', - 'cancel' => 'Annuler', - 'submit' => 'Valider', - - 'back_to_rss_feeds' => '← Retour à vos flux RSS', - 'feeds_moved_category_deleted' => 'Lors de la suppression d’une catégorie, ses flux seront automatiquement classés dans %s.', - 'category_number' => 'Catégorie n°%d', - 'ask_empty' => 'Vider ?', - 'number_feeds' => '%d flux', - 'can_not_be_deleted' => 'Ne peut pas être supprimée.', - 'add_category' => 'Ajouter une catégorie', - 'new_category' => 'Nouvelle catégorie', - - 'javascript_for_shortcuts' => 'Le JavaScript doit être activé pour pouvoir profiter des raccourcis.', - 'javascript_should_be_activated'=> 'Le JavaScript doit être activé.', - 'shift_for_all_read' => '+ shift pour marquer tous les articles comme lus', - 'see_on_website' => 'Voir sur le site d’origine', - 'next_article' => 'Passer à l’article suivant', - 'last_article' => 'Passer au dernier article', - 'previous_article' => 'Passer à l’article précédent', - 'first_article' => 'Passer au premier article', - 'next_page' => 'Passer à la page suivante', - 'previous_page' => 'Passer à la page précédente', - 'collapse_article' => 'Refermer', - 'auto_share' => 'Partager', - 'auto_share_help' => 'S’il n’y a qu’un mode de partage, celui ci est utilisé automatiquement. Sinon ils sont accessibles par leur numéro.', - 'focus_search' => 'Accéder à la recherche', - 'user_filter' => 'Accéder aux filtres utilisateur', - 'user_filter_help' => 'S’il n’y a qu’un filtre utilisateur, celui ci est utilisé automatiquement. Sinon ils sont accessibles par leur numéro.', - 'help' => 'Afficher la documentation', - 'close_dropdown' => 'Fermer les listes déroulantes', - - 'file_to_import' => 'Fichier à importer
(OPML, Json ou Zip)', - 'file_to_import_no_zip' => 'Fichier à importer
(OPML ou Json)', - 'import' => 'Importer', - 'file_cannot_be_uploaded' => 'Le fichier ne peut pas être téléchargé!', - 'zip_error' => 'Une erreur est survenue durant l’import du fichier Zip.', - 'no_zip_extension' => 'L’extension Zip n’est pas présente sur votre serveur.', - 'export' => 'Exporter', - 'export_opml' => 'Exporter la liste des flux (OPML)', - 'export_starred' => 'Exporter les favoris', - 'export_no_zip_extension' => 'L’extension Zip n’est pas présente sur votre serveur. Veuillez essayer d’exporter les fichiers un par un.', - 'starred_list' => 'Liste des articles favoris', - 'feed_list' => 'Liste des articles de %s', - 'or' => 'ou', - - 'informations' => 'Informations', - 'damn' => 'Arf !', - 'ok' => 'Ok !', - 'attention' => 'Attention !', - 'feed_in_error' => 'Ce flux a rencontré un problème. Veuillez vérifier qu’il est toujours accessible puis actualisez-le.', - 'feed_empty' => 'Ce flux est vide. Veuillez vérifier qu’il est toujours maintenu.', - 'feed_description' => 'Description', - 'website_url' => 'URL du site', - 'feed_url' => 'URL du flux', - 'articles' => 'articles', - 'number_articles' => '%d articles', - 'by_feed' => 'par flux', - 'by_default' => 'Par défaut', - 'keep_history' => 'Nombre minimum d’articles à conserver', - 'ttl' => 'Ne pas automatiquement rafraîchir plus souvent que', - 'categorize' => 'Ranger dans une catégorie', - 'truncate' => 'Supprimer tous les articles', - 'advanced' => 'Avancé', - 'show_in_all_flux' => 'Afficher dans le flux principal', - 'yes' => 'Oui', - 'no' => 'Non', - 'css_path_on_website' => 'Sélecteur CSS des articles sur le site d’origine', - 'retrieve_truncated_feeds' => 'Permet de récupérer les flux tronqués (attention, demande plus de temps !)', - 'http_authentication' => 'Authentification HTTP', - 'http_username' => 'Identifiant HTTP', - 'http_password' => 'Mot de passe HTTP', - 'blank_to_disable' => 'Laissez vide pour désactiver', - 'share_name' => 'Nom du partage à afficher', - 'share_url' => 'URL du partage à utiliser', - 'not_yet_implemented' => 'Pas encore implémenté', - 'access_protected_feeds' => 'La connexion permet d’accéder aux flux protégés par une authentification HTTP.', - 'no_selected_feed' => 'Aucun flux sélectionné.', - 'think_to_add' => 'Vous pouvez ajouter des flux.', - - 'current_user' => 'Utilisateur actuel', - 'password_form' => 'Mot de passe
(pour connexion par formulaire)', - 'password_api' => 'Mot de passe API
(ex. : pour applis mobiles)', - 'default_user' => 'Nom de l’utilisateur par défaut (16 caractères alphanumériques maximum)', - 'persona_connection_email' => 'Adresse courriel de connexion
(pour Mozilla Persona)', - 'allow_anonymous' => 'Autoriser la lecture anonyme des articles de l’utilisateur par défaut (%s)', - 'allow_anonymous_refresh' => 'Autoriser le rafraîchissement anonyme des flux', - 'unsafe_autologin' => 'Autoriser les connexions automatiques non-sûres au format : ', - 'api_enabled' => 'Autoriser l’accès par API (nécessaire pour les applis mobiles)', - 'auth_token' => 'Jeton d’identification', - 'explain_token' => 'Permet d’accéder à la sortie RSS de l’utilisateur par défaut sans besoin de s’authentifier.
%s?output=rss&token=%s', - 'login_configuration' => 'Identification', - 'is_admin' => 'est administrateur', - 'auth_type' => 'Méthode d’authentification', - 'auth_none' => 'Aucune (dangereux)', - 'auth_form' => 'Formulaire (traditionnel, requiert JavaScript)', - 'http_auth' => 'HTTP (pour utilisateurs avancés avec HTTPS)', - 'auth_persona' => 'Mozilla Persona (moderne, requiert JavaScript)', - 'users_list' => 'Liste des utilisateurs', - 'create_user' => 'Créer un nouvel utilisateur', - 'username' => 'Nom d’utilisateur', - 'username_admin' => 'Nom d’utilisateur administrateur', - 'password' => 'Mot de passe', - 'create' => 'Créer', - 'user_created' => 'L’utilisateur %s a été créé.', - 'user_deleted' => 'L’utilisateur %s a été supprimé.', - - 'language' => 'Langue', - 'month' => 'mois', - 'archiving_configuration' => 'Archivage', - 'delete_articles_every' => 'Supprimer les articles après', - 'purge_now' => 'Purger maintenant', - 'purge_completed' => 'Purge effectuée (%d articles supprimés).', - 'archiving_configuration_help' => 'D’autres options sont disponibles dans la configuration individuelle des flux.', - 'reading_configuration' => 'Lecture', - 'display_configuration' => 'Affichage', - 'articles_per_page' => 'Nombre d’articles par page', - 'number_divided_when_reader' => 'Divisé par 2 dans la vue de lecture.', - 'default_view' => 'Vue par défaut', - 'articles_to_display' => 'Articles à afficher', - 'sort_order' => 'Ordre de tri', - 'auto_load_more' => 'Charger les articles suivants en bas de page', - 'display_articles_unfolded' => 'Afficher les articles dépliés par défaut', - 'display_categories_unfolded' => 'Afficher les catégories pliées par défaut', - 'hide_read_feeds' => 'Cacher les catégories & flux sans article non-lu (ne fonctionne pas avec la configuration “Afficher tous les articles”)', - 'after_onread' => 'Après “marquer tout comme lu”,', - 'jump_next' => 'sauter au prochain voisin non lu (flux ou catégorie)', - 'article_icons' => 'Icônes d’article', - 'top_line' => 'Ligne du haut', - 'bottom_line' => 'Ligne du bas', - 'html5_notif_timeout' => 'Temps d’affichage de la notification HTML5', - 'seconds_(0_means_no_timeout)' => 'secondes (0 signifie aucun timeout ) ', - 'img_with_lazyload' => 'Utiliser le mode “chargement différé” pour les images', - 'sticky_post' => 'Aligner l’article en haut quand il est ouvert', - 'reading_confirm' => 'Afficher une confirmation lors des actions “marquer tout comme lu”', - 'auto_read_when' => 'Marquer un article comme lu…', - 'article_viewed' => 'lorsque l’article est affiché', - 'article_open_on_website' => 'lorsque l’article est ouvert sur le site d’origine', - 'scroll' => 'au défilement de la page', - 'upon_reception' => 'dès la réception du nouvel article', - 'your_shaarli' => 'Votre Shaarli', - 'your_wallabag' => 'Votre wallabag', - 'your_diaspora_pod' => 'Votre pod Diaspora*', - 'sharing' => 'Partage', - 'share' => 'Partager', - 'by_email' => 'Par courriel', - 'optimize_bdd' => 'Optimiser la base de données', - 'optimize_todo_sometimes' => 'À faire de temps en temps pour réduire la taille de la BDD', - 'theme' => 'Thème', - 'content_width' => 'Largeur du contenu', - 'width_thin' => 'Fine', - 'width_medium' => 'Moyenne', - 'width_large' => 'Large', - 'width_no_limit' => 'Pas de limite', - 'more_information' => 'Plus d’informations', - 'activate_sharing' => 'Activer le partage', - 'shaarli' => 'Shaarli', - 'blogotext' => 'Blogotext', - 'wallabag' => 'wallabag', - 'diaspora' => 'Diaspora*', - 'twitter' => 'Twitter', - 'g+' => 'Google+', - 'facebook' => 'Facebook', - 'email' => 'Courriel', - 'print' => 'Imprimer', - - 'article' => 'Article', - 'title' => 'Titre', - 'author' => 'Auteur', - 'publication_date' => 'Date de publication', - 'by' => 'par', - - 'load_more' => 'Charger plus d’articles', - 'nothing_to_load' => 'Fin des articles', - - 'rss_feeds_of' => 'Flux RSS de %s', - - 'refresh' => 'Actualisation', - 'no_feed_to_refresh' => 'Il n’y a aucun flux à actualiser…', - - 'today' => 'Aujourd’hui', - 'yesterday' => 'Hier', - 'before_yesterday' => 'À partir d’avant-hier', - 'new_article' => 'Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.', - 'by_author' => 'Par %s', - 'related_tags' => 'Tags associés', - 'no_feed_to_display' => 'Il n’y a aucun article à afficher.', - - 'about_freshrss' => 'À propos de FreshRSS', - 'project_website' => 'Site du projet', - 'lead_developer' => 'Développeur principal', - 'website' => 'Site Internet', - 'bugs_reports' => 'Rapports de bugs', - 'github_or_email' => 'sur Github ou par courriel', - 'license' => 'Licence', - 'agpl3' => 'AGPL 3', - 'freshrss_description' => 'FreshRSS est un agrégateur de flux RSS à auto-héberger à l’image de Kriss Feed ou Leed. Il se veut léger et facile à prendre en main tout en étant un outil puissant et paramétrable.', - 'credits' => 'Crédits', - 'credits_content' => 'Des éléments de design sont issus du projet Bootstrap bien que FreshRSS n’utilise pas ce framework. Les icônes sont issues du projet GNOME. La police Open Sans utilisée a été créée par Steve Matteson. Les favicons sont récupérés grâce au site getFavicon. FreshRSS repose sur Minz, un framework PHP.', - 'version' => 'Version', - - 'logs' => 'Logs', - 'logs_empty' => 'Les logs sont vides.', - 'clear_logs' => 'Effacer les logs', - - 'forbidden_access' => 'L’accès vous est interdit !', - 'login_required' => 'Accès protégé par mot de passe :', - - 'confirm_action' => 'Êtes-vous sûr(e) de vouloir continuer ? Cette action ne peut être annulée !', - 'confirm_action_feed_cat' => 'Êtes-vous sûr(e) de vouloir continuer ? Vous pourriez perdre les favoris et les filtres associés. Cette action ne peut être annulée !', - 'notif_title_new_articles' => 'FreshRSS : nouveaux articles !', - 'notif_body_new_articles' => 'Il y a \d nouveaux articles à lire sur FreshRSS.', - - // DATE - 'january' => 'janvier', - 'february' => 'février', - 'march' => 'mars', - 'april' => 'avril', - 'may' => 'mai', - 'june' => 'juin', - 'july' => 'juillet', - 'august' => 'août', - 'september' => 'septembre', - 'october' => 'octobre', - 'november' => 'novembre', - 'december' => 'décembre', - 'jan' => 'jan.', - 'feb' => 'fév.', - 'mar' => 'mar.', - 'apr' => 'avr.', - 'may' => 'mai.', - 'jun' => 'juin', - 'jul' => 'jui.', - 'aug' => 'août', - 'sep' => 'sep.', - 'oct' => 'oct.', - 'nov' => 'nov.', - 'dec' => 'déc.', - 'sun' => 'dim.', - 'mon' => 'lun.', - 'tue' => 'mar.', - 'wed' => 'mer.', - 'thu' => 'jeu.', - 'fri' => 'ven.', - 'sat' => 'sam.', - // format spécial pour la fonction date() - 'Jan' => '\j\a\n\v\i\e\r', - 'Feb' => '\f\é\v\r\i\e\r', - 'Mar' => '\m\a\r\s', - 'Apr' => '\a\v\r\i\l', - 'May' => '\m\a\i', - 'Jun' => '\j\u\i\n', - 'Jul' => '\j\u\i\l\l\e\t', - 'Aug' => '\a\o\û\t', - 'Sep' => '\s\e\p\t\e\m\b\r\e', - 'Oct' => '\o\c\t\o\b\r\e', - 'Nov' => '\n\o\v\e\m\b\r\e', - 'Dec' => '\d\é\c\e\m\b\r\e', - // format pour la fonction date(), %s permet d'indiquer le mois en toutes lettres - 'format_date' => 'j %s Y', - 'format_date_hour' => 'j %s Y \à H\:i', - - 'status_favorites' => 'favoris', - 'status_read' => 'lus', - 'status_unread' => 'non lus', - 'status_total' => 'total', - - 'stats_entry_repartition' => 'Répartition des articles', - 'stats_entry_per_day' => 'Nombre d’articles par jour (30 derniers jours)', - 'stats_feed_per_category' => 'Flux par catégorie', - 'stats_entry_per_category' => 'Articles par catégorie', - 'stats_top_feed' => 'Les dix plus gros flux', - 'stats_entry_count' => 'Nombre d’articles', - 'stats_no_idle' => 'Il n’y a aucun flux inactif !', - - 'update' => 'Mise à jour', - 'update_system' => 'Système de mise à jour', - 'update_check' => 'Vérifier les mises à jour', - 'update_last' => 'Dernière vérification : %s', - 'update_can_apply' => 'Une mise à jour est disponible.', - 'update_apply' => 'Appliquer la mise à jour', - 'update_server_not_found' => 'Le serveur de mise à jour n’a pas été trouvé. [%s]', - 'no_update' => 'Aucune mise à jour à appliquer', - 'update_problem' => 'La mise à jour a rencontré un problème : %s', - 'update_finished' => 'La mise à jour est terminée !', - - 'auth_reset' => 'Réinitialisation de l’authentification', - 'auth_will_reset' => 'Le système d’authentification va être réinitialisé : un formulaire sera utilisé à la place de Persona.', - 'auth_not_persona' => 'Seul le système d’authentification Persona peut être réinitialisé.', - 'auth_no_password_set' => 'Aucun mot de passe administrateur n’a été précisé. Cette fonctionnalité n’est pas disponible.', - 'auth_form_set' => 'Le formulaire est désormais votre système d’authentification.', - 'auth_form_not_set' => 'Un problème est survenu lors de la configuration de votre système d’authentification. Veuillez réessayer plus tard.', -); + return array ( + 'about' => 'À propos', + 'about_freshrss' => 'À propos de FreshRSS', + 'access_denied' => 'Vous n’avez pas le droit d’accéder à cette page !', + 'access_protected_feeds' => 'La connexion permet d’accéder aux flux protégés par une authentification HTTP.', + 'activate_sharing' => 'Activer le partage', + 'actualize' => 'Actualiser', + 'add_category' => 'Ajouter une catégorie', + 'add_query' => 'Créer un filtre', + 'add_rss_feed' => 'Ajouter un flux RSS', + 'administration' => 'Gérer', + 'advanced' => 'Avancé', + 'after_onread' => 'Après “marquer tout comme lu”,', + 'agpl3' => 'AGPL 3', + 'allow_anonymous' => 'Autoriser la lecture anonyme des articles de l’utilisateur par défaut (%s)', + 'allow_anonymous_refresh' => 'Autoriser le rafraîchissement anonyme des flux', + 'all_feeds' => 'Tous les flux', + 'already_subscribed' => 'Vous êtes déjà abonné à %s', + 'api_enabled' => 'Autoriser l’accès par API (nécessaire pour les applis mobiles)', + 'apr' => 'avr.', + 'Apr' => '\\a\\v\\r\\i\\l', + 'april' => 'avril', + 'archiving_configuration' => 'Archivage', + 'archiving_configuration_help' => 'D’autres options sont disponibles dans la configuration individuelle des flux.', + 'article' => 'Article', + 'articles' => 'articles', + 'articles_per_page' => 'Nombre d’articles par page', + 'articles_to_display' => 'Articles à afficher', + 'article_icons' => 'Icônes d’article', + 'article_open_on_website' => 'lorsque l’article est ouvert sur le site d’origine', + 'article_published_on' => 'Article publié initialement sur %s', + 'article_published_on_author' => 'Article publié initialement sur %s par %s', + 'article_viewed' => 'lorsque l’article est affiché', + 'ask_empty' => 'Vider ?', + 'attention' => 'Attention !', + 'aug' => 'août', + 'Aug' => '\\a\\o\\û\\t', + 'august' => 'août', + 'author' => 'Auteur', + 'auth_form' => 'Formulaire (traditionnel, requiert JavaScript)', + 'auth_form_not_set' => 'Un problème est survenu lors de la configuration de votre système d’authentification. Veuillez réessayer plus tard.', + 'auth_form_set' => 'Le formulaire est désormais votre système d’authentification.', + 'auth_none' => 'Aucune (dangereux)', + 'auth_not_persona' => 'Seul le système d’authentification Persona peut être réinitialisé.', + 'auth_no_password_set' => 'Aucun mot de passe administrateur n’a été précisé. Cette fonctionnalité n’est pas disponible.', + 'auth_persona' => 'Mozilla Persona (moderne, requiert JavaScript)', + 'auth_reset' => 'Réinitialisation de l’authentification', + 'auth_token' => 'Jeton d’identification', + 'auth_type' => 'Méthode d’authentification', + 'auth_will_reset' => 'Le système d’authentification va être réinitialisé : un formulaire sera utilisé à la place de Persona.', + 'auto_load_more' => 'Charger les articles suivants en bas de page', + 'auto_read_when' => 'Marquer un article comme lu…', + 'auto_share' => 'Partager', + 'auto_share_help' => 'S’il n’y a qu’un mode de partage, celui ci est utilisé automatiquement. Sinon ils sont accessibles par leur numéro.', + 'back_to_rss_feeds' => '← Retour à vos flux RSS', + 'bad_opml_file' => 'Votre fichier OPML n’est pas valide.', + 'base_url' => 'Base de l’URL', + 'bdd' => 'Base de données', + 'bdd_configuration' => 'Base de données', + 'bdd_conf_is_ko' => 'Vérifiez les informations d’accès à la base de données.', + 'bdd_conf_is_ok' => 'La configuration de la base de données a été enregistrée.', + 'bdd_type' => 'Type de base de données', + 'before_one_day' => 'Antérieurs à 1 jour', + 'before_one_week' => 'Antérieurs à 1 semaine', + 'before_yesterday' => 'À partir d’avant-hier', + 'blank_to_disable' => 'Laissez vide pour désactiver', + 'blogotext' => 'Blogotext', + 'bookmark' => 'S’abonner (bookmark FreshRSS)', + 'bottom_line' => 'Ligne du bas', + 'bugs_reports' => 'Rapports de bugs', + 'by' => 'par', + 'by_author' => 'Par %s', + 'by_default' => 'Par défaut', + 'by_email' => 'Par courriel', + 'by_feed' => 'par flux', + 'cache_is_ok' => 'Les droits sur le répertoire de cache sont bons', + 'cancel' => 'Annuler', + 'can_not_be_deleted' => 'Ne peut pas être supprimée.', + 'categories' => 'Catégories', + 'categories_management' => 'Gestion des catégories', + 'categories_updated' => 'Les catégories ont été mises à jour.', + 'categorize' => 'Ranger dans une catégorie', + 'category' => 'Catégorie', + 'category_created' => 'La catégorie %s a été créée.', + 'category_deleted' => 'La catégorie a été supprimée.', + 'category_emptied' => 'La catégorie a été vidée.', + 'category_empty' => 'Catégorie vide', + 'category_name_exists' => 'Une catégorie possède déjà ce nom.', + 'category_not_delete_default' => 'Vous ne pouvez pas supprimer la catégorie par défaut !', + 'category_not_exist' => 'Cette catégorie n\'existe pas !', + 'category_no_id' => 'Vous devez préciser l\'id de la catégorie.', + 'category_no_name' => 'Vous devez préciser un nom pour la catégorie.', + 'category_number' => 'Catégorie n°%d', + 'category_updated' => 'La catégorie a été mise à jour.', + 'change_value' => 'Vous devriez changer cette valeur par n’importe quelle autre', + 'checks' => 'Vérifications', + 'choose_language' => 'Choisissez la langue pour FreshRSS', + 'clear_logs' => 'Effacer les logs', + 'collapse_article' => 'Refermer', + 'configuration' => 'Configuration', + 'configuration_updated' => 'La configuration a été mise à jour.', + 'confirm_action' => 'Êtes-vous sûr(e) de vouloir continuer ? Cette action ne peut être annulée !', + 'confirm_action_feed_cat' => 'Êtes-vous sûr(e) de vouloir continuer ? Vous pourriez perdre les favoris et les filtres associés. Cette action ne peut être annulée !', + 'congratulations' => 'Félicitations !', + 'content_width' => 'Largeur du contenu', + 'create' => 'Créer', + 'create_user' => 'Créer un nouvel utilisateur', + 'credits' => 'Crédits', + 'credits_content' => 'Des éléments de design sont issus du projet Bootstrap bien que FreshRSS n’utilise pas ce framework. Les icônes sont issues du projet GNOME. La police Open Sans utilisée a été créée par Steve Matteson. Les favicons sont récupérés grâce au site getFavicon. FreshRSS repose sur Minz, un framework PHP.', + 'css_path_on_website' => 'Sélecteur CSS des articles sur le site d’origine', + 'ctype_is_nok' => 'Il manque une librairie pour la vérification des types de caractères (php-ctype)', + 'ctype_is_ok' => 'Vous disposez du nécessaire pour la vérification des types de caractères (ctype)', + 'curl_is_nok' => 'Vous ne disposez pas de cURL (paquet php5-curl)', + 'curl_is_ok' => 'Vous disposez de cURL dans sa version %s', + 'current_user' => 'Utilisateur actuel', + 'damn' => 'Arf !', + 'data_is_ok' => 'Les droits sur le répertoire de data sont bons', + 'Dec' => '\\d\\é\\c\\e\\m\\b\\r\\e', + 'dec' => 'déc.', + 'december' => 'décembre', + 'default_category' => 'Sans catégorie', + 'default_user' => 'Nom de l’utilisateur par défaut (16 caractères alphanumériques maximum)', + 'default_view' => 'Vue par défaut', + 'delete' => 'Supprimer', + 'delete_articles_every' => 'Supprimer les articles après', + 'diaspora' => 'Diaspora*', + 'display' => 'Affichage', + 'display_articles_unfolded' => 'Afficher les articles dépliés par défaut', + 'display_categories_unfolded' => 'Afficher les catégories pliées par défaut', + 'display_configuration' => 'Affichage', + 'dom_is_nok' => 'Il manque une librairie pour parcourir le DOM (paquet php-xml)', + 'dom_is_ok' => 'Vous disposez du nécessaire pour parcourir le DOM', + 'do_not_change_if_doubt' => 'Laissez tel quel dans le doute', + 'email' => 'Courriel', + 'error_occurred' => 'Une erreur est survenue !', + 'error_occurred_update' => 'Rien n’a été modifié !', + 'explain_token' => 'Permet d’accéder à la sortie RSS de l’utilisateur par défaut sans besoin de s’authentifier.
%s?output=rss&token=%s', + 'export' => 'Exporter', + 'export_no_zip_extension' => 'L’extension Zip n’est pas présente sur votre serveur. Veuillez essayer d’exporter les fichiers un par un.', + 'export_opml' => 'Exporter la liste des flux (OPML)', + 'export_starred' => 'Exporter les favoris', + 'facebook' => 'Facebook', + 'favicons_is_ok' => 'Les droits sur le répertoire des favicons sont bons', + 'favorite_feeds' => 'Favoris (%s)', + 'feb' => 'fév.', + 'Feb' => '\\f\\é\\v\\r\\i\\e\\r', + 'february' => 'février', + 'feed' => 'Flux', + 'feeds' => 'Flux', + 'feeds_actualized' => 'Les flux ont été mis à jour.', + 'feeds_imported' => 'Vos flux ont été importés et vont maintenant être actualisés.', + 'feeds_imported_with_errors' => 'Vos flux ont été importés mais des erreurs sont survenues.', + 'feeds_marked_read' => 'Les flux ont été marqués comme lus.', + 'feeds_moved_category_deleted' => 'Lors de la suppression d’une catégorie, ses flux seront automatiquement classés dans %s.', + 'feed_actualized' => '%s a été mis à jour.', + 'feed_added' => 'Le flux %s a bien été ajouté.', + 'feed_deleted' => 'Le flux a été supprimé.', + 'feed_description' => 'Description', + 'feed_empty' => 'Ce flux est vide. Veuillez vérifier qu’il est toujours maintenu.', + 'feed_in_error' => 'Ce flux a rencontré un problème. Veuillez vérifier qu’il est toujours accessible puis actualisez-le.', + 'feed_list' => 'Liste des articles de %s', + 'feed_not_added' => '%s n’a pas pu être ajouté.', + 'feed_updated' => 'Le flux a été mis à jour.', + 'feed_url' => 'URL du flux', + 'feed_validator' => 'Vérifier la valididé du flux', + 'file_cannot_be_uploaded' => 'Le fichier ne peut pas être téléchargé !', + 'file_is_nok' => 'Veuillez vérifier les droits sur le répertoire %s. Le serveur HTTP doit être capable d’écrire dedans', + 'file_to_import' => 'Fichier à importer
(OPML, Json ou Zip)', + 'file_to_import_no_zip' => 'Fichier à importer
(OPML ou Json)', + 'filter' => 'Filtrer', + 'finish_installation' => 'Terminer l’installation', + 'first' => 'Début', + 'first_article' => 'Passer au premier article', + 'fix_errors_before' => 'Veuillez corriger les erreurs avant de passer à l’étape suivante.', + 'focus_search' => 'Accéder à la recherche', + 'forbidden_access' => 'L’accès vous est interdit !', + 'format_date' => 'j %s Y', + 'format_date_hour' => 'j %s Y \\à H\\:i', + 'freshrss' => 'FreshRSS', + 'freshrss_description' => 'FreshRSS est un agrégateur de flux RSS à auto-héberger à l’image de Kriss Feed ou Leed. Il se veut léger et facile à prendre en main tout en étant un outil puissant et paramétrable.', + 'freshrss_installation' => 'Installation · FreshRSS', + 'fri' => 'ven.', + 'g+' => 'Google+', + 'general_configuration' => 'Configuration générale', + 'general_conf_is_ok' => 'La configuration générale a été enregistrée.', + 'github_or_email' => 'sur Github ou par courriel', + 'global_view' => 'Vue globale', + 'help' => 'Afficher la documentation', + 'hide_read_feeds' => 'Cacher les catégories & flux sans article non-lu (ne fonctionne pas avec la configuration “Afficher tous les articles”)', + 'host' => 'Hôte', + 'html5_notif_timeout' => 'Temps d’affichage de la notification HTML5', + 'http_auth' => 'HTTP (pour utilisateurs avancés avec HTTPS)', + 'http_authentication' => 'Authentification HTTP', + 'http_password' => 'Mot de passe HTTP', + 'http_referer_is_nok' => 'Veuillez vérifier que vous ne modifiez pas votre HTTP REFERER.', + 'http_referer_is_ok' => 'Le HTTP REFERER est connu et semble correspondre à votre serveur.', + 'http_username' => 'Identifiant HTTP', + 'img_with_lazyload' => 'Utiliser le mode “chargement différé” pour les images', + 'import' => 'Importer', + 'import_export' => 'Importer / exporter', + 'informations' => 'Informations', + 'installation_is_ok' => 'L’installation s’est bien passée.
La dernière étape va maintenant tenter de supprimer les fichiers ainsi que d’éventuelles copies de base de données créés durant le processus de mise à jour.
Vous pouvez choisir de sauter cette étape en supprimant ./data/do-install.txt manuellement.', + 'installation_step' => 'Installation — étape %d · FreshRSS', + 'install_not_deleted' => 'Quelque chose s’est mal passé, vous devez supprimer le fichier %s à la main.', + 'internal_problem_feed' => 'Le flux ne peut pas être ajouté. Consulter les logs de FreshRSS pour plus de détails.', + 'invalid_login' => 'L’identifiant est invalide !', + 'invalid_url' => 'L’url %s est invalide.', + 'is_admin' => 'est administrateur', + 'jan' => 'jan.', + 'Jan' => '\\j\\a\\n\\v\\i\\e\\r', + 'january' => 'janvier', + 'javascript_for_shortcuts' => 'Le JavaScript doit être activé pour pouvoir profiter des raccourcis.', + 'javascript_is_better' => 'FreshRSS est plus agréable à utiliser avec JavaScript activé', + 'javascript_should_be_activated' => 'Le JavaScript doit être activé.', + 'Jul' => '\\j\\u\\i\\l\\l\\e\\t', + 'jul' => 'jui.', + 'july' => 'juillet', + 'jump_next' => 'sauter au prochain voisin non lu (flux ou catégorie)', + 'Jun' => '\\j\\u\\i\\n', + 'jun' => 'juin', + 'june' => 'juin', + 'keep_history' => 'Nombre minimum d’articles à conserver', + 'keep_logged_in' => 'Rester connecté (1 mois)', + 'language' => 'Langue', + 'language_defined' => 'La langue a bien été définie.', + 'last' => 'Fin', + 'last_3_month' => 'Depuis les trois derniers mois', + 'last_6_month' => 'Depuis les six derniers mois', + 'last_article' => 'Passer au dernier article', + 'last_month' => 'Depuis le mois dernier', + 'last_week' => 'Depuis la semaine dernière', + 'last_year' => 'Depuis l’année dernière', + 'lead_developer' => 'Développeur principal', + 'license' => 'Licence', + 'load_more' => 'Charger plus d’articles', + 'login' => 'Connexion', + 'login_configuration' => 'Identification', + 'login_persona_problem' => 'Problème de connexion à Persona ?', + 'login_required' => 'Accès protégé par mot de passe :', + 'login_with_persona' => 'Connexion avec Persona', + 'logout' => 'Déconnexion', + 'logs' => 'Logs', + 'logs_empty' => 'Les logs sont vides.', + 'log_is_ok' => 'Les droits sur le répertoire des logs sont bons', + 'main_stream' => 'Flux principal', + 'Mar' => '\\m\\a\\r\\s', + 'mar' => 'mar.', + 'march' => 'mars', + 'mark_all_read' => 'Tout marquer comme lu', + 'mark_cat_read' => 'Marquer la catégorie comme lue', + 'mark_favorite' => 'Mettre en favori', + 'mark_feed_read' => 'Marquer le flux comme lu', + 'mark_read' => 'Marquer comme lu', + 'May' => '\\m\\a\\i', + 'may' => 'mai.', + 'minz_is_nok' => 'Vous ne disposez pas de la librairie Minz. Vous devriez exécuter le script build.sh ou bien la télécharger sur Github et installer dans le répertoire %s le contenu de son répertoire /lib.', + 'minz_is_ok' => 'Vous disposez du framework Minz', + 'mon' => 'lun.', + 'month' => 'mois', + 'more_information' => 'Plus d’informations', + 'newer_first' => 'Plus récents en premier', + 'new_article' => 'Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.', + 'new_category' => 'Nouvelle catégorie', + 'next' => 'Suivant', + 'next_article' => 'Passer à l’article suivant', + 'next_page' => 'Passer à la page suivante', + 'next_step' => 'Passer à l’étape suivante', + 'no' => 'Non', + 'normal_view' => 'Vue normale', + 'nothing_to_load' => 'Fin des articles', + 'notif_body_new_articles' => 'Il y a \\d nouveaux articles à lire sur FreshRSS.', + 'notif_title_new_articles' => 'FreshRSS : nouveaux articles !', + 'not_read' => '%d non lu', + 'not_reads' => '%d non lus', + 'not_yet_implemented' => 'Pas encore implémenté', + 'nov' => 'nov.', + 'Nov' => '\\n\\o\\v\\e\\m\\b\\r\\e', + 'november' => 'novembre', + 'no_feed_actualized' => 'Aucun flux n’a pu être mis à jour.', + 'no_feed_to_display' => 'Il n’y a aucun article à afficher.', + 'no_feed_to_refresh' => 'Il n’y a aucun flux à actualiser…', + 'no_query' => 'Vous n’avez pas encore créé de filtre.', + 'no_query_filter' => 'Aucun filtre appliqué', + 'no_rss_feed' => 'Aucun flux RSS', + 'no_selected_feed' => 'Aucun flux sélectionné.', + 'no_update' => 'Aucune mise à jour à appliquer', + 'no_zip_extension' => 'L’extension Zip n’est pas présente sur votre serveur.', + 'number_articles' => '%d articles', + 'number_divided_when_reader' => 'Divisé par 2 dans la vue de lecture.', + 'number_feeds' => '%d flux', + 'n_entries_deleted' => '%d articles ont été supprimés.', + 'n_feeds_actualized' => '%d flux ont été mis à jour.', + 'oct' => 'oct.', + 'Oct' => '\\o\\c\\t\\o\\b\\r\\e', + 'october' => 'octobre', + 'ok' => 'Ok !', + 'older_first' => 'Plus anciens en premier', + 'oops' => 'Oups !', + 'optimization_complete' => 'Optimisation terminée.', + 'optimize_bdd' => 'Optimiser la base de données', + 'optimize_todo_sometimes' => 'À faire de temps en temps pour réduire la taille de la BDD', + 'or' => 'ou', + 'page_not_found' => 'La page que vous cherchez n’existe pas !', + 'password' => 'Mot de passe', + 'password_api' => 'Mot de passe API
(ex. : pour applis mobiles)', + 'password_form' => 'Mot de passe
(pour connexion par formulaire)', + 'pcre_is_nok' => 'Il manque une librairie pour les expressions régulières (php-pcre)', + 'pcre_is_ok' => 'Vous disposez du nécessaire pour les expressions régulières (PCRE)', + 'pdo_is_nok' => 'Vous ne disposez pas de PDO ou d’un des drivers supportés (pdo_mysql, pdo_sqlite)', + 'pdo_is_ok' => 'Vous disposez de PDO et d’au moins un des drivers supportés (pdo_mysql, pdo_sqlite)', + 'persona_connection_email' => 'Adresse courriel de connexion
(pour Mozilla Persona)', + 'persona_is_ok' => 'Les droits sur le répertoire de Mozilla Persona sont bons', + 'php_is_nok' => 'Votre version de PHP est la %s mais FreshRSS requiert au moins la version %s', + 'php_is_ok' => 'Votre version de PHP est la %s, qui est compatible avec FreshRSS', + 'prefix' => 'Préfixe des tables', + 'previous' => 'Précédent', + 'previous_article' => 'Passer à l’article précédent', + 'previous_page' => 'Passer à la page précédente', + 'print' => 'Imprimer', + 'project_website' => 'Site du projet', + 'public' => 'Public', + 'publication_date' => 'Date de publication', + 'purge_completed' => 'Purge effectuée (%d articles supprimés).', + 'purge_now' => 'Purger maintenant', + 'queries' => 'Filtres utilisateurs', + 'query_created' => 'Le filtre "%s" a bien été créé.', + 'query_deprecated' => 'Ce filtre n’est plus valide. La catégorie ou le flux concerné a été supprimé.', + 'query_filter' => 'Filtres appliqués :', + 'query_get_all' => 'Afficher tous les articles', + 'query_get_category' => 'Afficher la catégorie "%s"', + 'query_get_favorite' => 'Afficher les articles favoris', + 'query_get_feed' => 'Afficher le flux "%s"', + 'query_number' => 'Filtre n°%d', + 'query_order_asc' => 'Afficher les articles les plus anciens en premier', + 'query_order_desc' => 'Afficher les articles les plus récents en premier', + 'query_search' => 'Recherche de "%s"', + 'query_state_0' => 'Afficher tous les articles', + 'query_state_1' => 'Afficher les articles lus', + 'query_state_2' => 'Afficher les articles non lus', + 'query_state_3' => 'Afficher tous les articles', + 'query_state_4' => 'Afficher les articles favoris', + 'query_state_5' => 'Afficher les articles lus et favoris', + 'query_state_6' => 'Afficher les articles non lus et favoris', + 'query_state_7' => 'Afficher les articles favoris', + 'query_state_8' => 'Afficher les articles non favoris', + 'query_state_9' => 'Afficher les articles lus et non favoris', + 'query_state_10' => 'Afficher les articles non lus et non favoris', + 'query_state_11' => 'Afficher les articles non favoris', + 'query_state_12' => 'Afficher tous les articles', + 'query_state_13' => 'Afficher les articles lus', + 'query_state_14' => 'Afficher les articles non lus', + 'query_state_15' => 'Afficher tous les articles', + 'random_string' => 'Chaîne aléatoire', + 'reader_view' => 'Vue lecture', + 'reading_configuration' => 'Lecture', + 'reading_confirm' => 'Afficher une confirmation lors des actions “marquer tout comme lu”', + 'refresh' => 'Actualisation', + 'related_tags' => 'Tags associés', + 'retrieve_truncated_feeds' => 'Permet de récupérer les flux tronqués (attention, demande plus de temps !)', + 'rss_feeds_of' => 'Flux RSS de %s', + 'rss_feed_management' => 'Gestion des flux RSS', + 'rss_view' => 'Flux RSS', + 'sat' => 'sam.', + 'save' => 'Enregistrer', + 'scroll' => 'au défilement de la page', + 'search' => 'Rechercher des mots ou des #tags', + 'search_short' => 'Rechercher', + 'seconds_(0_means_no_timeout)' => 'secondes (0 signifie aucun timeout ) ', + 'see_on_website' => 'Voir sur le site d’origine', + 'see_website' => 'Voir le site', + 'sep' => 'sep.', + 'Sep' => '\\s\\e\\p\\t\\e\\m\\b\\r\\e', + 'september' => 'septembre', + 'shaarli' => 'Shaarli', + 'share' => 'Partager', + 'share_name' => 'Nom du partage à afficher', + 'share_url' => 'URL du partage à utiliser', + 'sharing' => 'Partage', + 'sharing_management' => 'Gestion des options de partage', + 'shift_for_all_read' => '+ shift pour marquer tous les articles comme lus', + 'shortcuts' => 'Raccourcis', + 'shortcuts_article_action' => 'Actions associées à l’article courant', + 'shortcuts_navigation' => 'Navigation', + 'shortcuts_navigation_help' => 'Avec le modificateur "Shift", les raccourcis de navigation s’appliquent aux flux.
Avec le modificateur "Alt", les raccourcis de navigation s’appliquent aux catégories.', + 'shortcuts_other_action' => 'Autres actions', + 'shortcuts_updated' => 'Les raccourcis ont été mis à jour.', + 'show_adaptive' => 'Adapter l’affichage', + 'show_all_articles' => 'Afficher tous les articles', + 'show_favorite' => 'Afficher les favoris', + 'show_in_all_flux' => 'Afficher dans le flux principal', + 'show_not_favorite' => 'Afficher tout sauf les favoris', + 'show_not_reads' => 'Afficher les non lus', + 'show_read' => 'Afficher les lus', + 'sort_order' => 'Ordre de tri', + 'starred_list' => 'Liste des articles favoris', + 'stats' => 'Statistiques', + 'stats_entry_count' => 'Nombre d’articles', + 'stats_entry_per_category' => 'Articles par catégorie', + 'stats_entry_per_day' => 'Nombre d’articles par jour (30 derniers jours)', + 'stats_entry_per_day_of_week' => 'Par jour de la semaine', + 'stats_entry_per_hour' => 'Par heure', + 'stats_entry_per_month' => 'Par mois', + 'stats_entry_repartition' => 'Répartition des articles', + 'stats_feed_per_category' => 'Flux par catégorie', + 'stats_idle' => 'Flux inactifs', + 'stats_main' => 'Statistiques principales', + 'stats_no_idle' => 'Il n’y a aucun flux inactif !', + 'stats_percent_of_total' => '%% du total', + 'stats_repartition' => 'Répartition des articles', + 'stats_top_feed' => 'Les dix plus gros flux', + 'status_favorites' => 'favoris', + 'status_read' => 'lus', + 'status_total' => 'total', + 'status_unread' => 'non lus', + 'steps' => 'Étapes', + 'sticky_post' => 'Aligner l’article en haut quand il est ouvert', + 'submit' => 'Valider', + 'subscription_management' => 'Gestion des abonnements', + 'sun' => 'dim.', + 'theme' => 'Thème', + 'think_to_add' => 'Vous pouvez ajouter des flux.', + 'this_is_the_end' => 'This is the end', + 'thu' => 'jeu.', + 'title' => 'Titre', + 'today' => 'Aujourd’hui', + 'top_line' => 'Ligne du haut', + 'truncate' => 'Supprimer tous les articles', + 'ttl' => 'Ne pas automatiquement rafraîchir plus souvent que', + 'tue' => 'mar.', + 'twitter' => 'Twitter', + 'unsafe_autologin' => 'Autoriser les connexions automatiques non-sûres au format : ', + 'update' => 'Mise à jour', + 'updated' => 'Modifications enregistrées.', + 'update_apply' => 'Appliquer la mise à jour', + 'update_can_apply' => 'Une mise à jour est disponible.', + 'update_check' => 'Vérifier les mises à jour', + 'update_end' => 'La mise à jour est terminée, vous pouvez maintenant passer à l’étape finale.', + 'update_finished' => 'La mise à jour est terminée !', + 'update_last' => 'Dernière vérification : %s', + 'update_long' => 'Ce processus peut prendre longtemps, selon la taille de votre base de données. Vous aurez peut-être à attendre que cette page dépasse son temps maximum d’exécution (~5 minutes) puis à la recharger.', + 'update_problem' => 'La mise à jour a rencontré un problème : %s', + 'update_server_not_found' => 'Le serveur de mise à jour n’a pas été trouvé. [%s]', + 'update_start' => 'Lancer la mise à jour', + 'update_system' => 'Système de mise à jour', + 'upon_reception' => 'dès la réception du nouvel article', + 'username' => 'Nom d’utilisateur', + 'username_admin' => 'Nom d’utilisateur administrateur', + 'users' => 'Utilisateurs', + 'users_list' => 'Liste des utilisateurs', + 'user_created' => 'L’utilisateur %s a été créé.', + 'user_deleted' => 'L’utilisateur %s a été supprimé.', + 'user_filter' => 'Accéder aux filtres utilisateur', + 'user_filter_help' => 'S’il n’y a qu’un filtre utilisateur, celui ci est utilisé automatiquement. Sinon ils sont accessibles par leur numéro.', + 'version' => 'Version', + 'version_update' => 'Mise à jour', + 'wallabag' => 'wallabag', + 'website' => 'Site Internet', + 'website_url' => 'URL du site', + 'wed' => 'mer.', + 'width_large' => 'Large', + 'width_medium' => 'Moyenne', + 'width_no_limit' => 'Pas de limite', + 'width_thin' => 'Fine', + 'yes' => 'Oui', + 'yesterday' => 'Hier', + 'your_diaspora_pod' => 'Votre pod Diaspora*', + 'your_favorites' => 'Vos favoris', + 'your_rss_feeds' => 'Vos flux RSS', + 'your_shaarli' => 'Votre Shaarli', + 'your_wallabag' => 'Votre wallabag', + 'zip_error' => 'Une erreur est survenue durant l’import du fichier Zip.', +); \ No newline at end of file diff --git a/app/i18n/install.en.php b/app/i18n/install.en.php deleted file mode 100644 index c422de90f..000000000 --- a/app/i18n/install.en.php +++ /dev/null @@ -1,69 +0,0 @@ - 'Installation · FreshRSS', - 'freshrss' => 'FreshRSS', - 'installation_step' => 'Installation — step %d · FreshRSS', - 'steps' => 'Steps', - 'checks' => 'Checks', - 'general_configuration' => 'General configuration', - 'bdd_configuration' => 'Database configuration', - 'bdd_type' => 'Type of database', - 'version_update' => 'Update', - 'this_is_the_end' => 'This is the end', - - 'ok' => 'Ok!', - 'congratulations' => 'Congratulations!', - 'attention' => 'Attention!', - 'damn' => 'Damn!', - 'oops' => 'Oops!', - 'next_step' => 'Go to the next step', - - 'language_defined' => 'Language has been defined.', - 'choose_language' => 'Choose a language for FreshRSS', - - 'javascript_is_better' => 'FreshRSS is more pleasant with JavaScript enabled', - 'php_is_ok' => 'Your PHP version is %s, which is compatible with FreshRSS', - 'php_is_nok' => 'Your PHP version is %s but FreshRSS requires at least version %s', - 'minz_is_ok' => 'You have the Minz framework', - 'minz_is_nok' => 'You lack the Minz framework. You should execute build.sh script or download it on Github and install in %s directory the content of its /lib directory.', - 'curl_is_ok' => 'You have version %s of cURL', - 'curl_is_nok' => 'You lack cURL (php5-curl package)', - 'pdo_is_ok' => 'You have PDO and at least one of the supported drivers (pdo_mysql, pdo_sqlite)', - 'pdo_is_nok' => 'You lack PDO or one of the supported drivers (pdo_mysql, pdo_sqlite)', - 'dom_is_ok' => 'You have the required library to browse the DOM', - 'dom_is_nok' => 'You lack a required library to browse the DOM (php-xml package)', - 'pcre_is_ok' => 'You have the required library for regular expressions (PCRE)', - 'pcre_is_nok' => 'You lack a required library for regular expressions (php-pcre)', - 'ctype_is_ok' => 'You have the required library for character type checking (ctype)', - 'ctype_is_nok' => 'You lack a required library for character type checking (php-ctype)', - 'cache_is_ok' => 'Permissions on cache directory are good', - 'log_is_ok' => 'Permissions on logs directory are good', - 'favicons_is_ok' => 'Permissions on favicons directory are good', - 'data_is_ok' => 'Permissions on data directory are good', - 'persona_is_ok' => 'Permissions on Mozilla Persona directory are good', - 'file_is_nok' => 'Check permissions on %s directory. HTTP server must have rights to write into', - 'http_referer_is_ok' => 'Your HTTP REFERER is known and corresponds to your server.', - 'http_referer_is_nok' => 'Please check that you are not altering your HTTP REFERER.', - 'fix_errors_before' => 'Fix errors before skip to the next step.', - - 'general_conf_is_ok' => 'General configuration has been saved.', - 'random_string' => 'Random string', - 'change_value' => 'You should change this value by any other', - 'base_url' => 'Base URL', - 'do_not_change_if_doubt' => 'Don’t change if you doubt about it', - - 'bdd_conf_is_ok' => 'Database configuration has been saved.', - 'bdd_conf_is_ko' => 'Verify your database information.', - 'host' => 'Host', - 'bdd' => 'Database', - 'prefix' => 'Table prefix', - - 'update_start' => 'Start update process', - 'update_long' => 'This can take a long time, depending on the size of your database. You may have to wait for this page to time out (~5 minutes) and then refresh this page.', - 'update_end' => 'Update process is completed, now you can go to the final step.', - - - 'installation_is_ok' => 'The installation process was successful.
The final step will now attempt to delete any file and database backup created during the update process.
You may choose to skip this step by deleting ./data/do-install.txt manually.', - 'finish_installation' => 'Complete installation', - 'install_not_deleted' => 'Something went wrong; you must delete the file %s manually.', -); diff --git a/app/i18n/install.fr.php b/app/i18n/install.fr.php deleted file mode 100644 index 785c02459..000000000 --- a/app/i18n/install.fr.php +++ /dev/null @@ -1,68 +0,0 @@ - 'Installation · FreshRSS', - 'freshrss' => 'FreshRSS', - 'installation_step' => 'Installation — étape %d · FreshRSS', - 'steps' => 'Étapes', - 'checks' => 'Vérifications', - 'general_configuration' => 'Configuration générale', - 'bdd_configuration' => 'Base de données', - 'bdd_type' => 'Type de base de données', - 'version_update' => 'Mise à jour', - 'this_is_the_end' => 'This is the end', - - 'ok' => 'Ok !', - 'congratulations' => 'Félicitations !', - 'attention' => 'Attention !', - 'damn' => 'Arf !', - 'oops' => 'Oups !', - 'next_step' => 'Passer à l’étape suivante', - - 'language_defined' => 'La langue a bien été définie.', - 'choose_language' => 'Choisissez la langue pour FreshRSS', - - 'javascript_is_better' => 'FreshRSS est plus agréable à utiliser avec JavaScript activé', - 'php_is_ok' => 'Votre version de PHP est la %s, qui est compatible avec FreshRSS', - 'php_is_nok' => 'Votre version de PHP est la %s mais FreshRSS requiert au moins la version %s', - 'minz_is_ok' => 'Vous disposez du framework Minz', - 'minz_is_nok' => 'Vous ne disposez pas de la librairie Minz. Vous devriez exécuter le script build.sh ou bien la télécharger sur Github et installer dans le répertoire %s le contenu de son répertoire /lib.', - 'curl_is_ok' => 'Vous disposez de cURL dans sa version %s', - 'curl_is_nok' => 'Vous ne disposez pas de cURL (paquet php5-curl)', - 'pdo_is_ok' => 'Vous disposez de PDO et d’au moins un des drivers supportés (pdo_mysql, pdo_sqlite)', - 'pdo_is_nok' => 'Vous ne disposez pas de PDO ou d’un des drivers supportés (pdo_mysql, pdo_sqlite)', - 'dom_is_ok' => 'Vous disposez du nécessaire pour parcourir le DOM', - 'dom_is_nok' => 'Il manque une librairie pour parcourir le DOM (paquet php-xml)', - 'pcre_is_ok' => 'Vous disposez du nécessaire pour les expressions régulières (PCRE)', - 'pcre_is_nok' => 'Il manque une librairie pour les expressions régulières (php-pcre)', - 'ctype_is_ok' => 'Vous disposez du nécessaire pour la vérification des types de caractères (ctype)', - 'ctype_is_nok' => 'Il manque une librairie pour la vérification des types de caractères (php-ctype)', - 'cache_is_ok' => 'Les droits sur le répertoire de cache sont bons', - 'log_is_ok' => 'Les droits sur le répertoire des logs sont bons', - 'favicons_is_ok' => 'Les droits sur le répertoire des favicons sont bons', - 'data_is_ok' => 'Les droits sur le répertoire de data sont bons', - 'persona_is_ok' => 'Les droits sur le répertoire de Mozilla Persona sont bons', - 'file_is_nok' => 'Veuillez vérifier les droits sur le répertoire %s. Le serveur HTTP doit être capable d’écrire dedans', - 'http_referer_is_ok' => 'Le HTTP REFERER est connu et semble correspondre à votre serveur.', - 'http_referer_is_nok' => 'Veuillez vérifier que vous ne modifiez pas votre HTTP REFERER.', - 'fix_errors_before' => 'Veuillez corriger les erreurs avant de passer à l’étape suivante.', - - 'general_conf_is_ok' => 'La configuration générale a été enregistrée.', - 'random_string' => 'Chaîne aléatoire', - 'change_value' => 'Vous devriez changer cette valeur par n’importe quelle autre', - 'base_url' => 'Base de l’URL', - 'do_not_change_if_doubt' => 'Laissez tel quel dans le doute', - - 'bdd_conf_is_ok' => 'La configuration de la base de données a été enregistrée.', - 'bdd_conf_is_ko' => 'Vérifiez les informations d’accès à la base de données.', - 'host' => 'Hôte', - 'bdd' => 'Base de données', - 'prefix' => 'Préfixe des tables', - - 'update_start' => 'Lancer la mise à jour', - 'update_long' => 'Ce processus peut prendre longtemps, selon la taille de votre base de données. Vous aurez peut-être à attendre que cette page dépasse son temps maximum d’exécution (~5 minutes) puis à la recharger.', - 'update_end' => 'La mise à jour est terminée, vous pouvez maintenant passer à l’étape finale.', - - 'installation_is_ok' => 'L’installation s’est bien passée.
La dernière étape va maintenant tenter de supprimer les fichiers ainsi que d’éventuelles copies de base de données créés durant le processus de mise à jour.
Vous pouvez choisir de sauter cette étape en supprimant ./data/do-install.txt manuellement.', - 'finish_installation' => 'Terminer l’installation', - 'install_not_deleted' => 'Quelque chose s’est mal passé, vous devez supprimer le fichier %s à la main.', -); diff --git a/app/install.php b/app/install.php index 4449cd063..cfdd733ce 100644 --- a/app/install.php +++ b/app/install.php @@ -54,11 +54,6 @@ function initTranslate() { if (file_exists($file)) { $translates = array_merge($translates, include($file)); } - - $file = APP_PATH . '/i18n/install.' . $actual . '.php'; - if (file_exists($file)) { - $translates = array_merge($translates, include($file)); - } } function getBetterLanguage($fallback) { -- cgit v1.2.3 From ddc50090b55cd744e24995c872435a3fed7092da Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Wed, 3 Dec 2014 16:58:12 +0100 Subject: Fix i18n for installation script See https://github.com/FreshRSS/FreshRSS/issues/334 --- app/install.php | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php index cfdd733ce..f54565c73 100644 --- a/app/install.php +++ b/app/install.php @@ -42,18 +42,12 @@ function param($key, $default = false) { // gestion internationalisation -$translates = array(); -$actual = 'en'; function initTranslate() { - global $translates; - global $actual; - - $actual = isset($_SESSION['language']) ? $_SESSION['language'] : getBetterLanguage('en'); - - $file = APP_PATH . '/i18n/' . $actual . '.php'; - if (file_exists($file)) { - $translates = array_merge($translates, include($file)); + if (!isset($_SESSION['language'])) { + $_SESSION['language'] = getBetterLanguage('en'); } + + Minz_Translate::init(); } function getBetterLanguage($fallback) { @@ -75,19 +69,6 @@ function availableLanguages() { ); } -function _t($key) { - global $translates; - $translate = $key; - if (isset($translates[$key])) { - $translate = $translates[$key]; - } - - $args = func_get_args(); - unset($args[0]); - - return vsprintf($translate, $args); -} - /*** SAUVEGARDES ***/ function saveLanguage() { -- cgit v1.2.3 From bf51a8e87569617eca685cdcc1e7194f199b98fa Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Thu, 11 Dec 2014 22:40:07 +0100 Subject: Fix french i18n for install + some fixes French is finished! --- app/Models/CategoryDAO.php | 2 +- app/Models/UserDAO.php | 4 +- app/i18n/fr/conf.php | 1 + app/i18n/fr/gen.php | 92 +-------------------- app/i18n/fr/install.php | 102 ++++++++++++++++++++++- app/i18n/fr/sub.php | 2 + app/install.php | 169 +++++++++++++++++++------------------- app/views/subscription/feed.phtml | 4 +- 8 files changed, 195 insertions(+), 181 deletions(-) (limited to 'app/install.php') diff --git a/app/Models/CategoryDAO.php b/app/Models/CategoryDAO.php index 2e333d2f1..27a558522 100644 --- a/app/Models/CategoryDAO.php +++ b/app/Models/CategoryDAO.php @@ -134,7 +134,7 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo { $def_cat = $this->searchById(1); if ($def_cat == null) { - $cat = new FreshRSS_Category(_t('default_category')); + $cat = new FreshRSS_Category(_t('gen.short.default_category')); $cat->_id(1); $values = array( diff --git a/app/Models/UserDAO.php b/app/Models/UserDAO.php index 60fca71b1..f04ae26bf 100644 --- a/app/Models/UserDAO.php +++ b/app/Models/UserDAO.php @@ -9,7 +9,7 @@ class FreshRSS_UserDAO extends Minz_ModelPdo { $ok = false; if (defined('SQL_CREATE_TABLES')) { //E.g. MySQL - $sql = sprintf(SQL_CREATE_TABLES, $db['prefix'] . $username . '_', _t('default_category')); + $sql = sprintf(SQL_CREATE_TABLES, $db['prefix'] . $username . '_', _t('gen.short.default_category')); $stm = $userPDO->bd->prepare($sql); $ok = $stm && $stm->execute(); } else { //E.g. SQLite @@ -17,7 +17,7 @@ class FreshRSS_UserDAO extends Minz_ModelPdo { if (is_array($SQL_CREATE_TABLES)) { $ok = true; foreach ($SQL_CREATE_TABLES as $instruction) { - $sql = sprintf($instruction, '', _t('default_category')); + $sql = sprintf($instruction, '', _t('gen.short.default_category')); $stm = $userPDO->bd->prepare($sql); $ok &= ($stm && $stm->execute()); } diff --git a/app/i18n/fr/conf.php b/app/i18n/fr/conf.php index 2e3414081..cf2c542e6 100644 --- a/app/i18n/fr/conf.php +++ b/app/i18n/fr/conf.php @@ -143,6 +143,7 @@ return array( 'first_article' => 'Passer au premier article', 'focus_search' => 'Accéder à la recherche', 'help' => 'Afficher la documentation', + 'javascript' => 'Le JavaScript doit être activé pour pouvoir profiter des raccourcis.', 'last_article' => 'Passer au dernier article', 'load_more' => 'Charger plus d’articles', 'mark_read' => 'Marquer comme lu', diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php index 26990b4fe..b2cdd3504 100644 --- a/app/i18n/fr/gen.php +++ b/app/i18n/fr/gen.php @@ -134,100 +134,10 @@ return array( 'by_author' => 'Par %s', 'by_default' => 'Par défaut', 'damn' => 'Arf !', + 'default_category' => 'Sans catégorie', 'no' => 'Non', 'ok' => 'Ok !', - 'oops' => 'Oups !', 'or' => 'ou', 'yes' => 'Oui', ), - - 'activate_sharing' => 'Activer le partage', - 'article' => 'Article', - 'article_published_on' => 'Article publié initialement sur %s', - 'article_published_on_author' => 'Article publié initialement sur %s par %s', - 'articles' => 'articles', - 'author' => 'Auteur', - 'bad_opml_file' => 'Votre fichier OPML n’est pas valide.', - 'base_url' => 'Base de l’URL', - 'bdd' => 'Base de données', - 'bdd_conf_is_ko' => 'Vérifiez les informations d’accès à la base de données.', - 'bdd_conf_is_ok' => 'La configuration de la base de données a été enregistrée.', - 'bdd_configuration' => 'Base de données', - 'bdd_type' => 'Type de base de données', - 'by_email' => 'Par courriel', - 'by_feed' => 'par flux', - 'cache_is_ok' => 'Les droits sur le répertoire de cache sont bons', - 'can_not_be_deleted' => 'Ne peut pas être supprimée.', - 'categories' => 'Catégories', - 'categories_management' => 'Gestion des catégories', - 'categories_updated' => 'Les catégories ont été mises à jour.', - 'categorize' => 'Ranger dans une catégorie', - 'category_number' => 'Catégorie n°%d', - 'change_value' => 'Vous devriez changer cette valeur par n’importe quelle autre', - 'checks' => 'Vérifications', - 'choose_language' => 'Choisissez la langue pour FreshRSS', - 'congratulations' => 'Félicitations !', - 'ctype_is_nok' => 'Il manque une librairie pour la vérification des types de caractères (php-ctype)', - 'ctype_is_ok' => 'Vous disposez du nécessaire pour la vérification des types de caractères (ctype)', - 'curl_is_nok' => 'Vous ne disposez pas de cURL (paquet php5-curl)', - 'curl_is_ok' => 'Vous disposez de cURL dans sa version %s', - 'data_is_ok' => 'Les droits sur le répertoire de data sont bons', - 'default_category' => 'Sans catégorie', - 'default_user' => 'Nom de l’utilisateur par défaut (16 caractères alphanumériques maximum)', - 'display' => 'Affichage', - 'do_not_change_if_doubt' => 'Laissez tel quel dans le doute', - 'dom_is_nok' => 'Il manque une librairie pour parcourir le DOM (paquet php-xml)', - 'dom_is_ok' => 'Vous disposez du nécessaire pour parcourir le DOM', - 'favicons_is_ok' => 'Les droits sur le répertoire des favicons sont bons', - 'feed' => 'Flux', - 'feeds' => 'Flux', - 'finish_installation' => 'Terminer l’installation', - 'fix_errors_before' => 'Veuillez corriger les erreurs avant de passer à l’étape suivante.', - 'freshrss_installation' => 'Installation · FreshRSS', - 'general_conf_is_ok' => 'La configuration générale a été enregistrée.', - 'general_configuration' => 'Configuration générale', - 'host' => 'Hôte', - 'http_referer_is_nok' => 'Veuillez vérifier que vous ne modifiez pas votre HTTP REFERER.', - 'http_referer_is_ok' => 'Le HTTP REFERER est connu et semble correspondre à votre serveur.', - 'install_not_deleted' => 'Quelque chose s’est mal passé, vous devez supprimer le fichier %s à la main.', - 'installation_is_ok' => 'L’installation s’est bien passée.
La dernière étape va maintenant tenter de supprimer les fichiers ainsi que d’éventuelles copies de base de données créés durant le processus de mise à jour.
Vous pouvez choisir de sauter cette étape en supprimant ./data/do-install.txt manuellement.', - 'installation_step' => 'Installation — étape %d · FreshRSS', - 'javascript_for_shortcuts' => 'Le JavaScript doit être activé pour pouvoir profiter des raccourcis.', - 'javascript_is_better' => 'FreshRSS est plus agréable à utiliser avec JavaScript activé', - 'language_defined' => 'La langue a bien été définie.', - 'log_is_ok' => 'Les droits sur le répertoire des logs sont bons', - 'login_required' => 'Accès protégé par mot de passe :', - 'minz_is_nok' => 'Vous ne disposez pas de la librairie Minz. Vous devriez exécuter le script build.sh ou bien la télécharger sur Github et installer dans le répertoire %s le contenu de son répertoire /lib.', - 'minz_is_ok' => 'Vous disposez du framework Minz', - 'next_page' => 'Passer à la page suivante', - 'next_step' => 'Passer à l’étape suivante', - 'no_feed_actualized' => 'Aucun flux n’a pu être mis à jour.', - 'no_rss_feed' => 'Aucun flux RSS', - 'no_selected_feed' => 'Aucun flux sélectionné.', - 'not_read' => '%d non lu', - 'not_reads' => '%d non lus', - 'not_yet_implemented' => 'Pas encore implémenté', - 'number_feeds' => '%d flux', - 'pcre_is_nok' => 'Il manque une librairie pour les expressions régulières (php-pcre)', - 'pcre_is_ok' => 'Vous disposez du nécessaire pour les expressions régulières (PCRE)', - 'pdo_is_nok' => 'Vous ne disposez pas de PDO ou d’un des drivers supportés (pdo_mysql, pdo_sqlite)', - 'pdo_is_ok' => 'Vous disposez de PDO et d’au moins un des drivers supportés (pdo_mysql, pdo_sqlite)', - 'persona_is_ok' => 'Les droits sur le répertoire de Mozilla Persona sont bons', - 'php_is_nok' => 'Votre version de PHP est la %s mais FreshRSS requiert au moins la version %s', - 'php_is_ok' => 'Votre version de PHP est la %s, qui est compatible avec FreshRSS', - 'prefix' => 'Préfixe des tables', - 'previous_page' => 'Passer à la page précédente', - 'public' => 'Public', - 'random_string' => 'Chaîne aléatoire', - 'sharing_management' => 'Gestion des options de partage', - 'steps' => 'Étapes', - 'this_is_the_end' => 'This is the end', - 'update_end' => 'La mise à jour est terminée, vous pouvez maintenant passer à l’étape finale.', - 'update_long' => 'Ce processus peut prendre longtemps, selon la taille de votre base de données. Vous aurez peut-être à attendre que cette page dépasse son temps maximum d’exécution (~5 minutes) puis à la recharger.', - 'update_start' => 'Lancer la mise à jour', - 'updated' => 'Modifications enregistrées.', - 'version_update' => 'Mise à jour', - 'your_diaspora_pod' => 'Votre pod Diaspora*', - 'your_shaarli' => 'Votre Shaarli', - 'your_wallabag' => 'Votre wallabag', ); diff --git a/app/i18n/fr/install.php b/app/i18n/fr/install.php index afca37ed3..738b1c084 100644 --- a/app/i18n/fr/install.php +++ b/app/i18n/fr/install.php @@ -1,5 +1,105 @@ array( + 'finish' => 'Terminer l’installation', + 'next_step' => 'Passer à l’étape suivante', + ), + 'auth' => array( + 'email_persona' => 'Adresse courriel de connexion
(pour Mozilla Persona)', + 'form' => 'Formulaire (traditionnel, requiert JavaScript)', + 'http' => 'HTTP (pour utilisateurs avancés avec HTTPS)', + 'none' => 'Aucune (dangereux)', + 'password_form' => 'Mot de passe
(pour connexion par formulaire)', + 'persona' => 'Mozilla Persona (moderne, requiert JavaScript)', + 'type' => 'Méthode d’authentification', + ), + 'bdd' => array( + '_' => 'Base de données', + 'conf' => array( + '_' => 'Base de données', + 'ko' => 'Vérifiez les informations d’accès à la base de données.', + 'ok' => 'La configuration de la base de données a été enregistrée.', + ), + 'host' => 'Hôte', + 'password' => 'Mot de passe', + 'prefix' => 'Préfixe des tables', + 'type' => 'Type de base de données', + 'username' => 'Nom d’utilisateur', + ), + 'check' => array( + '_' => 'Vérifications', + 'cache' => array( + 'nok' => 'Veuillez vérifier les droits sur le répertoire ./data/cache. Le serveur HTTP doit être capable d’écrire dedans', + 'ok' => 'Les droits sur le répertoire de cache sont bons.', + ), + 'ctype' => array( + 'nok' => 'Il manque une librairie pour la vérification des types de caractères (php-ctype).', + 'ok' => 'Vous disposez du nécessaire pour la vérification des types de caractères (ctype).', + ), + 'curl' => array( + 'nok' => 'Vous ne disposez pas de cURL (paquet php5-curl).', + 'ok' => 'Vous disposez de cURL.', + ), + 'data' => array( + 'nok' => 'Veuillez vérifier les droits sur le répertoire ./data. Le serveur HTTP doit être capable d’écrire dedans', + 'ok' => 'Les droits sur le répertoire de data sont bons.', + ), + 'dom' => array( + 'nok' => 'Il manque une librairie pour parcourir le DOM (paquet php-xml).', + 'ok' => 'Vous disposez du nécessaire pour parcourir le DOM.', + ), + 'favicons' => array( + 'nok' => 'Veuillez vérifier les droits sur le répertoire ./data/favicons. Le serveur HTTP doit être capable d’écrire dedans', + 'ok' => 'Les droits sur le répertoire des favicons sont bons.', + ), + 'http_referer' => array( + 'nok' => 'Veuillez vérifier que vous ne modifiez pas votre HTTP REFERER.', + 'ok' => 'Le HTTP REFERER est connu et semble correspondre à votre serveur.', + ), + 'logs' => array( + 'nok' => 'Veuillez vérifier les droits sur le répertoire ./data/logs. Le serveur HTTP doit être capable d’écrire dedans', + 'ok' => 'Les droits sur le répertoire des logs sont bons.', + ), + 'minz' => array( + 'nok' => 'Vous ne disposez pas de la librairie Minz.', + 'ok' => 'Vous disposez du framework Minz', + ), + 'pcre' => array( + 'nok' => 'Il manque une librairie pour les expressions régulières (php-pcre).', + 'ok' => 'Vous disposez du nécessaire pour les expressions régulières (PCRE).', + ), + 'pdo' => array( + 'nok' => 'Vous ne disposez pas de PDO ou d’un des drivers supportés (pdo_mysql, pdo_sqlite).', + 'ok' => 'Vous disposez de PDO et d’au moins un des drivers supportés (pdo_mysql, pdo_sqlite).', + ), + 'persona' => array( + 'nok' => 'Veuillez vérifier les droits sur le répertoire ./data/persona. Le serveur HTTP doit être capable d’écrire dedans', + 'ok' => 'Les droits sur le répertoire de Mozilla Persona sont bons.', + ), + 'php' => array( + 'nok' => 'Votre version de PHP est la %s mais FreshRSS requiert au moins la version %s.', + 'ok' => 'Votre version de PHP est la %s, qui est compatible avec FreshRSS.', + ), + ), + 'conf' => array( + '_' => 'Configuration générale', + 'ok' => 'La configuration générale a été enregistrée.', + ), + 'congratulations' => 'Félicitations !', + 'default_user' => 'Nom de l’utilisateur par défaut (16 caractères alphanumériques maximum)', + 'delete_articles_after' => 'Supprimer les articles après', + 'fix_errors_before' => 'Veuillez corriger les erreurs avant de passer à l’étape suivante.', + 'javascript_is_better' => 'FreshRSS est plus agréable à utiliser avec JavaScript activé', + 'language' => array( + '_' => 'Langue', + 'choose' => 'Choisissez la langue pour FreshRSS', + 'defined' => 'La langue a bien été définie.', + ), + 'ok' => 'L’installation s’est bien passée.', + 'not_deleted' => 'Quelque chose s’est mal passé, vous devez supprimer le fichier %s à la main.', + 'step' => 'étape %d', + 'steps' => 'Étapes', + 'title' => 'Installation · FreshRSS', + 'this_is_the_end' => 'This is the end', ); diff --git a/app/i18n/fr/sub.php b/app/i18n/fr/sub.php index b9d9f4bc2..a3f7c4d6d 100644 --- a/app/i18n/fr/sub.php +++ b/app/i18n/fr/sub.php @@ -27,8 +27,10 @@ return array( 'informations' => 'Informations', 'keep_history' => 'Nombre minimum d’articles à conserver', 'moved_category_deleted' => 'Lors de la suppression d’une catégorie, ses flux seront automatiquement classés dans %s.', + 'no_selected' => 'Aucun flux sélectionné.', 'number_entries' => '%d articles', 'stats' => 'Statistiques', + 'think_to_add' => 'Vous pouvez ajouter des flux.', 'title' => 'Titre', 'title_add' => 'Ajouter un flux RSS', 'ttl' => 'Ne pas automatiquement rafraîchir plus souvent que', diff --git a/app/install.php b/app/install.php index f54565c73..fcdf8d604 100644 --- a/app/install.php +++ b/app/install.php @@ -85,7 +85,7 @@ function saveLanguage() { function saveStep2() { if (!empty($_POST)) { - $_SESSION['title'] = substr(trim(param('title', _t('freshrss'))), 0, 25); + $_SESSION['title'] = substr(trim(param('title', _t('gen.freshrss'))), 0, 25); $_SESSION['old_entries'] = param('old_entries', 3); $_SESSION['auth_type'] = param('auth_type', 'form'); $_SESSION['default_user'] = substr(preg_replace('/[^a-zA-Z0-9]/', '', param('default_user', '')), 0, 16); @@ -394,7 +394,7 @@ function checkBD() { $c = new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options); if (defined('SQL_CREATE_TABLES')) { - $sql = sprintf(SQL_CREATE_TABLES, $_SESSION['bd_prefix_user'], _t('default_category')); + $sql = sprintf(SQL_CREATE_TABLES, $_SESSION['bd_prefix_user'], _t('gen.short.default_category')); $stm = $c->prepare($sql); $ok = $stm->execute(); } else { @@ -402,7 +402,7 @@ function checkBD() { if (is_array($SQL_CREATE_TABLES)) { $ok = true; foreach ($SQL_CREATE_TABLES as $instruction) { - $sql = sprintf($instruction, $_SESSION['bd_prefix_user'], _t('default_category')); + $sql = sprintf($instruction, $_SESSION['bd_prefix_user'], _t('gen.short.default_category')); $stm = $c->prepare($sql); $ok &= $stm->execute(); } @@ -425,13 +425,13 @@ function printStep0() { global $actual; ?> -

+

- +
- +
+
- +
- +
- +
- +
- +
- +
/>
- +
- +
/> - +
@@ -663,10 +664,10 @@ function printStep2() {
- - + + - +
@@ -677,15 +678,15 @@ function printStep2() { function printStep3() { ?> -

+

-

+

- +
- +
- +
- +
- +
- +
- +
@@ -749,10 +750,10 @@ function printStep3() {
- - + + - +
@@ -762,14 +763,14 @@ function printStep3() { function printStep4() { ?> -

- +

+ -

+

- <?php echo _t('freshrss_installation'); ?> + <?php echo _t('install.title'); ?> @@ -810,19 +811,19 @@ case 5:
-

-

+

+

diff --git a/app/views/subscription/feed.phtml b/app/views/subscription/feed.phtml index 48a401c4a..60664fdee 100644 --- a/app/views/subscription/feed.phtml +++ b/app/views/subscription/feed.phtml @@ -9,7 +9,7 @@ if ($this->feed) { } else { ?>
- - + +
-- cgit v1.2.3 From a34503a7aba67028c12a4db23fe101c3e927a53e Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Thu, 11 Dec 2014 22:42:20 +0100 Subject: Fix i1_n keys in install script --- app/install.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php index fcdf8d604..8091a9eb0 100644 --- a/app/install.php +++ b/app/install.php @@ -678,13 +678,13 @@ function printStep2() { function printStep3() { ?> -

+

-

+

- +
-- cgit v1.2.3 From 039a83759d41615aaa593fa62deff4c25fc126a2 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Sun, 28 Dec 2014 17:42:46 +0100 Subject: Fix install.php to consider new data organization - Introduce USERS_PATH - Remove LOG_PATH - Use join_path in install.php - Change references to old data files to the new ones - Update i18n See https://github.com/FreshRSS/FreshRSS/issues/729 --- app/i18n/en/install.php | 9 +++++---- app/i18n/fr/install.php | 9 +++++---- app/install.php | 49 +++++++++++++++++++++++++++---------------------- constants.php | 2 +- 4 files changed, 38 insertions(+), 31 deletions(-) (limited to 'app/install.php') diff --git a/app/i18n/en/install.php b/app/i18n/en/install.php index ed3210190..e8073e8b6 100644 --- a/app/i18n/en/install.php +++ b/app/i18n/en/install.php @@ -3,6 +3,7 @@ return array( 'action' => array( 'finish' => 'Complete installation', + 'fix_errors_before' => 'Fix errors before skip to the next step.', 'next_step' => 'Go to the next step', ), 'auth' => array( @@ -57,10 +58,6 @@ return array( 'nok' => 'Please check that you are not altering your HTTP REFERER.', 'ok' => 'Your HTTP REFERER is known and corresponds to your server.', ), - 'logs' => array( - 'nok' => 'Check permissions on ./data/logs directory. HTTP server must have rights to write into', - 'ok' => 'Permissions on logs directory are good.', - ), 'minz' => array( 'nok' => 'You lack the Minz framework.', 'ok' => 'You have the Minz framework.', @@ -81,6 +78,10 @@ return array( 'nok' => 'Your PHP version is %s but FreshRSS requires at least version %s.', 'ok' => 'Your PHP version is %s, which is compatible with FreshRSS.', ), + 'users' => array( + 'nok' => 'Check permissions on ./data/users directory. HTTP server must have rights to write into', + 'ok' => 'Permissions on users directory are good.', + ), ), 'conf' => array( '_' => 'General configuration', diff --git a/app/i18n/fr/install.php b/app/i18n/fr/install.php index f1ef2ea3f..d1b78ffb6 100644 --- a/app/i18n/fr/install.php +++ b/app/i18n/fr/install.php @@ -3,6 +3,7 @@ return array( 'action' => array( 'finish' => 'Terminer l’installation', + 'fix_errors_before' => 'Veuillez corriger les erreurs avant de passer à l’étape suivante.', 'next_step' => 'Passer à l’étape suivante', ), 'auth' => array( @@ -57,10 +58,6 @@ return array( 'nok' => 'Veuillez vérifier que vous ne modifiez pas votre HTTP REFERER.', 'ok' => 'Le HTTP REFERER est connu et semble correspondre à votre serveur.', ), - 'logs' => array( - 'nok' => 'Veuillez vérifier les droits sur le répertoire ./data/logs. Le serveur HTTP doit être capable d’écrire dedans', - 'ok' => 'Les droits sur le répertoire des logs sont bons.', - ), 'minz' => array( 'nok' => 'Vous ne disposez pas de la librairie Minz.', 'ok' => 'Vous disposez du framework Minz', @@ -81,6 +78,10 @@ return array( 'nok' => 'Votre version de PHP est la %s mais FreshRSS requiert au moins la version %s.', 'ok' => 'Votre version de PHP est la %s, qui est compatible avec FreshRSS.', ), + 'users' => array( + 'nok' => 'Veuillez vérifier les droits sur le répertoire ./data/users. Le serveur HTTP doit être capable d’écrire dedans', + 'ok' => 'Les droits sur le répertoire des utilisateurs sont bons.', + ), ), 'conf' => array( '_' => 'Configuration générale', diff --git a/app/install.php b/app/install.php index 8091a9eb0..8b65fbb6f 100644 --- a/app/install.php +++ b/app/install.php @@ -132,12 +132,17 @@ function saveStep2() { 'token' => $token, ); - $configPath = DATA_PATH . '/' . $_SESSION['default_user'] . '_user.php'; - @unlink($configPath); //To avoid access-rights problems - file_put_contents($configPath, " PDO::ERRMODE_EXCEPTION, ); @@ -229,7 +234,7 @@ function newPdo() { } function deleteInstall() { - $res = unlink(DATA_PATH . '/do-install.txt'); + $res = unlink(join_path(DATA_PATH, 'do-install.txt')); if (!$res) { return false; @@ -270,7 +275,7 @@ function checkStep0() { function checkStep1() { $php = version_compare(PHP_VERSION, '5.2.1') >= 0; - $minz = file_exists(LIB_PATH . '/Minz'); + $minz = file_exists(join_path(LIB_PATH, 'Minz')); $curl = extension_loaded('curl'); $pdo_mysql = extension_loaded('pdo_mysql'); $pdo_sqlite = extension_loaded('pdo_sqlite'); @@ -280,9 +285,9 @@ function checkStep1() { $dom = class_exists('DOMDocument'); $data = DATA_PATH && is_writable(DATA_PATH); $cache = CACHE_PATH && is_writable(CACHE_PATH); - $log = LOG_PATH && is_writable(LOG_PATH); - $favicons = is_writable(DATA_PATH . '/favicons'); - $persona = is_writable(DATA_PATH . '/persona'); + $users = USERS_PATH && is_writable(USERS_PATH); + $favicons = is_writable(join_path(DATA_PATH, 'favicons')); + $persona = is_writable(join_path(DATA_PATH, 'persona')); $http_referer = is_referer_from_same_domain(); return array( @@ -297,12 +302,12 @@ function checkStep1() { 'dom' => $dom ? 'ok' : 'ko', 'data' => $data ? 'ok' : 'ko', 'cache' => $cache ? 'ok' : 'ko', - 'log' => $log ? 'ok' : 'ko', + 'users' => $users ? 'ok' : 'ko', 'favicons' => $favicons ? 'ok' : 'ko', 'persona' => $persona ? 'ok' : 'ko', 'http_referer' => $http_referer ? 'ok' : 'ko', 'all' => $php && $minz && $curl && $pdo && $pcre && $ctype && $dom && - $data && $cache && $log && $favicons && $persona && $http_referer ? + $data && $cache && $users && $favicons && $persona && $http_referer ? 'ok' : 'ko' ); } @@ -327,7 +332,7 @@ function checkStep2() { if ($defaultUser === null) { $defaultUser = empty($_SESSION['default_user']) ? '' : $_SESSION['default_user']; } - $data = is_writable(DATA_PATH . '/' . $defaultUser . '_user.php'); + $data = is_writable(join_path(USERS_PATH, $defaultUser, 'config.php')); return array( 'conf' => $conf ? 'ok' : 'ko', @@ -339,7 +344,7 @@ function checkStep2() { } function checkStep3() { - $conf = is_writable(DATA_PATH . '/config.php'); + $conf = is_writable(join_path(DATA_PATH, 'config.php')); $bd = isset($_SESSION['bd_type']) && isset($_SESSION['bd_host']) && @@ -382,7 +387,7 @@ function checkBD() { $str = 'mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_base']; break; case 'sqlite': - $str = 'sqlite:' . DATA_PATH . '/' . $_SESSION['default_user'] . '.sqlite'; + $str = 'sqlite:' . join_path(USERS_PATH, $_SESSION['default_user'], 'db.sqlite'); $driver_options = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ); @@ -414,7 +419,7 @@ function checkBD() { } if (!$ok) { - @unlink(DATA_PATH . '/config.php'); + @unlink(join_path(DATA_PATH, 'config.php')); } return $ok; @@ -470,7 +475,7 @@ function printStep1() {

-

+

@@ -516,10 +521,10 @@ function printStep1() {

- -

+ +

-

+

diff --git a/constants.php b/constants.php index f66a012b0..07dd6f18e 100644 --- a/constants.php +++ b/constants.php @@ -16,7 +16,7 @@ define('FRESHRSS_PATH', dirname(__FILE__)); define('DATA_PATH', FRESHRSS_PATH . '/data'); define('UPDATE_FILENAME', DATA_PATH . '/update.php'); - define('LOG_PATH', DATA_PATH . '/log'); + define('USERS_PATH', DATA_PATH . '/users'); define('CACHE_PATH', DATA_PATH . '/cache'); define('LIB_PATH', FRESHRSS_PATH . '/lib'); -- cgit v1.2.3 From 59abb0c7540369e59b9b81caa867fc7b70c52667 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Thu, 8 Jan 2015 12:12:41 +0100 Subject: Fix i18n in install.php --- app/install.php | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php index 8b65fbb6f..a2c12e79f 100644 --- a/app/install.php +++ b/app/install.php @@ -43,30 +43,29 @@ function param($key, $default = false) { // gestion internationalisation function initTranslate() { + $available_languages = array( + 'en' => 'English', + 'fr' => 'Français' + ); + if (!isset($_SESSION['language'])) { - $_SESSION['language'] = getBetterLanguage('en'); + $best = get_best_language(); + if (!isset($available_languages[$best])) { + $best = 'en'; + } + + $_SESSION['language'] = $best; } - Minz_Translate::init(); + Minz_Translate::init(array( + 'en' => 'English', + 'fr' => 'Français', + ), $_SESSION['language']); } -function getBetterLanguage($fallback) { - $available = availableLanguages(); +function get_best_language() { $accept = $_SERVER['HTTP_ACCEPT_LANGUAGE']; - $language = strtolower(substr($accept, 0, 2)); - - if (isset($available[$language])) { - return $language; - } else { - return $fallback; - } -} - -function availableLanguages() { - return array( - 'en' => 'English', - 'fr' => 'Français' - ); + return strtolower(substr($accept, 0, 2)); } @@ -263,7 +262,7 @@ function checkStep() { } function checkStep0() { - $languages = availableLanguages(); + $languages = Minz_Translate::availableLanguages(); $language = isset($_SESSION['language']) && isset($languages[$_SESSION['language']]); @@ -427,7 +426,8 @@ function checkBD() { /*** AFFICHAGE ***/ function printStep0() { - global $actual; + $actual = Minz_Translate::language(); + $languages = Minz_Translate::availableLanguages(); ?>

@@ -439,7 +439,6 @@ function printStep0() {
- $lib) { ?> - + +
diff --git a/lib/Minz/Translate.php b/lib/Minz/Translate.php index a90af659e..24497a193 100644 --- a/lib/Minz/Translate.php +++ b/lib/Minz/Translate.php @@ -49,7 +49,7 @@ class Minz_Translate { self::$lang_name = $lang_name; self::$lang_files = array(); self::$translates = array(); - foreach ($path_list as $path) { + foreach (self::$path_list as $path) { self::loadLang($path); } } -- cgit v1.2.3 From 2d1cb016abb1ad2e5c9a875c649a702480f97b1b Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Tue, 13 Jan 2015 11:16:13 +0100 Subject: Fix user interaction with showing password feature Before, the password was hidden again after 2 seconds. Now, the password is hidden when the mouse is released Fix https://github.com/FreshRSS/FreshRSS/issues/734 --- app/install.php | 17 ++++++++++------- app/views/user/manage.phtml | 2 +- app/views/user/profile.phtml | 4 ++-- p/scripts/main.js | 15 ++++++++------- 4 files changed, 21 insertions(+), 17 deletions(-) (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php index a79b0d318..eb2f764f9 100644 --- a/app/install.php +++ b/app/install.php @@ -611,23 +611,26 @@ function printStep2() {
-- cgit v1.2.3 From 217c191a1ba3ac03b847d261a32e19975380fcad Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Mon, 11 May 2015 22:42:41 +0200 Subject: More SQLite compatibility Additional changes to add compatibility with SQLite for the new hash/lastSeen mode of updating articles. --- app/Models/EntryDAO.php | 71 ++++++++++++++++++++++++------------------ app/Models/EntryDAOSQLite.php | 15 +++++++++ app/Models/FeedDAO.php | 11 ++++--- app/SQL/install.sql.mysql.php | 2 +- app/SQL/install.sql.sqlite.php | 2 +- app/install.php | 2 ++ lib/Minz/ModelPdo.php | 5 +++ 7 files changed, 70 insertions(+), 38 deletions(-) (limited to 'app/install.php') diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php index 172eac897..eae9683ad 100644 --- a/app/Models/EntryDAO.php +++ b/app/Models/EntryDAO.php @@ -6,38 +6,48 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { return parent::$sharedDbType !== 'sqlite'; } - protected function autoAddColumn($errorInfo) { - if (isset($errorInfo[0])) { - if ($errorInfo[0] == '42S22') { //ER_BAD_FIELD_ERROR - $hasTransaction = false; - try { - $stm = null; - if (stripos($errorInfo[2], 'lastSeen') !== false) { //v1.2 - if (!$this->bd->inTransaction()) { - $this->bd->beginTransaction(); - $hasTransaction = true; - } - $stm = $this->bd->prepare('ALTER TABLE `' . $this->prefix . 'entry` ADD COLUMN lastSeen INT(11) NOT NULL'); - if ($stm && $stm->execute()) { - $stm = $this->bd->prepare('CREATE INDEX entry_lastSeen_index ON `' . $this->prefix . 'entry`(`lastSeen`);'); //"IF NOT EXISTS" does not exist in MySQL 5.7 - if ($stm && $stm->execute()) { - if ($hasTransaction) { - $this->bd->commit(); - } - return true; - } - } + protected function addColumn($name) { + Minz_Log::debug('FreshRSS_EntryDAO::autoAddColumn: ' . $name); + $hasTransaction = false; + try { + $stm = null; + if ($name === 'lastSeen') { //v1.2 + if (!$this->bd->inTransaction()) { + $this->bd->beginTransaction(); + $hasTransaction = true; + } + $stm = $this->bd->prepare('ALTER TABLE `' . $this->prefix . 'entry` ADD COLUMN lastSeen INT(11) DEFAULT 0'); + if ($stm && $stm->execute()) { + $stm = $this->bd->prepare('CREATE INDEX entry_lastSeen_index ON `' . $this->prefix . 'entry`(`lastSeen`);'); //"IF NOT EXISTS" does not exist in MySQL 5.7 + if ($stm && $stm->execute()) { if ($hasTransaction) { - $this->bd->rollBack(); + $this->bd->commit(); } - } elseif (stripos($errorInfo[2], 'hash') !== false) { //v1.2 - $stm = $this->bd->prepare('ALTER TABLE `' . $this->prefix . 'entry` ADD COLUMN hash BINARY(16) NOT NULL'); - return $stm && $stm->execute(); + return true; } - } catch (Exception $e) { - Minz_Log::debug('FreshRSS_EntryDAO::autoAddColumn error: ' . $e->getMessage()); - if ($hasTransaction) { - $this->bd->rollBack(); + } + if ($hasTransaction) { + $this->bd->rollBack(); + } + } elseif ($name === 'hash') { //v1.2 + $stm = $this->bd->prepare('ALTER TABLE `' . $this->prefix . 'entry` ADD COLUMN hash BINARY(16)'); + return $stm && $stm->execute(); + } + } catch (Exception $e) { + Minz_Log::debug('FreshRSS_EntryDAO::autoAddColumn error: ' . $e->getMessage()); + if ($hasTransaction) { + $this->bd->rollBack(); + } + } + return false; + } + + protected function autoAddColumn($errorInfo) { + if (isset($errorInfo[0])) { + if ($errorInfo[0] == '42S22') { //ER_BAD_FIELD_ERROR + foreach (array('lastSeen', 'hash') as $column) { + if (stripos($errorInfo[2], $column) !== false) { + return $this->addColumn($column); } } } @@ -82,7 +92,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { return $this->addEntry($valuesTmp); } elseif ((int)($info[0] / 1000) !== 23) { //Filter out "SQLSTATE Class code 23: Constraint Violation" because of expected duplicate entries Minz_Log::error('SQL error addEntry: ' . $info[0] . ': ' . $info[1] . ' ' . $info[2] - . ' while adding entry in feed ' . $valuesTmp['id_feed'] . ' with title: ' . $valuesTmp['title']); + . ' while adding entry in feed ' . $valuesTmp['id_feed'] . ' with title: ' . $valuesTmp['title']. ' ' . $this->addEntryPrepared); } return false; } @@ -597,7 +607,6 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { } return $result; } else { - $info = $stm == null ? array(0 => '', 1 => '', 2 => 'syntax error') : $stm->errorInfo(); if ($this->autoAddColumn($info)) { return $this->listHashForFeedGuids($id_feed, $guids); diff --git a/app/Models/EntryDAOSQLite.php b/app/Models/EntryDAOSQLite.php index ffe0f037c..ff049d813 100644 --- a/app/Models/EntryDAOSQLite.php +++ b/app/Models/EntryDAOSQLite.php @@ -2,6 +2,21 @@ class FreshRSS_EntryDAOSQLite extends FreshRSS_EntryDAO { + protected function autoAddColumn($errorInfo) { + if (empty($errorInfo[0]) || $errorInfo[0] == '42S22') { //ER_BAD_FIELD_ERROR + if ($tableInfo = $this->bd->query("SELECT sql FROM sqlite_master where name='entry'")) { + $showCreate = $tableInfo->fetchColumn(); + Minz_Log::debug('FreshRSS_EntryDAOSQLite::autoAddColumn: ' . $showCreate); + foreach (array('lastSeen', 'hash') as $column) { + if (stripos($showCreate, $column) === false) { + return $this->addColumn($column); + } + } + } + } + return false; + } + protected function sqlConcat($s1, $s2) { return $s1 . '||' . $s2; } diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php index 76025ff53..475d39286 100644 --- a/app/Models/FeedDAO.php +++ b/app/Models/FeedDAO.php @@ -330,11 +330,12 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable { . 'AND id NOT IN (SELECT id FROM (SELECT e2.id FROM `' . $this->prefix . 'entry` e2 WHERE e2.id_feed=:id_feed ORDER BY id DESC LIMIT :keep) keep)'; //Double select: MySQL doesn't support 'LIMIT & IN/ALL/ANY/SOME subquery' $stm = $this->bd->prepare($sql); - $id_max = intval($date_min) . '000000'; - - $stm->bindParam(':id_feed', $id, PDO::PARAM_INT); - $stm->bindParam(':id_max', $id_max, PDO::PARAM_STR); - $stm->bindParam(':keep', $keep, PDO::PARAM_INT); + if ($stm) { + $id_max = intval($date_min) . '000000'; + $stm->bindParam(':id_feed', $id, PDO::PARAM_INT); + $stm->bindParam(':id_max', $id_max, PDO::PARAM_STR); + $stm->bindParam(':keep', $keep, PDO::PARAM_INT); + } if ($stm && $stm->execute()) { return $stm->rowCount(); diff --git a/app/SQL/install.sql.mysql.php b/app/SQL/install.sql.mysql.php index afdd821b2..9c6af405d 100644 --- a/app/SQL/install.sql.mysql.php +++ b/app/SQL/install.sql.mysql.php @@ -41,7 +41,7 @@ CREATE TABLE IF NOT EXISTS `%1$sentry` ( `content_bin` blob, -- v0.7 `link` varchar(1023) CHARACTER SET latin1 NOT NULL, `date` int(11), -- Until year 2038 - `lastSeen` INT(11) NOT NULL, -- v1.2, Until year 2038 + `lastSeen` INT(11) DEFAULT 0, -- v1.2, Until year 2038 `hash` BINARY(16), -- v1.2 `is_read` boolean NOT NULL DEFAULT 0, `is_favorite` boolean NOT NULL DEFAULT 0, diff --git a/app/SQL/install.sql.sqlite.php b/app/SQL/install.sql.sqlite.php index 7517ead45..77e8e094c 100644 --- a/app/SQL/install.sql.sqlite.php +++ b/app/SQL/install.sql.sqlite.php @@ -39,7 +39,7 @@ $SQL_CREATE_TABLES = array( `content` text, `link` varchar(1023) NOT NULL, `date` int(11), -- Until year 2038 - `lastSeen` INT(11) NOT NULL, -- v1.2, Until year 2038 + `lastSeen` INT(11) DEFAULT 0, -- v1.2, Until year 2038 `hash` BINARY(16), -- v1.2 `is_read` boolean NOT NULL DEFAULT 0, `is_favorite` boolean NOT NULL DEFAULT 0, diff --git a/app/install.php b/app/install.php index 177173fdb..86afb9318 100644 --- a/app/install.php +++ b/app/install.php @@ -168,8 +168,10 @@ function saveStep3() { $_SESSION['bd_prefix_user'] = $_SESSION['bd_prefix'] .(empty($_SESSION['default_user']) ? '' :($_SESSION['default_user'] . '_')); } + //TODO: load `config.default.php` as default $config_array = array( 'environment' => 'production', + 'simplepie_syslog_enabled' => true, 'salt' => $_SESSION['salt'], 'title' => $_SESSION['title'], 'default_user' => $_SESSION['default_user'], diff --git a/lib/Minz/ModelPdo.php b/lib/Minz/ModelPdo.php index ac7a1bed7..3e8ec1f43 100644 --- a/lib/Minz/ModelPdo.php +++ b/lib/Minz/ModelPdo.php @@ -134,4 +134,9 @@ class MinzPDO extends PDO { MinzPDO::check($statement); return parent::exec($statement); } + + public function query($statement) { + MinzPDO::check($statement); + return parent::query($statement); + } } -- cgit v1.2.3 From 92db9202980ce63ad6f437416efd50c07792e7e8 Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Fri, 5 Jun 2015 20:44:45 +0200 Subject: PDO option example --- app/install.php | 3 ++- data/config.default.php | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php index 3cdd59d11..313081c14 100644 --- a/app/install.php +++ b/app/install.php @@ -165,7 +165,7 @@ function saveStep3() { $_SESSION['bd_user'] = $_POST['user']; $_SESSION['bd_password'] = $_POST['pass']; $_SESSION['bd_prefix'] = substr($_POST['prefix'], 0, 16); - $_SESSION['bd_prefix_user'] = $_SESSION['bd_prefix'] .(empty($_SESSION['default_user']) ? '' :($_SESSION['default_user'] . '_')); + $_SESSION['bd_prefix_user'] = $_SESSION['bd_prefix'] . (empty($_SESSION['default_user']) ? '' : ($_SESSION['default_user'] . '_')); } //TODO: load `config.default.php` as default @@ -183,6 +183,7 @@ function saveStep3() { 'password' => $_SESSION['bd_password'], 'base' => $_SESSION['bd_base'], 'prefix' => $_SESSION['bd_prefix'], + 'pdo_options' => array(), ), ); diff --git a/data/config.default.php b/data/config.default.php index 7c179c8a0..97085df29 100644 --- a/data/config.default.php +++ b/data/config.default.php @@ -100,6 +100,9 @@ return array( 'prefix' => '', 'pdo_options' => array( + //PDO::MYSQL_ATTR_SSL_KEY => '/path/to/client-key.pem', + //PDO::MYSQL_ATTR_SSL_CERT => '/path/to/client-cert.pem', + //PDO::MYSQL_ATTR_SSL_CA => '/path/to/ca-cert.pem', ), ), -- cgit v1.2.3 From fcc94c733afe4e745ca4b12a47942ae0419c4786 Mon Sep 17 00:00:00 2001 From: Alexis Degrugillier Date: Sat, 6 Jun 2015 09:09:39 -0400 Subject: Remove the auto-focus on install The javascript code used was confusing on Chrome and Internet Explorer. So I removed it. It has no real value so I think it is better without it. See #855 --- app/install.php | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php index 3cdd59d11..15206b6e3 100644 --- a/app/install.php +++ b/app/install.php @@ -636,7 +636,7 @@ function printStep2() { toggles[i].addEventListener('mouseup', hide_password); } - function auth_type_change(focus) { + function auth_type_change() { var auth_value = document.getElementById('auth_type').value, password_input = document.getElementById('passwordPlain'), mail_input = document.getElementById('mail_login'); @@ -644,21 +644,15 @@ function printStep2() { if (auth_value === 'form') { password_input.required = true; mail_input.required = false; - if (focus) { - password_input.focus(); - } } else if (auth_value === 'persona') { password_input.required = false; mail_input.required = true; - if (focus) { - mail_input.focus(); - } } else { password_input.required = false; mail_input.required = false; } } - auth_type_change(false); + auth_type_change();
-- cgit v1.2.3 From f2f758e6bd0fe4f1b95377badefaf404c3160d62 Mon Sep 17 00:00:00 2001 From: Alexis Degrugillier Date: Sat, 6 Jun 2015 09:34:11 -0400 Subject: Add tab navigation on install --- app/install.php | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) (limited to 'app/install.php') diff --git a/app/install.php b/app/install.php index 3cdd59d11..417c76733 100644 --- a/app/install.php +++ b/app/install.php @@ -427,7 +427,7 @@ function printStep0() {
-