diff --git a/core/bootstrap.php b/core/bootstrap.php
index 72c003da9..7023fb46b 100755
--- a/core/bootstrap.php
+++ b/core/bootstrap.php
@@ -5,13 +5,13 @@
* @file
* Functions needed for Thelia bootstrap
*/
-define('THELIA_ROOT' , rtrim(realpath(__DIR__ .'/../'),'/') . "/");
-define('THELIA_LOCAL_DIR' , THELIA_ROOT . 'local/');
-define('THELIA_CONF_DIR' , THELIA_LOCAL_DIR . 'config/');
-define('THELIA_MODULE_DIR' , THELIA_LOCAL_DIR . 'modules/');
-define('THELIA_WEB_DIR' , THELIA_ROOT . 'web/');
-define('THELIA_TEMPLATE_DIR' , THELIA_ROOT . 'templates/');
define('DS' , DIRECTORY_SEPARATOR);
+define('THELIA_ROOT' , rtrim(realpath(dirname(__DIR__)), DS) . DS);
+define('THELIA_LOCAL_DIR' , THELIA_ROOT . 'local' . DS);
+define('THELIA_CONF_DIR' , THELIA_LOCAL_DIR . 'config' . DS);
+define('THELIA_MODULE_DIR' , THELIA_LOCAL_DIR . 'modules' . DS);
+define('THELIA_WEB_DIR' , THELIA_ROOT . 'web' . DS);
+define('THELIA_TEMPLATE_DIR' , THELIA_ROOT . 'templates' . DS);
$loader = require __DIR__ . "/vendor/autoload.php";
diff --git a/core/lib/Thelia/Core/Template/Assets/AsseticHelper.php b/core/lib/Thelia/Core/Template/Assets/AsseticHelper.php
index 6892d45a8..0f3e00d54 100755
--- a/core/lib/Thelia/Core/Template/Assets/AsseticHelper.php
+++ b/core/lib/Thelia/Core/Template/Assets/AsseticHelper.php
@@ -22,13 +22,16 @@
/*************************************************************************************/
namespace Thelia\Core\Template\Assets;
+
use Assetic\AssetManager;
use Assetic\FilterManager;
use Assetic\Filter;
use Assetic\Factory\AssetFactory;
-use Assetic\Factory\Worker\CacheBustingWorker;
use Assetic\AssetWriter;
use Thelia\Model\ConfigQuery;
+use Thelia\Log\Tlog;
+use Symfony\Component\Filesystem\Filesystem;
+use Symfony\Component\Filesystem\Exception\IOException;
/**
* This class is a simple helper for generating assets using Assetic.
@@ -37,28 +40,196 @@ use Thelia\Model\ConfigQuery;
*/
class AsseticHelper
{
- /**
- * Generates assets from $asset_path in $output_path, using $filters.
- *
- * @param string $asset_path the full path to the asset file (or file collection)
- * @param string $output_path the full disk path to the output directory (shoud be visible to web server)
- * @param string $output_url the URL to the generated asset directory
- * @param string $asset_type the asset type: css, js, ... The generated files will have this extension. Pass an empty string to use the asset source extension.
- * @param array $filters a list of filters, as defined below (see switch($filter_name) ...)
- * @param boolean $debug true / false
- * @param boolean $dev_mode true / false. If true, assets are not cached and always compiled.
- * @throws \InvalidArgumentException if an invalid filter name is found
- * @return string The URL to the generated asset file.
- */
- public function asseticize($asset_path, $output_path, $output_url, $asset_type, $filters, $debug, $dev_mode = false)
- {
- $asset_name = basename($asset_path);
- $asset_dir = dirname($asset_path);
+ protected $source_file_extensions = array('less', 'js', 'coffee', 'html', 'tpl', 'htm', 'xml');
- $am = new AssetManager();
- $fm = new FilterManager();
+ /**
+ * Create a stamp form the modification time of the content of the given directory and all of its subdirectories
+ *
+ * @param string $directory ther directory name
+ * @return string the stamp of this directory
+ */
+ protected function getStamp($directory)
+ {
+ $stamp = '';
+
+ $iterator = new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($directory, \RecursiveDirectoryIterator::SKIP_DOTS),
+ \RecursiveIteratorIterator::LEAVES_ONLY);
+
+ foreach ($iterator as $file) {
+ $stamp .= $file->getMTime();
+ }
+
+ return md5($stamp);
+ }
+
+ /**
+ * Check if a file is a source asset file
+ *
+ * @param \DirectoryIterator $fileInfo
+ */
+ protected function isSourceFile(\SplFileInfo $fileInfo) {
+ return in_array($fileInfo->getExtension(), $this->source_file_extensions);
+ }
+
+ /**
+ * Recursively copy assets from the source directory to the destination
+ * directory in the web space, ommiting source files.
+ *
+ * @param string $from_directory the source
+ * @param string $to_directory the destination
+ * @throws \RuntimeException if a problem occurs.
+ */
+ protected function copyAssets(Filesystem $fs, $from_directory, $to_directory)
+ {
+ Tlog::getInstance()->addDebug("Copying assets from ", $from_directory, " to ", $to_directory);
+
+ $iterator = new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($from_directory, \RecursiveDirectoryIterator::SKIP_DOTS),
+ \RecursiveIteratorIterator::SELF_FIRST);
+
+ foreach ($iterator as $item) {
+ if ($item->isDir()) {
+ $dest_dir = $to_directory . DS . $iterator->getSubPathName();
+
+ if (! is_dir($dest_dir)) {
+ if ($fs->exists($dest_dir)) {
+ $fs->remove($dest_dir);
+ }
+
+ $fs->mkdir($dest_dir, 0777);
+ }
+ }
+ // We don't copy source files
+ else if (! $this->isSourceFile($item)) {
+
+ $dest_file = $to_directory . DS . $iterator->getSubPathName();
+
+ if ($fs->exists($dest_file)) {
+ $fs->remove($dest_file);
+ }
+
+ $fs->copy($item, $dest_file);
+ }
+ }
+ }
+
+ /**
+ * Compite the assets path relative to the base template directory
+ *
+ * @param string $source_assets_directory the source directory
+ * @param string $web_assets_directory_base base directory of the web assets
+ * @return the full path of the destination directory
+ */
+ protected function getRelativeDirectoryPath($source_assets_directory, $web_assets_directory_base)
+ {
+ $source_assets_directory = realpath($source_assets_directory);
+
+ // Remove base path from asset source path to get a path relative to the template base
+ // and use it to create the destination path.
+ return str_replace(
+ realpath(THELIA_ROOT),
+ '',
+ $source_assets_directory
+ );
+ }
+
+ /**
+ * Compute the destination directory path, from the source directory and the
+ * base directory of the web assets
+ *
+ * @param string $source_assets_directory the source directory
+ * @param string $web_assets_directory_base base directory of the web assets
+ * @return the full path of the destination directory
+ */
+ protected function getDestinationDirectory($source_assets_directory, $web_assets_directory_base)
+ {
+ // Compute the absolute path of the output directory
+ return $web_assets_directory_base . $this->getRelativeDirectoryPath($source_assets_directory, $web_assets_directory_base);
+ }
+
+ /**
+ * Prepare an asset directory by checking that no changes occured in
+ * the source directory. If any change is detected, the whole asset directory
+ * is copied in the web space.
+ *
+ * @param string $source_assets_directory the full path to the source asstes directory
+ * @param string $web_assets_directory_base the base directory of the web based asset directory
+ * @throws \RuntimeException if something goes wrong.
+ */
+ public function prepareAssets($source_assets_directory, $web_assets_directory_base) {
+
+ // Compute the absolute path of the output directory
+ $to_directory = $this->getDestinationDirectory($source_assets_directory, $web_assets_directory_base);
+
+ // Get a path to the stamp file
+ $stamp_file_path = $to_directory . DS . '.source-stamp';
+
+ // Get the last stamp of source assets directory
+ $prev_stamp = @file_get_contents($stamp_file_path);
+
+ // Get the current stamp of the source directory
+ $curr_stamp = $this->getStamp($source_assets_directory);
+
+ if ($prev_stamp !== $curr_stamp) {
+
+ $fs = new Filesystem();
+
+ //FIXME: lock the stuff ?
+/*
+ $lock_file = "$web_assets_directory_base/assets-".md5($source_assets_directory)."-generation-lock.txt";
+
+ if (! $fp = fopen($lock_file, "w")) {
+ throw new IOException(sprintf('Failed to open lock file %s', $lock_file));
+ }
+
+ if (flock($fp, LOCK_EX|LOCK_NB)) { // do an exclusive lock
+*/
+ $tmp_dir = "$to_directory.tmp";
+
+ $fs->remove($tmp_dir);
+
+ // Copy the whole source dir in a temp directory
+ $this->copyAssets($fs, $source_assets_directory, $tmp_dir);
+
+ // Remove existing directory
+ if ($fs->exists($to_directory)) $fs->remove($to_directory);
+
+ // Put in place the new directory
+ $fs->rename($tmp_dir, $to_directory);
+/*
+ // Release the lock
+ flock($fp, LOCK_UN);
+
+ // Remove the lock file
+ @fclose($fp);
+
+ $fs->remove($lock_file);
+*/
+ if (false === @file_put_contents($stamp_file_path, $curr_stamp)) {
+ throw new \RuntimeException(
+ "Failed to create asset stamp file $stamp_file_path. Please check that your web server has the proper access rights to do that.");
+ }
+/* }
+ else {
+ @fclose($fp);
+ }
+*/
+ }
+ }
+
+ /**
+ * Decode the filters names, and initialize the Assetic FilterManager
+ *
+ * @param FilterManager $filterManager the Assetic filter manager
+ * @param string $filters a comma separated list of filter names
+ * @throws \InvalidArgumentException if a wrong filter is passed
+ * @return an array of filter names
+ */
+ protected function decodeAsseticFilters(FilterManager $filterManager, $filters) {
if (!empty($filters)) {
+
$filter_list = explode(',', $filters);
foreach ($filter_list as $filter_name) {
@@ -66,33 +237,33 @@ class AsseticHelper
$filter_name = trim($filter_name);
switch ($filter_name) {
- case 'less':
- $fm->set('less', new Filter\LessphpFilter());
- break;
+ case 'less':
+ $filterManager->set('less', new Filter\LessphpFilter());
+ break;
- case 'sass':
- $fm->set('sass', new Filter\Sass\SassFilter());
- break;
+ case 'sass':
+ $filterManager->set('sass', new Filter\Sass\SassFilter());
+ break;
- case 'cssembed':
- $fm->set('cssembed', new Filter\PhpCssEmbedFilter());
- break;
+ case 'cssembed':
+ $filterManager->set('cssembed', new Filter\PhpCssEmbedFilter());
+ break;
- case 'cssrewrite':
- $fm->set('cssrewrite', new Filter\CssRewriteFilter());
- break;
+ case 'cssrewrite':
+ $filterManager->set('cssrewrite', new Filter\CssRewriteFilter());
+ break;
- case 'cssimport':
- $fm->set('cssimport', new Filter\CssImportFilter());
- break;
+ case 'cssimport':
+ $filterManager->set('cssimport', new Filter\CssImportFilter());
+ break;
- case 'compass':
- $fm->set('compass', new Filter\CompassFilter());
- break;
+ case 'compass':
+ $filterManager->set('compass', new Filter\CompassFilter());
+ break;
- default:
- throw new \InvalidArgumentException("Unsupported Assetic filter: '$filter_name'");
- break;
+ default:
+ throw new \InvalidArgumentException("Unsupported Assetic filter: '$filter_name'");
+ break;
}
}
}
@@ -100,8 +271,38 @@ class AsseticHelper
$filter_list = array();
}
+ return $filter_list;
+ }
+
+ /**
+ * Generates assets from $asset_path in $output_path, using $filters.
+ *
+ * @param string $asset_path the full path to the asset file (or file collection, e.g. *.less)
+ *
+ * @param string $web_assets_directory_base the full disk path to the base assets output directory in the web space
+ * @param string $output_url the URL to the base assets output directory in the web space
+ *
+ * @param string $asset_type the asset type: css, js, ... The generated files will have this extension. Pass an empty string to use the asset source extension.
+ * @param array $filters a list of filters, as defined below (see switch($filter_name) ...)
+ *
+ * @param boolean $debug true / false
+ * @param boolean $dev_mode true / false. If true, assets are not cached and always compiled.
+ * @throws \InvalidArgumentException if an invalid filter name is found
+ * @return string The URL to the generated asset file.
+ */
+ public function asseticize($asset_path, $web_assets_directory_base, $output_url, $asset_type, $filters, $debug, $dev_mode = false)
+ {
+ $asset_name = basename($asset_path);
+ $input_directory = realpath(dirname($asset_path));
+
+ $am = new AssetManager();
+ $fm = new FilterManager();
+
+ // Get the filter list
+ $filter_list = $this->decodeAsseticFilters($fm, $filters);
+
// Factory setup
- $factory = new AssetFactory($asset_dir);
+ $factory = new AssetFactory($input_directory);
$factory->setAssetManager($am);
$factory->setFilterManager($fm);
@@ -110,113 +311,34 @@ class AsseticHelper
$factory->setDebug($debug);
- $factory->addWorker(new CacheBustingWorker('-'));
+ $asset = $factory->createAsset($asset_name, $filter_list);
- // We do not pass the filter list here, juste to get the asset file name
- $asset = $factory->createAsset($asset_name);
+ $input_directory = realpath(dirname($asset_path));
- $asset_target_path = $asset->getTargetPath();
+ $output_directory = $this->getDestinationDirectory($input_directory, $web_assets_directory_base);
- $target_file = sprintf("%s/%s", $output_path, $asset_target_path);
+ // Get the URL part from the relative path
+ $output_relative_path = $this->getRelativeDirectoryPath($input_directory, $web_assets_directory_base);
- // As it seems that assetic cannot handle a real file cache, let's do the job ourselves.
- // It works only if the CacheBustingWorker is used, as a new file name is generated for each version.
- //
- // the previous version of the file is deleted, by getting the first part of the ouput file name
- // (the one before '-'), and delete aby file beginning with the same string. Example:
- // old name: 3bc974a-dfacc1f.css
- // new name: 3bc974a-ad3ef47.css
- //
- // before generating 3bc974a-ad3ef47.css, delete 3bc974a-* files.
- //
- if ($dev_mode == true || !file_exists($target_file)) {
+ $output_relative_web_path = rtrim(str_replace('\\', '/', $output_relative_path), '/') . '/';
- if (ConfigQuery::read('process_assets', true)) {
+ $asset_target_filename = $asset->getTargetPath();
- // Delete previous version of the file
- list($commonPart, $dummy) = explode('-', $asset_target_path);
+ // This is the final name of the generated asset
+ $asset_destination_path = $output_directory . DS . $asset_target_filename;
- foreach (glob("$output_path/$commonPart-*") as $filename) {
- @unlink($filename);
- }
+ Tlog::getInstance()->addDebug("Asset destination name: ", $asset_destination_path);
- // Apply filters now
- foreach ($filter_list as $filter) {
- if ('?' != $filter[0]) {
- $asset->ensureFilter($fm->get($filter));
- }
- elseif (!$debug) {
- $asset->ensureFilter($fm->get(substr($filter, 1)));
- }
- }
+ // We generate an asset only if it does not exists, or if the asset processing is forced in development mode
+ if (! file_exists($asset_destination_path) || ($dev_mode && ConfigQuery::read('process_assets', true)) ) {
- $writer = new AssetWriter($output_path);
+ $writer = new AssetWriter($output_directory);
- $writer->writeAsset($asset);
- }
+ Tlog::getInstance()->addDebug("Writing asset to $output_directory");
+
+ $writer->writeAsset($asset);
}
- return rtrim($output_url, '/') . '/' . $asset_target_path;
- }
-
- // Create a hash of the current assets directory
- public function getStamp($directory)
- {
-
- $stamp = '';
-
- foreach (new \DirectoryIterator($directory) as $fileInfo) {
-
- if ($fileInfo->isDot()) continue;
-
- if ($fileInfo->isDir()) {
- $stamp .= $this->getStamp($fileInfo->getPathName());
- }
-
- if ($fileInfo->isFile()) {
- $stamp .= $fileInfo->getMTime();
- }
- }
-
- return $stamp;
- }
-
- public function copyAssets($from_directory, $to_directory)
- {
-
- echo "copy $from_directory to $to_directory\n";
-
- $iterator = new \RecursiveIteratorIterator(
- new \RecursiveDirectoryIterator($from_directory, \RecursiveDirectoryIterator::SKIP_DOTS),
- \RecursiveIteratorIterator::SELF_FIRST);
-
- foreach ($iterator as $item) {
- if ($item->isDir()) {
- $dest_dir = $to_directory . DIRECTORY_SEPARATOR . $iterator->getSubPathName();
-
- if (!is_dir($dest_dir)) {
- if (file_exists($dest_dir)) {
- @unlink($dest_dir);
- }
-
- if (!mkdir($dest_dir, 0777, true)) {
- throw new \RuntimeException(
- "Failed to create directory $dest_dir. Please check that your web server has the proper access rights");
- }
- }
- }
- else {
- $dest_file = $to_directory . DIRECTORY_SEPARATOR . $iterator->getSubPathName();
-
- if (file_exists($dest_file)) {
- @unlink($dest_file);
- }
-
- if (!copy($item, $dest_file)) {
- throw new \RuntimeException(
- "Failed to copy $source_file to $dest_file. Please check that your web server has the proper access rights");
- }
- }
- }
+ return rtrim($output_url, '/') . '/' . $output_relative_web_path . $asset_target_filename;
}
}
\ No newline at end of file
diff --git a/core/lib/Thelia/Core/Template/Smarty/Assets/SmartyAssetsManager.php b/core/lib/Thelia/Core/Template/Smarty/Assets/SmartyAssetsManager.php
index 7ad557256..daa204dbc 100755
--- a/core/lib/Thelia/Core/Template/Smarty/Assets/SmartyAssetsManager.php
+++ b/core/lib/Thelia/Core/Template/Smarty/Assets/SmartyAssetsManager.php
@@ -39,7 +39,7 @@ class SmartyAssetsManager
/**
* Creates a new SmartyAssetsManager instance
*
- * @param string $web_root the disk path to the web root
+ * @param string $web_root the disk path to the web root (with final /)
* @param string $path_relative_to_web_root the path (relative to web root) where the assets will be generated
* @param boolean $developmentMode true / false. If true, assets are not cached, and always generated.
*/
@@ -53,6 +53,22 @@ class SmartyAssetsManager
$this->assetic_manager = new AsseticHelper();
}
+ public function prepareAssets($assets_directory, \Smarty_Internal_Template $template) {
+
+ $tpl_dir = dirname($template->source->filepath);
+
+ $asset_dir_absolute_path = realpath($tpl_dir . DS . $assets_directory);
+
+ if ($asset_dir_absolute_path === false) throw new \Exception("Failed to get real path of '".$tpl_dir . DS . $assets_directory."'");
+
+ $modified = $this->assetic_manager->prepareAssets(
+ $asset_dir_absolute_path,
+ $this->web_root . $this->path_relative_to_web_root
+ );
+
+
+ }
+
public function computeAssetUrl($assetType, $params, \Smarty_Internal_Template $template)
{
$file = $params['file'];
@@ -66,14 +82,24 @@ class SmartyAssetsManager
$tpl_dir = dirname($tpl_path);
// Create absolute dir path
- $asset_dir = realpath($tpl_dir.'/'.dirname($file));
+ $asset_dir = realpath($tpl_dir) . DS . dirname($file);
$asset_file = basename($file);
if ($asset_dir === false) throw new \Exception("Failed to get real path of '".$tpl_dir.'/'.dirname($file)."'");
-
+/*
$url = $this->assetic_manager->asseticize(
$asset_dir.'/'.$asset_file,
- $this->web_root."/".$this->path_relative_to_web_root,
+ $this->web_root . DS . $this->path_relative_to_web_root,
+ URL::getInstance()->absoluteUrl($this->path_relative_to_web_root, null, URL::PATH_TO_FILE),// PATH only
+ $assetType,
+ $filters,
+ $debug,
+ $this->developmentMode
+ );
+*/
+ $url = $this->assetic_manager->asseticize(
+ $asset_dir . DS . $asset_file,
+ $this->web_root . $this->path_relative_to_web_root,
URL::getInstance()->absoluteUrl($this->path_relative_to_web_root, null, URL::PATH_TO_FILE /* path only */),
$assetType,
$filters,
diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/Assetic.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/Assetic.php
index 76d9e1c66..808f4a2f6 100755
--- a/core/lib/Thelia/Core/Template/Smarty/Plugins/Assetic.php
+++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/Assetic.php
@@ -34,11 +34,21 @@ class Assetic extends AbstractSmartyPlugin
public function __construct($developmentMode)
{
- $web_root = THELIA_WEB_DIR;
+ $asset_dir_from_web_root = ConfigQuery::read('asset_dir_from_web_root', 'assets');
- $asset_dir_from_web_root = ConfigQuery::read('asset_dir_from_web_root', 'assets/');
+ $this->assetManager = new SmartyAssetsManager(THELIA_WEB_DIR, $asset_dir_from_web_root, $developmentMode == 'dev');
+ }
- $this->assetManager = new SmartyAssetsManager($web_root, $asset_dir_from_web_root, $developmentMode == 'dev');
+ public function declareAssets($params, \Smarty_Internal_Template $template)
+ {
+ if (false !== $asset_dir = $this->getParam($params, 'directory', false)) {
+
+ $this->assetManager->prepareAssets($asset_dir, $template);
+
+ return '';
+ }
+
+ throw new \InvalidArgumentException('declare_assets: parameter "directory" is required');
}
public function blockJavascripts($params, $content, \Smarty_Internal_Template $template, &$repeat)
@@ -79,10 +89,11 @@ class Assetic extends AbstractSmartyPlugin
public function getPluginDescriptors()
{
return array(
- new SmartyPluginDescriptor('block' , 'stylesheets', $this, 'blockStylesheets'),
- new SmartyPluginDescriptor('block' , 'javascripts', $this, 'blockJavascripts'),
- new SmartyPluginDescriptor('block' , 'images' , $this, 'blockImages'),
- new SmartyPluginDescriptor('function', 'image' , $this, 'functionImage')
+ new SmartyPluginDescriptor('block' , 'stylesheets' , $this, 'blockStylesheets'),
+ new SmartyPluginDescriptor('block' , 'javascripts' , $this, 'blockJavascripts'),
+ new SmartyPluginDescriptor('block' , 'images' , $this, 'blockImages'),
+ new SmartyPluginDescriptor('function', 'image' , $this, 'functionImage'),
+ new SmartyPluginDescriptor('function', 'declare_assets' , $this, 'declareAssets')
);
}
}
diff --git a/templates/admin/default/I18n/fr_FR.php b/templates/admin/default/I18n/fr_FR.php
index edccca64e..4d482cb30 100755
--- a/templates/admin/default/I18n/fr_FR.php
+++ b/templates/admin/default/I18n/fr_FR.php
@@ -1,808 +1,341 @@
'Lire la suite',
- 'Back-office home' => 'Accueil administration',
- 'Thelia Back Office' => 'Thelia Back Office',
- 'Version %ver' => 'Version %ver',
- 'View site' => 'Voir le site',
- 'View shop' => 'Voir la boutique',
- 'Profil' => 'Profile',
- 'Close administation session' => 'Quitter l\'interface d\'administration',
- 'Logout' => 'Se déconnecter',
- 'Home' => 'Accueil',
- 'Customers' => 'Clients',
- 'Orders' => 'Commandes',
- 'All orders' => 'Toutes les commandes',
- 'Catalog' => 'Catalogue',
- 'Folders' => 'Dossier',
- 'Coupons' => 'Codes Promo',
- 'Configuration' => 'Configuration',
- 'Modules' => 'Modules',
- 'Search' => 'Recherche',
- 'Thelia, solution e-commerce libre' => 'Thelia, solution e-commerce libre',
- 'Dashboard' => 'Tableau de bord',
- 'Sales' => 'Ventes',
- 'New customers' => 'Nouveaux clients',
- 'First orders' => 'Premières commandes',
- 'Aborted orders' => 'Paniers abandonnés',
- 'Shop Informations' => 'Informations sur le magasin', // pas très beau
- 'Categories' => 'Catégories',
- 'Products' => 'Produits',
- 'Online products' => 'Produits en ligne',
- 'Offline products' => 'Produits hors ligne',
- 'Pending orders' => 'Commandes en attente',
- 'In process orderst' => 'Commandes en traitement', // In process orderst ATTENTION FAUTE enlever le t à ordres
- 'Shipped orders' => 'Commandes envoyées',
- 'Canceled orders' => 'Commandes annulées',
- 'Sales statistics' => 'Statistiques de vente',
- 'Today' => 'Aujourd\'hui',
- 'This month' => 'Ce mois',
- 'This year' => 'Cette année',
- 'Overall sales' => 'Total des ventes',
- 'Sales excluding shipping' => 'Ventes hors frais de port', // ou Chiffre d'affaires non?
- 'Yesterday sales' => 'Ventes de la veille',
- 'Waiting orders' => 'Commandes en attente',
- 'In process orders' => 'Commandes en traitement',
- 'Average cart' => 'Panier moyen',
- 'Previous month sales' => 'Ventes du mois précédent',
- 'Previous year sales' => 'Ventes de l\année précédente',
- 'Thelia informations' => 'Informations Thelia',
- 'Current version' => 'Version en cours',
- 'Latest version available' => 'Dernière version disponible',
- 'News' => 'Actualités',
- 'Click here' => 'Cliquez ici',
- '© Thelia 2013' => '© Thelia 2013',
- 'Édité par OpenStudio' => 'Édité par OpenStudio',
- 'Forum Thelia' => 'Forum Thelia',
- 'Contributions Thelia' => 'Contributions Thelia',
- 'Customer' => 'Client', // vraiment au singulier ?
- 'Customers list' => 'Liste des clients',
- 'Add a new Customer' => 'Ajouter un client',
- 'customer ref' => 'ref client',
- 'firstname & lastname' => 'Prénom & nom',
- 'last order' => 'Dernière commande',
- 'order amount' => 'Montant de la commande',
- 'Actions' => 'Actions',
- 'Edit this customer' => 'Modifier ce client',
- 'Send a mail to this customer' => 'Contacter ce client par mail',
- 'Delete this customer and all his orders' => 'Supprimer ce client et toutes ses commandes',
- 'Company Name' => 'Entreprise',
- 'Company' => 'Entreprise',
- 'Title' => 'Civilité',
- 'First Name' => 'Prénom',
- 'Firstname' => 'Prénom',
- 'Last Name' => 'Nom',
- 'Lastname' => 'Nom',
- 'Street Address' => 'Rue',
- 'Address' => 'Adresse',
- 'Address Line 2' => 'Adresse suite',
- 'Additional address' => 'Adresse complémentaire',
- 'Address Line 3' => 'Adresse suite',
- 'Zip code' => 'Code postal',
- 'City' => 'Ville',
- 'Country' => 'Pays',
- 'Email Address' => 'Adresse e-mail',
- 'Email address' => 'Adresse e-mail',
- 'Create a new customer' => 'Ajouter un client',
- 'Create this customer' => 'Ajouter ce client',
- 'Cancel' => 'Annuler',
- 'OK' => 'OK',
- 'Delete customer' => 'Supprimer ce client',
- 'Do you really want to delete this customer ?' => 'Voulez-vous supprimer ce client ? ',
- 'No' => 'No',
- 'Yes' => 'Yes',
- 'Thelia configuration' => 'Configuration thelia',
- 'Product catalog configuration' => 'Configuration du catalogue produit',
- 'Product templates' => 'Template produit',
- 'Product attributes' => 'Attributs produit',
- 'Product features' => 'Caractéristiques produit',
- 'Mailing templates' => 'Template e-mail',
- 'Currencies' => 'Monnaie',
- 'Taxes rules' => 'Règles de taxes',
- 'Shipping configuration' => 'Configuration du transport',
- 'Countries' => 'Pays',
- 'Shipping zones' => 'Zones de livraison',
- 'System parameters' => 'Paramètres système ',
- 'Modules activation' => 'Activation du modules',
- 'System variables' => 'Gestion des variables', // ?
- 'Administration profiles' => 'Gestion des administrateurs', //
- 'Administrators' => 'Administrateurs',
- 'Languages & URLs' => 'Langues et URLs',
- 'Mailing system' => 'Envoi des e-mails',
- 'Administration logs' => 'Gestion des logs',
- 'System logs' => 'Journal des logs',
- 'Thelia System Variables' => 'Variables Thelia',// pas sure du tout
- 'Thelia system variables' => 'Variables Thelia',
- 'Add a new variable' => 'Ajouter une variable',
- 'Save chages' => 'Enregistrer les modifications', // attention faute sur Changes
- 'Save changes' => 'Enregistrer les modifications',
- 'Purpose' => 'Objet', // ?
- 'Name' => 'Nom',
- 'Value' => 'Valeur',
- 'Action' => 'Action',
- 'Change this variable' => 'Modifier cette variable',
- 'Cancel changes and revert to original value' => 'Annuler les modifications et revenir à la version antérieure',
- 'Delete this variable' => 'Supprimer cette variable',
- 'Name *' => 'Nom *',
- 'Variable name' => 'Nom de la variable',
- 'Value *' => 'Valeur *',
- 'Variable value' => 'Valeur de la variable',
- 'Purpose *' => 'Objet *',
- 'Variable purpose' => 'Objet de la variable',
- 'English' => 'Anglais',
- 'Enter here the category name in the default language (%title)' => 'Entrer ici le nom de la catégorie dans la langue par défaut (%title)',
- 'Create a new variable' => 'Créer une nouvelle variable',
- 'Create this variable' => 'Ajouter cette variable',
- 'Delete a variable' => 'Supprimer une variable',
- 'Do you really want to delete this variable ?' => 'Voulez-vous vraiment supprimer cette variable ?',
- 'Coupon' => 'Code promo',
- 'Browse' => 'Parcourir',
- 'Coupons : ' => 'Codes promo',
- 'List' => 'Liste',
- 'Create a new coupon' => 'Créer un nouveau code promo',
- 'Enabled coupons' => 'Codes promo disponibles',
- 'Code' => 'Code',
- 'Days before expiration' => 'Jours de validité',
- 'Usage left' => 'Utilisation restante', // ???
- 'Edit' => 'Editer',
- 'Unlimited' => 'Illimité',
- 'Disabled coupons' => 'Codes désactivés',
- 'Expiration date' => 'Date de fin',
- 'Update coupon' => 'Mettre à jour le code',
- 'Update' => 'Mettre à jour',
- 'Code :' => 'Code',
- 'code' => 'code',
- 'Title :' => 'Titre',
- 'title' => 'titre',
- 'Is enabled' => 'Est valide',
- 'Is available on special offers' => 'Est valide sur les offres promotionnelles',
- 'Is cumulative' => 'Est cumulable',
- 'Is removing postage' => 'Offre les frais de port',
- 'Expiration date :' => 'Date de fin de validité',
- 'yyyy-mm-dd' => 'jjjj--mm--aa',
- 'Is unlimited' => 'Est illimité',
- 'Max usage :' => 'Utilisations max',
- 'max usage' => 'utilisations max',
- 'Type :' => 'Type',
- 'Please select a coupon type' => 'Merci d\'entrer le type de code',
- 'Amount :' => 'Montant',
- '14.50' => '14.50',
- 'Short description :' => 'Description courte',
- 'short description' => 'description court',
- 'Long description :' => 'Description longue',
- 'long description' => 'description longue',
- 'Save your modifications' => 'Enregistrer les modifications',
- 'Conditions' => 'Conditions',
- 'Delete' => 'Supprimer',
- 'And' => 'Et',
- 'Save this condition' => 'Enregistrer cette condition',
- 'Condition\'s category :' => 'Type de condition',
- 'Please select a condition category' => 'Merci d\'entrer le type de condition',
- 'Files manager' => '',//???
- 'Please retry' => 'Merci de réessayer',
- 'Please select another condition' => 'Merci de sélectionner une autre condition',
- 'Edit a customer' => 'Editer un client',
- 'Editing customer "%name"' => 'Edition du client "%name"',
- 'Edit customer thelia thelia' => '', // normal que ce soit en dur ça??
- 'Save' => ' Enregistrer',
- 'Save and close' => 'Enregistrer et fermer',
- 'Customer informations' => 'Informations client',
- 'Default address' => 'Adresse par défaut',
- 'Other addresses' => 'Autres adresses',
- 'Add a new address' => 'Ajouter une nouvelle adresse',
- 'Phone' => 'Téléphone',
- 'cell phone' => 'Tel portable',
- 'Edit this address' => 'Modifier cette adresse',
- 'Use this address by default' => 'Utiliser comme adresse par défaut',
- 'orders for this customer' => 'commandes pour ce client',
- 'Order n°' => 'Commande n° ',
- 'Date & Hour' => 'Date et heure',
- 'Amount' => 'Montant',
- 'Status' => 'Statut',
- 'Sorry, customer ID=1 was not found.' => 'Désolée, le client ID=1 n\'a pas été trouvé.',// normal le ID=1 ?
- 'Address label' => 'libellé de l\'adresse',
- 'Label' => 'Libellé',
- 'Create an address' => 'Créer une adresse',
- 'Create this address' => 'Créer cette adresse',
- 'Use address by default' => 'Utiliser comme adresse par défaut',
- 'Do you really want to use this address by default ?' => 'Voulez-vous vraiment utiliser cette adresse comme adresse par défaut ?',
- 'Delete address' => 'Supprimer l\'adresse',
- 'Do you really want to delete this address ?' => 'Voulez-vous vraiment supprimer cette adresse ? ',
- 'Edit an address' => 'Editer une adresse',
- 'Edit this order' => 'Editer cette commande ',
- 'Cancel this order' => 'Annuler cette commande',
- 'Delete an order' => 'Supprimer une commande',
- 'Do you really want to cancel this order ?' => 'Voulez-vous vraiment sup primer cette commande ? ',
- 'Edit an order' => 'Editer une commande',
- 'Ordered products' => 'Produits commandés',
- 'Invoice and Delivery' => 'Livraison et facturation',
- 'Cart' => 'Panier',
- 'Product' => 'Produit',
- 'Unit. price' => 'Prix unitaire',
- 'Tax' => 'Taxes',
- 'Unit taxed price' => 'Prix unitaire TTC', // ?
- 'Quantity' => 'Quantité',
- 'Taxed total' => 'Montant total des taxes',
- 'Total without discount' => 'Montant total hors remises',
- 'Discount' => 'Remise',
- 'Coupon code' => 'Code promo',
- 'Total including discount' => 'Total avec remise',
- 'Postage' => 'Frais de livraison',
- 'Total' => 'Total',
- 'Payment information' => 'Informations de paiement',
- 'Payment module' => 'Module de paiement',
- 'Transaction reference' => 'Référence de la transaction',
- 'Delivery module' => 'Module de livraison',
- 'tracking reference' => 'Reference Tracking',
- 'Description' => 'Description',
- 'Invoice informations' => 'Informations de facturation',
- 'Download invoice as PDF' => 'Télécharger la facture au format PDF',
- 'PDF | Invoice' => 'Facure PDF',
- 'Edit invoice address' => 'Editer l\'adresse de facturation',
- 'Invoice reference' => 'Facture ref',//
- 'Invoice date' => 'Facture date',//
- 'Street address' => 'Adresse',
- 'Delivery address' => 'Adresse de livraison',
- 'Download purchase order as PDF' => 'Télécharger le bon de commande au format PDF',
- 'PDF | Purchase order' => 'Bon de commande PDF',
- 'Edit delivery address' => 'Editer l\'adresse de livraison',
- 'Compagny' => 'Entreprise', // faute
- 'Edit order address' => 'Editer l\'adresse de commande ', // ?
- 'Confirm changes' => 'Valider les modifications',
- 'Top level categories' => 'Catégories de niveau 1 ',
- 'Add a new category' => 'Ajouter une catégorie',
- 'ID' => 'ID',
- 'Category title' => 'Titre de la catégorie',
- 'Online' => 'En ligne',
- 'Position' => 'Position',
- 'Browse this category' => 'Parcourir cette catégorie',
- 'Edit this category' => 'Editer cette catégorie',
- 'Delete this category and all its contents' => 'Supprimer cette catégorie et tout ce qu\'elle contient ? ',
- 'This category has no sub-categories. To create a new one, click the + button above.' => 'Cette catégorie n\'a pas de sous-catégorie. Pour en créer une nouvelle, cliquez sur le bouton + ci-dessus.',
- 'This category has no sub-categories.' => 'Cette catégorie n\'a pas de sous-catégorie.',
- 'Top level Products' => 'Produits mis en avant',// ?
- 'Add a new product' => 'Ajouter un nouveau produit',
- 'Reference' => 'Reference',
- 'Product title' => 'Titre du produit',
- 'This category doesn\'t contains any products. To add a new product, click the + button above.' => 'Cette catégorie n\'a aucun produit. Pour créer un nouveau product, cliques sur le bouton + ci-dessus. ', // attention faute : doesn't contain pas contains
- 'Create a new category' => 'Créer une catégorie',
- 'Create this category' => 'Créer cette catégorie',
- 'Enter here the product reference' => 'Entrez ici la nouvelle référence produit',
- 'Enter here the product name in the default language (%title)' => 'Entrez ici le nom du produit dans la langue par défaut (%title)',
- 'Product price' => 'Prix du produit',
- 'Enter here the product price in the default currency (%title)' => 'ntrez ici le prix du produit dans la langue par défaut (%title)',
- 'Select a tax tule' => 'Sélectionnez une règle de taxes',
- 'Select here the tax applicable to this product' => 'Sélectionnez ici la taxe applicable sur ce produit',
- 'Product weight' => 'Poids du produit',
- 'Kg' => 'Kg',
- 'Enter here the product weight, in Kilogrammes' => 'Entrez ici le poids du produit, en Kilogrammes',
- 'Create a new product' => 'Créer un nouveau produit',
- 'Create this product' => 'Créer ce produit',
- 'Delete category' => 'Supprimer cette catégorie',
- 'Do you really want to delete this category and all its content ?' => 'Voulez-vous vraiment supprimer cette catégorie et tout ce qu\'elle contient ?',
- 'Delete product' => 'Supprimer ce produit',
- 'Do you really want to delete this product ?' => 'Voulez-vous vraiment supprimer ce produit ?',
- 'Enter new category position' => 'Classement de la catégorie ', // ?
- 'Enter new product position' => 'Classement du produit',
- 'Edit category' => 'Editer la catégorie',
- 'Editing %cat' => 'Edition de %cat',
- 'Edit category %title' => 'Editer le titre de la catégorie : %title',
- 'Preview category page' => '',
- 'Edit next category' => '',
- 'General description' => '',
- 'Associations' => '',
- 'Images' => '',
- 'Documents' => '',
- 'Edit information in %lng' => '',
- 'Français' => '',
- 'castellano' => '',
- 'Italiano' => '',
- 'Close' => '',
- 'Category title *' => '',
- 'Summary' => '',
- 'A short description, used when a summary or an introduction is required' => '',
- 'Short description' => '',
- 'Detailed description' => '',
- 'The detailed description.' => '',
- 'Conclusion' => '',
- 'A short post-description information' => '',
- 'Short conclusion' => '',
- 'Rewriten URL *' => '',
- 'Rewritten URL' => '',
- 'Rewriten URL' => '',
- 'Parent category *' => '',
- 'Top level' => '',
- 'Visibility' => '',
- 'Category created on %date_create. Last modification: %date_change' => '',
- 'Related content' => '',
- 'You can attach here some content to this category' => '',
- 'Select a folder...' => '',
- 'Select a folder to get its content' => '',
- 'Select a folder content...' => '',
- 'Select a content and click (+) to add it to this category' => '',
- 'No available content in this folder' => '',
- 'No folders found' => '',
- 'Content title' => '',
- 'This category contains no contents' => '',
- 'Send files' => '',
- 'Drop files to upload' => '',
- 'Browse files' => '',
- 'Update this image' => '',
- 'There is no images attached to this %type.' => '',
- 'Can\'t load images, please refresh this page.' => '',
- 'There is no documents attached to this %type.' => '',
- 'Can\'t load documents, please refresh this page.' => '',
- 'Remove related content' => '',
- 'Do you really want to remove this related content ?' => '',
- '(edit)' => '',
- 'Categories in %cat' => '',
- 'Products in %cat' => '',
- 'Edit this product' => '',
- 'Delete this product' => '',
- 'Edit product' => '',
- 'Editing %title' => '',
- 'Edit product %title' => '',
- 'Preview product page' => '',
- 'General' => '',
- 'Details' => '',
- 'Attributes & Features' => '',
- 'Product reference' => '',
- 'Product title *' => '',
- 'Default product category *' => '',
- 'You can attach this product to more categories in the details tab.' => '',
- 'Product created on %date_create. Last modification: %date_change' => '',
- 'Edit prices in %curr' => '',
- 'Attribute Combinations' => '',
- 'Quickly create combinations using the combination builder' => '',
- 'Combination builder' => '',
- 'Add a new combination' => '',
- 'EAN Code' => '',
- 'Price
w/o taxes (%currency)' => '',
- 'Price
w/ taxes (%currency)' => '',
- 'Weight
(Kg)' => '',
- 'Default' => '',
- 'Sale' => '',
- 'New' => '',
- 'Sale price
w/o taxes (%currency)' => '',
- 'Sale price
w/ taxes (%currency)' => '',
- 'Delete this combination' => '',
- 'Attribute' => '',
- 'Select an attribute...' => '',
- 'Select an attribute and click (+) to view available values' => '',
- 'Select an attribute value...' => '',
- 'Select a value click (+) to add it to the combination' => '',
- 'No available value for this attribute' => '',
- 'To remove a value from the combination, select it and click "remove"' => '',
- 'Remove selected values' => '',
- 'Create a new combination' => '',
- 'Create this combination' => '',
- 'Delete a combination' => '',
- 'Do you really want to delete this combination ?' => '',
- 'Select attribute values to combine. You may enter a default value for some of the fields of the generated combinations.' => '',
- 'Price excl. taxes' => '',
- 'Combination reference' => '',
- 'Combination EAN Code' => '',
- 'Current quantity' => '',
- '0 combinations' => '',
- 'Create combinations' => '',
- 'Please wait, loading' => '',
- 'Failed to get converted prices. Please try again.' => '',
- 'Failed to get prices. Please try again.' => '',
- 'Existing combinations will be deleted. Do you want to continue ?' => '',
- 'To use features or attributes on this product, please select a product template. You can define product templates in the configuration section of the administration.' => '',
- 'Current product template' => '',
- 'Do not use a product template' => '',
- 'Apply' => '',
- 'Product Attributes' => '',
- 'You can change template attributes and their positions in the template configuration page.' => '',
- 'Attribute Name' => '',
- 'This product template does not contains any features' => '',
- 'Product Features' => '',
- 'You can change templates features and their positions in the template configuration page.' => '',
- 'Feature Name' => '',
- 'Feature value for this product' => '',
- 'Use Ctrl+click to select more than one value. You can also clear selected values.' => '',
- 'Enter here the feature value as free text' => '',
- 'Feature value' => '',
- 'Top level folders' => '',
- 'Add a new folder' => '',
- 'Folder title' => '',
- 'Browse this folder' => '',
- 'Edit this folder' => '',
- 'Delete this folder and all its contents' => '',
- 'This folder has no sub-folders. To create a new one, click the + button above.' => '',
- 'This folder has no sub-folders.' => '',
- 'Top level Contents' => '',
- 'Add a new content' => '',
- 'This folder doesn\'t contains any contents. To add a new content, click the + button above.' => '',
- 'Enter here the folder name in the default language (%title)' => '',
- 'Create a new folder' => '',
- 'Create this folder' => '',
- 'Enter here the content name in the default language (%title)' => '',
- 'Create a new content' => '',
- 'Create this content' => '',
- 'Delete folder' => '',
- 'Do you really want to delete this folder and all its content ?' => '',
- 'Delete content' => '',
- 'Do you really want to delete this content ?' => '',
- 'Enter new folder position' => '',
- 'Enter new content position' => '',
- 'An error occured' => '',
- 'Oops! An Error Occurred' => '',
- 'Go to administration home' => '',
- 'Folders in %fold' => '',
- 'Contents in %fold' => '',
- 'Edit this content' => '',
- 'Delete this content' => '',
- 'Edit content' => '',
- 'Edit content %title' => '',
- 'Preview folder page' => '',
- 'Content title *' => '',
- 'Default folder *' => '',
- 'Folder created on %date_create. Last modification: %date_change' => '',
- 'Additional Folders' => '',
- 'A content could be attached to more than one folder. Select here the additional fodlers for this content.' => '',
- 'You can change the default folder (%title) in the "General" tab.' => '',
- ' (default)' => '',
- 'Select a folder and click (+) to add it to the additional folder list' => '',
- 'No Folders found' => '',
- 'This product doesn\'t belong to any additional folder.' => '',
- 'Remove associated folder' => '',
- 'Do you really want to remove the content from this folder ?' => '',
- 'Remove the product from this category' => '',
- 'Coupon : ' => '',
- 'days left' => '',
- 'May be cumulative' => '',
- 'Won\'t remove postage' => '',
- 'Will be available on special offers' => '',
- 'Application field' => '',
- 'Do you really want to enable this element ?' => '',
- 'Confirmation' => '',
- 'Confirm' => '',
- 'Create coupon' => '',
- 'Create' => '',
- 'Please save your Coupon in oder to affect it some conditions' => '',
- 'Do you really want to delete this element ?' => '',
- 'Thelia Product Templates' => '',
- 'Thelia product templates' => '',
- 'Add a new product template' => '',
- 'Change this template' => '',
- 'Change this product template' => '',
- 'Delete this product template' => '',
- 'No product template has been created yet. Click the + button to create one.' => '',
- 'Template Name *' => '',
- 'Template title' => '',
- 'Enter here the template name in the default language (English)' => '',
- 'Create a new product template' => '',
- 'Create this product template' => '',
- 'Delete template' => '',
- 'Do you really want to delete this template ? It will be removed from all products.' => '',
- 'Select an feature...' => '',
- 'Select an feature and click (+) to add it to this template' => '',
- 'Feature title' => '',
- 'Delete this feature' => '',
- 'This template contains no features' => '',
- 'Remove feature' => '',
- 'Do you really want to remove this feature from the template ?' => '',
- 'Thelia Product Attributes' => '',
- 'Thelia product attributes' => '',
- 'Add a new product attribute' => '',
- 'Change this attribute' => '',
- 'Remove this attribute from all product templates' => '',
- 'Add this attribute to all product templates' => '',
- 'Change this product attribute' => '',
- 'Delete this product attribute' => '',
- 'No product attribute has been created yet. Click the + button to create one.' => '',
- 'Title *' => '',
- 'Attribute title' => '',
- 'Enter here the attribute name in the default language (English)' => '',
- 'Check this box if you want to add this attributes to all product templates' => '',
- 'Create a new attribute' => '',
- 'Create this attribute' => '',
- 'Delete attribute' => '',
- 'Do you really want to delete this attribute ? It will be removed from all product templates.' => '',
- 'Add to all product templates' => '',
- 'Do you really want to add this attribute to all product templates ?' => '',
- 'Remove from all product templates' => '',
- 'Do you really want to remove this attribute from all product templates ? You\'ll loose all product related data for this attribute.' => '',
- 'Enter new attribute position' => '',
- 'Edit an attribute' => '',
- 'Attributes' => '',
- 'Editing attribute "%name"' => '',
- 'Edit attribute en_US : Officiis cumque.' => '',
- 'Attribute information' => '',
- 'Attribute values' => '',
- 'Enter here all possible attribute values.' => '',
- 'Delete this value' => '',
- 'No value has been created yet. Click the + button to create one.' => '',
- 'Sorry, attribute ID=1 was not found.' => '',
- 'Enter here the value in the current edit language (English)' => '',
- 'Create a new attribute value' => '',
- 'Create this value' => '',
- 'Delete attribute value' => '',
- 'Do you really want to delete this attribute value ?' => '',
- 'Enter new value position' => '',
- 'Thelia Product Features' => '',
- 'Thelia product features' => '',
- 'Add a new product feature' => '',
- 'Change this feature' => '',
- 'Remove this feature from all product templates' => '',
- 'Add this feature to all product templates' => '',
- 'Change this product feature' => '',
- 'Delete this product feature' => '',
- 'No product feature has been created yet. Click the + button to create one.' => '',
- 'Enter here the feature name in the default language (English)' => '',
- 'Check this box if you want to add this features to all product templates' => '',
- 'Create a new feature' => '',
- 'Create this feature' => '',
- 'Delete feature' => '',
- 'Do you really want to delete this feature ? It will be removed from all product templates.' => '',
- 'Do you really want to add this feature to all product templates ?' => '',
- 'Do you really want to remove this feature from all product templates ? You\'ll loose all product related data for this feature.' => '',
- 'Enter new feature position' => '',
- 'Edit a feature' => '',
- 'Features' => '',
- 'Editing feature "%name"' => '',
- 'Edit feature en_US : Consectetur omnis.' => '',
- 'Feature information' => '',
- 'Feature values' => '',
- 'Enter here all possible feature values. To get a free text feature in product forms, don\'t add any value.' => '',
- 'Sorry, feature ID=1 was not found.' => '',
- 'Create a new feature value' => '',
- 'Delete feature value' => '',
- 'Do you really want to delete this feature value ?' => '',
- 'Thelia Mailing Templates' => '',
- 'Thelia mailing templates' => '',
- 'Add a new mailing template' => '',
- 'Change this mailing template' => '',
- 'Delete this mailing template' => '',
- 'No mailing template has been created yet. Click the + button to create one.' => '',
- 'Mailing template name' => '',
- 'Mailing template purpose' => '',
- 'Enter here the mailing template purpose in the default language (English)' => '',
- 'Create a new mailing template' => '',
- 'Create this mailing template' => '',
- 'Delete mailing template' => '',
- 'Do you really want to delete this mailing template ?' => '',
- 'Edit a mailing template' => '',
- 'Editing mailing template "%name"' => '',
- 'Edit mailing template order_confirmation' => '',
- 'Prevent mailing template modification or deletion, except for super-admin' => '',
- 'Message subject *' => '',
- 'Subject' => '',
- 'HTML Message' => '',
- 'The mailing template in HTML format.' => '',
- 'Text Message' => '',
- 'The mailing template in text-only format.' => '',
- 'Message created on %date_create. Last modification: %date_change' => '',
- 'Sorry, message ID=1 was not found.' => '',
- 'Update rates' => '',
- 'Add a new currency' => '',
- 'ISO 4217 Code' => '',
- 'More information about ISO 4217' => '',
- 'Symbol' => '',
- 'Rate in €' => '',
- 'Change this currency' => '',
- 'Delete this currency' => '',
- 'No currency has been created yet. Click the + button to create one.' => '',
- 'Currency name' => '',
- 'Enter here the currency name in the default language (English)' => '',
- 'ISO 4217 code *' => '',
- 'ISO 4217 code' => '',
- 'Symbol *' => '',
- 'Currency symbol' => '',
- 'Rate from € *' => '',
- 'Currency rate' => '',
- 'Rate' => '',
- 'The rate from Euro (Price in Euro * rate = Price in this currency)' => '',
- 'Create a new currency' => '',
- 'Create this currency' => '',
- 'Delete currency' => '',
- 'Do you really want to delete this currency ?' => '',
- 'Enter new currency position' => '',
- 'Edit a currency' => '',
- 'Editing currency "%name"' => '',
- 'Edit currency Euro' => '',
- 'Currency ISO 4217 Code' => '',
- 'The symbol, such as $, £, €...' => '',
- 'Rate from Euro' => '',
- 'Sorry, currency ID=1 was not found.' => '',
- 'In order to manges your shop taxes you can manage' => '',
- 'taxes' => '',
- 'and' => '',
- 'tax rules' => '',
- 'Taxes define the amount of money which is add to a bought product.' => '',
- 'Example :' => '',
- 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => '',
- 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => '',
- 'Tax rules are combination of different taxes.' => '',
- 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => '',
- 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => '',
- 'Taxes' => '',
- 'Create a new tax' => '',
- 'Change this tax' => '',
- 'Delete this tax' => '',
- 'Create a new tax rule' => '',
- 'Change this tax rule' => '',
- 'Set as default tax rule' => '',
- 'Delete this tax rule' => '',
- 'Type' => '',
- 'amount' => '',
- 'feature' => '',
- 'percent' => '',
- 'Delete tax' => '',
- 'Do you really want to delete this tax ?' => '',
- 'Delete tax rule' => '',
- 'Do you really want to delete this tax rule ?' => '',
- 'Edit a tax' => '',
- 'Editing tax' => '',
- 'Tax created on %date_create. Last modification: %date_change' => '',
- 'Edit a tax rule' => '',
- 'Editing tax rule' => '',
- 'Tax rule created on %date_create. Last modification: %date_change' => '',
- 'Manage taxes' => '',
- 'Choose a country' => '',
- 'Countries that have the same tax rule' => '',
- 'NONE' => '',
- 'Manage the tax rule taxes appliance order' => '',
- 'Add tax to this group' => '',
- 'Drop tax here to create a tax group' => '',
- 'Drop tax here to delete from group' => '',
- 'Tax rule taxes will be update for the following countries :' => '',
- 'uncheck all' => '',
- 'Update tax rule taxes' => '',
- 'Edit tax rule taxes' => '',
- 'Add a new country' => '',
- 'Shop' => '',
- 'N° ISO' => '',
- 'ISO Code' => '',
- 'Change this country' => '',
- 'Delete this country' => '',
- 'No country has been created yet. Click the + button to create one.' => '',
- 'Country title *' => '',
- 'Country title' => '',
- 'Country area' => '',
- 'ISO Code *' => '',
- 'Alpha code 2 *' => '',
- 'Alpha code 2' => '',
- 'Alpha code 3 *' => '',
- 'Alpha code 3' => '',
- 'Create a new country' => '',
- 'Create this country' => '',
- 'Delete country' => '',
- 'Do you really want to delete this country ?' => '',
- 'Error' => '',
- 'Impossible to change default country. Please contact your administrator or try later' => '',
- 'Edit a country' => '',
- 'Editing country "%name"' => '',
- 'Edit country ' => '',
- '' => '',//?
- 'Country short description' => '',
- 'Country description' => '',
- 'Sorry, country ID=190 was not found.' => '',
- 'Edit country Afghanistan' => '',
- 'Sorry, country ID=1 was not found.' => '',
- 'Thelia Shipping zones' => '',
- 'Change this shipping zone' => '',
- 'Edit a shipping zone' => '',
- 'Editing shipping zone "%name"' => '',
- 'Edit shipping zone %title' => '',
- 'Add' => 'Ajouter',
- 'Zones' => '',
- 'Delete this zone' => '',
- 'Remove zone' => '',
- 'Do you really want to remove this zone ?' => '',
- 'Thelia Shipping configuration' => '',
- 'Add a new shipping configuration' => '',
- 'Change this shipping configuration' => '',
- 'Delete this shipping configuration' => '',
- 'Shipping configuration name' => '',
- 'Create a new shipping configuration' => '',
- 'Create this shipping configuration' => '',
- 'Delete shipping configuration' => '',
- 'Do you really want to delete this shipping configuration ?' => '',
- 'Edit a shipping configuration' => '',
- 'Editing shipping configuration "%name"' => '',
- 'Edit shipping configuration %title' => '',
- 'Add this country' => '',
- 'No area defined with this id' => '',
- 'Remove country' => '',
- 'Do you really want to remove this country ?' => '',
- 'Classic modules' => '',
- 'classic modules' => '',
- 'Enable/Disable' => '',
- 'Deactivate %title module' => '',
- 'deactivation' => '',
- 'Edit this module' => '',
- 'Delete this module' => '',
- 'Delivery modules' => '',
- 'Payment modules' => '',
- 'Delete a module' => '',
- 'Do you really want to delete this module ?' => '',
- 'Edit a system variable' => '',
- 'Editing variable "%name"' => '',
- 'Edit variable active-template' => '',
- 'Prevent variable modification or deletion, except for super-admin' => '',
- 'Variable created on %date_create. Last modification: %date_change' => '',
- 'Sorry, variable ID=3 was not found.' => '',
- 'Profiles' => '',
- 'Create a new profile' => '',
- 'Profile Code' => '',
- 'Profile code' => '',
- 'Postscriptum' => '',
- 'Delete profile' => '',
- 'Do you really want to delete this profile ?' => '',
- 'You can\'t delete this profile' => '',
- 'They are some administrator which are linked to this profile. Please edit/remove them before deleting this profile.' => '',
- 'Create a new administrator' => '',
- 'Login' => '',
- 'FirstName' => 'Prénom',
- 'LastName' => 'Nom',
- 'Profile' => 'Profile',
- 'Superadministrator' => '',
- 'Change this administrator' => '',
- 'Password' => '',
- 'Password confirmation' => '',
- 'Leave empty to keep current password' => '',
- 'Update a new administrator' => '',
- 'Delete administrator' => '',
- 'Do you really want to delete this administrator ?' => '',
- 'You can\'t delete this administrator' => '',
- 'They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator.' => '',
- 'Thelia Languages' => '',
- 'Languages' => '',
- 'Languages management' => '',
- 'Add a new language' => '',
- 'Language name' => '',
- 'ISO 639 Code' => '',
- 'Locale' => '',
- 'date form' => '',
- 'time form' => '',
- 'Change this language' => '',
- 'Delete this language' => '',
- 'Parameters' => '',
- 'If a translation is missing or incomplete :' => '',
- 'Using a domain or subdomain for each language' => '',
- 'activate' => '',
- 'Language title' => '',
- 'language locale' => '',
- 'en_US' => 'en_US',
- 'date format' => '',
- 'd-m-Y' => 'j-m-A',
- 'time format' => '',
- 'H:i:s' => '',//?
- 'Create a new language' => '',
- 'Create this language' => '',
- 'Delete language' => '',
- 'Do you really want to delete this language ?' => '',
- 'Impossible to change default languages. Please contact your administrator or try later' => '',
- 'Edit a language' => '',
- 'Edit this language' => '',
- 'deactivate' => 'désactiver',
- 'Thelia Mailing System' => '',
- 'Configuration mailing system' => '',
- 'Enable remote SMTP use : ' => '',
- 'Host :' => 'Host',
- 'Host' => 'Host',
- 'Port :' => 'Port',
- 'Port' => 'Port',
- 'Encryption :' => '', //?
- 'Encryption' => '',
- 'Username :' => 'Nom d\'utilisateur',
- 'Username' => 'Nom d\'utilisateur',
- 'Password :' => 'Mot de passe',
- 'Auth Mode :' => '',
- // 'Auth Mode' => 'Mode auteur',
- // 'Timeout :' => 'Délai',
-// 'Timeout' => 'Délai',
- 'Source IP :' => 'IP source',
- 'Source IP' => 'IP source',
- 'Show logs' => 'Voir les loge',
- 'Period' => 'Période',
- 'From' => 'De',
- 'To' => 'A',
- 'Resources' => 'Ressources',
- 'company' => 'entreprise',
-)
-;
\ No newline at end of file
+return array(
+ 'Page not found' => 'Page non trouvée',
+ 'The server returned a "404 Not Found"' => 'Le serveur à retourné l\'erreur "404 non trouvé"',
+ 'The page you\'ve requested was not found. Please check the page address, and try again.' => 'La page que vous avez demandé n\'est pas disponible.',
+ 'Thelia Back Office' => 'Thelia Back Office',
+ 'Version %ver' => 'Version %ver',
+ 'View site' => 'Voir le site',
+ 'View shop' => 'Voir la boutique',
+ 'Profil' => 'Profile',
+ 'Close administation session' => 'Quitter l\'interface d\'administration',
+ 'Logout' => 'Se déconnecter',
+ 'Home' => 'Accueil',
+ 'Customers' => 'Clients',
+ 'Orders' => 'Commandes',
+ 'All orders' => 'Toutes les commandes',
+ 'Catalog' => 'Catalogue',
+ 'Folders' => 'Dossier',
+ 'Coupons' => 'Codes Promo',
+ 'Configuration' => 'Configuration',
+ 'Modules' => 'Modules',
+ 'Search' => 'Recherche',
+ 'Thelia, the open source e-commerce solution' => 'Thelia, solution e-commerce libre',
+ '© Thelia 2013' => '© Thelia 2013',
+ 'Published by OpenStudio' => 'Edité par OpenStudio',
+ 'Thelia support forum' => 'Communauté Thelia',
+ 'Thelia contributions' => 'Contributions Thelia',
+ 'Thelia Mailing System' => 'Configuration des envois de mails',
+ 'Administration logs' => 'Gestion des logs',
+ 'Show logs' => 'Voir les loge',
+ 'Period' => 'Période',
+ 'From' => 'De',
+ 'To' => 'A',
+ 'Administrators' => 'Administrateurs',
+ 'Resources' => 'Ressources',
+ 'Back-office users' => 'Utilisateurs du back-office',
+ 'Taxes' => 'Taxes',
+ 'Create a new administrator' => 'Créer un nouvel administrateur',
+ 'Login' => 'Connexion',
+ 'First Name' => 'Prénom',
+ 'Last Name' => 'Nom',
+ 'Profile' => 'Profile',
+ 'Actions' => 'Actions',
+ 'Superadministrator' => 'Super-administrateur',
+ 'Change this administrator' => 'Modifier cet administrateur',
+ 'Delete this administrator' => 'Supprimer cet administrateur',
+ 'FirstName' => 'Prénom',
+ 'LastName' => 'Nom',
+ 'Password' => 'Mot de passe',
+ 'Create' => 'Créer',
+ 'Cancel' => 'Annuler',
+ 'Leave empty to keep current password' => 'Laisser ce champ vide pour ne pas modifier le mot de passe',
+ 'Update a new administrator' => 'Modifier cet administrateur',
+ 'Update' => 'Mettre à jour',
+ 'Delete administrator' => 'Supprimer un administrateur',
+ 'Do you really want to delete this administrator ?' => 'Confirmez-vous la suppression de cet adminisrateur ?',
+ 'You can\'t delete this administrator' => 'Vous ne pouvez pas supprimer cet administrateur',
+ 'They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator.' => 'Cet administrateur est lié avec un ou plusieurs autres administrateurs. Supprimez ou modifiez ces administrateur d\'abord.',
+ 'Label' => 'Libellé',
+ 'Company' => 'Entreprise',
+ 'Edit a language' => 'Modifier une langue',
+ 'Edit this language' => 'Modifier cette langue',
+ 'Current product template' => 'Gabarit de produit actuel',
+ 'Do not use a product template' => 'Ne pas utiliser de gabarit',
+ 'Apply' => 'Appliquer',
+ 'Product Attributes' => 'Déclinaisons du produit',
+ 'ID' => 'ID',
+ 'Attribute Name' => 'Nom de la déclinaison',
+ 'This product template does not contains any features' => 'Ce gabarit de produit ne comporte aucune caractéristique',
+ 'Product Features' => 'Caractéristiques du produit',
+ 'Feature Name' => 'Nom de la caractéristique',
+ 'Feature value for this product' => 'Valeur de la caractéristique',
+ 'Use Ctrl+click to select more than one value. You can also clear selected values.' => 'Utilisez Ctrl+clic pour choisir plus d\'une valeur. Vous pouvez aussi tout désélectionner.',
+ 'Enter here the feature value as free text' => 'Indiquez ici la valeur de la caractéristique',
+ 'Feature value' => 'Valeur de la caractéristique',
+ 'Related content' => 'Contenu associé',
+ 'You can attach here some content to this product' => 'Attachez ici un ou plusieurs contenus à ce produit',
+ 'Select a folder...' => 'Choisissez un dossier de contenu...',
+ 'Select a folder to get its content' => 'Choisissez un dossier de contenu pour lister ses contenus',
+ 'Select a folder content...' => 'Choisissez un dossier de contenu...',
+ 'Select a content and click (+) to add it to this product' => 'Chosiissez un contenu, et cliquez [+] pour l\'attacher au produit',
+ 'No available content in this folder' => 'Ce dossier est vide de contenus',
+ 'No folders found' => 'Aucun dossier n\'a été trouvé.',
+ 'Content title' => 'Titre du contenu',
+ 'Position' => 'Position',
+ 'Delete this content' => 'Supprimer ce contenu',
+ 'Category title' => 'Titre de la catégorie',
+ 'Enter new category position' => 'Classement de la catégorie ',
+ 'Lire la suite' => 'Lire la suite',
+ 'Value' => 'Valeur',
+ 'Title' => 'Civilité',
+ 'Product attributes' => 'Attributs produit',
+ 'Categories' => 'Catégories',
+ 'Top level categories' => 'Catégories de niveau 1 ',
+ 'Add a new category' => 'Ajouter une catégorie',
+ 'Online' => 'En ligne',
+ 'Browse this category' => 'Parcourir cette catégorie',
+ 'Edit this category' => 'Editer cette catégorie',
+ 'Delete this category and all its contents' => 'Supprimer cette catégorie et tout ce qu\'elle contient ? ',
+ 'This category has no sub-categories. To create a new one, click the + button above.' => 'Cette catégorie n\'a pas de sous-catégorie. Pour en créer une nouvelle, cliquez sur le bouton + ci-dessus.',
+ 'This category has no sub-categories.' => 'Cette catégorie n\'a pas de sous-catégorie.',
+ 'Top level Products' => 'Produits mis en avant',
+ 'Add a new product' => 'Ajouter un nouveau produit',
+ 'Reference' => 'Reference',
+ 'Product title' => 'Titre du produit',
+ 'This category doesn\'t contains any products. To add a new product, click the + button above.' => 'Cette catégorie n\'a aucun produit. Pour créer un nouveau product, cliques sur le bouton + ci-dessus. ',
+ 'Name' => 'Nom',
+ 'Enter here the category name in the default language (%title)' => 'Entrer ici le nom de la catégorie dans la langue par défaut (%title)',
+ 'Create a new category' => 'Créer une catégorie',
+ 'Create this category' => 'Créer cette catégorie',
+ 'Enter here the product reference' => 'Entrez ici la nouvelle référence produit',
+ 'Enter here the product name in the default language (%title)' => 'Entrez ici le nom du produit dans la langue par défaut (%title)',
+ 'Product price' => 'Prix du produit',
+ 'Enter here the product price in the default currency (%title)' => 'ntrez ici le prix du produit dans la langue par défaut (%title)',
+ 'Select a tax tule' => 'Sélectionnez une règle de taxes',
+ 'Select here the tax applicable to this product' => 'Sélectionnez ici la taxe applicable sur ce produit',
+ 'Product weight' => 'Poids du produit',
+ 'Kg' => 'Kg',
+ 'Enter here the product weight, in Kilogrammes' => 'Entrez ici le poids du produit, en Kilogrammes',
+ 'Create a new product' => 'Créer un nouveau produit',
+ 'Create this product' => 'Créer ce produit',
+ 'Delete category' => 'Supprimer cette catégorie',
+ 'Do you really want to delete this category and all its content ?' => 'Voulez-vous vraiment supprimer cette catégorie et tout ce qu\'elle contient ?',
+ 'Delete product' => 'Supprimer ce produit',
+ 'Do you really want to delete this product ?' => 'Voulez-vous vraiment supprimer ce produit ?',
+ 'Enter new product position' => 'Classement du produit',
+ 'Edit category' => 'Editer la catégorie',
+ 'Edit category %title' => 'Editer le titre de la catégorie : %title',
+ 'Thelia configuration' => 'Configuration thelia',
+ 'Product catalog configuration' => 'Configuration du catalogue produit',
+ 'Product templates' => 'Template produit',
+ 'Product features' => 'Caractéristiques produit',
+ 'Mailing templates' => 'Template e-mail',
+ 'Currencies' => 'Monnaie',
+ 'Taxes rules' => 'Règles de taxes',
+ 'Shipping configuration' => 'Configuration du transport',
+ 'Countries' => 'Pays',
+ 'Shipping zones' => 'Zones de livraison',
+ 'System parameters' => 'Paramètres système ',
+ 'System variables' => 'Gestion des variables',
+ 'Administration profiles' => 'Gestion des administrateurs',
+ 'Languages & URLs' => 'Langues et URLs',
+ 'Mailing system' => 'Envoi des e-mails',
+ 'System logs' => 'Journal des logs',
+ 'And' => 'Et',
+ 'Edit' => 'Editer',
+ 'Delete' => 'Supprimer',
+ 'Code :' => 'Code',
+ 'code' => 'code',
+ 'Title :' => 'Titre',
+ 'title' => 'titre',
+ 'Is enabled' => 'Est valide',
+ 'Is available on special offers' => 'Est valide sur les offres promotionnelles',
+ 'Is cumulative' => 'Est cumulable',
+ 'Is removing postage' => 'Offre les frais de port',
+ 'Expiration date :' => 'Date de fin de validité',
+ 'yyyy-mm-dd' => 'jjjj--mm--aa',
+ 'Is unlimited' => 'Est illimité',
+ 'Max usage :' => 'Utilisations max',
+ 'max usage' => 'utilisations max',
+ 'Type :' => 'Type',
+ 'Please select a coupon type' => 'Merci d\'entrer le type de code',
+ 'Amount :' => 'Montant',
+ '14.50' => '14.50',
+ 'Short description :' => 'Description courte',
+ 'short description' => 'description court',
+ 'Long description :' => 'Description longue',
+ 'long description' => 'description longue',
+ 'Save your modifications' => 'Enregistrer les modifications',
+ 'Conditions' => 'Conditions',
+ 'Save this condition' => 'Enregistrer cette condition',
+ 'Condition\'s category :' => 'Type de condition',
+ 'Please select a condition category' => 'Merci d\'entrer le type de condition',
+ 'Coupon' => 'Code promo',
+ 'Coupons : ' => 'Codes promo',
+ 'Create a new coupon' => 'Créer un nouveau code promo',
+ 'Browse' => 'Parcourir',
+ 'List' => 'Liste',
+ 'Enabled coupons' => 'Codes promo disponibles',
+ 'Code' => 'Code',
+ 'Days before expiration' => 'Jours de validité',
+ 'Usage left' => 'Utilisation restante',
+ 'Unlimited' => 'Illimité',
+ 'Disabled coupons' => 'Codes désactivés',
+ 'Expiration date' => 'Date de fin',
+ 'Amount' => 'Montant',
+ 'Update coupon' => 'Mettre à jour le code',
+ 'Please retry' => 'Merci de réessayer',
+ 'Please select another condition' => 'Merci de sélectionner une autre condition',
+ 'Edit a customer' => 'Editer un client',
+ 'Editing customer "%name"' => 'Edition du client "%name"',
+ 'Customer informations' => 'Informations client',
+ 'Firstname' => 'Prénom',
+ 'Lastname' => 'Nom',
+ 'Default address' => 'Adresse par défaut',
+ 'Address' => 'Adresse',
+ 'Additional address' => 'Adresse complémentaire',
+ 'Zip code' => 'Code postal',
+ 'City' => 'Ville',
+ 'Other addresses' => 'Autres adresses',
+ 'Add a new address' => 'Ajouter une nouvelle adresse',
+ 'Phone' => 'Téléphone',
+ 'Edit this address' => 'Editer cette adresse',
+ 'Use this address by default' => 'Utiliser comme adresse par défaut',
+ 'Delete this customer and all his orders' => 'Supprimer ce client et toutes ses commandes',
+ 'orders for this customer' => 'commandes pour ce client',
+ 'Order n°' => 'Commande n° ',
+ 'Date & Hour' => 'Date et heure',
+ 'Status' => 'Etat',
+ 'Create this address' => 'Créer cette adresse',
+ 'Use address by default' => 'Utiliser comme adresse par défaut',
+ 'Do you really want to use this address by default ?' => 'Voulez-vous vraiment utiliser cette adresse comme adresse par défaut ?',
+ 'Delete address' => 'Supprimer cette adresse',
+ 'Do you really want to delete this address ?' => 'Voulez-vous vraiment supprimer cette adresse ?',
+ 'Customer' => 'Client',
+ 'Customers list' => 'Liste des clients',
+ 'Add a new Customer' => 'Ajouter un client',
+ 'Edit this customer' => 'Modifier ce client',
+ 'Send a mail to this customer' => 'Contacter ce client par mail',
+ 'Email address' => 'Adresse e-mail',
+ 'Create a new customer' => 'Ajouter un client',
+ 'Create this customer' => 'Ajouter ce client',
+ 'Delete customer' => 'Supprimer ce client',
+ 'Do you really want to delete this customer ?' => 'Voulez-vous supprimer ce client ? ',
+ 'Back' => 'Retour',
+ 'Save' => ' Enregistrer',
+ 'Description' => 'Description',
+ 'Back-office home' => 'Accueil administration',
+ 'Dashboard' => 'Tableau de bord',
+ 'Sales' => 'Ventes',
+ 'New customers' => 'Nouveaux clients',
+ 'First orders' => 'Premières commandes',
+ 'Aborted orders' => 'Paniers abandonnés',
+ 'Shop Informations' => 'Informations sur le magasin',
+ 'Products' => 'Produits',
+ 'Online products' => 'Produits en ligne',
+ 'Offline products' => 'Produits hors ligne',
+ 'Sales statistics' => 'Statistiques de vente',
+ 'Today' => 'Aujourd\'hui',
+ 'This month' => 'Ce mois',
+ 'This year' => 'Cette année',
+ 'Overall sales' => 'Total des ventes',
+ 'Sales excluding shipping' => 'Ventes hors frais de port',
+ 'Yesterday sales' => 'Ventes de la veille',
+ 'Average cart' => 'Panier moyen',
+ 'Previous month sales' => 'Ventes du mois précédent',
+ 'Previous year sales' => 'Ventes de l\année précédente',
+ 'Thelia informations' => 'Informations Thelia',
+ 'Current version' => 'Version en cours',
+ 'Latest version available' => 'Dernière version disponible',
+ 'News' => 'Actualités',
+ 'Click here' => 'Cliquez ici',
+ 'Editing %cat' => 'Edition de %cat',
+ 'No' => 'Non',
+ 'Yes' => 'Oui',
+ 'OK' => 'OK',
+ 'Save and close' => 'Enregistrer et fermer',
+ 'Quantity' => 'Quantité',
+ 'deactivate' => 'désactiver',
+ 'en_US' => 'en_US',
+ 'd-m-Y' => 'j-m-A',
+ 'Username' => 'Nom d\'utilisateur',
+ 'Host :' => 'Host',
+ 'Host' => 'Host',
+ 'Port :' => 'Port',
+ 'Port' => 'Port',
+ 'Username :' => 'Nom d\'utilisateur',
+ 'Password :' => 'Mot de passe',
+ 'Source IP :' => 'IP source',
+ 'Source IP' => 'IP source',
+ 'Variable name' => 'Nom de la variable',
+ 'Purpose' => 'Objet',
+ 'Edit an order' => 'Editer une commande',
+ 'Ordered products' => 'Produits commandés',
+ 'Invoice and Delivery' => 'Livraison et facturation',
+ 'Cart' => 'Panier',
+ 'Product' => 'Produit',
+ 'Unit. price' => 'Prix unitaire',
+ 'Tax' => 'Taxes',
+ 'Unit taxed price' => 'Prix unitaire TTC',
+ 'Taxed total' => 'Montant total des taxes',
+ 'Total without discount' => 'Montant total hors remises',
+ 'Discount' => 'Remise',
+ 'Coupon code' => 'Code promo',
+ 'Total including discount' => 'Total avec remise',
+ 'Postage' => 'Frais de livraison',
+ 'Total' => 'Total',
+ 'Payment information' => 'Informations de paiement',
+ 'Payment module' => 'Module de paiement',
+ 'Transaction reference' => 'Référence de la transaction',
+ 'Delivery module' => 'Module de livraison',
+ 'tracking reference' => 'Reference Tracking',
+ 'Invoice informations' => 'Informations de facturation',
+ 'Download invoice as PDF' => 'Télécharger la facture au format PDF',
+ 'PDF | Invoice' => 'Facure PDF',
+ 'Edit invoice address' => 'Editer l\'adresse de facturation',
+ 'Invoice reference' => 'Facture ref',
+ 'Invoice date' => 'Facture date',
+ 'Street address' => 'Adresse',
+ 'Country' => 'Pays',
+ 'Delivery address' => 'Adresse de livraison',
+ 'Download purchase order as PDF' => 'Télécharger le bon de commande au format PDF',
+ 'PDF | Purchase order' => 'Bon de commande PDF',
+ 'Edit delivery address' => 'Editer l\'adresse de livraison',
+ 'Edit order address' => 'Editer l\'adresse de commande ',
+ 'Confirm changes' => 'Valider les modifications',
+ 'Edit this order' => 'Editer cette commande ',
+ 'Cancel this order' => 'Annuler cette commande',
+ 'Delete an order' => 'Supprimer une commande',
+ 'Do you really want to cancel this order ?' => 'Voulez-vous vraiment sup primer cette commande ? ',
+ 'View' => 'Voir',
+ 'customer ref' => 'ref client',
+ 'company' => 'entreprise',
+ 'firstname & lastname' => 'Prénom & nom',
+ 'last order' => 'Dernière commande',
+ 'order amount' => 'Montant de la commande',
+ 'Add' => 'Ajouter',
+ 'Warning' => 'Attention',
+ 'Edit a system variable' => 'Modifier une variable système',
+ 'Editing variable "%name"' => 'Modification de la variable "%name" ',
+ 'Edit variable %name' => 'Modifier de la variable "%name" ',
+ 'Variable value' => 'Valeur de la variable',
+ 'Variable created on %date_create. Last modification: %date_change' => 'Variable créée le %date_create. Dernière modification: %date_change',
+ 'Sorry, variable ID=%id was not found.' => 'Désolé, la variable ID=%id n\'a pas été trouvée.',
+ 'Thelia System Variables' => 'Variables Thelia',
+ 'Thelia system variables' => 'Variables Thelia',
+ 'Add a new variable' => 'Ajouter une variable',
+ 'Save chages' => 'Enregistrer les modifications',
+ 'Save changes' => 'Enregistrer les modifications',
+ 'Action' => 'Action',
+ 'Change this variable' => 'Modifier cette variable',
+ 'Cancel changes and revert to original value' => 'Annuler les modifications et revenir à la version antérieure',
+ 'Delete this variable' => 'Supprimer cette variable',
+ 'This variable could not be changed.' => 'Cette variable ne peut pas être modifiée',
+ 'Variable purpose' => 'Objet de la variable',
+ 'Create a new variable' => 'Créer une nouvelle variable',
+ 'Create this variable' => 'Ajouter cette variable',
+ 'Delete a variable' => 'Supprimer une variable',
+ 'Do you really want to delete this variable ?' => 'Voulez-vous vraiment supprimer cette variable ?',
+);
diff --git a/templates/admin/default/admin-layout.tpl b/templates/admin/default/admin-layout.tpl
index 5a8d564e2..5649f5807 100644
--- a/templates/admin/default/admin-layout.tpl
+++ b/templates/admin/default/admin-layout.tpl
@@ -4,9 +4,12 @@
{check_auth role="ADMIN" resource="{block name="check-resource"}{/block}" access="{block name="check-access"}{/block}" login_tpl="/admin/login"}
{/block}
-{* -- Define some stuff for Smarty ----------------------------------------- *}
+{* -- Define some stuff for Smarty ------------------------------------------ *}
{config_load file='variables.conf'}
+{* -- Declare assets directory, relative to template base directory --------- *}
+{declare_assets directory='assets'}
+