<?php



/**

  * Translations tab for admin panel, AdminTranslations.php

  * @category admin

  *

  * @author PrestaShop <support@prestashop.com>

  * @copyright PrestaShop

  * @license http://www.opensource.org/licenses/osl-3.0.php Open-source licence 3.0

  * @version 1.0

  *

  */



include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php');



class AdminTranslations extends AdminTab

{

	private function getModuleTranslations()

	{

		global $_MODULES, $_MODULE;



		if (!isset($_MODULE) AND !isset($_MODULES))

			$_MODULES = array();

		elseif (isset($_MODULE))

			$_MODULES = (is_array($_MODULES) AND is_array($_MODULE)) ? array_merge($_MODULES, $_MODULE) : $_MODULE;

	}



	private function checkDirAndCreate($dest)

	{

		$bool = true;

		$dir = trim(str_replace(_PS_ROOT_DIR_, '', dirname($dest)), '/');

		$subdir = explode('/', $dir);

		for ($i = 0, $path = ''; $subdir[$i]; $i++)

		{

			$path .= $subdir[$i].'/';

			if (!createDir(_PS_ROOT_DIR_.'/'.$path, 0777))

			{

				$bool &= false;

				$this->_errors[] = $this->l('Cannot create the folder').' "'.$path.'". '.$this->l('Check directory writing permisions.');

				break ;

			}

		}

		return $bool;

	}



	private function writeTranslationFile($type, $path, $mark = false, $fullmark = false)

	{

		global $currentIndex;



		if ($fd = fopen($path, 'w'))

		{

			unset($_POST['submitTranslations'.$type], $_POST['lang']);

			unset($_POST['token']);

			$toInsert = array();

			foreach($_POST as $key => $value)

				if (!empty($value))

					$toInsert[$key] = htmlentities($value, ENT_COMPAT, 'UTF-8');



			$tab = ($fullmark ? Tools::strtoupper($fullmark) : 'LANG').($mark ? Tools::strtoupper($mark) : '');

			fwrite($fd, "<?php\n\nglobal \$_".$tab.";\n\$_".$tab." = array();\n");

			foreach($toInsert as $key => $value)

				fwrite($fd, '$_'.$tab.'[\''.pSQL($key, true).'\'] = \''.pSQL($value, true).'\';'."\n");

			fwrite($fd, "\n?>");

			fclose($fd);

			Tools::redirectAdmin($currentIndex.'&conf=4&token='.$this->token);

		}

		else

			die('Cannot write language file');

	}



	public function submitCopyLang()

	{

		global $currentIndex;



		if (!($fromLang = strval(Tools::getValue('fromLang'))) OR !($toLang = strval(Tools::getValue('toLang'))))

			$this->_errors[] = $this->l('you must select 2 languages in order to copy data from one to another');

		elseif (!($fromTheme = strval(Tools::getValue('fromTheme'))) OR !($toTheme = strval(Tools::getValue('toTheme'))))

			$this->_errors[] = $this->l('you must select 2 themes in order to copy data from one to another');

		elseif (!Language::copyLanguageData(Language::getIdByIso($fromLang), Language::getIdByIso($toLang)))

			$this->_errors[] = $this->l('an error occurred while copying data');

		elseif ($fromLang == $toLang AND $fromTheme == $toTheme)

			$this->_errors[] = $this->l('nothing to copy! (same language and theme)');

		if (sizeof($this->_errors))

			return ;



		$bool = true;

		$items = Language::createItemsList($fromLang, $fromTheme, $toLang, $toTheme);

		foreach ($items as $source => $dest)

		{

			$bool &= $this->checkDirAndCreate($dest);

			$bool &= @copy($source, $dest);

		}

		if ($bool)

			Tools::redirectLink($currentIndex.'&conf=14&token='.$this->token);

		$this->_errors[] = $this->l('a part of the data has been copied but some language files couldn\'t be found or copied');

	}



	public function submitExportLang()

	{

		global $currentIndex;



		$lang = strtolower(Tools::getValue('iso_code'));

		$theme = strval(Tools::getValue('theme'));

		if ($lang AND $theme)

		{

			$items = array_flip(Language::createItemsList($lang, $theme));

			$gz = new Archive_Tar(_PS_TRANSLATIONS_DIR_.'/export/'.$lang.'.gzip', true);

			if ($gz->createModify($items, NULL, _PS_ROOT_DIR_));

				Tools::redirect('translations/export/'.$lang.'.gzip');

			$this->_errors[] = Tools::displayError('an error occurred while creating archive');

		}

		$this->_errors[] = Tools::displayError('please choose a language and a theme');

	}



	public function submitImportLang()

	{

		global $currentIndex;



		if (!isset($_FILES['file']['tmp_name']) OR !$_FILES['file']['tmp_name'])

			$this->_errors[] = Tools::displayError('no file selected');

		else

		{

			$gz = new Archive_Tar($_FILES['file']['tmp_name'], true);

			if ($gz->extract(_PS_TRANSLATIONS_DIR_.'../'))

				Tools::redirectAdmin($currentIndex.'&conf=15&token='.$this->token);

			$this->_errors[] = Tools::displayError('archive cannot be extracted');

		}

	}



	public function findAndWriteTranslationsIntoFile($filename, $files, $themeName, $moduleName)

