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'} + @@ -22,7 +25,7 @@ {block name="before-bootstrap-css"}{/block} - {stylesheets file='assets/less/main.less' filters='less,cssembed'} + {stylesheets file='assets/less/main.less' filters='less'} {/stylesheets} diff --git a/templates/admin/default/assets/less/main.less b/templates/admin/default/assets/less/main.less index 3498441a2..6eda3fcee 100644 --- a/templates/admin/default/assets/less/main.less +++ b/templates/admin/default/assets/less/main.less @@ -2,4 +2,4 @@ @import "bootstrap/bootstrap.less"; /* Thelia Admin */ -@import "thelia/thelia.less"; \ No newline at end of file +@import "thelia/thelia.less"; diff --git a/templates/admin/default/includes/customer_address_form_fields.html b/templates/admin/default/includes/customer_address_form_fields.html index d86b7921e..5b7bba9d3 100644 --- a/templates/admin/default/includes/customer_address_form_fields.html +++ b/templates/admin/default/includes/customer_address_form_fields.html @@ -12,14 +12,14 @@ {form_field form=$form field='label'}
- +
{/form_field} {form_field form=$form field='company'}
- +
{/form_field} @@ -27,7 +27,7 @@
- {loop type="title" name="title1"} {/loop} @@ -40,7 +40,7 @@ {form_field form=$form field='firstname'}
- +
{/form_field}
@@ -48,7 +48,7 @@ {form_field form=$form field='lastname'}
- +
{/form_field} @@ -57,18 +57,18 @@ {form_field form=$form field='address1'}
- +
{form_field form=$form field='address2'} - + {/form_field}
{form_field form=$form field='address3'} - + {/form_field}
{/form_field} @@ -78,7 +78,7 @@ {form_field form=$form field='zipcode'}
- +
{/form_field} @@ -86,7 +86,7 @@ {form_field form=$form field='city'}
- +
{/form_field} @@ -95,7 +95,7 @@ {form_field form=$form field='country'}
- {loop type="country" name="country1"} {/loop} @@ -108,7 +108,7 @@ {form_field form=$form field='phone'}
- +
{/form_field}
@@ -116,9 +116,8 @@ {form_field form=$form field='cellphone'}
- +
{/form_field} - - + \ No newline at end of file diff --git a/templates/default/assets/less/styles.less b/templates/default/assets/less/styles.less index d1d9dbf56..158fbcfde 100755 --- a/templates/default/assets/less/styles.less +++ b/templates/default/assets/less/styles.less @@ -8,4 +8,4 @@ @import "thelia/import.less"; /* Theme */ -@import "../themes/default/less/import.less"; \ No newline at end of file +@import "../themes/default/less/import.less"; diff --git a/templates/default/layout.tpl b/templates/default/layout.tpl index d89694ab5..6261893d7 100644 --- a/templates/default/layout.tpl +++ b/templates/default/layout.tpl @@ -1,3 +1,5 @@ +{* Declare assets directory, relative to template base directory *} +{declare_assets directory='assets'} {block name="no-return-functions"}{/block}