Si votre architecture comportent plusieurs instances de votre site Internet (Production, pré-production, postes de développement, …) comment mettre à jour de manière automatique des traductions, sans devoir aller sur chacune des interfaces d’administration ?

Le plus facile serait de déployer le fichier qui contient toutes les traductions. Mais que se passe-t-il si un texte a été modifié sur le site Internet de production par votre client par exemple ?

Pour cela, rien de plus de simple, il suffit d’utiliser le module Prestashop Developper Tools que nous avons développé , mis sur la place de marché de Prestashop et déjà utilisé dans l’article sur  une mauvaise utilisation de la grille de frais de port par Prestashop. Ce module est dédié aux mises à jour des différentes instances d’un site Internet à partir de scripts Php et Mysql. Tout comme la mécanique utilisée par Prestashop pour se mettre à jour. Pour notre agence de développement Prestashop/Applications mobiles, cette brique nous est indispensable et est déployée systématiquement pour chacun de nos client. Cela permet de travailler à plusieurs sur des environnements sans que les modifications des uns, effacent les modifications des autres.

Bref, voici le script Php qui vous permettra de mettre à jour automatiquement des traductions ciblées :
Script de mise à jour des traductions
!! Attention de toujours faire une sauvegarde de vos fichiers avant de les modifier. !!

Si vous ne comprenez pas ce que vous faites, ne pas modifier votre fichier et demander à votre agence ou une agence de développement spécialisée dans Prestashop d’apporter ces modifications sur votre site Internet.

Ce fichier ne fonctionne qu’avec le module Developper Tools. A vous de l’adapter en fonction de vos besoins.

modules/pliciwebupdate/data/001_update_traduction_pdf.php

<?php 
$type = 'pdf';
$iso_code = 'fr';
$theme = 'transformer';

$data['PDF2c5c38b33f9ba520a9a4b5a158669067'] = 'No. de facture';
$data['PDF440ac606343b8a66acad0d2978786d2a'] = 'Date de facture';
$data['PDF423adfc9b96857d60cbcd281e8c55b16'] = 'No. de commande';
$data['PDF226f7fb5d8e282a9359c337b437b53e3'] = 'TAUX DE TVA';
$data['PDF4178ab71d3adc2b618c1b8837e3901b4'] = 'TOTAL TVA';
$data['PDF1fbc7e5f1b92c7ec072397b59a0bb5da'] = 'Adresse de facturation';
$data['PDFaf0f5bdc5be121b9307687aeeae38c17'] = 'Adresse de livraison';
$data['PDFf0aaaae189e9c7711931a65ffcd22543'] = 'Mode de paiement';
$data['PDF6310f29293c902c64db619c29179d99a'] = 'Mode de transport';
$data['PDFc6b68a6e4d8e63cbbc821ef1e59e796c'] = 'ARTICLE';
$data['PDF8b3a37e7e20d4d58f74526966b6cfdcb'] = 'DÉSIGNATION';
$data['PDF885876ddd6d1c878a56b47d5f922cde8'] = 'PRIX UNIT.';
$data['PDF954c524c596b6b62b00f7765c5446546'] = 'HT';
$data['PDFd01105a464390b87eab3d6c69be43a08'] = 'TOTAL';
$data['PDF43183e955e3019bf7f8c942e016b7b13'] = 'TVA';
$data['PDF9c5a68392a489fe89d31c2a53b3b74e3'] = 'TTC';
$data['PDF5ee9450ed51089f729f6c67a92760276'] = 'HS Code';
$data['PDFbe686376cddb23d0227444ccc3c4b5b7'] = 'Coupon';
$data['PDF88c189a42c87aa49d667fc8ab76bc323'] = 'OFFERT';
$data['PDFc942d6407c13bba87045b67ed6e1c039'] = 'TOTAL HT';
$data['PDF481361b0822b8ba96d2c9f3c3296c148'] = 'TOTAL TTC';



$override_file = true;

$lang = $iso_code;

if (!empty($theme)) {
	define('_PS_THEME_SELECTED_DIR_', _PS_ROOT_DIR_.'/themes/'.$theme.'/');
} else {
	define('_PS_THEME_SELECTED_DIR_', '');
}
$translations_informations = getTranslationsInformations($iso_code);


// From /controllers/AdminTranslationsController.php function writeTranslationFile()
$type_clean = Tools::toCamelCase($type, true);
$translation_informations = $translations_informations[$type];


$file_path = $normal_path = $translation_informations['dir'].$translation_informations['file'];
if ($override_file) {
	$file_path = $translation_informations['override']['dir'].$translation_informations['override']['file'];
}