	{

		$tplRegex = '/\{l s=\''._PS_TRANS_PATTERN_.'\'( mod=\'.+\')?( js=1)?\}/U';

		$phpRegex = '/this->l\(\''._PS_TRANS_PATTERN_.'\'(, \'(.+)\')?(, (.+))?\)/U';



		$dir = ($themeName == 'prestashop' ? _PS_MODULE_DIR_.$moduleName.'/' : _PS_ALL_THEMES_DIR_.$themeName.'/modules/'.$moduleName.'/');

		if (!$writeFd = @fopen($filename, 'w'))

			die ($this->l('Cannot write the theme\'s language file ').'('.$filename.')'.$this->l('. Please check write permissions.'));

		else

		{

			fwrite($writeFd, "<?php\n\nglobal \$_MODULE;\n\$_MODULE = array();\n");

			foreach ($files AS $templateFile)

				if ((ereg('^(.*).tpl$', $templateFile) OR ($themeName == 'prestashop' AND ereg('^(.*).php$', $templateFile))) AND file_exists($tpl = $dir.$templateFile))

				{

						/* Get translations key */

						$readFd = fopen($tpl, 'r');

						$content = (filesize($tpl) ? fread($readFd, filesize($tpl)) : '');

						preg_match_all(substr($templateFile, -4) == '.tpl' ? $tplRegex : $phpRegex, $content, $matches);

						fclose($readFd);

		

						/* Write each translation on its module file */

						$templateName = substr(basename($templateFile), 0, -4);

						foreach ($matches[1] as $key)

						{

							$postKey = md5($moduleName.'_'.$themeName.'_'.$templateName.'_'.md5($key));

							if (array_key_exists($postKey, $_POST) AND !empty($_POST[$postKey]))

								fwrite($writeFd, '$_MODULE[\'<{'.$moduleName.'}'.$themeName.'>'.$templateName.'_'.md5($key).'\'] = \''.pSQL($_POST[$postKey]).'\';'."\n");

						}

				}

			fwrite($writeFd, "\n?>\n");

			fclose($writeFd);

		}

	}



	public function findAndFillTranslations($files, &$translationsArray, $themeName, $moduleName)

	{

		global $_MODULES;

		$tplRegex = '/\{l s=\''._PS_TRANS_PATTERN_.'\'( mod=\'.+\')?( js=1)?\}/U';

		$phpRegex = '/this->l\(\''._PS_TRANS_PATTERN_.'\'(, \'(.+)\')?(, (.+))?\)/U';



		$count = 0;

		$dir = ($themeName == 'prestashop' ? _PS_MODULE_DIR_.$moduleName.'/' : _PS_ALL_THEMES_DIR_.$themeName.'/modules/'.$moduleName.'/');

		foreach ($files AS $templateFile)

			if ((ereg('^(.*).tpl$', $templateFile) OR ($themeName == 'prestashop' AND ereg('^(.*).php$', $templateFile))) AND file_exists($tpl = $dir.$templateFile))

			{

					/* Get translations key */

					$readFd = fopen($tpl, 'r');

					$content = (filesize($tpl) ? fread($readFd, filesize($tpl)) : '');

					preg_match_all(substr($templateFile, -4) == '.tpl' ? $tplRegex : $phpRegex, $content, $matches);

					fclose($readFd);

	

					/* Write each translation on its module file */

					$templateName = substr(basename($templateFile), 0, -4);

					foreach ($matches[1] as $key)

					{

						$moduleKey = '<{'.$moduleName.'}'.$themeName.'>'.$templateName.'_'.md5($key);

						$translationsArray[$themeName][$moduleName][$templateName][$key] = key_exists($moduleKey, $_MODULES) ? html_entity_decode($_MODULES[$moduleKey], ENT_COMPAT, 'UTF-8') : '';

					}

					$count += isset($translationsArray[$themeName][$moduleName][$templateName]) ? sizeof($translationsArray[$themeName][$moduleName][$templateName]) : 0;

			}

		return ($count);

	}



	public function postProcess()

