Pepitoww Posted May 16, 2013 Share Posted May 16, 2013 (edited) Bonjour à tous, j'ai un petit soucis de traduction du côté de mon BO concernant un module que je développe actuellement. Mon véritable soucis concerne la page principale de mon module côté BO, c'est à dire là ou est affiché sous forme de tableau les différentes informations de ce dernier (liste des champs de la table relative au module). En effet, mes traductions des en-têtes de ce tableau ne fonctionne pas ainsi que le titre de mon module sur le fil d'arianne et pourtant tout semble normal. $this->fields_list = array( 'id' => array( 'title' => $this->l('ID'), 'width' => 20 ), 'table_get' => array( 'title' => $this->l('Table') ), 'field_champ' => array( 'title' => $this->l('Field') ), 'description_type' => array( 'title' => $this->l('Description type') ), 'type_code' => array( 'title' => $this->l('Code type') ), ); Ci dessus, l'attribut field_list de mon constructeur où j'applique la fonction $this->l sur mes en-têtes de tableau. Qui plus est, dans la section traduction, je répère effectivement mes 5 valeurs, je les traduit également mais après avoir changer de langue mes en-têtes ne sont jamais traduites malgré que le reste de mes traductions le soient. Impossible pour moi de savoir d'où cela vient, c'est pourquoi je m'adresse à la communauté Presta pour savoir si quelqu'un aurait une piste à m'indiquer. Cordialement Ps: le nom du topic a été modifié, voir mon dernier post Edited May 31, 2013 by Pepitoww (see edit history) Link to comment Share on other sites More sharing options...
Pepitoww Posted May 21, 2013 Author Share Posted May 21, 2013 Bonjour, le problème de traduction est toujours d'actualité concernant le back office. Dans l'onglet traduction, toutes les traductions relatives à ma page .php admin ne sont pas pris en compte, que ce soit les traductions des champs (affiché lors des erreurs), ou bien les entêtes du tableau (renderList). Mais apparement la traductions des champs est traité à part... Le problème de traduction de mon fil d'arianne et de mon onglet (les deux sont liés) est quant à lui résolu. Cordialement Link to comment Share on other sites More sharing options...
Pepitoww Posted May 30, 2013 Author Share Posted May 30, 2013 Bonjour, après la réalisation de différents tests sur plusieurs versions de Presta je m'apercois que mes traductions marchent bien de la 1.5.0.1.7 à la 1.5.2.0 puis sur des versions plus récentes elles ne fonctionnent plus (15.3.0 jusqu'à la dernière version sortie). Par contre j'ai une nouvelle question, comment faire en sorte que la traduction des noms de mes champs soient directement comprises à l'installation de mon module, étant donné que la traduction des noms des champs interrogent un fichier spécifique je ne peux réécrire ce fichier. De plus les noms des champs de mon module n'apparaissent pas dans "Modifier la traduction"-"Traductions des noms des champs" ni dans "traductions des modules installés". Cordialement Link to comment Share on other sites More sharing options...
indesign47 Posted May 30, 2013 Share Posted May 30, 2013 (edited) Bonjour Pepitoww, Le problème de traduction est toujours d'actualité concernant le back office. Dans l'onglet traduction, toutes les traductions relatives à ma page .php admin ne sont pas pris en compte, que ce soit les traductions des champs (affiché lors des erreurs), ou bien les entêtes du tableau (renderList). Quelqu'un m'a donné une solution ce matin à ce genre de problème, mais je dois attendre son accord pour le partage d'info. Je te tiens au courant. Edited May 30, 2013 by indesign (see edit history) Link to comment Share on other sites More sharing options...
Pepitoww Posted May 30, 2013 Author Share Posted May 30, 2013 Bonjour indesign, merci de votre implication pour mon problème de traduction, j'attend la suite avec impatience. Cordialement Link to comment Share on other sites More sharing options...
indesign47 Posted May 30, 2013 Share Posted May 30, 2013 @Pepitoww, J'attends la réponse, la solution m'a été donnée vers 5h du matin. Je pense qu'il dort encore. Cordialement Link to comment Share on other sites More sharing options...
indesign47 Posted May 30, 2013 Share Posted May 30, 2013 (edited) @Pepitoww, Comme promis voila une solution. Copier le contenu du code en début de la classe • Il faut changer nondumodule par le nom du module • Il faut changer AdminController par le nom de la classe public static $l_cache; protected function l($string, $class = 'AdminTab', $addslashes = FALSE, $htmlentities = TRUE) { // need to be called in order to populate $classInModule $str = self::findTranslation('nondumodule', $string, 'AdminController'); $str = $htmlentities ? htmlentities($str, ENT_QUOTES, 'utf-8') : $str; return str_replace('"', '"', ($addslashes ? addslashes($str) : stripslashes($str))); } /** * findTranslation (initially in Module class), to make translations works * * @param string $name module name * @param string $string string to translate * @param string $source current class * @return string translated string */ public static function findTranslation($name, $string, $source) { static $_MODULES; if (!is_array($_MODULES)) { // note: $_COOKIE[iso_code] is set in createCustomToken(); $file = _PS_MODULE_DIR_.'nondumodule/translations/'.Configuration::get('PS_LOCALE_LANGUAGE').'.php'; if (file_exists($file) && include($file)) $_MODULES = !empty($_MODULES)?array_merge($_MODULES, $_MODULE):$_MODULE; } $cache_key = $name.'|'.$string.'|'.$source; if (!isset(self::$l_cache[$cache_key])) { if (!is_array($_MODULES)) return $string; // set array key to lowercase for 1.3 compatibility $_MODULES = array_change_key_case($_MODULES); if (defined('_THEME_NAME_')) $currentKey = '<{'.strtolower($name).'}'.strtolower(_THEME_NAME_).'>'.strtolower($source).'_'.md5($string); else $currentKey = '<{'.strtolower($name).'}default>'.strtolower($source).'_'.md5($string); // note : we should use a variable to define the default theme (instead of "prestashop") $defaultKey = '<{'.strtolower($name).'}prestashop>'.strtolower($source).'_'.md5($string); $currentKey = $defaultKey; if (isset($_MODULES[$currentKey])) $ret = stripslashes($_MODULES[$currentKey]); elseif (isset($_MODULES[strtolower($currentKey)])) $ret = stripslashes($_MODULES[strtolower($currentKey)]); elseif (isset($_MODULES[$defaultKey])) $ret = stripslashes($_MODULES[$defaultKey]); elseif (isset($_MODULES[strtolower($defaultKey)])) $ret = stripslashes($_MODULES[strtolower($defaultKey)]); else $ret = stripslashes($string); self::$l_cache[$cache_key] = $ret; } return self::$l_cache[$cache_key]; } Edited May 30, 2013 by indesign (see edit history) Link to comment Share on other sites More sharing options...
Pepitoww Posted May 31, 2013 Author Share Posted May 31, 2013 Bonjour, merci pour cette solution elle fonctionne parfaitement, je vous en suis très reconnaissant ainsi qu'à votre ami. Cordialement Link to comment Share on other sites More sharing options...
indesign47 Posted May 31, 2013 Share Posted May 31, 2013 Bonjour, Heureux que tout fonctionne pour toi. Peux-tu mettre le sujet en résolu ? SVP Cordialement. Link to comment Share on other sites More sharing options...
Pepitoww Posted May 31, 2013 Author Share Posted May 31, 2013 (edited) Bonjour, je viens de régler le deuxième soucis qui était la traduction de mes noms de champs lors d'erreur (maintenant je met le topic en résolu ) en m'inspirant du code de ton ami en overridant la méthode displayFieldName(), d'ailleurs une petite remarque concernant son code, il faut modifier une ligne si l'on veux que cela fonctionne lorsque l'on bascule le back office en anglais (ou en tout autre langue) : Modifier $file = _PS_MODULE_DIR_.'nondumodule/translations/'.Configuration::get('PS_LOCALE_LANGUAGE').'.php'; par $file = _PS_MODULE_DIR_.'nondumodule/translations/'.Context::getContext()->language->iso_code'.php'; Maintenant tous mes problèmes de traductions sont résolus. Cordialement Edited May 31, 2013 by Pepitoww (see edit history) Link to comment Share on other sites More sharing options...
indesign47 Posted May 31, 2013 Share Posted May 31, 2013 (edited) Bonjour, Ne manque t-il un point dans la ligne ? Modifier $file = _PS_MODULE_DIR_.'nondumodule/translations/'.Context::getContext()->language->iso_code'.php'; Par $file = _PS_MODULE_DIR_.'nondumodule/translations/'.Context::getContext()->language->iso_code.'.php'; Les traductions des fichiers PHP fonctionnent correctement dans toutes les langues. Par contre, je perds les traductions des fichiers tpl (view et form) en Italien, Espagnol et Portuguais. Elles s'affichent en Anglais. Quant est-il pour vous ? Cordialement Edited May 31, 2013 by indesign (see edit history) Link to comment Share on other sites More sharing options...
Pepitoww Posted June 3, 2013 Author Share Posted June 3, 2013 (edited) Bonjour, En effet il manquait un point dans la ligne. Même problème que vous concernant les traductions des fichiers tpl seulement en back office (en italien, espagnol et portuguais, je n'ai pas testé d'autre langue). Cela concerne t-il les même mots (supprimer la sélection, créer, enregistrer, retour à la liste) ? Cordialement Edited June 3, 2013 by Pepitoww (see edit history) Link to comment Share on other sites More sharing options...
indesign47 Posted June 3, 2013 Share Posted June 3, 2013 (edited) Bonjour, Cela concerne t-il les même mots (supprimer la sélection, créer, enregistrer, retour à la liste) ? Ce sont tous les champs des fichiers tpl (view et form) qui restent en Anglais selon la langue sélectionnée : Italien, Espagnol et Portuguais.) En Français et en Anglais tout fonctionne correctement. Mon module override AdminImportController.php donc pas de Front Office. Ces mêmes champs étaient bien dans la bonne langue avant l'intégration de la function. Cordialement, Edited June 3, 2013 by indesign (see edit history) Link to comment Share on other sites More sharing options...
Pepitoww Posted June 3, 2013 Author Share Posted June 3, 2013 D'accord et pour vous avec le code initial de votre ami cela marchait-il déjà correctement ? Pouvez-vous me dire quels sont vos fichiers de traductions dans votre dossier /translations de votre module ? Link to comment Share on other sites More sharing options...
indesign47 Posted June 3, 2013 Share Posted June 3, 2013 Pouvez-vous me dire quels sont vos fichiers de traductions dans votre dossier /translations de votre module ? br, de, en, es, fr, it D'accord et pour vous avec le code initial de votre ami cela marchait-il déjà correctement ? J'avais noté des problèmes lors des changements de la langue de l'employé admin En résumé : tous les champs TPL OK dans toutes les langues, tous les champs PHP OK uniquement en Français Compliqué comme situation Link to comment Share on other sites More sharing options...
Pepitoww Posted June 3, 2013 Author Share Posted June 3, 2013 D'accord, pour ma part dans mes fichiers de traductions italien, espagnol et portugais j'avais mes traductions en français (pourquoi ?). Ce que j'ai fais ce que j'ai repris ses fichiers en modifiant les traductions dans la langue voulue. Effectivement c'est plutôt fastidieux mais je n'ai pas encore de meilleur solution pour le moment. Link to comment Share on other sites More sharing options...
indesign47 Posted June 3, 2013 Share Posted June 3, 2013 Bon je "crois avoir compris" : • La traduction des fichiers TPL est obtenue par le fichier ISO.PHP contenu dans le dossier translation du thème • La traduction des champs PHP est obtenue par le fichier ISO.PHP contenu dans le dossier translation du module si je supprime les fichiers contenu dans le thème je perds toutes les traductions TPL. • J'utilise un thème autre que celui par défaut : c'était l'origine de mes problèmes de traduction PHP selon les langues. En enregistrant les traductions dans le thème utilisé et (non dans le cœur indépendant du thème) toutes les langues fonctionnent bien en PHP et TPL Ce qui voudrait dire que lorsqu'un utilisateur achètera le module, et s'il utilise un autre thème que celui par défaut, les traductions contenues dans le dossier du module ne seront pas visibles ??? Suis-je clair ? Vous confirmez mon raisonnement ? Link to comment Share on other sites More sharing options...
Pepitoww Posted June 4, 2013 Author Share Posted June 4, 2013 Bon je "crois avoir compris" : • La traduction des fichiers TPL est obtenue par le fichier ISO.PHP contenu dans le dossier translation du thème • La traduction des champs PHP est obtenue par le fichier ISO.PHP contenu dans le dossier translation du module si je supprime les fichiers contenu dans le thème je perds toutes les traductions TPL. Vous m'avez dis que votre module n'avait pas d'affichage en front office donc le dossier du thème se situe dans /admin/themes/... or je ne vois pas de dossier translation (je suis avec le thème par défaut d'une version 1.5.3.1 c'est peut-être pour sa) du coup les traductions des fichiers TPL sont quand même obtenues par le module je pense. A moins que pour le thème par défaut, les traductions viennent directement du dossier /translations... Link to comment Share on other sites More sharing options...
indesign47 Posted June 4, 2013 Share Posted June 4, 2013 (edited) Je crois que l'on se perd mutuellement. Vous m'avez dis que votre module n'avait pas d'affichage en front office Pas d'affichage en front office : Mon module override AdminImportController.php donc pas de Front Office. Le chemin des traductions du thème themes -> defaut -> modules -> nomdumodule -> translations -> iso.php (fr.php) themes -> autre -> modules -> nomdumodule -> translations -> iso.php (fr.php) si je supprime les fichiers contenu dans le thème autre je perds toutes les traductions TPL. Merge des deux dossiers translations du module et translations du thème autre. Edited June 4, 2013 by indesign (see edit history) Link to comment Share on other sites More sharing options...
Pepitoww Posted June 5, 2013 Author Share Posted June 5, 2013 D'accord, ayant créer mon module de toute pièce je n'ai pas de dossier dans /thèmes/modules... pour ma part les traductions utilisées sont celles présentes dans le dossier translations de mon module c'est pour sa que j'avais du mal à me repérer. Du coup je pense que vos suggestions sont correctes. • La traduction des fichiers TPL est obtenue par le fichier ISO.PHP contenu dans le dossier translation du thème • La traduction des champs PHP est obtenue par le fichier ISO.PHP contenu dans le dossier translation du module si je supprime les fichiers contenu dans le thème je perds toutes les traductions TPL. Il faudrait avoir un troisième avis permettant de confirmer vos dires. Cordialement Link to comment Share on other sites More sharing options...
indesign47 Posted June 15, 2013 Share Posted June 15, 2013 Bonjour, Nouvelle installation PS 1.5.4.1 sur thème standard et thème personnalisé toutes les traductions fonctionnent parfaitement. Le problème était lié à l'ancienne installation et au nouveau thème. Seul petit bémol : les icônes de la toolbar sont en Anglais sauf l'icône d'aide. Sans la fonction findTranslation les icônes sont en Français. Une idée ? Cordialement Link to comment Share on other sites More sharing options...
Pepitoww Posted June 17, 2013 Author Share Posted June 17, 2013 (edited) Bonjour, bonne nouvelle que vous ayez résolu votre problème, concernant la traductions des icônes j'avais le même problème alors je les ai redéfinies dans mon fichier de traduction de mon module. La méthode findTranslations() doit seulement récupèrer les traductions du module. Edited June 17, 2013 by Pepitoww (see edit history) Link to comment Share on other sites More sharing options...
indesign47 Posted June 17, 2013 Share Posted June 17, 2013 (edited) Bonsoir, Alors je les ai redéfinies dans mon fichier de traduction de mon module. D'accord, mais comment ? je viens de régler le deuxième soucis qui était la traduction de mes noms de champs lors d'erreur Peux-tu poster la solution ? merci par avance Edited June 17, 2013 by indesign (see edit history) Link to comment Share on other sites More sharing options...
Pepitoww Posted June 17, 2013 Author Share Posted June 17, 2013 (edited) D'accord, mais comment ? Dans le menu Traductions, Traductions des modules installés normalement tu doit avoir tes champs non traduits qui correspondent aux icones non traduites, rédéfinies les ici (retraduits les ici). Peux-tu poster la solution ? merci par avance Alors j'ai override la fonction displayFieldName() de la classe Object Controller. public static function displayFieldName($field, $class = __CLASS__, $htmlentities = true, Context $context = null) { static $_MODULES; if (!is_array($_MODULES)) { $file = _PS_MODULE_DIR_.'nomDeTonModule/translations/'.Configuration::get('PS_LOCALE_LANGUAGE').'.php'; if (file_exists($file) && include($file)) $_MODULES = !empty($_MODULES)?array_merge($_MODULES, $_MODULE):$_MODULE; } $name = 'nomDeTonModule'; $source = 'nomDeLaClasseBackOffice'; //Adminxxx switch($field) { case 'premierChamp': $string = 'NomduPremierCHamp'; break; // Tu fais sa pour tous tes champs [...] } $defaultKey = '<{'.strtolower($name).'}prestashop>'.strtolower($source).'_'.md5($string); return ((is_array($_MODULES) && array_key_exists($defaultKey, $_MODULES)) ? ($htmlentities ? htmlentities($_MODULES[$defaultKey], ENT_QUOTES, 'utf-8') : $_MODULES[$defaultKey]) : $field); } Pour que cela marche il faut quand même que les traductions des champs soient présents dans le fichier fr.php (pour comparer la chaine md5). Edited June 17, 2013 by Pepitoww (see edit history) Link to comment Share on other sites More sharing options...
indesign47 Posted June 17, 2013 Share Posted June 17, 2013 Merci Petpitoww de prendre le temps de m'aider c'est plutôt rare... maintenant. Dans le menu Traductions, Traductions des modules installés normalement tu dois avoir tes champs non traduits qui correspondent aux icônes non traduites, Non, tous les champs disponibles sont déjà traduits... (dans les 6 langues par défaut) Le soucis vient de ceci : <div class="toolbar-placeholder"><div class="toolbarBox toolbarHead" style="width: 1558px;"><ul class="cc_button"><li><a id="desc--cancel" class="toolbar_btn" title="Cancel" href="index.php?controller=AdminImport&token=1d99948d3408bd67c07557ef8006ff23"><span class="process-icon-cancel "></span><div> Cancel </div></a></li><li><a id="desc--save-import" class="toolbar_btn" title="Import .CSV data" href="#"><span class="process-icon-save"></span><div> Import .CSV data </div></a></li> Qui est correct : (sans la function translate) <div class="toolbar-placeholder"><div class="toolbarBox toolbarHead"><ul class="cc_button"><li><a id="desc--cancel" class="toolbar_btn" title="Annuler" href="index.php?controller=AdminImport&token=1d99948d3408bd67c07557ef8006ff23"><span class="process-icon-cancel "></span><div> Annuler </div></a></li><li><a id="desc--save-import" class="toolbar_btn" title="Importer les données" href="#"><span class="process-icon-save"></span><div> Importer les données </div></a></li> redéfinies les ici (retraduits les ici). Désolé, je comprends pas. Merci bien pour ceci : je vais tester. public static function displayFieldName($field, $class = __CLASS__, $htmlentities = true, Context $context = null) { static $_MODULES; Link to comment Share on other sites More sharing options...
indesign47 Posted June 18, 2013 Share Posted June 18, 2013 (edited) J'ai enfin trouvé : Dans l'override de mon admincontroller de mon module j'ai rajouté ceci : public function initToolbar() { switch ($this->display) { case 'import': // Default cancel button - like old back link $back = Tools::safeOutput(Tools::getValue('back', '')); if (empty($back)) $back = self::$currentIndex.'&token='.$this->token; $this->toolbar_btn['cancel'] = array( 'href' => $back, 'desc' => $this->l('Cancel') ); // Default save button - action dynamically handled in javascript $this->toolbar_btn['save-import'] = array( 'href' => '#', 'desc' => $this->l('Import .CSV data') ); break; } } et maintenant les champs apparaissent bien dans les traductions de mon module et bien sûr lors de l'affichage de la view de mon module. OUF. Merci pour ta contribution et pour le temps passé. Edited June 19, 2013 by indesign (see edit history) Link to comment Share on other sites More sharing options...
indesign47 Posted June 19, 2013 Share Posted June 19, 2013 (edited) Bonjour, Je reprends par ici car je ne peux plus envoyer de PM depuis ce matin (participants block ) ???? Le scandir retourne TOUS les fichiers du dossier _PS_DOWNLOAD_DIR_ protected function truncateTables($case) { switch ((int)$case) { case $this->entities[$this->l('Product Download')]: Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_download'); //Image::deleteAllImages(_PS_DOWNLOAD_DIR_); foreach (scandir(_PS_DOWNLOAD_DIR_) as $d) if($d != "." && $d != ".." && $d != "index.php") @unlink(_PS_DOWNLOAD_DIR_.$d); break; } } Liste des fichiers retournés : 153dea895c4cca88711a82826b83cbd1ff4bcc59 1AB0078FF2645C1A8CF19D2A12FAEFBEBD1968AA 5GED078FF2645C1A8CF19D2A12FAEFBEBD1978CC 802788133e8595397ea0c3fdb90bb874c1a3621a Je voudrais supprimer uniquement ceux qui sont contenus dans la BD de la table PS_product_download et dans la colonne filename. (produits virtuels) Sinon je garde le fichier. La boucle permettrait de passer au fichier suivant du dossier. Dans le cas présent, voir la capture d'écran je souhaiterai supprimer uniquement 153dea895c4cca88711a82826b83cbd1ff4bcc59 802788133e8595397ea0c3fdb90bb874c1a3621a Les deux autre fichiers sont des fichiers (produits pièces jointes) à garder Edited June 20, 2013 by indesign (see edit history) Link to comment Share on other sites More sharing options...
indesign47 Posted June 20, 2013 Share Posted June 20, 2013 Quelques pistes issues de la classe ProductDownload.php Récupère le filename par rapport à l'ID du produit public static function getFilenameFromIdProduct($id_product) { return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' SELECT `filename` FROM `'._DB_PREFIX_.'product_download` WHERE `id_product` = '.(int)$id_product.' AND `active` = 1 '); } Vérifie les droits du dossier public static function checkWritableDir() { return is_writable(_PS_DOWNLOAD_DIR_); } Vérifie si le fichier existe public function checkFile() { if (!$this->filename) return false; return file_exists(_PS_DOWNLOAD_DIR_.$this->filename); } Supprime le fichier public function deleteFile($id_product_download = null) { if (!$this->checkFile()) return false; return unlink(_PS_DOWNLOAD_DIR_.$this->filename) && Db::getInstance()->delete('product_download', 'id_product_download = '.(int)$id_product_download); } Une boucle (foreach) sur tous les ID contenus dans la BD de la table ps_product_download La fonction protected function truncateTables($case) de l'importation de PS contenu dans le fichier AdminImportController pour les produits permet de vider la table complète avant l’importation. J'ai repris la fonction pour le product_download. C'est celle que je souhaiterai utiliser. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now