J’ai encore rencontré récemment le problème bien connus des utilisateurs de prestashop qui souhaitent changer les traductions depuis le back-office.

L’erreur d’affichage des champs de formulaire “max_input_vars” qui empeche d’afficher les traductions, et donc de les modifier depuis l’administration.

J’avais apporté une solution il y’a plusieurs années pour corriger ce problème sur un hébergement mutualisé ovh : Prestashop problème max_input_vars en hébergement mutualisé chez ovh ( Elle ne doit plus fonctionner malheureusement )

Dans le cas de ceux qui disposent d’un serveur dédié avec les accès nécessaires, la modification du php.ini corrige rapidement ce problème.

Pour mon problème j’avais uniquement quelques traductions à réaliser, l’ajout des informations de traductions directement dans les fichiers de traductions est donc une solution envisageable.

Le fonctionnement est assez simple , la clé de traduction est construite de la manière suivante

<{nomModule}nomTheme>nomFichier_md5(cleTraduction)

Cette clé de traduction est ajoutée dans la variable $_MODULE , qui contient toutes les traductions.

Par exemple la traduction du code ci-dessous , dans le fichier banwire.php

$this->displayName = $this->l('Bank wire');

est stocké sous la forme suivante :

$_MODULE['<{bankwire}prestashop>bankwire_05adcee99142c1a60fb38bb1330bbbc1'] = 'Virement bancaire';

Vous pouvez-voir grâce aux codes couleurs comment la clé est construite.
C’est tout pour la théorie, voici maintenant un petit script qui vous donnera la clé de traduction que vous souhaitez !

<html>
<head>
<title>Translation tool</title>
<style>
label,input {float:left;}
div.row {clear:both;margin-top:10px; height:40px;}
div.hint {font-style:italic;clear:left;}
.results {border:1px solid; padding:10px;margin:10px;}
</style>
</head>
<body>
 
<?php if ( isset($_POST)  && sizeof($_POST) ) : ?>
<div class="results">
 
<?php
 
//Sécurisation basique des entrées
$datas = array();
foreach ( $_POST as $key => $value)
$datas[$key] = trim(strip_tags($value));
 
//Création de la clé du tableau de traduction
$translation = '<{'.$datas['module_name'].'}'.$datas['theme_name'].'>'.$datas['file_name'].'_'.md5($datas['translate_key']);
 
echo '<p>La clé de traduction pour le module '.$datas['module_name'].', pour le theme '.$datas['theme_name'].' dans le fichier '.$datas['file_name'].'</p>';
echo $translation;
?>
Pour insérer la traduction à votre module ajouter la ligne suivante dans le fichier de traduction souhaité <br />
<?php echo '$_MODULE['.$translation.'] = \''.addslashes($datas['translate_value'])."'"; ?>
 
<p>Fichier de traduction global du module , ou fichier de traduction du module dans le thème souhaité </p>
 
</div>
<?php endif; ?>
<form name="translate" id="translate_form" method="post">
 
<div class="row">
<label for="module_name">Nom du module</label>
<input type="text" name="module_name" />
</div>
 
<div class="row">
<label for="file_name">Nom du fichier</label>
<input type="text" name="file_name" />
<div class="hint">Nom du fichier dans lequel est situé la traduction (sans extension )</div>
</div>
 
<div class="row">
<label for="theme_name">Nom du thème</label>
<input type="text" name="theme_name" value="prestashop" />
<div class="hint">Nom du thème pour la traduction</div>
</div>
 
<div class="row">
<label for="translate_key">Clé de traduction</label>
<input type="text" name="translate_key" />
<div class="hint">Nom de la clé de traduction ( qui ne doit pas contenir de caractère spéciaux)</div>
</div>
 
<div class="row">
<label for="translate_value">Valeur de traduction</label>
<input type="text" name="translate_value" />
</div>
 
<div class="row">
<input type="submit" value="Envoyer" />
</div>
 
</form>
</body>
</html>

C’est un script très basique, mais qui devrait pouvoir vous permettre de gagner du temps pour des corrections ou ajouts de traductions.