	{

		global $currentIndex;



		if (Tools::isSubmit('submitCopyLang'))

		{

		 	if ($this->tabAccess['add'] === '1')

				$this->submitCopyLang();

			else

				$this->_errors[] = Tools::displayError('You do not have permission to add anything here.');

		}

		elseif (Tools::isSubmit('submitExport'))

		{

			if ($this->tabAccess['add'] === '1')

				$this->submitExportLang();

			else

				$this->_errors[] = Tools::displayError('You do not have permission to add anything here.');

		}

		elseif (Tools::isSubmit('submitImport'))

		{

		 	if ($this->tabAccess['add'] === '1')

				$this->submitImportLang();

			else

				$this->_errors[] = Tools::displayError('You do not have permission to add anything here.');

		}

		elseif (Tools::isSubmit('submitTranslationsFront'))

		{

			if ($this->tabAccess['edit'] === '1')

				$this->writeTranslationFile('Front', _PS_THEME_DIR_.'lang/'.Tools::strtolower(Tools::getValue('lang')).'.php');

			else

				$this->_errors[] = Tools::displayError('You do not have permission to edit anything here.');

		}

		elseif (Tools::isSubmit('submitTranslationsPDF'))

		{

		 	if ($this->tabAccess['edit'] === '1')

				$this->writeTranslationFile('PDF', _PS_TRANSLATIONS_DIR_.Tools::strtolower(Tools::getValue('lang')).'/pdf.php', 'PDF');

			else

				$this->_errors[] = Tools::displayError('You do not have permission to edit anything here.');

		}

		elseif (Tools::isSubmit('submitTranslationsBack'))

		{

		 	if ($this->tabAccess['edit'] === '1')

				$this->writeTranslationFile('Back', _PS_TRANSLATIONS_DIR_.Tools::strtolower(Tools::getValue('lang')).'/admin.php', 'ADM');

			else

				$this->_errors[] = Tools::displayError('You do not have permission to edit anything here.');

		}

		elseif (Tools::isSubmit('submitTranslationsErrors'))

		{

		 	if ($this->tabAccess['edit'] === '1')

				$this->writeTranslationFile('Errors', _PS_TRANSLATIONS_DIR_.Tools::strtolower(Tools::getValue('lang')).'/errors.php', false, 'ERRORS');

			else

				$this->_errors[] = Tools::displayError('You do not have permission to edit anything here.');

		}

		elseif (Tools::isSubmit('submitTranslationsFields'))

		{

		 	if ($this->tabAccess['edit'] === '1')

				$this->writeTranslationFile('Fields', _PS_TRANSLATIONS_DIR_.Tools::strtolower(Tools::getValue('lang')).'/fields.php', false, 'FIELDS');

			else

				$this->_errors[] = Tools::displayError('You do not have permission to edit anything here.');



		}

		elseif (Tools::isSubmit('submitTranslationsModules'))

		{

			if ($this->tabAccess['edit'] === '1')

			{

				$lang = Tools::strtolower($_POST['lang']);



				if (!$modules = scandir(_PS_MODULE_DIR_))

					$this->displayWarning(Tools::displayError('There are no modules in your copy of PrestaShop. Use the Modules tab to activate them or go to our Website to download additional Modules.'));

				else

					foreach ($modules AS $module)

						if ($module{0} != '.' AND $files = @scandir(_PS_MODULE_DIR_.$module.'/'))

							$this->findAndWriteTranslationsIntoFile(_PS_MODULE_DIR_.$module.'/'.$lang.'.php', $files, 'prestashop', $module);



				/* Search language tags (eg {l s='to translate'}) */

				if ($themes = scandir(_PS_ALL_THEMES_DIR_))

					foreach ($themes AS $theme)

						if ($theme{0} != '.' AND is_dir(_PS_ALL_THEMES_DIR_.$theme) AND file_exists(_PS_ALL_THEMES_DIR_.$theme.'/modules/'))

						{

							if ($modules = scandir(_PS_ALL_THEMES_DIR_.$theme.'/modules/'))

								foreach ($modules AS $module)

									if ($module{0} != '.' AND is_dir(_PS_ALL_THEMES_DIR_.$theme.'/modules/'.$module) AND $files = scandir(_PS_ALL_THEMES_DIR_.$theme.'/modules/'.$module.'/'))

										$this->findAndWriteTranslationsIntoFile(_PS_ALL_THEMES_DIR_.$theme.'/modules/'.$module.'/'.$lang.'.php', $files, $theme, $module);

						}

				Tools::redirectAdmin($currentIndex.'&conf=4&token='.$this->token);

			}

			else

				$this->_errors[] = Tools::displayError('You do not have permission to edit anything here.');

		}

	}



	public function display()

