Explorar o código

Structure pour l'internationalisation terminée (voir bug #38) : il reste à faire la traduction en anglais notamment, rajouter une option pour changer la langue, détecter la langue préférée de l'utilisateur et voir si on peut migrer facilement l'installateur aussi

Marien Fressinaud %!s(int64=13) %!d(string=hai) anos
pai
achega
19407e1ab6

+ 3 - 3
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 <a href="' . $feed->website () . '">' . $feed->name () . '</a>';
 				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 <a href="https://github.com/marienfressinaud/FreshRSS">FreshRSS</a>';
 			}
 
 			$id = $e->id ();

+ 14 - 14
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') . ' - ');
 	}
 }

+ 5 - 5
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;

+ 18 - 26
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é à <em>' . $feed->name () . '</em>'
+							'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 <em>' . $feed->name () . '</em> 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' => '<em>' . $feed->name () . '</em> 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 <em>' . $url . '</em> 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' => '<em>' . $feed->name () . '</em> 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')
 					);
 				}
 			}

+ 6 - 6
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);

+ 145 - 1
app/i18n/fr.php

@@ -1,6 +1,7 @@
 <?php
 
 return array (
+	// LAYOUT
 	'login'				=> '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 <a href="%s">%s</a>, mis en favoris dans <a href="https://github.com/marienfressinaud/FreshRSS">FreshRSS</a>',
+	'article_published_on_author'	=> 'Article publié initialement sur <a href="%s">%s</a> par %s, mis en favoris dans <a href="https://github.com/marienfressinaud/FreshRSS">FreshRSS</a>',
+
+	'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é à <em>%s</em>',
+	'feed_added'			=> 'Le flux <em>%s</em> a bien été ajouté',
+	'feed_not_added'		=> '<em>%s</em> 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 <em>%s</em> est invalide',
+	'feed_actualized'		=> '<em>%s</em> 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 <em>%s</em>.',
+	'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'		=> '+ <code>shift</code> 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'		=> '+ <code>shift</code> pour passer au dernier article de la page',
+	'previous_article'		=> 'Passer à l\'article précédent',
+	'shift_for_first'		=> '+ <code>shift</code> 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 <a href="https://persona.org/">Persona</a>)',
+	'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 <em>%s</em>',
+	'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'		=> '<a href="https://github.com/marienfressinaud/FreshRSS/issues">sur Github</a> ou <a href="mailto:dev@marienfressinaud.fr">par mail</a>',
+	'license'			=> 'Licence',
+	'agpl3'				=> '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
+	'freshrss_description'		=> 'FreshRSS est un agrégateur de flux RSS à auto-héberger à l\'image de <a href="http://rsslounge.aditu.de/">RSSLounge</a>, <a href="http://tt-rss.org/redmine/projects/tt-rss/wiki">TinyTinyRSS</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. 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 <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.',
 );

+ 1 - 1
app/layout/nav_menu.phtml

@@ -47,7 +47,7 @@
 
 			<li class="item">
 				<?php if ($this->mode == 'not_read') { ?>
-				<a class="print_all" href="<?php echo _url ('index', 'changeMode', 'mode', 'all'); ?>"><?php echo Translate::t ('show_all'); ?></a>
+				<a class="print_all" href="<?php echo _url ('index', 'changeMode', 'mode', 'all'); ?>"><?php echo Translate::t ('show_all_articles'); ?></a>
 				<?php } else { ?>
 				<a class="print_non_read" href="<?php echo _url ('index', 'changeMode', 'mode', 'not_read'); ?>"><?php echo Translate::t ('show_not_reads'); ?></a>
 				<?php } ?>

+ 10 - 10
app/views/configure/categorize.phtml

@@ -1,23 +1,23 @@
 <?php $this->partial ('aside_configure'); ?>
 
 <div class="post">
-	<a href="<?php echo _url ('index', 'index'); ?>">← Retour à vos flux RSS</a>
+	<a href="<?php echo _url ('index', 'index'); ?>"><?php echo Translate::t ('back_to_rss_feeds'); ?></a>
 
 	<form method="post" action="<?php echo _url ('configure', 'categorize'); ?>">
-		<legend>Gestion des catégories - <a href="<?php echo _url ('configure', 'feed'); ?>">gestion des flux</a></legend>
+		<legend><?php echo Translate::t ('categories_management'); ?> - <a href="<?php echo _url ('configure', 'feed'); ?>"><?php echo Translate::t ('rss_feed_management'); ?></a></legend>
 
-		<p class="alert alert-warn">Lors de la suppression d'une catégorie, ses flux seront automatiquement classés dans <em><?php echo $this->defaultCategory->name (); ?></em>.</p>
+		<p class="alert alert-warn"><?php echo Translate::t ('feeds_moved_category_deleted', $this->defaultCategory->name ()); ?></p>
 
 		<?php $i = 0; foreach ($this->categories as $cat) { $i++; ?>
 		<div class="form-group">
 			<label class="group-name" for="cat_<?php echo $cat->id (); ?>">
-				Catégorie n°<?php echo $i; ?>
+				<?php echo Translate::t ('category_number', $i); ?>
 			</label>
 			<div class="group-controls">
 				<input type="text" id="cat_<?php echo $cat->id (); ?>" name="categories[]" value="<?php echo $cat->name (); ?>" />
-				<a href="<?php echo _url ('feed', 'delete', 'id', $cat->id (), 'type', 'category'); ?>">Vider ?</a> (<?php echo $cat->nbFeed (); ?> flux)
+				<a href="<?php echo _url ('feed', 'delete', 'id', $cat->id (), 'type', 'category'); ?>"><?php echo Translate::t ('ask_empty'); ?></a> (<?php echo Translate::t ('number_feeds', $cat->nbFeed ()); ?>)
 				<?php if ($cat->id () == $this->defaultCategory->id ()) { ?>
-				<i class="icon i_help"></i> ne peut pas être supprimée
+				<i class="icon i_help"></i> <?php echo Translate::t ('can_not_be_deleted'); ?>
 				<?php } ?>
 				<input type="hidden" name="ids[]" value="<?php echo $cat->id (); ?>" />
 			</div>
@@ -25,16 +25,16 @@
 		<?php } ?>
 
 		<div class="form-group">