try {

	$data_previous = array();
	if (!file_exists($file_path))
	{
		if (!file_exists(dirname($file_path)) && !mkdir(dirname($file_path), 0777, true)) {
			throw new PrestaShopException(sprintf(Tools::displayError('Directory "%s" cannot be created'), dirname($file_path)));
		} else {
			// Load global file
			if (file_exists($normal_path)) {
				include($normal_path);
				$data_previous =  $$translation_informations['var'];
			}
			if (!touch($file_path)) {
				throw new PrestaShopException(sprintf(Tools::displayError('File "%s" cannot be copied'), $file_path));
			}
		}
	} else {
		include($file_path);
		if (isset($$translation_informations['var'])) {
			$data_previous =  $$translation_informations['var'];
		}
	}
	
	$thm_name = str_replace('.', '', $theme);
	$kpi_key = substr(strtoupper($thm_name.'_'.Tools::getValue('lang')), 0, 16);



	if ($fd = fopen($file_path, 'w'))
	{
		// Get all POST which aren't empty
		$to_insert = array_merge($data_previous, $data);

		ConfigurationKPI::updateValue('FRONTOFFICE_TRANSLATIONS_EXPIRE', time());
		ConfigurationKPI::updateValue('TRANSLATE_TOTAL_'.$kpi_key, count($to_insert));
		ConfigurationKPI::updateValue('TRANSLATE_DONE_'.$kpi_key, count($to_insert));

		// translations array is ordered by key (easy merge)
		ksort($to_insert);

		$tab = $translation_informations['var'];
		fwrite($fd, "<?php\n\nglobal \$".$tab.";\n\$".$tab." = array();\n"); foreach ($to_insert as $key => $value)
			fwrite($fd, '$'.$tab.'[\''.pSQL($key, true).'\'] = \''.pSQL($value, true).'\';'."\n");
		fwrite($fd, "\n?>");
		fclose($fd);
	} else {
		throw new PrestaShopException(sprintf(Tools::displayError('Cannot write this file: "%s"'), $file_path));
	}
} catch (PrestaShopException $exception) {
	$controller->errors[] = vsprintf('Impossible de mettre à jour les traductions "%s"', [$exception->getMessage()]);
	return false;
}


$controller->confirmations[] = '<br />'.vsprintf('Les traductions ont été mise à jour', []);



/**
 * Get all translations informations for all type of translations
 *
 * array(
 * 	'type' => array(
 * 		'name' => string : title for the translation type,
 * 		'var' => string : name of var for the translation file,
 * 		'dir' => string : dir of translation file
 * 		'file' => string : file name of translation file
 * 	)
 * )
 * From /controllers/AdminTranslationsController.php
 */
function getTranslationsInformations($iso_code)
{
	$translations_informations = array(
		'front' => array(
			'name' => l('Front-office translations'),
			'var' => '_LANG',
			'dir' => defined('_PS_THEME_SELECTED_DIR_') ? _PS_THEME_SELECTED_DIR_.'lang/' : '',
			'file' => $iso_code.'.php'
		),
		'back' => array(
			'name' => l('Back-office translations'),
			'var' => '_LANGADM',
			'dir' => _PS_TRANSLATIONS_DIR_.$iso_code.'/',
			'file' => 'admin.php'
		),
		'errors' => array(
			'name' => l('Error message translations'),
			'var' => '_ERRORS',
			'dir' => _PS_TRANSLATIONS_DIR_.$iso_code.'/',
			'file' => 'errors.php'
		),
		'fields' => array(
			'name' => l('Field name translations'),
			'var' => '_FIELDS',
			'dir' => _PS_TRANSLATIONS_DIR_.$iso_code.'/',
			'file' => 'fields.php'
		),
		'modules' => array(
			'name' => l('Installed modules translations'),
			'var' => '_MODULES',
			'dir' => _PS_MODULE_DIR_,
			'file' => ''		
		),
		'pdf' => array(
			'name' => l('PDF translations'),
			'var' => '_LANGPDF',
			'dir' => _PS_TRANSLATIONS_DIR_.$iso_code.'/',
			'file' => 'pdf.php'
		),
		'mails' => array(
			'name' => l('Email templates translations'),
			'var' => '_LANGMAIL',
			'dir' => _PS_MAIL_DIR_.$iso_code.'/',
			'file' => 'lang.php'
		)
	);

	if (defined('_PS_THEME_SELECTED_DIR_'))
	{
		$translations_informations['modules']['override'] = array('dir' => _PS_THEME_SELECTED_DIR_.'modules/', 'file' => '');
		$translations_informations['pdf']['override'] = array('dir' => _PS_THEME_SELECTED_DIR_.'pdf/lang/', 'file' => $iso_code.'.php');
		$translations_informations['mails']['override'] = array('dir' => _PS_THEME_SELECTED_DIR_.'mails/'.$iso_code.'/', 'file' => 'lang.php');
	}
	
	return $translations_informations;
}

function l($text) {
	return $text;
}