	{

		global $currentIndex, $cookie;



		$translations = array(

						'front' => $this->l('Front Office translations'),

						'back' => $this->l('Back Office translations'),

						'errors' => $this->l('Errors messages translations'),

						'fields' => $this->l('Fields name translations'),

						'modules' => $this->l('Modules translations'),

						'pdf' => $this->l('PDF translations'),

						);



		if ($type = Tools::getValue('type'))

			$this->{'displayForm'.$type}(Tools::strtolower(Tools::getValue('lang')));

		else

		{

			$languages = Language::getLanguages();

			echo '<fieldset class="width2"><legend><img src="../img/admin/translation.gif" />'.$this->l('Modify Translations').'</legend>'.

			$this->l('Here you can modify translations for every text input on PrestaShop.').'<br />'.

			$this->l('First, select a section (such as Back Office or Modules), then select the language you want to edit.').'<br /><br />

			<form method="get" action="index.php" id="typeTranslationForm">

				<input type="hidden" name="tab" value="AdminTranslations" />

				<input type="hidden" name="lang" id="translation_lang" value="0" />

				<select name="type" style="float:left; margin-right:10px;">';

			foreach ($translations as $key => $translation)

				echo '<option value="'.$key.'">'.$translation.'</option>';

			echo '</select>';

			foreach ($languages as $language)

				echo '<a href="javascript:chooseTypeTranslation(\''.$language['iso_code'].'\')">

						<img src="'._THEME_LANG_DIR_.$language['id_lang'].'.jpg" alt="'.$language['iso_code'].'" title="'.$language['iso_code'].'" />

					</a>';

			echo '<input type="hidden" name="token" value="'.$this->token.'" /></form></fieldset>

			<br /><br /><h2>'.$this->l('Translation exchange').'</h2>

			<form action="'.$currentIndex.'&token='.$this->token.'" method="post" enctype="multipart/form-data">

				<fieldset class="width2"><legend><img src="../img/admin/import.gif" />'.$this->l('Import a language pack').'</legend>

					<p>'.$this->l('Import data from file (language pack).').'<br />'.

					$this->l('Be careful, as it will replace all existing data for the destination language!').'<br />'.

					$this->l('Browse your computer for the language file to be imported:').'</p>

					<div style="float:left;">

						<p>

							<div style="width:75px; font-weight:bold; float:left;">'.$this->l('From:').'</div>

							<input type="file" name="file" />

						</p>

					</div>

					<div style="float:left;">

						<input type="submit" value="'.$this->l('Import').'" name="submitImport" class="button" style="margin:25px 0px 0px 25px;" />

					</div>

				</fieldset>

			</form>

			<br /><br />

			<form action="'.$currentIndex.'&token='.$this->token.'" method="post" enctype="multipart/form-data">

				<fieldset class="width2"><legend><img src="../img/admin/export.gif" />'.$this->l('Export a language').'</legend>

					<p>'.$this->l('Export data from one language to a file (language pack).').'<br />'.

					$this->l('Choose the theme from which you want to export translations.').'<br />

					<select name="iso_code" style="margin-top:10px;">';

				foreach ($languages as $language)

					echo '<option value="'.$language['iso_code'].'">'.$language['name'].'</option>';

				echo '

					</select>

					&nbsp;&nbsp;&nbsp;

					<select name="theme" style="margin-top:10px;">';

				$themes = self::getThemesList();

				foreach ($themes as $theme)

					echo '<option value="'.$theme['name'].'">'.$theme['name'].'</option>';

				echo '

					</select>&nbsp;&nbsp;

					<input type="submit" class="button" name="submitExport" value="'.$this->l('Export').'" />

				</fieldset>

			</form>

			<br /><br />

			<form action="'.$currentIndex.'&token='.$this->token.'" method="post">

				<fieldset class="width2"><legend><img src="../img/admin/copy_files.gif" />'.$this->l('Copy').'</legend>

					<p>'.$this->l('Copies data from one language to another.').'<br />'.

					$this->l('Be careful, as it will replace all existing data for the destination language!').'<br />'.

					$this->l('If necessary').', <b><a href="index.php?tab=AdminLanguages&addlang&token='.Tools::getAdminToken('AdminLanguages'.intval(Tab::getIdFromClassName('AdminLanguages')).intval($cookie->id_employee)).'">'.$this->l('first create a new language').'</a></b>.</p>

					<div style="float:left;">

						<p>

							<div style="width:75px; font-weight:bold; float:left;">'.$this->l('From:').'</div>

							<select name="fromLang">';

					foreach	($languages AS $language)

						echo '<option value="'.$language['iso_code'].'">'.$language['name'].'</option>';

					echo '

							</select>

							&nbsp;&nbsp;&nbsp;

							<select name="fromTheme">';

						$themes = self::getThemesList();

						foreach ($themes as $theme)

							echo '<option value="'.$theme['name'].'">'.$theme['name'].'</option>';

						echo '

							</select>

						</p>

						<p>

							<div style="width:75px; font-weight:bold; float:left;">'.$this->l('To:').'</div>

							<select name="toLang">';

					foreach	($languages AS $language)

						echo '<option value="'.$language['iso_code'].'">'.$language['name'].'</option>';

					echo '

							</select>

							&nbsp;&nbsp;&nbsp;

							<select name="toTheme">';

						$themes = self::getThemesList();

						foreach ($themes as $theme)

							echo '<option value="'.$theme['name'].'">'.$theme['name'].'</option>';

						echo '

							</select>

						</p>

					</div>

					<div style="float:left;">

						<input type="submit" value="'.$this->l('   Copy   ').'" name="submitCopyLang" class="button" style="margin:25px 0px 0px 25px;" />

					</div>

				</fieldset>

			</form>';

		}

	}



	function fileExists($dir, $file, $var)

	{

		${$var} = array();

		if (!file_exists($dir))

			if (!mkdir($dir, 0700))

				die('Please create the directory '.$dir);

		if (!file_exists($dir.'/'.$file))

			if (!file_put_contents($dir.'/'.$file, "<?php\n\nglobal \$".$var.";\n\$".$var." = array();\n\n?>"))

				die('Please create a "'.$file.'" file in '.$dir);

		if (!is_writable($dir.'/'.$file))

			$this->displayWarning(Tools::displayError('This file has to be writable:').' '.$dir.'/'.$file);

		include($dir.'/'.$file);

		return ${$var};

	}



	function displayToggleButton()