-			<label class="group-name" for="new_category">Ajouter une catégorie</label>
+			<label class="group-name" for="new_category"><?php echo Translate::t ('add_category'); ?></label>
 			<div class="group-controls">
-				<input type="text" id="new_category" name="new_category" placeholder="Nouvelle catégorie" />
+				<input type="text" id="new_category" name="new_category" placeholder="<?php echo Translate::t ('new_category'); ?>" />
 			</div>
 		</div>
 
 		<div class="form-group form-actions">
 			<div class="group-controls">
-				<button type="submit" class="btn btn-important">Sauvegarder</button>
-				<button type="reset" class="btn">Annuler</button>
+				<button type="submit" class="btn btn-important"><?php echo Translate::t ('save'); ?></button>
+				<button type="reset" class="btn"><?php echo Translate::t ('cancel'); ?></button>
 			</div>
 		</div>
 	</form>

+ 27 - 27
app/views/configure/display.phtml

@@ -1,104 +1,104 @@
 <?php $this->partial ('aside_configure'); ?>
 
 <div class="post">
-	<a href="<?php echo _url ('index', 'index'); ?>">← Retour à vos flux RSS</a>
+	<a href="<?php echo _url ('index', 'index'); ?>"><?php echo Translate::t ('back_to_rss_feeds'); ?></a>
 
 	<form method="post" action="<?php echo _url ('configure', 'display'); ?>">
-		<legend>Configuration générale</legend>
+		<legend><?php echo Translate::t ('general_configuration'); ?></legend>
 
 		<div class="form-group">
-			<label class="group-name" for="old_entries">Supprimer les articles tous les</label>
+			<label class="group-name" for="old_entries"><?php echo Translate::t ('delete_articles_every'); ?></label>
 			<div class="group-controls">
-				<input type="number" id="old_entries" name="old_entries" value="<?php echo $this->conf->oldEntries (); ?>" /> mois
+				<input type="number" id="old_entries" name="old_entries" value="<?php echo $this->conf->oldEntries (); ?>" /> <?php echo Translate::t ('month'); ?>
 			</div>
 		</div>
 
 		<div class="form-group">
-			<label class="group-name" for="mail_login">Adresse mail de connexion (utilise <a href="https://persona.org/">Persona</a>)</label>
+			<label class="group-name" for="mail_login"><?php echo Translate::t ('persona_connection_email'); ?></label>
 		<?php $mail = $this->conf->mailLogin (); ?>
 			<div class="group-controls">
-				<input type="email" id="mail_login" name="mail_login" value="<?php echo $mail ? $mail : ''; ?>" placeholder="Laissez vide pour désactiver" />
-				<noscript><b>nécessite que javascript soit activé</b></noscript>
+				<input type="email" id="mail_login" name="mail_login" value="<?php echo $mail ? $mail : ''; ?>" placeholder="<?php echo Translate::t ('blank_to_disable'); ?>" />
+				<noscript><b><?php echo Translate::t ('javascript_should_be_activated'); ?></b></noscript>
 			</div>
 		</div>
 	
-		<legend>Configuration de lecture</legend>
+		<legend><?php echo Translate::t ('reading_configuration'); ?></legend>
 
 		<div class="form-group">
-			<label class="group-name" for="posts_per_page">Nombre d'articles par page</label>
+			<label class="group-name" for="posts_per_page"><?php echo Translate::t ('articles_per_page'); ?></label>
 			<div class="group-controls">
 				<input type="number" id="posts_per_page" name="posts_per_page" value="<?php echo $this->conf->postsPerPage (); ?>" />
 			</div>
 		</div>
 
 		<div class="form-group">
-			<label class="group-name">Vue par défaut</label>
+			<label class="group-name"><?php echo Translate::t ('default_view'); ?></label>
 			<div class="group-controls">
 				<label class="radio" for="radio_all">
 					<input type="radio" name="default_view" id="radio_all" value="all"<?php echo $this->conf->defaultView () == 'all' ? ' checked="checked"' : ''; ?> />
-					Tout afficher
+					<?php echo Translate::t ('show_all_articles'); ?>
 				</label>
 				<label class="radio" for="radio_not_read">
 					<input type="radio" name="default_view" id="radio_not_read" value="not_read"<?php echo $this->conf->defaultView () == 'not_read' ? ' checked="checked"' : ''; ?> />
-					Afficher les non lus
+					<?php echo Translate::t ('show_not_reads'); ?>
 				</label>
 			</div>
 		</div>
 
 		<div class="form-group">
