diff options
| author | 2014-12-12 18:58:34 +0100 | |
|---|---|---|
| committer | 2014-12-12 18:58:34 +0100 | |
| commit | eabcf90f5266b746503fef5c438971d7d6a1689e (patch) | |
| tree | 7f2d6d38d297a0f4c4b4e7d52e0d59ce7f7f025b | |
| parent | 99763412c2f49e4e52b5a0343bb465141be76188 (diff) | |
| parent | 6078888de631ea105410079888838503fd7acb3d (diff) | |
Merge branch 'dev' into beta
Conflicts:
app/i18n/en.php
app/i18n/fr.php
112 files changed, 4878 insertions, 1842 deletions
@@ -1,5 +1,26 @@ # Journal des modifications +## 2014-12-xx FreshRSS 0.9.3 (beta) + +* SimplePie + * Support for content-type application/x-rss+xml + * New force_feed option (for feeds sent with the wrong content-type / MIME) by adding #force_feed at the end of the feed URL + * Improved error messages +* Statistics + * Add information on feed repartition pages + * Add percent repartition for the bigger feeds +* UI + * New theme selector + * Update Screwdriver theme + * Add BlueLagoon theme by Mister aiR +* Misc. + * Add option to remove articles after reading them + * Add comments + * Refactor i18n system to not load unnecessary strings + * Fix security issue in Minz_Error::error() method + * Fix redirection after refreshing a given feed + + ## 2014-10-31 FreshRSS 0.9.2 (beta) * UI diff --git a/app/Controllers/authController.php b/app/Controllers/authController.php index 44496cd3e..ccc32ec0d 100644 --- a/app/Controllers/authController.php +++ b/app/Controllers/authController.php @@ -22,7 +22,7 @@ class FreshRSS_auth_Controller extends Minz_ActionController { Minz_Error::error(403); } - Minz_View::prependTitle(_t('gen.title.authentication') . ' · '); + Minz_View::prependTitle(_t('admin.auth.title') . ' · '); if (Minz_Request::isPost()) { $ok = true; @@ -56,10 +56,10 @@ class FreshRSS_auth_Controller extends Minz_ActionController { invalidateHttpCache(); if ($ok) { - Minz_Request::good(_t('configuration_updated'), + Minz_Request::good(_t('feedback.conf.updated'), array('c' => 'auth', 'a' => 'index')); } else { - Minz_Request::bad(_t('error_occurred'), + Minz_Request::bad(_t('feedback.conf.error'), array('c' => 'auth', 'a' => 'index')); } } @@ -123,7 +123,7 @@ class FreshRSS_auth_Controller extends Minz_ActionController { } catch(Minz_Exception $e) { // $username is not a valid user, nor the configuration file! Minz_Log::warning('Login failure: ' . $e->getMessage()); - Minz_Request::bad(_t('invalid_login'), + Minz_Request::bad(_t('feedback.auth.login.invalid'), array('c' => 'auth', 'a' => 'login')); } @@ -144,14 +144,14 @@ class FreshRSS_auth_Controller extends Minz_ActionController { } // All is good, go back to the index. - Minz_Request::good(_t('feedback.login.success'), + Minz_Request::good(_t('feedback.auth.login.success'), array('c' => 'index', 'a' => 'index')); } else { Minz_Log::warning('Password mismatch for' . ' user=' . $username . ', nonce=' . $nonce . ', c=' . $challenge); - Minz_Request::bad(_t('invalid_login'), + Minz_Request::bad(_t('feedback.auth.login.invalid'), array('c' => 'auth', 'a' => 'login')); } } elseif (Minz_Configuration::unsafeAutologinEnabled()) { @@ -183,11 +183,11 @@ class FreshRSS_auth_Controller extends Minz_ActionController { Minz_Session::_param('passwordHash', $s); FreshRSS_Auth::giveAccess(); - Minz_Request::good(_t('feedback.login.success'), + Minz_Request::good(_t('feedback.auth.login.success'), array('c' => 'index', 'a' => 'index')); } else { Minz_Log::warning('Unsafe password mismatch for user ' . $username); - Minz_Request::bad(_t('invalid_login'), + Minz_Request::bad(_t('feedback.auth.login.invalid'), array('c' => 'auth', 'a' => 'login')); } } @@ -261,7 +261,7 @@ class FreshRSS_auth_Controller extends Minz_ActionController { $res = array(); $res['status'] = 'failure'; - $res['reason'] = _t('invalid_login'); + $res['reason'] = _t('feedback.auth.login.invalid'); } header('Content-Type: application/json; charset=UTF-8'); @@ -275,7 +275,7 @@ class FreshRSS_auth_Controller extends Minz_ActionController { public function logoutAction() { invalidateHttpCache(); FreshRSS_Auth::removeAccess(); - Minz_Request::good(_t('feedback.logout.success'), + Minz_Request::good(_t('feedback.auth.logout.success'), array('c' => 'index', 'a' => 'index')); } @@ -285,7 +285,7 @@ class FreshRSS_auth_Controller extends Minz_ActionController { * After reseting, form auth is set by default. */ public function resetAction() { - Minz_View::prependTitle(_t('auth_reset') . ' · '); + Minz_View::prependTitle(_t('admin.auth.title_reset') . ' · '); Minz_View::appendScript(Minz_Url::display( '/scripts/bcrypt.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/bcrypt.min.js') @@ -296,8 +296,8 @@ class FreshRSS_auth_Controller extends Minz_ActionController { if (Minz_Configuration::authType() != 'persona') { $this->view->message = array( 'status' => 'bad', - 'title' => _t('damn'), - 'body' => _t('auth_not_persona') + 'title' => _t('gen.short.damn'), + 'body' => _t('feedback.auth.not_persona') ); $this->view->no_form = true; return; @@ -308,8 +308,8 @@ class FreshRSS_auth_Controller extends Minz_ActionController { if (!$conf->passwordHash) { $this->view->message = array( 'status' => 'bad', - 'title' => _t('damn'), - 'body' => _t('auth_no_password_set') + 'title' => _t('gen.short.damn'), + 'body' => _t('feedback.auth.no_password_set') ); $this->view->no_form = true; return; @@ -331,9 +331,9 @@ class FreshRSS_auth_Controller extends Minz_ActionController { $ok = Minz_Configuration::writeFile(); if ($ok) { - Minz_Request::good(_t('auth_form_set')); + Minz_Request::good(_t('feedback.auth.form.set')); } else { - Minz_Request::bad(_t('auth_form_not_set'), + Minz_Request::bad(_t('feedback.auth.form.not_set'), array('c' => 'auth', 'a' => 'reset')); } } else { @@ -341,7 +341,7 @@ class FreshRSS_auth_Controller extends Minz_ActionController { ' user=' . $username . ', nonce=' . $nonce . ', c=' . $challenge); - Minz_Request::bad(_t('invalid_login'), + Minz_Request::bad(_t('feedback.auth.login.invalid'), array('c' => 'auth', 'a' => 'reset')); } } diff --git a/app/Controllers/categoryController.php b/app/Controllers/categoryController.php index 50b1d841a..5f1beae90 100644 --- a/app/Controllers/categoryController.php +++ b/app/Controllers/categoryController.php @@ -34,7 +34,7 @@ class FreshRSS_category_Controller extends Minz_ActionController { $this->view->categories = $catDAO->listCategories(false); if (count($this->view->categories) >= $limits['max_categories']) { - Minz_Request::bad(_t('sub.categories.over_max', $limits['max_categories']), + Minz_Request::bad(_t('feedback.sub.category.over_max', $limits['max_categories']), $url_redirect); } @@ -43,13 +43,13 @@ class FreshRSS_category_Controller extends Minz_ActionController { $cat_name = Minz_Request::param('new-category'); if (!$cat_name) { - Minz_Request::bad(_t('category_no_name'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.category.no_name'), $url_redirect); } $cat = new FreshRSS_Category($cat_name); if ($catDAO->searchByName($cat->name()) != null) { - Minz_Request::bad(_t('category_name_exists'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.category.name_exists'), $url_redirect); } $values = array( @@ -58,9 +58,9 @@ class FreshRSS_category_Controller extends Minz_ActionController { ); if ($catDAO->addCategory($values)) { - Minz_Request::good(_t('category_created', $cat->name()), $url_redirect); + Minz_Request::good(_t('feedback.sub.category.created', $cat->name()), $url_redirect); } else { - Minz_Request::bad(_t('error_occurred'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.category.error'), $url_redirect); } } @@ -84,11 +84,11 @@ class FreshRSS_category_Controller extends Minz_ActionController { $id = Minz_Request::param('id'); $name = Minz_Request::param('name', ''); if (strlen($name) <= 0) { - Minz_Request::bad(_t('category_no_name'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.category.no_name'), $url_redirect); } if ($catDAO->searchById($id) == null) { - Minz_Request::bad(_t('category_not_exist'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.category.not_exist'), $url_redirect); } $cat = new FreshRSS_Category($name); @@ -97,9 +97,9 @@ class FreshRSS_category_Controller extends Minz_ActionController { ); if ($catDAO->updateCategory($id, $values)) { - Minz_Request::good(_t('category_updated'), $url_redirect); + Minz_Request::good(_t('feedback.sub.category.updated'), $url_redirect); } else { - Minz_Request::bad(_t('error_occurred'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.category.error'), $url_redirect); } } @@ -125,26 +125,26 @@ class FreshRSS_category_Controller extends Minz_ActionController { $id = Minz_Request::param('id'); if (!$id) { - Minz_Request::bad(_t('category_no_id'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.category.no_id'), $url_redirect); } if ($id === $default_category->id()) { - Minz_Request::bad(_t('category_not_delete_default'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.category.not_delete_default'), $url_redirect); } if ($feedDAO->changeCategory($id, $default_category->id()) === false) { - Minz_Request::bad(_t('error_occurred'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.category.error'), $url_redirect); } if ($catDAO->deleteCategory($id) === false) { - Minz_Request::bad(_t('error_occurred'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.category.error'), $url_redirect); } // Remove related queries. FreshRSS_Context::$conf->remove_query_by_get('c_' . $id); FreshRSS_Context::$conf->save(); - Minz_Request::good(_t('category_deleted'), $url_redirect); + Minz_Request::good(_t('feedback.sub.category.deleted'), $url_redirect); } Minz_Request::forward($url_redirect, true); @@ -166,7 +166,7 @@ class FreshRSS_category_Controller extends Minz_ActionController { $id = Minz_Request::param('id'); if (!$id) { - Minz_Request::bad(_t('category_no_id'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.category.no_id'), $url_redirect); } // List feeds to remove then related user queries. @@ -181,9 +181,9 @@ class FreshRSS_category_Controller extends Minz_ActionController { } FreshRSS_Context::$conf->save(); - Minz_Request::good(_t('category_emptied'), $url_redirect); + Minz_Request::good(_t('feedback.sub.category.emptied'), $url_redirect); } else { - Minz_Request::bad(_t('error_occurred'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.category.error'), $url_redirect); } } diff --git a/app/Controllers/configureController.php b/app/Controllers/configureController.php index f8d9b47c3..feb5483fb 100755 --- a/app/Controllers/configureController.php +++ b/app/Controllers/configureController.php @@ -61,13 +61,13 @@ class FreshRSS_configure_Controller extends Minz_ActionController { Minz_Translate::reset(); invalidateHttpCache(); - Minz_Request::good(_t('configuration_updated'), + Minz_Request::good(_t('feedback.conf.updated'), array('c' => 'configure', 'a' => 'display')); } $this->view->themes = FreshRSS_Themes::get(); - Minz_View::prependTitle(_t('display_configuration') . ' · '); + Minz_View::prependTitle(_t('conf.display.title') . ' · '); } /** @@ -89,6 +89,7 @@ class FreshRSS_configure_Controller extends Minz_ActionController { * - image lazy loading * - stick open articles to the top * - display a confirmation when reading all articles + * - auto remove article after reading * - article order (default: DESC) * - mark articles as read when: * - displayed @@ -110,6 +111,7 @@ class FreshRSS_configure_Controller extends Minz_ActionController { FreshRSS_Context::$conf->_lazyload(Minz_Request::param('lazyload', false)); FreshRSS_Context::$conf->_sticky_post(Minz_Request::param('sticky_post', false)); FreshRSS_Context::$conf->_reading_confirm(Minz_Request::param('reading_confirm', false)); + FreshRSS_Context::$conf->_auto_remove_article(Minz_Request::param('auto_remove_article', false)); FreshRSS_Context::$conf->_sort_order(Minz_Request::param('sort_order', 'DESC')); FreshRSS_Context::$conf->_mark_when(array( 'article' => Minz_Request::param('mark_open_article', false), @@ -123,11 +125,11 @@ class FreshRSS_configure_Controller extends Minz_ActionController { Minz_Translate::reset(); invalidateHttpCache(); - Minz_Request::good(_t('configuration_updated'), + Minz_Request::good(_t('feedback.conf.updated'), array('c' => 'configure', 'a' => 'reading')); } - Minz_View::prependTitle(_t('reading_configuration') . ' · '); + Minz_View::prependTitle(_t('conf.reading.title') . ' · '); } /** @@ -144,11 +146,11 @@ class FreshRSS_configure_Controller extends Minz_ActionController { FreshRSS_Context::$conf->save(); invalidateHttpCache(); - Minz_Request::good(_t('configuration_updated'), + Minz_Request::good(_t('feedback.conf.updated'), array('c' => 'configure', 'a' => 'sharing')); } - Minz_View::prependTitle(_t('sharing') . ' · '); + Minz_View::prependTitle(_t('conf.sharing.title') . ' · '); } /** @@ -186,11 +188,11 @@ class FreshRSS_configure_Controller extends Minz_ActionController { FreshRSS_Context::$conf->save(); invalidateHttpCache(); - Minz_Request::good(_t('shortcuts_updated'), + Minz_Request::good(_t('feedback.conf.shortcuts_updated'), array('c' => 'configure', 'a' => 'shortcut')); } - Minz_View::prependTitle(_t('shortcuts') . ' · '); + Minz_View::prependTitle(_t('conf.shortcut.title') . ' · '); } /** @@ -216,11 +218,11 @@ class FreshRSS_configure_Controller extends Minz_ActionController { FreshRSS_Context::$conf->save(); invalidateHttpCache(); - Minz_Request::good(_t('configuration_updated'), + Minz_Request::good(_t('feedback.conf.updated'), array('c' => 'configure', 'a' => 'archiving')); } - Minz_View::prependTitle(_t('archiving_configuration') . ' · '); + Minz_View::prependTitle(_t('conf.archiving.title') . ' · '); $entryDAO = FreshRSS_Factory::createEntryDao(); $this->view->nb_total = $entryDAO->count(); @@ -247,13 +249,13 @@ class FreshRSS_configure_Controller extends Minz_ActionController { foreach ($queries as $key => $query) { if (!$query['name']) { - $query['name'] = _t('query_number', $key + 1); + $query['name'] = _t('conf.query.number', $key + 1); } } FreshRSS_Context::$conf->_queries($queries); FreshRSS_Context::$conf->save(); - Minz_Request::good(_t('configuration_updated'), + Minz_Request::good(_t('feedback.conf.updated'), array('c' => 'configure', 'a' => 'queries')); } else { $this->view->query_get = array(); @@ -315,7 +317,7 @@ class FreshRSS_configure_Controller extends Minz_ActionController { } } - Minz_View::prependTitle(_t('queries') . ' · '); + Minz_View::prependTitle(_t('conf.query.title') . ' · '); } /** @@ -329,7 +331,7 @@ class FreshRSS_configure_Controller extends Minz_ActionController { $whitelist = array('get', 'order', 'name', 'search', 'state'); $queries = FreshRSS_Context::$conf->queries; $query = Minz_Request::params(); - $query['name'] = _t('query_number', count($queries) + 1); + $query['name'] = _t('conf.query.number', count($queries) + 1); foreach ($query as $key => $value) { if (!in_array($key, $whitelist)) { unset($query[$key]); @@ -339,7 +341,7 @@ class FreshRSS_configure_Controller extends Minz_ActionController { FreshRSS_Context::$conf->_queries($queries); FreshRSS_Context::$conf->save(); - Minz_Request::good(_t('query_created', $query['name']), + Minz_Request::good(_t('feedback.conf.query_created', $query['name']), array('c' => 'configure', 'a' => 'queries')); } } diff --git a/app/Controllers/entryController.php b/app/Controllers/entryController.php index b4beed619..c894ae9aa 100755 --- a/app/Controllers/entryController.php +++ b/app/Controllers/entryController.php @@ -85,7 +85,7 @@ class FreshRSS_entry_Controller extends Minz_ActionController { } if (!$this->ajax) { - Minz_Request::good(_t('feeds_marked_read'), array( + Minz_Request::good(_t('feedback.sub.feed.marked_read'), array( 'c' => 'index', 'a' => 'index', 'params' => $params, @@ -144,7 +144,7 @@ class FreshRSS_entry_Controller extends Minz_ActionController { $feedDAO->updateCachedValues(); invalidateHttpCache(); - Minz_Request::good(_t('optimization_complete'), $url_redirect); + Minz_Request::good(_t('feedback.admin.optimization_complete'), $url_redirect); } /** @@ -185,7 +185,7 @@ class FreshRSS_entry_Controller extends Minz_ActionController { $feedDAO->updateCachedValues(); invalidateHttpCache(); - Minz_Request::good(_t('purge_completed', $nb_total), array( + Minz_Request::good(_t('feedback.sub.purge_completed', $nb_total), array( 'c' => 'configure', 'a' => 'archiving' )); diff --git a/app/Controllers/errorController.php b/app/Controllers/errorController.php index 6c080bea8..06fa186cf 100644 --- a/app/Controllers/errorController.php +++ b/app/Controllers/errorController.php @@ -37,11 +37,11 @@ class FreshRSS_error_Controller extends Minz_ActionController { if ($this->view->errorMessage == '') { switch($code_int) { case 403: - $this->view->errorMessage = _t('access_denied'); + $this->view->errorMessage = _t('feedback.access.denied'); break; case 404: default: - $this->view->errorMessage = _t('page_not_found'); + $this->view->errorMessage = _t('feedback.access.not_found'); break; } } diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php index 9990a852c..121cb8921 100755 --- a/app/Controllers/feedController.php +++ b/app/Controllers/feedController.php @@ -68,7 +68,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController { $limits = Minz_Configuration::limits(); $this->view->feeds = $feedDAO->listFeeds(); if (count($this->view->feeds) >= $limits['max_feeds']) { - Minz_Request::bad(_t('sub.feeds.over_max', $limits['max_feeds']), + Minz_Request::bad(_t('feedback.sub.feed.over_max', $limits['max_feeds']), $url_redirect); } @@ -110,7 +110,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController { } catch (FreshRSS_BadUrl_Exception $e) { // Given url was not a valid url! Minz_Log::warning($e->getMessage()); - Minz_Request::bad(_t('invalid_url', $url), $url_redirect); + Minz_Request::bad(_t('feedback.sub.feed.invalid_url', $url), $url_redirect); } try { @@ -119,20 +119,23 @@ class FreshRSS_feed_Controller extends Minz_ActionController { // Something went bad (timeout, server not found, etc.) Minz_Log::warning($e->getMessage()); Minz_Request::bad( - _t('internal_problem_feed', _url('index', 'logs')), + _t('feedback.sub.feed.internal_problem', _url('index', 'logs')), $url_redirect ); } catch (Minz_FileNotExistException $e) { // Cache directory doesn't exist! Minz_Log::error($e->getMessage()); Minz_Request::bad( - _t('internal_problem_feed', _url('index', 'logs')), + _t('feedback.sub.feed.internal_problem', _url('index', 'logs')), $url_redirect ); } if ($feedDAO->searchByUrl($feed->url())) { - Minz_Request::bad(_t('already_subscribed', $feed->name()), $url_redirect); + Minz_Request::bad( + _t('feedback.sub.feed.already_subscribed', $feed->name()), + $url_redirect + ); } $feed->_category($cat); @@ -151,7 +154,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController { $id = $feedDAO->addFeed($values); if (!$id) { // There was an error in database... we cannot say what here. - Minz_Request::bad(_t('feed_not_added', $feed->name()), $url_redirect); + Minz_Request::bad(_t('feedback.sub.feed.not_added', $feed->name()), $url_redirect); } // Ok, feed has been added in database. Now we have to refresh entries. @@ -185,10 +188,10 @@ class FreshRSS_feed_Controller extends Minz_ActionController { // Entries are in DB, we redirect to feed configuration page. $url_redirect['params']['id'] = $feed->id(); - Minz_Request::good(_t('feed_added', $feed->name()), $url_redirect); + Minz_Request::good(_t('feedback.sub.feed.added', $feed->name()), $url_redirect); } else { // GET request: we must ask confirmation to user before adding feed. - Minz_View::prependTitle(_t('add_rss_feed') . ' · '); + Minz_View::prependTitle(_t('sub.feed.title_add') . ' · '); $this->view->categories = $this->catDAO->listCategories(false); $this->view->feed = new FreshRSS_Feed($url); @@ -204,7 +207,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController { if ($feed) { // Already subscribe so we redirect to the feed configuration page. $url_redirect['params']['id'] = $feed->id(); - Minz_Request::good(_t('already_subscribed', $feed->name()), $url_redirect); + Minz_Request::good(_t('feedback.sub.feed.already_subscribed', $feed->name()), $url_redirect); } } } @@ -234,9 +237,9 @@ class FreshRSS_feed_Controller extends Minz_ActionController { invalidateHttpCache(); if ($n === false) { - Minz_Request::bad(_t('error_occurred'), $url_redirect); + Minz_Request::bad(_t('feedback.sub.feed.error'), $url_redirect); } else { - Minz_Request::good(_t('n_entries_deleted', $n), $url_redirect); + Minz_Request::good(_t('feedback.sub.feed.n_entries_deleted', $n), $url_redirect); } } @@ -381,7 +384,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController { // are several updated feeds. $notif = array( 'type' => 'good', - 'content' => _t('feeds_actualized') + 'content' => _t('feedback.sub.feed.actualizeds') ); Minz_Session::_param('notification', $notif); // No layout in ajax request. @@ -392,12 +395,13 @@ class FreshRSS_feed_Controller extends Minz_ActionController { // Redirect to the main page with correct notification. if ($updated_feeds === 1) { $feed = reset($feeds); - Minz_Request::good(_t('feed_actualized', $feed->name()), - array('get' => 'f_' . $feed->id())); + Minz_Request::good(_t('feedback.sub.feed.actualized', $feed->name()), array( + 'params' => array('get' => 'f_' . $feed->id()) + )); } elseif ($updated_feeds > 1) { - Minz_Request::good(_t('n_feeds_actualized', $updated_feeds), array()); + Minz_Request::good(_t('feedback.sub.feed.n_actualized', $updated_feeds), array()); } else { - Minz_Request::good(_t('no_feed_to_refresh'), array()); + Minz_Request::good(_t('feedback.sub.feed.no_refresh'), array()); } } @@ -475,9 +479,9 @@ class FreshRSS_feed_Controller extends Minz_ActionController { FreshRSS_Context::$conf->remove_query_by_get('f_' . $id); FreshRSS_Context::$conf->save(); - Minz_Request::good(_t('feed_deleted'), $redirect_url); + Minz_Request::good(_t('feedback.sub.feed.deleted'), $redirect_url); } else { - Minz_Request::bad(_t('error_occurred'), $redirect_url); + Minz_Request::bad(_t('feedback.sub.feed.error'), $redirect_url); } } } diff --git a/app/Controllers/importExportController.php b/app/Controllers/importExportController.php index 4e2dbd157..f29051f34 100644 --- a/app/Controllers/importExportController.php +++ b/app/Controllers/importExportController.php @@ -26,7 +26,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController { */ public function indexAction() { $this->view->feeds = $this->feedDAO->listFeeds(); - Minz_View::prependTitle(_t('import_export') . ' · '); + Minz_View::prependTitle(_t('sub.import_export.title') . ' · '); } /** @@ -48,7 +48,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController { if ($status_file !== 0) { Minz_Log::error('File cannot be uploaded. Error code: ' . $status_file); - Minz_Request::bad(_t('file_cannot_be_uploaded'), + Minz_Request::bad(_t('feedback.import_export.file_cannot_be_uploaded'), array('c' => 'importExport', 'a' => 'index')); } @@ -70,7 +70,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController { if (!is_resource($zip)) { // zip_open cannot open file: something is wrong Minz_Log::error('Zip archive cannot be imported. Error code: ' . $zip); - Minz_Request::bad(_t('zip_error'), + Minz_Request::bad(_t('feedback.import_export.zip_error'), array('c' => 'importExport', 'a' => 'index')); } @@ -92,7 +92,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController { zip_close($zip); } elseif ($type_file === 'zip') { // Zip extension is not loaded - Minz_Request::bad(_t('no_zip_extension'), + Minz_Request::bad(_t('feedback.import_export.no_zip_extension'), array('c' => 'importExport', 'a' => 'index')); } elseif ($type_file !== 'unknown') { $list_files[$type_file][] = file_get_contents($file['tmp_name']); @@ -115,8 +115,8 @@ class FreshRSS_importExport_Controller extends Minz_ActionController { // And finally, we get import status and redirect to the home page Minz_Session::_param('actualize_feeds', true); - $content_notif = $error === true ? _t('feeds_imported_with_errors') : - _t('feeds_imported'); + $content_notif = $error === true ? _t('feedback.import_export.feeds_imported_with_errors') : + _t('feedback.import_export.feeds_imported'); Minz_Request::good($content_notif); } @@ -183,7 +183,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController { if (isset($elt['xmlUrl'])) { // If xmlUrl exists, it means it is a feed if ($nb_feeds >= $limits['max_feeds']) { - Minz_Log::warning(_t('sub.feeds.over_max', + Minz_Log::warning(_t('feedback.sub.feed.over_max', $limits['max_feeds'])); $is_error = true; continue; @@ -197,7 +197,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController { // No xmlUrl? It should be a category! $limit_reached = ($nb_cats >= $limits['max_categories']); if ($limit_reached) { - Minz_Log::warning(_t('sub.categories.over_max', + Minz_Log::warning(_t('feedback.sub.category.over_max', $limits['max_categories'])); } @@ -337,7 +337,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController { // Feed does not exist in DB,we should to try to add it. if ($nb_feeds >= $limits['max_feeds']) { // Oops, no more place! - Minz_Log::warning(_t('sub.feeds.over_max', $limits['max_feeds'])); + Minz_Log::warning(_t('feedback.sub.feed.over_max', $limits['max_feeds'])); } else { $feed = $this->addFeedJson($item['origin'], $google_compliant); } @@ -482,7 +482,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController { $this->exportZip($export_files); } catch (Exception $e) { # Oops, there is no Zip extension! - Minz_Request::bad(_t('export_no_zip_extension'), + Minz_Request::bad(_t('feedback.import_export.export_no_zip_extension'), array('c' => 'importExport', 'a' => 'index')); } } elseif ($nb_files === 1) { @@ -523,14 +523,14 @@ class FreshRSS_importExport_Controller extends Minz_ActionController { $this->view->categories = $this->catDAO->listCategories(); if ($type == 'starred') { - $this->view->list_title = _t('starred_list'); + $this->view->list_title = _t('sub.import_export.starred_list'); $this->view->type = 'starred'; $unread_fav = $this->entryDAO->countUnreadReadFavorites(); $this->view->entries = $this->entryDAO->listWhere( 's', '', FreshRSS_Entry::STATE_ALL, 'ASC', $unread_fav['all'] ); } elseif ($type == 'feed' && !is_null($feed)) { - $this->view->list_title = _t('feed_list', $feed->name()); + $this->view->list_title = _t('sub.import_export.feed_list', $feed->name()); $this->view->type = 'feed/' . $feed->id(); $this->view->entries = $this->entryDAO->listWhere( 'f', $feed->id(), FreshRSS_Entry::STATE_ALL, 'ASC', diff --git a/app/Controllers/indexController.php b/app/Controllers/indexController.php index 1cf618f7f..33cd2843c 100755 --- a/app/Controllers/indexController.php +++ b/app/Controllers/indexController.php @@ -98,7 +98,7 @@ class FreshRSS_index_Controller extends Minz_ActionController { $this->view->categories = FreshRSS_Context::$categories; $this->view->rss_title = FreshRSS_Context::$name . ' | ' . Minz_View::title(); - $title = _t('gen.title.global_view'); + $title = _t('index.feed.title_global'); if (FreshRSS_Context::$get_unread > 0) { $title = '(' . FreshRSS_Context::$get_unread . ') ' . $title; } @@ -206,7 +206,7 @@ class FreshRSS_index_Controller extends Minz_ActionController { * This action displays the about page of FreshRSS. */ public function aboutAction() { - Minz_View::prependTitle(_t('about') . ' · '); + Minz_View::prependTitle(_t('index.about.title') . ' · '); } /** @@ -217,7 +217,7 @@ class FreshRSS_index_Controller extends Minz_ActionController { Minz_Error::error(403); } - Minz_View::prependTitle(_t('logs') . ' · '); + Minz_View::prependTitle(_t('index.log.title') . ' · '); if (Minz_Request::isPost()) { FreshRSS_LogDAO::truncate(); diff --git a/app/Controllers/javascriptController.php b/app/Controllers/javascriptController.php index 62f413989..113f58ea9 100755 --- a/app/Controllers/javascriptController.php +++ b/app/Controllers/javascriptController.php @@ -39,6 +39,8 @@ class FreshRSS_javascript_Controller extends Minz_ActionController { } catch (Minz_Exception $me) { Minz_Log::warning('Nonce failure: ' . $me->getMessage()); } + } else { + Minz_Log::notice('Nonce failure due to invalid username!'); } $this->view->nonce = ''; //Failure $this->view->salt1 = ''; diff --git a/app/Controllers/statsController.php b/app/Controllers/statsController.php index 18fbca6df..4a597ae7d 100644 --- a/app/Controllers/statsController.php +++ b/app/Controllers/statsController.php @@ -15,7 +15,7 @@ class FreshRSS_stats_Controller extends Minz_ActionController { Minz_Error::error(403); } - Minz_View::prependTitle(_t('stats') . ' · '); + Minz_View::prependTitle(_t('admin.stats.title') . ' · '); } /** @@ -117,6 +117,7 @@ class FreshRSS_stats_Controller extends Minz_ActionController { $this->view->feed = $feedDAO->searchById($id); $this->view->days = $statsDAO->getDays(); $this->view->months = $statsDAO->getMonths(); + $this->view->repartition = $statsDAO->calculateEntryRepartitionPerFeed($id); $this->view->repartitionHour = $statsDAO->calculateEntryRepartitionPerFeedPerHour($id); $this->view->averageHour = $statsDAO->calculateEntryAveragePerFeedPerHour($id); $this->view->repartitionDayOfWeek = $statsDAO->calculateEntryRepartitionPerFeedPerDayOfWeek($id); diff --git a/app/Controllers/subscriptionController.php b/app/Controllers/subscriptionController.php index 67b95eba6..6152b7252 100644 --- a/app/Controllers/subscriptionController.php +++ b/app/Controllers/subscriptionController.php @@ -29,7 +29,7 @@ class FreshRSS_subscription_Controller extends Minz_ActionController { public function indexAction() { Minz_View::appendScript(Minz_Url::display('/scripts/category.js?' . @filemtime(PUBLIC_PATH . '/scripts/category.js'))); - Minz_View::prependTitle(_t('subscription_management') . ' · '); + Minz_View::prependTitle(_t('sub.title') . ' · '); $id = Minz_Request::param('id'); if ($id !== false) { @@ -74,7 +74,7 @@ class FreshRSS_subscription_Controller extends Minz_ActionController { $this->view->feed = $this->view->feeds[$id]; - Minz_View::prependTitle(_t('rss_feed_management') . ' · ' . $this->view->feed->name() . ' · '); + Minz_View::prependTitle(_t('sub.title.feed_management') . ' · ' . $this->view->feed->name() . ' · '); if (Minz_Request::isPost()) { $user = Minz_Request::param('http_user', ''); @@ -106,9 +106,9 @@ class FreshRSS_subscription_Controller extends Minz_ActionController { $this->view->feed->_category($cat); $this->view->feed->faviconPrepare(); - Minz_Request::good(_t('feed_updated'), array('c' => 'subscription', 'params' => array('id' => $id))); + Minz_Request::good(_t('feedback.sub.feed.updated'), array('c' => 'subscription', 'params' => array('id' => $id))); } else { - Minz_Request::bad(_t('error_occurred_update'), array('c' => 'subscription')); + Minz_Request::bad(_t('feedback.sub.error'), array('c' => 'subscription')); } } } diff --git a/app/Controllers/updateController.php b/app/Controllers/updateController.php index 0896b13ac..1b44a739c 100644 --- a/app/Controllers/updateController.php +++ b/app/Controllers/updateController.php @@ -20,21 +20,21 @@ class FreshRSS_update_Controller extends Minz_ActionController { } public function indexAction() { - Minz_View::prependTitle(_t('update_system') . ' · '); + Minz_View::prependTitle(_t('admin.update.title') . ' · '); if (file_exists(UPDATE_FILENAME) && !is_writable(FRESHRSS_PATH)) { $this->view->message = array( 'status' => 'bad', - 'title' => _t('damn'), - 'body' => _t('file_is_nok', FRESHRSS_PATH) + 'title' => _t('gen.short.damn'), + 'body' => _t('feedback.update.file_is_nok', FRESHRSS_PATH) ); } elseif (file_exists(UPDATE_FILENAME)) { // There is an update file to apply! $this->view->update_to_apply = true; $this->view->message = array( 'status' => 'good', - 'title' => _t('ok'), - 'body' => _t('update_can_apply') + 'title' => _t('gen.short.ok'), + 'body' => _t('feedback.update.can_apply') ); } } @@ -67,8 +67,8 @@ class FreshRSS_update_Controller extends Minz_ActionController { $this->view->message = array( 'status' => 'bad', - 'title' => _t('damn'), - 'body' => _t('update_server_not_found', FRESHRSS_UPDATE_WEBSITE) + 'title' => _t('gen.short.damn'), + 'body' => _t('feedback.update.server_not_found', FRESHRSS_UPDATE_WEBSITE) ); return; } @@ -78,8 +78,8 @@ class FreshRSS_update_Controller extends Minz_ActionController { if (strpos($status, 'UPDATE') !== 0) { $this->view->message = array( 'status' => 'bad', - 'title' => _t('damn'), - 'body' => _t('no_update') + 'title' => _t('gen.short.damn'), + 'body' => _t('feedback.update.none') ); @file_put_contents(DATA_PATH . '/last_update.txt', time()); @@ -93,8 +93,8 @@ class FreshRSS_update_Controller extends Minz_ActionController { } else { $this->view->message = array( 'status' => 'bad', - 'title' => _t('damn'), - 'body' => _t('update_problem', 'Cannot save the update script') + 'title' => _t('gen.short.damn'), + 'body' => _t('feedback.update.error', 'Cannot save the update script') ); } } @@ -112,9 +112,9 @@ class FreshRSS_update_Controller extends Minz_ActionController { if ($res === true) { @unlink(UPDATE_FILENAME); @file_put_contents(DATA_PATH . '/last_update.txt', time()); - Minz_Request::good(_t('update_finished')); + Minz_Request::good(_t('feedback.update.finished')); } else { - Minz_Request::bad(_t('update_problem', $res), + Minz_Request::bad(_t('feedback.update.error', $res), array('c' => 'update', 'a' => 'index')); } } @@ -133,7 +133,7 @@ class FreshRSS_update_Controller extends Minz_ActionController { 'params' => array('post_conf' => true) ), true); } else { - Minz_Request::bad(_t('update_problem', $res), + Minz_Request::bad(_t('feedback.update.error', $res), array('c' => 'update', 'a' => 'index')); } } @@ -143,7 +143,7 @@ class FreshRSS_update_Controller extends Minz_ActionController { * This action displays information about installation. */ public function checkInstallAction() { - Minz_View::prependTitle(_t('gen.title.check_install') . ' · '); + Minz_View::prependTitle(_t('admin.check_install.title') . ' · '); $this->view->status_php = check_install_php(); $this->view->status_files = check_install_files(); diff --git a/app/Controllers/userController.php b/app/Controllers/userController.php index 5050571a9..3b40e42dc 100644 --- a/app/Controllers/userController.php +++ b/app/Controllers/userController.php @@ -23,7 +23,7 @@ class FreshRSS_user_Controller extends Minz_ActionController { * This action displays the user profile page. */ public function profileAction() { - Minz_View::prependTitle(_t('gen.title.user_profile') . ' · '); + Minz_View::prependTitle(_t('conf.profile.title') . ' · '); if (Minz_Request::isPost()) { $ok = true; @@ -71,10 +71,10 @@ class FreshRSS_user_Controller extends Minz_ActionController { } if ($ok) { - Minz_Request::good(_t('feedback.user_profile.updated'), + Minz_Request::good(_t('feedback.profile.updated'), array('c' => 'user', 'a' => 'profile')); } else { - Minz_Request::bad(_t('error_occurred'), + Minz_Request::bad(_t('feedback.profile.error'), array('c' => 'user', 'a' => 'profile')); } } @@ -88,7 +88,7 @@ class FreshRSS_user_Controller extends Minz_ActionController { Minz_Error::error(403); } - Minz_View::prependTitle(_t('gen.title.user_management') . ' · '); + Minz_View::prependTitle(_t('admin.user.title') . ' · '); // Get the correct current user. $username = Minz_Request::param('u', Minz_Session::param('currentUser')); @@ -168,7 +168,7 @@ class FreshRSS_user_Controller extends Minz_ActionController { $notif = array( 'type' => $ok ? 'good' : 'bad', - 'content' => _t($ok ? 'user_created' : 'error_occurred', $new_user_name) + 'content' => _t('feedback.user.created' . (!$ok ? '.error' : ''), $new_user_name) ); Minz_Session::_param('notification', $notif); } @@ -201,7 +201,7 @@ class FreshRSS_user_Controller extends Minz_ActionController { $notif = array( 'type' => $ok ? 'good' : 'bad', - 'content' => _t($ok ? 'user_deleted' : 'error_occurred', $username) + 'content' => _t('feedback.user.deleted' . (!$ok ? '.error' : ''), $username) ); Minz_Session::_param('notification', $notif); } 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/Configuration.php b/app/Models/Configuration.php index 53f136513..8668470b0 100644 --- a/app/Models/Configuration.php +++ b/app/Models/Configuration.php @@ -24,6 +24,7 @@ class FreshRSS_Configuration { 'lazyload' => true, 'sticky_post' => true, 'reading_confirm' => false, + 'auto_remove_article' => false, 'sort_order' => 'DESC', 'anon_access' => false, 'mark_when' => array( @@ -191,6 +192,9 @@ class FreshRSS_Configuration { public function _reading_confirm($value) { $this->data['reading_confirm'] = ((bool)$value) && $value !== 'no'; } + public function _auto_remove_article($value) { + $this->data['auto_remove_article'] = ((bool)$value) && $value !== 'no'; + } public function _sort_order($value) { $this->data['sort_order'] = $value === 'ASC' ? 'ASC' : 'DESC'; } diff --git a/app/Models/Context.php b/app/Models/Context.php index 36c4087eb..c8a65063a 100644 --- a/app/Models/Context.php +++ b/app/Models/Context.php @@ -138,12 +138,12 @@ class FreshRSS_Context { switch($type) { case 'a': self::$current_get['all'] = true; - self::$name = _t('your_rss_feeds'); + self::$name = _t('index.feed.title'); self::$get_unread = self::$total_unread; break; case 's': self::$current_get['starred'] = true; - self::$name = _t('your_favorites'); + self::$name = _t('index.feed.title_fav'); self::$get_unread = self::$total_starred['unread']; // Update state if favorite is not yet enabled. @@ -265,4 +265,44 @@ class FreshRSS_Context { } } } + + /** + * Determine if the auto remove is available in the current context. + * This feature is available if: + * - it is activated in the configuration + * - the "read" state is not enable + * - the "unread" state is enable + * + * @return boolean + */ + public static function isAutoRemoveAvailable() { + if (!self::$conf->auto_remove_article) { + return false; + } + if (self::isStateEnabled(FreshRSS_Entry::STATE_READ)) { + return false; + } + if (!self::isStateEnabled(FreshRSS_Entry::STATE_NOT_READ)) { + return false; + } + return true; + } + + /** + * Determine if the "sticky post" option is enabled. It can be enable + * by the user when it is selected in the configuration page or by the + * application when the context allows to auto-remove articles when they + * are read. + * + * @return boolean + */ + public static function isStickyPostEnabled() { + if (self::$conf->sticky_post) { + return true; + } + if (self::isAutoRemoveAvailable()) { + return true; + } + return false; + } } diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php index 5d2909c62..4d06ac028 100644 --- a/app/Models/EntryDAO.php +++ b/app/Models/EntryDAO.php @@ -80,6 +80,16 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo { return -1; } + /** + * Toggle favorite marker on one or more article + * + * @todo simplify the query by removing the str_repeat. I am pretty sure + * there is an other way to do that. + * + * @param integer|array $ids + * @param boolean $is_favorite + * @return false|integer + */ public function markFavorite($ids, $is_favorite = true) { if (!is_array($ids)) { $ids = array($ids); @@ -99,6 +109,17 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo { } } + /** + * Update the unread article cache held on every feed details. + * Depending on the parameters, it updates the cache on one feed, on all + * feeds from one category or on all feeds. + * + * @todo It can use the query builder refactoring to build that query + * + * @param false|integer $catId category ID + * @param false|integer $feedId feed ID + * @return boolean + */ protected function updateCacheUnreads($catId = false, $feedId = false) { $sql = 'UPDATE `' . $this->prefix . 'feed` f ' . 'LEFT OUTER JOIN (' @@ -129,6 +150,19 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo { } } + /** + * Toggle the read marker on one or more article. + * Then the cache is updated. + * + * @todo change the way the query is build because it seems there is + * unnecessary code in here. For instance, the part with the str_repeat. + * @todo remove code duplication. It seems the code is basically the + * same if it is an array or not. + * + * @param integer|array $ids + * @param boolean $is_read + * @return integer affected rows + */ public function markRead($ids, $is_read = true) { if (is_array($ids)) { //Many IDs at once (used by API) if (count($ids) < 6) { //Speed heuristics @@ -172,6 +206,27 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo { } } + /** + * Mark all entries as read depending on parameters. + * If $onlyFavorites is true, it is used when the user mark as read in + * the favorite pseudo-category. + * If $priorityMin is greater than 0, it is used when the user mark as + * read in the main feed pseudo-category. + * Then the cache is updated. + * + * If $idMax equals 0, a deprecated debug message is logged + * + * @todo refactor this method along with markReadCat and markReadFeed + * since they are all doing the same thing. I think we need to build a + * tool to generate the query instead of having queries all over the + * place. It will be reused also for the filtering making every thing + * separated. + * + * @param integer $idMax fail safe article ID + * @param boolean $onlyFavorites + * @param integer $priorityMin + * @return integer affected rows + */ public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0) { if ($idMax == 0) { $idMax = time() . '000000'; @@ -200,6 +255,17 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo { return $affected; } + /** + * Mark all the articles in a category as read. + * There is a fail safe to prevent to mark as read articles that are + * loaded during the mark as read action. Then the cache is updated. + * + * If $idMax equals 0, a deprecated debug message is logged + * + * @param integer $id category ID + * @param integer $idMax fail safe article ID + * @return integer affected rows + */ public function markReadCat($id, $idMax = 0) { if ($idMax == 0) { $idMax = time() . '000000'; @@ -223,6 +289,17 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo { return $affected; } + /** + * Mark all the articles in a feed as read. + * There is a fail safe to prevent to mark as read articles that are + * loaded during the mark as read action. Then the cache is updated. + * + * If $idMax equals 0, a deprecated debug message is logged + * + * @param integer $id feed ID + * @param integer $idMax fail safe article ID + * @return integer affected rows + */ public function markReadFeed($id, $idMax = 0) { if ($idMax == 0) { $idMax = time() . '000000'; diff --git a/app/Models/EntryDAOSQLite.php b/app/Models/EntryDAOSQLite.php index 4a3fe24a2..bb1539e0c 100644 --- a/app/Models/EntryDAOSQLite.php +++ b/app/Models/EntryDAOSQLite.php @@ -31,6 +31,19 @@ class FreshRSS_EntryDAOSQLite extends FreshRSS_EntryDAO { } } + /** + * Toggle the read marker on one or more article. + * Then the cache is updated. + * + * @todo change the way the query is build because it seems there is + * unnecessary code in here. For instance, the part with the str_repeat. + * @todo remove code duplication. It seems the code is basically the + * same if it is an array or not. + * + * @param integer|array $ids + * @param boolean $is_read + * @return integer affected rows + */ public function markRead($ids, $is_read = true) { if (is_array($ids)) { //Many IDs at once (used by API) if (true) { //Speed heuristics //TODO: Not implemented yet for SQLite (so always call IDs one by one) @@ -69,6 +82,27 @@ class FreshRSS_EntryDAOSQLite extends FreshRSS_EntryDAO { } } + /** + * Mark all entries as read depending on parameters. + * If $onlyFavorites is true, it is used when the user mark as read in + * the favorite pseudo-category. + * If $priorityMin is greater than 0, it is used when the user mark as + * read in the main feed pseudo-category. + * Then the cache is updated. + * + * If $idMax equals 0, a deprecated debug message is logged + * + * @todo refactor this method along with markReadCat and markReadFeed + * since they are all doing the same thing. I think we need to build a + * tool to generate the query instead of having queries all over the + * place. It will be reused also for the filtering making every thing + * separated. + * + * @param integer $idMax fail safe article ID + * @param boolean $onlyFavorites + * @param integer $priorityMin + * @return integer affected rows + */ public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0) { if ($idMax == 0) { $idMax = time() . '000000'; @@ -95,6 +129,17 @@ class FreshRSS_EntryDAOSQLite extends FreshRSS_EntryDAO { return $affected; } + /** + * Mark all the articles in a category as read. + * There is a fail safe to prevent to mark as read articles that are + * loaded during the mark as read action. Then the cache is updated. + * + * If $idMax equals 0, a deprecated debug message is logged + * + * @param integer $id category ID + * @param integer $idMax fail safe article ID + * @return integer affected rows + */ public function markReadCat($id, $idMax = 0) { if ($idMax == 0) { $idMax = time() . '000000'; diff --git a/app/Models/Feed.php b/app/Models/Feed.php index bd1babeea..8f4b60097 100644 --- a/app/Models/Feed.php +++ b/app/Models/Feed.php @@ -210,6 +210,10 @@ class FreshRSS_Feed extends Minz_Model { $url = preg_replace('#((.+)://)(.+)#', '${1}' . $this->httpAuth . '@${3}', $url); } $feed = customSimplePie(); + if (substr($url, -11) === '#force_feed') { + $feed->force_feed(true); + $url = substr($url, 0, -11); + } $feed->set_feed_url($url); if (!$loadDetails) { //Only activates auto-discovery when adding a new feed $feed->set_autodiscovery_level(SIMPLEPIE_LOCATOR_NONE); @@ -226,7 +230,7 @@ class FreshRSS_Feed extends Minz_Model { $subscribe_url = $feed->subscribe_url(false); $title = strtr(html_only_entity_decode($feed->get_title()), array('<' => '<', '>' => '>', '"' => '"')); //HTML to HTML-PRE //ENT_COMPAT except & - $this->_name($title == '' ? $this->url : $title); + $this->_name($title == '' ? $url : $title); $this->_website(html_only_entity_decode($feed->get_link())); $this->_description(html_only_entity_decode($feed->get_description())); @@ -235,7 +239,7 @@ class FreshRSS_Feed extends Minz_Model { $subscribe_url = $feed->subscribe_url(true); } - if ($subscribe_url !== null && $subscribe_url !== $this->url) { + if ($subscribe_url !== null && $subscribe_url !== $url) { if ($this->httpAuth != '') { // on enlève les id si authentification HTTP $subscribe_url = preg_replace('#((.+)://)((.+)@)(.+)#', '${1}${5}', $subscribe_url); diff --git a/app/Models/StatsDAO.php b/app/Models/StatsDAO.php index 283d5dcb1..80caccc49 100644 --- a/app/Models/StatsDAO.php +++ b/app/Models/StatsDAO.php @@ -6,18 +6,36 @@ class FreshRSS_StatsDAO extends Minz_ModelPdo { /** * Calculates entry repartition for all feeds and for main stream. + * + * @return array + */ + public function calculateEntryRepartition() { + return array( + 'main_stream' => $this->calculateEntryRepartitionPerFeed(null, true), + 'all_feeds' => $this->calculateEntryRepartitionPerFeed(null, false), + ); + } + + /** + * Calculates entry repartition for the selection. * The repartition includes: * - total entries * - read entries * - unread entries * - favorite entries * - * @return type + * @param null|integer $feed feed id + * @param boolean $only_main + * @return array */ - public function calculateEntryRepartition() { - $repartition = array(); - - // Generates the repartition for the main stream of entry + public function calculateEntryRepartitionPerFeed($feed = null, $only_main = false) { + $filter = ''; + if ($only_main) { + $filter .= 'AND f.priority = 10'; + } + if (!is_null($feed)) { + $filter .= "AND e.id_feed = {$feed}"; + } $sql = <<<SQL SELECT COUNT(1) AS `total`, COUNT(1) - SUM(e.is_read) AS `unread`, @@ -26,27 +44,13 @@ SUM(e.is_favorite) AS `favorite` FROM {$this->prefix}entry AS e , {$this->prefix}feed AS f WHERE e.id_feed = f.id -AND f.priority = 10 -SQL; - $stm = $this->bd->prepare($sql); - $stm->execute(); - $res = $stm->fetchAll(PDO::FETCH_ASSOC); - $repartition['main_stream'] = $res[0]; - - // Generates the repartition for all entries - $sql = <<<SQL -SELECT COUNT(1) AS `total`, -COUNT(1) - SUM(e.is_read) AS `unread`, -SUM(e.is_read) AS `read`, -SUM(e.is_favorite) AS `favorite` -FROM {$this->prefix}entry AS e +{$filter} SQL; $stm = $this->bd->prepare($sql); $stm->execute(); $res = $stm->fetchAll(PDO::FETCH_ASSOC); - $repartition['all_feeds'] = $res[0]; - return $repartition; + return $res[0]; } /** @@ -147,10 +151,9 @@ SQL; * @return string */ protected function calculateEntryRepartitionPerFeedPerPeriod($period, $feed = null) { + $restrict = ''; if ($feed) { $restrict = "WHERE e.id_feed = {$feed}"; - } else { - $restrict = ''; } $sql = <<<SQL SELECT DATE_FORMAT(FROM_UNIXTIME(e.date), '{$period}') AS period @@ -179,7 +182,7 @@ SQL; * @return integer */ public function calculateEntryAveragePerFeedPerHour($feed = null) { - return $this->calculateEntryAveragePerFeedPerPeriod(1/24, $feed); + return $this->calculateEntryAveragePerFeedPerPeriod(1 / 24, $feed); } /** @@ -210,10 +213,9 @@ SQL; * @return integer */ protected function calculateEntryAveragePerFeedPerPeriod($period, $feed = null) { + $restrict = ''; if ($feed) { $restrict = "WHERE e.id_feed = {$feed}"; - } else { - $restrict = ''; } $sql = <<<SQL SELECT COUNT(1) AS count @@ -416,7 +418,7 @@ SQL; */ private function convertToTranslatedJson($data = array()) { $translated = array_map(function($a) { - return _t($a); + return _t('gen.date.' . $a); }, $data); return json_encode($translated); 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/en.php b/app/i18n/en.php deleted file mode 100644 index edf7e0921..000000000 --- a/app/i18n/en.php +++ /dev/null @@ -1,533 +0,0 @@ -<?php - return array ( - 'Apr' => '\\A\\p\\r\\i\\l', - 'Aug' => '\\A\\u\\g\\u\\s\\t', - 'Dec' => '\\D\\e\\c\\e\\m\\b\\e\\r', - 'Feb' => '\\F\\e\\b\\r\\u\\a\\r\\y', - 'Jan' => '\\J\\a\\n\\u\\a\\r\\y', - 'Jul' => '\\J\\u\\l\\y', - 'Jun' => '\\J\\u\\n\\e', - 'Mar' => '\\M\\a\\r\\c\\h', - 'May' => '\\M\\a\\y', - 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r', - 'Oct' => '\\O\\c\\t\\o\\b\\e\\r', - 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r', - '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', - 'admin.check_install.cache.nok' => 'Check permissions on <em>./data/cache</em> directory. HTTP server must have rights to write into', - 'admin.check_install.cache.ok' => 'Permissions on cache directory are good.', - 'admin.check_install.categories.nok' => 'Category table is bad configured.', - 'admin.check_install.categories.ok' => 'Category table is ok.', - 'admin.check_install.connection.nok' => 'Connection to the database cannot being established.', - 'admin.check_install.connection.ok' => 'Connection to the database is ok.', - 'admin.check_install.ctype.nok' => 'You lack a required library for character type checking (php-ctype).', - 'admin.check_install.ctype.ok' => 'You have the required library for character type checking (ctype).', - 'admin.check_install.curl.nok' => 'You lack cURL (php5-curl package).', - 'admin.check_install.curl.ok' => 'You have cURL extension.', - 'admin.check_install.data.nok' => 'Check permissions on <em>./data</em> directory. HTTP server must have rights to write into', - 'admin.check_install.data.ok' => 'Permissions on data directory are good.', - 'admin.check_install.database' => 'Database installation', - 'admin.check_install.dom.nok' => 'You lack a required library to browse the DOM (php-xml package).', - 'admin.check_install.dom.ok' => 'You have the required library to browse the DOM.', - 'admin.check_install.entries.nok' => 'Entry table is bad configured.', - 'admin.check_install.entries.ok' => 'Entry table is ok.', - 'admin.check_install.favicons.nok' => 'Check permissions on <em>./data/favicons</em> directory. HTTP server must have rights to write into', - 'admin.check_install.favicons.ok' => 'Permissions on favicons directory are good.', - 'admin.check_install.feeds.nok' => 'Feed table is bad configured.', - 'admin.check_install.feeds.ok' => 'Feed table is ok.', - 'admin.check_install.files' => 'File installation', - 'admin.check_install.json.nok' => 'You lack JSON (php5-json package).', - 'admin.check_install.json.ok' => 'You have JSON extension.', - 'admin.check_install.logs.nok' => 'Check permissions on <em>./data/logs</em> directory. HTTP server must have rights to write into', - 'admin.check_install.logs.ok' => 'Permissions on logs directory are good.', - 'admin.check_install.minz.nok' => 'You lack the Minz framework.', - 'admin.check_install.minz.ok' => 'You have the Minz framework.', - 'admin.check_install.pcre.nok' => 'You lack a required library for regular expressions (php-pcre).', - 'admin.check_install.pcre.ok' => 'You have the required library for regular expressions (PCRE).', - 'admin.check_install.pdo.nok' => 'You lack PDO or one of the supported drivers (pdo_mysql, pdo_sqlite).', - 'admin.check_install.pdo.ok' => 'You have PDO and at least one of the supported drivers (pdo_mysql, pdo_sqlite).', - 'admin.check_install.persona.nok' => 'Check permissions on <em>./data/persona</em> directory. HTTP server must have rights to write into', - 'admin.check_install.persona.ok' => 'Permissions on Mozilla Persona directory are good.', - 'admin.check_install.php' => 'PHP installation', - 'admin.check_install.php.nok' => 'Your PHP version is %s but FreshRSS requires at least version %s.', - 'admin.check_install.php.ok' => 'Your PHP version is %s, which is compatible with FreshRSS.', - 'admin.check_install.tables.nok' => 'There is one or more lacking tables in the database.', - 'admin.check_install.tables.ok' => 'Tables are existing in the database.', - 'admin.check_install.tokens.nok' => 'Check permissions on <em>./data/tokens</em> directory. HTTP server must have rights to write into', - 'admin.check_install.tokens.ok' => 'Permissions on tokens directory are good.', - 'admin.check_install.zip.nok' => 'You lack ZIP extension (php5-zip package).', - 'admin.check_install.zip.ok' => 'You have ZIP extension.', - 'admin.users.articles_and_size' => '%s articles (%s)', - 'administration' => 'Manage', - 'advanced' => 'Advanced', - 'after_onread' => 'After “mark all as read”,', - 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', - 'all_feeds' => 'All feeds', - 'allow_anonymous' => 'Allow anonymous reading of the articles of the default user (%s)', - 'allow_anonymous_refresh' => 'Allow anonymous refresh of the articles', - 'already_subscribed' => 'You have already subscribed to <em>%s</em>', - 'api_enabled' => 'Allow <abbr>API</abbr> access <small>(required for mobile apps)</small>', - 'apr' => 'apr', - 'april' => 'Apr', - 'archiving_configuration' => 'Archiving', - 'archiving_configuration_help' => 'More options are available in the individual stream settings', - 'article' => 'Article', - 'article_icons' => 'Article icons', - 'article_open_on_website' => 'when article is opened on its original website', - 'article_published_on' => 'This article originally appeared on <a href="%s">%s</a>', - 'article_published_on_author' => 'This article originally appeared on <a href="%s">%s</a> by %s', - 'article_viewed' => 'when article is viewed', - 'articles' => 'articles', - 'articles_per_page' => 'Number of articles per page', - 'articles_to_display' => 'Articles to display', - 'ask_empty' => 'Clear?', - 'attention' => 'Attention!', - 'aug' => 'aug', - 'august' => 'Aug', - '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_no_password_set' => 'Administrator password hasn’t been set. This feature isn’t available.', - 'auth_none' => 'None (dangerous)', - 'auth_not_persona' => 'Only Persona system can be reset.', - '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.', - 'author' => 'Author', - '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_conf_is_ko' => 'Verify your database information.', - 'bdd_conf_is_ok' => 'Database configuration has been saved.', - 'bdd_configuration' => 'Database configuration', - '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 <em>%s</em>', - 'by_default' => 'By default', - 'by_email' => 'By email', - 'by_feed' => 'by feed', - 'cache_is_ok' => 'Permissions on cache directory are good', - 'can_not_be_deleted' => 'Cannot be deleted', - 'cancel' => 'Cancel', - '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_no_id' => 'You must precise the id of the category.', - 'category_no_name' => 'Category name cannot be empty.', - 'category_not_delete_default' => 'You cannot delete the default category!', - 'category_not_exist' => 'The category does not exist!', - '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', - 'conf.users.articles_and_size' => '%s articles (%s)', - '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 will lose 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 <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> although FreshRSS doesn’t use this framework. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Icons</a> come from <a href="https://www.gnome.org/">GNOME project</a>. <em>Open Sans</em> font police has been created by <a href="https://www.google.com/webfonts/specimen/Open+Sans">Steve Matteson</a>. Favicons are collected with <a href="https://getfavicon.appspot.com/">getFavicon API</a>. FreshRSS is based on <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, 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' => 'dec', - 'december' => 'Dec', - 'default_category' => 'Uncategorized', - 'default_user' => 'Username of the default user <small>(maximum 16 alphanumeric characters)</small>', - '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', - 'do_not_change_if_doubt' => 'Don’t change if you doubt about it', - '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', - '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.<br /><kbd>%s?output=rss&token=%s</kbd>', - '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', - 'february' => 'Feb', - 'feed' => 'Feed', - 'feed_actualized' => '<em>%s</em> has been updated', - 'feed_added' => 'RSS feed <em>%s</em> 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' => '<em>%s</em> could not be added', - 'feed_updated' => 'Feed has been updated', - 'feed_url' => 'Feed URL', - 'feed_validator' => 'Check the validity of the feed', - 'feedback.login.error' => 'Login is invalid', - 'feedback.login.success' => 'You are connected', - 'feedback.logout.success' => 'You are disconnected', - 'feedback.user_profile.updated' => 'Your profile has been modified', - '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 <em>%s</em>.', - 'file_cannot_be_uploaded' => 'File cannot be uploaded!', - 'file_is_nok' => 'Check permissions on <em>%s</em> directory. HTTP server must have rights to write into', - 'file_to_import' => 'File to import<br />(OPML, Json or Zip)', - 'file_to_import_no_zip' => 'File to import<br />(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', - '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 <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> or <a href="http://projet.idleman.fr/leed/">Leed</a>. It is light and easy to take in hand while being powerful and configurable tool.', - 'freshrss_installation' => 'Installation · FreshRSS', - 'fri' => 'Fri', - 'g+' => 'Google+', - 'gen.menu.admin' => 'Administration', - 'gen.menu.authentication' => 'Authentication', - 'gen.menu.check_install' => 'Installation checking', - 'gen.menu.user_management' => 'Manage users', - 'gen.menu.user_profile' => 'Profile', - 'gen.title.authentication' => 'Authentication', - 'gen.title.check_install' => 'Installation checking', - 'gen.title.global_view' => 'Global view', - 'gen.title.user_management' => 'Manage users', - 'gen.title.user_profile' => 'Profile', - 'general_conf_is_ok' => 'General configuration has been saved.', - 'general_configuration' => 'General configuration', - 'github_or_email' => '<a href="https://github.com/marienfressinaud/FreshRSS/issues">on Github</a> or <a href="mailto:dev@marienfressinaud.fr">by mail</a>', - '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', - 'install_not_deleted' => 'Something went wrong; you must delete the file <em>%s</em> manually.', - 'installation_is_ok' => 'The installation process was successful.<br />The final step will now attempt to delete any file and database backup created during the update process.<br />You may choose to skip this step by deleting <kbd>./data/do-install.txt</kbd> manually.', - 'installation_step' => 'Installation — step %d · FreshRSS', - 'internal_problem_feed' => 'The RSS feed could not be added. <a href="%s">Check FressRSS logs</a> for details.', - 'invalid_login' => 'Login is invalid', - 'invalid_url' => 'URL <em>%s</em> is invalid', - 'is_admin' => 'is administrator', - 'jan' => 'jan', - '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' => 'jul', - 'july' => 'Jul', - 'jump_next' => 'jump to next unread sibling (feed or category)', - 'jun' => 'jun', - 'june' => 'Jun', - 'keep_history' => 'Minimum number of articles to keep', - 'keep_logged_in' => 'Keep me logged in <small>(1 month)</small>', - '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', - 'log_is_ok' => 'Permissions on logs directory are good', - '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', - 'main_stream' => 'Main stream', - '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' => 'May', - 'minz_is_nok' => 'You lack the Minz framework. You should execute <em>build.sh</em> script or <a href="https://github.com/marienfressinaud/MINZ">download it on Github</a> and install in <em>%s</em> directory the content of its <em>/lib</em> directory.', - 'minz_is_ok' => 'You have the Minz framework', - 'mon' => 'Mon', - 'month' => 'months', - 'more_information' => 'More information', - 'n_entries_deleted' => '%d articles have been deleted', - 'n_feeds_actualized' => '%d feeds have been updated', - 'new_article' => 'There are new available articles, click to refresh the page.', - 'new_category' => 'New category', - 'newer_first' => 'Newer first', - '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', - '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.', - 'normal_view' => 'Normal view', - 'not_read' => '%d unread', - 'not_reads' => '%d unread', - 'not_yet_implemented' => 'Not yet implemented', - '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!', - 'nov' => 'nov', - 'november' => 'Nov', - 'number_articles' => '%d articles', - 'number_divided_when_reader' => 'Divided by 2 in the reading view.', - 'number_feeds' => '%d feeds', - 'oct' => 'oct', - '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<br /><small>(e.g., for mobile apps)</small>', - 'password_form' => 'Password<br /><small>(for the Web-form login method)</small>', - '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<br /><small>(for <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>', - '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_feed_management' => 'RSS feeds management', - 'rss_feeds_of' => 'RSS feed of %s', - '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', - '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' => '+ <code>shift</code> 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.<br/>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 (average: %.2f messages)', - 'stats_entry_per_hour' => 'Per hour (average: %.2f messages)', - 'stats_entry_per_month' => 'Per month (average: %.2f messages)', - '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', - 'sub.categories.over_max' => 'You have reached your limit of categories (%d)', - 'sub.feeds.over_max' => 'You have reached your limit of feeds (%d)', - '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', - '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', - 'updated' => 'Modifications have been updated', - 'upon_reception' => 'upon reception of the article', - '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.', - 'username' => 'Username', - 'username_admin' => 'Administrator username', - 'users' => 'Users', - 'users_list' => 'List of users', - '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.', -); diff --git a/app/i18n/en/admin.php b/app/i18n/en/admin.php new file mode 100644 index 000000000..26af23225 --- /dev/null +++ b/app/i18n/en/admin.php @@ -0,0 +1,156 @@ +<?php + +return array( + 'auth' => array( + 'allow_anonymous' => 'Allow anonymous reading of the articles of the default user (%s)', + 'allow_anonymous_refresh' => 'Allow anonymous refresh of the articles', + 'api_enabled' => 'Allow <abbr>API</abbr> access <small>(required for mobile apps)</small>', + 'form' => 'Web form (traditional, requires JavaScript)', + 'http' => 'HTTP (for advanced users with HTTPS)', + 'none' => 'None (dangerous)', + 'persona' => 'Mozilla Persona (modern, requires JavaScript)', + 'title' => 'Authentication', + 'title_reset' => 'Authentication reset', + 'token' => 'Authentication token', + 'token_help' => 'Allows to access RSS output of the default user without authentication.<br /><kbd>%s?output=rss&token=%s</kbd>', + 'type' => 'Authentication method', + 'unsafe_autologin' => 'Allow unsafe automatic login using the format: ', + ), + 'check_install' => array( + 'cache' => array( + 'nok' => 'Check permissions on <em>./data/cache</em> directory. HTTP server must have rights to write into', + 'ok' => 'Permissions on cache directory are good.', + ), + 'categories' => array( + 'nok' => 'Category table is bad configured.', + 'ok' => 'Category table is ok.', + ), + 'connection' => array( + 'nok' => 'Connection to the database cannot being established.', + 'ok' => 'Connection to the database is ok.', + ), + 'ctype' => array( + 'nok' => 'You lack a required library for character type checking (php-ctype).', + 'ok' => 'You have the required library for character type checking (ctype).', + ), + 'curl' => array( + 'nok' => 'You lack cURL (php5-curl package).', + 'ok' => 'You have cURL extension.', + ), + 'data' => array( + 'nok' => 'Check permissions on <em>./data</em> directory. HTTP server must have rights to write into', + 'ok' => 'Permissions on data directory are good.', + ), + 'database' => 'Database installation', + 'dom' => array( + 'nok' => 'You lack a required library to browse the DOM (php-xml package).', + 'ok' => 'You have the required library to browse the DOM.', + ), + 'entries' => array( + 'nok' => 'Entry table is bad configured.', + 'ok' => 'Entry table is ok.', + ), + 'favicons' => array( + 'nok' => 'Check permissions on <em>./data/favicons</em> directory. HTTP server must have rights to write into', + 'ok' => 'Permissions on favicons directory are good.', + ), + 'feeds' => array( + 'nok' => 'Feed table is bad configured.', + 'ok' => 'Feed table is ok.', + ), + 'files' => 'File installation', + 'json' => array( + 'nok' => 'You lack JSON (php5-json package).', + 'ok' => 'You have JSON extension.', + ), + 'logs' => array( + 'nok' => 'Check permissions on <em>./data/logs</em> 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.', + ), + 'pcre' => array( + 'nok' => 'You lack a required library for regular expressions (php-pcre).', + 'ok' => 'You have the required library for regular expressions (PCRE).', + ), + 'pdo' => array( + 'nok' => 'You lack PDO or one of the supported drivers (pdo_mysql, pdo_sqlite).', + 'ok' => 'You have PDO and at least one of the supported drivers (pdo_mysql, pdo_sqlite).', + ), + 'persona' => array( + 'nok' => 'Check permissions on <em>./data/persona</em> directory. HTTP server must have rights to write into', + 'ok' => 'Permissions on Mozilla Persona directory are good.', + ), + 'php' => array( + '_' => 'PHP installation', + 'nok' => 'Your PHP version is %s but FreshRSS requires at least version %s.', + 'ok' => 'Your PHP version is %s, which is compatible with FreshRSS.', + ), + 'tables' => array( + 'nok' => 'There is one or more lacking tables in the database.', + 'ok' => 'Tables are existing in the database.', + ), + 'title' => 'Installation checking', + 'tokens' => array( + 'nok' => 'Check permissions on <em>./data/tokens</em> directory. HTTP server must have rights to write into', + 'ok' => 'Permissions on tokens directory are good.', + ), + 'zip' => array( + 'nok' => 'You lack ZIP extension (php5-zip package).', + 'ok' => 'You have ZIP extension.', + ), + ), + 'stats' => array( + '_' => 'Statistics', + 'all_feeds' => 'All feeds', + 'category' => 'Category', + 'entry_count' => 'Entry count', + 'entry_per_category' => 'Entries per category', + 'entry_per_day' => 'Entries per day (last 30 days)', + 'entry_per_day_of_week' => 'Per day of week (average: %.2f messages)', + 'entry_per_hour' => 'Per hour (average: %.2f messages)', + 'entry_per_month' => 'Per month (average: %.2f messages)', + 'entry_repartition' => 'Entries repartition', + 'feed' => 'Feed', + 'feed_per_category' => 'Feeds per category', + 'idle' => 'Idle feeds', + 'main' => 'Main statistics', + 'main_stream' => 'Main stream', + 'menu' => array( + 'idle' => 'Idle feeds', + 'main' => 'Main statistics', + 'repartition' => 'Articles repartition', + ), + 'no_idle' => 'There is no idle feed!', + 'number_entries' => '%d articles', + 'percent_of_total' => '%% of total', + 'repartition' => 'Articles repartition', + 'status_favorites' => 'Favourites', + 'status_read' => 'Read', + 'status_total' => 'Total', + 'status_unread' => 'Unread', + 'title' => 'Statistics', + 'top_feed' => 'Top ten feeds', + ), + 'update' => array( + '_' => 'Update system', + 'apply' => 'Apply', + 'check' => 'Check for new updates', + 'last' => 'Last verification: %s', + 'none' => 'No update to apply', + 'title' => 'Update system', + ), + 'user' => array( + 'articles_and_size' => '%s articles (%s)', + 'create' => 'Create new user', + 'email_persona' => 'Login mail address<br /><small>(for <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>', + 'language' => 'Language', + 'password_form' => 'Password<br /><small>(for the Web-form login method)</small>', + 'title' => 'Manage users', + 'user_list' => 'List of users', + 'username' => 'Username', + 'users' => 'Users', + ), +); diff --git a/app/i18n/en/conf.php b/app/i18n/en/conf.php new file mode 100644 index 000000000..13efb650b --- /dev/null +++ b/app/i18n/en/conf.php @@ -0,0 +1,168 @@ +<?php + +return array( + 'archiving' => array( + '_' => 'Archiving', + 'advanced' => 'Advanced', + 'delete_after' => 'Remove articles after', + 'help' => 'More options are available in the individual stream settings', + 'keep_history_by_feed' => 'Minimum number of articles to keep by feed', + 'optimize' => 'Optimize database', + 'optimize_help' => 'To do occasionally to reduce the size of the database', + 'purge_now' => 'Purge now', + 'title' => 'Archiving', + 'ttl' => 'Do not automatically refresh more often than', + ), + 'display' => array( + '_' => 'Display', + 'icon' => array( + 'bottom_line' => 'Bottom line', + 'entry' => 'Article icons', + 'publication_date' => 'Date of publication', + 'related_tags' => 'Related tags', + 'sharing' => 'Sharing', + 'top_line' => 'Top line', + ), + 'language' => 'Language', + 'notif_html5' => array( + 'seconds' => 'seconds (0 means no timeout)', + 'timeout' => 'HTML5 notification timeout', + ), + 'theme' => 'Theme', + 'title' => 'Display', + 'width' => array( + 'content' => 'Content width', + 'large' => 'Large', + 'medium' => 'Medium', + 'no_limit' => 'No limit', + 'thin' => 'Thin', + ), + ), + 'query' => array( + '_' => 'User queries', + 'deprecated' => 'This query is no longer valid. The referenced category or feed has been deleted.', + 'filter' => 'Filter applied:', + 'get_all' => 'Display all articles', + 'get_category' => 'Display "%s" category', + 'get_favorite' => 'Display favorite articles', + 'get_feed' => 'Display "%s" feed', + 'no_filter' => 'No filter', + 'none' => 'You haven’t created any user query yet.', + 'number' => 'Query n°%d', + 'order_asc' => 'Display oldest articles first', + 'order_desc' => 'Display newest articles first', + 'search' => 'Search for "%s"', + 'state_0' => 'Display all articles', + 'state_1' => 'Display read articles', + 'state_2' => 'Display unread articles', + 'state_3' => 'Display all articles', + 'state_4' => 'Display favorite articles', + 'state_5' => 'Display read favorite articles', + 'state_6' => 'Display unread favorite articles', + 'state_7' => 'Display favorite articles', + 'state_8' => 'Display not favorite articles', + 'state_9' => 'Display read not favorite articles', + 'state_10' => 'Display unread not favorite articles', + 'state_11' => 'Display not favorite articles', + 'state_12' => 'Display all articles', + 'state_13' => 'Display read articles', + 'state_14' => 'Display unread articles', + 'state_15' => 'Display all articles', + 'title' => 'User queries', + ), + 'profile' => array( + '_' => 'Profile management', + 'email_persona' => 'Login mail address<br /><small>(for <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>', + 'password_api' => 'Password API<br /><small>(e.g., for mobile apps)</small>', + 'password_form' => 'Password<br /><small>(for the Web-form login method)</small>', + 'title' => 'Profile', + ), + 'reading' => array( + '_' => 'Reading', + 'after_onread' => 'After “mark all as read”,', + 'articles_per_page' => 'Number of articles per page', + 'auto_load_more' => 'Load next articles at the page bottom', + 'auto_remove_article' => 'Hide articles after reading', + 'confirm_enabled' => 'Display a confirmation dialog on “mark all as read” actions', + '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)', + 'img_with_lazyload' => 'Use "lazy load" mode to load pictures', + 'jump_next' => 'jump to next unread sibling (feed or category)', + 'number_divided_when_reader' => 'Divided by 2 in the reading view.', + 'read' => array( + 'article_open_on_website' => 'when article is opened on its original website', + 'article_viewed' => 'when article is viewed', + 'scroll' => 'while scrolling', + 'upon_reception' => 'upon reception of the article', + 'when' => 'Mark article as read…', + ), + 'show' => array( + '_' => 'Articles to display', + 'adaptive' => 'Adjust showing', + 'all_articles' => 'Show all articles', + 'unread' => 'Show only unread', + ), + 'sort' => array( + '_' => 'Sort order', + 'newer_first' => 'Newer first', + 'older_first' => 'Oldest first', + ), + 'sticky_post' => 'Stick the article to the top when opened', + 'title' => 'Reading', + 'view' => array( + 'default' => 'Default view', + 'global' => 'Global view', + 'normal' => 'Normal view', + 'reader' => 'Reading view', + ), + ), + 'sharing' => array( + '_' => 'Sharing', + 'blogotext' => 'Blogotext', + 'diaspora' => 'Diaspora*', + 'email' => 'Email', + 'facebook' => 'Facebook', + 'g+' => 'Google+', + 'more_information' => 'More information', + 'print' => 'Print', + 'shaarli' => 'Shaarli', + 'share_name' => 'Share name to display', + 'share_url' => 'Share URL to use', + 'title' => 'Sharing', + 'twitter' => 'Twitter', + 'wallabag' => 'wallabag', + ), + 'shortcut' => array( + '_' => 'Shortcuts', + 'article_action' => 'Article actions', + 'auto_share' => 'Share', + 'auto_share_help' => 'If there is only one sharing mode, it is used. Else modes are accessible by their number.', + 'close_dropdown' => 'Close menus', + 'collapse_article' => 'Collapse', + 'first_article' => 'Skip to the first article', + 'focus_search' => 'Access search box', + 'help' => 'Display documentation', + 'javascript' => 'JavaScript must be enabled in order to use shortcuts', + 'last_article' => 'Skip to the last article', + 'load_more' => 'Load more articles', + 'mark_read' => 'Mark as read', + 'mark_favorite' => 'Mark as favourite', + 'navigation' => 'Navigation', + 'navigation_help' => 'With the "Shift" modifier, navigation shortcuts apply on feeds.<br/>With the "Alt" modifier, navigation shortcuts apply on categories.', + 'next_article' => 'Skip to the next article', + 'other_action' => 'Other actions', + 'previous_article' => 'Skip to the previous article', + 'see_on_website' => 'See on original website', + 'shift_for_all_read' => '+ <code>shift</code> to mark all articles as read', + 'title' => 'Shortcuts', + '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.', + ), + 'user' => array( + 'articles_and_size' => '%s articles (%s)', + 'current' => 'Current user', + 'is_admin' => 'is administrator', + 'users' => 'Users', + ), +); diff --git a/app/i18n/en/feedback.php b/app/i18n/en/feedback.php new file mode 100644 index 000000000..8df83ac0a --- /dev/null +++ b/app/i18n/en/feedback.php @@ -0,0 +1,96 @@ +<?php + +return array( + 'admin' => array( + 'optimization_complete' => 'Optimization complete', + ), + 'access' => array( + 'denied' => 'You don’t have permission to access this page', + 'not_found' => 'You are looking for a page which doesn’t exist', + ), + 'auth' => array( + 'form' => array( + 'not_set' => 'A problem occured during authentication system configuration. Please retry later.', + 'set' => 'Form is now your default authentication system.', + ), + 'login' => array( + 'invalid' => 'Login is invalid', + 'success' => 'You are connected', + ), + 'logout' => array( + 'success' => 'You are disconnected', + ), + 'no_password_set' => 'Administrator password hasn’t been set. This feature isn’t available.', + 'not_persona' => 'Only Persona system can be reset.', + ), + 'conf' => array( + 'error' => 'An error occurred during configuration saving', + 'query_created' => 'Query "%s" has been created.', + 'shortcuts_updated' => 'Shortcuts have been updated', + 'updated' => 'Configuration has been updated', + ), + 'import_export' => array( + 'export_no_zip_extension' => 'Zip extension is not present on your server. Please try to export files one by one.', + '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', + 'file_cannot_be_uploaded' => 'File cannot be uploaded!', + 'no_zip_extension' => 'Zip extension is not present on your server.', + 'zip_error' => 'An error occured during Zip import.', + ), + 'sub' => array( + 'actualize' => 'Actualize', + 'category' => array( + 'created' => 'Category %s has been created.', + 'deleted' => 'Category has been deleted.', + 'emptied' => 'Category has been emptied', + 'error' => 'Category cannot be updated', + 'name_exists' => 'Category name already exists.', + 'no_id' => 'You must precise the id of the category.', + 'no_name' => 'Category name cannot be empty.', + 'not_delete_default' => 'You cannot delete the default category!', + 'not_exist' => 'The category does not exist!', + 'over_max' => 'You have reached your limit of categories (%d)', + 'updated' => 'Category has been updated.', + ), + 'feed' => array( + 'actualized' => '<em>%s</em> has been updated', + 'actualizeds' => 'RSS feeds have been updated', + 'added' => 'RSS feed <em>%s</em> has been added', + 'already_subscribed' => 'You have already subscribed to <em>%s</em>', + 'deleted' => 'Feed has been deleted', + 'error' => 'Feed cannot be updated', + 'internal_problem_feed' => 'The RSS feed could not be added. <a href="%s">Check FressRSS logs</a> for details.', + 'invalid_url' => 'URL <em>%s</em> is invalid', + 'marked_read' => 'Feeds have been marked as read', + 'n_actualized' => '%d feeds have been updated', + 'n_entries_deleted' => '%d articles have been deleted', + 'no_refresh' => 'There is no feed to refresh…', + 'not_added' => '<em>%s</em> could not be added', + 'over_max' => 'You have reached your limit of feeds (%d)', + 'updated' => 'Feed has been updated', + ), + 'purge_completed' => 'Purge completed (%d articles deleted)', + ), + 'update' => array( + 'can_apply' => 'An update is available.', + 'error' => 'The update process has encountered an error: %s', + 'file_is_nok' => 'Check permissions on <em>%s</em> directory. HTTP server must have rights to write into', + 'finished' => 'Update completed!', + 'none' => 'No update to apply', + 'server_not_found' => 'Update server cannot be found. [%s]', + ), + 'user' => array( + 'created' => array( + '_' => 'User %s has been created', + 'error' => 'User %s cannot be created', + ), + 'deleted' => array( + '_' => 'User %s has been deleted', + 'error' => 'User %s cannot be deleted', + ), + ), + 'profile' => array( + 'error' => 'Your profile cannot be modified', + 'updated' => 'Your profile has been modified', + ), +); diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php new file mode 100644 index 000000000..43f94f1bc --- /dev/null +++ b/app/i18n/en/gen.php @@ -0,0 +1,143 @@ +<?php + +return array( + 'action' => array( + 'actualize' => 'Actualize', + 'back_to_rss_feeds' => '← Go back to your RSS feeds', + 'cancel' => 'Cancel', + 'create' => 'Create', + 'disable' => 'Disable', + 'empty' => 'Empty', + 'enable' => 'Enable', + 'export' => 'Export', + 'filter' => 'Filtrer', + 'import' => 'Import', + 'manage' => 'Manage', + 'mark_read' => 'Mark as read', + 'mark_favorite' => 'Mark as favourite', + 'remove' => 'Remove', + 'see_website' => 'See website', + 'submit' => 'Submit', + 'truncate' => 'Delete all articles', + ), + 'auth' => array( + 'keep_logged_in' => 'Keep me logged in <small>(1 month)</small>', + 'login' => 'Login', + 'login_persona' => 'Login with Persona', + 'login_persona_problem' => 'Connection problem with Persona?', + 'logout' => 'Logout', + 'password' => 'Password', + 'reset' => 'Authentication reset', + 'username' => 'Username', + 'username_admin' => 'Administrator username', + 'will_reset' => 'Authentication system will be reset: a form will be used instead of Persona.', + ), + 'date' => array( + 'Apr' => '\\A\\p\\r\\i\\l', + 'Aug' => '\\A\\u\\g\\u\\s\\t', + 'Dec' => '\\D\\e\\c\\e\\m\\b\\e\\r', + 'Feb' => '\\F\\e\\b\\r\\u\\a\\r\\y', + 'Jan' => '\\J\\a\\n\\u\\a\\r\\y', + 'Jul' => '\\J\\u\\l\\y', + 'Jun' => '\\J\\u\\n\\e', + 'Mar' => '\\M\\a\\r\\c\\h', + 'May' => '\\M\\a\\y', + 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r', + 'Oct' => '\\O\\c\\t\\o\\b\\e\\r', + 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r', + 'apr' => 'apr', + 'april' => 'Apr', + 'aug' => 'aug', + 'august' => 'Aug', + 'before_yesterday' => 'Before yesterday', + 'dec' => 'dec', + 'december' => 'Dec', + 'feb' => 'feb', + 'february' => 'Feb', + 'format_date' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y', + 'format_date_hour' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y \\a\\t H\\:i', + 'fri' => 'Fri', + 'jan' => 'jan', + 'january' => 'Jan', + 'jul' => 'jul', + 'july' => 'Jul', + 'jun' => 'jun', + 'june' => 'Jun', + 'last_3_month' => 'Last three months', + 'last_6_month' => 'Last six months', + 'last_month' => 'Last month', + 'last_week' => 'Last week', + 'last_year' => 'Last year', + 'mar' => 'mar', + 'march' => 'Mar', + 'may' => 'May', + 'mon' => 'Mon', + 'month' => 'months', + 'nov' => 'nov', + 'november' => 'Nov', + 'oct' => 'oct', + 'october' => 'Oct', + 'sat' => 'Sat', + 'sep' => 'sep', + 'september' => 'Sep', + 'sun' => 'Sun', + 'thu' => 'Thu', + 'today' => 'Today', + 'tue' => 'Tue', + 'wed' => 'Wed', + 'yesterday' => 'Yesterday', + ), + 'freshrss' => array( + '_' => 'FreshRSS', + 'about' => 'About FreshRSS', + ), + 'js' => array( + 'category_empty' => 'Empty category', + '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 will lose related favorites and user queries. It cannot be cancelled!', + 'new_article' => 'There are new available articles, click to refresh the page.', + 'notif_body_new_articles' => 'There are \\d new articles to read on FreshRSS.', + 'notif_title_new_articles' => 'FreshRSS: new articles!', + 'should_be_activated' => 'JavaScript must be enabled', + ), + 'menu' => array( + 'about' => 'About', + 'admin' => 'Administration', + 'archiving' => 'Archiving', + 'authentication' => 'Authentication', + 'check_install' => 'Installation checking', + 'configuration' => 'Configuration', + 'display' => 'Display', + 'logs' => 'Logs', + 'queries' => 'User queries', + 'reading' => 'Reading', + 'search' => 'Search words or #tags', + 'sharing' => 'Sharing', + 'shortcuts' => 'Shortcuts', + 'stats' => 'Statistics', + 'update' => 'Update', + 'user_management' => 'Manage users', + 'user_profile' => 'Profile', + ), + 'pagination' => array( + 'first' => 'First', + 'last' => 'Last', + 'load_more' => 'Load more articles', + 'mark_all_read' => 'Mark all as read', + 'next' => 'Next', + 'nothing_to_load' => 'There are no more articles', + 'previous' => 'Previous', + ), + 'short' => array( + 'attention' => 'Attention!', + 'blank_to_disable' => 'Leave blank to disable', + 'by_author' => 'By <em>%s</em>', + 'by_default' => 'By default', + 'damn' => 'Damn!', + 'default_category' => 'Uncategorized', + 'no' => 'No', + 'ok' => 'Ok!', + 'or' => 'or', + 'yes' => 'Yes', + ), +); diff --git a/app/i18n/en/index.php b/app/i18n/en/index.php new file mode 100644 index 000000000..941388b68 --- /dev/null +++ b/app/i18n/en/index.php @@ -0,0 +1,73 @@ +<?php + +return array( + 'about' => array( + '_' => 'About', + 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', + 'bugs_reports' => 'Bugs reports', + 'credits' => 'Credits', + 'credits_content' => 'Some design elements come from <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> although FreshRSS doesn’t use this framework. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Icons</a> come from <a href="https://www.gnome.org/">GNOME project</a>. <em>Open Sans</em> font police has been created by <a href="https://www.google.com/webfonts/specimen/Open+Sans">Steve Matteson</a>. Favicons are collected with <a href="https://getfavicon.appspot.com/">getFavicon API</a>. FreshRSS is based on <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, a PHP framework.', + 'freshrss_description' => 'FreshRSS is a RSS feeds aggregator to self-host like <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> or <a href="http://projet.idleman.fr/leed/">Leed</a>. It is light and easy to take in hand while being powerful and configurable tool.', + 'github_or_email' => '<a href="https://github.com/marienfressinaud/FreshRSS/issues">on Github</a> or <a href="mailto:dev@marienfressinaud.fr">by mail</a>', + 'lead_developer' => 'Lead developer', + 'license' => 'License', + 'project_website' => 'Project website', + 'title' => 'About', + 'version' => 'Version', + 'website' => 'Website', + ), + 'feed' => array( + 'add' => 'You may add some feeds.', + 'empty' => 'There is no article to show.', + 'rss_of' => 'RSS feed of %s', + 'title' => 'Your RSS feeds', + 'title_global' => 'Global view', + 'title_fav' => 'Your favourites', + ), + 'log' => array( + '_' => 'Logs', + 'clear' => 'Clear the logs', + 'empty' => 'Log file is empty', + 'title' => 'Logs', + ), + 'menu' => array( + 'about' => 'About FreshRSS', + 'add_query' => 'Add a query', + 'before_one_day' => 'Before one day', + 'before_one_week' => 'Before one week', + 'favorites' => 'Favourites (%s)', + 'global_view' => 'Global view', + 'main_stream' => 'Main stream', + 'mark_all_read' => 'Mark all as read', + 'mark_cat_read' => 'Mark category as read', + 'mark_feed_read' => 'Mark feed as read', + 'newer_first' => 'Newer first', + 'non-starred' => 'Show all but favorites', + 'normal_view' => 'Normal view', + 'older_first' => 'Oldest first', + 'queries' => 'User queries', + 'read' => 'Show only read', + 'reader_view' => 'Reading view', + 'rss_view' => 'RSS feed', + 'search_short' => 'Search', + 'starred' => 'Show only favorites', + 'stats' => 'Statistics', + 'subscription' => 'Subscriptions management', + 'unread' => 'Show only unread', + ), + 'share' => array( + '_' => 'Share', + 'blogotext' => 'Blogotext', + 'diaspora' => 'Diaspora*', + 'email' => 'Email', + 'facebook' => 'Facebook', + 'g+' => 'Google+', + 'print' => 'Print', + 'shaarli' => 'Shaarli', + 'twitter' => 'Twitter', + 'wallabag' => 'wallabag', + ), + 'tag' => array( + 'related' => 'Related tags', + ), +); diff --git a/app/i18n/en/install.php b/app/i18n/en/install.php new file mode 100644 index 000000000..ed3210190 --- /dev/null +++ b/app/i18n/en/install.php @@ -0,0 +1,105 @@ +<?php + +return array( + 'action' => array( + 'finish' => 'Complete installation', + 'next_step' => 'Go to the next step', + ), + 'auth' => array( + 'email_persona' => 'Login mail address<br /><small>(for <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>', + 'form' => 'Web form (traditional, requires JavaScript)', + 'http' => 'HTTP (for advanced users with HTTPS)', + 'none' => 'None (dangerous)', + 'password_form' => 'Password<br /><small>(for the Web-form login method)</small>', + 'persona' => 'Mozilla Persona (modern, requires JavaScript)', + 'type' => 'Authentication method', + ), + 'bdd' => array( + '_' => 'Database', + 'conf' => array( + '_' => 'Database configuration', + 'ko' => 'Verify your database information.', + 'ok' => 'Database configuration has been saved.', + ), + 'host' => 'Host', + 'prefix' => 'Table prefix', + 'password' => 'HTTP password', + 'type' => 'Type of database', + 'username' => 'HTTP username', + ), + 'check' => array( + '_' => 'Checks', + 'cache' => array( + 'nok' => 'Check permissions on <em>./data/cache</em> directory. HTTP server must have rights to write into', + 'ok' => 'Permissions on cache directory are good.', + ), + 'ctype' => array( + 'nok' => 'You lack a required library for character type checking (php-ctype).', + 'ok' => 'You have the required library for character type checking (ctype).', + ), + 'curl' => array( + 'nok' => 'You lack cURL (php5-curl package).', + 'ok' => 'You have cURL extension.', + ), + 'data' => array( + 'nok' => 'Check permissions on <em>./data</em> directory. HTTP server must have rights to write into', + 'ok' => 'Permissions on data directory are good.', + ), + 'dom' => array( + 'nok' => 'You lack a required library to browse the DOM (php-xml package).', + 'ok' => 'You have the required library to browse the DOM.', + ), + 'favicons' => array( + 'nok' => 'Check permissions on <em>./data/favicons</em> directory. HTTP server must have rights to write into', + 'ok' => 'Permissions on favicons directory are good.', + ), + 'http_referer' => 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 <em>./data/logs</em> 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.', + ), + 'pcre' => array( + 'nok' => 'You lack a required library for regular expressions (php-pcre).', + 'ok' => 'You have the required library for regular expressions (PCRE).', + ), + 'pdo' => array( + 'nok' => 'You lack PDO or one of the supported drivers (pdo_mysql, pdo_sqlite).', + 'ok' => 'You have PDO and at least one of the supported drivers (pdo_mysql, pdo_sqlite).', + ), + 'persona' => array( + 'nok' => 'Check permissions on <em>./data/persona</em> directory. HTTP server must have rights to write into', + 'ok' => 'Permissions on Mozilla Persona directory are good.', + ), + 'php' => 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.', + ), + ), + 'conf' => array( + '_' => 'General configuration', + 'ok' => 'General configuration has been saved.', + ), + 'congratulations' => 'Congratulations!', + 'default_user' => 'Username of the default user <small>(maximum 16 alphanumeric characters)</small>', + 'delete_articles_after' => 'Remove articles after', + 'fix_errors_before' => 'Fix errors before skip to the next step.', + 'javascript_is_better' => 'FreshRSS is more pleasant with JavaScript enabled', + 'language' => array( + '_' => 'Language', + 'choose' => 'Choose a language for FreshRSS', + 'defined' => 'Language has been defined.', + ), + 'not_deleted' => 'Something went wrong; you must delete the file <em>%s</em> manually.', + 'ok' => 'The installation process was successful.', + 'step' => 'step %d', + 'steps' => 'Steps', + 'title' => 'Installation · FreshRSS', + 'this_is_the_end' => 'This is the end', +); diff --git a/app/i18n/en/sub.php b/app/i18n/en/sub.php new file mode 100644 index 000000000..2b62e4775 --- /dev/null +++ b/app/i18n/en/sub.php @@ -0,0 +1,61 @@ +<?php + +return array( + 'category' => array( + '_' => 'Category', + 'add' => 'Add a category', + 'empty' => 'Empty category', + 'new' => 'New category', + ), + 'feed' => array( + 'add' => 'Add a RSS feed', + 'advanced' => 'Advanced', + 'archiving' => 'Archivage', + 'auth' => array( + 'configuration' => 'Login', + 'help' => 'Connection allows to access HTTP protected RSS feeds', + 'http' => 'HTTP Authentication', + 'password' => 'HTTP password', + 'username' => 'HTTP username', + ), + 'css_help' => 'Retrieves truncated RSS feeds (attention, requires more time!)', + 'css_path' => 'Articles CSS path on original website', + 'description' => 'Description', + 'empty' => 'This feed is empty. Please verify that it is still maintained.', + 'error' => 'This feed has encountered a problem. Please verify that it is always reachable then actualize it.', + 'in_main_stream' => 'Show in main stream', + 'informations' => 'Information', + 'keep_history' => 'Minimum number of articles to keep', + 'moved_category_deleted' => 'When you delete a category, their feeds are automatically classified under <em>%s</em>.', + 'no_selected' => 'No feed selected.', + 'number_entries' => '%d articles', + 'stats' => 'Statistics', + 'think_to_add' => 'You may add some feeds.', + 'title' => 'Title', + 'title_add' => 'Add a RSS feed', + 'ttl' => 'Do not automatically refresh more often than', + 'url' => 'Feed URL', + 'validator' => 'Check the validity of the feed', + 'website' => 'Website URL', + ), + 'import_export' => array( + 'export' => 'Export', + 'export_opml' => 'Export list of feeds (OPML)', + 'export_starred' => 'Export your favourites', + 'feed_list' => 'List of %s articles', + 'file_to_import' => 'File to import<br />(OPML, Json or Zip)', + 'file_to_import_no_zip' => 'File to import<br />(OPML or Json)', + 'import' => 'Import', + 'starred_list' => 'List of favourite articles', + 'title' => 'Import / export', + ), + 'menu' => array( + 'bookmark' => 'Subscribe (FreshRSS bookmark)', + 'import_export' => 'Import / export', + 'subscription_management' => 'Subscriptions management', + ), + 'title' => array( + '_' => 'Subscriptions management', + 'feed_management' => 'RSS feeds management', + ), +); diff --git a/app/i18n/fr.php b/app/i18n/fr.php deleted file mode 100644 index 3ba8574b2..000000000 --- a/app/i18n/fr.php +++ /dev/null @@ -1,533 +0,0 @@ -<?php - return array ( - 'Apr' => '\\a\\v\\r\\i\\l', - 'Aug' => '\\a\\o\\û\\t', - 'Dec' => '\\d\\é\\c\\e\\m\\b\\r\\e', - 'Feb' => '\\f\\é\\v\\r\\i\\e\\r', - 'Jan' => '\\j\\a\\n\\v\\i\\e\\r', - 'Jul' => '\\j\\u\\i\\l\\l\\e\\t', - 'Jun' => '\\j\\u\\i\\n', - 'Mar' => '\\m\\a\\r\\s', - 'May' => '\\m\\a\\i', - 'Nov' => '\\n\\o\\v\\e\\m\\b\\r\\e', - 'Oct' => '\\o\\c\\t\\o\\b\\r\\e', - 'Sep' => '\\s\\e\\p\\t\\e\\m\\b\\r\\e', - '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', - 'admin.check_install.cache.nok' => 'Veuillez vérifier les droits sur le répertoire <em>./data/cache</em>. Le serveur HTTP doit être capable d’écrire dedans', - 'admin.check_install.cache.ok' => 'Les droits sur le répertoire de cache sont bons.', - 'admin.check_install.categories.nok' => 'La table category est mal configurée.', - 'admin.check_install.categories.ok' => 'La table category est bien configurée.', - 'admin.check_install.connection.nok' => 'La connexion à la base de données est impossible.', - 'admin.check_install.connection.ok' => 'La connexion à la base de données est bonne.', - 'admin.check_install.ctype.nok' => 'Il manque une librairie pour la vérification des types de caractères (php-ctype).', - 'admin.check_install.ctype.ok' => 'Vous disposez du nécessaire pour la vérification des types de caractères (ctype).', - 'admin.check_install.curl.nok' => 'Vous ne disposez pas de cURL (paquet php5-curl).', - 'admin.check_install.curl.ok' => 'Vous disposez de cURL.', - 'admin.check_install.data.nok' => 'Veuillez vérifier les droits sur le répertoire <em>./data</em>. Le serveur HTTP doit être capable d’écrire dedans', - 'admin.check_install.data.ok' => 'Les droits sur le répertoire de data sont bons.', - 'admin.check_install.database' => 'Installation de la base de données', - 'admin.check_install.dom.nok' => 'Il manque une librairie pour parcourir le DOM (paquet php-xml).', - 'admin.check_install.dom.ok' => 'Vous disposez du nécessaire pour parcourir le DOM.', - 'admin.check_install.entries.nok' => 'La table entry est mal configurée.', - 'admin.check_install.entries.ok' => 'La table entry est bien configurée.', - 'admin.check_install.favicons.nok' => 'Veuillez vérifier les droits sur le répertoire <em>./data/favicons</em>. Le serveur HTTP doit être capable d’écrire dedans', - 'admin.check_install.favicons.ok' => 'Les droits sur le répertoire des favicons sont bons.', - 'admin.check_install.feeds.nok' => 'La table feed est mal configurée.', - 'admin.check_install.feeds.ok' => 'La table feed est bien configurée.', - 'admin.check_install.files' => 'Installation des fichiers', - 'admin.check_install.json.nok' => 'Vous ne disposez pas de JSON (paquet php5-json).', - 'admin.check_install.json.ok' => 'Vous disposez de l\'extension JSON.', - 'admin.check_install.logs.nok' => 'Veuillez vérifier les droits sur le répertoire <em>./data/logs</em>. Le serveur HTTP doit être capable d’écrire dedans', - 'admin.check_install.logs.ok' => 'Les droits sur le répertoire des logs sont bons.', - 'admin.check_install.minz.nok' => 'Vous ne disposez pas de la librairie Minz.', - 'admin.check_install.minz.ok' => 'Vous disposez du framework Minz', - 'admin.check_install.pcre.nok' => 'Il manque une librairie pour les expressions régulières (php-pcre).', - 'admin.check_install.pcre.ok' => 'Vous disposez du nécessaire pour les expressions régulières (PCRE).', - 'admin.check_install.pdo.nok' => 'Vous ne disposez pas de PDO ou d’un des drivers supportés (pdo_mysql, pdo_sqlite).', - 'admin.check_install.pdo.ok' => 'Vous disposez de PDO et d’au moins un des drivers supportés (pdo_mysql, pdo_sqlite).', - 'admin.check_install.persona.nok' => 'Veuillez vérifier les droits sur le répertoire <em>./data/persona</em>. Le serveur HTTP doit être capable d’écrire dedans', - 'admin.check_install.persona.ok' => 'Les droits sur le répertoire de Mozilla Persona sont bons.', - 'admin.check_install.php' => 'Installation de PHP', - 'admin.check_install.php.nok' => 'Votre version de PHP est la %s mais FreshRSS requiert au moins la version %s.', - 'admin.check_install.php.ok' => 'Votre version de PHP est la %s, qui est compatible avec FreshRSS.', - 'admin.check_install.tables.nok' => 'Il manque une ou plusieurs tables en base de données.', - 'admin.check_install.tables.ok' => 'Les tables sont bien présentes en base de données.', - 'admin.check_install.tokens.nok' => 'Veuillez vérifier les droits sur le répertoire <em>./data/tokens</em>. Le serveur HTTP doit être capable d’écrire dedans', - 'admin.check_install.tokens.ok' => 'Les droits sur le répertoire des tokens sont bons.', - 'admin.check_install.zip.nok' => 'Vous ne disposez pas de l\'extension ZIP (paquet php5-zip).', - 'admin.check_install.zip.ok' => 'Vous disposez de l\'extension ZIP.', - 'admin.users.articles_and_size' => '%s articles (%s)', - 'administration' => 'Gérer', - 'advanced' => 'Avancé', - 'after_onread' => 'Après “marquer tout comme lu”,', - 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', - 'all_feeds' => 'Tous les flux', - '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', - 'already_subscribed' => 'Vous êtes déjà abonné à <em>%s</em>', - 'api_enabled' => 'Autoriser l’accès par <abbr>API</abbr> <small>(nécessaire pour les applis mobiles)</small>', - 'apr' => 'avr.', - 'april' => 'avril', - 'archiving_configuration' => 'Archivage', - 'archiving_configuration_help' => 'D’autres options sont disponibles dans la configuration individuelle des flux.', - 'article' => 'Article', - '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 <a href="%s">%s</a>', - 'article_published_on_author' => 'Article publié initialement sur <a href="%s">%s</a> par %s', - 'article_viewed' => 'lorsque l’article est affiché', - 'articles' => 'articles', - 'articles_per_page' => 'Nombre d’articles par page', - 'articles_to_display' => 'Articles à afficher', - 'ask_empty' => 'Vider ?', - 'attention' => 'Attention !', - 'aug' => 'août', - 'august' => 'août', - '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_no_password_set' => 'Aucun mot de passe administrateur n’a été précisé. Cette fonctionnalité n’est pas disponible.', - 'auth_none' => 'Aucune (dangereux)', - 'auth_not_persona' => 'Seul le système d’authentification Persona peut être réinitialisé.', - '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.', - 'author' => 'Auteur', - '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_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', - '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 <em>%s</em>', - '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', - 'can_not_be_deleted' => 'Ne peut pas être supprimée.', - 'cancel' => 'Annuler', - '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_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_not_delete_default' => 'Vous ne pouvez pas supprimer la catégorie par défaut !', - 'category_not_exist' => 'Cette catégorie n’existe pas !', - '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', - 'conf.users.articles_and_size' => '%s articles (%s)', - '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 perdrez 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 <a href="http://twitter.github.io/bootstrap/">projet Bootstrap</a> bien que FreshRSS n’utilise pas ce framework. Les <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">icônes</a> sont issues du <a href="https://www.gnome.org/">projet GNOME</a>. La police <em>Open Sans</em> utilisée a été créée par <a href="https://www.google.com/webfonts/specimen/Open+Sans">Steve Matteson</a>. Les favicons sont récupérés grâce au site <a href="https://getfavicon.appspot.com/">getFavicon</a>. FreshRSS repose sur <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, 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.', - 'december' => 'décembre', - 'default_category' => 'Sans catégorie', - 'default_user' => 'Nom de l’utilisateur par défaut <small>(16 caractères alphanumériques maximum)</small>', - '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', - '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', - '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.<br /><kbd>%s?output=rss&token=%s</kbd>', - '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.', - 'february' => 'février', - 'feed' => 'Flux', - 'feed_actualized' => '<em>%s</em> a été mis à jour.', - 'feed_added' => 'Le flux <em>%s</em> 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' => '<em>%s</em> 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', - 'feedback.login.error' => 'L’identifiant est invalide !', - 'feedback.login.success' => 'Vous êtes désormais connecté', - 'feedback.logout.success' => 'Vous avez été déconnecté', - 'feedback.user_profile.updated' => 'Votre profil a été mis à jour', - '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 <em>%s</em>.', - '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 <em>%s</em>. Le serveur HTTP doit être capable d’écrire dedans', - 'file_to_import' => 'Fichier à importer<br />(OPML, Json ou Zip)', - 'file_to_import_no_zip' => 'Fichier à importer<br />(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', - '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 <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> ou <a href="http://projet.idleman.fr/leed/">Leed</a>. 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+', - 'gen.menu.admin' => 'Administration', - 'gen.menu.authentication' => 'Authentification', - 'gen.menu.check_install' => 'Vérification de l\'installation', - 'gen.menu.user_management' => 'Gestion des utilisateurs', - 'gen.menu.user_profile' => 'Profil', - 'gen.title.authentication' => 'Authentification', - 'gen.title.check_install' => 'Vérification de l\'installation', - 'gen.title.global_view' => 'Vue globale', - 'gen.title.user_management' => 'Gestion des utilisateurs', - 'gen.title.user_profile' => 'Profil', - 'general_conf_is_ok' => 'La configuration générale a été enregistrée.', - 'general_configuration' => 'Configuration générale', - 'github_or_email' => '<a href="https://github.com/marienfressinaud/FreshRSS/issues">sur Github</a> ou <a href="mailto:dev@marienfressinaud.fr">par courriel</a>', - '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', - 'install_not_deleted' => 'Quelque chose s’est mal passé, vous devez supprimer le fichier <em>%s</em> à la main.', - 'installation_is_ok' => 'L’installation s’est bien passée.<br />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.<br />Vous pouvez choisir de sauter cette étape en supprimant <kbd>./data/do-install.txt</kbd> manuellement.', - 'installation_step' => 'Installation — étape %d · FreshRSS', - 'internal_problem_feed' => 'Le flux ne peut pas être ajouté. <a href="%s">Consulter les logs de FreshRSS</a> pour plus de détails.', - 'invalid_login' => 'L’identifiant est invalide !', - 'invalid_url' => 'L’url <em>%s</em> est invalide.', - 'is_admin' => 'est administrateur', - 'jan' => 'jan.', - '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' => 'jui.', - 'july' => 'juillet', - 'jump_next' => 'sauter au prochain voisin non lu (flux ou catégorie)', - 'jun' => 'juin', - 'june' => 'juin', - 'keep_history' => 'Nombre minimum d’articles à conserver', - 'keep_logged_in' => 'Rester connecté <small>(1 mois)</small>', - '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', - 'log_is_ok' => 'Les droits sur le répertoire des logs sont bons', - '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.', - 'main_stream' => 'Flux principal', - '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' => 'mai.', - 'minz_is_nok' => 'Vous ne disposez pas de la librairie Minz. Vous devriez exécuter le script <em>build.sh</em> ou bien <a href="https://github.com/marienfressinaud/MINZ">la télécharger sur Github</a> et installer dans le répertoire <em>%s</em> le contenu de son répertoire <em>/lib</em>.', - 'minz_is_ok' => 'Vous disposez du framework Minz', - 'mon' => 'lun.', - 'month' => 'mois', - 'more_information' => 'Plus d’informations', - 'n_entries_deleted' => '%d articles ont été supprimés.', - 'n_feeds_actualized' => '%d flux ont été mis à jour.', - 'new_article' => 'Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.', - 'new_category' => 'Nouvelle catégorie', - 'newer_first' => 'Plus récents en premier', - 'next' => 'Suivant', - 'next_article' => 'Passer à l’article suivant', - 'next_page' => 'Passer à la page suivante', - 'next_step' => 'Passer à l’étape suivante', - 'no' => 'Non', - '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.', - 'normal_view' => 'Vue normale', - 'not_read' => '%d non lu', - 'not_reads' => '%d non lus', - 'not_yet_implemented' => 'Pas encore implémenté', - '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 !', - 'nov' => 'nov.', - 'november' => 'novembre', - 'number_articles' => '%d articles', - 'number_divided_when_reader' => 'Divisé par 2 dans la vue de lecture.', - 'number_feeds' => '%d flux', - 'oct' => 'oct.', - '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<br /><small>(ex. : pour applis mobiles)</small>', - 'password_form' => 'Mot de passe<br /><small>(pour connexion par formulaire)</small>', - '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<br /><small>(pour <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>', - '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_feed_management' => 'Gestion des flux RSS', - 'rss_feeds_of' => 'Flux RSS de %s', - '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.', - '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' => '+ <code>shift</code> 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.<br/>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 (moyenne : %.2f messages)', - 'stats_entry_per_hour' => 'Par heure (moyenne : %.2f messages)', - 'stats_entry_per_month' => 'Par mois (moyenne : %.2f messages)', - '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', - 'sub.categories.over_max' => 'Vous avez atteint votre limite de catégories (%d)', - 'sub.feeds.over_max' => 'Vous avez atteint votre limite de flux (%d)', - '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', - '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', - 'updated' => 'Modifications enregistrées.', - 'upon_reception' => 'dès la réception du nouvel article', - '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.', - 'username' => 'Nom d’utilisateur', - 'username_admin' => 'Nom d’utilisateur administrateur', - 'users' => 'Utilisateurs', - 'users_list' => 'Liste des utilisateurs', - '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.', -); diff --git a/app/i18n/fr/admin.php b/app/i18n/fr/admin.php new file mode 100644 index 000000000..a0d173b0c --- /dev/null +++ b/app/i18n/fr/admin.php @@ -0,0 +1,156 @@ +<?php + +return array( + 'auth' => array( + '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', + 'api_enabled' => 'Autoriser l’accès par <abbr>API</abbr> <small>(nécessaire pour les applis mobiles)</small>', + 'form' => 'Formulaire (traditionnel, requiert JavaScript)', + 'http' => 'HTTP (pour utilisateurs avancés avec HTTPS)', + 'none' => 'Aucune (dangereux)', + 'persona' => 'Mozilla Persona (moderne, requiert JavaScript)', + 'title' => 'Authentification', + 'title_reset' => 'Réinitialisation de l’authentification', + 'token' => 'Jeton d’identification', + 'token_help' => 'Permet d’accéder à la sortie RSS de l’utilisateur par défaut sans besoin de s’authentifier.<br /><kbd>%s?output=rss&token=%s</kbd>', + 'type' => 'Méthode d’authentification', + 'unsafe_autologin' => 'Autoriser les connexions automatiques non-sûres au format : ', + ), + 'check_install' => array( + 'cache' => array( + 'nok' => 'Veuillez vérifier les droits sur le répertoire <em>./data/cache</em>. Le serveur HTTP doit être capable d’écrire dedans', + 'ok' => 'Les droits sur le répertoire de cache sont bons.', + ), + 'categories' => array( + 'nok' => 'La table category est mal configurée.', + 'ok' => 'La table category est bien configurée.', + ), + 'connection' => array( + 'nok' => 'La connexion à la base de données est impossible.', + 'ok' => 'La connexion à la base de données est bonne.', + ), + '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 <em>./data</em>. Le serveur HTTP doit être capable d’écrire dedans', + 'ok' => 'Les droits sur le répertoire de data sont bons.', + ), + 'database' => 'Installation de la base de données', + 'dom' => array( + 'nok' => 'Il manque une librairie pour parcourir le DOM (paquet php-xml).', + 'ok' => 'Vous disposez du nécessaire pour parcourir le DOM.', + ), + 'entries' => array( + 'nok' => 'La table entry est mal configurée.', + 'ok' => 'La table entry est bien configurée.', + ), + 'favicons' => array( + 'nok' => 'Veuillez vérifier les droits sur le répertoire <em>./data/favicons</em>. Le serveur HTTP doit être capable d’écrire dedans', + 'ok' => 'Les droits sur le répertoire des favicons sont bons.', + ), + 'feeds' => array( + 'nok' => 'La table feed est mal configurée.', + 'ok' => 'La table feed est bien configurée.', + ), + 'files' => 'Installation des fichiers', + 'json' => array( + 'nok' => 'Vous ne disposez pas de JSON (paquet php5-json).', + 'ok' => 'Vous disposez de l\'extension JSON.', + ), + 'logs' => array( + 'nok' => 'Veuillez vérifier les droits sur le répertoire <em>./data/logs</em>. 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 <em>./data/persona</em>. Le serveur HTTP doit être capable d’écrire dedans', + 'ok' => 'Les droits sur le répertoire de Mozilla Persona sont bons.', + ), + 'php' => array( + '_' => 'Installation de PHP', + 'nok' => 'Votre version de PHP est la %s mais FreshRSS requiert au moins la version %s.', + 'ok' => 'Votre version de PHP est la %s, qui est compatible avec FreshRSS.', + ), + 'tables' => array( + 'nok' => 'Il manque une ou plusieurs tables en base de données.', + 'ok' => 'Les tables sont bien présentes en base de données.', + ), + 'title' => 'Vérification de l’installation', + 'tokens' => array( + 'nok' => 'Veuillez vérifier les droits sur le répertoire <em>./data/tokens</em>. Le serveur HTTP doit être capable d’écrire dedans', + 'ok' => 'Les droits sur le répertoire des tokens sont bons.', + ), + 'zip' => array( + 'nok' => 'Vous ne disposez pas de l\'extension ZIP (paquet php5-zip).', + 'ok' => 'Vous disposez de l\'extension ZIP.', + ), + ), + 'stats' => array( + '_' => 'Statistiques', + 'all_feeds' => 'Tous les flux', + 'category' => 'Catégorie', + 'entry_count' => 'Nombre d’articles', + 'entry_per_category' => 'Articles par catégorie', + 'entry_per_day' => 'Nombre d’articles par jour (30 derniers jours)', + 'entry_per_day_of_week' => 'Par jour de la semaine (moyenne : %.2f messages)', + 'entry_per_hour' => 'Par heure (moyenne : %.2f messages)', + 'entry_per_month' => 'Par mois (moyenne : %.2f messages)', + 'entry_repartition' => 'Répartition des articles', + 'feed' => 'Flux', + 'feed_per_category' => 'Flux par catégorie', + 'idle' => 'Flux inactifs', + 'main' => 'Statistiques principales', + 'main_stream' => 'Flux principal', + 'menu' => array( + 'idle' => 'Flux inactifs', + 'main' => 'Statistiques principales', + 'repartition' => 'Répartition des articles', + ), + 'no_idle' => 'Il n’y a aucun flux inactif !', + 'number_entries' => '%d articles', + 'percent_of_total' => '%% du total', + 'repartition' => 'Répartition des articles', + 'status_favorites' => 'favoris', + 'status_read' => 'lus', + 'status_total' => 'total', + 'status_unread' => 'non lus', + 'title' => 'Statistiques', + 'top_feed' => 'Les dix plus gros flux', + ), + 'update' => array( + '_' => 'Système de mise à jour', + 'apply' => 'Appliquer la mise à jour', + 'check' => 'Vérifier les mises à jour', + 'last' => 'Dernière vérification : %s', + 'none' => 'Aucune mise à jour à appliquer', + 'title' => 'Système de mise à jour', + ), + 'user' => array( + 'articles_and_size' => '%s articles (%s)', + 'create' => 'Créer un nouvel utilisateur', + 'email_persona' => 'Adresse courriel de connexion<br /><small>(pour <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>', + 'language' => 'Langue', + 'password_form' => 'Mot de passe<br /><small>(pour connexion par formulaire)</small>', + 'title' => 'Gestion des utilisateurs', + 'user_list' => 'Liste des utilisateurs', + 'username' => 'Nom d’utilisateur', + 'users' => 'Utilisateurs', + ), +); diff --git a/app/i18n/fr/conf.php b/app/i18n/fr/conf.php new file mode 100644 index 000000000..62d6342e9 --- /dev/null +++ b/app/i18n/fr/conf.php @@ -0,0 +1,168 @@ +<?php + +return array( + 'archiving' => array( + '_' => 'Archivage', + 'advanced' => 'Avancé', + 'delete_after' => 'Supprimer les articles après', + 'help' => 'D’autres options sont disponibles dans la configuration individuelle des flux.', + 'keep_history_by_feed' => 'Nombre minimum d’articles à conserver par flux', + 'optimize' => 'Optimiser la base de données', + 'optimize_help' => 'À faire de temps en temps pour réduire la taille de la BDD', + 'purge_now' => 'Purger maintenant', + 'title' => 'Archivage', + 'ttl' => 'Ne pas automatiquement rafraîchir plus souvent que', + ), + 'display' => array( + '_' => 'Affichage', + 'icon' => array( + 'bottom_line' => 'Ligne du bas', + 'entry' => 'Icônes d’article', + 'publication_date' => 'Date de publication', + 'related_tags' => 'Tags associés', + 'sharing' => 'Partage', + 'top_line' => 'Ligne du haut', + ), + 'language' => 'Langue', + 'notif_html5' => array( + 'seconds' => 'secondes (0 signifie aucun timeout)', + 'timeout' => 'Temps d’affichage de la notification HTML5', + ), + 'theme' => 'Thème', + 'title' => 'Affichage', + 'width' => array( + 'content' => 'Largeur du contenu', + 'large' => 'Large', + 'medium' => 'Moyenne', + 'no_limit' => 'Pas de limite', + 'thin' => 'Fine', + ), + ), + 'query' => array( + '_' => 'Filtres utilisateurs', + 'deprecated' => 'Ce filtre n’est plus valide. La catégorie ou le flux concerné a été supprimé.', + 'filter' => 'Filtres appliqués :', + 'get_all' => 'Afficher tous les articles', + 'get_category' => 'Afficher la catégorie "%s"', + 'get_favorite' => 'Afficher les articles favoris', + 'get_feed' => 'Afficher le flux "%s"', + 'no_filter' => 'Aucun filtre appliqué', + 'none' => 'Vous n’avez pas encore créé de filtre.', + 'number' => 'Filtre n°%d', + 'order_asc' => 'Afficher les articles les plus anciens en premier', + 'order_desc' => 'Afficher les articles les plus récents en premier', + 'search' => 'Recherche de "%s"', + 'state_0' => 'Afficher tous les articles', + 'state_1' => 'Afficher les articles lus', + 'state_2' => 'Afficher les articles non lus', + 'state_3' => 'Afficher tous les articles', + 'state_4' => 'Afficher les articles favoris', + 'state_5' => 'Afficher les articles lus et favoris', + 'state_6' => 'Afficher les articles non lus et favoris', + 'state_7' => 'Afficher les articles favoris', + 'state_8' => 'Afficher les articles non favoris', + 'state_9' => 'Afficher les articles lus et non favoris', + 'state_10' => 'Afficher les articles non lus et non favoris', + 'state_11' => 'Afficher les articles non favoris', + 'state_12' => 'Afficher tous les articles', + 'state_13' => 'Afficher les articles lus', + 'state_14' => 'Afficher les articles non lus', + 'state_15' => 'Afficher tous les articles', + 'title' => 'Filtres utilisateurs', + ), + 'profile' => array( + '_' => 'Gestion du profil', + 'email_persona' => 'Adresse courriel de connexion<br /><small>(pour <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>', + 'password_api' => 'Mot de passe API<br /><small>(ex. : pour applis mobiles)</small>', + 'password_form' => 'Mot de passe<br /><small>(pour connexion par formulaire)</small>', + 'title' => 'Profil', + ), + 'reading' => array( + '_' => 'Lecture', + 'after_onread' => 'Après “marquer tout comme lu”,', + 'articles_per_page' => 'Nombre d’articles par page', + 'auto_load_more' => 'Charger les articles suivants en bas de page', + 'auto_remove_article' => 'Cacher les articles après lecture', + 'confirm_enabled' => 'Afficher une confirmation lors des actions “marquer tout comme lu”', + '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”)', + 'img_with_lazyload' => 'Utiliser le mode “chargement différé” pour les images', + 'jump_next' => 'sauter au prochain voisin non lu (flux ou catégorie)', + 'number_divided_when_reader' => 'Divisé par 2 dans la vue de lecture.', + 'read' => array( + 'article_open_on_website' => 'lorsque l’article est ouvert sur le site d’origine', + 'article_viewed' => 'lorsque l’article est affiché', + 'scroll' => 'au défilement de la page', + 'upon_reception' => 'dès la réception du nouvel article', + 'when' => 'Marquer un article comme lu…', + ), + 'show' => array( + '_' => 'Articles à afficher', + 'adaptive' => 'Adapter l’affichage', + 'all_articles' => 'Afficher tous les articles', + 'unread' => 'Afficher les non lus', + ), + 'sort' => array( + '_' => 'Ordre de tri', + 'newer_first' => 'Plus récents en premier', + 'older_first' => 'Plus anciens en premier', + ), + 'sticky_post' => 'Aligner l’article en haut quand il est ouvert', + 'title' => 'Lecture', + 'view' => array( + 'default' => 'Vue par défaut', + 'global' => 'Vue globale', + 'normal' => 'Vue normale', + 'reader' => 'Vue lecture', + ), + ), + 'sharing' => array( + '_' => 'Partage', + 'blogotext' => 'Blogotext', + 'diaspora' => 'Diaspora*', + 'email' => 'Email', + 'facebook' => 'Facebook', + 'g+' => 'Google+', + 'more_information' => 'Plus d’informations', + 'print' => 'Print', + 'shaarli' => 'Shaarli', + 'share_name' => 'Nom du partage à afficher', + 'share_url' => 'URL du partage à utiliser', + 'title' => 'Partage', + 'twitter' => 'Twitter', + 'wallabag' => 'wallabag', + ), + 'shortcut' => array( + '_' => 'Raccourcis', + 'article_action' => 'Actions associées à l’article courant', + 'auto_share' => 'Partager', + 'auto_share_help' => 'S’il n’y a qu’un mode de partage, celui-ci est utilisé automatiquement. Sinon ils sont accessibles par leur numéro.', + 'close_dropdown' => 'Fermer les menus', + 'collapse_article' => 'Refermer', + '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', + 'mark_favorite' => 'Mettre en favori', + 'navigation' => 'Navigation', + 'navigation_help' => 'Avec le modificateur "Shift", les raccourcis de navigation s’appliquent aux flux.<br/>Avec le modificateur "Alt", les raccourcis de navigation s’appliquent aux catégories.', + 'next_article' => 'Passer à l’article suivant', + 'other_action' => 'Autres actions', + 'previous_article' => 'Passer à l’article précédent', + 'see_on_website' => 'Voir sur le site d’origine', + 'shift_for_all_read' => '+ <code>shift</code> pour marquer tous les articles comme lus', + 'title' => 'Raccourcis', + '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.', + ), + 'user' => array( + 'articles_and_size' => '%s articles (%s)', + 'current' => 'Utilisateur actuel', + 'is_admin' => 'est administrateur', + 'users' => 'Utilisateurs', + ), +); diff --git a/app/i18n/fr/feedback.php b/app/i18n/fr/feedback.php new file mode 100644 index 000000000..b9d1f6c99 --- /dev/null +++ b/app/i18n/fr/feedback.php @@ -0,0 +1,96 @@ +<?php + +return array( + 'admin' => array( + 'optimization_complete' => 'Optimisation terminée.', + ), + 'access' => array( + 'denied' => 'Vous n’avez pas le droit d’accéder à cette page !', + 'not_found' => 'La page que vous cherchez n’existe pas !', + ), + 'auth' => array( + 'form' => array( + 'not_set' => 'Un problème est survenu lors de la configuration de votre système d’authentification. Veuillez réessayer plus tard.', + 'set' => 'Le formulaire est désormais votre système d’authentification.', + ), + 'login' => array( + 'invalid' => 'L’identifiant est invalide', + 'success' => 'Vous êtes désormais connecté', + ), + 'logout' => array( + 'success' => 'Vous avez été déconnecté', + ), + 'no_password_set' => 'Aucun mot de passe administrateur n’a été précisé. Cette fonctionnalité n’est pas disponible.', + 'not_persona' => 'Seul le système d’authentification Persona peut être réinitialisé.', + ), + 'conf' => array( + 'error' => 'Une erreur est survenue durant la sauvegarde de la configuration', + 'query_created' => 'Le filtre "%s" a bien été créé.', + 'shortcuts_updated' => 'Les raccourcis ont été mis à jour.', + 'updated' => 'La configuration a été mise à jour', + ), + 'import_export' => array( + 'export_no_zip_extension' => 'L’extension Zip n’est pas présente sur votre serveur. Veuillez essayer d’exporter les fichiers un par un.', + '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.', + 'file_cannot_be_uploaded' => 'Le fichier ne peut pas être téléchargé !', + 'no_zip_extension' => 'L’extension Zip n’est pas présente sur votre serveur.', + 'zip_error' => 'Une erreur est survenue durant l’import du fichier Zip.', + ), + 'sub' => array( + 'actualize' => 'Actualiser', + 'category' => array( + 'created' => 'La catégorie %s a été créée.', + 'deleted' => 'La catégorie a été supprimée.', + 'emptied' => 'La catégorie a été vidée.', + 'error' => 'La catégorie n’a pas pu être modifiée', + 'name_exists' => 'Une catégorie possède déjà ce nom.', + 'no_id' => 'Vous devez préciser l’id de la catégorie.', + 'no_name' => 'Vous devez préciser un nom pour la catégorie.', + 'not_delete_default' => 'Vous ne pouvez pas supprimer la catégorie par défaut !', + 'not_exist' => 'Cette catégorie n’existe pas !', + 'over_max' => 'Vous avez atteint votre limite de catégories (%d)', + 'updated' => 'La catégorie a été mise à jour.', + ), + 'feed' => array( + 'actualized' => '<em>%s</em> a été mis à jour.', + 'actualizeds' => 'Les flux ont été mis à jour.', + 'added' => 'Le flux <em>%s</em> a bien été ajouté.', + 'already_subscribed' => 'Vous êtes déjà abonné à <em>%s</em>', + 'deleted' => 'Le flux a été supprimé.', + 'error' => 'Une erreur est survenue', + 'internal_problem' => 'Le flux ne peut pas être ajouté. <a href="%s">Consulter les logs de FreshRSS</a> pour plus de détails.', + 'invalid_url' => 'L’url <em>%s</em> est invalide.', + 'marked_read' => 'Les flux ont été marqués comme lus.', + 'n_actualized' => '%d flux ont été mis à jour.', + 'n_entries_deleted' => '%d articles ont été supprimés.', + 'no_refresh' => 'Il n’y a aucun flux à actualiser…', + 'not_added' => '<em>%s</em> n’a pas pu être ajouté.', + 'over_max' => 'Vous avez atteint votre limite de flux (%d)', + 'updated' => 'Le flux a été mis à jour', + ), + 'purge_completed' => 'Purge effectuée (%d articles supprimés).', + ), + 'update' => array( + 'can_apply' => 'Une mise à jour est disponible.', + 'error' => 'La mise à jour a rencontré un problème : %s', + 'file_is_nok' => 'Veuillez vérifier les droits sur le répertoire <em>%s</em>. Le serveur HTTP doit être capable d’écrire dedans', + 'finished' => 'La mise à jour est terminée !', + 'none' => 'Aucune mise à jour à appliquer', + 'server_not_found' => 'Le serveur de mise à jour n’a pas été trouvé. [%s]', + ), + 'user' => array( + 'created' => array( + '_' => 'L’utilisateur %s a été créé.', + 'error' => 'L’utilisateur %s ne peut pas être créé.', + ), + 'deleted' => array( + '_' => 'L’utilisateur %s a été supprimé.', + 'error' => 'L’utilisateur %s ne peut pas être supprimé.', + ), + ), + 'profile' => array( + 'error' => 'Votre profil n’a pas pu être mis à jour', + 'updated' => 'Votre profil a été mis à jour', + ), +); diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php new file mode 100644 index 000000000..bb4478360 --- /dev/null +++ b/app/i18n/fr/gen.php @@ -0,0 +1,143 @@ +<?php + +return array( + 'action' => array( + 'actualize' => 'Actualiser', + 'back_to_rss_feeds' => '← Retour à vos flux RSS', + 'cancel' => 'Annuler', + 'create' => 'Créer', + 'disable' => 'Désactiver', + 'empty' => 'Vider', + 'enable' => 'Activer', + 'export' => 'Exporter', + 'filter' => 'Filtrer', + 'import' => 'Importer', + 'manage' => 'Gérer', + 'mark_read' => 'Marquer comme lu', + 'mark_favorite' => 'Mettre en favori', + 'remove' => 'Supprimer', + 'see_website' => 'Voir le site', + 'submit' => 'Valider', + 'truncate' => 'Supprimer tous les articles', + ), + 'auth' => array( + 'keep_logged_in' => 'Rester connecté <small>(1 mois)</small>', + 'login' => 'Connexion', + 'login_persona' => 'Connexion avec Persona', + 'login_persona_problem' => 'Problème de connexion à Persona ?', + 'logout' => 'Déconnexion', + 'password' => 'Mot de passe', + 'reset' => 'Réinitialisation de l’authentification', + 'username' => 'Nom d’utilisateur', + 'username_admin' => 'Nom d’utilisateur administrateur', + 'will_reset' => 'Le système d’authentification va être réinitialisé : un formulaire sera utilisé à la place de Persona.', + ), + 'date' => array( + 'Apr' => '\\a\\v\\r\\i\\l', + 'Aug' => '\\a\\o\\û\\t', + 'Dec' => '\\d\\é\\c\\e\\m\\b\\r\\e', + 'Feb' => '\\f\\é\\v\\r\\i\\e\\r', + 'Jan' => '\\j\\a\\n\\v\\i\\e\\r', + 'Jul' => '\\j\\u\\i\\l\\l\\e\\t', + 'Jun' => '\\j\\u\\i\\n', + 'Mar' => '\\m\\a\\r\\s', + 'May' => '\\m\\a\\i', + 'Nov' => '\\n\\o\\v\\e\\m\\b\\r\\e', + 'Oct' => '\\o\\c\\t\\o\\b\\r\\e', + 'Sep' => '\\s\\e\\p\\t\\e\\m\\b\\r\\e', + 'apr' => 'avr.', + 'april' => 'avril', + 'aug' => 'août', + 'august' => 'août', + 'before_yesterday' => 'À partir d’avant-hier', + 'dec' => 'déc.', + 'december' => 'décembre', + 'feb' => 'fév.', + 'february' => 'février', + 'format_date' => 'j %s Y', + 'format_date_hour' => 'j %s Y \\à H\\:i', + 'fri' => 'ven.', + 'jan' => 'jan.', + 'january' => 'janvier', + 'jul' => 'jui.', + 'july' => 'juillet', + 'jun' => 'juin', + 'june' => 'juin', + 'last_3_month' => 'Depuis les trois derniers mois', + 'last_6_month' => 'Depuis les six derniers mois', + 'last_month' => 'Depuis le mois dernier', + 'last_week' => 'Depuis la semaine dernière', + 'last_year' => 'Depuis l’année dernière', + 'mar' => 'mar.', + 'march' => 'mars', + 'may' => 'mai.', + 'mon' => 'lun.', + 'month' => 'mois', + 'nov' => 'nov.', + 'november' => 'novembre', + 'oct' => 'oct.', + 'october' => 'octobre', + 'sat' => 'sam.', + 'sep' => 'sep.', + 'september' => 'septembre', + 'sun' => 'dim.', + 'thu' => 'jeu.', + 'today' => 'Aujourd’hui', + 'tue' => 'mar.', + 'wed' => 'mer.', + 'yesterday' => 'Hier', + ), + 'freshrss' => array( + '_' => 'FreshRSS', + 'about' => 'À propos de FreshRSS', + ), + 'js' => array( + 'category_empty' => 'Catégorie vide', + '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 perdrez les favoris et les filtres associés. Cette action ne peut être annulée !', + 'new_article' => 'Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.', + 'notif_body_new_articles' => 'Il y a \\d nouveaux articles à lire sur FreshRSS.', + 'notif_title_new_articles' => 'FreshRSS : nouveaux articles !', + 'should_be_activated' => 'Le JavaScript doit être activé.', + ), + 'menu' => array( + 'about' => 'À propos', + 'admin' => 'Administration', + 'archiving' => 'Archivage', + 'authentication' => 'Authentification', + 'check_install' => 'Vérification de l’installation', + 'configuration' => 'Configuration', + 'display' => 'Affichage', + 'logs' => 'Logs', + 'queries' => 'Filtres utilisateurs', + 'reading' => 'Lecture', + 'search' => 'Rechercher des mots ou des #tags', + 'sharing' => 'Partage', + 'shortcuts' => 'Raccourcis', + 'stats' => 'Statistiques', + 'update' => 'Mise à jour', + 'user_management' => 'Gestion des utilisateurs', + 'user_profile' => 'Profil', + ), + 'pagination' => array( + 'first' => 'Début', + 'last' => 'Fin', + 'load_more' => 'Charger plus d’articles', + 'mark_all_read' => 'Tout marquer comme lu', + 'next' => 'Suivant', + 'nothing_to_load' => 'Fin des articles', + 'previous' => 'Précédent', + ), + 'short' => array( + 'attention' => 'Attention !', + 'blank_to_disable' => 'Laissez vide pour désactiver', + 'by_author' => 'Par <em>%s</em>', + 'by_default' => 'Par défaut', + 'damn' => 'Arf !', + 'default_category' => 'Sans catégorie', + 'no' => 'Non', + 'ok' => 'Ok !', + 'or' => 'ou', + 'yes' => 'Oui', + ), +); diff --git a/app/i18n/fr/index.php b/app/i18n/fr/index.php new file mode 100644 index 000000000..3279543bd --- /dev/null +++ b/app/i18n/fr/index.php @@ -0,0 +1,73 @@ +<?php + +return array( + 'about' => array( + '_' => 'À propos', + 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', + 'bugs_reports' => 'Rapports de bugs', + 'credits' => 'Crédits', + 'credits_content' => 'Des éléments de design sont issus du <a href="http://twitter.github.io/bootstrap/">projet Bootstrap</a> bien que FreshRSS n’utilise pas ce framework. Les <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">icônes</a> sont issues du <a href="https://www.gnome.org/">projet GNOME</a>. La police <em>Open Sans</em> utilisée a été créée par <a href="https://www.google.com/webfonts/specimen/Open+Sans">Steve Matteson</a>. Les favicons sont récupérés grâce au site <a href="https://getfavicon.appspot.com/">getFavicon</a>. FreshRSS repose sur <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, un framework PHP.', + 'freshrss_description' => 'FreshRSS est un agrégateur de flux RSS à auto-héberger à l’image de <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> ou <a href="http://projet.idleman.fr/leed/">Leed</a>. Il se veut léger et facile à prendre en main tout en étant un outil puissant et paramétrable.', + 'github_or_email' => '<a href="https://github.com/marienfressinaud/FreshRSS/issues">sur Github</a> ou <a href="mailto:dev@marienfressinaud.fr">par courriel</a>', + 'lead_developer' => 'Développeur principal', + 'license' => 'Licence', + 'project_website' => 'Site du projet', + 'title' => 'À propos', + 'version' => 'Version', + 'website' => 'Site Internet', + ), + 'feed' => array( + 'add' => 'Vous pouvez ajouter des flux.', + 'empty' => 'Il n’y a aucun article à afficher.', + 'rss_of' => 'Flux RSS de %s', + 'title' => 'Vos flux RSS', + 'title_global' => 'Vue globale', + 'title_fav' => 'Vos favoris', + ), + 'log' => array( + '_' => 'Logs', + 'clear' => 'Effacer les logs', + 'empty' => 'Les logs sont vides.', + 'title' => 'Logs', + ), + 'menu' => array( + 'about' => 'À propos de FreshRSS', + 'add_query' => 'Créer un filtre', + 'before_one_day' => 'Antérieurs à 1 jour', + 'before_one_week' => 'Antérieurs à 1 semaine', + 'favorites' => 'Favoris (%s)', + 'global_view' => 'Vue globale', + 'main_stream' => 'Flux principal', + 'mark_all_read' => 'Tout marquer comme lu', + 'mark_cat_read' => 'Marquer la catégorie comme lue', + 'mark_feed_read' => 'Marquer le flux comme lu', + 'newer_first' => 'Plus récents en premier', + 'non-starred' => 'Afficher tout sauf les favoris', + 'normal_view' => 'Vue normale', + 'older_first' => 'Plus anciens en premier', + 'queries' => 'Filtres utilisateurs', + 'read' => 'Afficher les lus', + 'reader_view' => 'Vue lecture', + 'rss_view' => 'Flux RSS', + 'search_short' => 'Rechercher', + 'starred' => 'Afficher les favoris', + 'stats' => 'Statistiques', + 'subscription' => 'Gestion des abonnements', + 'unread' => 'Afficher les non lus', + ), + 'share' => array( + '_' => 'Partager', + 'blogotext' => 'Blogotext', + 'diaspora' => 'Diaspora*', + 'email' => 'Courriel', + 'facebook' => 'Facebook', + 'g+' => 'Google+', + 'print' => 'Imprimer', + 'shaarli' => 'Shaarli', + 'twitter' => 'Twitter', + 'wallabag' => 'wallabag', + ), + 'tag' => array( + 'related' => 'Tags associés', + ), +); diff --git a/app/i18n/fr/install.php b/app/i18n/fr/install.php new file mode 100644 index 000000000..f1ef2ea3f --- /dev/null +++ b/app/i18n/fr/install.php @@ -0,0 +1,105 @@ +<?php + +return array( + 'action' => array( + 'finish' => 'Terminer l’installation', + 'next_step' => 'Passer à l’étape suivante', + ), + 'auth' => array( + 'email_persona' => 'Adresse courriel de connexion<br /><small>(pour <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>', + 'form' => 'Formulaire (traditionnel, requiert JavaScript)', + 'http' => 'HTTP (pour utilisateurs avancés avec HTTPS)', + 'none' => 'Aucune (dangereux)', + 'password_form' => 'Mot de passe<br /><small>(pour connexion par formulaire)</small>', + 'persona' => 'Mozilla Persona (moderne, requiert JavaScript)', + 'type' => 'Méthode d’authentification', + ), + 'bdd' => array( + '_' => 'Base de données', + 'conf' => array( + '_' => 'Configuration de la base de données', + 'ko' => 'Vérifiez les informations d’accès à la base de données.', + 'ok' => 'La configuration de la base de données a été enregistrée.', + ), + '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 <em>./data/cache</em>. 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 <em>./data</em>. 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 <em>./data/favicons</em>. 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 <em>./data/logs</em>. 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 <em>./data/persona</em>. 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 <small>(16 caractères alphanumériques maximum)</small>', + '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.', + ), + 'not_deleted' => 'Quelque chose s’est mal passé, vous devez supprimer le fichier <em>%s</em> à la main.', + 'ok' => 'L’installation s’est bien passée.', + 'step' => 'étape %d', + 'steps' => 'Étapes', + 'title' => 'Installation · FreshRSS', + 'this_is_the_end' => 'This is the end', +); diff --git a/app/i18n/fr/sub.php b/app/i18n/fr/sub.php new file mode 100644 index 000000000..a3f7c4d6d --- /dev/null +++ b/app/i18n/fr/sub.php @@ -0,0 +1,61 @@ +<?php + +return array( + 'category' => array( + '_' => 'Catégorie', + 'add' => 'Ajouter une catégorie', + 'empty' => 'Catégorie vide', + 'new' => 'Nouvelle catégorie', + ), + 'feed' => array( + 'add' => 'Ajouter un flux RSS', + 'advanced' => 'Avancé', + 'archiving' => 'Archivage', + 'auth' => array( + 'configuration' => 'Identification', + 'help' => 'La connexion permet d’accéder aux flux protégés par une authentification HTTP.', + 'http' => 'Authentification HTTP', + 'password' => 'Mot de passe HTTP', + 'username' => 'Identifiant HTTP', + ), + 'css_help' => 'Permet de récupérer les flux tronqués (attention, demande plus de temps !)', + 'css_path' => 'Sélecteur CSS des articles sur le site d’origine', + 'description' => 'Description', + 'empty' => 'Ce flux est vide. Veuillez vérifier qu’il est toujours maintenu.', + 'error' => 'Ce flux a rencontré un problème. Veuillez vérifier qu’il est toujours accessible puis actualisez-le.', + 'in_main_stream' => 'Afficher dans le flux principal', + '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 <em>%s</em>.', + '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', + 'url' => 'URL du flux', + 'validator' => 'Vérifier la valididé du flux', + 'website' => 'URL du site', + ), + 'import_export' => array( + 'export' => 'Exporter', + 'export_opml' => 'Exporter la liste des flux (OPML)', + 'export_starred' => 'Exporter les favoris', + 'feed_list' => 'Liste des articles de %s', + 'file_to_import' => 'Fichier à importer<br />(OPML, Json ou Zip)', + 'file_to_import_no_zip' => 'Fichier à importer<br />(OPML ou Json)', + 'import' => 'Importer', + 'starred_list' => 'Liste des articles favoris', + 'title' => 'Importer / exporter', + ), + 'menu' => array( + 'bookmark' => 'S’abonner (bookmark FreshRSS)', + 'import_export' => 'Importer / exporter', + 'subscription_management' => 'Gestion des abonnements', + ), + 'title' => array( + '_' => 'Gestion des abonnements', + 'feed_management' => 'Gestion des flux RSS', + ), +); diff --git a/app/install.php b/app/install.php index cfdd733ce..8091a9eb0 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() { @@ -104,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); @@ -413,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 { @@ -421,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(); } @@ -444,13 +425,13 @@ function printStep0() { global $actual; ?> <?php $s0 = checkStep0(); if ($s0['all'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('language_defined'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.language.defined'); ?></p> <?php } ?> <form action="index.php?step=0" method="post"> - <legend><?php echo _t('choose_language'); ?></legend> + <legend><?php echo _t('install.language.choose'); ?></legend> <div class="form-group"> - <label class="group-name" for="language"><?php echo _t('language'); ?></label> + <label class="group-name" for="language"><?php echo _t('install.language'); ?></label> <div class="group-controls"> <select name="language" id="language"> <?php $languages = availableLanguages(); ?> @@ -463,10 +444,10 @@ function printStep0() { <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> <?php if ($s0['all'] == 'ok') { ?> - <a class="btn btn-important next-step" href="?step=1"><?php echo _t('next_step'); ?></a> + <a class="btn btn-important next-step" href="?step=1"><?php echo _t('install.action.next_step'); ?></a> <?php } ?> </div> </div> @@ -474,94 +455,95 @@ function printStep0() { <?php } +// @todo refactor this view with the check_install action function printStep1() { $res = checkStep1(); ?> - <noscript><p class="alert alert-warn"><span class="alert-head"><?php echo _t('attention'); ?></span> <?php echo _t('javascript_is_better'); ?></p></noscript> + <noscript><p class="alert alert-warn"><span class="alert-head"><?php echo _t('gen.short.attention'); ?></span> <?php echo _t('install.javascript_is_better'); ?></p></noscript> <?php if ($res['php'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('php_is_ok', PHP_VERSION); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.php.ok', PHP_VERSION); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('php_is_nok', PHP_VERSION, '5.2.1'); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.php.nok', PHP_VERSION, '5.2.1'); ?></p> <?php } ?> <?php if ($res['minz'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('minz_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.minz.ok'); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('minz_is_nok', LIB_PATH . '/Minz'); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.minz.nok', LIB_PATH . '/Minz'); ?></p> <?php } ?> <?php if ($res['pdo'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('pdo_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.pdo.ok'); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('pdo_is_nok'); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.pdo.nok'); ?></p> <?php } ?> <?php if ($res['curl'] == 'ok') { ?> <?php $version = curl_version(); ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('curl_is_ok', $version['version']); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.curl.ok', $version['version']); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('curl_is_nok'); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.curl.nok'); ?></p> <?php } ?> <?php if ($res['pcre'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('pcre_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.pcre.ok'); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('pcre_is_nok'); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.pcre.nok'); ?></p> <?php } ?> <?php if ($res['ctype'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('ctype_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.ctype.ok'); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('ctype_is_nok'); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.ctype.nok'); ?></p> <?php } ?> <?php if ($res['dom'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('dom_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.dom.ok'); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('dom_is_nok'); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.dom.nok'); ?></p> <?php } ?> <?php if ($res['data'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('data_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.data.ok'); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('file_is_nok', DATA_PATH); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.data.nok', DATA_PATH); ?></p> <?php } ?> <?php if ($res['cache'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('cache_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.cache.ok'); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('file_is_nok', CACHE_PATH); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.cache.nok', CACHE_PATH); ?></p> <?php } ?> <?php if ($res['log'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('log_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.logs.ok'); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('file_is_nok', LOG_PATH); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.logs.nok', LOG_PATH); ?></p> <?php } ?> <?php if ($res['favicons'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('favicons_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.favicons.ok'); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('file_is_nok', DATA_PATH . '/favicons'); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.favicons.nok', DATA_PATH . '/favicons'); ?></p> <?php } ?> <?php if ($res['persona'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('persona_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.persona.ok'); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('file_is_nok', DATA_PATH . '/persona'); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.persona.nok', DATA_PATH . '/persona'); ?></p> <?php } ?> <?php if ($res['http_referer'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('http_referer_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.http_referer.ok'); ?></p> <?php } else { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('http_referer_is_nok'); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.http_referer.nok'); ?></p> <?php } ?> <?php if ($res['all'] == 'ok') { ?> - <a class="btn btn-important next-step" href="?step=2"><?php echo _t('next_step'); ?></a> + <a class="btn btn-important next-step" href="?step=2"><?php echo _t('install.action.next_step'); ?></a> <?php } else { ?> - <p class="alert alert-error"><?php echo _t('fix_errors_before'); ?></p> + <p class="alert alert-error"><?php echo _t('install.action.fix_errors_before'); ?></p> <?php } ?> <?php } @@ -569,37 +551,37 @@ function printStep1() { function printStep2() { ?> <?php $s2 = checkStep2(); if ($s2['all'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('general_conf_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.conf.ok'); ?></p> <?php } elseif (!empty($_POST)) { ?> - <p class="alert alert-error"><?php echo _t('fix_errors_before'); ?></p> + <p class="alert alert-error"><?php echo _t('install.fix_errors_before'); ?></p> <?php } ?> <form action="index.php?step=2" method="post"> - <legend><?php echo _t('general_configuration'); ?></legend> + <legend><?php echo _t('install.conf'); ?></legend> <div class="form-group"> - <label class="group-name" for="title"><?php echo _t('title'); ?></label> + <label class="group-name" for="title"><?php echo _t('install.title'); ?></label> <div class="group-controls"> - <input type="text" id="title" name="title" value="<?php echo isset($_SESSION['title']) ? $_SESSION['title'] : _t('freshrss'); ?>" /> + <input type="text" id="title" name="title" value="<?php echo isset($_SESSION['title']) ? $_SESSION['title'] : _t('gen.freshrss'); ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="old_entries"><?php echo _t('delete_articles_every'); ?></label> + <label class="group-name" for="old_entries"><?php echo _t('install.delete_articles_after'); ?></label> <div class="group-controls"> - <input type="number" id="old_entries" name="old_entries" required="required" min="1" max="1200" value="<?php echo isset($_SESSION['old_entries']) ? $_SESSION['old_entries'] : '3'; ?>" /> <?php echo _t('month'); ?> + <input type="number" id="old_entries" name="old_entries" required="required" min="1" max="1200" value="<?php echo isset($_SESSION['old_entries']) ? $_SESSION['old_entries'] : '3'; ?>" /> <?php echo _t('gen.date.month'); ?> </div> </div> <div class="form-group"> - <label class="group-name" for="default_user"><?php echo _t('default_user'); ?></label> + <label class="group-name" for="default_user"><?php echo _t('install.default_user'); ?></label> <div class="group-controls"> - <input type="text" id="default_user" name="default_user" required="required" size="16" maxlength="16" pattern="[0-9a-zA-Z]{1,16}" value="<?php echo isset($_SESSION['default_user']) ? $_SESSION['default_user'] : ''; ?>" placeholder="<?php echo httpAuthUser() == '' ? 'user1' : httpAuthUser(); ?>" /> + <input type="text" id="default_user" name="default_user" required="required" size="16" maxlength="16" pattern="[0-9a-zA-Z]{1,16}" value="<?php echo isset($_SESSION['default_user']) ? $_SESSION['default_user'] : ''; ?>" placeholder="<?php echo httpAuthUser() == '' ? 'alice' : httpAuthUser(); ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="auth_type"><?php echo _t('auth_type'); ?></label> + <label class="group-name" for="auth_type"><?php echo _t('install.auth.type'); ?></label> <div class="group-controls"> <select id="auth_type" name="auth_type" required="required" onchange="auth_type_change(true)"> <?php @@ -608,30 +590,30 @@ function printStep2() { } $auth_type = isset($_SESSION['auth_type']) ? $_SESSION['auth_type'] : ''; ?> - <option value="form"<?php echo $auth_type === 'form' || no_auth($auth_type) ? ' selected="selected"' : '', cryptAvailable() ? '' : ' disabled="disabled"'; ?>><?php echo _t('auth_form'); ?></option> - <option value="persona"<?php echo $auth_type === 'persona' ? ' selected="selected"' : ''; ?>><?php echo _t('auth_persona'); ?></option> - <option value="http_auth"<?php echo $auth_type === 'http_auth' ? ' selected="selected"' : '', httpAuthUser() == '' ? ' disabled="disabled"' : ''; ?>><?php echo _t('http_auth'); ?>(REMOTE_USER = '<?php echo httpAuthUser(); ?>')</option> - <option value="none"<?php echo $auth_type === 'none' ? ' selected="selected"' : ''; ?>><?php echo _t('auth_none'); ?></option> + <option value="form"<?php echo $auth_type === 'form' || no_auth($auth_type) ? ' selected="selected"' : '', cryptAvailable() ? '' : ' disabled="disabled"'; ?>><?php echo _t('install.auth.form'); ?></option> + <option value="persona"<?php echo $auth_type === 'persona' ? ' selected="selected"' : ''; ?>><?php echo _t('install.auth.persona'); ?></option> + <option value="http_auth"<?php echo $auth_type === 'http_auth' ? ' selected="selected"' : '', httpAuthUser() == '' ? ' disabled="disabled"' : ''; ?>><?php echo _t('install.auth.http'); ?>(REMOTE_USER = '<?php echo httpAuthUser(); ?>')</option> + <option value="none"<?php echo $auth_type === 'none' ? ' selected="selected"' : ''; ?>><?php echo _t('install.auth.none'); ?></option> </select> </div> </div> <div class="form-group"> - <label class="group-name" for="passwordPlain"><?php echo _t('password_form'); ?></label> + <label class="group-name" for="passwordPlain"><?php echo _t('install.auth.password_form'); ?></label> <div class="group-controls"> <div class="stick"> <input type="password" id="passwordPlain" name="passwordPlain" pattern=".{7,}" autocomplete="off" <?php echo $auth_type === 'form' ? ' required="required"' : ''; ?> /> <a class="btn toggle-password" data-toggle="passwordPlain"><?php echo FreshRSS_Themes::icon('key'); ?></a> </div> - <noscript><b><?php echo _t('javascript_should_be_activated'); ?></b></noscript> + <noscript><b><?php echo _t('gen.js.should_be_activated'); ?></b></noscript> </div> </div> <div class="form-group"> - <label class="group-name" for="mail_login"><?php echo _t('persona_connection_email'); ?></label> + <label class="group-name" for="mail_login"><?php echo _t('install.auth.email_persona'); ?></label> <div class="group-controls"> <input type="email" id="mail_login" name="mail_login" value="<?php echo isset($_SESSION['mail_login']) ? $_SESSION['mail_login'] : ''; ?>" placeholder="alice@example.net" <?php echo $auth_type === 'persona' ? ' required="required"' : ''; ?> /> - <noscript><b><?php echo _t('javascript_should_be_activated'); ?></b></noscript> + <noscript><b><?php echo _t('gen.js.should_be_activated'); ?></b></noscript> </div> </div> @@ -682,10 +664,10 @@ function printStep2() { <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> <?php if ($s2['all'] == 'ok') { ?> - <a class="btn btn-important next-step" href="?step=3"><?php echo _t('next_step'); ?></a> + <a class="btn btn-important next-step" href="?step=3"><?php echo _t('install.action.next_step'); ?></a> <?php } ?> </div> </div> @@ -696,15 +678,15 @@ function printStep2() { function printStep3() { ?> <?php $s3 = checkStep3(); if ($s3['all'] == 'ok') { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('bdd_conf_is_ok'); ?></p> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.bdd.conf.ok'); ?></p> <?php } elseif ($s3['conn'] == 'ko') { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('bdd_conf_is_ko'),(empty($_SESSION['bd_error']) ? '' : ' : ' . $_SESSION['bd_error']); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.bdd.conf.ko'),(empty($_SESSION['bd_error']) ? '' : ' : ' . $_SESSION['bd_error']); ?></p> <?php } ?> <form action="index.php?step=3" method="post"> - <legend><?php echo _t('bdd_configuration'); ?></legend> + <legend><?php echo _t('install.bdd.conf'); ?></legend> <div class="form-group"> - <label class="group-name" for="type"><?php echo _t('bdd_type'); ?></label> + <label class="group-name" for="type"><?php echo _t('install.bdd.type'); ?></label> <div class="group-controls"> <select name="type" id="type" onchange="mySqlShowHide()"> <?php if (extension_loaded('pdo_mysql')) {?> @@ -725,35 +707,35 @@ function printStep3() { <div id="mysql"> <div class="form-group"> - <label class="group-name" for="host"><?php echo _t('host'); ?></label> + <label class="group-name" for="host"><?php echo _t('install.bdd.host'); ?></label> <div class="group-controls"> <input type="text" id="host" name="host" pattern="[0-9A-Za-z_.-]{1,64}" value="<?php echo isset($_SESSION['bd_host']) ? $_SESSION['bd_host'] : 'localhost'; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="user"><?php echo _t('username'); ?></label> + <label class="group-name" for="user"><?php echo _t('install.bdd.username'); ?></label> <div class="group-controls"> <input type="text" id="user" name="user" maxlength="16" pattern="[0-9A-Za-z_.-]{1,16}" value="<?php echo isset($_SESSION['bd_user']) ? $_SESSION['bd_user'] : ''; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="pass"><?php echo _t('password'); ?></label> + <label class="group-name" for="pass"><?php echo _t('install.bdd.password'); ?></label> <div class="group-controls"> <input type="password" id="pass" name="pass" value="<?php echo isset($_SESSION['bd_password']) ? $_SESSION['bd_password'] : ''; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="base"><?php echo _t('bdd'); ?></label> + <label class="group-name" for="base"><?php echo _t('install.bdd'); ?></label> <div class="group-controls"> - <input type="text" id="base" name="base" maxlength="64" pattern="[0-9A-Za-z_]{1,64}" value="<?php echo isset($_SESSION['bd_base']) ? $_SESSION['bd_base'] : ''; ?>" placeholder="freshrss" /> + <input type="text" id="base" name="base" maxlength="64" pattern="[0-9A-Za-z_]{1,64}" value="<?php echo isset($_SESSION['bd_base']) ? $_SESSION['bd_base'] : ''; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="prefix"><?php echo _t('prefix'); ?></label> + <label class="group-name" for="prefix"><?php echo _t('install.bdd.prefix'); ?></label> <div class="group-controls"> <input type="text" id="prefix" name="prefix" maxlength="16" pattern="[0-9A-Za-z_]{1,16}" value="<?php echo isset($_SESSION['bd_prefix']) ? $_SESSION['bd_prefix'] : 'freshrss_'; ?>" /> </div> @@ -768,10 +750,10 @@ function printStep3() { <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> <?php if ($s3['all'] == 'ok') { ?> - <a class="btn btn-important next-step" href="?step=4"><?php echo _t('next_step'); ?></a> + <a class="btn btn-important next-step" href="?step=4"><?php echo _t('install.action.next_step'); ?></a> <?php } ?> </div> </div> @@ -781,14 +763,14 @@ function printStep3() { function printStep4() { ?> - <p class="alert alert-success"><span class="alert-head"><?php echo _t('congratulations'); ?></span> <?php echo _t('installation_is_ok'); ?></p> - <a class="btn btn-important next-step" href="?step=5"><?php echo _t('finish_installation'); ?></a> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('install.congratulations'); ?></span> <?php echo _t('install.ok'); ?></p> + <a class="btn btn-important next-step" href="?step=5"><?php echo _t('install.action.finish'); ?></a> <?php } function printStep5() { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('oops'); ?></span> <?php echo _t('install_not_deleted', DATA_PATH . '/do-install.txt'); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.not_deleted', DATA_PATH . '/do-install.txt'); ?></p> <?php } @@ -821,7 +803,7 @@ case 5: <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1.0"> - <title><?php echo _t('freshrss_installation'); ?></title> + <title><?php echo _t('install.title'); ?></title> <link rel="stylesheet" type="text/css" media="all" href="../themes/base-theme/template.css" /> <link rel="stylesheet" type="text/css" media="all" href="../themes/Origine/origine.css" /> </head> @@ -829,19 +811,19 @@ case 5: <div class="header"> <div class="item title"> - <h1><a href="index.php"><?php echo _t('freshrss'); ?></a></h1> - <h2><?php echo _t('installation_step', STEP); ?></h2> + <h1><a href="index.php"><?php echo _t('install.title'); ?></a></h1> + <h2><?php echo _t('install.step', STEP); ?></h2> </div> </div> <div id="global"> <ul class="nav nav-list aside"> - <li class="nav-header"><?php echo _t('steps'); ?></li> - <li class="item<?php echo STEP == 0 ? ' active' : ''; ?>"><a href="?step=0"><?php echo _t('language'); ?></a></li> - <li class="item<?php echo STEP == 1 ? ' active' : ''; ?>"><a href="?step=1"><?php echo _t('checks'); ?></a></li> - <li class="item<?php echo STEP == 2 ? ' active' : ''; ?>"><a href="?step=2"><?php echo _t('general_configuration'); ?></a></li> - <li class="item<?php echo STEP == 3 ? ' active' : ''; ?>"><a href="?step=3"><?php echo _t('bdd_configuration'); ?></a></li> - <li class="item<?php echo STEP == 4 ? ' active' : ''; ?>"><a href="?step=5"><?php echo _t('this_is_the_end'); ?></a></li> + <li class="nav-header"><?php echo _t('install.steps'); ?></li> + <li class="item<?php echo STEP == 0 ? ' active' : ''; ?>"><a href="?step=0"><?php echo _t('install.language'); ?></a></li> + <li class="item<?php echo STEP == 1 ? ' active' : ''; ?>"><a href="?step=1"><?php echo _t('install.check'); ?></a></li> + <li class="item<?php echo STEP == 2 ? ' active' : ''; ?>"><a href="?step=2"><?php echo _t('install.conf'); ?></a></li> + <li class="item<?php echo STEP == 3 ? ' active' : ''; ?>"><a href="?step=3"><?php echo _t('install.bdd.conf'); ?></a></li> + <li class="item<?php echo STEP == 4 ? ' active' : ''; ?>"><a href="?step=5"><?php echo _t('install.this_is_the_end'); ?></a></li> </ul> <div class="post"> diff --git a/app/layout/aside_configure.phtml b/app/layout/aside_configure.phtml index 53c52d3e3..25b8037e6 100644 --- a/app/layout/aside_configure.phtml +++ b/app/layout/aside_configure.phtml @@ -1,22 +1,22 @@ <ul class="nav nav-list aside"> - <li class="nav-header"><?php echo _t('configuration'); ?></li> + <li class="nav-header"><?php echo _t('gen.menu.configuration'); ?></li> <li class="item<?php echo Minz_Request::actionName() === 'display' ? ' active' : ''; ?>"> - <a href="<?php echo _url('configure', 'display'); ?>"><?php echo _t('display_configuration'); ?></a> + <a href="<?php echo _url('configure', 'display'); ?>"><?php echo _t('gen.menu.display'); ?></a> </li> <li class="item<?php echo Minz_Request::actionName() === 'reading' ? ' active' : ''; ?>"> - <a href="<?php echo _url('configure', 'reading'); ?>"><?php echo _t('reading_configuration'); ?></a> + <a href="<?php echo _url('configure', 'reading'); ?>"><?php echo _t('gen.menu.reading'); ?></a> </li> <li class="item<?php echo Minz_Request::actionName() === 'archiving' ? ' active' : ''; ?>"> - <a href="<?php echo _url('configure', 'archiving'); ?>"><?php echo _t('archiving_configuration'); ?></a> + <a href="<?php echo _url('configure', 'archiving'); ?>"><?php echo _t('gen.menu.archiving'); ?></a> </li> <li class="item<?php echo Minz_Request::actionName() === 'sharing' ? ' active' : ''; ?>"> - <a href="<?php echo _url('configure', 'sharing'); ?>"><?php echo _t('sharing'); ?></a> + <a href="<?php echo _url('configure', 'sharing'); ?>"><?php echo _t('gen.menu.sharing'); ?></a> </li> <li class="item<?php echo Minz_Request::actionName() === 'shortcut' ? ' active' : ''; ?>"> - <a href="<?php echo _url('configure', 'shortcut'); ?>"><?php echo _t('shortcuts'); ?></a> + <a href="<?php echo _url('configure', 'shortcut'); ?>"><?php echo _t('gen.menu.shortcuts'); ?></a> </li> <li class="item<?php echo Minz_Request::actionName() === 'queries' ? ' active' : ''; ?>"> - <a href="<?php echo _url('configure', 'queries'); ?>"><?php echo _t('queries'); ?></a> + <a href="<?php echo _url('configure', 'queries'); ?>"><?php echo _t('gen.menu.queries'); ?></a> </li> <li class="item<?php echo Minz_Request::controllerName() === 'user' && Minz_Request::actionName() === 'profile'? ' active' : ''; ?>"> @@ -37,7 +37,7 @@ </li> <li class="item<?php echo Minz_Request::controllerName() === 'update' && Minz_Request::actionName() === 'index' ? ' active' : ''; ?>"> - <a href="<?php echo _url('update', 'index'); ?>"><?php echo _t('update'); ?></a> + <a href="<?php echo _url('update', 'index'); ?>"><?php echo _t('gen.menu.update'); ?></a> </li> <?php } ?> </ul> diff --git a/app/layout/aside_feed.phtml b/app/layout/aside_feed.phtml index 3c23e0178..a39aea327 100644 --- a/app/layout/aside_feed.phtml +++ b/app/layout/aside_feed.phtml @@ -12,11 +12,11 @@ <?php if (FreshRSS_Auth::hasAccess()) { ?> <div class="stick configure-feeds no-mobile"> - <a class="btn btn-important" href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('subscription_management'); ?></a> + <a class="btn btn-important" href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('index.menu.subscription'); ?></a> <a class="btn btn-important" href="<?php echo _url('importExport', 'index'); ?>"><?php echo _i('import'); ?></a> </div> <?php } elseif (Minz_Configuration::needsLogin()) { ?> - <a href="<?php echo _url('index', 'about'); ?>"><?php echo _t('about_freshrss'); ?></a> + <a href="<?php echo _url('index', 'about'); ?>"><?php echo _t('index.menu.about'); ?></a> <?php } ?> <form id="mark-read-aside" method="post" style="display: none"></form> @@ -24,13 +24,13 @@ <ul class="tree"> <li class="tree-folder category all<?php echo FreshRSS_Context::isCurrentGet('a') ? ' active' : ''; ?>"> <div class="tree-folder-title"> - <?php echo _i('all'); ?> <a class="title" data-unread="<?php echo format_number(FreshRSS_Context::$total_unread); ?>" href="<?php echo _url('index', 'index'); ?>"><?php echo _t('main_stream'); ?></a> + <?php echo _i('all'); ?> <a class="title" data-unread="<?php echo format_number(FreshRSS_Context::$total_unread); ?>" href="<?php echo _url('index', 'index'); ?>"><?php echo _t('index.menu.main_stream'); ?></a> </div> </li> <li class="tree-folder category favorites<?php echo FreshRSS_Context::isCurrentGet('s') ? ' active' : ''; ?>"> <div class="tree-folder-title"> - <?php echo _i('bookmark'); ?> <a class="title" data-unread="<?php echo format_number(FreshRSS_Context::$total_starred['unread']); ?>" href="<?php echo _url('index', 'index', 'get', 's'); ?>"><?php echo _t('favorite_feeds', format_number(FreshRSS_Context::$total_starred['all'])); ?></a> + <?php echo _i('bookmark'); ?> <a class="title" data-unread="<?php echo format_number(FreshRSS_Context::$total_starred['unread']); ?>" href="<?php echo _url('index', 'index', 'get', 's'); ?>"><?php echo _t('index.menu.favorites', format_number(FreshRSS_Context::$total_starred['all'])); ?></a> </div> </li> @@ -74,21 +74,21 @@ <script id="feed_config_template" type="text/html"> <ul class="dropdown-menu"> <li class="dropdown-close"><a href="#close">❌</a></li> - <li class="item"><a href="<?php echo _url('index', 'index', 'get', 'f_!!!!!!'); ?>"><?php echo _t('filter'); ?></a></li> + <li class="item"><a href="<?php echo _url('index', 'index', 'get', 'f_!!!!!!'); ?>"><?php echo _t('gen.action.filter'); ?></a></li> <?php if (FreshRSS_Auth::hasAccess()) { ?> - <li class="item"><a href="<?php echo _url('stats', 'repartition', 'id', '!!!!!!'); ?>"><?php echo _t('stats'); ?></a></li> + <li class="item"><a href="<?php echo _url('stats', 'repartition', 'id', '!!!!!!'); ?>"><?php echo _t('index.menu.stats'); ?></a></li> <?php } ?> - <li class="item"><a target="_blank" href="http://example.net/"><?php echo _t('see_website'); ?></a></li> + <li class="item"><a target="_blank" href="http://example.net/"><?php echo _t('gen.action.see_website'); ?></a></li> <?php if (FreshRSS_Auth::hasAccess()) { ?> <li class="separator"></li> - <li class="item"><a href="<?php echo _url('subscription', 'index', 'id', '!!!!!!'); ?>"><?php echo _t('administration'); ?></a></li> - <li class="item"><a href="<?php echo _url('feed', 'actualize', 'id', '!!!!!!'); ?>"><?php echo _t('actualize'); ?></a></li> + <li class="item"><a href="<?php echo _url('subscription', 'index', 'id', '!!!!!!'); ?>"><?php echo _t('gen.action.manage'); ?></a></li> + <li class="item"><a href="<?php echo _url('feed', 'actualize', 'id', '!!!!!!'); ?>"><?php echo _t('gen.action.actualize'); ?></a></li> <li class="item"> <?php $confirm = FreshRSS_Context::$conf->reading_confirm ? 'confirm' : ''; ?> <button class="read_all as-link <?php echo $confirm; ?>" form="mark-read-aside" formaction="<?php echo _url('entry', 'read', 'get', 'f_!!!!!!'); ?>" - type="submit"><?php echo _t('mark_read'); ?></button> + type="submit"><?php echo _t('gen.action.mark_read'); ?></button> </li> <?php } ?> </ul> diff --git a/app/layout/aside_stats.phtml b/app/layout/aside_stats.phtml index 1cd31a99c..4bdaf7165 100644 --- a/app/layout/aside_stats.phtml +++ b/app/layout/aside_stats.phtml @@ -1,12 +1,12 @@ <ul class="nav nav-list aside"> - <li class="nav-header"><?php echo _t('stats'); ?></li> + <li class="nav-header"><?php echo _t('admin.stats'); ?></li> <li class="item<?php echo Minz_Request::actionName() == 'index' ? ' active' : ''; ?>"> - <a href="<?php echo _url('stats', 'index'); ?>"><?php echo _t('stats_main'); ?></a> + <a href="<?php echo _url('stats', 'index'); ?>"><?php echo _t('admin.stats.menu.main'); ?></a> </li> <li class="item<?php echo Minz_Request::actionName() == 'idle' ? ' active' : ''; ?>"> - <a href="<?php echo _url('stats', 'idle'); ?>"><?php echo _t('stats_idle'); ?></a> + <a href="<?php echo _url('stats', 'idle'); ?>"><?php echo _t('admin.stats.menu.idle'); ?></a> </li> <li class="item<?php echo Minz_Request::actionName() == 'repartition' ? ' active' : ''; ?>"> - <a href="<?php echo _url('stats', 'repartition'); ?>"><?php echo _t('stats_repartition'); ?></a> + <a href="<?php echo _url('stats', 'repartition'); ?>"><?php echo _t('admin.stats.menu.repartition'); ?></a> </li> </ul> diff --git a/app/layout/aside_subscription.phtml b/app/layout/aside_subscription.phtml index cbf5df67d..8a54e2dc2 100644 --- a/app/layout/aside_subscription.phtml +++ b/app/layout/aside_subscription.phtml @@ -1,17 +1,17 @@ <ul class="nav nav-list aside"> - <li class="nav-header"><?php echo _t('subscription_management'); ?></li> + <li class="nav-header"><?php echo _t('sub.menu.subscription_management'); ?></li> <li class="item<?php echo Minz_Request::controllerName() == 'subscription' ? ' active' : ''; ?>"> - <a href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('subscription_management'); ?></a> + <a href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('sub.menu.subscription_management'); ?></a> </li> <li class="item<?php echo Minz_Request::controllerName() == 'importExport' ? ' active' : ''; ?>"> - <a href="<?php echo _url('importExport', 'index'); ?>"><?php echo _t('import_export'); ?></a> + <a href="<?php echo _url('importExport', 'index'); ?>"><?php echo _t('sub.menu.import_export'); ?></a> </li> <li class="item"> <a onclick="return false;" href="javascript:(function(){var%20url%20=%20location.href;window.open('<?php echo Minz_Url::display(array('c' => 'feed', 'a' => 'add'), 'html', true); ?>&url_rss='+encodeURIComponent(url), '_blank');})();"> - <?php echo _t('bookmark'); ?> + <?php echo _t('sub.menu.bookmark'); ?> </a> </li> </ul> diff --git a/app/layout/header.phtml b/app/layout/header.phtml index c73d9cdbb..ba13c2a45 100644 --- a/app/layout/header.phtml +++ b/app/layout/header.phtml @@ -2,9 +2,9 @@ if (Minz_Configuration::canLogIn()) { ?><ul class="nav nav-head nav-login"><?php if (FreshRSS_Auth::hasAccess()) { - ?><li class="item"><?php echo _i('logout'); ?> <a class="signout" href="<?php echo _url('auth', 'logout'); ?>"><?php echo _t('logout'); ?></a></li><?php + ?><li class="item"><?php echo _i('logout'); ?> <a class="signout" href="<?php echo _url('auth', 'logout'); ?>"><?php echo _t('gen.auth.logout'); ?></a></li><?php } else { - ?><li class="item"><?php echo _i('login'); ?> <a class="signin" href="<?php echo _url('auth', 'login'); ?>"><?php echo _t('login'); ?></a></li><?php + ?><li class="item"><?php echo _i('login'); ?> <a class="signin" href="<?php echo _url('auth', 'login'); ?>"><?php echo _t('gen.auth.login'); ?></a></li><?php } ?></ul><?php } @@ -25,7 +25,7 @@ if (Minz_Configuration::canLogIn()) { <form action="<?php echo _url('index', 'index'); ?>" method="get"> <div class="stick"> <?php $search = Minz_Request::param('search', ''); ?> - <input type="search" name="search" id="search" class="extend" value="<?php echo $search; ?>" placeholder="<?php echo _t('search'); ?>" /> + <input type="search" name="search" id="search" class="extend" value="<?php echo $search; ?>" placeholder="<?php echo _t('gen.menu.search'); ?>" /> <?php $get = Minz_Request::param('get', ''); ?> <?php if ($get != '') { ?> @@ -55,13 +55,13 @@ if (Minz_Configuration::canLogIn()) { <a class="btn dropdown-toggle" href="#dropdown-configure"><?php echo _i('configure'); ?></a> <ul class="dropdown-menu"> <li class="dropdown-close"><a href="#close">❌</a></li> - <li class="dropdown-header"><?php echo _t('configuration'); ?></li> - <li class="item"><a href="<?php echo _url('configure', 'display'); ?>"><?php echo _t('display_configuration'); ?></a></li> - <li class="item"><a href="<?php echo _url('configure', 'reading'); ?>"><?php echo _t('reading_configuration'); ?></a></li> - <li class="item"><a href="<?php echo _url('configure', 'archiving'); ?>"><?php echo _t('archiving_configuration'); ?></a></li> - <li class="item"><a href="<?php echo _url('configure', 'sharing'); ?>"><?php echo _t('sharing'); ?></a></li> - <li class="item"><a href="<?php echo _url('configure', 'shortcut'); ?>"><?php echo _t('shortcuts'); ?></a></li> - <li class="item"><a href="<?php echo _url('configure', 'queries'); ?>"><?php echo _t('queries'); ?></a></li> + <li class="dropdown-header"><?php echo _t('gen.menu.configuration'); ?></li> + <li class="item"><a href="<?php echo _url('configure', 'display'); ?>"><?php echo _t('gen.menu.display'); ?></a></li> + <li class="item"><a href="<?php echo _url('configure', 'reading'); ?>"><?php echo _t('gen.menu.reading'); ?></a></li> + <li class="item"><a href="<?php echo _url('configure', 'archiving'); ?>"><?php echo _t('gen.menu.archiving'); ?></a></li> + <li class="item"><a href="<?php echo _url('configure', 'sharing'); ?>"><?php echo _t('gen.menu.sharing'); ?></a></li> + <li class="item"><a href="<?php echo _url('configure', 'shortcut'); ?>"><?php echo _t('gen.menu.shortcuts'); ?></a></li> + <li class="item"><a href="<?php echo _url('configure', 'queries'); ?>"><?php echo _t('gen.menu.queries'); ?></a></li> <li class="item"><a href="<?php echo _url('user', 'profile'); ?>"><?php echo _t('gen.menu.user_profile'); ?></a></li> <?php if (FreshRSS_Auth::hasAccess('admin')) { ?> <li class="separator"></li> @@ -69,23 +69,23 @@ if (Minz_Configuration::canLogIn()) { <li class="item"><a href="<?php echo _url('user', 'manage'); ?>"><?php echo _t('gen.menu.user_management'); ?></a></li> <li class="item"><a href="<?php echo _url('auth', 'index'); ?>"><?php echo _t('gen.menu.authentication'); ?></a></li> <li class="item"><a href="<?php echo _url('update', 'checkInstall'); ?>"><?php echo _t('gen.menu.check_install'); ?></a></li> - <li class="item"><a href="<?php echo _url('update', 'index'); ?>"><?php echo _t('update'); ?></a></li> + <li class="item"><a href="<?php echo _url('update', 'index'); ?>"><?php echo _t('gen.menu.update'); ?></a></li> <?php } ?> <li class="separator"></li> - <li class="item"><a href="<?php echo _url('stats', 'index'); ?>"><?php echo _t('stats'); ?></a></li> - <li class="item"><a href="<?php echo _url('index', 'logs'); ?>"><?php echo _t('logs'); ?></a></li> - <li class="item"><a href="<?php echo _url('index', 'about'); ?>"><?php echo _t('about'); ?></a></li> + <li class="item"><a href="<?php echo _url('stats', 'index'); ?>"><?php echo _t('gen.menu.stats'); ?></a></li> + <li class="item"><a href="<?php echo _url('index', 'logs'); ?>"><?php echo _t('gen.menu.logs'); ?></a></li> + <li class="item"><a href="<?php echo _url('index', 'about'); ?>"><?php echo _t('gen.menu.about'); ?></a></li> <?php if (Minz_Configuration::canLogIn()) { ?><li class="separator"></li> - <li class="item"><a class="signout" href="<?php echo _url('auth', 'logout'); ?>"><?php echo _i('logout'), ' ', _t('logout'); ?></a></li><?php + <li class="item"><a class="signout" href="<?php echo _url('auth', 'logout'); ?>"><?php echo _i('logout'), ' ', _t('gen.auth.logout'); ?></a></li><?php } ?> </ul> </div> </div> <?php } elseif (Minz_Configuration::canLogIn()) { ?> <div class="item configure"> - <?php echo _i('login'); ?><a class="signin" href="<?php echo _url('auth', 'login'); ?>"><?php echo _t('login'); ?></a> + <?php echo _i('login'); ?><a class="signin" href="<?php echo _url('auth', 'login'); ?>"><?php echo _t('gen.auth.login'); ?></a> </div> <?php } ?> </div> diff --git a/app/layout/nav_menu.phtml b/app/layout/nav_menu.phtml index 775daf088..f8abf9032 100644 --- a/app/layout/nav_menu.phtml +++ b/app/layout/nav_menu.phtml @@ -23,7 +23,7 @@ <a id="toggle-<?php echo $state_str; ?>" class="btn <?php echo $state_enabled ? 'active' : ''; ?>" aria-checked="<?php echo $state_enabled ? 'true' : 'false'; ?>" - title="<?php echo _t($state_str); ?>" + title="<?php echo _t('index.menu.' . $state_str); ?>" href="<?php echo Minz_Url::display($url_state); ?>"><?php echo _i($state_str); ?></a> <?php } ?> @@ -35,7 +35,7 @@ <li class="dropdown-close"><a href="#close">❌</a></li> <li class="dropdown-header"> - <?php echo _t('queries'); ?> + <?php echo _t('index.menu.queries'); ?> <a class="no-mobile" href="<?php echo _url('configure', 'queries'); ?>"><?php echo _i('configure'); ?></a> </li> @@ -54,18 +54,18 @@ $url_query['c'] = 'configure'; $url_query['a'] = 'addQuery'; ?> - <li class="item no-mobile"><a href="<?php echo Minz_Url::display($url_query); ?>"><?php echo _i('bookmark-add'); ?> <?php echo _t('add_query'); ?></a></li> + <li class="item no-mobile"><a href="<?php echo Minz_Url::display($url_query); ?>"><?php echo _i('bookmark-add'); ?> <?php echo _t('index.menu.add_query'); ?></a></li> </ul> </div> </div> <?php $get = FreshRSS_Context::currentGet(); - $string_mark = _t('mark_all_read'); + $string_mark = _t('index.menu.mark_all_read'); if ($get[0] == 'f') { - $string_mark = _t('mark_feed_read'); + $string_mark = _t('index.menu.mark_feed_read'); } elseif ($get[0] == 'c') { - $string_mark = _t('mark_cat_read'); + $string_mark = _t('index.menu.mark_cat_read'); } $mark_read_url = array( @@ -86,7 +86,7 @@ <button class="read_all btn <?php echo $confirm; ?>" form="mark-read-menu" formaction="<?php echo Minz_Url::display($mark_read_url); ?>" - type="submit"><?php echo _t('mark_read'); ?></button> + type="submit"><?php echo _t('gen.action.mark_read'); ?></button> <div class="dropdown"> <div id="dropdown-read" class="dropdown-target"></div> @@ -113,13 +113,13 @@ <button class="as-link <?php echo $confirm; ?>" form="mark-read-menu" formaction="<?php echo Minz_Url::display($mark_before_today); ?>" - type="submit"><?php echo _t('before_one_day'); ?></button> + type="submit"><?php echo _t('index.menu.before_one_day'); ?></button> </li> <li class="item"> <button class="as-link <?php echo $confirm; ?>" form="mark-read-menu" formaction="<?php echo Minz_Url::display($mark_before_one_week); ?>" - type="submit"><?php echo _t('before_one_week'); ?></button> + type="submit"><?php echo _t('index.menu.before_one_week'); ?></button> </li> </ul> </div> @@ -129,17 +129,17 @@ <?php $url_output = Minz_Request::currentRequest(); ?> <div class="stick" id="nav_menu_views"> <?php $url_output['a'] = 'normal'; ?> - <a class="view_normal btn <?php echo $actual_view == 'normal'? 'active' : ''; ?>" title="<?php echo _t('normal_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>"> + <a class="view_normal btn <?php echo $actual_view == 'normal'? 'active' : ''; ?>" title="<?php echo _t('index.menu.normal_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>"> <?php echo _i("view-normal"); ?> </a> <?php $url_output['a'] = 'global'; ?> - <a class="view_global btn <?php echo $actual_view == 'global'? 'active' : ''; ?>" title="<?php echo _t('global_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>"> + <a class="view_global btn <?php echo $actual_view == 'global'? 'active' : ''; ?>" title="<?php echo _t('index.menu.global_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>"> <?php echo _i("view-global"); ?> </a> <?php $url_output['a'] = 'reader'; ?> - <a class="view_reader btn <?php echo $actual_view == 'reader'? 'active' : ''; ?>" title="<?php echo _t('global_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>"> + <a class="view_reader btn <?php echo $actual_view == 'reader'? 'active' : ''; ?>" title="<?php echo _t('index.menu.reader_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>"> <?php echo _i("view-reader"); ?> </a> @@ -149,7 +149,7 @@ $url_output['params']['token'] = FreshRSS_Context::$conf->token; } ?> - <a class="view_rss btn" target="_blank" title="<?php echo _t('rss_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>"> + <a class="view_rss btn" target="_blank" title="<?php echo _t('index.menu.rss_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>"> <?php echo _i('rss'); ?> </a> </div> @@ -157,7 +157,7 @@ <div class="item search"> <form action="<?php echo _url('index', 'index'); ?>" method="get"> <?php $search = Minz_Request::param('search', ''); ?> - <input type="search" name="search" class="extend" value="<?php echo $search; ?>" placeholder="<?php echo _t('search_short'); ?>" /> + <input type="search" name="search" class="extend" value="<?php echo $search; ?>" placeholder="<?php echo _t('index.menu.search_short'); ?>" /> <?php $get = Minz_Request::param('get', ''); ?> <?php if($get != '') { ?> @@ -180,11 +180,11 @@ if (FreshRSS_Context::$order === 'DESC') { $order = 'ASC'; $icon = 'up'; - $title = 'older_first'; + $title = 'index.menu.older_first'; } else { $order = 'DESC'; $icon = 'down'; - $title = 'newer_first'; + $title = 'index.menu.newer_first'; } $url_order = Minz_Request::currentRequest(); $url_order['params']['order'] = $order; @@ -194,6 +194,6 @@ </a> <?php if (FreshRSS_Auth::hasAccess() || Minz_Configuration::allowAnonymousRefresh()) { ?> - <a id="actualize" class="btn" href="<?php echo _url('feed', 'actualize'); ?>"><?php echo _i('refresh'); ?></a> + <a id="actualize" class="btn" href="<?php echo _url('feed', 'actualize'); ?>" title="<?php echo _t('gen.action.actualize'); ?>"><?php echo _i('refresh'); ?></a> <?php } ?> </div> diff --git a/app/views/auth/formLogin.phtml b/app/views/auth/formLogin.phtml index 0194a11a5..979e17349 100644 --- a/app/views/auth/formLogin.phtml +++ b/app/views/auth/formLogin.phtml @@ -1,28 +1,28 @@ <div class="prompt"> - <h1><?php echo _t('login'); ?></h1> + <h1><?php echo _t('gen.auth.login'); ?></h1> <form id="crypto-form" method="post" action="<?php echo _url('auth', 'login'); ?>"> <div> - <label for="username"><?php echo _t('username'); ?></label> + <label for="username"><?php echo _t('gen.auth.username'); ?></label> <input type="text" id="username" name="username" size="16" required="required" maxlength="16" pattern="[0-9a-zA-Z]{1,16}" autofocus="autofocus" /> </div> <div> - <label for="passwordPlain"><?php echo _t('password'); ?></label> + <label for="passwordPlain"><?php echo _t('gen.auth.password'); ?></label> <input type="password" id="passwordPlain" required="required" /> <input type="hidden" id="challenge" name="challenge" /><br /> - <noscript><strong><?php echo _t('javascript_should_be_activated'); ?></strong></noscript> + <noscript><strong><?php echo _t('gen.js.should_be_activated'); ?></strong></noscript> </div> <div> <label class="checkbox" for="keep_logged_in"> <input type="checkbox" name="keep_logged_in" id="keep_logged_in" value="1" /> - <?php echo _t('keep_logged_in'); ?> + <?php echo _t('gen.auth.keep_logged_in'); ?> </label> <br /> </div> <div> - <button id="loginButton" type="submit" class="btn btn-important"><?php echo _t('login'); ?></button> + <button id="loginButton" type="submit" class="btn btn-important"><?php echo _t('gen.auth.login'); ?></button> </div> </form> - <p><a href="<?php echo _url('index', 'about'); ?>"><?php echo _t('about_freshrss'); ?></a></p> + <p><a href="<?php echo _url('index', 'about'); ?>"><?php echo _t('gen.freshrss.about'); ?></a></p> </div> diff --git a/app/views/auth/index.phtml b/app/views/auth/index.phtml index 17a81f08b..420937042 100644 --- a/app/views/auth/index.phtml +++ b/app/views/auth/index.phtml @@ -1,22 +1,22 @@ <?php $this->partial('aside_configure'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> <form method="post" action="<?php echo _url('auth', 'index'); ?>"> - <legend><?php echo _t('auth_type'); ?></legend> + <legend><?php echo _t('admin.auth.type'); ?></legend> <div class="form-group"> - <label class="group-name" for="auth_type"><?php echo _t('auth_type'); ?></label> + <label class="group-name" for="auth_type"><?php echo _t('admin.auth.type'); ?></label> <div class="group-controls"> <select id="auth_type" name="auth_type" required="required"> <?php if (!in_array(Minz_Configuration::authType(), array('form', 'persona', 'http_auth', 'none'))) { ?> <option selected="selected"></option> <?php } ?> - <option value="form"<?php echo Minz_Configuration::authType() === 'form' ? ' selected="selected"' : '', cryptAvailable() ? '' : ' disabled="disabled"'; ?>><?php echo _t('auth_form'); ?></option> - <option value="persona"<?php echo Minz_Configuration::authType() === 'persona' ? ' selected="selected"' : '', FreshRSS_Context::$conf->mail_login == '' ? ' disabled="disabled"' : ''; ?>><?php echo _t('auth_persona'); ?></option> - <option value="http_auth"<?php echo Minz_Configuration::authType() === 'http_auth' ? ' selected="selected"' : '', httpAuthUser() == '' ? ' disabled="disabled"' : ''; ?>><?php echo _t('http_auth'); ?> (REMOTE_USER = '<?php echo httpAuthUser(); ?>')</option> - <option value="none"<?php echo Minz_Configuration::authType() === 'none' ? ' selected="selected"' : ''; ?>><?php echo _t('auth_none'); ?></option> + <option value="form"<?php echo Minz_Configuration::authType() === 'form' ? ' selected="selected"' : '', cryptAvailable() ? '' : ' disabled="disabled"'; ?>><?php echo _t('admin.auth.form'); ?></option> + <option value="persona"<?php echo Minz_Configuration::authType() === 'persona' ? ' selected="selected"' : '', FreshRSS_Context::$conf->mail_login == '' ? ' disabled="disabled"' : ''; ?>><?php echo _t('admin.auth.persona'); ?></option> + <option value="http_auth"<?php echo Minz_Configuration::authType() === 'http_auth' ? ' selected="selected"' : '', httpAuthUser() == '' ? ' disabled="disabled"' : ''; ?>><?php echo _t('admin.auth.http'); ?> (REMOTE_USER = '<?php echo httpAuthUser(); ?>')</option> + <option value="none"<?php echo Minz_Configuration::authType() === 'none' ? ' selected="selected"' : ''; ?>><?php echo _t('admin.auth.none'); ?></option> </select> </div> </div> @@ -26,7 +26,7 @@ <label class="checkbox" for="anon_access"> <input type="checkbox" name="anon_access" id="anon_access" value="1"<?php echo Minz_Configuration::allowAnonymous() ? ' checked="checked"' : '', Minz_Configuration::canLogIn() ? '' : ' disabled="disabled"'; ?> /> - <?php echo _t('allow_anonymous', Minz_Configuration::defaultUser()); ?> + <?php echo _t('admin.auth.allow_anonymous', Minz_Configuration::defaultUser()); ?> </label> </div> </div> @@ -36,7 +36,7 @@ <label class="checkbox" for="anon_refresh"> <input type="checkbox" name="anon_refresh" id="anon_refresh" value="1"<?php echo Minz_Configuration::allowAnonymousRefresh() ? ' checked="checked"' : '', Minz_Configuration::canLogIn() ? '' : ' disabled="disabled"'; ?> /> - <?php echo _t('allow_anonymous_refresh'); ?> + <?php echo _t('admin.auth.allow_anonymous_refresh'); ?> </label> </div> </div> @@ -46,7 +46,7 @@ <label class="checkbox" for="unsafe_autologin"> <input type="checkbox" name="unsafe_autologin" id="unsafe_autologin" value="1"<?php echo Minz_Configuration::unsafeAutologinEnabled() ? ' checked="checked"' : '', Minz_Configuration::canLogIn() ? '' : ' disabled="disabled"'; ?> /> - <?php echo _t('unsafe_autologin'); ?> + <?php echo _t('admin.auth.unsafe_autologin'); ?> <kbd>p/i/?a=formLogin&u=Alice&p=1234</kbd> </label> </div> @@ -54,12 +54,12 @@ <?php if (Minz_Configuration::canLogIn()) { ?> <div class="form-group"> - <label class="group-name" for="token"><?php echo _t('auth_token'); ?></label> + <label class="group-name" for="token"><?php echo _t('admin.auth.token'); ?></label> <?php $token = FreshRSS_Context::$conf->token; ?> <div class="group-controls"> - <input type="text" id="token" name="token" value="<?php echo $token; ?>" placeholder="<?php echo _t('blank_to_disable'); ?>"<?php + <input type="text" id="token" name="token" value="<?php echo $token; ?>" placeholder="<?php echo _t('gen.short.blank_to_disable'); ?>"<?php echo Minz_Configuration::canLogIn() ? '' : ' disabled="disabled"'; ?> /> - <?php echo _i('help'); ?> <?php echo _t('explain_token', Minz_Url::display(null, 'html', true), $token); ?> + <?php echo _i('help'); ?> <?php echo _t('admin.auth.token_help', Minz_Url::display(null, 'html', true), $token); ?> </div> </div> <?php } ?> @@ -69,15 +69,15 @@ <label class="checkbox" for="api_enabled"> <input type="checkbox" name="api_enabled" id="api_enabled" value="1"<?php echo Minz_Configuration::apiEnabled() ? ' checked="checked"' : '', Minz_Configuration::needsLogin() ? '' : ' disabled="disabled"'; ?> /> - <?php echo _t('api_enabled'); ?> + <?php echo _t('admin.auth.api_enabled'); ?> </label> </div> </div> <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> </div> </div> </form> diff --git a/app/views/auth/personaLogin.phtml b/app/views/auth/personaLogin.phtml index dd3e22b52..545ed2eac 100644 --- a/app/views/auth/personaLogin.phtml +++ b/app/views/auth/personaLogin.phtml @@ -1,21 +1,21 @@ <?php if ($this->res === false) { ?> <div class="prompt"> - <h1><?php echo _t('login'); ?></h1> + <h1><?php echo _t('gen.auth.login'); ?></h1> <p> <a class="signin btn btn-important" href="<?php echo _url('auth', 'login'); ?>"> - <?php echo _i('login'); ?> <?php echo _t('login_with_persona'); ?> + <?php echo _i('login'); ?> <?php echo _t('gen.auth.login_persona'); ?> </a> <br /><br /> <?php echo _i('help'); ?> <small> - <a href="<?php echo _url('auth', 'reset'); ?>"><?php echo _t('login_persona_problem'); ?></a> + <a href="<?php echo _url('auth', 'reset'); ?>"><?php echo _t('gen.auth.login_persona_problem'); ?></a> </small> </p> - <p><a href="<?php echo _url('index', 'about'); ?>"><?php echo _t('about_freshrss'); ?></a></p> + <p><a href="<?php echo _url('index', 'about'); ?>"><?php echo _t('gen.freshrss.about'); ?></a></p> </div> <?php } else { diff --git a/app/views/auth/reset.phtml b/app/views/auth/reset.phtml index e501555c4..6e9816ad3 100644 --- a/app/views/auth/reset.phtml +++ b/app/views/auth/reset.phtml @@ -1,5 +1,5 @@ <div class="prompt"> - <h1><?php echo _t('auth_reset'); ?></h1> + <h1><?php echo _t('gen.auth.reset'); ?></h1> <?php if (!empty($this->message)) { ?> <p class="alert <?php echo $this->message['status'] === 'bad' ? 'alert-error' : 'alert-warn'; ?>"> @@ -11,22 +11,22 @@ <?php if (!$this->no_form) { ?> <form id="crypto-form" method="post" action="<?php echo _url('auth', 'reset'); ?>"> <p class="alert alert-warn"> - <span class="alert-head"><?php echo _t('attention'); ?></span><br /> - <?php echo _t('auth_will_reset'); ?> + <span class="alert-head"><?php echo _t('gen.short.attention'); ?></span><br /> + <?php echo _t('gen.auth.will_reset'); ?> </p> <div> - <label for="username"><?php echo _t('username_admin'); ?></label> + <label for="username"><?php echo _t('gen.auth.username_admin'); ?></label> <input type="text" id="username" name="username" size="16" required="required" maxlength="16" pattern="[0-9a-zA-Z]{1,16}" autofocus="autofocus" /> </div> <div> - <label for="passwordPlain"><?php echo _t('password'); ?></label> + <label for="passwordPlain"><?php echo _t('gen.auth.password'); ?></label> <input type="password" id="passwordPlain" required="required" /> <input type="hidden" id="challenge" name="challenge" /><br /> - <noscript><strong><?php echo _t('javascript_should_be_activated'); ?></strong></noscript> + <noscript><strong><?php echo _t('gen.js.should_be_activated'); ?></strong></noscript> </div> <div> - <button id="loginButton" type="submit" class="btn btn-important"><?php echo _t('submit'); ?></button> + <button id="loginButton" type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> </div> </form> <?php } ?> diff --git a/app/views/configure/archiving.phtml b/app/views/configure/archiving.phtml index 7c2d79343..4e8dfd385 100644 --- a/app/views/configure/archiving.phtml +++ b/app/views/configure/archiving.phtml @@ -1,31 +1,31 @@ <?php $this->partial('aside_configure'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> <form method="post" action="<?php echo _url('configure', 'archiving'); ?>"> - <legend><?php echo _t('archiving_configuration'); ?></legend> - <p><?php echo _i('help'); ?> <?php echo _t('archiving_configuration_help'); ?></p> + <legend><?php echo _t('conf.archiving'); ?></legend> + <p><?php echo _i('help'); ?> <?php echo _t('conf.archiving.help'); ?></p> <div class="form-group"> - <label class="group-name" for="old_entries"><?php echo _t('delete_articles_every'); ?></label> + <label class="group-name" for="old_entries"><?php echo _t('conf.archiving.delete_after'); ?></label> <div class="group-controls"> - <input type="number" id="old_entries" name="old_entries" min="1" max="1200" value="<?php echo FreshRSS_Context::$conf->old_entries; ?>" /> <?php echo _t('month'); ?> - <a class="btn confirm" href="<?php echo _url('entry', 'purge'); ?>"><?php echo _t('purge_now'); ?></a> + <input type="number" id="old_entries" name="old_entries" min="1" max="1200" value="<?php echo FreshRSS_Context::$conf->old_entries; ?>" /> <?php echo _t('gen.date.month'); ?> + <a class="btn confirm" href="<?php echo _url('entry', 'purge'); ?>"><?php echo _t('conf.archiving.purge_now'); ?></a> </div> </div> <div class="form-group"> - <label class="group-name" for="keep_history_default"><?php echo _t('keep_history'), ' ', _t('by_feed'); ?></label> + <label class="group-name" for="keep_history_default"><?php echo _t('conf.archiving.keep_history_by_feed'); ?></label> <div class="group-controls"> <select class="number" name="keep_history_default" id="keep_history_default" required="required"><?php foreach (array('' => '', 0 => '0', 10 => '10', 50 => '50', 100 => '100', 500 => '500', 1000 => '1 000', 5000 => '5 000', 10000 => '10 000', -1 => '∞') as $v => $t) { echo '<option value="' . $v . (FreshRSS_Context::$conf->keep_history_default == $v ? '" selected="selected' : '') . '">' . $t . ' </option>'; } - ?></select> (<?php echo _t('by_default'); ?>) + ?></select> (<?php echo _t('gen.short.by_default'); ?>) </div> </div> <div class="form-group"> - <label class="group-name" for="ttl_default"><?php echo _t('ttl'); ?></label> + <label class="group-name" for="ttl_default"><?php echo _t('conf.archiving.ttl'); ?></label> <div class="group-controls"> <select class="number" name="ttl_default" id="ttl_default" required="required"><?php $found = false; @@ -42,31 +42,31 @@ if (!$found) { echo '<option value="' . intval(FreshRSS_Context::$conf->ttl_default) . '" selected="selected">' . intval(FreshRSS_Context::$conf->ttl_default) . 's</option>'; } - ?></select> (<?php echo _t('by_default'); ?>) + ?></select> (<?php echo _t('gen.short.by_default'); ?>) </div> </div> <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> </div> </div> </form> <form method="post" action="<?php echo _url('entry', 'optimize'); ?>"> - <legend><?php echo _t('advanced'); ?></legend> + <legend><?php echo _t('conf.archiving.advanced'); ?></legend> <div class="form-group"> - <label class="group-name"><?php echo _t('current_user'); ?></label> + <label class="group-name"><?php echo _t('conf.user.current'); ?></label> <div class="group-controls"> - <?php echo _t('conf.users.articles_and_size', format_number($this->nb_total), format_bytes($this->size_user)); ?> + <?php echo _t('conf.user.articles_and_size', format_number($this->nb_total), format_bytes($this->size_user)); ?> </div> </div> <?php if (FreshRSS_Auth::hasAccess('admin')) { ?> <div class="form-group"> - <label class="group-name"><?php echo _t('users'); ?></label> + <label class="group-name"><?php echo _t('conf.user.users'); ?></label> <div class="group-controls"> <?php echo format_bytes($this->size_total); ?> </div> @@ -75,8 +75,8 @@ <div class="form-group form-actions"> <div class="group-controls"> <input type="hidden" name="optimiseDatabase" value="1" /> - <button type="submit" class="btn btn-important"><?php echo _t('optimize_bdd'); ?></button> - <?php echo _i('help'); ?> <?php echo _t('optimize_todo_sometimes'); ?> + <button type="submit" class="btn btn-important"><?php echo _t('conf.archiving.optimize'); ?></button> + <?php echo _i('help'); ?> <?php echo _t('conf.archiving.optimize_help'); ?> </div> </div> <?php } ?> diff --git a/app/views/configure/display.phtml b/app/views/configure/display.phtml index 69205fa93..a245c8f5e 100644 --- a/app/views/configure/display.phtml +++ b/app/views/configure/display.phtml @@ -1,13 +1,13 @@ <?php $this->partial('aside_configure'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> <form method="post" action="<?php echo _url('configure', 'display'); ?>"> - <legend><?php echo _t('display_configuration'); ?></legend> + <legend><?php echo _t('conf.display'); ?></legend> <div class="form-group"> - <label class="group-name" for="language"><?php echo _t('language'); ?></label> + <label class="group-name" for="language"><?php echo _t('conf.display.language'); ?></label> <div class="group-controls"> <select name="language" id="language"> <?php $languages = FreshRSS_Context::$conf->availableLanguages(); ?> @@ -19,60 +19,74 @@ </div> <div class="form-group"> - <label class="group-name" for="theme"><?php echo _t('theme'); ?></label> + <label class="group-name" for="theme"><?php echo _t('conf.display.theme'); ?></label> <div class="group-controls"> - <select name="theme" id="theme" required=""><?php - $found = false; - foreach ($this->themes as $theme) { - ?><option value="<?php echo $theme['id']; ?>"<?php if (FreshRSS_Context::$conf->theme === $theme['id']) { echo ' selected="selected"'; $found = true; } ?>><?php - echo $theme['name'] . ' — ' . _t('by') . ' ' . $theme['author']; - ?></option><?php - } - if (!$found) { - ?><option selected="selected"></option><?php - } - ?></select> + <ul class="slides"> + <?php $slides = count($this->themes); $i = 1; ?> + <?php foreach($this->themes as $theme) { ?> + <input type="radio" name="theme" id="img-<?php echo $i ?>" <?php if (FreshRSS_Context::$conf->theme === $theme['id']) {echo "checked";}?> value="<?php echo $theme['id'] ?>"/> + <li class="slide-container"> + <div class="slide"> + <img src="<?php echo Minz_Url::display('/themes/' . $theme['id'] . '/thumbs/original.png')?>"/> + </div> + <div class="nav"> + <?php if ($i !== 1) {?> + <label for="img-<?php echo $i - 1 ?>" class="prev">‹</label> + <?php } ?> + <?php if ($i !== $slides) {?> + <label for="img-<?php echo $i + 1 ?>" class="next">›</label> + <?php } ?> + </div> + <div class="properties"> + <div><?php echo sprintf('%s — %s', $theme['name'], _t('gen.short.by_author', $theme['author'])); ?></div> + <div><?php echo $theme['description'] ?></div> + <div class="page-number"><?php echo sprintf('%d/%d', $i, $slides) ?></div> + </div> + </li> + <?php $i++ ?> + <?php } ?> + </ul> </div> </div> <?php $width = FreshRSS_Context::$conf->content_width; ?> <div class="form-group"> - <label class="group-name" for="content_width"><?php echo _t('content_width'); ?></label> + <label class="group-name" for="content_width"><?php echo _t('conf.display.width.content'); ?></label> <div class="group-controls"> <select name="content_width" id="content_width" required=""> <option value="thin" <?php echo $width === 'thin'? 'selected="selected"' : ''; ?>> - <?php echo _t('width_thin'); ?> + <?php echo _t('conf.display.width.thin'); ?> </option> <option value="medium" <?php echo $width === 'medium'? 'selected="selected"' : ''; ?>> - <?php echo _t('width_medium'); ?> + <?php echo _t('conf.display.width.medium'); ?> </option> <option value="large" <?php echo $width === 'large'? 'selected="selected"' : ''; ?>> - <?php echo _t('width_large'); ?> + <?php echo _t('conf.display.width.large'); ?> </option> <option value="no_limit" <?php echo $width === 'no_limit'? 'selected="selected"' : ''; ?>> - <?php echo _t('width_no_limit'); ?> + <?php echo _t('conf.display.width.no_limit'); ?> </option> </select> </div> </div> <div class="form-group"> - <label class="group-name" for="theme"><?php echo _t('article_icons'); ?></label> + <label class="group-name" for="theme"><?php echo _t('conf.display.icon.entry'); ?></label> <table> <thead> <tr> <th> </th> - <th title="<?php echo _t('mark_read'); ?>"><?php echo _i('read'); ?></th> - <th title="<?php echo _t('mark_favorite'); ?>"><?php echo _i('bookmark'); ?></th> - <th><?php echo _t('sharing'); ?></th> - <th><?php echo _t('related_tags'); ?></th> - <th><?php echo _t('publication_date'); ?></th> + <th title="<?php echo _t('gen.action.mark_read'); ?>"><?php echo _i('read'); ?></th> + <th title="<?php echo _t('gen.action.mark_favorite'); ?>"><?php echo _i('bookmark'); ?></th> + <th><?php echo _t('conf.display.icon.sharing'); ?></th> + <th><?php echo _t('conf.display.icon.related_tags'); ?></th> + <th><?php echo _t('conf.display.icon.publication_date'); ?></th> <th><?php echo _i('link'); ?></th> </tr> </thead> <tbody> <tr> - <th><?php echo _t('top_line'); ?></th> + <th><?php echo _t('conf.display.icon.top_line'); ?></th> <td><input type="checkbox" name="topline_read" value="1"<?php echo FreshRSS_Context::$conf->topline_read ? ' checked="checked"' : ''; ?> /></td> <td><input type="checkbox" name="topline_favorite" value="1"<?php echo FreshRSS_Context::$conf->topline_favorite ? ' checked="checked"' : ''; ?> /></td> <td><input type="checkbox" disabled="disabled" /></td> @@ -80,7 +94,7 @@ <td><input type="checkbox" name="topline_date" value="1"<?php echo FreshRSS_Context::$conf->topline_date ? ' checked="checked"' : ''; ?> /></td> <td><input type="checkbox" name="topline_link" value="1"<?php echo FreshRSS_Context::$conf->topline_link ? ' checked="checked"' : ''; ?> /></td> </tr><tr> - <th><?php echo _t('bottom_line'); ?></th> + <th><?php echo _t('conf.display.icon.bottom_line'); ?></th> <td><input type="checkbox" name="bottomline_read" value="1"<?php echo FreshRSS_Context::$conf->bottomline_read ? ' checked="checked"' : ''; ?> /></td> <td><input type="checkbox" name="bottomline_favorite" value="1"<?php echo FreshRSS_Context::$conf->bottomline_favorite ? ' checked="checked"' : ''; ?> /></td> <td><input type="checkbox" name="bottomline_sharing" value="1"<?php echo FreshRSS_Context::$conf->bottomline_sharing ? ' checked="checked"' : ''; ?> /></td> @@ -93,16 +107,16 @@ </div> <div class="form-group"> - <label class="group-name" for="posts_per_page"><?php echo _t('html5_notif_timeout'); ?></label> + <label class="group-name" for="posts_per_page"><?php echo _t('conf.display.notif_html5.timeout'); ?></label> <div class="group-controls"> - <input type="number" id="html5_notif_timeout" name="html5_notif_timeout" value="<?php echo FreshRSS_Context::$conf->html5_notif_timeout; ?>" /> <?php echo _t('seconds_(0_means_no_timeout)'); ?> + <input type="number" id="html5_notif_timeout" name="html5_notif_timeout" value="<?php echo FreshRSS_Context::$conf->html5_notif_timeout; ?>" /> <?php echo _t('conf.display.notif_html5.seconds'); ?> </div> </div> <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> </div> </div> </form> diff --git a/app/views/configure/queries.phtml b/app/views/configure/queries.phtml index 994dfc11b..1b3a08c91 100644 --- a/app/views/configure/queries.phtml +++ b/app/views/configure/queries.phtml @@ -1,15 +1,15 @@ <?php $this->partial('aside_configure'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> <form method="post" action="<?php echo _url('configure', 'queries'); ?>"> - <legend><?php echo _t('queries'); ?></legend> + <legend><?php echo _t('conf.query'); ?></legend> <?php foreach (FreshRSS_Context::$conf->queries as $key => $query) { ?> <div class="form-group" id="query-group-<?php echo $key; ?>"> <label class="group-name" for="queries_<?php echo $key; ?>_name"> - <?php echo _t('query_number', $key + 1); ?> + <?php echo _t('conf.query.number', $key + 1); ?> </label> <div class="group-controls"> @@ -49,31 +49,31 @@ <?php if ($exist === 0) { ?> <div class="alert alert-warn"> - <div class="alert-head"><?php echo _t('no_query_filter'); ?></div> + <div class="alert-head"><?php echo _t('conf.query.no_filter'); ?></div> </div> <?php } elseif ($deprecated) { ?> <div class="alert alert-error"> - <div class="alert-head"><?php echo _t('query_deprecated'); ?></div> + <div class="alert-head"><?php echo _t('conf.query.deprecated'); ?></div> </div> <?php } else { ?> <div class="alert alert-success"> - <div class="alert-head"><?php echo _t('query_filter'); ?></div> + <div class="alert-head"><?php echo _t('conf.query.filter'); ?></div> <ul> <?php if (isset($query['search'])) { ?> - <li class="item"><?php echo _t('query_search', $query['search']); ?></li> + <li class="item"><?php echo _t('conf.query.search', $query['search']); ?></li> <?php } ?> <?php if (isset($query['state'])) { ?> - <li class="item"><?php echo _t('query_state_' . $query['state']); ?></li> + <li class="item"><?php echo _t('conf.query.state_' . $query['state']); ?></li> <?php } ?> <?php if (isset($query['order'])) { ?> - <li class="item"><?php echo _t('query_order_' . strtolower($query['order'])); ?></li> + <li class="item"><?php echo _t('conf.query.order_' . strtolower($query['order'])); ?></li> <?php } ?> <?php if (isset($query['get'])) { ?> - <li class="item"><?php echo _t('query_get_' . $this->query_get[$key]['type'], $this->query_get[$key]['name']); ?></li> + <li class="item"><?php echo _t('conf.query.get_' . $this->query_get[$key]['type'], $this->query_get[$key]['name']); ?></li> <?php } ?> </ul> </div> @@ -85,12 +85,12 @@ <?php if (count(FreshRSS_Context::$conf->queries) > 0) { ?> <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> </div> </div> <?php } else { ?> - <p class="alert alert-warn"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('no_query'); ?></p> + <p class="alert alert-warn"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('conf.query.none'); ?></p> <?php } ?> </form> diff --git a/app/views/configure/reading.phtml b/app/views/configure/reading.phtml index b8f673466..440ad1df8 100644 --- a/app/views/configure/reading.phtml +++ b/app/views/configure/reading.phtml @@ -1,47 +1,47 @@ <?php $this->partial('aside_configure'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> <form method="post" action="<?php echo _url('configure', 'reading'); ?>"> - <legend><?php echo _t('reading_configuration'); ?></legend> + <legend><?php echo _t('conf.reading'); ?></legend> <div class="form-group"> - <label class="group-name" for="posts_per_page"><?php echo _t('articles_per_page'); ?></label> + <label class="group-name" for="posts_per_page"><?php echo _t('conf.reading.articles_per_page'); ?></label> <div class="group-controls"> <input type="number" id="posts_per_page" name="posts_per_page" value="<?php echo FreshRSS_Context::$conf->posts_per_page; ?>" min="5" max="50" /> - <?php echo _i('help'); ?> <?php echo _t('number_divided_when_reader'); ?> + <?php echo _i('help'); ?> <?php echo _t('conf.reading.number_divided_when_reader'); ?> </div> </div> <div class="form-group"> - <label class="group-name" for="sort_order"><?php echo _t('sort_order'); ?></label> + <label class="group-name" for="sort_order"><?php echo _t('conf.reading.sort'); ?></label> <div class="group-controls"> <select name="sort_order" id="sort_order"> - <option value="DESC"<?php echo FreshRSS_Context::$conf->sort_order === 'DESC' ? ' selected="selected"' : ''; ?>><?php echo _t('newer_first'); ?></option> - <option value="ASC"<?php echo FreshRSS_Context::$conf->sort_order === 'ASC' ? ' selected="selected"' : ''; ?>><?php echo _t('older_first'); ?></option> + <option value="DESC"<?php echo FreshRSS_Context::$conf->sort_order === 'DESC' ? ' selected="selected"' : ''; ?>><?php echo _t('conf.reading.sort.newer_first'); ?></option> + <option value="ASC"<?php echo FreshRSS_Context::$conf->sort_order === 'ASC' ? ' selected="selected"' : ''; ?>><?php echo _t('conf.reading.sort.older_first'); ?></option> </select> </div> </div> <div class="form-group"> - <label class="group-name" for="view_mode"><?php echo _t('default_view'); ?></label> + <label class="group-name" for="view_mode"><?php echo _t('conf.reading.view.default'); ?></label> <div class="group-controls"> <select name="view_mode" id="view_mode"> - <option value="normal"<?php echo FreshRSS_Context::$conf->view_mode === 'normal' ? ' selected="selected"' : ''; ?>><?php echo _t('normal_view'); ?></option> - <option value="reader"<?php echo FreshRSS_Context::$conf->view_mode === 'reader' ? ' selected="selected"' : ''; ?>><?php echo _t('reader_view'); ?></option> - <option value="global"<?php echo FreshRSS_Context::$conf->view_mode === 'global' ? ' selected="selected"' : ''; ?>><?php echo _t('global_view'); ?></option> + <option value="normal"<?php echo FreshRSS_Context::$conf->view_mode === 'normal' ? ' selected="selected"' : ''; ?>><?php echo _t('conf.reading.view.normal'); ?></option> + <option value="reader"<?php echo FreshRSS_Context::$conf->view_mode === 'reader' ? ' selected="selected"' : ''; ?>><?php echo _t('conf.reading.view.reader'); ?></option> + <option value="global"<?php echo FreshRSS_Context::$conf->view_mode === 'global' ? ' selected="selected"' : ''; ?>><?php echo _t('conf.reading.view.global'); ?></option> </select> </div> </div> <div class="form-group"> - <label class="group-name" for="view_mode"><?php echo _t('articles_to_display'); ?></label> + <label class="group-name" for="view_mode"><?php echo _t('conf.reading.show'); ?></label> <div class="group-controls"> <select name="default_view" id="default_view"> - <option value="adaptive"<?php echo FreshRSS_Context::$conf->default_view === 'adaptive' ? ' selected="selected"' : ''; ?>><?php echo _t('show_adaptive'); ?></option> - <option value="all"<?php echo FreshRSS_Context::$conf->default_view === 'all' ? ' selected="selected"' : ''; ?>><?php echo _t('show_all_articles'); ?></option> - <option value="unread"<?php echo FreshRSS_Context::$conf->default_view === 'unread' ? ' selected="selected"' : ''; ?>><?php echo _t('show_not_reads'); ?></option> + <option value="adaptive"<?php echo FreshRSS_Context::$conf->default_view === 'adaptive' ? ' selected="selected"' : ''; ?>><?php echo _t('conf.reading.show.adaptive'); ?></option> + <option value="all"<?php echo FreshRSS_Context::$conf->default_view === 'all' ? ' selected="selected"' : ''; ?>><?php echo _t('conf.reading.show.all_articles'); ?></option> + <option value="unread"<?php echo FreshRSS_Context::$conf->default_view === 'unread' ? ' selected="selected"' : ''; ?>><?php echo _t('conf.reading.show.unread'); ?></option> </select> </div> </div> @@ -50,7 +50,7 @@ <div class="group-controls"> <label class="checkbox" for="hide_read_feeds"> <input type="checkbox" name="hide_read_feeds" id="hide_read_feeds" value="1"<?php echo FreshRSS_Context::$conf->hide_read_feeds ? ' checked="checked"' : ''; ?> /> - <?php echo _t('hide_read_feeds'); ?> + <?php echo _t('conf.reading.hide_read_feeds'); ?> </label> </div> </div> @@ -59,8 +59,8 @@ <div class="group-controls"> <label class="checkbox" for="display_posts"> <input type="checkbox" name="display_posts" id="display_posts" value="1"<?php echo FreshRSS_Context::$conf->display_posts ? ' checked="checked"' : ''; ?> /> - <?php echo _t('display_articles_unfolded'); ?> - <noscript> — <strong><?php echo _t('javascript_should_be_activated'); ?></strong></noscript> + <?php echo _t('conf.reading.display_articles_unfolded'); ?> + <noscript> — <strong><?php echo _t('gen.js.should_be_activated'); ?></strong></noscript> </label> </div> </div> @@ -69,8 +69,8 @@ <div class="group-controls"> <label class="checkbox" for="display_categories"> <input type="checkbox" name="display_categories" id="display_categories" value="1"<?php echo FreshRSS_Context::$conf->display_categories ? ' checked="checked"' : ''; ?> /> - <?php echo _t('display_categories_unfolded'); ?> - <noscript> — <strong><?php echo _t('javascript_should_be_activated'); ?></strong></noscript> + <?php echo _t('conf.reading.display_categories_unfolded'); ?> + <noscript> — <strong><?php echo _t('gen.js.should_be_activated'); ?></strong></noscript> </label> </div> </div> @@ -79,8 +79,8 @@ <div class="group-controls"> <label class="checkbox" for="sticky_post"> <input type="checkbox" name="sticky_post" id="sticky_post" value="1"<?php echo FreshRSS_Context::$conf->sticky_post ? ' checked="checked"' : ''; ?> /> - <?php echo _t('sticky_post'); ?> - <noscript> — <strong><?php echo _t('javascript_should_be_activated'); ?></strong></noscript> + <?php echo _t('conf.reading.sticky_post'); ?> + <noscript> — <strong><?php echo _t('gen.js.should_be_activated'); ?></strong></noscript> </label> </div> </div> @@ -89,8 +89,8 @@ <div class="group-controls"> <label class="checkbox" for="auto_load_more"> <input type="checkbox" name="auto_load_more" id="auto_load_more" value="1"<?php echo FreshRSS_Context::$conf->auto_load_more ? ' checked="checked"' : ''; ?> /> - <?php echo _t('auto_load_more'); ?> - <noscript> — <strong><?php echo _t('javascript_should_be_activated'); ?></strong></noscript> + <?php echo _t('conf.reading.auto_load_more'); ?> + <noscript> — <strong><?php echo _t('gen.js.should_be_activated'); ?></strong></noscript> </label> </div> </div> @@ -99,8 +99,8 @@ <div class="group-controls"> <label class="checkbox" for="lazyload"> <input type="checkbox" name="lazyload" id="lazyload" value="1"<?php echo FreshRSS_Context::$conf->lazyload ? ' checked="checked"' : ''; ?> /> - <?php echo _t('img_with_lazyload'); ?> - <noscript> — <strong><?php echo _t('javascript_should_be_activated'); ?></strong></noscript> + <?php echo _t('conf.reading.img_with_lazyload'); ?> + <noscript> — <strong><?php echo _t('gen.js.should_be_activated'); ?></strong></noscript> </label> </div> </div> @@ -109,48 +109,58 @@ <div class="group-controls"> <label class="checkbox" for="reading_confirm"> <input type="checkbox" name="reading_confirm" id="reading_confirm" value="1"<?php echo FreshRSS_Context::$conf->reading_confirm ? ' checked="checked"' : ''; ?> /> - <?php echo _t('reading_confirm'); ?> - <noscript> — <strong><?php echo _t('javascript_should_be_activated'); ?></strong></noscript> + <?php echo _t('conf.reading.confirm_enabled'); ?> + <noscript> — <strong><?php echo _t('gen.js.should_be_activated'); ?></strong></noscript> </label> </div> </div> <div class="form-group"> - <label class="group-name"><?php echo _t('auto_read_when'); ?></label> + <div class="group-controls"> + <label class="checkbox" for="auto_remove_article"> + <input type="checkbox" name="auto_remove_article" id="auto_remove_article" value="1"<?php echo FreshRSS_Context::$conf->auto_remove_article ? ' checked="checked"' : ''; ?> /> + <?php echo _t('conf.reading.auto_remove_article'); ?> + <noscript> — <strong><?php echo _t('gen.js.should_be_activated'); ?></strong></noscript> + </label> + </div> + </div> + + <div class="form-group"> + <label class="group-name"><?php echo _t('conf.reading.read.when'); ?></label> <div class="group-controls"> <label class="checkbox" for="check_open_article"> <input type="checkbox" name="mark_open_article" id="check_open_article" value="1"<?php echo FreshRSS_Context::$conf->mark_when['article'] ? ' checked="checked"' : ''; ?> /> - <?php echo _t('article_viewed'); ?> + <?php echo _t('conf.reading.read.article_viewed'); ?> </label> <label class="checkbox" for="check_open_site"> <input type="checkbox" name="mark_open_site" id="check_open_site" value="1"<?php echo FreshRSS_Context::$conf->mark_when['site'] ? ' checked="checked"' : ''; ?> /> - <?php echo _t('article_open_on_website'); ?> + <?php echo _t('conf.reading.read.article_open_on_website'); ?> </label> <label class="checkbox" for="check_scroll"> <input type="checkbox" name="mark_scroll" id="check_scroll" value="1"<?php echo FreshRSS_Context::$conf->mark_when['scroll'] ? ' checked="checked"' : ''; ?> /> - <?php echo _t('scroll'); ?> + <?php echo _t('conf.reading.read.scroll'); ?> </label> <label class="checkbox" for="check_reception"> <input type="checkbox" name="mark_upon_reception" id="check_reception" value="1"<?php echo FreshRSS_Context::$conf->mark_when['reception'] ? ' checked="checked"' : ''; ?> /> - <?php echo _t('upon_reception'); ?> + <?php echo _t('conf.reading.read.upon_reception'); ?> </label> </div> </div> <div class="form-group"> - <label class="group-name"><?php echo _t('after_onread'); ?></label> + <label class="group-name"><?php echo _t('conf.reading.after_onread'); ?></label> <div class="group-controls"> <label class="checkbox" for="onread_jump_next"> <input type="checkbox" name="onread_jump_next" id="onread_jump_next" value="1"<?php echo FreshRSS_Context::$conf->onread_jump_next ? ' checked="checked"' : ''; ?> /> - <?php echo _t('jump_next'); ?> + <?php echo _t('conf.reading.jump_next'); ?> </label> </div> </div> <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> </div> </div> diff --git a/app/views/configure/sharing.phtml b/app/views/configure/sharing.phtml index ef5e85a0c..b42825382 100644 --- a/app/views/configure/sharing.phtml +++ b/app/views/configure/sharing.phtml @@ -1,7 +1,7 @@ <?php $this->partial('aside_configure'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> <form method="post" action="<?php echo _url('configure', 'sharing'); ?>" data-simple='<div class="form-group" id="group-share-##key##"><label class="group-name">##label##</label><div class="group-controls"><a href="#" class="remove btn btn-attention" data-remove="group-share-##key##"><?php echo _i('close'); ?></a> @@ -9,28 +9,28 @@ data-advanced='<div class="form-group" id="group-share-##key##"><label class="group-name">##label##</label><div class="group-controls"> <input type="hidden" id="share_##key##_type" name="share[##key##][type]" value="##type##" /> <div class="stick"> - <input type="text" id="share_##key##_name" name="share[##key##][name]" class="extend" value="" placeholder="<?php echo _t('share_name'); ?>" size="64" /> - <input type="url" id="share_##key##_url" name="share[##key##][url]" class="extend" value="" placeholder="<?php echo _t('share_url'); ?>" size="64" /> + <input type="text" id="share_##key##_name" name="share[##key##][name]" class="extend" value="" placeholder="<?php echo _t('conf.sharing.share_name'); ?>" size="64" /> + <input type="url" id="share_##key##_url" name="share[##key##][url]" class="extend" value="" placeholder="<?php echo _t('conf.sharing.share_url'); ?>" size="64" /> <a href="#" class="remove btn btn-attention" data-remove="group-share-##key##"><?php echo _i('close'); ?></a></div> - <a target="_blank" class="btn" title="<?php echo _t('more_information'); ?>" href="##help##"><?php echo _i('help'); ?></a> + <a target="_blank" class="btn" title="<?php echo _t('conf.sharing.more_information'); ?>" href="##help##"><?php echo _i('help'); ?></a> </div></div>'> - <legend><?php echo _t('sharing'); ?></legend> + <legend><?php echo _t('conf.sharing'); ?></legend> <?php foreach (FreshRSS_Context::$conf->sharing as $key => $sharing): ?> <?php $share = FreshRSS_Context::$conf->shares[$sharing['type']]; ?> <div class="form-group" id="group-share-<?php echo $key; ?>"> <label class="group-name"> - <?php echo _t($sharing['type']); ?> + <?php echo _t('conf.sharing.' . $sharing['type']); ?> </label> <div class="group-controls"> <input type='hidden' id='share_<?php echo $key;?>_type' name="share[<?php echo $key;?>][type]" value='<?php echo $sharing['type']?>' /> <?php if ($share['form'] === 'advanced') { ?> <div class="stick"> - <input type="text" id="share_<?php echo $key;?>_name" name="share[<?php echo $key;?>][name]" class="extend" value="<?php echo $sharing['name']?>" placeholder="<?php echo _t('share_name'); ?>" size="64" /> - <input type="url" id="share_<?php echo $key;?>_url" name="share[<?php echo $key;?>][url]" class="extend" value="<?php echo $sharing['url']?>" placeholder="<?php echo _t('share_url'); ?>" size="64" /> + <input type="text" id="share_<?php echo $key;?>_name" name="share[<?php echo $key;?>][name]" class="extend" value="<?php echo $sharing['name']?>" placeholder="<?php echo _t('conf.sharing.share_name'); ?>" size="64" /> + <input type="url" id="share_<?php echo $key;?>_url" name="share[<?php echo $key;?>][url]" class="extend" value="<?php echo $sharing['url']?>" placeholder="<?php echo _t('conf.sharing.share_url'); ?>" size="64" /> <a href='#' class='remove btn btn-attention' data-remove="group-share-<?php echo $key; ?>"><?php echo _i('close'); ?></a> </div> - <a target="_blank" class="btn" title="<?php echo _t('more_information'); ?>" href="<?php echo $share['help']?>"><?php echo _i('help'); ?></a> + <a target="_blank" class="btn" title="<?php echo _t('conf.sharing.more_information'); ?>" href="<?php echo $share['help']?>"><?php echo _i('help'); ?></a> <?php } else { ?> <a href='#' class='remove btn btn-attention' data-remove="group-share-<?php echo $key; ?>"><?php echo _i('close'); ?></a> <?php } ?> @@ -42,7 +42,7 @@ <div class="group-controls"> <select> <?php foreach(FreshRSS_Context::$conf->shares as $key => $params):?> - <option value='<?php echo $key?>' data-form='<?php echo $params['form']?>' data-help='<?php if (!empty($params['help'])) {echo $params['help'];}?>'><?php echo _t($key) ?></option> + <option value='<?php echo $key?>' data-form='<?php echo $params['form']?>' data-help='<?php if (!empty($params['help'])) {echo $params['help'];}?>'><?php echo _t('conf.sharing.' . $key) ?></option> <?php endforeach; ?> </select> <a href='#' class='share add btn'><?php echo _i('add'); ?></a> @@ -51,8 +51,8 @@ <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> </div> </div> </form> diff --git a/app/views/configure/shortcut.phtml b/app/views/configure/shortcut.phtml index 66a23877e..dca8b6ef8 100644 --- a/app/views/configure/shortcut.phtml +++ b/app/views/configure/shortcut.phtml @@ -1,7 +1,7 @@ <?php $this->partial('aside_configure'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> <datalist id="keys"> <?php foreach ($this->list_keys as $key) { ?> @@ -12,114 +12,114 @@ <?php $s = FreshRSS_Context::$conf->shortcuts; ?> <form method="post" action="<?php echo _url('configure', 'shortcut'); ?>"> - <legend><?php echo _t('shortcuts'); ?></legend> + <legend><?php echo _t('conf.shortcut'); ?></legend> - <noscript><p class="alert alert-error"><?php echo _t('javascript_for_shortcuts'); ?></p></noscript> + <noscript><p class="alert alert-error"><?php echo _t('conf.shortcut.javascript'); ?></p></noscript> - <legend><?php echo _t('shortcuts_navigation'); ?></legend> + <legend><?php echo _t('conf.shortcut.navigation'); ?></legend> - <p class="alert alert-warn"><?php echo _t('shortcuts_navigation_help');?></p> + <p class="alert alert-warn"><?php echo _t('conf.shortcut.navigation_help');?></p> <div class="form-group"> - <label class="group-name" for="next_entry"><?php echo _t('next_article'); ?></label> + <label class="group-name" for="next_entry"><?php echo _t('conf.shortcut.next_article'); ?></label> <div class="group-controls"> <input type="text" id="next_entry" name="shortcuts[next_entry]" list="keys" value="<?php echo $s['next_entry']; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="prev_entry"><?php echo _t('previous_article'); ?></label> + <label class="group-name" for="prev_entry"><?php echo _t('conf.shortcut.previous_article'); ?></label> <div class="group-controls"> <input type="text" id="prev_entry" name="shortcuts[prev_entry]" list="keys" value="<?php echo $s['prev_entry']; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="first_entry"><?php echo _t('first_article'); ?></label> + <label class="group-name" for="first_entry"><?php echo _t('conf.shortcut.first_article'); ?></label> <div class="group-controls"> <input type="text" id="first_entry" name="shortcuts[first_entry]" list="keys" value="<?php echo $s['first_entry']; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="last_entry"><?php echo _t('last_article'); ?></label> + <label class="group-name" for="last_entry"><?php echo _t('conf.shortcut.last_article'); ?></label> <div class="group-controls"> <input type="text" id="last_entry" name="shortcuts[last_entry]" list="keys" value="<?php echo $s['last_entry']; ?>" /> </div> </div> - <legend><?php echo _t('shortcuts_article_action');?></legend> + <legend><?php echo _t('conf.shortcut.article_action');?></legend> <div class="form-group"> - <label class="group-name" for="mark_read"><?php echo _t('mark_read'); ?></label> + <label class="group-name" for="mark_read"><?php echo _t('conf.shortcut.mark_read'); ?></label> <div class="group-controls"> <input type="text" id="mark_read" name="shortcuts[mark_read]" list="keys" value="<?php echo $s['mark_read']; ?>" /> - <?php echo _t('shift_for_all_read'); ?> + <?php echo _t('conf.shortcut.shift_for_all_read'); ?> </div> </div> <div class="form-group"> - <label class="group-name" for="mark_favorite"><?php echo _t('mark_favorite'); ?></label> + <label class="group-name" for="mark_favorite"><?php echo _t('conf.shortcut.mark_favorite'); ?></label> <div class="group-controls"> <input type="text" id="mark_favorite" name="shortcuts[mark_favorite]" list="keys" value="<?php echo $s['mark_favorite']; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="go_website"><?php echo _t('see_on_website'); ?></label> + <label class="group-name" for="go_website"><?php echo _t('conf.shortcut.see_on_website'); ?></label> <div class="group-controls"> <input type="text" id="go_website" name="shortcuts[go_website]" list="keys" value="<?php echo $s['go_website']; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="auto_share_shortcut"><?php echo _t('auto_share'); ?></label> + <label class="group-name" for="auto_share_shortcut"><?php echo _t('conf.shortcut.auto_share'); ?></label> <div class="group-controls"> <input type="text" id="auto_share_shortcut" name="shortcuts[auto_share]" list="keys" value="<?php echo $s['auto_share']; ?>" /> - <?php echo _t('auto_share_help'); ?> + <?php echo _t('conf.shortcut.auto_share_help'); ?> </div> </div> <div class="form-group"> - <label class="group-name" for="collapse_entry"><?php echo _t('collapse_article'); ?></label> + <label class="group-name" for="collapse_entry"><?php echo _t('conf.shortcut.collapse_article'); ?></label> <div class="group-controls"> <input type="text" id="collapse_entry" name="shortcuts[collapse_entry]" list="keys" value="<?php echo $s['collapse_entry']; ?>" /> </div> </div> - <legend><?php echo _t('shortcuts_other_action');?></legend> + <legend><?php echo _t('conf.shortcut.other_action');?></legend> <div class="form-group"> - <label class="group-name" for="load_more_shortcut"><?php echo _t('load_more'); ?></label> + <label class="group-name" for="load_more_shortcut"><?php echo _t('conf.shortcut.load_more'); ?></label> <div class="group-controls"> <input type="text" id="load_more_shortcut" name="shortcuts[load_more]" list="keys" value="<?php echo $s['load_more']; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="focus_search_shortcut"><?php echo _t('focus_search'); ?></label> + <label class="group-name" for="focus_search_shortcut"><?php echo _t('conf.shortcut.focus_search'); ?></label> <div class="group-controls"> <input type="text" id="focus_search_shortcut" name="shortcuts[focus_search]" list="keys" value="<?php echo $s['focus_search']; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="user_filter_shortcut"><?php echo _t('user_filter'); ?></label> + <label class="group-name" for="user_filter_shortcut"><?php echo _t('conf.shortcut.user_filter'); ?></label> <div class="group-controls"> <input type="text" id="user_filter_shortcut" name="shortcuts[user_filter]" list="keys" value="<?php echo $s['user_filter']; ?>" /> - <?php echo _t('user_filter_help'); ?> + <?php echo _t('conf.shortcut.user_filter_help'); ?> </div> </div> <div class="form-group"> - <label class="group-name" for="close_dropdown_shortcut"><?php echo _t('close_dropdown'); ?></label> + <label class="group-name" for="close_dropdown_shortcut"><?php echo _t('conf.shortcut.close_dropdown'); ?></label> <div class="group-controls"> <input type="text" id="help_shortcut" name="shortcuts[close_dropdown]" list="keys" value="<?php echo $s['close_dropdown']; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="help_shortcut"><?php echo _t('help'); ?></label> + <label class="group-name" for="help_shortcut"><?php echo _t('conf.shortcut.help'); ?></label> <div class="group-controls"> <input type="text" id="help_shortcut" name="shortcuts[help]" list="keys" value="<?php echo $s['help']; ?>" /> </div> @@ -127,8 +127,8 @@ <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> </div> </div> </form> diff --git a/app/views/error/index.phtml b/app/views/error/index.phtml index 5e1949800..fe3abf8c4 100644 --- a/app/views/error/index.phtml +++ b/app/views/error/index.phtml @@ -3,7 +3,7 @@ <h1 class="alert-head"><?php echo $this->code; ?></h1> <p> <?php echo $this->errorMessage; ?><br /> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> </p> </div> </div> diff --git a/app/views/feed/add.phtml b/app/views/feed/add.phtml index 1db053b52..4cdd3f390 100644 --- a/app/views/feed/add.phtml +++ b/app/views/feed/add.phtml @@ -1,16 +1,16 @@ <?php if ($this->feed) { ?> <div class="post"> - <h1><?php echo _t('add_rss_feed'); ?></h1> + <h1><?php echo _t('sub.feed.add'); ?></h1> <?php if (!$this->load_ok) { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('internal_problem_feed', _url('index', 'logs')); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('feedback.sub.feed.internal_problem', _url('index', 'logs')); ?></p> <?php } ?> <form method="post" action="<?php echo _url('feed', 'add'); ?>" autocomplete="off"> - <legend><?php echo _t('informations'); ?></legend> + <legend><?php echo _t('sub.feed.informations'); ?></legend> <?php if ($this->load_ok) { ?> <div class="form-group"> - <label class="group-name"><?php echo _t('title'); ?></label> + <label class="group-name"><?php echo _t('sub.feed.title'); ?></label> <div class="group-controls"> <label><?php echo $this->feed->name() ; ?></label> </div> @@ -18,7 +18,7 @@ <?php $desc = $this->feed->description(); if ($desc != '') { ?> <div class="form-group"> - <label class="group-name"><?php echo _t('feed_description'); ?></label> + <label class="group-name"><?php echo _t('sub.feed.description'); ?></label> <div class="group-controls"> <label><?php echo htmlspecialchars($desc, ENT_NOQUOTES, 'UTF-8'); ?></label> </div> @@ -26,7 +26,7 @@ <?php } ?> <div class="form-group"> - <label class="group-name"><?php echo _t('website_url'); ?></label> + <label class="group-name"><?php echo _t('sub.feed.website'); ?></label> <div class="group-controls"> <?php echo $this->feed->website(); ?> <a class="btn" target="_blank" href="<?php echo $this->feed->website(); ?>"><?php echo _i('link'); ?></a> @@ -35,17 +35,17 @@ <?php } ?> <div class="form-group"> - <label class="group-name" for="url"><?php echo _t('feed_url'); ?></label> + <label class="group-name" for="url"><?php echo _t('sub.feed.url'); ?></label> <div class="group-controls"> <div class="stick"> <input type="text" name="url_rss" id="url" class="extend" value="<?php echo $this->feed->url(); ?>" /> <a class="btn" target="_blank" href="<?php echo $this->feed->url(); ?>"><?php echo _i('link'); ?></a> </div> - <a class="btn" target="_blank" href="http://validator.w3.org/feed/check.cgi?url=<?php echo $this->feed->url(); ?>"><?php echo _t('feed_validator'); ?></a> + <a class="btn" target="_blank" href="http://validator.w3.org/feed/check.cgi?url=<?php echo $this->feed->url(); ?>"><?php echo _t('sub.feed.validator'); ?></a> </div> </div> <div class="form-group"> - <label class="group-name" for="category"><?php echo _t('category'); ?></label> + <label class="group-name" for="category"><?php echo _t('sub.category'); ?></label> <div class="group-controls"> <select name="category" id="category"> <?php foreach ($this->categories as $cat) { ?> @@ -53,37 +53,37 @@ <?php echo $cat->name(); ?> </option> <?php } ?> - <option value="nc"><?php echo _t('new_category'); ?></option> + <option value="nc"><?php echo _t('sub.category.new'); ?></option> </select> <span style="display: none;"> - <input type="text" name="new_category[name]" id="new_category_name" autocomplete="off" placeholder="<?php echo _t('new_category'); ?>" /> + <input type="text" name="new_category[name]" id="new_category_name" autocomplete="off" placeholder="<?php echo _t('sub.category.new'); ?>" /> </span> </div> </div> - <legend><?php echo _t('http_authentication'); ?></legend> + <legend><?php echo _t('sub.feed.auth.http'); ?></legend> <?php $auth = $this->feed->httpAuth(false); ?> <div class="form-group"> - <label class="group-name" for="http_user"><?php echo _t('http_username'); ?></label> + <label class="group-name" for="http_user"><?php echo _t('sub.feed.auth.username'); ?></label> <div class="group-controls"> <input type="text" name="http_user" id="http_user" class="extend" value="<?php echo $auth['username']; ?>" autocomplete="off" /> </div> - <label class="group-name" for="http_pass"><?php echo _t('http_password'); ?></label> + <label class="group-name" for="http_pass"><?php echo _t('sub.feed.auth.password'); ?></label> <div class="group-controls"> <input type="password" name="http_pass" id="http_pass" class="extend" value="<?php echo $auth['password']; ?>" autocomplete="off" /> </div> <div class="group-controls"> - <?php echo _i('help'); ?> <?php echo _t('access_protected_feeds'); ?> + <?php echo _i('help'); ?> <?php echo _t('sub.feed.auth.help'); ?> </div> </div> <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> </div> </div> </form> diff --git a/app/views/helpers/feed/update.phtml b/app/views/helpers/feed/update.phtml index d79ef2666..0b08d036c 100644 --- a/app/views/helpers/feed/update.phtml +++ b/app/views/helpers/feed/update.phtml @@ -2,9 +2,9 @@ <h1><?php echo $this->feed->name(); ?></h1> <div> - <a href="<?php echo _url('index', 'index', 'get', 'f_' . $this->feed->id()); ?>"><?php echo _i('link'); ?> <?php echo _t('filter'); ?></a> - <?php echo _t('or'); ?> - <a href="<?php echo _url('stats', 'repartition', 'id', $this->feed->id()); ?>"><?php echo _i('stats'); ?> <?php echo _t('stats'); ?></a> + <a href="<?php echo _url('index', 'index', 'get', 'f_' . $this->feed->id()); ?>"><?php echo _i('link'); ?> <?php echo _t('gen.action.filter'); ?></a> + <?php echo _t('gen.short.or'); ?> + <a href="<?php echo _url('stats', 'repartition', 'id', $this->feed->id()); ?>"><?php echo _i('stats'); ?> <?php echo _t('sub.feed.stats'); ?></a> </div> <p><?php echo $this->feed->description(); ?></p> @@ -12,27 +12,27 @@ <?php $nbEntries = $this->feed->nbEntries(); ?> <?php if ($this->feed->inError()) { ?> - <p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('feed_in_error'); ?></p> + <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('sub.feed.error'); ?></p> <?php } elseif ($nbEntries === 0) { ?> - <p class="alert alert-warn"><?php echo _t('feed_empty'); ?></p> + <p class="alert alert-warn"><?php echo _t('sub.feed.empty'); ?></p> <?php } ?> <form method="post" action="<?php echo _url('subscription', 'feed', 'id', $this->feed->id()); ?>" autocomplete="off"> - <legend><?php echo _t('informations'); ?></legend> + <legend><?php echo _t('sub.feed.informations'); ?></legend> <div class="form-group"> - <label class="group-name" for="name"><?php echo _t('title'); ?></label> + <label class="group-name" for="name"><?php echo _t('sub.feed.title'); ?></label> <div class="group-controls"> <input type="text" name="name" id="name" class="extend" value="<?php echo $this->feed->name() ; ?>" /> </div> </div> <div class="form-group"> - <label class="group-name" for="description"><?php echo _t('feed_description'); ?></label> + <label class="group-name" for="description"><?php echo _t('sub.feed.description'); ?></label> <div class="group-controls"> <textarea name="description" id="description"><?php echo htmlspecialchars($this->feed->description(), ENT_NOQUOTES, 'UTF-8'); ?></textarea> </div> </div> <div class="form-group"> - <label class="group-name" for="website"><?php echo _t('website_url'); ?></label> + <label class="group-name" for="website"><?php echo _t('sub.feed.website'); ?></label> <div class="group-controls"> <div class="stick"> <input type="text" name="website" id="website" class="extend" value="<?php echo $this->feed->website(); ?>" /> @@ -41,18 +41,18 @@ </div> </div> <div class="form-group"> - <label class="group-name" for="url"><?php echo _t('feed_url'); ?></label> + <label class="group-name" for="url"><?php echo _t('sub.feed.url'); ?></label> <div class="group-controls"> <div class="stick"> <input type="text" name="url" id="url" class="extend" value="<?php echo $this->feed->url(); ?>" /> <a class="btn" target="_blank" href="<?php echo $this->feed->url(); ?>"><?php echo _i('link'); ?></a> </div> - <a class="btn" target="_blank" href="http://validator.w3.org/feed/check.cgi?url=<?php echo $this->feed->url(); ?>"><?php echo _t('feed_validator'); ?></a> + <a class="btn" target="_blank" href="http://validator.w3.org/feed/check.cgi?url=<?php echo $this->feed->url(); ?>"><?php echo _t('sub.feed.validator'); ?></a> </div> </div> <div class="form-group"> - <label class="group-name" for="category"><?php echo _t('category'); ?></label> + <label class="group-name" for="category"><?php echo _t('sub.category'); ?></label> <div class="group-controls"> <select name="category" id="category"> <?php foreach ($this->categories as $cat) { ?> @@ -64,53 +64,53 @@ </div> </div> <div class="form-group"> - <label class="group-name" for="priority"><?php echo _t('show_in_all_flux'); ?></label> + <label class="group-name" for="priority"><?php echo _t('sub.feed.in_main_stream'); ?></label> <div class="group-controls"> <label class="checkbox" for="priority"> <input type="checkbox" name="priority" id="priority" value="10"<?php echo $this->feed->priority() > 0 ? ' checked="checked"' : ''; ?> /> - <?php echo _t('yes'); ?> + <?php echo _t('gen.short.yes'); ?> </label> </div> </div> <div class="form-group form-actions"> <div class="group-controls"> - <button class="btn btn-important"><?php echo _t('save'); ?></button> + <button class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> <button class="btn btn-attention confirm" - data-str-confirm="<?php echo _t('confirm_action_feed_cat'); ?>" + data-str-confirm="<?php echo _t('gen.js.confirm_action_feed_cat'); ?>" formaction="<?php echo _url('feed', 'delete', 'id', $this->feed->id()); ?>" - formmethod="post"><?php echo _t('delete'); ?></button> + formmethod="post"><?php echo _t('gen.action.remove'); ?></button> </div> </div> - <legend><?php echo _t('archiving_configuration'); ?></legend> + <legend><?php echo _t('sub.feed.archiving'); ?></legend> <div class="form-group"> <div class="group-controls"> <div class="stick"> - <input type="text" value="<?php echo _t('number_articles', $nbEntries); ?>" disabled="disabled" /> + <input type="text" value="<?php echo _t('sub.feed.number_entries', $nbEntries); ?>" disabled="disabled" /> <a class="btn" href="<?php echo _url('feed', 'actualize', 'id', $this->feed->id()); ?>"> - <?php echo _i('refresh'); ?> <?php echo _t('actualize'); ?> + <?php echo _i('refresh'); ?> <?php echo _t('gen.action.actualize'); ?> </a> </div> </div> </div> <div class="form-group"> - <label class="group-name" for="keep_history"><?php echo _t('keep_history'); ?></label> + <label class="group-name" for="keep_history"><?php echo _t('sub.feed.keep_history'); ?></label> <div class="group-controls"> <select class="number" name="keep_history" id="keep_history" required="required"><?php - foreach (array('' => '', -2 => _t('by_default'), 0 => '0', 10 => '10', 50 => '50', 100 => '100', 500 => '500', 1000 => '1 000', 5000 => '5 000', 10000 => '10 000', -1 => '∞') as $v => $t) { + foreach (array('' => '', -2 => _t('gen.short.by_default'), 0 => '0', 10 => '10', 50 => '50', 100 => '100', 500 => '500', 1000 => '1 000', 5000 => '5 000', 10000 => '10 000', -1 => '∞') as $v => $t) { echo '<option value="' . $v . ($this->feed->keepHistory() === $v ? '" selected="selected' : '') . '">' . $t . '</option>'; } ?></select> </div> </div> <div class="form-group"> - <label class="group-name" for="ttl"><?php echo _t('ttl'); ?></label> + <label class="group-name" for="ttl"><?php echo _t('sub.feed.ttl'); ?></label> <div class="group-controls"> <select class="number" name="ttl" id="ttl" required="required"><?php $found = false; - foreach (array(-2 => _t('by_default'), 900 => '15min', 1200 => '20min', 1500 => '25min', 1800 => '30min', 2700 => '45min', + foreach (array(-2 => _t('gen.short.by_default'), 900 => '15min', 1200 => '20min', 1500 => '25min', 1800 => '30min', 2700 => '45min', 3600 => '1h', 5400 => '1.5h', 7200 => '2h', 10800 => '3h', 14400 => '4h', 18800 => '5h', 21600 => '6h', 25200 => '7h', 28800 => '8h', 36000 => '10h', 43200 => '12h', 64800 => '18h', 86400 => '1d', 129600 => '1.5d', 172800 => '2d', 259200 => '3d', 345600 => '4d', 432000 => '5d', 518400 => '6d', @@ -128,21 +128,21 @@ </div> <div class="form-group form-actions"> <div class="group-controls"> - <button class="btn btn-important"><?php echo _t('save'); ?></button> - <button class="btn btn-attention confirm" formmethod="post" formaction="<?php echo _url('feed', 'truncate', 'id', $this->feed->id()); ?>"><?php echo _t('truncate'); ?></button> + <button class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button class="btn btn-attention confirm" formmethod="post" formaction="<?php echo _url('feed', 'truncate', 'id', $this->feed->id()); ?>"><?php echo _t('gen.action.truncate'); ?></button> </div> </div> - <legend><?php echo _t('login_configuration'); ?></legend> + <legend><?php echo _t('sub.feed.auth.configuration'); ?></legend> <?php $auth = $this->feed->httpAuth(false); ?> <div class="form-group"> - <label class="group-name" for="http_user"><?php echo _t('http_username'); ?></label> + <label class="group-name" for="http_user"><?php echo _t('sub.feed.auth.username'); ?></label> <div class="group-controls"> <input type="text" name="http_user" id="http_user" class="extend" value="<?php echo $auth['username']; ?>" autocomplete="off" /> - <?php echo _i('help'); ?> <?php echo _t('access_protected_feeds'); ?> + <?php echo _i('help'); ?> <?php echo _t('sub.feed.auth.help'); ?> </div> - <label class="group-name" for="http_pass"><?php echo _t('http_password'); ?></label> + <label class="group-name" for="http_pass"><?php echo _t('sub.feed.auth.password'); ?></label> <div class="group-controls"> <input type="password" name="http_pass" id="http_pass" class="extend" value="<?php echo $auth['password']; ?>" autocomplete="off" /> </div> @@ -150,24 +150,24 @@ <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> </div> </div> - <legend><?php echo _t('advanced'); ?></legend> + <legend><?php echo _t('sub.feed.advanced'); ?></legend> <div class="form-group"> - <label class="group-name" for="path_entries"><?php echo _t('css_path_on_website'); ?></label> + <label class="group-name" for="path_entries"><?php echo _t('sub.feed.css_path'); ?></label> <div class="group-controls"> - <input type="text" name="path_entries" id="path_entries" class="extend" value="<?php echo $this->feed->pathEntries(); ?>" placeholder="<?php echo _t('blank_to_disable'); ?>" /> - <?php echo _i('help'); ?> <?php echo _t('retrieve_truncated_feeds'); ?> + <input type="text" name="path_entries" id="path_entries" class="extend" value="<?php echo $this->feed->pathEntries(); ?>" placeholder="<?php echo _t('gen.short.blank_to_disable'); ?>" /> + <?php echo _i('help'); ?> <?php echo _t('sub.feed.css_help'); ?> </div> </div> <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> </div> </div> </form> diff --git a/app/views/helpers/javascript_vars.phtml b/app/views/helpers/javascript_vars.phtml index 8e9141d4e..6577e0109 100644 --- a/app/views/helpers/javascript_vars.phtml +++ b/app/views/helpers/javascript_vars.phtml @@ -18,6 +18,7 @@ $url_logout = Minz_Url::display(array( ), 'php'); echo 'var context={', + 'auto_remove_article:', FreshRSS_Context::isAutoRemoveAvailable() ? 'true' : 'false', ',', 'hide_posts:', $hide_posts ? 'false' : 'true', ',', 'display_order:"', Minz_Request::param('order', FreshRSS_Context::$conf->sort_order), '",', 'auto_mark_article:', $mark['article'] ? 'true' : 'false', ',', @@ -26,7 +27,7 @@ echo 'var context={', 'auto_load_more:', FreshRSS_Context::$conf->auto_load_more ? 'true' : 'false', ',', 'auto_actualize_feeds:', $auto_actualize ? 'true' : 'false', ',', 'does_lazyload:', FreshRSS_Context::$conf->lazyload ? 'true' : 'false', ',', - 'sticky_post:', FreshRSS_Context::$conf->sticky_post ? 'true' : 'false', ',', + 'sticky_post:', FreshRSS_Context::isStickyPostEnabled() ? 'true' : 'false', ',', 'html5_notif_timeout:', FreshRSS_Context::$conf->html5_notif_timeout, ',', 'auth_type:"', Minz_Configuration::authType(), '",', 'current_user_mail:', $mail ? ('"' . $mail . '"') : 'null', ',', @@ -58,10 +59,10 @@ echo 'url={', "},\n"; echo 'i18n={', - 'confirmation_default:"', _t('confirm_action'), '",', - 'notif_title_articles:"', _t('notif_title_new_articles'), '",', - 'notif_body_articles:"', _t('notif_body_new_articles'), '",', - 'category_empty:"', _t('category_empty'), '"', + 'confirmation_default:"', _t('gen.js.confirm_action'), '",', + 'notif_title_articles:"', _t('gen.js.notif_title_new_articles'), '",', + 'notif_body_articles:"', _t('gen.js.notif_body_new_articles'), '",', + 'category_empty:"', _t('gen.js.category_empty'), '"', "},\n"; echo 'icons={', diff --git a/app/views/helpers/logs_pagination.phtml b/app/views/helpers/logs_pagination.phtml index ad46279c7..58b3c68f4 100755 --- a/app/views/helpers/logs_pagination.phtml +++ b/app/views/helpers/logs_pagination.phtml @@ -9,14 +9,14 @@ <?php $params[$getteur] = 1; ?> <li class="item pager-first"> <?php if ($this->currentPage > 1) { ?> - <a href="<?php echo Minz_Url::display(array('c' => $c, 'a' => $a, 'params' => $params)); ?>">« <?php echo _t('first'); ?></a> + <a href="<?php echo Minz_Url::display(array('c' => $c, 'a' => $a, 'params' => $params)); ?>">« <?php echo _t('gen.pagination.first'); ?></a> <?php } ?> </li> <?php $params[$getteur] = $this->currentPage - 1; ?> <li class="item pager-previous"> <?php if ($this->currentPage > 1) { ?> - <a href="<?php echo Minz_Url::display(array('c' => $c, 'a' => $a, 'params' => $params)); ?>">‹ <?php echo _t('previous'); ?></a> + <a href="<?php echo Minz_Url::display(array('c' => $c, 'a' => $a, 'params' => $params)); ?>">‹ <?php echo _t('gen.pagination.previous'); ?></a> <?php } ?> </li> @@ -34,13 +34,13 @@ <?php $params[$getteur] = $this->currentPage + 1; ?> <li class="item pager-next"> <?php if ($this->currentPage < $this->nbPage) { ?> - <a href="<?php echo Minz_Url::display(array('c' => $c, 'a' => $a, 'params' => $params)); ?>"><?php echo _t('next'); ?> ›</a> + <a href="<?php echo Minz_Url::display(array('c' => $c, 'a' => $a, 'params' => $params)); ?>"><?php echo _t('gen.pagination.next'); ?> ›</a> <?php } ?> </li> <?php $params[$getteur] = $this->nbPage; ?> <li class="item pager-last"> <?php if ($this->currentPage < $this->nbPage) { ?> - <a href="<?php echo Minz_Url::display(array('c' => $c, 'a' => $a, 'params' => $params)); ?>"><?php echo _t('last'); ?> »</a> + <a href="<?php echo Minz_Url::display(array('c' => $c, 'a' => $a, 'params' => $params)); ?>"><?php echo _t('gen.pagination.last'); ?> »</a> <?php } ?> </li> </ul> diff --git a/app/views/helpers/pagination.phtml b/app/views/helpers/pagination.phtml index 3ea6c3582..8b40e4336 100755 --- a/app/views/helpers/pagination.phtml +++ b/app/views/helpers/pagination.phtml @@ -20,7 +20,7 @@ <li class="item pager-next"> <?php if (FreshRSS_Context::$next_id) { ?> <a id="load_more" href="<?php echo Minz_Url::display($url_next); ?>"> - <?php echo _t('load_more'); ?> + <?php echo _t('gen.pagination.load_more'); ?> </a> <?php } elseif ($url_mark_read) { ?> <button id="bigMarkAsRead" @@ -28,13 +28,13 @@ form="mark-read-pagination" formaction="<?php echo Minz_Url::display($url_mark_read); ?>" type="submit"> - <?php echo _t('nothing_to_load'); ?><br /> + <?php echo _t('gen.pagination.nothing_to_load'); ?><br /> <span class="bigTick">✓</span><br /> - <?php echo _t('mark_all_read'); ?> + <?php echo _t('gen.pagination.mark_all_read'); ?> </button> <?php } else { ?> <a id="bigMarkAsRead" href="."> - <?php echo _t('nothing_to_load'); ?><br /> + <?php echo _t('gen.pagination.nothing_to_load'); ?><br /> </a> <?php } ?> </li> diff --git a/app/views/importExport/index.phtml b/app/views/importExport/index.phtml index 36c0eab4e..a64524bf1 100644 --- a/app/views/importExport/index.phtml +++ b/app/views/importExport/index.phtml @@ -1,13 +1,13 @@ <?php $this->partial('aside_subscription'); ?> <div class="post "> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> <form method="post" action="<?php echo _url('importExport', 'import'); ?>" enctype="multipart/form-data"> - <legend><?php echo _t('import'); ?></legend> + <legend><?php echo _t('sub.import_export.import'); ?></legend> <div class="form-group"> <label class="group-name" for="file"> - <?php echo extension_loaded('zip') ? _t('file_to_import') : _t('file_to_import_no_zip'); ?> + <?php echo extension_loaded('zip') ? _t('sub.import_export.file_to_import') : _t('sub.import_export.file_to_import_no_zip'); ?> </label> <div class="group-controls"> <input type="file" name="file" id="file" /> @@ -16,24 +16,24 @@ <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('import'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.import'); ?></button> </div> </div> </form> <?php if (count($this->feeds) > 0) { ?> <form method="post" action="<?php echo _url('importExport', 'export'); ?>"> - <legend><?php echo _t('export'); ?></legend> + <legend><?php echo _t('sub.import_export.export'); ?></legend> <div class="form-group"> <div class="group-controls"> <label class="checkbox" for="export_opml"> <input type="checkbox" name="export_opml" id="export_opml" value="1" checked="checked" /> - <?php echo _t('export_opml'); ?> + <?php echo _t('sub.import_export.export_opml'); ?> </label> <label class="checkbox" for="export_starred"> <input type="checkbox" name="export_starred" id="export_starred" value="1" <?php echo extension_loaded('zip') ? 'checked="checked"' : ''; ?> /> - <?php echo _t('export_starred'); ?> + <?php echo _t('sub.import_export.export_starred'); ?> </label> <?php @@ -53,7 +53,7 @@ <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('export'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.export'); ?></button> </div> </div> </form> diff --git a/app/views/index/about.phtml b/app/views/index/about.phtml index 407d13ae9..ff2c538a2 100644 --- a/app/views/index/about.phtml +++ b/app/views/index/about.phtml @@ -1,27 +1,27 @@ <div class="post content"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> - <h1><?php echo _t('about_freshrss'); ?></h1> + <h1><?php echo _t('index.about'); ?></h1> <dl class="infos"> - <dt><?php echo _t('project_website'); ?></dt> + <dt><?php echo _t('index.about.project_website'); ?></dt> <dd><a href="<?php echo FRESHRSS_WEBSITE; ?>"><?php echo FRESHRSS_WEBSITE; ?></a></dd> - <dt><?php echo _t('lead_developer'); ?></dt> - <dd><a href="mailto:contact@marienfressinaud.fr">Marien Fressinaud</a> — <a href="http://marienfressinaud.fr"><?php echo _t('website'); ?></a></dd> + <dt><?php echo _t('index.about.lead_developer'); ?></dt> + <dd><a href="mailto:contact@marienfressinaud.fr">Marien Fressinaud</a> — <a href="http://marienfressinaud.fr"><?php echo _t('index.about.website'); ?></a></dd> - <dt><?php echo _t('bugs_reports'); ?></dt> - <dd><?php echo _t('github_or_email'); ?></dd> + <dt><?php echo _t('index.about.bugs_reports'); ?></dt> + <dd><?php echo _t('index.about.github_or_email'); ?></dd> - <dt><?php echo _t('license'); ?></dt> - <dd><?php echo _t('agpl3'); ?></dd> + <dt><?php echo _t('index.about.license'); ?></dt> + <dd><?php echo _t('index.about.agpl3'); ?></dd> - <dt><?php echo _t('version'); ?></dt> + <dt><?php echo _t('index.about.version'); ?></dt> <dd><?php echo FRESHRSS_VERSION; ?></dd> </dl> - <p><?php echo _t('freshrss_description'); ?></p> + <p><?php echo _t('index.about.freshrss_description'); ?></p> - <h1><?php echo _t('credits'); ?></h1> - <p><?php echo _t('credits_content'); ?></p> + <h1><?php echo _t('index.about.credits'); ?></h1> + <p><?php echo _t('index.about.credits_content'); ?></p> </div> diff --git a/app/views/index/logs.phtml b/app/views/index/logs.phtml index 101692daf..02256bd98 100644 --- a/app/views/index/logs.phtml +++ b/app/views/index/logs.phtml @@ -1,10 +1,10 @@ <div class="post content"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> - <h1><?php echo _t('logs'); ?></h1> + <h1><?php echo _t('index.log'); ?></h1> <form method="post" action="<?php echo _url('index', 'logs'); ?>"><p> <input type="hidden" name="clearLogs" /> - <button type="submit" class="btn"><?php echo _t('clear_logs'); ?></button> + <button type="submit" class="btn"><?php echo _t('index.log.clear'); ?></button> </p></form> <?php $items = $this->logsPaginator->items(); ?> @@ -20,6 +20,6 @@ <?php $this->logsPaginator->render('logs_pagination.phtml','page'); ?> </div> <?php } else { ?> - <p class="alert alert-warn"><?php echo _t('logs_empty'); ?></p> + <p class="alert alert-warn"><?php echo _t('index.log.empty'); ?></p> <?php } ?> </div> diff --git a/app/views/index/normal.phtml b/app/views/index/normal.phtml index 02d621bd0..3a27a702b 100644 --- a/app/views/index/normal.phtml +++ b/app/views/index/normal.phtml @@ -32,12 +32,12 @@ if (!empty($this->entries)) { <div id="stream" class="normal<?php echo $hidePosts ? ' hide_posts' : ''; ?>"><?php ?><div id="new-article"> - <a href="<?php echo Minz_Url::display(Minz_Request::currentRequest()); ?>"><?php echo _t('new_article'); ?></a> + <a href="<?php echo Minz_Url::display(Minz_Request::currentRequest()); ?>"><?php echo _t('gen.js.new_article'); /* TODO: move string in JS*/ ?></a> </div><?php foreach ($this->entries as $item) { if ($display_today && $item->isDay(FreshRSS_Days::TODAY, $today)) { ?><div class="day" id="day_today"><?php - echo _t('today'); + echo _t('gen.date.today'); ?><span class="date"> — <?php echo timestamptodate(time(), false); ?></span><?php ?><span class="name"><?php echo FreshRSS_Context::$name; ?></span><?php ?></div><?php @@ -45,7 +45,7 @@ if (!empty($this->entries)) { } if ($display_yesterday && $item->isDay(FreshRSS_Days::YESTERDAY, $today)) { ?><div class="day" id="day_yesterday"><?php - echo _t('yesterday'); + echo _t('gen.date.yesterday'); ?><span class="date"> — <?php echo timestamptodate(time() - 86400, false); ?></span><?php ?><span class="name"><?php echo FreshRSS_Context::$name; ?></span><?php ?></div><?php @@ -53,7 +53,7 @@ if (!empty($this->entries)) { } if ($display_others && $item->isDay(FreshRSS_Days::BEFORE_YESTERDAY, $today)) { ?><div class="day" id="day_before_yesterday"><?php - echo _t('before_yesterday'); + echo _t('gen.date.before_yesterday'); ?><span class="name"><?php echo FreshRSS_Context::$name; ?></span><?php ?></div><?php $display_others = false; @@ -100,7 +100,7 @@ if (!empty($this->entries)) { <h1 class="title"><a target="_blank" href="<?php echo $item->link(); ?>"><?php echo $item->title(); ?></a></h1> <?php $author = $item->author(); - echo $author != '' ? '<div class="author">' . _t('by_author', $author) . '</div>' : '', + echo $author != '' ? '<div class="author">' . _t('gen.short.by_author', $author) . '</div>' : '', $lazyload && $hidePosts ? lazyimg($item->content()) : $item->content(); ?> </div> @@ -135,7 +135,7 @@ if (!empty($this->entries)) { <div id="dropdown-share-<?php echo $item->id();?>" class="dropdown-target"></div> <a class="dropdown-toggle" href="#dropdown-share-<?php echo $item->id();?>"> <?php echo _i('share'); ?> - <?php echo _t('share'); ?> + <?php echo _t('index.share'); ?> </a> <ul class="dropdown-menu"> @@ -143,7 +143,7 @@ if (!empty($this->entries)) { <?php foreach ($sharing as $share) :?> <li class="item share"> <a target="_blank" href="<?php echo FreshRSS_Share::generateUrl(FreshRSS_Context::$conf->shares, $share, $item->link(), $item->title() . ' . ' . $feed->name())?>"> - <?php echo _t($share['name']);?> + <?php echo _t('index.share.' . $share['name']);?> </a> </li> <?php endforeach;?> @@ -158,7 +158,7 @@ if (!empty($this->entries)) { <div id="dropdown-tags-<?php echo $item->id();?>" class="dropdown-target"></div> <?php echo _i('tag'); ?> <a class="dropdown-toggle" href="#dropdown-tags-<?php echo $item->id();?>"><?php - echo _t('related_tags'); + echo _t('index.tag.related'); ?></a> <ul class="dropdown-menu"> <li class="dropdown-close"><a href="#close">❌</a></li><?php @@ -187,7 +187,7 @@ if (!empty($this->entries)) { <?php } else { ?> <div id="stream" class="prompt alert alert-warn normal"> - <h2><?php echo _t('no_feed_to_display'); ?></h2> - <a href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('think_to_add'); ?></a><br /><br /> + <h2><?php echo _t('index.feed.empty'); ?></h2> + <a href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('index.feed.add'); ?></a><br /><br /> </div> <?php } ?> diff --git a/app/views/index/reader.phtml b/app/views/index/reader.phtml index f07868488..1eab86dd2 100644 --- a/app/views/index/reader.phtml +++ b/app/views/index/reader.phtml @@ -23,7 +23,7 @@ if (!empty($this->entries)) { <div class="author"><?php $author = $item->author(); - echo $author != '' ? _t('by_author', $author) . ' — ' : '', + echo $author != '' ? _t('gen.short.by_author', $author) . ' — ' : '', $item->date(); ?></div> @@ -38,7 +38,7 @@ if (!empty($this->entries)) { <?php } else { ?> <div id="stream" class="prompt alert alert-warn reader"> - <h2><?php echo _t('no_feed_to_display'); ?></h2> - <a href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('think_to_add'); ?></a><br /><br /> + <h2><?php echo _t('index.feed.empty'); ?></h2> + <a href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('index.feed.add'); ?></a><br /><br /> </div> <?php } ?> diff --git a/app/views/index/rss.phtml b/app/views/index/rss.phtml index e34b15ab1..86074517c 100755 --- a/app/views/index/rss.phtml +++ b/app/views/index/rss.phtml @@ -3,7 +3,7 @@ <channel> <title><?php echo $this->rss_title; ?></title> <link><?php echo Minz_Url::display(null, 'html', true); ?></link> - <description><?php echo _t('rss_feeds_of', $this->rss_title); ?></description> + <description><?php echo _t('index.feed.rss_of', $this->rss_title); ?></description> <pubDate><?php echo date('D, d M Y H:i:s O'); ?></pubDate> <lastBuildDate><?php echo gmdate('D, d M Y H:i:s'); ?> GMT</lastBuildDate> <atom:link href="<?php echo Minz_Url::display($this->url, 'html', true); ?>" rel="self" type="application/rss+xml" /> diff --git a/app/views/javascript/actualize.phtml b/app/views/javascript/actualize.phtml index 74cef4998..454228909 100644 --- a/app/views/javascript/actualize.phtml +++ b/app/views/javascript/actualize.phtml @@ -9,7 +9,7 @@ var feeds = [<?php foreach ($this->feeds as $feed) { ?>{<?php function initProgressBar(init) { if (init) { $("body").after("\<div id=\"actualizeProgress\" class=\"notification good\">\ - <?php echo _t('refresh'); ?><br /><span class=\"title\">/</span><br />\ + <?php echo _t('feedback.sub.actualize'); ?><br /><span class=\"title\">/</span><br />\ <span class=\"progress\">0 / " + feed_count + "</span>\ </div>"); } else { @@ -23,7 +23,7 @@ function updateProgressBar(i, title_feed) { function updateFeeds() { if (feed_count === 0) { - openNotification("<?php echo _t('no_feed_to_refresh'); ?>", "good"); + openNotification("<?php echo _t('feedback.sub.feed.no_refresh'); ?>", "good"); ajax_loading = false; return; } diff --git a/app/views/stats/idle.phtml b/app/views/stats/idle.phtml index 75cba1081..22117792d 100644 --- a/app/views/stats/idle.phtml +++ b/app/views/stats/idle.phtml @@ -1,9 +1,9 @@ <?php $this->partial('aside_stats'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> - <h1><?php echo _t('stats_idle'); ?></h1> + <h1><?php echo _t('admin.stats.idle'); ?></h1> <?php $current_url = urlencode(Minz_Url::display( @@ -16,7 +16,7 @@ $nothing = false; ?> <div class="stat"> - <h2><?php echo _t($period); ?></h2> + <h2><?php echo _t('gen.date.' . $period); ?></h2> <form id="form-delete" method="post" style="display: none"></form> @@ -24,13 +24,13 @@ <ul class="horizontal-list"> <li class="item"> <div class="stick"> - <a class="btn" href="<?php echo _url('index', 'index', 'get', 'f_' . $feed['id']); ?>"><?php echo _i('link'); ?> <?php echo _t('filter'); ?></a> - <a class="btn" href="<?php echo _url('subscription', 'index', 'id', $feed['id']); ?>"><?php echo _i('configure'); ?> <?php echo _t('administration'); ?></a> - <button class="btn btn-attention confirm" form="form-delete" formaction="<?php echo _url('feed', 'delete', 'id', $feed['id'], 'r', $current_url); ?>"><?php echo _t('delete'); ?></button> + <a class="btn" href="<?php echo _url('index', 'index', 'get', 'f_' . $feed['id']); ?>"><?php echo _i('link'); ?> <?php echo _t('gen.action.filter'); ?></a> + <a class="btn" href="<?php echo _url('subscription', 'index', 'id', $feed['id']); ?>"><?php echo _i('configure'); ?> <?php echo _t('gen.action.manage'); ?></a> + <button class="btn btn-attention confirm" form="form-delete" formaction="<?php echo _url('feed', 'delete', 'id', $feed['id'], 'r', $current_url); ?>"><?php echo _t('gen.action.remove'); ?></button> </div> </li> <li class="item"> - <span title="<?php echo timestamptodate($feed['last_date'], false); ?>"><?php echo $feed['name']; ?> (<?php echo _t('number_articles', $feed['nb_articles']); ?>)</span> + <span title="<?php echo timestamptodate($feed['last_date'], false); ?>"><?php echo $feed['name']; ?> (<?php echo _t('admin.stats.number_entries', $feed['nb_articles']); ?>)</span> </li> </ul> <?php } ?> @@ -42,7 +42,7 @@ if ($nothing) { ?> <p class="alert alert-warn"> - <span class="alert-head"><?php echo _t('stats_no_idle'); ?></span> + <span class="alert-head"><?php echo _t('admin.stats.no_idle'); ?></span> </p> <?php } ?> </div> diff --git a/app/views/stats/index.phtml b/app/views/stats/index.phtml index 1300cb2c7..c13c5d26c 100644 --- a/app/views/stats/index.phtml +++ b/app/views/stats/index.phtml @@ -1,38 +1,38 @@ <?php $this->partial('aside_stats'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> - <h1><?php echo _t('stats_main'); ?></h1> + <h1><?php echo _t('admin.stats.main'); ?></h1> <div class="stat half"> - <h2><?php echo _t('stats_entry_repartition'); ?></h2> + <h2><?php echo _t('admin.stats.entry_repartition'); ?></h2> <table> <thead> <tr> <th> </th> - <th><?php echo _t('main_stream'); ?></th> - <th><?php echo _t('all_feeds'); ?></th> + <th><?php echo _t('admin.stats.main_stream'); ?></th> + <th><?php echo _t('admin.stats.all_feeds'); ?></th> </tr> </thead> <tbody> <tr> - <th><?php echo _t('status_total'); ?></th> + <th><?php echo _t('admin.stats.status_total'); ?></th> <td class="numeric"><?php echo format_number($this->repartition['main_stream']['total']); ?></td> <td class="numeric"><?php echo format_number($this->repartition['all_feeds']['total']); ?></td> </tr> <tr> - <th><?php echo _t('status_read'); ?></th> + <th><?php echo _t('admin.stats.status_read'); ?></th> <td class="numeric"><?php echo format_number($this->repartition['main_stream']['read']); ?></td> <td class="numeric"><?php echo format_number($this->repartition['all_feeds']['read']); ?></td> </tr> <tr> - <th><?php echo _t('status_unread'); ?></th> + <th><?php echo _t('admin.stats.status_unread'); ?></th> <td class="numeric"><?php echo format_number($this->repartition['main_stream']['unread']); ?></td> <td class="numeric"><?php echo format_number($this->repartition['all_feeds']['unread']); ?></td> </tr> <tr> - <th><?php echo _t('status_favorites'); ?></th> + <th><?php echo _t('admin.stats.status_favorites'); ?></th> <td class="numeric"><?php echo format_number($this->repartition['main_stream']['favorite']); ?></td> <td class="numeric"><?php echo format_number($this->repartition['all_feeds']['favorite']); ?></td> </tr> @@ -41,14 +41,14 @@ </div><!-- --><div class="stat half"> - <h2><?php echo _t('stats_top_feed'); ?></h2> + <h2><?php echo _t('admin.stats.top_feed'); ?></h2> <table> <thead> <tr> - <th><?php echo _t('feed'); ?></th> - <th><?php echo _t('category'); ?></th> - <th><?php echo _t('stats_entry_count'); ?></th> - <th><?php echo _t('stats_percent_of_total'); ?></th> + <th><?php echo _t('admin.stats.feed'); ?></th> + <th><?php echo _t('admin.stats.category'); ?></th> + <th><?php echo _t('admin.stats.entry_count'); ?></th> + <th><?php echo _t('admin.stats.percent_of_total'); ?></th> </tr> </thead> <tbody> @@ -65,18 +65,18 @@ </div> <div class="stat"> - <h2><?php echo _t('stats_entry_per_day'); ?></h2> + <h2><?php echo _t('admin.stats.entry_per_day'); ?></h2> <div id="statsEntryPerDay" style="height: 300px"></div> </div> <div class="stat half"> - <h2><?php echo _t('stats_feed_per_category'); ?></h2> + <h2><?php echo _t('admin.stats.feed_per_category'); ?></h2> <div id="statsFeedPerCategory" style="height: 300px"></div> <div id="statsFeedPerCategoryLegend"></div> </div><!-- --><div class="stat half"> - <h2><?php echo _t('stats_entry_per_category'); ?></h2> + <h2><?php echo _t('admin.stats.entry_per_category'); ?></h2> <div id="statsEntryPerCategory" style="height: 300px"></div> <div id="statsEntryPerCategoryLegend"></div> </div> diff --git a/app/views/stats/repartition.phtml b/app/views/stats/repartition.phtml index 32268a546..b20d9bbd0 100644 --- a/app/views/stats/repartition.phtml +++ b/app/views/stats/repartition.phtml @@ -1,12 +1,12 @@ <?php $this->partial('aside_stats'); ?> <div class="post "> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> - <h1><?php echo _t('stats_repartition'); ?></h1> + <h1><?php echo _t('admin.stats.repartition'); ?></h1> <select id="feed_select" class="select-change"> - <option data-url="<?php echo _url('stats', 'repartition')?>"><?php echo _t('all_feeds')?></option> + <option data-url="<?php echo _url('stats', 'repartition')?>"><?php echo _t('admin.stats.all_feeds')?></option> <?php foreach ($this->categories as $category) { $feeds = $category->feeds(); if (!empty($feeds)) { @@ -25,22 +25,39 @@ <?php if ($this->feed) {?> <a class="btn" href="<?php echo _url('subscription', 'index', 'id', $this->feed->id()); ?>"> - <?php echo _i('configure'); ?> <?php echo _t('administration'); ?> + <?php echo _i('configure'); ?> <?php echo _t('gen.action.manage'); ?> </a> <?php }?> <div class="stat"> - <h2><?php echo _t('stats_entry_per_hour', $this->averageHour); ?></h2> + <table> + <tr> + <th><?php echo _t('admin.stats.status_total'); ?></th> + <th><?php echo _t('admin.stats.status_read'); ?></th> + <th><?php echo _t('admin.stats.status_unread'); ?></th> + <th><?php echo _t('admin.stats.status_favorites'); ?></th> + </tr> + <tr> + <td class="numeric"><?php echo $this->repartition['total']; ?></td> + <td class="numeric"><?php echo $this->repartition['read']; ?></td> + <td class="numeric"><?php echo $this->repartition['unread']; ?></td> + <td class="numeric"><?php echo $this->repartition['favorite']; ?></td> + </tr> + </table> + </div> + + <div class="stat"> + <h2><?php echo _t('admin.stats.entry_per_hour', $this->averageHour); ?></h2> <div id="statsEntryPerHour" style="height: 300px"></div> </div> <div class="stat half"> - <h2><?php echo _t('stats_entry_per_day_of_week', $this->averageDayOfWeek); ?></h2> + <h2><?php echo _t('admin.stats.entry_per_day_of_week', $this->averageDayOfWeek); ?></h2> <div id="statsEntryPerDayOfWeek" style="height: 300px"></div> </div><!-- --><div class="stat half"> - <h2><?php echo _t('stats_entry_per_month', $this->averageMonth); ?></h2> + <h2><?php echo _t('admin.stats.entry_per_month', $this->averageMonth); ?></h2> <div id="statsEntryPerMonth" style="height: 300px"></div> </div> </div> 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 { ?> <div class="alert alert-warn"> - <span class="alert-head"><?php echo _t('no_selected_feed'); ?></span> - <?php echo _t('think_to_add'); ?> + <span class="alert-head"><?php echo _t('sub.feed.no_selected'); ?></span> + <?php echo _t('sub.feed.think_to_add'); ?> </div> <?php } ?> diff --git a/app/views/subscription/index.phtml b/app/views/subscription/index.phtml index 2c56f79ed..b9e40988c 100644 --- a/app/views/subscription/index.phtml +++ b/app/views/subscription/index.phtml @@ -1,13 +1,13 @@ <?php $this->partial('aside_subscription'); ?> <div class="post drop-section"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> - <h2><?php echo _t('subscription_management'); ?></h2> + <h2><?php echo _t('sub.title'); ?></h2> <form id="add_rss" method="post" action="<?php echo _url('feed', 'add'); ?>" autocomplete="off"> <div class="stick"> - <input type="url" name="url_rss" class="extend" placeholder="<?php echo _t('add_rss_feed'); ?>" /> + <input type="url" name="url_rss" class="extend" placeholder="<?php echo _t('sub.feed.add'); ?>" /> <div class="dropdown"> <div id="dropdown-cat" class="dropdown-target"></div> @@ -15,7 +15,7 @@ <ul class="dropdown-menu"> <li class="dropdown-close"><a href="#close">❌</a></li> - <li class="dropdown-header"><?php echo _t('category'); ?></li> + <li class="dropdown-header"><?php echo _t('sub.category'); ?></li> <li class="input"> <select name="category" id="category"> @@ -24,22 +24,22 @@ <?php echo $cat->name(); ?> </option> <?php } ?> - <option value="nc"><?php echo _t('new_category'); ?></option> + <option value="nc"><?php echo _t('sub.category.new'); ?></option> </select> </li> <li class="input" style="display:none"> - <input type="text" name="new_category[name]" id="new_category_name" autocomplete="off" placeholder="<?php echo _t('new_category'); ?>" /> + <input type="text" name="new_category[name]" id="new_category_name" autocomplete="off" placeholder="<?php echo _t('sub.category.new'); ?>" /> </li> <li class="separator"></li> - <li class="dropdown-header"><?php echo _t('http_authentication'); ?></li> + <li class="dropdown-header"><?php echo _t('sub.feed.auth.http'); ?></li> <li class="input"> - <input type="text" name="http_user" id="http_user_add" autocomplete="off" placeholder="<?php echo _t('username'); ?>" /> + <input type="text" name="http_user" id="http_user_add" autocomplete="off" placeholder="<?php echo _t('sub.feed.auth.username'); ?>" /> </li> <li class="input"> - <input type="password" name="http_pass" id="http_pass_add" autocomplete="off" placeholder="<?php echo _t('password'); ?>" /> + <input type="password" name="http_pass" id="http_pass_add" autocomplete="off" placeholder="<?php echo _t('sub.feed.auth.password'); ?>" /> </li> </ul> </div> @@ -48,16 +48,16 @@ </form> <p class="alert alert-warn"> - <?php echo _t('feeds_moved_category_deleted', $this->default_category->name()); ?> + <?php echo _t('sub.feed.moved_category_deleted', $this->default_category->name()); ?> </p> <div class="box"> - <div class="box-title"><label for="new-category"><?php echo _t('add_category'); ?></label></div> + <div class="box-title"><label for="new-category"><?php echo _t('sub.category.add'); ?></label></div> <ul class="box-content box-content-centered"> <form action="<?php echo _url('category', 'create'); ?>" method="post"> - <li class="item"><input type="text" id="new-category" name="new-category" placeholder="<?php echo _t('new_category'); ?>" /></li> - <li class="item"><button class="btn btn-important" type="submit"><?php echo _t('submit'); ?></button></li> + <li class="item"><input type="text" id="new-category" name="new-category" placeholder="<?php echo _t('sub.category.new'); ?>" /></li> + <li class="item"><button class="btn btn-important" type="submit"><?php echo _t('gen.action.submit'); ?></button></li> </form> </ul> </div> @@ -80,7 +80,7 @@ <ul class="dropdown-menu"> <li class="dropdown-close"><a href="#close">❌</a></li> - <li class="item"><a href="<?php echo _url('index', 'index', 'get', 'c_' . $cat->id()); ?>"><?php echo _t('filter'); ?></a></li> + <li class="item"><a href="<?php echo _url('index', 'index', 'get', 'c_' . $cat->id()); ?>"><?php echo _t('gen.action.filter'); ?></a></li> <?php $no_feed = empty($feeds); @@ -92,20 +92,20 @@ <?php } if (!$no_feed) { ?> <li class="item"> <button class="as-link confirm" - data-str-confirm="<?php echo _t('confirm_action_feed_cat'); ?>" + data-str-confirm="<?php echo _t('gen.js.confirm_action_feed_cat'); ?>" type="submit" form="controller-category" formaction="<?php echo _url('category', 'empty', 'id', $cat->id()); ?>"> - <?php echo _t('ask_empty'); ?></button> + <?php echo _t('gen.action.empty'); ?></button> </li> <?php } if (!$is_default) { ?> <li class="item"> <button class="as-link confirm" - data-str-confirm="<?php echo _t('confirm_action_feed_cat'); ?>" + data-str-confirm="<?php echo _t('gen.js.confirm_action_feed_cat'); ?>" type="submit" form="controller-category" formaction="<?php echo _url('category', 'delete', 'id', $cat->id()); ?>"> - <?php echo _t('delete'); ?></button> + <?php echo _t('gen.action.remove'); ?></button> </li> <?php } ?> </ul> @@ -130,7 +130,7 @@ <?php } } else { ?> - <li class="item disabled" dropzone="move"><?php echo _t('category_empty'); ?></li> + <li class="item disabled" dropzone="move"><?php echo _t('sub.category.empty'); ?></li> <?php } ?> </ul> </div> diff --git a/app/views/update/apply.phtml b/app/views/update/apply.phtml index 30566c7ab..8221929ae 100644 --- a/app/views/update/apply.phtml +++ b/app/views/update/apply.phtml @@ -1,9 +1,9 @@ <?php $this->partial('aside_configure'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> - <h1><?php echo _t('update_system'); ?></h1> + <h1><?php echo _t('admin.update'); ?></h1> <?php ask_info_update(); ?> </div> diff --git a/app/views/update/checkInstall.phtml b/app/views/update/checkInstall.phtml index b36551340..a92860c7e 100644 --- a/app/views/update/checkInstall.phtml +++ b/app/views/update/checkInstall.phtml @@ -1,7 +1,7 @@ <?php $this->partial('aside_configure'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> <h2><?php echo _t('admin.check_install.php'); ?></h2> diff --git a/app/views/update/index.phtml b/app/views/update/index.phtml index 401f6acd6..5c07d307e 100644 --- a/app/views/update/index.phtml +++ b/app/views/update/index.phtml @@ -1,12 +1,12 @@ <?php $this->partial('aside_configure'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> - <h1><?php echo _t('update_system'); ?></h1> + <h1><?php echo _t('admin.update'); ?></h1> <p> - <?php echo _i('help'); ?> <?php echo _t('update_last', $this->last_update_time); ?> + <?php echo _i('help'); ?> <?php echo _t('admin.update.last', $this->last_update_time); ?> </p> <?php if (!empty($this->message)) { ?> @@ -16,8 +16,8 @@ </p> <?php } elseif ($this->check_last_hour) { ?> <p class="alert alert-warn"> - <span class="alert-head"><?php echo _t('damn'); ?></span> - <?php echo _t('no_update'); ?> + <span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> + <?php echo _t('admin.update.none'); ?> </p> <?php } ?> @@ -26,11 +26,11 @@ (empty($this->message) || $this->message['status'] !== 'good')) { ?> <p> - <a href="<?php echo _url('update', 'check'); ?>" class="btn"><?php echo _t('update_check'); ?></a> + <a href="<?php echo _url('update', 'check'); ?>" class="btn"><?php echo _t('admin.update.check'); ?></a> </p> <?php } ?> <?php if ($this->update_to_apply) { ?> - <a class="btn btn-important" href="<?php echo _url('update', 'apply'); ?>"><?php echo _t('update_apply'); ?></a> + <a class="btn btn-important" href="<?php echo _url('update', 'apply'); ?>"><?php echo _t('admin.update.apply'); ?></a> <?php } ?> </div> diff --git a/app/views/user/manage.phtml b/app/views/user/manage.phtml index e46e02572..b175d48df 100644 --- a/app/views/user/manage.phtml +++ b/app/views/user/manage.phtml @@ -1,13 +1,13 @@ <?php $this->partial('aside_configure'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> <form method="post" action="<?php echo _url('user', 'create'); ?>"> - <legend><?php echo _t('create_user'); ?></legend> + <legend><?php echo _t('admin.user.create'); ?></legend> <div class="form-group"> - <label class="group-name" for="new_user_language"><?php echo _t('language'); ?></label> + <label class="group-name" for="new_user_language"><?php echo _t('admin.user.language'); ?></label> <div class="group-controls"> <select name="new_user_language" id="new_user_language"> <?php $languages = FreshRSS_Context::$conf->availableLanguages(); ?> @@ -19,25 +19,25 @@ </div> <div class="form-group"> - <label class="group-name" for="new_user_name"><?php echo _t('username'); ?></label> + <label class="group-name" for="new_user_name"><?php echo _t('admin.user.username'); ?></label> <div class="group-controls"> <input id="new_user_name" name="new_user_name" type="text" size="16" required="required" maxlength="16" autocomplete="off" pattern="[0-9a-zA-Z]{1,16}" placeholder="demo" /> </div> </div> <div class="form-group"> - <label class="group-name" for="new_user_passwordPlain"><?php echo _t('password_form'); ?></label> + <label class="group-name" for="new_user_passwordPlain"><?php echo _t('admin.user.password_form'); ?></label> <div class="group-controls"> <div class="stick"> <input type="password" id="new_user_passwordPlain" name="new_user_passwordPlain" autocomplete="off" pattern=".{7,}" /> <a class="btn toggle-password"><?php echo _i('key'); ?></a> </div> - <noscript><b><?php echo _t('javascript_should_be_activated'); ?></b></noscript> + <noscript><b><?php echo _t('gen.js.should_be_activated'); ?></b></noscript> </div> </div> <div class="form-group"> - <label class="group-name" for="new_user_email"><?php echo _t('persona_connection_email'); ?></label> + <label class="group-name" for="new_user_email"><?php echo _t('admin.user.email_persona'); ?></label> <?php $mail = FreshRSS_Context::$conf->mail_login; ?> <div class="group-controls"> <input type="email" id="new_user_email" name="new_user_email" class="extend" autocomplete="off" placeholder="alice@example.net" /> @@ -46,17 +46,17 @@ <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('create'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.create'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> </div> </div> </form> <form method="post" action="<?php echo _url('user', 'delete'); ?>"> - <legend><?php echo _t('users'); ?></legend> + <legend><?php echo _t('admin.user.users'); ?></legend> <div class="form-group"> - <label class="group-name" for="user-list"><?php echo _t('users_list'); ?></label> + <label class="group-name" for="user-list"><?php echo _t('admin.user.user_list'); ?></label> <div class="group-controls"> <select id="user-list" class="select-change" name="username"> <?php foreach (listUsers() as $username) { ?> @@ -64,7 +64,7 @@ <?php } ?> </select> - <p><?php echo _t('admin.users.articles_and_size', + <p><?php echo _t('admin.user.articles_and_size', format_number($this->nb_articles), format_bytes($this->size_user)); ?></p> </div> @@ -72,7 +72,7 @@ <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-attention confirm"><?php echo _t('delete'); ?></button> + <button type="submit" class="btn btn-attention confirm"><?php echo _t('gen.action.remove'); ?></button> </div> </div> </form> diff --git a/app/views/user/profile.phtml b/app/views/user/profile.phtml index 60257012c..fc9b24674 100644 --- a/app/views/user/profile.phtml +++ b/app/views/user/profile.phtml @@ -1,36 +1,36 @@ <?php $this->partial('aside_configure'); ?> <div class="post"> - <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a> + <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('gen.action.back_to_rss_feeds'); ?></a> <form method="post" action="<?php echo _url('user', 'profile'); ?>"> - <legend><?php echo _t('login_configuration'); ?></legend> + <legend><?php echo _t('conf.profile'); ?></legend> <div class="form-group"> - <label class="group-name" for="current_user"><?php echo _t('current_user'); ?></label> + <label class="group-name" for="current_user"><?php echo _t('conf.user.current'); ?></label> <div class="group-controls"> <input id="current_user" type="text" disabled="disabled" value="<?php echo Minz_Session::param('currentUser', '_'); ?>" /> <label class="checkbox" for="is_admin"> <input type="checkbox" id="is_admin" disabled="disabled" <?php echo FreshRSS_Auth::hasAccess('admin') ? 'checked="checked" ' : ''; ?>/> - <?php echo _t('is_admin'); ?> + <?php echo _t('conf.user.is_admin'); ?> </label> </div> </div> <div class="form-group"> - <label class="group-name" for="passwordPlain"><?php echo _t('password_form'); ?></label> + <label class="group-name" for="passwordPlain"><?php echo _t('conf.profile.password_form'); ?></label> <div class="group-controls"> <div class="stick"> <input type="password" id="passwordPlain" name="passwordPlain" autocomplete="off" pattern=".{7,}" <?php echo cryptAvailable() ? '' : 'disabled="disabled" '; ?>/> <a class="btn toggle-password"><?php echo _i('key'); ?></a> </div> - <noscript><b><?php echo _t('javascript_should_be_activated'); ?></b></noscript> + <noscript><b><?php echo _t('gen.js.should_be_activated'); ?></b></noscript> </div> </div> <?php if (Minz_Configuration::apiEnabled()) { ?> <div class="form-group"> - <label class="group-name" for="apiPasswordPlain"><?php echo _t('password_api'); ?></label> + <label class="group-name" for="apiPasswordPlain"><?php echo _t('conf.profile.password_api'); ?></label> <div class="group-controls"> <div class="stick"> <input type="password" id="apiPasswordPlain" name="apiPasswordPlain" autocomplete="off" pattern=".{7,}" <?php echo cryptAvailable() ? '' : 'disabled="disabled" '; ?>/> @@ -41,18 +41,18 @@ <?php } ?> <div class="form-group"> - <label class="group-name" for="mail_login"><?php echo _t('persona_connection_email'); ?></label> + <label class="group-name" for="mail_login"><?php echo _t('conf.profile.email_persona'); ?></label> <?php $mail = FreshRSS_Context::$conf->mail_login; ?> <div class="group-controls"> <input type="email" id="mail_login" name="mail_login" class="extend" autocomplete="off" value="<?php echo $mail; ?>" <?php echo FreshRSS_Auth::hasAccess('admin') ? '' : 'disabled="disabled"'; ?> placeholder="alice@example.net" /> - <noscript><b><?php echo _t('javascript_should_be_activated'); ?></b></noscript> + <noscript><b><?php echo _t('gen.js.should_be_activated'); ?></b></noscript> </div> </div> <div class="form-group form-actions"> <div class="group-controls"> - <button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button> - <button type="reset" class="btn"><?php echo _t('cancel'); ?></button> + <button type="submit" class="btn btn-important"><?php echo _t('gen.action.submit'); ?></button> + <button type="reset" class="btn"><?php echo _t('gen.action.cancel'); ?></button> </div> </div> </form> diff --git a/lib/Minz/Error.php b/lib/Minz/Error.php index c8222a430..e5f3dff07 100644 --- a/lib/Minz/Error.php +++ b/lib/Minz/Error.php @@ -19,7 +19,7 @@ class Minz_Error { * > $logs['notice'] * @param $redirect indique s'il faut forcer la redirection (les logs ne seront pas transmis) */ - public static function error ($code = 404, $logs = array (), $redirect = false) { + public static function error ($code = 404, $logs = array (), $redirect = true) { $logs = self::processLogs ($logs); $error_filename = APP_PATH . '/Controllers/errorController.php'; diff --git a/lib/Minz/Translate.php b/lib/Minz/Translate.php index 8c2f90041..e7efb8665 100644 --- a/lib/Minz/Translate.php +++ b/lib/Minz/Translate.php @@ -5,71 +5,117 @@ */ /** - * La classe Translate se charge de la traduction - * Utilise les fichiers du répertoire /app/i18n/ + * This class is used for the internationalization. + * It uses files in `./app/i18n/` */ class Minz_Translate { /** - * $language est la langue à afficher + * $lang_name is the name of the current language to use. */ - private static $language; - + private static $lang_name; + + /** + * $lang_path is the pathname of i18n files (e.g. ./app/i18n/en/). + */ + private static $lang_path; + /** - * $translates est le tableau de correspondance - * $key => $traduction + * $translates is a cache for i18n translation. */ private static $translates = array(); - + /** - * Inclus le fichier de langue qui va bien - * l'enregistre dans $translates + * Load $lang_name and $lang_path based on configuration and selected language. */ public static function init() { $l = Minz_Configuration::language(); - self::$language = Minz_Session::param('language', $l); - - $l_path = APP_PATH . '/i18n/' . self::$language . '.php'; - - if (file_exists($l_path)) { - self::$translates = include($l_path); - } + self::$lang_name = Minz_Session::param('language', $l); + self::$lang_path = APP_PATH . '/i18n/' . self::$lang_name . '/'; } - + /** - * Alias de init + * Alias for init(). */ public static function reset() { self::init(); } - + /** - * Traduit une clé en sa valeur du tableau $translates - * @param $key la clé à traduire - * @return la valeur correspondante à la clé - * > si non présente dans le tableau, on retourne la clé elle-même + * Translate a key into its corresponding value based on selected language. + * @param $key the key to translate. + * @param additional parameters for variable keys. + * @return the value corresponding to the key. + * If no value is found, return the key itself. */ public static function t($key) { - $translate = $key; - - if (isset(self::$translates[$key])) { - $translate = self::$translates[$key]; + $group = explode('.', $key); + + if (count($group) < 2) { + Minz_Log::debug($key . ' is not in a valid format'); + $top_level = 'gen'; + } else { + $top_level = array_shift($group); } + $filename = self::$lang_path . $top_level . '.php'; + + // Try to load the i18n file if it's not done yet. + if (!isset(self::$translates[$top_level])) { + if (!file_exists($filename)) { + Minz_Log::debug($top_level . ' is not a valid top level key'); + return $key; + } + + self::$translates[$top_level] = include($filename); + } + + // Go through the i18n keys to get the correct translation value. + $translates = self::$translates[$top_level]; + $size_group = count($group); + $level_processed = 0; + $translation_value = $key; + foreach ($group as $i18n_level) { + $level_processed++; + if (!isset($translates[$i18n_level])) { + Minz_Log::debug($key . ' is not a valid key'); + return $key; + } + + if ($level_processed < $size_group) { + $translates = $translates[$i18n_level]; + } else { + $translation_value = $translates[$i18n_level]; + } + } + + if (is_array($translation_value)) { + if (isset($translation_value['_'])) { + $translation_value = $translation_value['_']; + } else { + Minz_Log::debug($key . ' is not a valid key'); + return $key; + } + } + + // Get the facultative arguments to replace i18n variables. $args = func_get_args(); unset($args[0]); - - return vsprintf($translate, $args); + + return vsprintf($translation_value, $args); } - + /** - * Retourne la langue utilisée actuellement - * @return la langue + * Return the current language. */ public static function language() { - return self::$language; + return self::$lang_name; } } + +/** + * Alias for Minz_Translate::t() + */ function _t($key) { $args = func_get_args(); unset($args[0]); diff --git a/lib/SimplePie/SimplePie.php b/lib/SimplePie/SimplePie.php index 84001dd9a..dc4bbb6cb 100644 --- a/lib/SimplePie/SimplePie.php +++ b/lib/SimplePie/SimplePie.php @@ -1582,13 +1582,15 @@ class SimplePie if (!$locate->is_feed($file)) { + $copyStatusCode = $file->status_code; //FreshRSS + $copyContentType = $file->headers['content-type']; //FreshRSS // We need to unset this so that if SimplePie::set_file() has been called that object is untouched unset($file); try { if (!($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds))) { - $this->error = "A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or " . SIMPLEPIE_NAME . " was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed."; + $this->error = "A feed could not be found at `$this->feed_url`; the status code is `$copyStatusCode` and content-type is `$copyContentType`"; //FreshRSS $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__)); return false; } diff --git a/lib/SimplePie/SimplePie/Locator.php b/lib/SimplePie/SimplePie/Locator.php index 90ee7a302..4e5f7c1ca 100644 --- a/lib/SimplePie/SimplePie/Locator.php +++ b/lib/SimplePie/SimplePie/Locator.php @@ -148,7 +148,7 @@ class SimplePie_Locator { $sniffer = $this->registry->create('Content_Type_Sniffer', array($file)); $sniffed = $sniffer->get_type(); - if (in_array($sniffed, array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml'))) + if (in_array($sniffed, array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml', 'application/x-rss+xml'))) //FreshRSS { return true; } diff --git a/lib/lib_rss.php b/lib/lib_rss.php index e7ca95aba..264c69d58 100644 --- a/lib/lib_rss.php +++ b/lib/lib_rss.php @@ -79,11 +79,11 @@ function format_bytes($bytes, $precision = 2, $system = 'IEC') { } function timestamptodate ($t, $hour = true) { - $month = _t(date('M', $t)); + $month = _t('gen.date.' . date('M', $t)); if ($hour) { - $date = _t('format_date_hour', $month); + $date = _t('gen.date.format_date_hour', $month); } else { - $date = _t('format_date', $month); + $date = _t('gen.date.format_date', $month); } return @date ($date, $t); @@ -110,7 +110,7 @@ function html_only_entity_decode($text) { function customSimplePie() { $limits = Minz_Configuration::limits(); $simplePie = new SimplePie(); - $simplePie->set_useragent(_t('freshrss') . '/' . FRESHRSS_VERSION . ' (' . PHP_OS . '; ' . FRESHRSS_WEBSITE . ') ' . SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION); + $simplePie->set_useragent(_t('gen.freshrss') . '/' . FRESHRSS_VERSION . ' (' . PHP_OS . '; ' . FRESHRSS_WEBSITE . ') ' . SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION); $simplePie->set_cache_location(CACHE_PATH); $simplePie->set_cache_duration($limits['cache_duration']); $simplePie->set_timeout($limits['timeout']); @@ -242,11 +242,14 @@ function is_referer_from_same_domain() { $host = parse_url(((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? 'https://' : 'http://') . (empty($_SERVER['HTTP_HOST']) ? $_SERVER['SERVER_NAME'] : $_SERVER['HTTP_HOST'])); $referer = parse_url($_SERVER['HTTP_REFERER']); - if (empty($host['scheme']) || empty($referer['scheme']) || $host['scheme'] !== $referer['scheme'] || - empty($host['host']) || empty($referer['host']) || $host['host'] !== $referer['host']) { + if (empty($host['host']) || empty($referer['host']) || $host['host'] !== $referer['host']) { return false; } - return (isset($host['port']) ? $host['port'] : 0) === (isset($referer['port']) ? $referer['port'] : 0); + //TODO: check 'scheme', taking into account the case of a proxy + if ((isset($host['port']) ? $host['port'] : 0) !== (isset($referer['port']) ? $referer['port'] : 0)) { + return false; + } + return true; } diff --git a/p/scripts/main.js b/p/scripts/main.js index dc5428048..e48630d89 100644 --- a/p/scripts/main.js +++ b/p/scripts/main.js @@ -231,6 +231,14 @@ function toggleContent(new_active, old_active) { } old_active.removeClass("active current"); new_active.addClass("current"); + if (context['auto_remove_article'] && !old_active.hasClass('not_read')) { + var p = old_active.prev(); + var n = old_active.next(); + if (p.hasClass('day') && n.hasClass('day')) { + p.remove(); + } + old_active.remove(); + } } else { new_active.toggleClass('active'); } @@ -681,6 +689,14 @@ function init_stream(divStream) { divStream.on('click', '.flux a.read', function () { var active = $(this).parents(".flux"); + if (context['auto_remove_article'] && active.hasClass('not_read')) { + var p = active.prev(); + var n = active.next(); + if (p.hasClass('day') && n.hasClass('day')) { + p.remove(); + } + active.remove(); + } mark_read(active, false); return false; }); diff --git a/p/themes/BlueLagoon/BlueLagoon.css b/p/themes/BlueLagoon/BlueLagoon.css new file mode 100644 index 000000000..ae1c24604 --- /dev/null +++ b/p/themes/BlueLagoon/BlueLagoon.css @@ -0,0 +1,1210 @@ +@charset "UTF-8"; + +/*=== FONTS */ +@font-face { + font-family: "OpenSans"; + src: url("../fonts/openSans.woff") format("woff"); +} + +/*=== GENERAL */ +/*============*/ +html, body { + height: 100%; + font-family: "OpenSans", "Cantarell", "Helvetica", "Arial", sans-serif; + background: #fafafa; + font-size: 92%; +} + +/*=== Links */ +a, button.as-link { + color: #0062BE; + outline: none; +} + +/*=== Forms */ +.form-group{ + width: 100%; + float: left; + height: auto; + display: inline-block; +} +legend { + margin: 20px 0 5px; + padding: 5px 0; + border-bottom: 1px solid #ddd; + font-size: 1.4em; +} +label { + min-height: 25px; + padding: 5px 0; + cursor: pointer; +} +textarea { + width: 360px; + height: 100px; +} +input, select, textarea { + min-height: 25px; + padding: 5px; + background: #fff; + border: 1px solid #ccc; + border-radius: 3px; + color: #222; + line-height: 25px; + vertical-align: middle; + box-shadow: 0 1px 2px #ccc inset, 0 1px #fff; +} +option { + padding: 0 .5em; +} +input:focus, select:focus, textarea:focus { + color: #0F0F0F; + box-shadow: 0 0 3px #0062BF; + border: solid 1px #0062BF; +} +input:invalid, select:invalid { + border-color: #f00; + box-shadow: 0 0 2px 2px #fdd inset; +} +input:disabled, select:disabled { + background: #eee; +} +input.extend { + transition: width 200ms linear; + -moz-transition: width 200ms linear; + -webkit-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; +} + +/*=== Tables */ +table { + border-collapse: collapse; +} + +tr, th, td { + padding: 0.5em; + border: 1px solid #ddd; +} +th { + background: #f6f6f6; +} +form td, +form th { + font-weight: normal; + text-align: center; +} + +/*=== COMPONENTS */ +/*===============*/ +/*=== Forms */ +.form-group.form-actions { + padding: 5px 0; + background: #f4f4f4; + border-top: 1px solid #ddd; +} +.form-group.form-actions .btn { + margin: 0 10px; + border-radius: 4px; + box-shadow:0 1px rgba(255,255,255,0.08) inset; +} +.form-group .group-name { + padding: 10px 0; + text-align: right; +} +.form-group .group-controls { + min-height: 25px; + padding: 5px 0; +} +.form-group table { + margin: 10px 0 0 220px; +} + +/*=== Buttons */ + +.dropdown-menu .input select, .dropdown-menu .input input { + background:#444; + color:#fff; + box-shadow:0 2px 2px #222 inset, 0px 1px rgba(255, 255, 255, 0.08); + border:solid 1px #171717; +} + +.stick { + vertical-align: middle; + font-size: 0; +} +.stick input, +.stick .btn { + border-radius: 0; +} +.stick .btn:first-child,.stick input:first-child { + border-radius: 6px 0 0 6px; +} +.stick .btn-important:first-child { +} +.stick .btn:last-child, .stick input:last-child { + border-radius: 0 6px 6px 0; +} +.stick .btn + .btn, +.stick .btn + input, +.stick .btn + .dropdown > .btn, +.stick input + .btn, +.stick input + input, +.stick input + .dropdown > .btn, +.stick .dropdown + .btn, +.stick .dropdown + input, +.stick .dropdown + .dropdown > .btn { + border-left: none; +} +.stick .btn + .dropdown > .btn { + border-left: none; + border-radius: 0 3px 3px 0; +} + +.btn { + display: inline-block; + min-height: 37px; + min-width: 15px; + margin: 0; + padding: 5px 10px; + color:#222; + border: solid 1px #ccc; + border-radius: 4px; + background: linear-gradient(0deg, #EDE7DE 0%, #FFF 100%) #EDE7DE; + background: -webkit-linear-gradient(bottom, #EDE7DE 0%, #FFF 100%); + text-shadow: 0px -1px rgba(255,255,255,0.08); + font-size: 0.9rem; + vertical-align: middle; + cursor: pointer; + overflow: hidden; +} +a.btn { + min-height: 25px; + line-height: 25px; +} +.btn:hover { + text-shadow: 0 0 2px #fff; + text-decoration:none; +} +.btn.active,.btn:active,.dropdown-target:target ~ .btn.dropdown-toggle { + background: linear-gradient(180deg, #EDE7DE 0%, #FFF 100%) #EDE7DE; + background: -webkit-linear-gradient(top, #EDE7DE 0%, #FFF 100%); +} + +.nav_menu .btn.active, .nav_menu .btn:active, .nav_menu .dropdown-target:target ~ .btn.dropdown-toggle{ + box-shadow: 0 1px #fff; + border-radius: 4px; + background: linear-gradient(180deg, #EDE7DE 0%, #F6F6F6 100%) #EDE7DE; + background: -webkit-linear-gradient(top, #EDE7DE 0%, #F6F6F6 100%); + border: solid 1px #ccc; +} +.nav_menu .btn { + border: 0; + background:transparent; +} + +.read_all { + color:#222; +} +.btn.dropdown-toggle[href="#dropdown-configure"]{ + background: linear-gradient(0deg, #EDE7DE 0%, #FFF 100%) #EDE7DE; + background: -webkit-linear-gradient(bottom, #EDE7DE 0%, #FFF 100%); + border-radius: 4px; + border: solid 1px #ccc; + box-shadow: 0 1px #fff; +} +.btn.dropdown-toggle:active { + background:transparent; +} +.btn-important { + background: linear-gradient(180deg, #0090FF 0%, #0062BE 100%) #E4992C; + background: -webkit-linear-gradient(top, #0090FF 0%, #0062BE 100%); + color: #FFF; + box-shadow: 0 1px rgba(255,255,255,0.08) inset; + border-radius: 4px; + text-shadow: 0px -1px rgba(255,255,255,0.08); + font-weight: normal; +} +.btn-important:hover { +} +.btn-important:active { + background: linear-gradient(0deg, #E4992C 0%, #D18114 100%) #E4992C; + background: -webkit-linear-gradient(bottom, #E4992C 0%, #D18114 100%); +} + +.btn-attention { + background: #E95B57; + background: linear-gradient(to bottom, #E95B57, #BD362F); + background: -webkit-linear-gradient(top, #E95B57 0%, #BD362F 100%); + color: #fff; + border: 1px solid #C44742; + text-shadow: 0px -1px 0px #666; +} +.btn-attention:hover { + background: linear-gradient(to bottom, #D14641, #BD362F); + background: -webkit-linear-gradient(top, #D14641 0%, #BD362F 100%); +} +.btn-attention:active { + background: #BD362F; + box-shadow: none; +} +.btn[type="reset"]{ + color: #fff; + background:linear-gradient(180deg, #222 0%, #171717 100%) #171717; + background: -webkit-linear-gradient(top, #222 0%, #171717 100%); + box-shadow:0 -1px rgba(255,255,255,0.08) inset; +} +/*=== Navigation */ +.nav-list .nav-header, +.nav-list .item { + height: 2.5em; + line-height: 2.5em; + font-size: 0.9rem; +} +.nav-list .item:hover { + text-shadow: 0 0 2px rgba(255,255,255,0.28); + color:#fff; +} + +.nav-list .item.active { + background: linear-gradient(180deg, #0090FF 0%, #0062BE 100%) #E4992C; + background: -webkit-linear-gradient(top, #0090FF 0%, #0062BE 100%); + border-width: medium medium 1px; + border-style: none none solid; + border-color: -moz-use-text-color -moz-use-text-color #171717; + box-shadow: -1px 2px 2px #171717, 0px 1px rgba(255, 255, 255, 0.08) inset; + margin: 0; +} +.nav-list .item.active a { + color: #fff; +} +.nav-list .disable { + color: #aaa; + background: #fafafa; + text-align: center; +} +.nav-list .item > a { + padding: 0 10px; + color:#ccc; +} +.nav-list a:hover { + text-decoration: none; +} +.nav-list .item.empty a { + color: #f39c12; +} +.nav-list .item.active.empty a { + color: #fff; + background: linear-gradient(180deg, #E4992C 0%, #D18114 100%) #E4992C; + background: -webkit-linear-gradient(180deg, #E4992C 0%, #D18114 100%); +} +.nav-list .item.error a { + color: #BD362F; +} +.nav-list .item.active.error a { + color: #fff; + background: #BD362F; +} + +.nav-list .nav-header { + padding: 0 10px; + color: #222; + background: transparent; +} + +.nav-list .nav-form { + padding: 3px; + text-align: center; +} + +.nav-head { + margin: 0; + background: linear-gradient(0deg, #EDE7DE 0%, #FFF 100%) #EDE7DE; + background: -webkit-linear-gradient(bottom, #EDE7DE 0%, #FFF 100%); + text-align: right; +} +.nav-head .item { + padding: 5px 10px; + font-size: 0.9rem; + line-height: 1.5rem; +} + +/*=== Horizontal-list */ +.horizontal-list { + margin: 0; + padding: 0; +} +.horizontal-list .item { + vertical-align: middle; +} + +/*=== Dropdown */ +.dropdown-menu { + margin: 5px 0 0; + padding: 5px 0; + border: 1px solid #171717; + border-radius: 4px; + box-shadow: 0 0 3px #000; + font-size: 0.8rem; + text-align: left; + background: #222; +} +.dropdown-menu:after { + content: ""; + position: absolute; + top: -6px; + right: 13px; + width: 10px; + height: 10px; + background: #222; + border-top: 1px solid #171717; + border-left: 1px solid #171717; + z-index: -10; + transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); +} +.dropdown-header { + display:none; +} +.dropdown-menu > .item > a { + padding: 0 25px; + line-height: 2.5em; + color: #ccc; +} +.dropdown-menu > .item > span, +.dropdown-menu > .item > .as-link { + padding: 0 22px; + line-height: 2em; + color: #ccc; +} +.dropdown-menu > .item:hover { + background: linear-gradient(180deg, #0090FF 0%, #0062BE 100%) #E4992C; + background: -webkit-linear-gradient(top, #0090FF 0%, #0062BE 100%); + color: #fff; +} +.dropdown-menu > .item[aria-checked="true"] > a:before { + font-weight: bold; + margin: 0 0 0 -14px; +} +.dropdown-menu > .item:hover > a { + color: #fff; + text-decoration: none; +} +.dropdown-menu .input select, +.dropdown-menu .input input { + margin: 0 auto 5px; + padding: 2px 5px; + border-radius: 3px; +} + +.separator { + margin: 5px 0; + border-bottom: 1px solid #171717; + box-shadow: 0 1px rgba(255,255,255,0.08); +} + +/*=== Alerts */ +.alert { + margin: 15px auto; + padding: 10px 15px; + background: #f4f4f4; + border: 1px solid #ccc; + border-right: 1px solid #aaa; + border-bottom: 1px solid #aaa; + border-radius: 5px; + color: #aaa; + text-shadow: 0 0 1px #eee; + font-size: 0.9em; +} +.alert-head { + font-size: 1.15em; +} +.alert > a { + color: inherit; + text-decoration: underline; +} +.alert-warn { + background: #ffe; + border: 1px solid #eeb; + color: #c95; +} +.alert-success { + background: #dfd; + border: 1px solid #cec; + color: #484; +} +.alert-error { + background: #fdd; + border: 1px solid #ecc; + color: #844; +} + +/*=== Pagination */ +.pagination { + background: #fafafa; + text-align: center; + color: #333; + font-size: 0.8em; +} +.content .pagination { + margin: 0; + padding: 0; +} +.pagination .item.pager-current { + font-weight: bold; + font-size: 1.5em; +} +.pagination .item a { + display: block; + color: #333; + font-style: italic; + line-height: 3em; + text-decoration: none; +} +.pagination .item a:hover { + background: #ddd; +} +.pagination:first-child .item { + border-bottom: 1px solid #aaa; +} +.pagination:last-child .item { + border-top: 1px solid #ddd; +} + +.pagination .loading, +.pagination a:hover.loading { + background: url("loader.gif") center center no-repeat #fff; + font-size: 0; + height:55px +} + +/*=== Boxes */ +.box { + background: #F9F7F4; + border-radius: 4px; + box-shadow: 0 1px #fff; +} +.box .box-title { + margin: 0; + padding: 5px 10px; + background: linear-gradient(0deg, #EDE7DE 0%, #fff 100%) #171717; + background: -webkit-linear-gradient(bottom, #EDE7DE 0%, #fff 100%); + box-shadow: 0px -1px #fff inset,0 -2px #ccc inset; + color: #888; + text-shadow: 0 1px #ccc; + border-radius: 4px 4px 0 0; + font-size: 1.1rem; + font-weight: normal; +} +.box .box-content { + max-height: 260px; +} + +.box .box-content .item { + padding: 0 10px; + font-size: 0.9rem; + line-height: 2.5em; +} + +.box .box-content .item .configure { + visibility: hidden; +} +.box .box-content .item:hover .configure { + visibility: visible; +} + +/*=== Tree */ +.tree { + margin: 10px 0; +} +.tree-folder-title { + position: relative; + padding: 0 10px; + line-height: 2.5rem; + font-size: 0.9rem; +} +.tree-folder-title .title { + background: inherit; + color: #fff; +} +.tree-folder-title .title:hover { + text-decoration: none; +} +.tree-folder.active .tree-folder-title { + background: linear-gradient(180deg, #222 0%, #171717 100%) #171717; + background: -webkit-linear-gradient(top, #222 0%, #171717 100%); + box-shadow: 0px 1px #171717, 0px 1px rgba(255, 255, 255, 0.08) inset; + text-shadow: 0 0 2px rgba(255,255,255,0.28); + color: #fff; +} +.tree-folder.active > .tree-folder-title > a.title{ + color: #0090FF; + text-shadow: 0 1px rgba(255,255,255,0.08); +} +.tree-folder-items { + background: #171717; + padding: 8px 0; + box-shadow: 0 4px 4px #171717 inset, 0 1px rgba(255,255,255,0.08),0 -1px rgba(255,255,255,0.08); +} +.tree-folder-items > .item { + padding: 0 10px; + line-height: 2.5rem; + font-size: 0.8rem; +} +.tree-folder-items > .item.active { + background: linear-gradient(180deg, #222 0%, #171717 100%) #171717; + background: -webkit-linear-gradient(top, #222 0%, #171717 100%); + border-radius: 4px; + margin: 0px 8px; + box-shadow: 0px 1px #171717, 0px 1px rgba(255, 255, 255, 0.08) inset, 0 2px 2px #111; +} +.tree-folder-items > .item > a { + text-decoration: none; + color: #fff; + font-size: 0.92em; +} +.tree-folder-items > .item.active > a { + color: #0090FF +} + +/*=== STRUCTURE */ +/*===============*/ +/*=== Header */ +.header { + height: 55px; + background: linear-gradient(0deg, #EDE7DE 0%, #FFF 100%) #EDE7DE; + background: -webkit-linear-gradient(bottom, #EDE7DE 0%, #FFF 100%); + border-bottom: solid 1px #BDB7AE; + box-shadow: 0 -1px rgba(255,255,255,0.28) inset; +} +.header > .item { + padding: 0; + vertical-align: middle; + text-align: center; +} +.header > .item.title .logo { + height: 60px; + width: 60px; +} +.header > .item.title{ + width: 250px; +} +.header > .item.title h1 { + margin: 0.5em 0; +} +.header > .item.title h1 a { + text-decoration: none; + font-size: 28px; + color:#222; + text-shadow: 0 1px #fff; +} +.header > .item.search input { + width: 230px; +} +.header .item.search input:focus { + width: 350px; +} + +/*=== Body */ +#global { + background:#F9F7F4; + height: calc(100% - 60px); +} +.aside { + box-shadow: 0 2px 2px #171717 inset; + background: #222; + width: 235px; +} +.aside.aside_feed { + padding: 10px 0; + text-align: center; +} +.aside.aside_feed .tree { + position: sticky; + top: 0; + margin: 10px 0 50px; +} + +/*=== Aside main page (categories) */ +.aside_feed .tree-folder-title > .title:not([data-unread="0"]):after { + position: absolute; + right: 3px; + padding: 1px 5px; + color: #fff; + text-shadow: 0 1px rgba(255,255,255,0.08); +} +.aside_feed .btn-important { + border: none; +} + +/*=== Aside main page (feeds) */ +.feed.item.empty, +.feed.item.empty > a { + color: #e67e22; +} +.feed.item.error, +.feed.item.error > a { + color: #BD362F; +} +.aside_feed .tree-folder-items .dropdown-menu:after { + left: 2px; +} +.aside_feed .tree-folder-items .item .dropdown-target:target ~ .dropdown-toggle > .icon, +.aside_feed .tree-folder-items .item:hover .dropdown-toggle > .icon, +.aside_feed .tree-folder-items .item.active .dropdown-toggle > .icon { + border-radius: 3px; +} + +/*=== Configuration pages */ +.post { + padding: 10px 50px; + font-size: 0.9em; +} +.post form { + margin: 10px 0; +} +.post.content { + max-width: 550px; +} + +/*=== Prompt (centered) */ +.prompt { + text-align: center; + padding: 14px 0px; + text-shadow: 0 1px rgba(255,255,255,0.08); +} +.prompt label { + text-align: left; +} +.prompt form { + margin: 10px auto 20px auto; + width: 180px; +} +.prompt input { + margin: 5px auto; + width: 100%; +} +.prompt p { + margin: 20px 0; +} +.prompt input#username,.prompt input#passwordPlain{ + border:solid 1px #ccc; + box-shadow: 0 4px -4px #ccc inset,0px 1px rgba(255, 255, 255, 0.08); + background:#fff; +} +.prompt input#username:focus,.prompt input#passwordPlain:focus{ + border: solid 1px #0062BE; + box-shadow: 0 0 3px #0062BE; +} + +/*=== New article notification */ +#new-article { + background: #0084CC; + text-align: center; + font-size: 0.9em; +} +#new-article:hover { + background: #0066CC; +} +#new-article > a { + line-height: 3em; + color: #fff; + font-weight: bold; +} +#new-article > a:hover { + text-decoration: none; +} + +/*=== Day indication */ +.day { + padding: 0 10px; + font-style:italic; + line-height: 3em; + box-shadow: 0 -1px #ccc, 0 -1px rgba(255,255,255,0.28) inset; + background: #F9F7F4; + color: #666; + text-shadow: 0 1px rgba(255,255,255,0.28); + text-align: center; +} +#new-article + .day { + border-top: none; +} +.day .name { + display: none; +} + +/*=== Index menu */ +.nav_menu { + background: linear-gradient(0deg, #EDE7DE 0%, #C2BCB3 100%) #EDE7DE; + background: -webkit-linear-gradient(bottom, #EDE7DE 0%, #C2BCB3 100%); + border-bottom: 1px solid #ccc; + box-shadow:0 -1px rgba(255, 255, 255, 0.28) inset; + text-align: center; + padding: 5px 0; +} +#panel >.nav_menu{ + background: linear-gradient(0deg, #EDE7DE 0%, #FFF 100%) #EDE7DE; + background: -webkit-linear-gradient(bottom, #EDE7DE 0%, #FFF 100%); +} +#panel > .nav_menu > #nav_menu_read_all{ + background: linear-gradient(0deg, #EDE7DE 0%, #FFF 100%) #EDE7DE; + background: -webkit-linear-gradient(bottom, #EDE7DE 0%, #FFF 100%); + border-radius: 4px; + border: 1px solid #CCC; + box-shadow: 0px 1px #FFF; +} +#panel > .nav_menu > #nav_menu_read_all > .dropdown > .btn.dropdown-toggle{ + border-radius: 0 4px 4px 0; + border:none; + border-left: solid 1px #ccc; +} + +/*=== Feed articles */ +.flux_content { + background: #FFF; +} +.flux { + background: #F9F7F4; +} +.flux:hover { + background: #F9F7F4; +} +.flux:not(.current):hover .item.title { + background: #F9F7F4; +} +.flux.current .flux .item.title a { + text-shadow:0 0 2px #ccc; +} +.flux.not_read:not(.current):hover .item.title { + opacity:0.85; +} +.flux.favorite { + background: #FFF6DA; +} +.flux.favorite:not(.current):hover{ + background: #F9F7F4; +} +.flux.favorite:not(.current):hover .item.title { + background: #F9F7F4; +} +.flux.current { + background: linear-gradient(0deg, #DAD4CB 0%, #FFF 100%) #DAD4CB; + background: -webkit-linear-gradient(bottom, #DAD4CB 0%, #FFF 100%); + box-shadow: 0 -1px #fff inset, 0 2px #ccc; + border-left: solid 4px #0062BF; +} + +.flux .item.title { +opacity: 0.35; +} +.flux.favorite .item.title { +opacity: 1; +} +.flux.not_read .item.title { +opacity: 1; +} +.flux.current .item.title a { + color: #0f0f0f; +} +.flux .item.title a { + color: #333; +} + +.flux_header { + border-top: 1px solid #ddd; + font-size: 0.8rem; + cursor: pointer; + box-shadow: 0 -1px rgba(255,255,255,0.28) inset; +} +.flux_header .title { + font-size: 0.9rem; +} +.flux .website .favicon { + padding: 5px; +} +.flux .date { + color: #666; + font-size: 0.7rem; +} + +.flux .bottom { + font-size: 0.8rem; + text-align: center; +} + +/*=== Content of feed articles */ +.content { + padding: 20px 10px; +} +.content > h1.title > a { + color: #000; +} + +.content hr { + margin: 30px 10px; + height: 1px; + background: #ddd; + border: 0; + box-shadow: 0 2px 5px #ccc; +} + +.content pre { + margin: 10px auto; + padding: 10px 20px; + overflow: auto; + background: #222; + color: #fff; + font-size: 0.9rem; + border-radius: 3px; +} +.content code { + padding: 2px 5px; + color: #dd1144; + background: #fafafa; + border: 1px solid #eee; + border-radius: 3px; +} +.content pre code { + background: transparent; + color: #fff; + border: none; +} + +.content blockquote { + display: block; + margin: 0; + padding: 5px 20px; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + background: #fafafa; + color: #333; +} +.content blockquote p { + margin: 0; +} + +/*=== Notification and actualize notification */ +.notification { + padding: 0 0 0 5px; + text-align: center; + background:#222; + border: none; + border-radius: 0 0 6px 6px; + box-shadow: 0px 0px 4px rgba(0,0,0,0.45), 0 -1px rgba(255,255,255,0.08) inset, 0 2px 2px #171717 inset; + color:#fff; + font-weight: bold; + font-size: 0.9em; + line-height: 3em; + position:absolute; + top:0; + z-index: 10; + vertical-align: middle; +} +.notification.good { + color: #fff; +} +.notification.bad { + background: #222222; + color: #EB2901; +} +.notification a.close { + padding: 0 15px; + line-height: 3em; +} +.notification#actualizeProgress { + line-height: 2em; +} + +/*=== "Load more" part */ +#bigMarkAsRead { + text-align: center; + text-decoration: none; + text-shadow: 0 -1px 0 #aaa; + color: #666; + background: #F9F7F4; + box-shadow: 0 1px rgba(255,255,255,0.28)inset; +} +#bigMarkAsRead:hover { + color: #000; + background: #F9F7F4; + background: radial-gradient(circle at 50% -25% , #ccc 0%, #F9F7F4 50%); +} +#bigMarkAsRead:hover .bigTick { + text-shadow: 0 0 10px #666; +} + +/*=== Navigation menu (for articles) */ +#nav_entries { + background: linear-gradient(180deg, #222 0%, #171717 100%) #222; + background: -webkit-linear-gradient(top, #222 0%, #171717 100%); + border-top: 1px solid #171717; + text-align: center; + line-height: 3em; + table-layout: fixed; + box-shadow: 0 1px rgba(255,255,255,0.08) inset, 0 -2px 2px #171717; + width:235px; +} + +/*=== READER VIEW */ +/*================*/ +#stream.reader .flux { + padding: 0 0 50px; + border: none; + background: #f0f0f0; + color: #333; +} +#stream.reader .flux .author { + margin: 0 0 10px; + font-size: 90%; + color: #666; +} + +/*=== GLOBAL VIEW */ +/*================*/ +#stream.global { + padding: 24px 0; +} + +.box.category .box-title { + background: linear-gradient(0deg, #EDE7DE 0%, #fff 100%) #171717; + background: -webkit-linear-gradient(bottom, #EDE7DE 0%, #fff 100%); + box-shadow: 0px -1px #fff inset,0 -2px #ccc inset; + border-radius: none; + line-height: 2em; + font-size: 1.2rem; + text-shadow:0 1px #ccc; +} +.box.category .box-title .title { + font-weight: normal; + text-decoration: none; + text-align: left; + color: #888; +} +.box.category:not([data-unread="0"]) .box-title { +} +.box.category:not([data-unread="0"]) .box-title:active { +} +.box.category:not([data-unread="0"]) .box-title .title { + color: #222; + font-weight: bold; +} +.box.category .title:not([data-unread="0"]):after { + position: absolute; + top: 5px; right: 10px; + border: 0; + background: none; + font-weight: bold; +} +.box.category .item.feed { + padding: 2px 10px; + font-size: 0.8rem; +} +.box.category .item.feed:not(.empty):not(.error) .item-title { + color: #222; +} + +/*=== PANEL */ +/*===========*/ +#panel { + box-shadow: 0px 0px 4px #000; + border-radius: 8px; + background:#F9F7F4; +} +/*=== DIVERS */ +/*===========*/ +.aside.aside_feed .nav-form input,.aside.aside_feed .nav-form select { + width: 130px; +} +.aside.aside_feed .nav-form .dropdown .dropdown-menu { + right: -20px; +} +.aside.aside_feed .nav-form .dropdown .dropdown-menu:after { + right: 33px; +} + +/*=== STATISTICS */ +/*===============*/ +.stat { + margin: 10px 0 20px; +} + +.stat th, +.stat td, +.stat tr { + border: none; +} +.stat > table td, +.stat > table th { + border-bottom: 1px solid #ccc; + background: rgba(255,255,255,0.38); + box-shadow: 0 1px #fff; +} + +.stat > .horizontal-list { + margin: 0 0 5px; +} +.stat > .horizontal-list .item { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.stat > .horizontal-list .item:first-child { + width: 250px; +} + +/*=== LOGS */ +/*=========*/ +.logs { + border: 1px solid #aaa; + border-radius: 5px; + overflow: hidden; +} +.log { + padding: 5px 10px; + background: #fafafa; + color: #333; + font-size: 0.8rem; +} +.log+.log { + border-top: 1px solid #aaa; +} +.log .date { + display: block; + font-weight: bold; +} +.log.error { + background: #fdd; + color: #844; +} +.log.warning { + background: #ffe; + color: #c95; +} +.log.notice { + background: #f4f4f4; + color: #aaa; +} +.log.debug { + background: #333; + color: #eee; +} + +#slider.active { + box-shadow: -4px 0 4px rgba(15, 15, 15, 0.55); + background: #F8F8F8; +} +#close-slider.active { + background: rgba(15, 15, 15, 0.35); +} + +/*=== MOBILE */ +/*===========*/ +@media screen and (max-width: 840px) { + .header { + display: table; + } + .nav-login { + display: none; + } + + .aside { + width: 0; + border-top: none; + box-shadow: 3px 0 3px #000; + transition: width 200ms linear; + -moz-transition: width 200ms linear; + -webkit-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; + } + .aside:target { + width: 235px; + } + .aside .toggle_aside, + #panel .close { + display: block; + width: 100%; + height: 40px; + line-height: 40px; + text-align: center; + background: #171717; + box-shadow: 0 1px rgba(255,255,255,0.08); + } + .aside .btn-important { + display: inline-block; + margin: 20px 0 0; + } + + .aside.aside_feed { + padding: 0; + } + .aside.aside_feed .tree { + position: static; + } + + .nav_menu .btn { + margin: 5px 10px; + } + .nav_menu .stick { + margin: 0 10px; + } + .nav_menu .stick .btn { + margin: 5px 0; + } + .nav_menu .search { + display: inline-block; + max-width: 97%; + } + .nav_menu .search input { + max-width: 97%; + width: 90px; + } + .nav_menu .search input:focus { + width: 400px; + } + + .day .name { + display: none; + } + + .pagination { + margin: 0 0 3.5em; + } + + .notification a.close { + display: block; + left: 0; + background: transparent; + } + .notification a.close:hover { + opacity: 0.5; + } + .notification a.close .icon { + display: none; + } + .nav_menu .search { + display: none; + } + + #nav_entries { + width: 100%; + } +} + +@media (max-width: 700px) { + .header{ + display: none; + } + .nav-login { + display: inline-block; + width: 100%; + } + .nav_menu .search { + display: inline-block; + } + .aside .btn-important { + display: none; + } +} diff --git a/p/themes/BlueLagoon/README.md b/p/themes/BlueLagoon/README.md new file mode 100644 index 000000000..62afc234b --- /dev/null +++ b/p/themes/BlueLagoon/README.md @@ -0,0 +1,38 @@ +Blue Lagoon +======= + +**C'est un cocktail (bis)! C'est la version plus "fresh" de [Screwdriver](https://github.com/misterair/Screwdriver). C'est... c'est... un thème pour l'agrégateur de flux RSS [FreshRSS](https://github.com/marienfressinaud/FreshRSS/)** + + +En toute modestie, ce thème tue du Nyan Cat. + + + + +Installation +----------------- +1. Placez le dossier du thème dans ledossier /FreshRSS/p/themes/Screwdriver de votre FreshRSS; +2. Allez dans les paramètres d'Affichage et changez de thème; +3. Profitez de votre Blue Laggon sans modération! +4. Remontez les problèmes sur Github (*facultatif mais fortement apprécié*) + + + +Blue Lagoon est distribué sous license AlcoholWare: +----------------- + +« LICENCE ALCOHOLWARE » (Révision 42): + +mister.air@gmail.com a créé ce fichier. Tant que vous conservez cet avertissement, + +vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et + +que vous pensez que ce truc vaut le coup, vous pouvez me payer un verre (rempli) en retour. + +*Mister aiR* + + + + + + diff --git a/p/themes/BlueLagoon/icons/bookmark.svg b/p/themes/BlueLagoon/icons/bookmark.svg new file mode 100644 index 000000000..7f33d9753 --- /dev/null +++ b/p/themes/BlueLagoon/icons/bookmark.svg @@ -0,0 +1,5 @@ +<svg xmlns="http://www.w3.org/2000/svg"> +<g fill="#0062bf" transform="translate(-41.000202,-397)"> +<path style="color:#000000;enable-background:accumulate;" d="m530.95,186.71c-0.77941,0.55189-3.1576-1.906-4.1125-1.9179-0.95532-0.0119-3.3949,2.3858-4.161,1.8149-0.76573-0.57072,0.83698-3.592,0.55319-4.5039-0.2839-0.91223-3.3182-2.4915-3.0119-3.3965,0.30617-0.90461,3.6749-0.31399,4.4544-0.86567,0.77986-0.5519,1.3442-3.9257,2.2995-3.914,0.95494,0.0116,1.4342,3.398,2.1998,3.9689,0.76588,0.57114,4.1489,0.0653,4.4331,0.97746,0.28402,0.9118-2.7885,2.414-3.0949,3.3186-0.30652,0.90489,1.22,3.966,0.44027,4.5182z" fill-rule="nonzero" transform="matrix(1.0472113,-0.00871584,0.00871584,1.0472113,-504.35434,220.15425)" fill="#0062bf"/> +</g> +</svg> diff --git a/p/themes/BlueLagoon/icons/favicon-16-32-48-64.ico b/p/themes/BlueLagoon/icons/favicon-16-32-48-64.ico Binary files differnew file mode 100644 index 000000000..7c5eb5517 --- /dev/null +++ b/p/themes/BlueLagoon/icons/favicon-16-32-48-64.ico diff --git a/p/themes/BlueLagoon/icons/favicon-256.png b/p/themes/BlueLagoon/icons/favicon-256.png Binary files differnew file mode 100644 index 000000000..dbe4ec4b7 --- /dev/null +++ b/p/themes/BlueLagoon/icons/favicon-256.png diff --git a/p/themes/BlueLagoon/icons/favicon.svg b/p/themes/BlueLagoon/icons/favicon.svg new file mode 100644 index 000000000..1b6801a26 --- /dev/null +++ b/p/themes/BlueLagoon/icons/favicon.svg @@ -0,0 +1,32 @@ +<svg xmlns="http://www.w3.org/2000/svg"> +<defs> +<linearGradient id="linearGradient3802" y2="53.018" gradientUnits="userSpaceOnUse" x2="72.873" y1="14.64" x1="115.7"> +<stop stop-color="#0090ff" offset="0"/> +<stop stop-color="#0062be" offset="1"/> +</linearGradient> +</defs> +<g fill="#FFF" transform="matrix(1.7556028,0,0,1.7556028,2.4536682,156.92143)"> +<g transform="matrix(0.9774773,0,0,0.9774773,0.92631875,-74.208835)"> +<path d="m64.102-11.469,0,14.25c36.018,0.0418,65.198,29.235,65.218,65.259h15.189c-0.46275-43.994-36.228-79.509-80.332-79.509-0.02635,0-0.05196-0.000025-0.0783,0z"/> +<path d="m64.102,14.799,0,14.876c21.188,0.12639,38.346,17.217,38.639,38.365h15.581c-0.21-29.445-24.175-53.241-53.669-53.241-0.18468,0-0.36384-0.0019-0.54807,0z"/> +</g> +<g transform="translate(-4.1395349,-75.482558)"> +<path d="M61.077,4.2013c-32.069,3.4709-57.062,30.537-57.188,63.5h11.906c-0.001-0.13569,0-0.27032,0-0.40625,0-26.472,19.725-48.306,45.281-51.656v-11.437z"/> +<path d="m61.077,25.42c-20.105,3.4776-35.409,20.946-35.469,42.031h11.125c0.11711-14.724,10.509-27.002,24.344-30.062v-11.969z"/> +<path d="m68.171,50.108c-9.502,0-17.188,7.6855-17.188,17.188,0,9.502,7.6855,17.219,17.188,17.219,9.502,0,17.219-7.7167,17.219-17.219,0-9.502-7.7167-17.188-17.219-17.188z"/> +<path d="m98.14,74.17c-2.9607,13.954-15.281,24.445-30.094,24.562v11.656c0.12455,0.001,0.2502,0,0.375,0,21.41,0,39.173-15.697,42.344-36.219h-12.625z"/> +<path d="m119.58,74.17c-3.3587,25.459-25.062,45.157-51.406,45.281v12.656c33.284-0.0636,60.6-25.457,63.719-57.938h-12.312z"/> +</g> +</g> +<g fill="url(#linearGradient3802)" transform="matrix(1.7160619,0,0,1.7160619,5.3998589,23.251436)"> +<path d="m64.102-11.469,0,14.25c36.018,0.0418,65.198,29.235,65.218,65.259h15.189c-0.46275-43.994-36.228-79.509-80.332-79.509-0.02635,0-0.05196-0.000025-0.0783,0z"/> +<path d="m64.102,14.799,0,14.876c21.188,0.12639,38.346,17.217,38.639,38.365h15.581c-0.21-29.445-24.175-53.241-53.669-53.241-0.18468,0-0.36384-0.0019-0.54807,0z"/> +</g> +<g fill="#222" transform="matrix(1.7556028,0,0,1.7556028,-3.4937681,21.015289)"> +<path d="M61.077,4.2013c-32.069,3.4709-57.062,30.537-57.188,63.5h11.906c-0.001-0.13569,0-0.27032,0-0.40625,0-26.472,19.725-48.306,45.281-51.656v-11.437z"/> +<path d="m61.077,25.42c-20.105,3.4776-35.409,20.946-35.469,42.031h11.125c0.11711-14.724,10.509-27.002,24.344-30.062v-11.969z"/> +<path d="m68.171,50.108c-9.502,0-17.188,7.6855-17.188,17.188,0,9.502,7.6855,17.219,17.188,17.219,9.502,0,17.219-7.7167,17.219-17.219,0-9.502-7.7167-17.188-17.219-17.188z"/> +<path d="m98.14,74.17c-2.9607,13.954-15.281,24.445-30.094,24.562v11.656c0.12455,0.001,0.2502,0,0.375,0,21.41,0,39.173-15.697,42.344-36.219h-12.625z"/> +<path d="m119.58,74.17c-3.3587,25.459-25.062,45.157-51.406,45.281v12.656c33.284-0.0636,60.6-25.457,63.719-57.938h-12.312z"/> +</g> +</svg> diff --git a/p/themes/BlueLagoon/icons/icon.svg b/p/themes/BlueLagoon/icons/icon.svg new file mode 100644 index 000000000..8abfea179 --- /dev/null +++ b/p/themes/BlueLagoon/icons/icon.svg @@ -0,0 +1,34 @@ +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<defs> +<linearGradient id="linearGradient3796"> +<stop stop-color="#0090ff" offset="0"/> +<stop stop-color="#0062be" offset="1"/> +</linearGradient> +<linearGradient id="linearGradient3802" y2="53.018" xlink:href="#linearGradient3796" gradientUnits="userSpaceOnUse" x2="72.873" y1="14.64" x1="115.7"/> +</defs> +<g fill="#FFF" transform="matrix(0.41471269,0,0,0.41471269,0.4367596,36.849335)"> +<g transform="matrix(0.9774773,0,0,0.9774773,0.92631875,-74.208835)"> +<path d="m64.102-11.469,0,14.25c36.018,0.0418,65.198,29.235,65.218,65.259h15.189c-0.46275-43.994-36.228-79.509-80.332-79.509-0.02635,0-0.05196-0.000025-0.0783,0z"/> +<path d="m64.102,14.799,0,14.876c21.188,0.12639,38.346,17.217,38.639,38.365h15.581c-0.21-29.445-24.175-53.241-53.669-53.241-0.18468,0-0.36384-0.0019-0.54807,0z"/> +</g> +<g transform="translate(-4.1395349,-75.482558)"> +<path d="M61.077,4.2013c-32.069,3.4709-57.062,30.537-57.188,63.5h11.906c-0.001-0.13569,0-0.27032,0-0.40625,0-26.472,19.725-48.306,45.281-51.656v-11.437z"/> +<path d="m61.077,25.42c-20.105,3.4776-35.409,20.946-35.469,42.031h11.125c0.11711-14.724,10.509-27.002,24.344-30.062v-11.969z"/> +<path d="m68.171,50.108c-9.502,0-17.188,7.6855-17.188,17.188,0,9.502,7.6855,17.219,17.188,17.219,9.502,0,17.219-7.7167,17.219-17.219,0-9.502-7.7167-17.188-17.219-17.188z"/> +<path d="m98.14,74.17c-2.9607,13.954-15.281,24.445-30.094,24.562v11.656c0.12455,0.001,0.2502,0,0.375,0,21.41,0,39.173-15.697,42.344-36.219h-12.625z"/> +<path d="m119.58,74.17c-3.3587,25.459-25.062,45.157-51.406,45.281v12.656c33.284-0.0636,60.6-25.457,63.719-57.938h-12.312z"/> +</g> +</g> +<g fill="url(#linearGradient3802)" transform="matrix(0.40537224,0,0,0.40537224,1.1327158,5.273491)"> +<path d="m64.102-11.469,0,14.25c36.018,0.0418,65.198,29.235,65.218,65.259h15.189c-0.46275-43.994-36.228-79.509-80.332-79.509-0.02635,0-0.05196-0.000025-0.0783,0z"/> +<path d="m64.102,14.799,0,14.876c21.188,0.12639,38.346,17.217,38.639,38.365h15.581c-0.21-29.445-24.175-53.241-53.669-53.241-0.18468,0-0.36384-0.0019-0.54807,0z"/> +</g> +<g fill="#222" transform="matrix(0.41471269,0,0,0.41471269,-0.96815804,4.7452623)"> +<path d="M61.077,4.2013c-32.069,3.4709-57.062,30.537-57.188,63.5h11.906c-0.001-0.13569,0-0.27032,0-0.40625,0-26.472,19.725-48.306,45.281-51.656v-11.437z"/> +<path d="m61.077,25.42c-20.105,3.4776-35.409,20.946-35.469,42.031h11.125c0.11711-14.724,10.509-27.002,24.344-30.062v-11.969z"/> +<path d="m68.171,50.108c-9.502,0-17.188,7.6855-17.188,17.188,0,9.502,7.6855,17.219,17.188,17.219,9.502,0,17.219-7.7167,17.219-17.219,0-9.502-7.7167-17.188-17.219-17.188z"/> +<path d="m98.14,74.17c-2.9607,13.954-15.281,24.445-30.094,24.562v11.656c0.12455,0.001,0.2502,0,0.375,0,21.41,0,39.173-15.697,42.344-36.219h-12.625z"/> +<path d="m119.58,74.17c-3.3587,25.459-25.062,45.157-51.406,45.281v12.656c33.284-0.0636,60.6-25.457,63.719-57.938h-12.312z"/> +</g> +</svg> diff --git a/p/themes/BlueLagoon/icons/non-starred.svg b/p/themes/BlueLagoon/icons/non-starred.svg new file mode 100644 index 000000000..d5c1f5ee0 --- /dev/null +++ b/p/themes/BlueLagoon/icons/non-starred.svg @@ -0,0 +1,5 @@ +<svg xmlns="http://www.w3.org/2000/svg"> +<g fill="#666" transform="translate(-61.000202,-397)"> +<path style="direction:ltr;baseline-shift:baseline;block-progression:tb;text-indent:0;color:#000000;enable-background:accumulate;text-transform:none;text-align:start;" d="m69.003,398.01c-0.2659-0.00099-0.49859,0.1006-0.6647,0.2393-0.16611,0.13869-0.27742,0.32137-0.38968,0.50028-0.22453,0.35782-0.39269,0.76873-0.56546,1.2036-0.17277,0.43483-0.34713,0.88766-0.5046,1.2323-0.15747,0.34465-0.3456,0.57871-0.35862,0.58776-0.01287,0.009-0.30722,0.117-0.69576,0.15181-0.38855,0.0348-0.88122,0.0492-1.3632,0.0694-0.48202,0.0202-0.9703,0.0362-1.393,0.12817-0.21138,0.046-0.4154,0.10148-0.60434,0.20956s-0.36689,0.28631-0.45004,0.53002-0.04901,0.50627,0.03636,0.70157c0.08537,0.19531,0.22656,0.36514,0.3682,0.52344,0.2833,0.31663,0.6327,0.60557,1.0079,0.89849s0.77671,0.55926,1.0678,0.81027c0.29104,0.25101,0.45422,0.50796,0.45912,0.52271,0.0048,0.0146,0.03119,0.33498-0.05456,0.70231-0.08575,0.36732-0.2238,0.81174-0.35282,1.2603-0.12902,0.44861-0.25176,0.90196-0.2917,1.3184-0.01997,0.20819-0.04285,0.40729,0.0053,0.61409,0.04814,0.20679,0.1845,0.43007,0.39902,0.58168,0.21451,0.15161,0.44936,0.1881,0.66823,0.1701s0.43535-0.0703,0.63515-0.15132c0.39961-0.16214,0.80177-0.42851,1.2064-0.68231,0.40465-0.2538,0.80822-0.52155,1.1456-0.71107,0.33734-0.18952,0.6484-0.2686,0.66445-0.26854,0.01586,0.00006,0.30338,0.0951,0.63894,0.28732,0.33556,0.19221,0.72532,0.46503,1.1276,0.72205,0.40229,0.25702,0.81996,0.49752,1.218,0.66284,0.19903,0.0827,0.38893,0.15086,0.60762,0.17059,0.2187,0.0197,0.47978-0.031,0.69551-0.18105,0.21572-0.15001,0.33928-0.35235,0.38918-0.55877s0.04291-0.43517,0.02476-0.64358c-0.03632-0.41683-0.15899-0.86394-0.2841-1.3137-0.12511-0.44978-0.26165-0.88661-0.34421-1.2548-0.08256-0.36813-0.07169-0.68662-0.06666-0.70133,0.005-0.0145,0.18746-0.25247,0.4806-0.50101,0.29313-0.24854,0.67599-0.53755,1.0536-0.82731,0.37764-0.28976,0.76716-0.57158,1.0531-0.88579,0.14298-0.1571,0.2418-0.33444,0.32882-0.52904s0.136-0.42874,0.05481-0.67306-0.27108-0.41314-0.45912-0.52272-0.36679-0.18158-0.57782-0.22931c-0.42206-0.0955-0.91359-0.14009-1.3956-0.16426-0.48198-0.0242-0.94584-0.039-1.3342-0.077s-0.71565-0.13122-0.72859-0.14037c-0.01279-0.009-0.18402-0.23636-0.3384-0.58217s-0.32658-0.78819-0.49548-1.2243c-0.1689-0.4361-0.33477-0.86429-0.55609-1.2238-0.11067-0.17977-0.23335-0.35397-0.39826-0.49396s-0.40309-0.25684-0.66899-0.25783zm0.0086,0.99424c0.0422,0.0358,0.10671,0.13602,0.1841,0.26173,0.15477,0.25141,0.33068,0.6272,0.49397,1.0488,0.16329,0.42163,0.31905,0.88645,0.49598,1.2828,0.17693,0.39633,0.31456,0.73379,0.6753,0.98889,0.36072,0.25509,0.77019,0.29763,1.2152,0.34118,0.44506,0.0435,0.92882,0.0532,1.3948,0.0765,0.46599,0.0234,0.91824,0.0697,1.2135,0.13647,0.14763,0.0334,0.25558,0.0572,0.30381,0.0853-0.02227,0.0498-0.07958,0.15478-0.17956,0.26464-0.19997,0.21973-0.53749,0.48746-0.90261,0.7676-0.36511,0.28015-0.77804,0.57219-1.114,0.85704-0.33595,0.28485-0.63992,0.53221-0.77987,0.94209-0.13995,0.40986-0.05396,0.77681,0.04065,1.1987s0.25406,0.87813,0.37502,1.313c0.12096,0.43486,0.22688,0.84692,0.25228,1.1385,0.01156,0.13264-0.01699,0.23485-0.02778,0.29267-0.05993-0.008-0.1764-0.0324-0.30381-0.0853-0.27836-0.11561-0.64649-0.32808-1.0354-0.57657-0.38894-0.24849-0.8039-0.53053-1.1885-0.75081-0.38457-0.22028-0.70791-0.39837-1.1551-0.40015-0.44722-0.002-0.79205,0.17245-1.1786,0.38965-0.38659,0.21719-0.78438,0.49517-1.1756,0.74055-0.39123,0.24538-0.77636,0.4507-1.0559,0.56412-0.13977,0.0567-0.24616,0.0856-0.3023,0.0902-0.01026-0.0578-0.01522-0.16008-0.0025-0.29243,0.02793-0.29118,0.13818-0.70893,0.26291-1.1426,0.12473-0.43372,0.25404-0.89785,0.35232-1.3188,0.09828-0.42099,0.18672-0.78846,0.05027-1.1994-0.13644-0.41097-0.43218-0.64202-0.76571-0.92967-0.33353-0.28766-0.70551-0.58555-1.0683-0.86876-0.36275-0.2832-0.7178-0.56075-0.91597-0.78224-0.09908-0.11075-0.16221-0.21163-0.1841-0.26173,0.04834-0.0276,0.15448-0.058,0.3023-0.0902,0.29562-0.0643,0.74518-0.10714,1.2112-0.1267,0.46603-0.0196,0.94824-0.0298,1.3935-0.0697,0.44531-0.0399,0.84679-0.0499,1.2097-0.30216,0.36289-0.25221,0.5383-0.60511,0.71876-1.0001,0.18046-0.39497,0.33731-0.84115,0.50435-1.2616,0.16704-0.42041,0.31848-0.83556,0.47556-1.0859,0.07853-0.12515,0.16751-0.20007,0.21012-0.23565z" fill="#666"/> +</g> +</svg> diff --git a/p/themes/BlueLagoon/icons/read.svg b/p/themes/BlueLagoon/icons/read.svg new file mode 100644 index 000000000..269b75738 --- /dev/null +++ b/p/themes/BlueLagoon/icons/read.svg @@ -0,0 +1,4 @@ +<svg xmlns="http://www.w3.org/2000/svg"> +<path fill="#666" d="M7.9688,3.5312c-3.434,0-6.3812,1.9854-7.8438,4.9063,0.69719,1.3923,1.7293,2.5805,3,3.4375l1.0625-1.063c-0.0318-0.019-0.0622-0.042-0.0937-0.062-0.9251-0.59-1.6925-1.3818-2.2813-2.3125,0.5888-0.9307,1.3562-1.7225,2.2813-2.3125,0.0602-0.0384,0.1262-0.0572,0.1874-0.0938-0.1531,0.4203-0.25,0.8706-0.25,1.3438,0,0.9994,0.3864,1.8995,1,2.5938l1.6563-1.6563c-0.0596,0.0073-0.126,0.0313-0.1875,0.0313-0.8153,0-1.4688-0.6535-1.4688-1.4688s0.6535-1.4688,1.4688-1.4688,1.4688,0.6535,1.4688,1.4688c0,0.0615-0.024,0.1279-0.0313,0.1875l3.0005-3c-0.926-0.3356-1.9313-0.5313-2.9692-0.5313zm5.9692,2.3438l-1.063,1.0625c0.486,0.4467,0.925,0.9377,1.281,1.5-0.589,0.9306-1.356,1.7225-2.281,2.3125-1.162,0.741-2.5291,1.156-3.9062,1.156h-0.0626l-1.3437,1.344c0.4628,0.076,0.9224,0.125,1.4063,0.125,3.4342,0,6.4122-2.017,7.8752-4.9375-0.486-0.9691-1.127-1.8356-1.906-2.5625zm-2.063,2.0625l-3.3125,3.3125c1.7095-0.254,3.0625-1.6016,3.3125-3.3125z"/> +<path d="M2.4921,13.891,13.301,3.0128,15.437,2.9605,4.3409,13.891z" fill="#666"/> +</svg> diff --git a/p/themes/BlueLagoon/icons/starred.svg b/p/themes/BlueLagoon/icons/starred.svg new file mode 100644 index 000000000..10a16f04a --- /dev/null +++ b/p/themes/BlueLagoon/icons/starred.svg @@ -0,0 +1,5 @@ +<svg xmlns="http://www.w3.org/2000/svg"> +<g transform="translate(-41.000202,-397)"> +<path style="color:#000000;enable-background:accumulate;" d="m530.95,186.71c-0.77941,0.55189-3.1576-1.906-4.1125-1.9179-0.95532-0.0119-3.3949,2.3858-4.161,1.8149-0.76573-0.57072,0.83698-3.592,0.55319-4.5039-0.2839-0.91223-3.3182-2.4915-3.0119-3.3965,0.30617-0.90461,3.6749-0.31399,4.4544-0.86567,0.77986-0.5519,1.3442-3.9257,2.2995-3.914,0.95494,0.0116,1.4342,3.398,2.1998,3.9689,0.76588,0.57114,4.1489,0.0653,4.4331,0.97746,0.28402,0.9118-2.7885,2.414-3.0949,3.3186-0.30652,0.90489,1.22,3.966,0.44027,4.5182z" fill-rule="nonzero" transform="matrix(1.0472113,-0.00871584,0.00871584,1.0472113,-504.35434,220.15425)" fill="#0062bf"/> +</g> +</svg> diff --git a/p/themes/BlueLagoon/icons/unread.svg b/p/themes/BlueLagoon/icons/unread.svg new file mode 100644 index 000000000..bd39d683a --- /dev/null +++ b/p/themes/BlueLagoon/icons/unread.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg"> +<path fill="#666" d="m7.9824,3.529c-3.4339,0-6.4103,1.9996-7.8729,4.9206,1.4626,2.9214,4.439,4.9204,7.8729,4.9204,3.4338,0,6.4102-1.9996,7.8729-4.9206-1.462-2.9207-4.439-4.9204-7.8726-4.9204zm3.8819,2.6095c0.9251,0.59007,1.709,1.3804,2.2978,2.3111-0.58881,0.93063-1.3727,1.721-2.2978,2.3111-1.1624,0.7414-2.5047,1.1333-3.8818,1.1333s-2.7195-0.39189-3.8819-1.1333c-0.9248-0.59-1.7087-1.3807-2.2975-2.3114,0.5888-0.9307,1.3727-1.721,2.2978-2.3111,0.0602-0.0384,0.1211-0.0757,0.1823-0.1122-0.15312,0.42021-0.23692,0.87374-0.23692,1.3469,0,2.174,1.7624,3.9364,3.9365,3.9364,2.174,0,3.9365-1.7624,3.9365-3.9364,0-0.4732-0.0838-0.92673-0.23692-1.347,0.0612,0.036566,0.12206,0.073839,0.18234,0.11228zm-3.8816,0.7427c0,0.81528-0.66089,1.4762-1.4762,1.4762-0.81528,0-1.4762-0.66089-1.4762-1.4762,0-0.81528,0.66089-1.4762,1.4762-1.4762,0.81527,0,1.4762,0.66089,1.4762,1.4762z"/> +</svg> diff --git a/p/themes/BlueLagoon/loader.gif b/p/themes/BlueLagoon/loader.gif Binary files differnew file mode 100644 index 000000000..a0839dcc7 --- /dev/null +++ b/p/themes/BlueLagoon/loader.gif diff --git a/p/themes/BlueLagoon/metadata.json b/p/themes/BlueLagoon/metadata.json new file mode 100644 index 000000000..2c415a613 --- /dev/null +++ b/p/themes/BlueLagoon/metadata.json @@ -0,0 +1,7 @@ +{ + "name": "Blue Lagoon", + "author": "Mister aiR", + "description": "C'est un cocktail (bis)! C'est la version plus fresh de Screwdriver. C'est... c'est... un thème pour l'agrégateur de flux RSS FreshRSS. En toute modestie, ce thème tue du Nyan Cat.", + "version": 1.0, + "files": ["_template.css","BlueLagoon.css"] +} diff --git a/p/themes/BlueLagoon/template.css b/p/themes/BlueLagoon/template.css new file mode 100644 index 000000000..bf421e322 --- /dev/null +++ b/p/themes/BlueLagoon/template.css @@ -0,0 +1,695 @@ +@charset "UTF-8"; + +/*=== GENERAL */ +/*============*/ +html, body { + margin: 0; + padding: 0; + font-size: 92%; +} + +/*=== Links */ +a { + text-decoration: none; +} +a:hover { + text-decoration: underline; +} + +/*=== Lists */ +ul, ol, dd { + margin: 0; + padding: 0; +} + +/*=== Titles */ +h1 { + margin: 0.6em 0 0.3em; + font-size: 1.5em; + line-height: 1.6em; +} +h2 { + margin: 0.5em 0 0.25em; + font-size: 1.3em; + line-height: 2em; +} +h3 { + margin: 0.5em 0 0.25em; + font-size: 1.1em; + line-height: 2em; +} + +/*=== Paragraphs */ +p { + margin: 1em 0 0.5em; + font-size: 1em; +} + +/*=== Images */ +img { + height: auto; + max-width: 100%; +} +img.favicon { + height: 16px; + width: 16px; + vertical-align: middle; +} + +/*=== Videos */ +iframe, embed, object, video { + max-width: 100%; +} + +/*=== Forms */ +legend { + display: block; + width: 100%; + clear: both; +} +label { + display: block; +} +input { + width: 180px; +} +textarea { + width: 300px; +} +input, select, textarea { + display: inline-block; + max-width: 100%; +} +input[type="radio"], +input[type="checkbox"] { + width: 15px !important; + min-height: 15px !important; +} +input.extend:focus { + width: 300px; +} + +/*=== COMPONENTS */ +/*===============*/ +/*=== Forms */ +.form-group:after { + content: ""; + display: block; + clear: both; +} +.form-group.form-actions { + min-width: 250px; +} +.form-group .group-name { + display: block; + float: left; + width: 200px; +} +.form-group .group-controls { + min-width: 250px; + margin: 0 0 0 220px; +} +.form-group .group-controls .control { + display: block; +} + +/*=== Buttons */ +.stick { + display: inline-block; + white-space: nowrap; +} +.btn, +a.btn { + display: inline-block; + cursor: pointer; + overflow: hidden; +} +.btn-important { + font-weight: bold; +} + +/*=== Navigation */ +.nav-list .nav-header, +.nav-list .item { + display: block; +} +.nav-list .item, +.nav-list .item > a { + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.nav-head { + display: block; +} +.nav-head .item { + display: inline-block; +} + +/*=== Horizontal-list */ +.horizontal-list { + display: table; + table-layout: fixed; + width: 100%; +} +.horizontal-list .item { + display: table-cell; +} + +/*=== Dropdown */ +.dropdown { + position: relative; + display: inline-block; +} +.dropdown-target { + display: none; +} +.dropdown-menu { + display: none; + min-width: 200px; + margin: 0; + position: absolute; + right: 0; + background: #fff; + border: 1px solid #aaa; +} +.dropdown-header { + display: block; +} +.dropdown-menu > .item { + display: block; +} +.dropdown-menu > .item > a, +.dropdown-menu > .item > span { + display: block; +} +.dropdown-menu > .item[aria-checked="true"] > a:before { + content: '✓'; +} +.dropdown-menu .input { + display: block; +} +.dropdown-menu .input select, +.dropdown-menu .input input { + display: block; + max-width: 95%; +} +.dropdown-target:target ~ .dropdown-menu { + display: block; + z-index: 10; +} +.dropdown-close { + display: inline; +} +.dropdown-close a { + font-size: 0; + position: fixed; + top: 0; bottom: 0; + left: 0; right: 0; + display: block; + z-index: -10; +} +.separator { + display: block; + height: 0; + border-bottom: 1px solid #aaa; +} + +/*=== Alerts */ +.alert { + display: block; + width: 90%; +} +.group-controls .alert { + width: 100% +} +.alert-head { + margin: 0; + font-weight: bold; +} +.alert ul { + margin: 5px 20px; +} + +/*=== Icons */ +.icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + line-height: 16px; +} + +/*=== Pagination */ +.pagination { + display: table; + width: 100%; + margin: 0; + padding: 0; + table-layout: fixed; +} +.pagination .item { + display: table-cell; +} +.pagination .pager-first, +.pagination .pager-previous, +.pagination .pager-next, +.pagination .pager-last { + width: 100px; +} + +/*=== STRUCTURE */ +/*===============*/ +/*=== Header */ +.header { + display: table; + width: 100%; + table-layout: fixed; +} +.header > .item { + display: table-cell; +} +.header > .item.title { + width: 250px; + white-space: nowrap; +} +.header > .item.title h1 { + display: inline-block; +} +.header > .item.title .logo { + display: inline-block; + height: 32px; + width: 32px; + vertical-align: middle; +} +.header > .item.configure { + width: 100px; +} + +/*=== Body */ +#global { + display: table; + width: 100%; + height: 100%; + table-layout: fixed; +} +.aside { + display: table-cell; + height: 100%; + width: 250px; + vertical-align: top; +} +.aside.aside_flux { + background: #fff; +} + +/*=== Aside main page (categories) */ +.categories { + list-style: none; + margin: 0; +} +.category { + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.category .btn:not([data-unread="0"]):after { + content: attr(data-unread); +} + +/*=== Aside main page (feeds) */ +.categories .feeds { + width: 100%; + list-style: none; +} +.categories .feeds:not(.active) { + display: none; +} +.categories .feeds .feed { + display: inline-block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + vertical-align: middle; +} +.categories .feeds .feed:not([data-unread="0"]):before { + content: "(" attr(data-unread) ") "; +} +.categories .feeds .dropdown-menu { + left: 0; +} +.categories .feeds .item .dropdown-toggle > .icon { + visibility: hidden; + cursor: pointer; + vertical-align: top; +} +.categories .feeds .item .dropdown-target:target ~ .dropdown-toggle > .icon, +.categories .feeds .item:hover .dropdown-toggle > .icon, +.categories .feeds .item.active .dropdown-toggle > .icon { + visibility: visible; +} + +/*=== New article notification */ +#new-article { + display: none; +} +#new-article > a { + display: block; +} + +/*=== Day indication */ +.day .name { + position: absolute; + right: 0; + width: 50%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +/*=== Feed article header and footer */ +.flux_header { + position: relative; +} +.flux .item { + line-height: 40px; + white-space: nowrap; +} +.flux .item.manage, +.flux .item.link { + width: 40px; + text-align: center; +} +.flux .item.website { + width: 200px; +} +.flux.not_read .item.title, +.flux.current .item.title { + font-weight: bold; +} +.flux:not(.current):hover .item.title { + position: absolute; + max-width: calc(100% - 320px); + background: #fff; +} +.flux .item.title a { + color: #000; + text-decoration: none; +} +.flux .item.date { + width: 145px; + text-align: right; +} +.flux .item > a { + display: block; +} +.flux .item > a { + display: block; + text-decoration: none; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.flux .item.share > a { + display: list-item; + list-style-position: inside; + list-style-type: decimal; +} + +/*=== Feed article content */ +.hide_posts > .flux:not(.active) > .flux_content { + display: none; +} +.content { + min-height: 20em; + margin: auto; + line-height: 1.7em; + word-wrap: break-word; +} +.content.large { + max-width: 1000px; +} +.content.medium { + max-width: 800px; +} +.content.thin { + max-width: 550px; +} +.content ul, +.content ol, +.content dd { + margin: 0 0 0 15px; + padding: 0 0 5px 15px; +} +.content pre { + overflow: auto; +} + +/*=== Notification and actualize notification */ +.notification { + position: absolute; + top: 1em; + left: 25%; right: 25%; + z-index: 10; + background: #fff; + border: 1px solid #aaa; +} +.notification.closed { + display: none; +} +.notification a.close { + position: absolute; + top: 0; bottom: 0; + right: 0; + display: inline-block; +} + +#actualizeProgress { + position: fixed; +} +#actualizeProgress progress { + max-width: 100%; + vertical-align: middle; +} +#actualizeProgress .progress { + vertical-align: middle; +} + +/*=== Navigation menu (for articles) */ +#nav_entries { + position: fixed; + bottom: 0; left: 0; + display: table; + width: 250px; + background: #fff; + table-layout: fixed; +} +#nav_entries .item { + display: table-cell; + width: 30%; +} +#nav_entries a { + display: block; +} + +/*=== "Load more" part */ +#load_more { + min-height: 40px; +} +.loading { + background: url("loader.gif") center center no-repeat; + font-size: 0; +} +#bigMarkAsRead { + display: block; + padding: 3em 0; + text-align: center; +} +.bigTick { + font-size: 7em; + line-height: 1.6em; +} + +/*=== Statistiques */ +.stat > table { + width: 100%; +} + +/*=== GLOBAL VIEW */ +/*================*/ +/*=== Category boxes */ +#stream.global .box-category { + display: inline-block; + width: 19em; + max-width: 95%; + margin: 20px 10px; + border: 1px solid #ccc; + vertical-align: top; +} +#stream.global .category { + width: 100%; +} +#stream.global .btn { + display: block; +} +#stream.global .box-category .feeds { + display: block; + overflow: auto; +} +#stream.global .box-category .feed { + width: 19em; + max-width: 90%; +} + +/*=== Panel */ +#overlay { + display: none; + position: fixed; + top: 0; bottom: 0; + left: 0; right: 0; + background: rgba(0, 0, 0, 0.9); +} +#panel { + display: none; + position: fixed; + top: 1em; bottom: 1em; + left: 2em; right: 2em; + overflow: auto; + background: #fff; +} +#panel .close { + position: fixed; + top: 0; bottom: 0; + left: 0; right: 0; + display: block; +} +#panel .close img { + display: none; +} + +/*=== DIVERS */ +/*===========*/ +.nav-login, +.nav_menu .search, +.nav_menu .toggle_aside { + display: none; +} + +.aside .toggle_aside { + position: absolute; + right: 0; + display: none; + width: 30px; + height: 30px; + line-height: 30px; + text-align: center; +} + +/*=== MOBILE */ +/*===========*/ +@media(max-width: 840px) { + .header, + .aside .btn-important, + .aside .feeds .dropdown, + .flux_header .item.website span, + .item.date, .day .date, + .dropdown-menu > .no-mobile, + .no-mobile { + display: none; + } + .nav-login { + display: block; + } + .nav_menu .toggle_aside, + .aside .toggle_aside, + .nav_menu .search, + #panel .close img { + display: inline-block; + } + + .aside { + position: fixed; + top: 0; bottom: 0; + left: 0; + width: 0; + overflow: hidden; + z-index: 100; + } + .aside:target { + width: 90%; + overflow: auto; + } + .aside .categories { + margin: 10px 0 75px; + } + + .flux_header .item.website { + width: 40px; + } + + .flux:not(.current):hover .item.title { + position: relative; + width: auto; + white-space: nowrap; + } + + .notification { + top: 0; + left: 0; + right: 0; + } + + #nav_entries { + width: 100%; + } + + #stream.global .box-category { + margin: 10px 0; + } + + #panel { + top: 0; bottom: 0; + left: 0; right: 0; + } + #panel .close { + top: 0; right: 0; + left: auto; bottom: auto; + display: inline-block; + width: 30px; + height: 30px; + } +} + +/*=== PRINTER */ +/*============*/ +@media print { + .header, .aside, + .nav_menu, .day, + .flux_header, + .flux_content .bottom, + .pagination, + #nav_entries { + display: none; + } + html, body { + background: #fff; + color: #000; + font-family: Serif; + } + #global, + .flux_content { + display: block !important; + } + .flux_content .content { + width: 100% !important; + } + .flux_content .content a { + color: #000; + } + .flux_content .content a:after { + content: " [" attr(href) "] "; + font-style: italic; + } +} diff --git a/p/themes/BlueLagoon/thumbs/original.png b/p/themes/BlueLagoon/thumbs/original.png Binary files differnew file mode 100644 index 000000000..bb8695945 --- /dev/null +++ b/p/themes/BlueLagoon/thumbs/original.png diff --git a/p/themes/Dark/dark.css b/p/themes/Dark/dark.css index 03bf3c985..909444d43 100644 --- a/p/themes/Dark/dark.css +++ b/p/themes/Dark/dark.css @@ -561,7 +561,6 @@ a.btn { font-size: 0.9rem; line-height: 1.5rem; background: inherit; - border-left: 1px solid #666; } /*=== Aside main page (feeds) */ diff --git a/p/themes/Dark/thumbs/original.png b/p/themes/Dark/thumbs/original.png Binary files differnew file mode 100644 index 000000000..fd574319f --- /dev/null +++ b/p/themes/Dark/thumbs/original.png diff --git a/p/themes/Flat/thumbs/original.png b/p/themes/Flat/thumbs/original.png Binary files differnew file mode 100644 index 000000000..b9cafa9c8 --- /dev/null +++ b/p/themes/Flat/thumbs/original.png diff --git a/p/themes/Origine/origine.css b/p/themes/Origine/origine.css index afd6ec04f..eb2ecd5e8 100644 --- a/p/themes/Origine/origine.css +++ b/p/themes/Origine/origine.css @@ -601,7 +601,6 @@ a.btn { font-size: 0.9rem; line-height: 1.5rem; background: inherit; - border-left: 1px solid #aaa; } /*=== Aside main page (feeds) */ diff --git a/p/themes/Origine/thumbs/original.png b/p/themes/Origine/thumbs/original.png Binary files differnew file mode 100644 index 000000000..d26d4fbed --- /dev/null +++ b/p/themes/Origine/thumbs/original.png diff --git a/p/themes/Pafat/thumbs/original.png b/p/themes/Pafat/thumbs/original.png Binary files differnew file mode 100644 index 000000000..fe05f7260 --- /dev/null +++ b/p/themes/Pafat/thumbs/original.png diff --git a/p/themes/Screwdriver/icons/favicon-16-32-48-64.ico b/p/themes/Screwdriver/icons/favicon-16-32-48-64.ico Binary files differnew file mode 100644 index 000000000..7c5eb5517 --- /dev/null +++ b/p/themes/Screwdriver/icons/favicon-16-32-48-64.ico diff --git a/p/themes/Screwdriver/icons/favicon-256.png b/p/themes/Screwdriver/icons/favicon-256.png Binary files differnew file mode 100644 index 000000000..235b18c97 --- /dev/null +++ b/p/themes/Screwdriver/icons/favicon-256.png diff --git a/p/themes/Screwdriver/icons/favicon.svg b/p/themes/Screwdriver/icons/favicon.svg new file mode 100644 index 000000000..895a727bb --- /dev/null +++ b/p/themes/Screwdriver/icons/favicon.svg @@ -0,0 +1,34 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<defs> +<linearGradient id="linearGradient4149"> +<stop stop-color="#d18114" offset="0"/> +<stop stop-color="#ed9514" offset="1"/> +</linearGradient> +<linearGradient id="linearGradient4155" y2="28.285" xlink:href="#linearGradient4149" gradientUnits="userSpaceOnUse" x2="144.51" y1="28.285" x1="64.102"/> +<linearGradient id="linearGradient4159" y2="-11.652" xlink:href="#linearGradient4149" gradientUnits="userSpaceOnUse" x2="126.84" y1="69.532" x1="64.102"/> +</defs> +<g fill="#FFF" transform="matrix(1.7556028,0,0,1.7556028,2.4536682,156.92143)"> +<g transform="matrix(0.9774773,0,0,0.9774773,0.92631875,-74.208835)"> +<path d="m64.102-11.469,0,14.25c36.018,0.0418,65.198,29.235,65.218,65.259h15.189c-0.46275-43.994-36.228-79.509-80.332-79.509-0.02635,0-0.05196-0.000025-0.0783,0z"/> +<path d="m64.102,14.799,0,14.876c21.188,0.12639,38.346,17.217,38.639,38.365h15.581c-0.21-29.445-24.175-53.241-53.669-53.241-0.18468,0-0.36384-0.0019-0.54807,0z"/> +</g> +<g transform="translate(-4.1395349,-75.482558)"> +<path d="M61.077,4.2013c-32.069,3.4709-57.062,30.537-57.188,63.5h11.906c-0.001-0.13569,0-0.27032,0-0.40625,0-26.472,19.725-48.306,45.281-51.656v-11.437z"/> +<path d="m61.077,25.42c-20.105,3.4776-35.409,20.946-35.469,42.031h11.125c0.11711-14.724,10.509-27.002,24.344-30.062v-11.969z"/> +<path d="m68.171,50.108c-9.502,0-17.188,7.6855-17.188,17.188,0,9.502,7.6855,17.219,17.188,17.219,9.502,0,17.219-7.7167,17.219-17.219,0-9.502-7.7167-17.188-17.219-17.188z"/> +<path d="m98.14,74.17c-2.9607,13.954-15.281,24.445-30.094,24.562v11.656c0.12455,0.001,0.2502,0,0.375,0,21.41,0,39.173-15.697,42.344-36.219h-12.625z"/> +<path d="m119.58,74.17c-3.3587,25.459-25.062,45.157-51.406,45.281v12.656c33.284-0.0636,60.6-25.457,63.719-57.938h-12.312z"/> +</g> +</g> +<g fill="url(#linearGradient4155)" transform="matrix(1.7160619,0,0,1.7160619,5.3998589,23.251436)"> +<path d="m64.102-11.469,0,14.25c36.018,0.0418,65.198,29.235,65.218,65.259h15.189c-0.46275-43.994-36.228-79.509-80.332-79.509-0.02635,0-0.05196-0.000025-0.0783,0z"/> +<path d="m64.102,14.799,0,14.876c21.188,0.12639,38.346,17.217,38.639,38.365h15.581c-0.21-29.445-24.175-53.241-53.669-53.241-0.18468,0-0.36384-0.0019-0.54807,0z"/> +</g> +<g fill="#222" transform="matrix(1.7556028,0,0,1.7556028,-3.4937681,21.015289)"> +<path d="M61.077,4.2013c-32.069,3.4709-57.062,30.537-57.188,63.5h11.906c-0.001-0.13569,0-0.27032,0-0.40625,0-26.472,19.725-48.306,45.281-51.656v-11.437z"/> +<path d="m61.077,25.42c-20.105,3.4776-35.409,20.946-35.469,42.031h11.125c0.11711-14.724,10.509-27.002,24.344-30.062v-11.969z"/> +<path d="m68.171,50.108c-9.502,0-17.188,7.6855-17.188,17.188,0,9.502,7.6855,17.219,17.188,17.219,9.502,0,17.219-7.7167,17.219-17.219,0-9.502-7.7167-17.188-17.219-17.188z"/> +<path d="m98.14,74.17c-2.9607,13.954-15.281,24.445-30.094,24.562v11.656c0.12455,0.001,0.2502,0,0.375,0,21.41,0,39.173-15.697,42.344-36.219h-12.625z"/> +<path d="m119.58,74.17c-3.3587,25.459-25.062,45.157-51.406,45.281v12.656c33.284-0.0636,60.6-25.457,63.719-57.938h-12.312z"/> +</g> +</svg> diff --git a/p/themes/Screwdriver/icons/icon.svg b/p/themes/Screwdriver/icons/icon.svg new file mode 100644 index 000000000..268814463 --- /dev/null +++ b/p/themes/Screwdriver/icons/icon.svg @@ -0,0 +1,34 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<defs> +<linearGradient id="linearGradient4149"> +<stop stop-color="#d18114" offset="0"/> +<stop stop-color="#ed9514" offset="1"/> +</linearGradient> +<linearGradient id="linearGradient4155" y2="28.285" xlink:href="#linearGradient4149" gradientUnits="userSpaceOnUse" x2="144.51" y1="28.285" x1="64.102"/> +<linearGradient id="linearGradient4159" y2="-11.652" xlink:href="#linearGradient4149" gradientUnits="userSpaceOnUse" x2="126.84" y1="69.532" x1="64.102"/> +</defs> +<g fill="#FFF" transform="matrix(0.40427237,0,0,0.40427237,0.65228897,36.70875)"> +<g transform="matrix(0.9774773,0,0,0.9774773,0.92631875,-74.208835)"> +<path d="m64.102-11.469,0,14.25c36.018,0.0418,65.198,29.235,65.218,65.259h15.189c-0.46275-43.994-36.228-79.509-80.332-79.509-0.02635,0-0.05196-0.000025-0.0783,0z"/> +<path d="m64.102,14.799,0,14.876c21.188,0.12639,38.346,17.217,38.639,38.365h15.581c-0.21-29.445-24.175-53.241-53.669-53.241-0.18468,0-0.36384-0.0019-0.54807,0z"/> +</g> +<g transform="translate(-4.1395349,-75.482558)"> +<path d="M61.077,4.2013c-32.069,3.4709-57.062,30.537-57.188,63.5h11.906c-0.001-0.13569,0-0.27032,0-0.40625,0-26.472,19.725-48.306,45.281-51.656v-11.437z"/> +<path d="m61.077,25.42c-20.105,3.4776-35.409,20.946-35.469,42.031h11.125c0.11711-14.724,10.509-27.002,24.344-30.062v-11.969z"/> +<path d="m68.171,50.108c-9.502,0-17.188,7.6855-17.188,17.188,0,9.502,7.6855,17.219,17.188,17.219,9.502,0,17.219-7.7167,17.219-17.219,0-9.502-7.7167-17.188-17.219-17.188z"/> +<path d="m98.14,74.17c-2.9607,13.954-15.281,24.445-30.094,24.562v11.656c0.12455,0.001,0.2502,0,0.375,0,21.41,0,39.173-15.697,42.344-36.219h-12.625z"/> +<path d="m119.58,74.17c-3.3587,25.459-25.062,45.157-51.406,45.281v12.656c33.284-0.0636,60.6-25.457,63.719-57.938h-12.312z"/> +</g> +</g> +<g fill="url(#linearGradient4155)" transform="matrix(0.39516706,0,0,0.39516706,1.3307246,5.9278164)"> +<path d="m64.102-11.469,0,14.25c36.018,0.0418,65.198,29.235,65.218,65.259h15.189c-0.46275-43.994-36.228-79.509-80.332-79.509-0.02635,0-0.05196-0.000025-0.0783,0z"/> +<path d="m64.102,14.799,0,14.876c21.188,0.12639,38.346,17.217,38.639,38.365h15.581c-0.21-29.445-24.175-53.241-53.669-53.241-0.18468,0-0.36384-0.0019-0.54807,0z"/> +</g> +<g fill="#222" transform="matrix(0.40427237,0,0,0.40427237,-0.71726009,5.4128854)"> +<path d="M61.077,4.2013c-32.069,3.4709-57.062,30.537-57.188,63.5h11.906c-0.001-0.13569,0-0.27032,0-0.40625,0-26.472,19.725-48.306,45.281-51.656v-11.437z"/> +<path d="m61.077,25.42c-20.105,3.4776-35.409,20.946-35.469,42.031h11.125c0.11711-14.724,10.509-27.002,24.344-30.062v-11.969z"/> +<path d="m68.171,50.108c-9.502,0-17.188,7.6855-17.188,17.188,0,9.502,7.6855,17.219,17.188,17.219,9.502,0,17.219-7.7167,17.219-17.219,0-9.502-7.7167-17.188-17.219-17.188z"/> +<path d="m98.14,74.17c-2.9607,13.954-15.281,24.445-30.094,24.562v11.656c0.12455,0.001,0.2502,0,0.375,0,21.41,0,39.173-15.697,42.344-36.219h-12.625z"/> +<path d="m119.58,74.17c-3.3587,25.459-25.062,45.157-51.406,45.281v12.656c33.284-0.0636,60.6-25.457,63.719-57.938h-12.312z"/> +</g> +</svg> diff --git a/p/themes/Screwdriver/screwdriver.css b/p/themes/Screwdriver/screwdriver.css index b6c2e670e..8dbd2ec34 100644 --- a/p/themes/Screwdriver/screwdriver.css +++ b/p/themes/Screwdriver/screwdriver.css @@ -52,7 +52,7 @@ input, select, textarea { color: #222; line-height: 25px; vertical-align: middle; - box-shadow: 0 2px 2px #eee inset, 0 1px #fff; + box-shadow: 0 1px 2px #ccc inset, 0 1px #fff; } option { padding: 0 .5em; @@ -121,30 +121,14 @@ form th { } /*=== Buttons */ -form#add_rss .stick input, .dropdown-menu select{ - background:#393939; - box-shadow: 0 2px 2px #171717 inset,0 1px rgba(255,255,255,0.08); - border-left:solid 1px #171717; - border-top:solid 1px #171717; - border-bottom:solid 1px #171717; - border-right:none; + +.dropdown-menu .input select, .dropdown-menu .input input { + background:#444; color:#fff; + box-shadow:0 2px 2px #222 inset, 0px 1px rgba(255, 255, 255, 0.08); + border:solid 1px #171717; } -form#add_rss .stick .btn{ - background:linear-gradient(180deg, #222 0%, #171717 100%) #171717; - background: -webkit-linear-gradient(top, #222 0%, #171717 100%); - box-shadow:0 1px rgba(255,255,255,0.08), 0px 1px rgba(255, 255, 255, 0.08) inset; - border-right:solid 1px #171717; - border-top:solid 1px #171717; - border-bottom:solid 1px #171717; - border-left:none; -} -form#add_rss .stick .btn.dropdown-toggle{ - border-right:solid 1px #171717; - border-top:solid 1px #171717; - border-bottom:solid 1px #171717; - border-left:solid 1px #171717; -} + .stick { vertical-align: middle; font-size: 0; @@ -206,14 +190,13 @@ a.btn { background: linear-gradient(180deg, #EDE7DE 0%, #FFF 100%) #EDE7DE; background: -webkit-linear-gradient(top, #EDE7DE 0%, #FFF 100%); } -#loginButton.btn{ - border:none; - box-shadow: 0px 1px rgba(255, 255, 255, 0.08) inset,0 -1px #171717,0px 1px rgba(255, 255, 255, 0.08); -} + .nav_menu .btn.active, .nav_menu .btn:active, .nav_menu .dropdown-target:target ~ .btn.dropdown-toggle{ - box-shadow: 0px 2px #E2972A; - border-radius: 0; - background:transparent; + box-shadow: 0 1px #fff; + border-radius: 4px; + background: linear-gradient(180deg, #EDE7DE 0%, #F6F6F6 100%) #EDE7DE; + background: -webkit-linear-gradient(top, #EDE7DE 0%, #F6F6F6 100%); + border: solid 1px #ccc; } .nav_menu .btn { border: 0; @@ -500,7 +483,8 @@ a.btn { /*=== Boxes */ .box { background: #EDE7DE; - border-radius: 4px 4px 0 0; + border-radius: 4px; + box-shadow: 0 1px #fff; } .box .box-title { margin: 0; @@ -575,6 +559,7 @@ a.btn { .tree-folder-items > .item > a { text-decoration: none; color: #fff; + font-size: 0.92em; } .tree-folder-items > .item.active > a { } @@ -593,7 +578,8 @@ a.btn { text-align: center; } .header > .item.title .logo { - display: none; + height: 60px; + width: 60px; } .header > .item.title{ width: 250px; @@ -603,9 +589,9 @@ a.btn { } .header > .item.title h1 a { text-decoration: none; - font-size: 38px; - color:#ccc; - text-shadow: 0 1px #fff, 0 -1px rgba(162, 162, 162, 1); + font-size: 28px; + color:#222; + text-shadow: 0 1px #fff; } .header > .item.search input { width: 230px; @@ -681,11 +667,8 @@ a.btn { /*=== Prompt (centered) */ .prompt { text-align: center; - color: #FFF; - background: #222; padding: 14px 0px; - box-shadow: 0px -1px #FFF, 0px 1px #FFF, 0px 2px 2px #171717 inset, 0px -2px 2px #171717 inset; - text-shadow: 0 -1px #171717, 0 1px rgba(255,255,255,0.08); + text-shadow: 0 1px rgba(255,255,255,0.08); } .prompt label { text-align: left; @@ -702,9 +685,9 @@ a.btn { margin: 20px 0; } .prompt input#username,.prompt input#passwordPlain{ - border:none; - box-shadow: 0px 1px rgba(255, 255, 255, 0.08) inset,0 -1px #171717,0px 1px rgba(255, 255, 255, 0.08); - background:#EDE7DE; + border:solid 1px #ccc; + box-shadow: 0 4px -4px #ccc inset,0px 1px rgba(255, 255, 255, 0.08); + background:#fff; } .prompt input#username:focus,.prompt input#passwordPlain:focus{ border: solid 1px #E7AB34; @@ -734,7 +717,11 @@ a.btn { padding: 0 10px; font-style:italic; line-height: 3em; - background: #fff; + box-shadow: 0 1px #BDB7AE inset, 0 -1px rgba(255,255,255,0.28) inset; + background: linear-gradient(0deg, #EDE7DE 0%, #C2BCB3 100%) #EDE7DE; + background: -webkit-linear-gradient(bottom, #C2BCB3 0%, #FFF 100%); + color: #666; + text-shadow: 0 1px rgba(255,255,255,0.28); text-align: center; } #new-article + .day { @@ -748,10 +735,26 @@ a.btn { .nav_menu { background: #EDE7DE; border-bottom: 1px solid #ccc; - box-shadow:0 -1px #fff inset; + box-shadow:0 -1px rgba(255, 255, 255, 0.28) inset; text-align: center; padding: 5px 0; } +#panel >.nav_menu{ + background: linear-gradient(0deg, #EDE7DE 0%, #FFF 100%) #EDE7DE; + background: -webkit-linear-gradient(bottom, #EDE7DE 0%, #FFF 100%); +} +#panel > .nav_menu > #nav_menu_read_all{ + background: linear-gradient(0deg, #EDE7DE 0%, #FFF 100%) #EDE7DE; + background: -webkit-linear-gradient(bottom, #EDE7DE 0%, #FFF 100%); + border-radius: 4px; + border: 1px solid #CCC; + box-shadow: 0px 1px #FFF; +} +#panel > .nav_menu > #nav_menu_read_all > .dropdown > .btn.dropdown-toggle{ + border-radius: 0 4px 4px 0; + border:none; + border-left: solid 1px #ccc; +} /*=== Feed articles */ .flux_content { @@ -810,6 +813,7 @@ opacity: 1; border-top: 1px solid #ddd; font-size: 0.8rem; cursor: pointer; + box-shadow: 0 -1px rgba(255,255,255,0.28) inset; } .flux_header .title { font-size: 0.9rem; @@ -917,6 +921,7 @@ opacity: 1; text-shadow: 0 -1px 0 #aaa; color: #666; background: #EDE7DE; + box-shadow: 0 1px rgba(255,255,255,0.28)inset; } #bigMarkAsRead:hover { color: #000; @@ -956,9 +961,8 @@ opacity: 1; /*=== GLOBAL VIEW */ /*================*/ #stream.global { - background: #222; padding: 24px 0; - box-shadow: 0 1px #fff, 0 -2px 2px #171717 inset, 0 2px 2px #171717 inset; + box-shadow: 0px 8px 8px #C2BCB3 inset; } .box.category .box-title { @@ -1004,6 +1008,7 @@ opacity: 1; #panel { box-shadow: 0px 0px 4px #000; border-radius: 8px; + background:#EDE7DE; } /*=== DIVERS */ /*===========*/ @@ -1084,6 +1089,14 @@ opacity: 1; color: #eee; } +#slider.active { + box-shadow: -4px 0 4px rgba(15, 15, 15, 0.55); + background: #F8F8F8; +} +#close-slider.active { + background: rgba(15, 15, 15, 0.35); +} + /*=== MOBILE */ /*===========*/ @media screen and (max-width: 840px) { diff --git a/p/themes/Screwdriver/thumbs/original.png b/p/themes/Screwdriver/thumbs/original.png Binary files differnew file mode 100644 index 000000000..ba9bacf90 --- /dev/null +++ b/p/themes/Screwdriver/thumbs/original.png diff --git a/p/themes/base-theme/template.css b/p/themes/base-theme/template.css index 5ba621415..25f206106 100644 --- a/p/themes/base-theme/template.css +++ b/p/themes/base-theme/template.css @@ -499,7 +499,8 @@ a.btn { text-overflow: ellipsis; overflow: hidden; } -.flux .item.share > a { +.flux .item.share > a, +.item.query > a { display: list-item; list-style-position: inside; list-style-type: decimal; @@ -682,6 +683,93 @@ br + br + br { left: 0; } +/*=== SLIDESHOW */ +/*==============*/ +.slides { + padding: 0; + height: 320px; + display: block; + position: relative; + min-width: 260px; + max-width: 640px; + margin-bottom: 30px; + border: 1px solid #aaa; +} +.slides input { + display: none; +} +.slide-container { + display: block; +} +.slide { + top: 0; + opacity: 0; + width: 100%; + height: 100%; + display: block; + position: absolute; + transform: scale(0); + transition: all .7s ease-in-out; +} +.slide img { + width: 100%; + height: 100%; +} +.nav label { + width: 10%; + height: 100%; + display: none; + position: absolute; + opacity: 0; + z-index: 9; + cursor: pointer; + transition: opacity .2s; + color: #FFF; + font-size: 1000%; + text-align: center; + line-height: 225%; + font-family: "Varela Round", sans-serif; + background-color: rgba(255, 255, 255, .3); + text-shadow: 0px 0px 15px rgb(119, 119, 119); + padding: 0; +} +.properties { + display: none; + bottom: 0; + left: 0; right: 0; + position: absolute; + padding: 5px; + background: rgba(255, 255, 255, 0.7); + color: #000; + border-top: 1px solid #aaa; + z-index: 10; +} +.properties .page-number { + right: 5px; + top: 0; + position: absolute; +} +.slide:hover + .nav label { + opacity: 0.5; +} +.nav label:hover { + opacity: 1; +} +.nav .next { + right: 0; +} +input:checked + .slide-container .slide { + opacity: 1; + transform: scale(1); + transition: opacity 1s ease-in-out; +} +input:checked + .slide-container .nav label { + display: block; +} +input:checked + .slide-container .properties { + display: block; +} + /*=== DIVERS */ /*===========*/ .category .title:not([data-unread="0"]):after { |