	{

		echo '

		<script type="text/javascript">

			var openAll = \''.$this->l('Expand all fieldsets').'\';

			var closeAll = \''.$this->l('Close all fieldsets').'\';

		</script>

		<input type="button" class="button" id="buttonall" onclick="openCloseAllDiv(\''.$_GET['type'].'_div\', this.value == openAll); toggleElemValue(this.id, openAll, closeAll);" />

		<script type="text/javascript">toggleElemValue(\'buttonall\', openAll, closeAll);</script>';

	}



	function displayFormfront($lang)

	{

		global $currentIndex;

		$_LANG = $this->fileExists(_PS_THEME_DIR_.'lang', Tools::strtolower($lang).'.php', '_LANG');



		/* List templates to parse */

		$templates = scandir(_PS_THEME_DIR_);

		$count = 0;

		$files = array();

		foreach ($templates AS $template)

			if (ereg('^(.*).tpl$', $template) AND file_exists($tpl = _PS_THEME_DIR_.$template))

			{

				$template = substr(basename($template), 0, -4);

				$newLang = array();

				$fd = fopen($tpl, 'r');

				$content = fread($fd, filesize($tpl));



				/* Search language tags (eg {l s='to translate'}) */

				$regex = '/\{l s=\''._PS_TRANS_PATTERN_.'\'( js=1)?\}/U';

				preg_match_all($regex, $content, $matches);



				/* Get string translation */

				foreach($matches[1] as $key)

				{

					$key2 = $template.'_'.md5($key);

					$newLang[$key] = (key_exists($key2, $_LANG)) ? html_entity_decode($_LANG[$key2], ENT_COMPAT, 'UTF-8') : '';

				}

				$files[$template] = $newLang;

				$count += sizeof($newLang);

			}



		echo '

		<h2>'.$this->l('Language').' : '.Tools::strtoupper($lang).'</h2>

		'.$this->l('Total expressions').' : <b>'.$count.'</b>. '.$this->l('Click the fieldset title to expand or close the fieldset.').'.<br /><br />

		<form method="post" action="'.$currentIndex.'&submitTranslationsFront=1&token='.$this->token.'" class="form">';

		$this->displayToggleButton();

		echo '<input type="hidden" name="lang" value="'.$lang.'" /><input type="submit" name="submitTranslationsFront" value="'.$this->l('Update translations').'" class="button" /><br /><br />';

		foreach ($files as $k => $newLang)

			if (sizeof($newLang))

			{

				$countValues = array_count_values($newLang);

				$empty = isset($countValues['']) ? $countValues[''] : 0;

			 	echo '

				<fieldset class="width3"><legend style="cursor : pointer" onclick="openCloseLayer(\''.$k.'\')">'.$k.' - <font color="blue">'.sizeof($newLang).'</font> '.$this->l('expressions').' (<font color="red">'.$empty.'</font>)</legend>

					<div name="front_div" id="'.$k.'" style="display: '.($empty ? 'block' : 'none').';">

						<table cellpadding="2">';

				foreach ($newLang as $key => $value)

					echo '<tr><td>'.stripslashes($key).'</td><td style="width: 380px">= <input type="text" name="'.$k.'_'.md5($key).'" value="'.stripslashes(preg_replace('/"/', '\&quot;', stripslashes($value))).'" style="width: 350px"></td></tr>';

				echo '

						</table>

					</div>

				</fieldset><br />';

			}

		echo '<br /><input type="submit" name="submitTranslationsFront" value="'.$this->l('Update translations').'" class="button" /></form>';

	}



	function displayFormback($lang)

	{

		global $currentIndex;

		$_LANGADM = $this->fileExists(_PS_TRANSLATIONS_DIR_.$lang, 'admin.php', '_LANGADM');



		/* List templates to parse */

		$count = 0;

		$tabs = scandir(PS_ADMIN_DIR.'/tabs');

		$tabs[] = '../../classes/AdminTab.php';

		$files = array();

		foreach ($tabs AS $tab)

			if (ereg('^(.*)\.php$', $tab) AND file_exists($tpl = PS_ADMIN_DIR.'/tabs/'.$tab))

			{

				$tab = basename(substr($tab, 0, -4));

				$newLang = array();

				$fd = fopen($tpl, 'r');

				$content = fread($fd, filesize($tpl));

				fclose($fd);

				$regex = '/this->l\(\''._PS_TRANS_PATTERN_.'\'[\)|\,]/U';

				preg_match_all($regex, $content, $matches);

				foreach ($matches[1] as $key)

					$tabsArray[$tab][$key] = stripslashes(key_exists($tab.md5($key), $_LANGADM) ? html_entity_decode($_LANGADM[$tab.md5($key)], ENT_COMPAT, 'UTF-8') : '');

				$count += isset($tabsArray[$tab]) ? sizeof($tabsArray[$tab]) : 0;

			}



		echo '

		<h2>'.$this->l('Language').' : '.Tools::strtoupper($lang).'</h2>

		'.$this->l('Expressions to translate').' : <b>'.$count.'</b>. '.$this->l('Click on the titles to open fieldsets').'.<br /><br />

		<form method="post" action="'.$currentIndex.'&submitTranslationsBack=1&token='.$this->token.'" class="form">';

		$this->displayToggleButton();

		echo '<input type="hidden" name="lang" value="'.$lang.'" /><input type="submit" name="submitTranslationsBack" value="'.$this->l('Update translations').'" class="button" /><br /><br />';

		foreach ($tabsArray as $k => $newLang)

			if (sizeof($newLang))

			{

				$countValues = array_count_values($newLang);

				$empty = isset($countValues['']) ? $countValues[''] : 0;

			 	echo '

				<fieldset style="width: 700px"><legend style="cursor : pointer" onclick="openCloseLayer(\''.$k.'\')">'.$k.' - <font color="blue">'.sizeof($newLang).'</font> '.$this->l('expressions').' (<font color="red">'.$empty.'</font>)</legend>

					<div name="back_div" id="'.$k.'" style="display: '.($empty ? 'block' : 'none').';">

						<table cellpadding="2">';

				foreach ($newLang as $key => $value)

				{

					echo '

					<tr>

						<td>'.stripslashes($key).'</td>

						<td style="width: 280px">

							= <input type="text" name="'.$k.md5($key).'" value="'.stripslashes(preg_replace('/"/', '\&quot;', $value)).'" style="width: 250px">

						</td>

					</tr>';

				}

				echo '

						</table>

					</div>

				</fieldset><br />';

			}

		echo '<br /><input type="submit" name="submitTranslationsBack" value="'.$this->l('Update translations').'" class="button" /></form>';

	}



	function displayFormerrors($lang)

	{

		global $currentIndex;

		$_ERRORS = $this->fileExists(_PS_TRANSLATIONS_DIR_.$lang, 'errors.php', '_ERRORS');



		/* List files to parse */

		$stringToTranslate = array();

		$dirToParse = array(PS_ADMIN_DIR.'/../',

							PS_ADMIN_DIR.'/../classes/',

							PS_ADMIN_DIR.'/',

							PS_ADMIN_DIR.'/tabs/');

		foreach ($dirToParse AS $dir)

			foreach (scandir($dir) AS $file)

				if (ereg('.php$', $file) AND file_exists($fn = $dir.$file) AND $file != 'index.php')

				{

					preg_match_all('/Tools::displayError\(\''._PS_TRANS_PATTERN_.'\'\)/U', fread(fopen($fn, 'r'), filesize($fn)), $matches);

					foreach($matches[1] as $key)

						$stringToTranslate[$key] = (key_exists(md5($key), $_ERRORS)) ? html_entity_decode($_ERRORS[md5($key)], ENT_COMPAT, 'UTF-8') : '';

				}



		$irow = 0;

		echo '<h2>'.$this->l('Language').' : '.Tools::strtoupper($lang).'</h2>'.$this->l('Errors to translate').' : <b>'.sizeof($stringToTranslate).'</b><br /><br />

		<form method="post" action="'.$currentIndex.'&submitTranslationsErrors=1&lang='.$lang.'&token='.$this->token.'" class="form">

		<input type="submit" name="submitTranslationsErrors" value="'.$this->l('Update translations').'" class="button" /><br /><br />

		<table cellpadding="0" cellspacing="0" class="table">';

		foreach ($stringToTranslate as $key => $value)

			echo '<tr '.(++$irow % 2 ? 'class="alt_row"' : '').'><td>'.stripslashes($key).'</td><td style="width: 430px">= <input type="text" name="'.md5($key).'" value="'.preg_replace('/"/', '&quot;', stripslashes($value)).'" style="width: 400px"></td></tr>';

		echo '</table><br /><input type="submit" name="submitTranslationsErrors" value="'.$this->l('Update translations').'" class="button" /></form>';

	}



	function displayFormfields($lang)

	{

		global $currentIndex;

		$_FIELDS = $this->fileExists(_PS_TRANSLATIONS_DIR_.$lang, 'fields.php', '_FIELDS');



		$classArray = array();

		$count = 0;

		foreach (scandir(_PS_CLASS_DIR_) AS $classFile)

		{

			if (!preg_match('/\.php$/', $classFile) OR $classFile == 'index.php')

				continue;

			include_once(_PS_CLASS_DIR_.$classFile);

			$className = substr($classFile, 0, -4);

			if (!class_exists($className))

				continue;

			if (!is_subclass_of($className, 'ObjectModel'))

				continue;

			$classArray[$className] = call_user_func(array($className, 'getValidationRules'), $className);

			if (isset($classArray[$className]['validate']))

				$count += sizeof($classArray[$className]['validate']);

			if (isset($classArray[$className]['validateLang']))

				$count += sizeof($classArray[$className]['validateLang']);

		}





		echo '

		<h2>'.$this->l('Language').' : '.Tools::strtoupper($lang).'</h2>

		'.$this->l('Fields to translate').' : <b>'.$count.'</b>. '.$this->l('Click on the titles to open fieldsets').'.<br /><br />

		<form method="post" action="'.$currentIndex.'&submitTranslationsFields=1&token='.$this->token.'" class="form">';

		$this->displayToggleButton();

		echo '<input type="hidden" name="lang" value="'.$lang.'" /><input type="submit" name="submitTranslationsFields" value="'.$this->l('Update translations').'" class="button" /><br /><br />';

		foreach ($classArray AS $className => $rules)

		{

			$translated = 0;

			$toTranslate = 0;

			if (isset($rules['validate']))

				foreach ($rules['validate'] AS $key => $value)

					(array_key_exists($className.'_'.md5($key), $_FIELDS)) ? ++$translated : ++$toTranslate;

			if (isset($rules['validateLang']))

				foreach ($rules['validateLang'] AS $key => $value)

					(array_key_exists($className.'_'.md5($key), $_FIELDS)) ? ++$translated : ++$toTranslate;

			echo '

			<fieldset class="width3"><legend style="cursor : pointer" onclick="openCloseLayer(\''.$className.'\')">'.$className.' - <font color="blue">'.($toTranslate + $translated).'</font> '.$this->l('fields').' (<font color="red">'.$toTranslate.'</font>)</legend>

			<div name="fields_div" id="'.$className.'" style="display: '.($toTranslate ? 'block' : 'none').';">

				<table cellpadding="2">';

			if (isset($rules['validate']))

				foreach ($rules['validate'] AS $key => $value)

					echo '<tr><td>'.stripslashes($key).'</td><td style="width: 380px">= <input type="text" name="'.$className.'_'.md5(addslashes($key)).'" value="'.(array_key_exists($className.'_'.md5(addslashes($key)), $_FIELDS) ? html_entity_decode($_FIELDS[$className.'_'.md5(addslashes($key))], ENT_NOQUOTES, 'UTF-8') : '').'" style="width: 350px"></td></tr>';

			if (isset($rules['validateLang']))

				foreach ($rules['validateLang'] AS $key => $value)

					echo '<tr><td>'.stripslashes($key).'</td><td style="width: 380px">= <input type="text" name="'.$className.'_'.md5(addslashes($key)).'" value="'.(array_key_exists($className.'_'.md5(addslashes($key)), $_FIELDS) ? html_entity_decode($_FIELDS[$className.'_'.md5(addslashes($key))], ENT_COMPAT, 'UTF-8') : '').'" style="width: 350px"></td></tr>';

			echo '

				</table>

			</div>

			</fieldset><br />';

		}

		echo '<br /><input type="submit" name="submitTranslationsFields" value="'.$this->l('Update translations').'" class="button" /></form>';

	}



	function displayFormModules($lang)

	{

		global $currentIndex, $_MODULES;



		if (!file_exists(_PS_MODULE_DIR_))

			die($this->displayWarning(Tools::displayError('Fatal error: Module directory is not here anymore ').'('._PS_MODULE_DIR_.')'));

		if (!is_writable(_PS_MODULE_DIR_))

			$this->displayWarning(Tools::displayError('The module directory must be writable'));

		if (!$modules = scandir(_PS_MODULE_DIR_))

			$this->displayWarning(Tools::displayError('There are no modules in your copy of PrestaShop. Use the Modules tab to activate them or go to our Website to download additional Modules.'));

		else

		{

			$allfiles = array();

			$count = 0;



			foreach ($modules AS $module)

				if ($module{0} != '.')

				{

					@include_once(_PS_MODULE_DIR_.$module.'/'.$lang.'.php');

					self::getModuleTranslations();



					if ($files = @scandir(_PS_MODULE_DIR_.$module.'/'))

						$count += $this->findAndFillTranslations($files, $allfiles, 'prestashop', $module);

				}



			if ($themes = scandir(_PS_ALL_THEMES_DIR_))

				foreach ($themes AS $theme)

					if ($theme{0} != '.' AND is_dir(_PS_ALL_THEMES_DIR_.$theme) AND file_exists(_PS_ALL_THEMES_DIR_.$theme.'/modules/'))

						{

							$modules = scandir(_PS_ALL_THEMES_DIR_.$theme.'/modules/');

							if ($modules)

								foreach ($modules AS $module)

									if ($module{0} != '.' AND is_dir(_PS_ALL_THEMES_DIR_.$theme.'/modules/'.$module))

									{

										@include_once(_PS_ALL_THEMES_DIR_.$theme.'/modules/'.$module.'/'.$lang.'.php');

										self::getModuleTranslations();



										$files = scandir(_PS_ALL_THEMES_DIR_.$theme.'/modules/'.$module.'/');

										if ($files)

											$count += $this->findAndFillTranslations($files, $allfiles, $theme, $module);

									}

						}



			echo '

			<h2>'.$this->l('Language').' : '.Tools::strtoupper($lang).'</h2>

			'.$this->l('Total expressions').' : <b>'.$count.'</b>. '.$this->l('Click the fieldset title to expand or close the fieldset.').'.<br /><br />

			<form method="post" action="'.$currentIndex.'&submitTranslationsModules=1&token='.$this->token.'" class="form">';

			$this->displayToggleButton();

			echo '<input type="hidden" name="lang" value="'.$lang.'" /><input type="submit" name="submitTranslationsModules" value="'.$this->l('Update translations').'" class="button" /><br /><br />';

			foreach ($allfiles AS $theme_name => $theme)

				foreach ($theme AS $module_name => $module)

					foreach ($module AS $template_name => $newLang)

						if (sizeof($newLang))

						{

							$countValues = array_count_values($newLang);

							$empty = isset($countValues['']) ? $countValues[''] : 0;

							echo '

							<fieldset class="width3"><legend style="cursor : pointer" onclick="openCloseLayer(\''.$theme_name.'_'.$module_name.'_'.$template_name.'\')">'.$theme_name.' - '.$template_name.' - <font color="blue">'.sizeof($newLang).'</font> '.$this->l('expressions').' (<font color="red">'.$empty.'</font>)</legend>

								<div name="modules_div" id="'.$theme_name.'_'.$module_name.'_'.$template_name.'" style="display: '.($empty ? 'block' : 'none').';">

									<table cellpadding="2">';

							foreach ($newLang as $key => $value)

								echo '<tr><td>'.stripslashes($key).'</td><td style="width: 380px">= <input type="text" name="'.md5($module_name.'_'.$theme_name.'_'.$template_name.'_'.md5($key)).'" value="'.stripslashes(preg_replace('/"/', '\&quot;', stripslashes($value))).'" style="width: 350px" /></td></tr>';

							echo '

									</table>

								</div>

							</fieldset><br />';

						}

			echo '<br /><input type="submit" name="submitTranslationsModules" value="'.$this->l('Update translations').'" class="button" /></form>';



		}

	}



	function displayFormPDF()

	{

		global $currentIndex;



		$lang = Tools::strtolower(Tools::getValue('lang'));

		$_LANG = array();

		if (!file_exists(_PS_TRANSLATIONS_DIR_.$lang))

			if (!mkdir(_PS_TRANSLATIONS_DIR_.$lang, 0700))

				die('Please create a "'.$iso.'" directory in '._PS_TRANSLATIONS_DIR_);

		if (!file_exists(_PS_TRANSLATIONS_DIR_.$lang.'/pdf.php'))

			if (!file_put_contents(_PS_TRANSLATIONS_DIR_.$lang.'/pdf.php', "<?php\n\nglobal \$_LANGPDF;\n\$_LANGPDF = array();\n\n?>"))

				die('Please create a "'.Tools::strtolower($lang).'.php" file in '.realpath(PS_ADMIN_DIR.'/'));

		unset($_LANGPDF);

		@include(_PS_TRANSLATIONS_DIR_.$lang.'/pdf.php');

		$files = array();

		$count = 0;

		$tab = 'PDF_invoice';

		$pdf = _PS_CLASS_DIR_.'PDF.php';

		$newLang = array();

		$fd = fopen($pdf, 'r');

		$content = fread($fd, filesize($pdf));

		fclose($fd);

		$regex = '/self::l\(\''._PS_TRANS_PATTERN_.'\'[\)|\,]/U';

		preg_match_all($regex, $content, $matches);

		foreach($matches[1] as $key)

			$tabsArray[$tab][$key] = stripslashes(key_exists($tab.md5(addslashes($key)), $_LANGPDF) ? html_entity_decode($_LANGPDF[$tab.md5(addslashes($key))], ENT_COMPAT, 'UTF-8') : '');

		$count += isset($tabsArray[$tab]) ? sizeof($tabsArray[$tab]) : 0;



		echo '

		<h2>'.$this->l('Language').' : '.Tools::strtoupper($lang).'</h2>

		'.$this->l('Expressions to translate').' : <b>'.$count.'</b>. '.$this->l('Click on the titles to open fieldsets').'.<br /><br />

		<form method="post" action="'.$currentIndex.'&submitTranslationsPDF=1&token='.$this->token.'" class="form">

				<script type="text/javascript">

					var openAll = \''.$this->l('Expand all fieldsets').'\';

					var closeAll = \''.$this->l('Close all fieldsets').'\';

				</script>

				<input type="hidden" name="lang" value="'.$lang.'" />

				<input type="button" class="button" id="buttonall" onclick="openCloseAllDiv(\'pdf_div\', this.value == openAll); toggleElemValue(this.id, openAll, closeAll);" />

				<script type="text/javascript">

					toggleElemValue(\'buttonall\', openAll, closeAll);

				</script>';

		echo '<input type="submit" name="submitTranslationsPDF" value="'.$this->l('Update translations').'" class="button" /><br /><br />';

		foreach ($tabsArray as $k => $newLang)

			if (sizeof($newLang))

			{

				$countValues = array_count_values($newLang);

				$empty = isset($countValues['']) ? $countValues[''] : 0;

			 	echo '

				<fieldset style="width: 700px"><legend style="cursor : pointer" onclick="openCloseLayer(\''.$k.'\')">'.$k.' - <font color="blue">'.sizeof($newLang).'</font> '.$this->l('expressions').' (<font color="red">'.$empty.'</font>)</legend>

					<div name="pdf_div" id="'.$k.'" style="display: '.($empty ? 'block' : 'none').';">

						<table cellpadding="2">';

				foreach ($newLang as $key => $value)

				{

					echo '

					<tr>

						<td>'.stripslashes($key).'</td>

						<td style="width: 280px">

							= <input type="text" name="'.$k.md5($key).'" value="'.stripslashes(preg_replace('/"/', '\&quot;', $value)).'" style="width: 250px">

						</td>

					</tr>';

				}

				echo '

						</table>

					</div>

				</fieldset><br />';

			}

		echo '<br /><input type="submit" name="submitTranslationsPDF" value="'.$this->l('Update translations').'" class="button" /></form>';

	}



	/**

	  * Return an array with themes and thumbnails

	  *

	  * @return array

	  */

	static public function getThemesList()

	{

		$dir = opendir(_PS_ALL_THEMES_DIR_);

		while ($folder = readdir($dir))

			if ($folder != '.' AND $folder != '..' AND file_exists(_PS_ALL_THEMES_DIR_.'/'.$folder.'/preview.jpg'))

				$themes[$folder]['name'] = $folder;

		closedir($dir);

		return isset($themes) ? $themes : array();

	}

}

?>