-			<label class="group-name" for="sort_order">Ordre de tri</label>
+			<label class="group-name" for="sort_order"><?php echo Translate::t ('sort_order'); ?></label>
 			<div class="group-controls">
 				<select name="sort_order" id="sort_order">
-					<option value="low_to_high"<?php echo $this->conf->sortOrder () == 'low_to_high' ? ' selected="selected"' : ''; ?>>Du plus récent au plus ancien</option>
-					<option value="high_to_low"<?php echo $this->conf->sortOrder () == 'high_to_low' ? ' selected="selected"' : ''; ?>>Du plus ancien au plus récent</option>
+					<option value="low_to_high"<?php echo $this->conf->sortOrder () == 'low_to_high' ? ' selected="selected"' : ''; ?>><?php echo Translate::t ('newer_first'); ?></option>
+					<option value="high_to_low"<?php echo $this->conf->sortOrder () == 'high_to_low' ? ' selected="selected"' : ''; ?>><?php echo Translate::t ('older_first'); ?></option>
 				</select>
 			</div>
 		</div>
 
 		<div class="form-group">
-			<label class="group-name">Afficher les articles dépliés par défaut</label>
+			<label class="group-name"><?php echo Translate::t ('display_articles_unfolded'); ?></label>
 			<div class="group-controls">
 				<label class="radio" for="radio_yes">
 					<input type="radio" name="display_posts" id="radio_yes" value="yes"<?php echo $this->conf->displayPosts () == 'yes' ? ' checked="checked"' : ''; ?> />
-					Oui
+					<?php echo Translate::t ('yes'); ?>
 				</label>
 				<label class="radio" for="radio_no">
 					<input type="radio" name="display_posts" id="radio_no" value="no"<?php echo $this->conf->displayPosts () == 'no' ? ' checked="checked"' : ''; ?> />
-					Non<noscript> - <b>nécessite que javascript soit activé</b></noscript>
+					<?php echo Translate::t ('no'); ?><noscript> - <b><?php echo Translate::t ('javascript_should_be_activated'); ?></b></noscript>
 				</label>
 			</div>
 		</div>
 
 		<div class="form-group">
