Jump to content

Imcompatibilité des traductions de modules entre ps1.3 et ps1.4 (report 8167)


Recommended Posts

Certaines traductions effectuées dans les modules ne sont pas compatible entre 1.2/1.3 et 1.4, cf report 8167

Problé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

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

  • 5 months later...

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...