diff --git a/app/controllers/apiController.php b/app/controllers/apiController.php
index bc08386b5..025908f3e 100755
--- a/app/controllers/apiController.php
+++ b/app/controllers/apiController.php
@@ -20,11 +20,11 @@ class apiController extends ActionController {
$notes = $e->notes ();
if ($notes == '') {
$feed = $e->feed (true);
- $notes = 'Article publié initialement sur ' . $feed->name () . '';
if($author != '') {
- $notes .= ' par ' . $author;
+ $notes = Translate::t ('article_published_on_author', $feed->website (), $feed->name (), $author);
+ } else {
+ $notes = Translate::t ('article_published_on', $feed->website (), $feed->name ());
}
- $notes .= ', mis en favoris dans FreshRSS';
}
$id = $e->id ();
diff --git a/app/controllers/configureController.php b/app/controllers/configureController.php
index 18a56c066..7e73fd2ba 100755
--- a/app/controllers/configureController.php
+++ b/app/controllers/configureController.php
@@ -5,7 +5,7 @@ class configureController extends ActionController {
if (login_is_conf ($this->view->conf) && !is_logged ()) {
Error::error (
403,
- array ('error' => array ('Vous n\'avez pas le droit d\'accéder à cette page'))
+ array ('error' => array (Translate::t ('access denied')))
);
}
}
@@ -48,7 +48,7 @@ class configureController extends ActionController {
// notif
$notif = array (
'type' => 'good',
- 'content' => 'Les catégories ont été mises à jour'
+ 'content' => Translate::t ('categories_updated')
);
Session::_param ('notification', $notif);
@@ -58,7 +58,7 @@ class configureController extends ActionController {
$this->view->categories = $catDAO->listCategories ();
$this->view->defaultCategory = $catDAO->getDefault ();
- View::prependTitle ('Gestion des catégories - ');
+ View::prependTitle (Translate::t ('categories_management') . ' - ');
}
public function feedAction () {
@@ -80,7 +80,7 @@ class configureController extends ActionController {
if (!$this->view->flux) {
Error::error (
404,
- array ('error' => array ('La page que vous cherchez n\'existe pas'))
+ array ('error' => array (Translate::t ('page_not_found')))
);
} else {
$catDAO = new CategoryDAO ();
@@ -102,12 +102,12 @@ class configureController extends ActionController {
$notif = array (
'type' => 'good',
- 'content' => 'Le flux a été mis à jour'
+ 'content' => Translate::t ('feed_updated')
);
} else {
$notif = array (
'type' => 'bad',
- 'content' => 'Une erreur est survenue lors de la mise à jour'
+ 'content' => Translate::t ('error_occurred_update')
);
}
@@ -115,10 +115,10 @@ class configureController extends ActionController {
Request::forward (array ('c' => 'configure', 'a' => 'feed', 'params' => array ('id' => $id)), true);
}
- View::prependTitle ('Gestion des flux RSS - ' . $this->view->flux->name () . ' - ');
+ View::prependTitle (Translate::t ('rss_feed_management') . ' - ' . $this->view->flux->name () . ' - ');
}
} else {
- View::prependTitle ('Gestion des flux RSS - ');
+ View::prependTitle (Translate::t ('rss_feed_management') . ' - ');
}
}
@@ -167,21 +167,21 @@ class configureController extends ActionController {
// notif
$notif = array (
'type' => 'good',
- 'content' => 'La configuration a été mise à jour'
+ 'content' => Translate::t ('configuration_updated')
);
Session::_param ('notification', $notif);
Request::forward (array ('c' => 'configure', 'a' => 'display'), true);
}
- View::prependTitle ('Gestion générale et affichage - ');
+ View::prependTitle (Translate::t ('general_and_reading_management') . ' - ');
}
public function importExportAction () {
$this->view->req = Request::param ('q');
if ($this->view->req == 'export') {
- View::_title ('feeds_opml.xml');
+ View::_title ('feeds.opml');
$this->view->_useLayout (false);
header('Content-Type: text/xml; charset=utf-8');
@@ -212,7 +212,7 @@ class configureController extends ActionController {
$this->view->feeds = $feedDAO->listFeeds ();
$this->view->flux = false;
- View::prependTitle ('Importation et exportation OPML - ');
+ View::prependTitle (Translate::t ('import_export_opml') . ' - ');
}
public function shortcutAction () {
@@ -251,13 +251,13 @@ class configureController extends ActionController {
// notif
$notif = array (
'type' => 'good',
- 'content' => 'Les raccourcis ont été mis à jour'
+ 'content' => Translate::t ('shortcuts_updated')
);
Session::_param ('notification', $notif);
Request::forward (array ('c' => 'configure', 'a' => 'shortcut'), true);
}
- View::prependTitle ('Gestion des raccourcis - ');
+ View::prependTitle (Translate::t ('shortcuts_management') . ' - ');
}
}
diff --git a/app/controllers/entryController.php b/app/controllers/entryController.php
index e3c4fe165..2ce260297 100755
--- a/app/controllers/entryController.php
+++ b/app/controllers/entryController.php
@@ -5,7 +5,7 @@ class entryController extends ActionController {
if (login_is_conf ($this->view->conf) && !is_logged ()) {
Error::error (
403,
- array ('error' => array ('Vous n\'avez pas le droit d\'accéder à cette page'))
+ array ('error' => array (Translate::t ('access denied')))
);
}
@@ -63,7 +63,7 @@ class entryController extends ActionController {
// notif
$notif = array (
'type' => 'good',
- 'content' => 'Les flux ont été marqués comme lu'
+ 'content' => Translate::t ('feeds_marked_read')
);
Session::_param ('notification', $notif);
} else {
@@ -130,12 +130,12 @@ class entryController extends ActionController {
if ($entryDAO->updateEntry ($id, $values)) {
$notif = array (
'type' => 'good',
- 'content' => 'Modifications enregistrées'
+ 'content' => Translate::t ('updated')
);
} else {
$notif = array (
'type' => 'bad',
- 'content' => 'Une erreur est survenue'
+ 'content' => Translate::t ('error_occured')
);
}
Session::_param ('notification', $notif);
@@ -157,7 +157,7 @@ class entryController extends ActionController {
if ($not_found) {
Error::error (
404,
- array ('error' => array ('La page que vous cherchez n\'existe pas'))
+ array ('error' => array (Translate::t ('page_not_found')))
);
} else {
$this->view->entry = $entry;
diff --git a/app/controllers/feedController.php b/app/controllers/feedController.php
index c67609d57..1232ddff4 100755
--- a/app/controllers/feedController.php
+++ b/app/controllers/feedController.php
@@ -10,7 +10,7 @@ class feedController extends ActionController {
if (login_is_conf ($this->view->conf) && !is_logged ()) {
Error::error (
403,
- array ('error' => array ('Vous n\'avez pas le droit d\'accéder à cette page'))
+ array ('error' => array (Translate::t ('access_denied')))
);
} else {
if (Request::isPost ()) {
@@ -37,7 +37,7 @@ class feedController extends ActionController {
if ($feedDAO->searchByUrl ($values['url'])) {
$notif = array (
'type' => 'bad',
- 'content' => 'Vous êtes déjà abonné à ' . $feed->name () . ''
+ 'content' => Translate::t ('already_subscribed', $feed->name ())
);
Session::_param ('notification', $notif);
} elseif ($feedDAO->addFeed ($values)) {
@@ -52,7 +52,7 @@ class feedController extends ActionController {
// notif
$notif = array (
'type' => 'good',
- 'content' => 'Le flux ' . $feed->name () . ' a bien été ajouté'
+ 'content' => Translate::t ('feed_added', $feed->name ())
);
Session::_param ('notification', $notif);
$params['id'] = $feed->id ();
@@ -60,7 +60,7 @@ class feedController extends ActionController {
// notif
$notif = array (
'type' => 'bad',
- 'content' => '' . $feed->name () . ' n\' a pas pu être ajouté'
+ 'content' => Translate::t ('feed_not_added', $feed->name ())
);
Session::_param ('notification', $notif);
}
@@ -68,22 +68,14 @@ class feedController extends ActionController {
Log::record ($e->getMessage (), Log::ERROR);
$notif = array (
'type' => 'bad',
- 'content' => 'Un problème interne a été rencontré, le flux n\'a pas pu être ajouté'
- );
- Session::_param ('notification', $notif);
- } catch (FileNotExistException $e) {
- Log::record ($e->getMessage (), Log::ERROR);
- // notif
- $notif = array (
- 'type' => 'bad',
- 'content' => 'Un problème de configuration a empêché l\'ajout du flux. Voir les logs pour plus d\'informations'
+ 'content' => Translate::t ('internal_problem_feed')
);
Session::_param ('notification', $notif);
} catch (Exception $e) {
// notif
$notif = array (
'type' => 'bad',
- 'content' => 'L\'url ' . $url . ' est invalide'
+ 'content' => Translate::t ('invalid_url', $url)
);
Session::_param ('notification', $notif);
}
@@ -144,18 +136,18 @@ class feedController extends ActionController {
$feed = reset ($feeds);
$notif = array (
'type' => 'good',
- 'content' => '' . $feed->name () . ' a été mis à jour'
+ 'content' => Translate::t ('feed_actualized', $feed->name ())
);
$url['params'] = array ('get' => 'f_' . $feed->id ());
} elseif ($i > 0) {
$notif = array (
'type' => 'good',
- 'content' => $i . ' flux ont été mis à jour'
+ 'content' => Translate::t ('n_feeds_actualized', $i)
);
} else {
$notif = array (
'type' => 'bad',
- 'content' => 'Aucun flux n\'a pu être mis à jour'
+ 'content' => Translate::t ('no_feed_actualized')
);
}
@@ -165,7 +157,7 @@ class feedController extends ActionController {
} else {
$notif = array (
'type' => 'good',
- 'content' => 'Les flux ont été mis à jour'
+ 'content' => Translate::t ('feeds_actualized')
);
Session::_param ('notification', $notif);
$this->view->_useLayout (false);
@@ -176,7 +168,7 @@ class feedController extends ActionController {
if (login_is_conf ($this->view->conf) && !is_logged ()) {
Error::error (
403,
- array ('error' => array ('Vous n\'avez pas le droit d\'accéder à cette page'))
+ array ('error' => array (Translate::t ('access_denied')))
);
} else {
$entryDAO = new EntryDAO ();
@@ -219,9 +211,9 @@ class feedController extends ActionController {
}
if ($error) {
- $res = 'Les flux ont été importés mais des erreurs sont survenus';
+ $res = Translate::t ('feeds_imported_with_errors');
} else {
- $res = 'Les flux ont été importés';
+ $res = Translate::t ('feeds_imported');
}
$notif = array (
'type' => 'good',
@@ -240,7 +232,7 @@ class feedController extends ActionController {
if (login_is_conf ($this->view->conf) && !is_logged ()) {
Error::error (
403,
- array ('error' => array ('Vous n\'avez pas le droit d\'accéder à cette page'))
+ array ('error' => array (Translate::t ('access_denied')))
);
} else {
$type = Request::param ('type', 'feed');
@@ -251,24 +243,24 @@ class feedController extends ActionController {
if ($feedDAO->deleteFeedByCategory ($id)) {
$notif = array (
'type' => 'good',
- 'content' => 'La catégorie a été vidée'
+ 'content' => Translate::t ('category_emptied')
);
} else {
$notif = array (
'type' => 'bad',
- 'content' => 'Un problème est survenu'
+ 'content' => Translate::t ('error_occured')
);
}
} else {
if ($feedDAO->deleteFeed ($id)) {
$notif = array (
'type' => 'good',
- 'content' => 'Le flux a été supprimé'
+ 'content' => Translate::t ('feed_deleted')
);
} else {
$notif = array (
'type' => 'bad',
- 'content' => 'Un problème est survenu'
+ 'content' => Translate::t ('error_occured')
);
}
}
diff --git a/app/controllers/indexController.php b/app/controllers/indexController.php
index 8fa911631..dfdcfde42 100755
--- a/app/controllers/indexController.php
+++ b/app/controllers/indexController.php
@@ -35,13 +35,13 @@ class indexController extends ActionController {
// Récupère les flux par catégorie, favoris ou tous
if ($this->get['type'] == 'all') {
$entries = $entryDAO->listEntries ($this->mode, $search, $order);
- View::prependTitle ('Vos flux RSS - ');
+ View::prependTitle (Translate::t ('your_rss_feeds') . ' - ');
} elseif ($this->get['type'] == 'favoris') {
$entries = $entryDAO->listFavorites ($this->mode, $search, $order);
- View::prependTitle ('Vos favoris - ');
+ View::prependTitle (Translate::t ('your_favorites') . ' - ');
} elseif ($this->get['type'] == 'public') {
$entries = $entryDAO->listPublic ($this->mode, $search, $order);
- View::prependTitle ('Public - ');
+ View::prependTitle (Translate::t ('public') . ' - ');
} elseif ($this->get != false) {
if ($this->get['type'] == 'c') {
$cat = $catDAO->searchById ($this->get['filter']);
@@ -72,7 +72,7 @@ class indexController extends ActionController {
if ($error) {
Error::error (
404,
- array ('error' => array ('La page que vous cherchez n\'existe pas'))
+ array ('error' => array (Translate::t ('page_not_found')))
);
} else {
$this->view->mode = $this->mode;
@@ -93,7 +93,7 @@ class indexController extends ActionController {
}
public function aboutAction () {
- View::prependTitle ('À propos - ');
+ View::prependTitle (Translate::t ('about') . ' - ');
}
public function changeModeAction () {
@@ -143,7 +143,7 @@ class indexController extends ActionController {
} else {
$res = array ();
$res['status'] = 'failure';
- $res['reason'] = 'L\'identifiant est invalide';
+ $res['reason'] = Translate::t ('invalid_login');
}
$this->view->res = json_encode ($res);
diff --git a/app/i18n/fr.php b/app/i18n/fr.php
index 753a0d469..2ddac3066 100644
--- a/app/i18n/fr.php
+++ b/app/i18n/fr.php
@@ -1,6 +1,7 @@
'Connexion',
'logout' => 'Déconnexion',
'search_on_title' => 'Rechercher sur les titres',
@@ -29,14 +30,157 @@ return array (
'actualize' => 'Actualiser',
'mark_read' => 'Marquer comme lu',
+ 'mark_favorite' => 'Mettre en favori',
'mark_all_read' => 'Tout marquer comme lu',
'mark_feed_read' => 'Marquer le flux comme lu',
'mark_cat_read' => 'Marquer la catégorie comme lue',
'before_one_day' => 'Antérieurs à 1 jour',
'before_one_week' => 'Antérieurs à 1 semaine',
'display' => 'Affichage',
- 'show_all' => 'Tout afficher',
+ 'show_all_articles' => 'Afficher tous les articles',
'show_not_reads' => 'Afficher les non lus',
'older_first' => 'Plus anciens en premier',
'newer_first' => 'Plus récents en premier',
+
+ // CONTROLLERS
+ 'article_published_on' => 'Article publié initialement sur %s, mis en favoris dans FreshRSS',
+ 'article_published_on_author' => 'Article publié initialement sur %s par %s, mis en favoris dans FreshRSS',
+
+ 'access denied' => 'Vous n\'avez pas le droit d\'accéder à cette page',
+ 'page_not_found' => 'La page que vous cherchez n\'existe pas',
+ 'error_occurred' => 'Une erreur est survenue',
+ 'error_occurred_update' => 'Une erreur est survenue lors de la mise à jour',
+
+ 'categories_updated' => 'Les catégories ont été mises à jour',
+ 'categories_management' => 'Gestion des catégories',
+ 'feed_updated' => 'Le flux a été mis à jour',
+ 'rss_feed_management' => 'Gestion des flux RSS',
+ 'configuration_updated' => 'La configuration a été mise à jour',
+ 'general_and_reading_management'=> 'Gestion générale et affichage',
+ 'shortcuts_updated' => 'Les raccourcis ont été mis à jour',
+ 'shortcuts_management' => 'Gestion des raccourcis',
+ 'feeds_marked_read' => 'Les flux ont été marqués comme lu',
+ 'updated' => 'Modifications enregistrées',
+
+ 'already_subscribed' => 'Vous êtes déjà abonné à %s',
+ 'feed_added' => 'Le flux %s a bien été ajouté',
+ 'feed_not_added' => '%s n\' a pas pu être ajouté',
+ 'internal_problem_feed' => 'Un problème interne a été rencontré, le flux n\'a pas pu être ajouté',
+ 'invalid_url' => 'L\'url %s est invalide',
+ 'feed_actualized' => '%s a été mis à jour',
+ 'n_feeds_actualized' => '%d flux ont été mis à jour',
+ 'feeds_actualized' => 'Les flux ont été mis à jour',
+ 'no_feed_actualized' => 'Aucun flux n\'a pu être mis à jour',
+ 'feeds_imported_with_errors' => 'Les flux ont été importés mais des erreurs sont survenues',
+ 'feeds_imported' => 'Les flux ont été importés',
+ 'category_emptied' => 'La catégorie a été vidée',
+ 'feed_deleted' => 'Le flux a été supprimé',
+
+ 'your_rss_feeds' => 'Vos flux RSS',
+ 'your_favorites' => 'Vos favoris',
+ 'public' => 'Public',
+ 'invalid_login' => 'L\'identifiant est invalide',
+
+ // VIEWS
+ 'save' => 'Enregistrer',
+ 'delete' => 'Supprimer',
+ 'cancel' => 'Annuler',
+
+ 'back_to_rss_feeds' => '← Retour à vos flux RSS',
+ 'feeds_moved_category_deleted' => 'Lors de la suppression d\'une catégorie, ses flux seront automatiquement classés dans %s.',
+ 'category_number' => 'Catégorie n°%d',
+ 'ask_empty' => 'Vider ?',
+ 'number_feeds' => '%d flux',
+ 'can_not_be_deleted' => 'Ne peut pas être supprimée',
+ 'add_category' => 'Ajouter une catégorie',
+ 'new_category' => 'Nouvelle catégorie',
+
+ 'javascript_for_shortcuts' => 'Le javascript doit être activé pour pouvoir profiter des raccourcis',
+ 'javascript_should_be_activated'=> 'Le javascript doit être activé',
+ 'shift_for_all_read' => '+ shift pour marquer tous les articles comme non lus',
+ 'see_on_website' => 'Voir l\'article sur le site d\'origine',
+ 'next_article' => 'Passer à l\'article suivant',
+ 'shift_for_last' => '+ shift pour passer au dernier article de la page',
+ 'previous_article' => 'Passer à l\'article précédent',
+ 'shift_for_first' => '+ shift pour passer au premier article de la page',
+ 'next_page' => 'Passer à la page suivante',
+ 'previous_page' => 'Passer à la page précédente',
+
+ 'file_to_import' => 'Fichier à importer',
+ 'import' => 'Importer',
+ 'export' => 'Exporter',
+ 'or' => 'ou',
+
+ 'informations' => 'Informations',
+ 'website_url' => 'URL du site',
+ 'feed_url' => 'URL du flux',
+ 'number_articles' => 'Nombre d\'articles',
+ 'categorize' => 'Ranger dans une catégorie',
+ 'advanced' => 'Avancé',
+ 'show_in_all_flux' => 'Afficher dans le flux principal',
+ 'yes' => 'Oui',
+ 'no' => 'Non',
+ 'css_path_on_website' => 'Chemin CSS des articles sur le site d\'origine',
+ 'retrieve_truncated_feeds' => 'Permet de récupérer les flux tronqués (attention, demande plus de temps !)',
+ 'http_username' => 'Username HTTP',
+ 'http_password' => 'Mot de passe HTTP',
+ 'blank_to_disable' => 'Laissez vide pour désactiver',
+ 'not_yet_implemented' => 'Pas encore implémenté',
+ 'access_protected_feeds' => 'La connexion permet d\'accéder aux flux protégés par une authentification HTTP',
+ 'no_selected_feed' => 'Aucun flux sélectionné.',
+ 'think_to_add' => 'Pensez à en ajouter !',
+
+ 'general_configuration' => 'Configuration générale',
+ 'delete_articles_every' => 'Supprimer les articles tous les',
+ 'month' => 'mois',
+ 'persona_connection_email' => 'Adresse mail de connexion (utilise Persona)',
+ 'reading_configuration' => 'Configuration de lecture',
+ 'articles_per_page' => 'Nombre d\'articles par page',
+ 'default_view' => 'Vue par défaut',
+ 'sort_order' => 'Ordre de tri',
+ 'display_articles_unfolded' => 'Afficher les articles dépliés par défaut',
+ 'auto_read_when' => 'Marquer automatiquement comme lu lorsque',
+ 'article_selected' => 'L\'article est sélectionné',
+ 'article_open_on_website' => 'L\'article est ouvert sur le site d\'origine',
+ 'page_loaded' => 'La page est chargée',
+ 'your_shaarli' => 'Votre Shaarli',
+ 'sharing' => 'Partage',
+ 'share' => 'Partager',
+ 'by_email' => 'Par mail',
+ 'on_shaarli' => 'Sur votre Shaarli',
+
+ 'note' => 'Note',
+ 'add_note' => 'Ajouter une note',
+ 'update_note' => 'Modifier votre note',
+ 'ask_public_article' => 'Article public ?',
+ 'article' => 'Article',
+ 'title' => 'Titre',
+ 'author' => 'Auteur',
+ 'publication_date' => 'Date de publication',
+
+ 'newer' => 'plus récents',
+ 'older' => 'plus anciens',
+
+ 'rss_feeds_of' => 'Flux RSS de %s',
+
+ 'refresh' => 'Actualisation',
+
+ 'today' => 'Aujourd\'hui',
+ 'yesterday' => 'Hier',
+ 'before_yesterday' => 'À partir d\'avant-hier',
+ 'by_author' => 'Par %s',
+ 'related_tags' => 'Tags associés',
+ 'no_feed_to_display' => 'Il n\'y a aucun flux à afficher.',
+
+ 'about_freshrss' => 'À propos de FreshRSS',
+ 'project_website' => 'Site du projet',
+ 'lead_developer' => 'Développeur principal',
+ 'website' => 'Site Internet',
+ 'bugs_reports' => 'Rapports de bugs',
+ 'github_or_email' => 'sur Github ou par mail',
+ 'license' => 'Licence',
+ 'agpl3' => 'AGPL 3',
+ 'freshrss_description' => 'FreshRSS est un agrégateur de flux RSS à auto-héberger à l\'image de RSSLounge, TinyTinyRSS ou Leed. Il se veut léger et facile à prendre en main tout en étant un outil puissant et paramétrable. L\'objectif étant d\'offrir une alternative sérieuse au futur feu-Google Reader.',
+ 'credits' => 'Crédits',
+ 'credits_content' => 'Des éléments de design sont issus du projet Bootstrap bien que FreshRSS n\'utilise pas ce framework. Les icônes sont issues du projet GNOME. La police Open Sans utilisée a été créée par Steve Matteson. Les favicons sont récupérés grâce au site getFavicon. FreshRSS repose sur Minz, un framework PHP.',
);
diff --git a/app/layout/nav_menu.phtml b/app/layout/nav_menu.phtml
index 02e340ca1..1ee935db9 100644
--- a/app/layout/nav_menu.phtml
+++ b/app/layout/nav_menu.phtml
@@ -47,7 +47,7 @@