-			<label class="group-name">Article automatiquement marqué comme lu lorsque</label>
+			<label class="group-name"><?php echo Translate::t ('auto_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="yes"<?php echo $this->conf->markWhenArticle () == 'yes' ? ' checked="checked"' : ''; ?> />
-					l'article est sélectionné
+					<?php echo Translate::t ('article_selected'); ?>
 				</label>
 				<label class="checkbox" for="check_open_site">
 					<input type="checkbox" name="mark_open_site" id="check_open_site" value="yes"<?php echo $this->conf->markWhenSite () == 'yes' ? ' checked="checked"' : ''; ?> />
-					l'article est ouvert sur le site d'origine
+					<?php echo Translate::t ('article_open_on_website'); ?>
 				</label>
 				<label class="checkbox" for="check_open_page">
 					<input type="checkbox" name="mark_open_page" id="check_open_page" value="yes"<?php echo $this->conf->markWhenPage () == 'yes' ? ' checked="checked"' : ''; ?> />
-					la page est chargée
+					<?php echo Translate::t ('page_loaded'); ?>
 				</label>
 			</div>
 		</div>
 
-		<legend>Partage</legend>
+		<legend><?php echo Translate::t ('sharing'); ?></legend>
 		<div class="form-group">
-			<label class="group-name" for="shaarli">Votre Shaarli</label>
+			<label class="group-name" for="shaarli"><?php echo Translate::t ('your_shaarli'); ?></label>
 			<div class="group-controls">
-				<input type="text" id="shaarli" name="shaarli" value="<?php echo $this->conf->urlShaarli (); ?>" placeholder="Laissez vide pour désactiver"/>
+				<input type="text" id="shaarli" name="shaarli" value="<?php echo $this->conf->urlShaarli (); ?>" placeholder="<?php echo Translate::t ('blank_to_disable'); ?>"/>
 			</div>
 		</div>
 
 		<div class="form-group form-actions">
 			<div class="group-controls">
-				<button type="submit" class="btn btn-important">Valider</button>
-				<button type="reset" class="btn">Annuler</button>
+				<button type="submit" class="btn btn-important"><?php echo Translate::t ('save'); ?></button>
+				<button type="reset" class="btn"><?php echo Translate::t ('cancel'); ?></button>
 			</div>
 		</div>
 	</form>

+ 21 - 21
app/views/configure/feed.phtml

@@ -2,35 +2,35 @@
 
 <?php if ($this->flux) { ?>
 <div class="post">
-	<a href="<?php echo _url ('index', 'index'); ?>">← Retour à vos flux RSS</a>
+	<a href="<?php echo _url ('index', 'index'); ?>"><?php echo Translate::t ('back_to_rss_feeds'); ?></a>
 
 	<h1><?php echo $this->flux->name (); ?></h1>
 	<?php echo $this->flux->description (); ?>
 
 	<form method="post" action="<?php echo _url ('configure', 'feed', 'id', $this->flux->id ()); ?>">
-		<legend>Informations</legend>
+		<legend><?php echo Translate::t ('informations'); ?></legend>
 		<div class="form-group">
-			<label class="group-name">URL du site</label>
+			<label class="group-name"><?php echo Translate::t ('website_url'); ?></label>
 			<div class="group-controls">
 				<span class="control"><a target="_blank" href="<?php echo $this->flux->website (); ?>"><?php echo $this->flux->website (); ?></a></span>
 			</div>
 		</div>
 		<div class="form-group">
-			<label class="group-name">URL du flux</label>
+			<label class="group-name"><?php echo Translate::t ('feed_url'); ?></label>
 			<div class="group-controls">
 				<span class="control"><a target="_blank" href="<?php echo $this->flux->url (); ?>"><?php echo $this->flux->url (); ?></a></span>
 			</div>
 		</div>
 		<div class="form-group">
-			<label class="group-name">Nombre d'articles</label>
+			<label class="group-name"><?php echo Translate::t ('number_articles'); ?></label>
 			<div class="group-controls">
 				<span class="control"><?php echo $this->flux->nbEntries (); ?></span>
 			</div>
 		</div>
 
-		<legend>Catégorie - <a href="<?php echo _url ('configure', 'categorize'); ?>">gestion</a></legend>
+		<legend><?php echo Translate::t ('category'); ?> - <a href="<?php echo _url ('configure', 'categorize'); ?>"><?php echo Translate::t ('categories_management'); ?></a></legend>
 		<div class="form-group">
-			<label class="group-name">Ranger dans une catégorie</label>
+			<label class="group-name"><?php echo Translate::t ('categorize'); ?></label>
 			<div class="group-controls">
 				<?php foreach ($this->categories as $cat) { ?>
 				<label class="radio" for="cat_<?php echo $cat->id (); ?>">
@@ -41,46 +41,46 @@
 			</div>
 		</div>
 
-		<legend>Avancé</legend>
+		<legend><?php echo Translate::t ('advanced'); ?></legend>
 		<div class="form-group">
-			<label class="group-name" for="priority">Afficher dans le flux principal</label>
+			<label class="group-name" for="priority"><?php echo Translate::t ('show_in_all_flux'); ?></label>
 			<div class="group-controls">
 				<label class="checkbox" for="priority">
 					<input type="checkbox" name="priority" id="priority" value="10"<?php echo $this->flux->priority () > 0 ? ' checked="checked"' : ''; ?> />
-					Oui
+					<?php echo Translate::t ('yes'); ?>
 				</label>
 			</div>
 		</div>
 		<div class="form-group">
-			<label class="group-name" for="path_entries">Chemin CSS des articles sur le site d'origine</label>
+			<label class="group-name" for="path_entries"><?php echo Translate::t ('css_path_on_website'); ?></label>
 			<div class="group-controls">
-				<input type="text" name="path_entries" id="path_entries" value="<?php echo $this->flux->pathEntries (); ?>" placeholder="Laissez vide pour désactiver" />
-				<i class="icon i_help"></i> Permet de récupérer les flux tronqués (attention, demande plus de temps !)
+				<input type="text" name="path_entries" id="path_entries" value="<?php echo $this->flux->pathEntries (); ?>" placeholder="<?php echo Translate::t ('blank_to_disable'); ?>" />
+				<i class="icon i_help"></i> <?php echo Translate::t ('retrieve_truncated_feeds'); ?>
 			</div>
 		</div>
 <!--
 		<div class="form-group">
-			<label class="group-name" for="http_user">Username HTTP</label>
+			<label class="group-name" for="http_user"><?php echo Translate::t ('http_username'); ?></label>
 			<div class="group-controls">
-				<input type="text" name="http_user" id="http_user" value="Pas encore implémenté" />
-				<i class="icon i_help"></i> La connexion permet d'accéder aux flux protégés par une authentification HTTP
+				<input type="text" name="http_user" id="http_user" value="<?php echo Translate::t ('not_yet_implemented'); ?>" />
+				<i class="icon i_help"></i> <?php echo Translate::t ('access_protected_feeds'); ?>
 			</div>
 
-			<label class="group-name" for="http_pass">Password HTTP</label>
+			<label class="group-name" for="http_pass"><?php echo Translate::t ('http_password'); ?></label>
 			<div class="group-controls">
-				<input type="text" name="http_pass" id="http_pass" value="Pas encore implémenté" />
+				<input type="text" name="http_pass" id="http_pass" value="<?php echo Translate::t ('not_yet_implemented'); ?>" />
 			</div>
 		</div>
 -->
 
 		<div class="form-group form-actions">
 			<div class="group-controls">
-				<button class="btn btn-important">Valider</button>
-				<button class="btn btn-attention" formaction="<?php echo Url::display (array ('c' => 'feed', 'a' => 'delete', 'params' => array ('id' => $this->flux->id ()))); ?>">Supprimer</button>
+				<button class="btn btn-important"><?php echo Translate::t ('save'); ?></button>
+				<button class="btn btn-attention" formaction="<?php echo Url::display (array ('c' => 'feed', 'a' => 'delete', 'params' => array ('id' => $this->flux->id ()))); ?>"><?php echo Translate::t ('delete'); ?></button>
 			</div>
 		</div>
 	</form>
 </div>
 <?php } else { ?>
-<div class="alert"><span class="alert-head">Aucun flux sélectionné.</span> Pensez à en ajouter !</div>
+<div class="alert"><span class="alert-head"><?php echo Translate::t ('no_selected_feed'); ?></span> <?php echo Translate::t ('think_to_add'); ?></div>
 <?php } ?>

+ 6 - 6
app/views/configure/importExport.phtml

@@ -14,12 +14,12 @@
 <?php $this->partial ('aside_feed'); ?>
 
 <div class="post ">
-	<a href="<?php echo _url ('index', 'index'); ?>">← Retour à vos flux RSS</a>
+	<a href="<?php echo _url ('index', 'index'); ?>"><?php echo Translate::t ('back_to_rss_feeds'); ?></a>
 
 	<form method="post" action="<?php echo Url::display (array ('c' => 'configure', 'a' => 'importExport', 'params' => array ('q' => 'import'))); ?>" enctype="multipart/form-data">
-		<legend>Import / export au format OPML</legend>
+		<legend><?php echo Translate::t ('import_export_opml'); ?></legend>
 		<div class="form-group">
-			<label class="group-name" for="file">Fichier à importer</label>
+			<label class="group-name" for="file"><?php echo Translate::t ('file_to_import'); ?></label>
 			<div class="group-controls">
 				<input type="file" name="file" id="file" />
 			</div>
@@ -27,9 +27,9 @@
 
 		<div class="form-group form-actions">
 			<div class="group-controls">
-				<button type="submit" class="btn btn-important">Importer</button>
-				ou
-				<a target="_blank" class="btn btn-important" href="<?php echo _url ('configure', 'importExport', 'q', 'export'); ?>">Exporter</a>
+				<button type="submit" class="btn btn-important"><?php echo Translate::t ('import'); ?></button>
+				<?php echo Translate::t ('or'); ?>
+				<a target="_blank" class="btn btn-important" href="<?php echo _url ('configure', 'importExport', 'q', 'export'); ?>"><?php echo Translate::t ('export'); ?></a>
 			</div>
 		</div>
 	</form>

+ 15 - 15
app/views/configure/shortcut.phtml

@@ -1,7 +1,7 @@
 <?php $this->partial ('aside_configure'); ?>
 
 <div class="post">
-	<a href="<?php echo _url ('index', 'index'); ?>">← Retour à vos flux RSS</a>
+	<a href="<?php echo _url ('index', 'index'); ?>"><?php echo Translate::t ('back_to_rss_feeds'); ?></a>
 
 	<datalist id="keys">
 		<?php foreach ($this->list_keys as $key) { ?>
@@ -12,57 +12,57 @@
 	<?php $s = $this->conf->shortcuts (); ?>
 
 	<form method="post" action="<?php echo _url ('configure', 'shortcut'); ?>">
-		<legend>Gestion des raccourcis</legend>
+		<legend><?php echo Translate::t ('shortcuts_management'); ?></legend>
 
-		<noscript><b>Le javascript doit être activé pour pouvoir profiter des raccourcis</b></noscript>
+		<noscript><p class="alert alert-error"><?php echo Translate::t ('javascript_for_shortcuts'); ?></p></noscript>
 
 		<div class="form-group">
-			<label class="group-name" for="mark_read">Marquer l'article comme lu</label>
+			<label class="group-name" for="mark_read"><?php echo Translate::t ('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']; ?>" />
-				+ <code>shift</code> pour marquer tous les articles comme non lus
+				<?php echo Translate::t ('shift_for_all_read'); ?>
 			</div>
 		</div>
 
 		<div class="form-group">
-			<label class="group-name" for="mark_favorite">Mettre l'article  en favori</label>
+			<label class="group-name" for="mark_favorite"><?php echo Translate::t ('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">Voir l'article sur le site d'origine</label>
+			<label class="group-name" for="go_website"><?php echo Translate::t ('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="next_entry">Passer à l'article suivant</label>
+			<label class="group-name" for="next_entry"><?php echo Translate::t ('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']; ?>" />
-				+ <code>shift</code> pour passer au dernier article de la page
+				<?php echo Translate::t ('shift_for_last'); ?>
 			</div>
 		</div>
 
 		<div class="form-group">
-			<label class="group-name" for="prev_entry">Passer à l'article précédent</label>
+			<label class="group-name" for="prev_entry"><?php echo Translate::t ('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']; ?>" />
-				+ <code>shift</code> pour passer au premier article de la page
+				<?php echo Translate::t ('shift_for_first'); ?>
 			</div>
 		</div>
 
 		<div class="form-group">
-			<label class="group-name" for="next_page">Passer à la page suivante</label>
+			<label class="group-name" for="next_page"><?php echo Translate::t ('next_page'); ?></label>
 			<div class="group-controls">
 				<input type="text" id="next_page" name="shortcuts[next_page]" list="keys" value="<?php echo $s['next_page']; ?>" />
 			</div>
 		</div>
 
 		<div class="form-group">
-			<label class="group-name" for="prev_page">Passer à la page précédente</label>
+			<label class="group-name" for="prev_page"><?php echo Translate::t ('previous_page'); ?></label>
 			<div class="group-controls">
 				<input type="text" id="prev_page" name="shortcuts[prev_page]" list="keys" value="<?php echo $s['prev_page']; ?>" />
 			</div>
@@ -70,8 +70,8 @@
 
 		<div class="form-group form-actions">
 			<div class="group-controls">
-				<button type="submit" class="btn btn-important">Sauvegarder</button>
-				<button type="reset" class="btn">Annuler</button>
+				<button type="submit" class="btn btn-important"><?php echo Translate::t ('save'); ?></button>
+				<button type="reset" class="btn"><?php echo Translate::t ('cancel'); ?></button>
 			</div>
 		</div>
 	</form>

+ 12 - 12
app/views/entry/note.phtml

@@ -1,37 +1,37 @@
 <?php $this->partial ('aside_flux'); ?>
 
 <div class="post">
-	<a href="<?php echo _url ('index', 'index'); ?>">← Retour à vos flux RSS</a>
+	<a href="<?php echo _url ('index', 'index'); ?>"><?php echo Translate::t ('back_to_rss_feeds'); ?></a>
 
 	<form method="post" action="<?php echo _url ('entry', 'note', 'id', $this->entry->id ()); ?>">
-		<legend>Note</legend>
+		<legend><?php echo Translate::t ('note'); ?></legend>
 
 		<div class="form-group">
-			<label class="group-name" for="note">Ajouter une note</label>
+			<label class="group-name" for="note"><?php echo Translate::t ('add_note'); ?></label>
 			<div class="group-controls">
 				<textarea rows="5" cols="80" name="note" id="note"><?php echo $this->entry->notes (); ?></textarea>
 			</div>
 		</div>
 		<div class="form-group">
-			<label class="group-name" for="public_note">Article public ?</label>
+			<label class="group-name" for="public_note"><?php echo Translate::t ('ask_public_article'); ?></label>
 			<div class="group-controls">
 				<label class="checkbox" for="public">
-					<input type="checkbox" name="public" id="public" value="yes"<?php echo $this->entry->isPublic () ? ' checked="checked"' : ''; ?> /> Oui
+					<input type="checkbox" name="public" id="public" value="yes"<?php echo $this->entry->isPublic () ? ' checked="checked"' : ''; ?> /> <?php echo Translate::t ('yes'); ?>
 				</label>
 			</div>
 		</div>
 
 		<div class="form-group form-actions">
 			<div class="group-controls">
-				<button type="submit" class="btn btn-important">Sauvegarder</button>
-				<button type="reset" class="btn">Annuler</button>
+				<button type="submit" class="btn btn-important"><?php echo Translate::t ('save'); ?></button>
+				<button type="reset" class="btn"><?php echo Translate::t ('cancel'); ?></button>
 			</div>
 		</div>
 
-		<legend>Article</legend>
+		<legend><?php echo Translate::t ('article'); ?></legend>
 
 		<div class="form-group">
-			<label class="group-name">Titre</label>
+			<label class="group-name"><?php echo Translate::t ('title'); ?></label>
 			<div class="group-controls">
 				<span class="control"><a href="<?php echo $this->entry->link (); ?>"><?php echo $this->entry->title (); ?></a></span>
 			</div>
@@ -41,7 +41,7 @@
 		$author = $this->entry->author ();
 		if ($author) { ?>
 		<div class="form-group">
-			<label class="group-name">Auteur</label>
+			<label class="group-name"><?php echo Translate::t ('author'); ?></label>
 			<div class="group-controls">
 				<span class="control"><?php echo $author; ?></span>
 			</div>
@@ -49,14 +49,14 @@
 		<?php } ?>
 
 		<div class="form-group">
-			<label class="group-name">Date de publication</label>
+			<label class="group-name"><?php echo Translate::t ('publication_date'); ?></label>
 			<div class="group-controls">
 				<span class="control"><?php echo $this->entry->date (); ?></span>
 			</div>
 		</div>
 
 		<div class="form-group">
-			<label class="group-name">Article</label>
+			<label class="group-name"><?php echo Translate::t ('article'); ?></label>
 			<div class="group-controls">
 				<span class="control"><?php echo $this->entry->content (); ?></span>
 			</div>

+ 5 - 2
app/views/error/index.phtml

@@ -1,7 +1,10 @@
 <div class="post">
-	<div class="alert">
+	<div class="alert alert-error">
 		<h1 class="alert-head"><?php echo $this->code; ?></h1>
 
-		<p><a href="<?php echo Url::display (); ?>">Revenir à l'accueil</a></p>
+		<p>
+			<?php echo Translate::t ('page_not_found'); ?><br />
+			<a href="<?php echo _url ('index', 'index'); ?>"><?php echo Translate::t ('back_to_rss_feeds'); ?></a>
+		</p>
 	</div>
 </div>

+ 12 - 2
app/views/helpers/pagination.phtml

@@ -2,13 +2,23 @@
 	$c = Request::controllerName ();
 	$a = Request::actionName ();
 	$params = Request::params ();
+
+	$conf = new RSSConfiguration ();
+	$order = Session::param ('order', $conf->sortOrder ());
+	if ($order == 'low_to_high') {
+		$first_link = Translate::t ('newer');
+		$second_link = Translate::t ('older');
+	} else {
+		$first_link = Translate::t ('older');
+		$second_link = Translate::t ('newer');
+	}
 ?>
 
 <ul class="pagination">
 	<li class="item pager-previous">
 	<?php if ($this->currentPage > 1) { ?>
 	<?php $params[$getteur] = $this->currentPage - 1; ?>
-	<a href="<?php echo Url::display (array ('c' => $c, 'a' => $a, 'params' => $params)); ?>">‹ plus récents</a>
+	<a href="<?php echo Url::display (array ('c' => $c, 'a' => $a, 'params' => $params)); ?>">‹ <?php echo $first_link ?></a>
 	<?php } else { ?>
 	&nbsp;
 	<?php } ?>
@@ -19,7 +29,7 @@
 	<li class="item pager-next">
 	<?php if ($this->currentPage < $this->nbPage) { ?>
 	<?php $params[$getteur] = $this->currentPage + 1; ?>
-	<a href="<?php echo Url::display (array ('c' => $c, 'a' => $a, 'params' => $params)); ?>">plus anciens ›</a>
+	<a href="<?php echo Url::display (array ('c' => $c, 'a' => $a, 'params' => $params)); ?>"><?php echo $second_link; ?> ›</a>
 	<?php } else { ?>
 	&nbsp;
 	<?php } ?>

+ 1 - 1
app/views/helpers/rss.phtml

@@ -3,7 +3,7 @@
 	<channel>
 		<title><?php echo View::title(); ?></title>
 		<link><?php echo Url::display(); ?></link>
-		<description>Flux RSS de <?php echo View::title(); ?></description>
+		<description><?php echo Translate::t ('rss_feeds_of', View::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 _url ('index', 'index', 'output', 'rss'); ?>" rel="self" type="application/rss+xml" />

+ 12 - 12
app/views/index/about.phtml

@@ -1,24 +1,24 @@
 <div class="post content">
-	<a href="<?php echo _url ('index', 'index'); ?>">← Retour à vos flux RSS</a>
+	<a href="<?php echo _url ('index', 'index'); ?>"><?php echo Translate::t ('back_to_rss_feeds'); ?></a>
 
-	<h1>À propos de FreshRSS</h1>
+	<h1><?php echo Translate::t ('about_freshrss'); ?></h1>
 
 	<dl class="infos">
-		<dt>Url du projet</dt>
+		<dt><?php echo Translate::t ('project_website'); ?></dt>
 		<dd><a href="https://github.com/marienfressinaud/FreshRSS">https://github.com/marienfressinaud/FreshRSS</a></dd>
 
-		<dt>Développeur principal</dt>
-		<dd><a href="mailto:contact@marienfressinaud.fr">Marien Fressinaud</a> - <a href="http://marienfressinaud.fr">site Internet</a></dd>
+		<dt><?php echo Translate::t ('lead_developer'); ?></dt>
+		<dd><a href="mailto:contact@marienfressinaud.fr">Marien Fressinaud</a> - <a href="http://marienfressinaud.fr"><?php echo Translate::t ('website'); ?></a></dd>
 
-		<dt>Pour les rapports de bugs</dt>
-		<dd><a href="https://github.com/marienfressinaud/FreshRSS/issues">sur Github</a> ou <a href="mailto:dev@marienfressinaud.fr">par mail</a></dd>
+		<dt><?php echo Translate::t ('bugs_reports'); ?></dt>
+		<dd><?php echo Translate::t ('github_or_email'); ?></dd>
 
-		<dt>Licence</dt>
-		<dd><a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a></dd>
+		<dt><?php echo Translate::t ('license'); ?></dt>
+		<dd><?php echo Translate::t ('agpl3'); ?></dd>
 	</dl>
 
-	<p>FreshRSS est un agrégateur de flux RSS à auto-héberger à l'image de <a href="http://rsslounge.aditu.de/">RSSLounge</a>, <a href="http://tt-rss.org/redmine/projects/tt-rss/wiki">TinyTinyRSS</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. L'objectif étant d'offrir une alternative sérieuse au futur feu-Google Reader.</p>
+	<p><?php echo Translate::t ('freshrss_description'); ?></p>
 
-	<h1>Crédits</h1>
-	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.
+	<h1><?php echo Translate::t ('credits'); ?></h1>
+	<p><?php echo Translate::t ('credits_content'); ?></p>
 </div>

+ 13 - 14
app/views/index/index.phtml

@@ -22,13 +22,13 @@ if (isset ($this->entryPaginator)) {
 	<?php foreach ($items as $item) { ?>
 
 	<?php if ($display_today && $item->isDay (Days::TODAY)) { ?>
-	<div class="day">Aujourd'hui - <?php echo timestamptodate (time (), false); ?></div>
+	<div class="day"><?php echo Translate::t ('today'); ?> - <?php echo timestamptodate (time (), false); ?></div>
 	<?php $display_today = false; } ?>
 	<?php if ($display_yesterday && $item->isDay (Days::YESTERDAY)) { ?>
-	<div class="day">Hier - <?php echo timestamptodate (time () - 86400, false); ?></div>
+	<div class="day"><?php echo Translate::t ('yesterday'); ?> - <?php echo timestamptodate (time () - 86400, false); ?></div>
 	<?php $display_yesterday = false; } ?>
 	<?php if ($display_others && $item->isDay (Days::BEFORE_YESTERDAY)) { ?>
-	<div class="day">À partir d'avant-hier</div>
+	<div class="day"><?php echo Translate::t ('before_yesterday'); ?></div>
 	<?php $display_others = false; } ?>
 
 	<div class="flux<?php echo !$item->isRead () ? ' not_read' : ''; ?><?php echo $item->isFavorite () ? ' favorite' : ''; ?>" id="flux_<?php echo $item->id (); ?>">
@@ -59,32 +59,32 @@ if (isset ($this->entryPaginator)) {
 			<div class="content">
 				<h1 class="title"><?php echo $item->title (); ?></h1>
 				<?php $author = $item->author (); ?>
-				<?php echo $author != '' ? '<div class="author">Par <em>' . $author . '</em></div>' : ''; ?>
+				<?php echo $author != '' ? '<div class="author">' . Translate::t ('by_author', $author) . '</div>' : ''; ?>
 				<?php echo $item->content (); ?>
 			</div>
 
 			<ul class="horizontal-list bottom">
 				<li class="item">
 					<?php if ($item->notes () != '') { ?>
-					<i class="icon i_note"></i> <a class="note" href="<?php echo _url ('entry', 'note', 'id', $item->id ()); ?>">Modifier votre note</a>
+					<i class="icon i_note"></i> <a class="note" href="<?php echo _url ('entry', 'note', 'id', $item->id ()); ?>"><?php echo Translate::t ('update_note'); ?></a>
 					<?php } else { ?>
-					<i class="icon i_note_empty"></i> <a class="note" href="<?php echo _url ('entry', 'note', 'id', $item->id ()); ?>">Ajouter une note</a>
+					<i class="icon i_note_empty"></i> <a class="note" href="<?php echo _url ('entry', 'note', 'id', $item->id ()); ?>"><?php echo Translate::t ('add_note'); ?></a>
 					<?php } ?>
 				</li>
 				<li class="item">
 					<div class="dropdown">
 						<div id="dropdown-share-<?php echo $item->id ();?>" class="dropdown-target"></div>
-						<i class="icon i_share"></i> <a class="dropdown-toggle" href="#dropdown-share-<?php echo $item->id ();?>">Partager</a>
+						<i class="icon i_share"></i> <a class="dropdown-toggle" href="#dropdown-share-<?php echo $item->id ();?>"><?php echo Translate::t ('share'); ?></a>
 
 						<ul class="dropdown-menu">
 							<li class="dropdown-close"><a href="#close"><i class="icon i_close"></i></a></li>
 
-							<li class="item"><a href="mailto:?subject=<?php echo $item->title (); ?>&amp;body=J'ai trouvé cet article intéressant, tu peux le lire à cette adresse : <?php echo urlencode($item->link ()); ?>">Par mail</a></li>
+							<li class="item"><a href="mailto:?subject=<?php echo $item->title (); ?>&amp;body=J'ai trouvé cet article intéressant, tu peux le lire à cette adresse : <?php echo urlencode($item->link ()); ?>"><?php echo Translate::t ('by_email'); ?></a></li>
 							<?php
 							$shaarli = $this->conf->urlShaarli ();
 							if ($shaarli) {
 							?>
-							<li class="item"><a target="_blank" href="<?php echo $shaarli . '?post=' . urlencode($item->link ()) . '&amp;title=' . urlencode ($item->title ()) . '&amp;source=bookmarklet'; ?>">Shaarli</a></li>
+							<li class="item"><a target="_blank" href="<?php echo $shaarli . '?post=' . urlencode($item->link ()) . '&amp;title=' . urlencode ($item->title ()) . '&amp;source=bookmarklet'; ?>"><?php echo Translate::t ('on_shaarli'); ?></a></li>
 							<?php } ?>
 						</ul>
 					</div>
@@ -94,12 +94,11 @@ if (isset ($this->entryPaginator)) {
 				<li class="item">
 					<div class="dropdown">
 						<div id="dropdown-tags-<?php echo $item->id ();?>" class="dropdown-target"></div>
-						<i class="icon i_tag"></i> <a class="dropdown-toggle" href="#dropdown-tags-<?php echo $item->id ();?>">Tags</a>
+						<i class="icon i_tag"></i> <a class="dropdown-toggle" href="#dropdown-tags-<?php echo $item->id ();?>"><?php echo Translate::t ('related_tags'); ?></a>
 
 						<ul class="dropdown-menu">
 							<li class="dropdown-close"><a href="#close"><i class="icon i_close"></i></a></li>
 
-							<li class="dropdown-header">Tags associés</li>
 							<?php foreach($tags as $tag) { ?>
 							<li class="item"><span><?php echo $tag; ?></span></li>
 							<?php } ?>
@@ -115,10 +114,10 @@ if (isset ($this->entryPaginator)) {
 	<?php $this->entryPaginator->render ('pagination.phtml', 'page'); ?>
 </div>
 <?php } else { ?>
-<div class="alert">
-	<span class="alert-head">Il n'y a aucun flux à afficher.</span>
+<div class="alert alert-warn">
+	<span class="alert-head"><?php echo Translate::t ('no_feed_to_display'); ?></span>
 	<?php if (Session::param ('mode', 'all') == 'not_read') { ?>
-	<a class="print_all" href="<?php echo _url ('index', 'changeMode', 'mode', 'all'); ?>">Afficher tous les articles ?</a>
+	<a class="print_all" href="<?php echo _url ('index', 'changeMode', 'mode', 'all'); ?>"><?php echo Translate::t ('show_all_articles'); ?></a>
 	<?php }	?>
 </div>
 <?php } ?>

+ 1 - 1
app/views/javascript/actualize.phtml

@@ -6,7 +6,7 @@ feeds.push ("<?php echo Url::display (array ('c' => 'feed', 'a' => 'actualize',
 function initProgressBar (init) {
 	if (init) {
 		$("body").after ("\<div id=\"actualizeProgress\" class=\"actualizeProgress\">\
-			Actualisation <span class=\"progress\">0 / " + feeds.length + "</span><br />\
+			<?php echo Translate::t ('refresh'); ?> <span class=\"progress\">0 / " + feeds.length + "</span><br />\
 			<progress id=\"actualizeProgressBar\" value=\"0\" max=\"" + feeds.length + "\"></progress>\
 		</div>");
 	} else {