olea Posted March 15, 2011 Share Posted March 15, 2011 Certaines traductions effectuées dans les modules ne sont pas compatible entre 1.2/1.3 et 1.4, cf report 8167Problématique :Lors de la traduction des modules, le traducteur intégré de Prestashop génère des fichiers .php dans chacun des répertoires des modules (lang étant le code iso du langage).Dans ces fichiers, chaque chaine à traduire est identifiée par une clé construite à partir :-- du nom du répertoire du module-- du nom du fichier faisant l'appel à la tracduction ($this->l())-- de la chaine à traduire.Le traducteur de la 1.4 (SVN 5505) utilise le nom du répertoire et le nom du fichier en minuscule, alors que la 1.3 les utilise tels qu'elle les trouve dans le système de fichier, en gardant les éventuelles majuscules.Pour les modules traduits en 1.3, à priori pas de soucis pour les installer en 1.4 qui convertit les clefs de la 1.3.Mais cela pose un problème pour les modules développés et traduits en 1.4 et qui souhaitent pouvoir être installés par compatibilité sur la 1.3.Si le répertoire ou l'un des fichiers traduits possèdent des majuscules, les traductions seront perdues en 1.3 :d'abord non lisible par la 1.3 et ensuite supprimés lors de la traduction d'un quelconque module sur cette 1.3.Solution :Une solution consiste à effectuer une conversion de compatibilité lors de l'installation du module.Lors de son installation, si le module détecte qu'il est en cours d'installation sur une version précédant la 1.4, il convertit les clefs de traductions au format 1.3.Cela se fait par la procédure suivante qui doit être appelée en tête de la méthode d'installation: static function revert_translation_to13 () { if (version_compare(_PS_VERSION_, '1.4') >= 0) return ; $lang_files = array(); foreach (Language::getLanguages(false) as $lang) { $filename = dirname(__FILE__).'/'.$lang['iso_code'].'.php'; if (file_exists ($filename)) $lang_files[$lang['iso_code']] = file_get_contents ($filename); } $module = basename(dirname(__FILE__)); $files_list = array(); $content = @scandir(_PS_MODULE_DIR_.$module); foreach ($content as $cont) { if ($cont{0} != '.' AND $cont{0} != '..' AND $cont != 'img' AND $cont != 'mails' AND $cont != 'js' AND is_dir(_PS_MODULE_DIR_.$module.'/'.$cont)) { if ($files = @scandir(_PS_MODULE_DIR_.$module.'/'.$cont)) foreach ($files as $f) if (strpos($f, '.php') !== false AND is_file (_PS_MODULE_DIR_.$module.'/'.$cont.'/'.$f)) $files_list[] = str_replace('.php', '', $f); } elseif (strpos($cont, '.php') !== false AND is_file(_PS_MODULE_DIR_.$module.'/'.$cont)) $files_list[] = str_replace('.php', '', $cont); } $module_lowered = strtolower($module); foreach ($files_list as $f) foreach($lang_files as $iso=>&$content) $content = str_replace ('<{'.$module_lowered.'}prestashop>'.strtolower($f).'_', '<{'.$module.'}prestashop>'.$f.'_', $lang_files[$iso]); foreach ($lang_files as $lang=>$langfile_content) file_put_contents(dirname(__FILE__).'/'.$lang.'.php', $langfile_content); } function install() { self::revert_translation_to13(); /* ** installation du module */ } Link to comment Share on other sites More sharing options...
Fabrice Posted March 15, 2011 Share Posted March 15, 2011 oulà ! ça c'est un rapport comme je les aime...ça va être très apprécié par les dévs. ça c'est sur :-)merci !! Link to comment Share on other sites More sharing options...
olea Posted March 15, 2011 Author Share Posted March 15, 2011 Ils sont déjà au courant....Mais ils peuvent pas apporter de solution sans tout casser ce qu'ils ont fait en 1.4, c'est à dire remettre les majuscules.C'est donc juste une manière de contourner le problème pour ceux qui vont tomber dedans. Link to comment Share on other sites More sharing options...
Fabrice Posted March 15, 2011 Share Posted March 15, 2011 "ceux qui vont tomber dedans"... on n'est pas sortie de l'auberge !bonne fin de soirée à toi ! Link to comment Share on other sites More sharing options...
webbax Posted September 7, 2011 Share Posted September 7, 2011 Je rencontre aussi une autre problématique, par exemple je ne mets pas forcément tous mes fichiers à la racine du module. Par exemple je mets des formulaires dans /modules/mon_module/form/formulaire1.php et il est ensuite possible de traduire le contenu de ces fichiers via le back-office, qui va ensuite générer le fichier fr.php, en.php. Par contre ces traductions de sous-répertoires ne sont pas ensuite chargée par Prestashop, cela veut dire que la logique ne va que dans un sens, on peut traduire même si les fichiers sont dans des sous répertoire, mais les traductions ne seront pas accessibles par Prestashop. Je vais regarder ça et je vous redis. Link to comment Share on other sites More sharing options...
webbax Posted September 7, 2011 Share Posted September 7, 2011 Voici la solution : http://www.prestashop.com/forums/topic/128692-astuce-traduction-modules-avec-sous-repertoires/ 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