/admin800/tabs/AdminTranslations.php
PHP | 1541 lines | 1273 code | 89 blank | 179 comment | 174 complexity | 276015c77d879acfd175bd5621a7e58f MD5 | raw file
Possible License(s): LGPL-2.1
Large files files are truncated, but you can click here to view the full file
- <?php
- /*
- * 2007-2011 PrestaShop
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to http://www.prestashop.com for more information.
- *
- * @author PrestaShop SA <contact@prestashop.com>
- * @copyright 2007-2011 PrestaShop SA
- * @version Release: $Revision: 7082 $
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
- * International Registered Trademark & Property of PrestaShop SA
- */
- include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php');
- include_once(PS_ADMIN_DIR.'/../tools/tar/Archive_Tar.php');
- include_once(PS_ADMIN_DIR.'/../tools/pear/PEAR.php');
- define ('TEXTAREA_SIZED', 70);
- class AdminTranslations extends AdminTab
- {
- protected $total_expression = 0;
- protected $all_iso_lang = array();
- protected $modules_translations = array();
- const DEFAULT_THEME_NAME = 'default';
- protected static $tpl_regexp = '';
- protected static $php_regexp = '';
- /**
- * Is true if number of var exceed the suhosin request or post limit
- *
- * @var boolean
- */
- protected $suhosin_limit_exceed = false;
-
- public function __construct()
- {
- parent::__construct();
- self::$tpl_regexp = '/\{l s=\''._PS_TRANS_PATTERN_.'\'( mod=\'.+\')?( js=1)?\}/U';
- self::$php_regexp = '/->l\(\''._PS_TRANS_PATTERN_.'\'(, \'(.+)\')?(, (.+))?\)/U';
- }
-
- /**
- * This method merge each arrays of modules translation in
- * the array of modules translations
- *
- * @param boolean $is_default if true a prefix is set before each keys in global $_MODULES array
- */
- protected function getModuleTranslations($is_default = false)
- {
- global $_MODULES, $_MODULE;
- if (!isset($_MODULE) AND !isset($_MODULES))
- $_MODULES = array();
- elseif (isset($_MODULE))
- {
- if(is_array($_MODULE) AND $is_default === true)
- {
- $_NEW_MODULE = array();
- foreach($_MODULE as $key=>$value)
- {
- $_NEW_MODULE[self::DEFAULT_THEME_NAME.$key] = $value;
- }
- $_MODULE = $_NEW_MODULE;
- }
- $_MODULES = (is_array($_MODULES) AND is_array($_MODULE)) ? array_merge($_MODULES, $_MODULE) : $_MODULE;
- }
- }
-
- /**
- * This method is only used by AdminTranslations::submitCopyLang().
- *
- * It try to create folder in new theme.
- *
- * When a translation file is copied for a module, its translation key is wrong.
- * We have to change the translation key and rewrite the file.
- *
- * @param string $dest file name
- * @return bool
- */
- protected function checkDirAndCreate($dest)
- {
- $bool = true;
- // To get only folder path
- $path = dirname($dest);
- // If folder wasn't already added
- if (!file_exists($path))
- {
- if(!mkdir($path, 0777, true))
- {
- $bool &= false;
- $this->_errors[] = $this->l('Cannot create the folder').' "'.$path.'". '.$this->l('Check directory writing permissions.');
- }
- }
- return $bool;
- }
- protected 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] = $value;
- $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::getFilesList($fromLang, $fromTheme, $toLang, $toTheme, false, false, true);
- foreach ($items AS $source => $dest)
- {
- $bool &= $this->checkDirAndCreate($dest);
- $bool &= @copy($source, $dest);
-
- if (strpos($dest, 'modules') AND basename($source) === $fromLang.'.php' AND $bool !== false)
- {
- $bool &= $this->changeModulesKeyTranslation($dest, $fromTheme, $toTheme);
- }
- }
- 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 could not be found or copied');
- }
-
- /**
- * Change the key translation to according it to theme name.
- *
- * @param string $path
- * @param string $theme_from
- * @param string $theme_to
- * @return boolean
- */
- public function changeModulesKeyTranslation ($path, $theme_from, $theme_to)
- {
- $content = file_get_contents($path);
- $arr_replace = array();
- $bool_flag = true;
- if(preg_match_all('#\$_MODULE\[\'([^\']+)\'\]#Ui', $content, $matches))
- {
- foreach ($matches[1] as $key=>$value)
- {
- $arr_replace[$value] = str_replace($theme_from, $theme_to, $value);
- }
- $content = str_replace(array_keys($arr_replace), array_values($arr_replace), $content);
- $bool_flag = (file_put_contents($path, $content) === false) ? false : true;
- }
- return $bool_flag;
- }
- public function submitExportLang()
- {
- global $currentIndex;
- $lang = strtolower(Tools::getValue('iso_code'));
- $theme = strval(Tools::getValue('theme'));
- if ($lang AND $theme)
- {
- $items = array_flip(Language::getFilesList($lang, $theme, false, false, false, false, true));
- $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 theme.');
- }
-
- public function checkAndAddMailsFiles ($iso_code, $files_list)
- {
- $mails = scandir(_PS_MAIL_DIR_.'en/');
- $mails_new_lang = array();
- foreach ($files_list as $file)
- {
- if (preg_match('#^mails\/([a-z0-9]+)\/#Ui', $file['filename'], $matches))
- {
- $slash_pos = strrpos($file['filename'], '/');
- $mails_new_lang[] = substr($file['filename'], -(strlen($file['filename'])-$slash_pos-1));
- }
- }
- $arr_mails_needed = array_diff($mails, $mails_new_lang);
- foreach ($arr_mails_needed as $mail_to_add)
- {
- if ($mail_to_add !== '.' && $mail_to_add !== '..' && $mail_to_add !== '.svn')
- {
- @copy(_PS_MAIL_DIR_.'en/'.$mail_to_add, _PS_MAIL_DIR_.$iso_code.'/'.$mail_to_add);
- }
- }
- }
- 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);
- $iso_code = str_replace('.gzip', '', $_FILES['file']['name']);
- $files_list = $gz->listContent();
- if ($gz->extract(_PS_TRANSLATIONS_DIR_.'../', false))
- {
- $this->checkAndAddMailsFiles($iso_code, $files_list);
- if (Validate::isLanguageFileName($_FILES['file']['name']))
- {
- if (!Language::checkAndAddLanguage($iso_code))
- $conf = 20;
- }
- Tools::redirectAdmin($currentIndex.'&conf='.(isset($conf) ? $conf : '15').'&token='.$this->token);
- }
- $this->_errors[] = Tools::displayError('Archive cannot be extracted.');
- }
- }
-
- public function submitAddLang()
- {
- global $currentIndex;
- $arr_import_lang = explode('|', Tools::getValue('params_import_language')); /* 0 = Language ISO code, 1 = PS version */
- if (Validate::isLangIsoCode($arr_import_lang[0]))
- {
- if ($content = Tools::file_get_contents('http://www.prestashop.com/download/lang_packs/gzip/'.$arr_import_lang[1].'/'.$arr_import_lang[0].'.gzip', false, stream_context_create(array('http' => array('method' => 'GET', 'timeout' => 5)))))
- {
- $file = _PS_TRANSLATIONS_DIR_.$arr_import_lang[0].'.gzip';
- if (file_put_contents($file, $content))
- {
- $gz = new Archive_Tar($file, true);
- $files_list = $gz->listContent();
- if ($gz->extract(_PS_TRANSLATIONS_DIR_.'../', false))
- {
- $this->checkAndAddMailsFiles($arr_import_lang[0], $files_list);
- if (!Language::checkAndAddLanguage($arr_import_lang[0]))
- $conf = 20;
- if (!unlink($file))
- $this->_errors[] = Tools::displayError('Cannot delete archive');
- Tools::redirectAdmin($currentIndex.'&conf='.(isset($conf) ? $conf : '15').'&token='.$this->token);
- }
- $this->_errors[] = Tools::displayError('Archive cannot be extracted.');
- if (!unlink($file))
- $this->_errors[] = Tools::displayError('Cannot delete archive');
- }
- else
- $this->_errors[] = Tools::displayError('Server does not have permissions for writing.');
- }
- else
- $this->_errors[] = Tools::displayError('Language not found');
- }
- else
- $this->_errors[] = Tools::displayError('Invalid parameter');
- }
-
- /**
- * This method check each file (tpl or php file), get its sentences to translate,
- * compare with posted values and write in iso code translation file.
- *
- * @param string $file_name
- * @param array $files
- * @param string $theme_name
- * @param string $module_name
- * @param string|boolean $dir
- * @return void
- */
- protected function findAndWriteTranslationsIntoFile($file_name, $files, $theme_name, $module_name, $dir = false)
- {
- // These static vars allow to use file to write just one time.
- static $_cache_file = array();
- static $str_write = '';
- static $array_check_duplicate = array();
-
- // Default translations and Prestashop overriding themes are distinguish
- $is_default = $theme_name === self::DEFAULT_THEME_NAME ? true : false;
-
- // Set file_name in static var, this allow to open and wright the file just one time
- if (!isset($_cache_file[($is_default ? self::DEFAULT_THEME_NAME : $theme_name).'-'.$file_name]) )
- {
- $str_write = '';
- $_cache_file[($is_default ? self::DEFAULT_THEME_NAME : $theme_name).'-'.$file_name] = true;
- if(!file_exists($file_name))
- file_put_contents($file_name, '');
- if (!is_writable($file_name))
- die ($this->l('Cannot write the theme\'s language file ').'('.$file_name.')'.$this->l('. Please check write permissions.'));
-
- // this string is initialized one time for a file
- $str_write .= "<?php\n\nglobal \$_MODULE;\n\$_MODULE = array();\n";
- $array_check_duplicate = array();
- }
-
- if (!$dir)
- $dir = ($theme_name == self::DEFAULT_THEME_NAME ? _PS_MODULE_DIR_.$module_name.'/' : _PS_ALL_THEMES_DIR_.$theme_name.'/modules/'.$module_name.'/');
-
- foreach ($files AS $template_file)
- {
- if ((preg_match('/^(.*).tpl$/', $template_file) OR ($is_default AND preg_match('/^(.*).php$/', $template_file))) AND file_exists($tpl = $dir.$template_file))
- {
- // Get translations key
- $content = file_get_contents($tpl);
- preg_match_all(substr($template_file, -4) == '.tpl' ? self::$tpl_regexp : self::$php_regexp, $content, $matches);
-
- // Write each translation on its module file
- $template_name = substr(basename($template_file), 0, -4);
-
- foreach ($matches[1] AS $key)
- {
- $post_key = md5(strtolower($module_name).'_'.($is_default ? self::DEFAULT_THEME_NAME : strtolower($theme_name)).'_'.strtolower($template_name).'_'.md5($key));
- $pattern = '\'<{'.strtolower($module_name).'}'.($is_default ? 'prestashop' : strtolower($theme_name)).'>'.strtolower($template_name).'_'.md5($key).'\'';
- if (array_key_exists($post_key, $_POST) AND !empty($_POST[$post_key]) AND !in_array($pattern, $array_check_duplicate))
- {
- $array_check_duplicate[] = $pattern;
- $str_write .= '$_MODULE['.$pattern.'] = \''.pSQL($_POST[$post_key]).'\';'."\n";
- $this->total_expression++;
- }
- }
- }
- }
- if (isset($_cache_file[($is_default ? self::DEFAULT_THEME_NAME : $theme_name).'-'.$file_name]) AND $str_write != "<?php\n\nglobal \$_MODULE;\n\$_MODULE = array();\n")
- file_put_contents($file_name, $str_write);
- }
- public function clearModuleFiles ($files, $type_clear = 'file', $path = '')
- {
- $arr_exclude = array('img', 'js', 'mails');
- $arr_good_ext = array('.tpl', '.php');
- foreach ($files as $key=>$file)
- {
- if ($file{0} === '.' OR in_array(substr($file, 0, strrpos($file,'.')), $this->all_iso_lang))
- unset($files[$key]);
- else if ($type_clear === 'file' AND !in_array(substr($file, strrpos($file,'.')),$arr_good_ext))
- unset($files[$key]);
- else if ($type_clear === 'directory' AND (!is_dir($path.$file) OR in_array($file, $arr_exclude)))
- unset($files[$key]);
-
- }
- return $files;
- }
- /**
- * This method get translation for each files of a module,
- * compare with global $_MODULES array and fill AdminTranslations::modules_translations array
- * With key as English sentences and values as their iso code translations.
- *
- * @param array $files
- * @param string $theme_name
- * @param string $module_name
- * @param string|boolean $dir
- * @param string $iso_code
- * @return void
- */
- protected function findAndFillTranslations($files, $theme_name, $module_name, $dir = false, $iso_code = '')
- {
- global $_MODULES;
- // added for compatibility
- $_MODULES = array_change_key_case($_MODULES);
-
- // Default translations and Prestashop overriding themes are distinguish
- $is_default = $theme_name === self::DEFAULT_THEME_NAME ? true : false;
-
- if (!$dir)
- $dir = ($theme_name === self::DEFAULT_THEME_NAME ? _PS_MODULE_DIR_.$module_name.'/' : _PS_ALL_THEMES_DIR_.$theme_name.'/modules/'.$module_name.'/');
-
- // Thank to this var similar keys are not duplicate
- // in AndminTranslation::modules_translations array
- // see below
- $array_check_duplicate = array();
- foreach ($files AS $template_file)
- {
- if ((preg_match('/^(.*).tpl$/', $template_file) OR ($is_default AND preg_match('/^(.*).php$/', $template_file))) AND file_exists($tpl = $dir.$template_file))
- {
- // Get translations key
- $content = file_get_contents($tpl);
- preg_match_all(substr($template_file, -4) == '.tpl' ? self::$tpl_regexp : self::$php_regexp, $content, $matches);
-
- // Write each translation on its module file
- $template_name = substr(basename($template_file), 0, -4);
-
- foreach ($matches[1] AS $key)
- {
- $module_key = ($is_default ? self::DEFAULT_THEME_NAME : '').'<{'.Tools::strtolower($module_name).'}'.strtolower($is_default ? 'prestashop' : $theme_name).'>'.Tools::strtolower($template_name).'_'.md5($key);
- // to avoid duplicate entry
- if (!in_array($module_key, $array_check_duplicate))
- {
- $array_check_duplicate[] = $module_key;
- $this->modules_translations[strtolower($is_default ? self::DEFAULT_THEME_NAME : $theme_name)][$module_name][$template_name][$key]
- = key_exists($module_key, $_MODULES) ? html_entity_decode($_MODULES[$module_key], ENT_COMPAT, 'UTF-8') : '';
- $this->total_expression++;
- }
- }
- }
- }
- }
- 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 here.');
- }
- elseif (Tools::isSubmit('submitExport'))
- {
- if ($this->tabAccess['add'] === '1')
- $this->submitExportLang();
- else
- $this->_errors[] = Tools::displayError('You do not have permission to add here.');
- }
- elseif (Tools::isSubmit('submitImport'))
- {
- if ($this->tabAccess['add'] === '1')
- $this->submitImportLang();
- else
- $this->_errors[] = Tools::displayError('You do not have permission to add here.');
- }
- elseif (Tools::isSubmit('submitAddLanguage'))
- {
- if ($this->tabAccess['add'] === '1')
- $this->submitAddLang();
- else
- $this->_errors[] = Tools::displayError('You do not have permission to add here.');
- }
- elseif (Tools::isSubmit('submitTranslationsFront'))
- {
- if ($this->tabAccess['edit'] === '1')
- {
- if (!Validate::isLanguageIsoCode(Tools::strtolower(Tools::getValue('lang'))))
- die(Tools::displayError());
- $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 here.');
- }
- elseif (Tools::isSubmit('submitTranslationsPDF'))
- {
- if ($this->tabAccess['edit'] === '1')
- {
- if (!Validate::isLanguageIsoCode(Tools::strtolower(Tools::getValue('lang'))))
- die(Tools::displayError());
- $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 here.');
- }
- elseif (Tools::isSubmit('submitTranslationsBack'))
- {
- if ($this->tabAccess['edit'] === '1')
- {
- if (!Validate::isLanguageIsoCode(Tools::strtolower(Tools::getValue('lang'))))
- die(Tools::displayError());
- $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 here.');
- }
- elseif (Tools::isSubmit('submitTranslationsErrors'))
- {
- if ($this->tabAccess['edit'] === '1')
- {
- if (!Validate::isLanguageIsoCode(Tools::strtolower(Tools::getValue('lang'))))
- die(Tools::displayError());
- $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 here.');
- }
- elseif (Tools::isSubmit('submitTranslationsFields'))
- {
- if ($this->tabAccess['edit'] === '1')
- {
- if (!Validate::isLanguageIsoCode(Tools::strtolower(Tools::getValue('lang'))))
- die(Tools::displayError());
- $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 here.');
- }
- elseif (Tools::isSubmit('submitTranslationsMails') || Tools::isSubmit('submitTranslationsMailsAndStay'))
- {
- if ($this->tabAccess['edit'] === '1' && ($id_lang = Language::getIdByIso(Tools::getValue('lang'))) > 0)
- {
- $this->submitTranslationsMails($id_lang);
- }
- else
- $this->_errors[] = Tools::displayError('You do not have permission to edit here.');
- }
- elseif (Tools::isSubmit('submitTranslationsModules'))
- {
- if ($this->tabAccess['edit'] === '1')
- {
- $array_lang_src = Language::getLanguages(false);
- foreach ($array_lang_src as $language)
- $this->all_iso_lang[] = $language['iso_code'];
-
- $lang = Tools::strtolower($_POST['lang']);
- if (!Validate::isLanguageIsoCode($lang))
- die(Tools::displayError());
- 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
- {
- $arr_find_and_write = array();
- $arr_files = $this->getAllModuleFiles($modules, _PS_MODULE_DIR_, $lang, true);
- $arr_find_and_write = array_merge($arr_find_and_write, $arr_files);
-
- if(file_exists(_PS_THEME_DIR_.'/modules/'))
- {
- $modules = scandir(_PS_THEME_DIR_.'/modules/');
- $arr_files = $this->getAllModuleFiles($modules, _PS_THEME_DIR_.'modules/', $lang);
- $arr_find_and_write = array_merge($arr_find_and_write, $arr_files);
- }
-
- foreach ($arr_find_and_write as $key=>$value)
- $this->findAndWriteTranslationsIntoFile($value['file_name'], $value['files'], $value['theme'], $value['module'], $value['dir']);
- Tools::redirectAdmin($currentIndex.'&conf=4&token='.$this->token);
- }
- }
- else
- $this->_errors[] = Tools::displayError('You do not have permission to edit here.');
- }
- }
- protected function getMailPattern()
- {
- // Let the indentation like it.
- return '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>#title</title>
- </head>
- <body>
- #content
- </body>
- </html>';
- }
- /**
- * This method is used to wright translation for mails.
- * This wrights subject translation files
- * (in root/mails/lang_choosen/lang.php or root/_PS_THEMES_DIR_/mails/lang_choosen/lang.php)
- * and mails files.
- *
- * @param int $id_lang
- */
- protected function submitTranslationsMails ($id_lang)
- {
- global $currentIndex;
- $obj_lang = new Language($id_lang);
- $params_redirect = (Tools::isSubmit('submitTranslationsMailsAndStay') ? '&lang='.Tools::getValue('lang').'&type='.Tools::getValue('type') : '');
-
- $arr_mail_content = array();
- $arr_mail_path = array();
- if (Tools::getValue('core_mail')) {
- $arr_mail_content['core_mail'] = Tools::getValue('core_mail');
- $arr_mail_path['core_mail'] = _PS_MAIL_DIR_.$obj_lang->iso_code.'/';
- }
- if (Tools::getValue('module_mail')) {
- $arr_mail_content['module_mail'] = Tools::getValue('module_mail');
- $arr_mail_path['module_mail'] = _PS_MODULE_DIR_.'{module}'.'/mails/'.$obj_lang->iso_code.'/';
- }
- if (Tools::getValue('theme_mail')) {
- $arr_mail_content['theme_mail'] = Tools::getValue('theme_mail');
- $arr_mail_path['theme_mail'] = _PS_THEME_DIR_.'mails/'.$obj_lang->iso_code.'/';
- }
- if (Tools::getValue('theme_module_mail')) {
- $arr_mail_content['theme_module_mail'] = Tools::getValue('theme_module_mail');
- $arr_mail_path['theme_module_mail'] = _PS_THEME_DIR_.'modules/{module}'.'/mails/'.$obj_lang->iso_code.'/';
- }
-
- // Save each mail content
- foreach ($arr_mail_content as $group_name=>$all_content)
- {
- foreach ($all_content as $type_content=>$mails)
- {
- foreach ($mails as $mail_name=>$content)
- {
-
- $module_name = false;
- $module_name_pipe_pos = stripos($mail_name, '|');
- if ($module_name_pipe_pos)
- {
- $module_name = substr($mail_name, 0, $module_name_pipe_pos);
- $mail_name = substr($mail_name, $module_name_pipe_pos+1);
- }
-
- if ($type_content == 'html')
- {
- $content = Tools::htmlentitiesUTF8($content);
- $content = htmlspecialchars_decode($content);
- // replace correct end of line
- $content = str_replace("\r\n", PHP_EOL, $content);
-
- $title = '';
- if (Tools::getValue('title_'.$group_name.'_'.$mail_name))
- {
- $title = Tools::getValue('title_'.$group_name.'_'.$mail_name);
- }
- $string_mail = $this->getMailPattern();
- $content = str_replace(array('#title', '#content'), array($title, $content), $string_mail);
- // Magic Quotes shall... not.. PASS!
- if (_PS_MAGIC_QUOTES_GPC_)
- $content = stripslashes($content);
- }
- if (Validate::isCleanHTML($content))
- {
- $path = $arr_mail_path[$group_name];
- if ($module_name)
- $path = str_replace('{module}', $module_name, $path);
- file_put_contents($path.$mail_name.'.'.$type_content, $content);
- chmod($path.$mail_name.'.'.$type_content, 0777);
- }
- else
- {
- $this->_errors[] = Tools::displayError('HTML e-mail templates cannot contain JavaScript code.');
- }
- }
- }
- }
-
- // Update subjects
- $array_subjects = array();
- if ($subjects = Tools::getValue('subject') AND is_array($subjects))
- {
- $array_subjects['core_and_modules'] = array('translations'=>array(), 'path'=>$arr_mail_path['core_mail'].'lang.php');
- if (isset($arr_mail_path['theme_mail']))
- $array_subjects['themes_and_modules'] = array('translations'=>array(), 'path'=>$arr_mail_path['theme_mail'].'lang.php');
-
- foreach ($subjects AS $group => $subject_translation)
- {
- if ($group == 'core_mail' || $group == 'module_mail') {
- $array_subjects['core_and_modules']['translations'] = array_merge($array_subjects['core_and_modules']['translations'], $subject_translation);
- }
- elseif ( isset($array_subjects['themes_and_modules']) && ($group == 'theme_mail' || $group == 'theme_module_mail')) {
- $array_subjects['themes_and_modules']['translations'] = array_merge($array_subjects['themes_and_modules']['translations'], $subject_translation);
- }
- }
- }
- if (!empty($array_subjects)) {
- foreach ($array_subjects as $type=>$infos) {
- $this->writeSubjectTranslationFile($infos['translations'], $infos['path']);
- }
- }
- if (count($this->_errors) == 0)
- Tools::redirectAdmin($currentIndex.'&conf=4&token='.$this->token.$params_redirect);
- }
- public function display()
- {
- global $currentIndex, $cookie;
- $translations = array(
- 'front' => $this->l('Front Office translations'),
- 'back' => $this->l('Back Office translations'),
- 'errors' => $this->l('Error message translations'),
- 'fields' => $this->l('Field name translations'),
- 'modules' => $this->l('Module translations'),
- 'pdf' => $this->l('PDF translations'),
- 'mails' => $this->l('E-mail template translations'),
- );
- if ($type = Tools::getValue('type'))
- $this->{'displayForm'.ucfirst($type)}(Tools::strtolower(Tools::getValue('lang')));
- else
- {
- $languages = Language::getLanguages(false);
- echo '<fieldset class="width3"><legend><img src="../img/admin/translation.gif" />'.$this->l('Modify translations').'</legend>'.
- $this->l('Here you can modify translations for all text input into PrestaShop.').'<br />'.
- $this->l('First, select a section (such as Back Office or Modules), then click the flag representing 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>';
- echo '<form action="'.$currentIndex.'&token='.$this->token.'" method="post" enctype="multipart/form-data">
- <fieldset class="width3">
- <legend>
- <img src="../img/admin/import.gif" />'.$this->l('Add / Update a language').'
- </legend>
- <div id="submitAddLangContent" style="float:left;"><p>'.$this->l('You can add or update a language directly from prestashop.com here').'</p>';
- $this->displayWarning($this->l('If you choose to update an existing language pack, all your previous customization in the theme named prestashop will be lost. This includes front office expressions and default e-mail templates.'));
- echo '<div style="font-weight:bold; float:left;">'.$this->l('Language you want to add or update:').' ';
-
- if ($lang_packs = Tools::file_get_contents('http://www.prestashop.com/download/lang_packs/get_each_language_pack.php?version='._PS_VERSION_, false, stream_context_create(array('http' => array('method' => 'GET', 'timeout' => 5)))))
- {
- // Notice : for php < 5.2 compatibility, Tools::jsonDecode. The second parameter to true will set us
- if ($lang_packs != '' AND $lang_packs = Tools::jsonDecode($lang_packs,true))
- {
- echo '
- <select id="params_import_language" name="params_import_language">
- <optgroup label="'.$this->l('Add a language').'">';
-
- $alreadyInstalled = '<optgroup label="'.$this->l('Update a language').'">';
- foreach($lang_packs AS $lang_pack)
- {
- if (!Language::isInstalled($lang_pack['iso_code']))
- echo '<option value="'.$lang_pack['iso_code'].'|'.$lang_pack['version'].'">'.$lang_pack['name'].'</option>';
- else
- $alreadyInstalled.='<option value="'.$lang_pack['iso_code'].'|'.$lang_pack['version'].'">'.$lang_pack['name'].'</option>';
- }
-
- echo '
- </optgroup>'.$alreadyInstalled.'</optgroup>
- </select> <input type="submit" value="'.$this->l('Add or update the language').'" name="submitAddLanguage" class="button" />';
- }
- echo '</div>';
- }
- else
- echo '<br /><br /><p class="error">'.$this->l('Cannot connect to prestashop.com to get languages list.').'</p></div>';
- echo ' </div>
- </fieldset>
- </form><br /><br />';
- echo '<form action="'.$currentIndex.'&token='.$this->token.'" method="post" enctype="multipart/form-data">
- <fieldset class="width3">
- <legend>
- <img src="../img/admin/import.gif" />'.$this->l('Import a language pack manually').'
- </legend>
- <div id="submitImportContent">'.
- $this->l('If the name format is: isocode.gzip (e.g. fr.gzip) and the language corresponding to this package does not exist, it will automatically be created.').
- $this->l('Be careful, as it will replace all existing data for the destination language!').'<br /><br />'.
- $this->l('Language pack to import:').' <input type="file" name="file" /> <input type="submit" value="'.$this->l('Import').'" name="submitImport" class="button" /></p>
- </div>
- </fieldset>
- </form>
- <br /><br />
- <form action="'.$currentIndex.'&token='.$this->token.'" method="post" enctype="multipart/form-data">
- <fieldset class="width3"><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>
-
- <select name="theme" style="margin-top:10px;">';
- $themes = self::getThemesList();
- foreach ($themes AS $theme)
- echo '<option value="'.$theme['name'].'">'.$theme['name'].'</option>';
- echo '
- </select>
- <input type="submit" class="button" name="submitExport" value="'.$this->l('Export').'" />
- </fieldset>
- </form>
- <br /><br />';
- $allLanguages = Language::getLanguages(false);
- echo '
- <form action="'.$currentIndex.'&token='.$this->token.'" method="post">
- <fieldset class="width3"><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'.(int)(Tab::getIdFromClassName('AdminLanguages')).(int)($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>
-
- <select name="fromTheme">';
- $themes = self::getThemesList();
- foreach ($themes AS $theme)
- echo '<option value="'.$theme['name'].'">'.$theme['name'].'</option>';
- echo '
- </select> <span style="font-style: bold; color: red;">*</span>
- </p>
- <p>
- <div style="width:75px; font-weight:bold; float:left;">'.$this->l('To:').'</div>
- <select name="toLang">';
- foreach ($allLanguages AS $language)
- echo '<option value="'.$language['iso_code'].'">'.$language['name'].'</option>';
- echo '
- </select>
-
- <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>
- <p style="clear: left; padding: 16px 0px 0px 0px;"><span style="font-style: bold; color: red;">*</span> '.$this->l('Language files (as indicated at Tools >> Languages >> Edition) must be complete to allow copying of translations').'</p>
- </fieldset>
- </form>';
- }
- }
- public 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 must be writable:').' '.$dir.'/'.$file);
- include($dir.'/'.$file);
- return ${$var};
- }
- public function displayToggleButton($closed = false)
- {
- $str_output = '
- <script type="text/javascript">';
- if (Tools::getValue('type') == 'mails')
- $str_output .= '$(document).ready(function(){
- openCloseAllDiv(\''.$_GET['type'].'_div\', this.value == openAll); toggleElemValue(this.id, openAll, closeAll);
- });';
- $str_output .= '
- var openAll = \''.html_entity_decode($this->l('Expand all fieldsets'), ENT_NOQUOTES, 'UTF-8').'\';
- var closeAll = \''.html_entity_decode($this->l('Close all fieldsets'), ENT_NOQUOTES, 'UTF-8').'\';
- </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\', '.($closed ? 'openAll' : 'closeAll').', '.($closed ? 'closeAll' : 'openAll').');</script>';
- return $str_output;
- }
-
- protected function displaySubmitButtons($name)
- {
- return '
- <input type="submit" name="submitTranslations'.ucfirst($name).'" value="'.$this->l('Update translations').'" class="button" />
- <input type="submit" name="submitTranslations'.ucfirst($name).'AndStay" value="'.$this->l('Update and stay').'" class="button" />';
- }
-
- public function displayAutoTranslate()
- {
- $languageCode = Tools::htmlentitiesUTF8(Language::getLanguageCodeByIso(Tools::getValue('lang')));
- return '
- <input type="button" class="button" onclick="translateAll();" value="'.$this->l('Translate with Google (experimental)').'" />
- <script type="text/javascript" src="http://www.google.com/jsapi"></script>
- <script type="text/javascript">
- var gg_translate = {
- language_code : \''.$languageCode.'\',
- not_available : \''.addslashes(html_entity_decode($this->l('this language is not available on Google Translate API'), ENT_QUOTES, 'utf-8')).'\',
- tooltip_title : \''.addslashes(html_entity_decode($this->l('Google translate suggests :'), ENT_QUOTES, 'utf-8')).'\'
- };
- </script>
- <script type="text/javascript" src="../js/gg-translate.js"></script>
- <script type="text/javascript">
- var displayOnce = 0;
- google.load("language", "1");
- function translateAll() {
- if (!ggIsTranslatable(gg_translate[\'language_code\']))
- alert(\'"\'+gg_translate[\'language_code\']+\'" : \'+gg_translate[\'not_available\']);
- else
- {
- $.each($(\'input[type="text"]\'), function() {
- var tdinput = $(this);
- if (tdinput.attr("value") == "" && tdinput.parent("td").prev().html()) {
- google.language.translate(tdinput.parent("td").prev().html(), "en", gg_translate[\'language_code\'], function(result) {
- if (!result.error)
- tdinput.val(result.translation);
- else if (displayOnce == 0)
- {
- displayOnce = 1;
- alert(result.error.message);
- }
- });
- }
- });
- $.each($("textarea"), function() {
- var tdtextarea = $(this);
- if (tdtextarea.html() == "" && tdtextarea.parent("td").prev().html()) {
- google.language.translate(tdtextarea.parent("td").prev().html(), "en", gg_translate[\'language_code\'], function(result) {
- if (!result.error)
- tdtextarea.html(result.translation);
- else if (displayOnce == 0)
- {
- displayOnce = 1;
- alert(result.error.message);
- }
- });
- }
- });
- }
- }
- </script>';
- }
-
- public function displayLimitPostWarning($count)
- {
- $str_output = '';
- if ((ini_get('suhosin.post.max_vars') AND ini_get('suhosin.post.max_vars') < $count)
- OR (ini_get('suhosin.request.max_vars') AND ini_get('suhosin.request.max_vars') < $count))
- {
- if (ini_get('suhosin.post.max_vars') < $count OR ini_get('suhosin.request.max_vars') < $count)
- {
- $this->suhosin_limit_exceed = true;
- $str_output .= '<div class="warning">'.$this->l('Warning, your hosting provider is using the suhosin patch for PHP, which limits the maximum number of fields to post in a form:').'<br/>'
- .'<b>'.ini_get('suhosin.post.max_vars').'</b> '.$this->l('for suhosin.post.max_vars.').'<br/>'
- .'<b>'.ini_get('suhosin.request.max_vars').'</b> '.$this->l('for suhosin.request.max_vars.').'<br/>'
- .$this->l('Please ask your hosting provider to increase the suhosin post and request limit to')
- .' <u><b>'.((int)$count + 100).'</b></u> '.$this->l('at least.').' '.$this->l('or edit the translation file manually.').'</div>';
- }
- }
- return $str_output;
- }
- public function displayFormFront($lang)
- {
- global $currentIndex;
- $_LANG = $this->fileExists(_PS_THEME_DIR_.'lang', Tools::strtolower($lang).'.php', '_LANG');
- $str_output = '';
-
- /* List templates to parse */
- $templates = array_merge(scandir(_PS_THEME_DIR_), scandir(_PS_ALL_THEMES_DIR_));
- $count = 0;
- $files = array();
- foreach ($templates AS $template)
- if (preg_match('/^(.*).tpl$/', $template) AND (file_exists($tpl = _PS_THEME_DIR_.$template) OR file_exists($tpl = _PS_ALL_THEMES_DIR_.$template)))
- {
- $template2 = 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)
- {
- if(empty($key))
- {
- $this->_errors[] = $this->l('Empty string found, please edit:').' <br />'._PS_THEME_DIR_.''.$template;
- $newLang[$key] = '';
- }
- else
- {
- $key2 = $template2.'_'.md5($key);
- $newLang[$key] = (key_exists($key2, $_LANG)) ? html_entity_decode($_LANG[$key2], ENT_COMPAT, 'UTF-8') : '';
- }
- }
- $files[$template2] = $newLang;
- $count += sizeof($newLang);
- }
- $str_output .= '
- <h2>'.$this->l('Language').' : '.Tools::strtoupper($lang).' - '.$this->l('Front-Office translations').'</h2>
- '.$this->l('Total expressions').' : <b>'.$count.'</b>. '.$this->l('Click the fieldset title to expand or close the fieldset.').'.<br /><br />';
- $str_output .= $this->displayLimitPostWarning($count);
- if (!$this->suhosin_limit_exceed)
- {
- $str_output .= '
- <form method="post" action="'.$currentIndex.'&submitTranslationsFront=1&token='.$this->token.'" class="form">';
- $str_output .= $this->displayToggleButton(sizeof($_LANG) >= $count);
- $str_output .= $this->displayAutoTranslate();
- $str_output .= '<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;
- $str_output .= '
- <fieldset><legend style="cursor : pointer" onclick="$(\'#'.$k.'-tpl\').slideToggle();">'.$k.' - <font color="blue">'.sizeof($newLang).'</font> '.$this->l('expressions').' (<font color="red">'.$empty.'</font>)</legend>
- <div name="front_div" id="'.$k.'-tpl" style="display: '.($empty ? 'block' : 'none').';">
- <table cellpadding="2">';
- foreach ($newLang AS $key => $value)
- {
- $str_output .= '<tr><td style="width: 40%">'.stripslashes($key).'</td><td>';
- if (strlen($key) != 0 && strlen($key) < TEXTAREA_SIZED)
- $str_output .= '= <input type="text" style="width: 450px" name="'.$k.'_'.md5($key).'" value="'.stripslashes(preg_replace('/"/', '\"', stripslashes($value))).'" />';
- elseif(strlen($key))
- $str_output .= '= <textarea rows="'.(int)(strlen($key) / TEXTAREA_SIZED).'" style="width: 450px" name="'.$k.'_'.md5($key).'">'.stripslashes(preg_replace('/"/', '\"', stripslashes($value))).'</textarea>';
- else
- $str_output .= '<span class="error-inline">'.implode(', ', $this->_errors).'</span>';
- $str_output .= '</td></tr>';
- }
- $str_output .= '
- </table>
- </div>
- </fieldset><br />';
- }
- $str_output .= '<br /><input type="submit" name="submitTranslationsFront" value="'.$this->l('Update translations').'" class="button" /></form>';
- }
- if (!empty($this->_errors))
- $this->displayErrors();
- echo $str_output;
- }
- public function displayFormBack($lang)
- {
- global $currentIndex;
- $_LANGADM = $this->fileExists(_PS_TRANSLATIONS_DIR_.$lang, 'admin.php', '_LANGADM');
- $str_output = '';
- /* List templates to parse */
- $count = 0;
- $tabs = scandir(PS_ADMIN_DIR.'/tabs');
- $tabs[] = '../../classes/AdminTab.php';
- $files = array();
- foreach ($tabs AS $tab)
- if (preg_match('/^(.*)\.php$/', $tab) AND file_exists($tpl = PS_ADMIN_DIR.'/tabs/'.$tab))
- {
- $tab = basename(substr($tab, 0, -4));
- $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;
- }
- foreach (array('header.inc', 'footer.inc', 'index', 'login', 'password', 'functions') AS $tab)
- {
- $tab = PS_ADMIN_DIR.'/'.$tab.'.php';
- $fd = fopen($tab, 'r');
- $content = fread($fd, filesize($tab));
- fclose($fd);
- $regex = '/translate\(\''._PS_TRANS_PATTERN_.'\'\)/U';
- preg_match_all($regex, $content, $matches);
- foreach ($matches[1] AS $key)
- $tabsArray['index'][$key] = stripslashes(key_exists('index'.md5($key), $_LANGADM) ? html_entity_decode($_LANGADM['index'.md5($key)], ENT_COMPAT, 'UTF-8') : '');
- $count += isset($tabsArray['index']) ? sizeof($tabsArray['index']) : 0;
- }
- $str_output .= '
- <h2>'.$this->l('Language').' : '.Tools::strtoupper($lang).' - '.$this->l('Back-Office translations').'</h2>
- '.$this->l('Expressions to translate').' : <b>'.$count.'</b>. '.$this->l('Click on the titles to open fieldsets').'.<br /><br />';
- $str_output .= $this->displayLimitPostWarning($count);
- if (!$this->suhosin_limit_exceed)
- {
- $str_output .= '
- <form method="post" action="'.$currentIndex.'&submitTranslationsBack=1&token='.$this->token.'" class="form">';
- $str_output .= $this->displayToggleButton();
- $str_output .= $this->displayAutoTranslate();
- $str_output .= '<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;
- $str_output .= '
- <fieldset><legend style="cursor : pointer" onclick="$(\'#'.$k.'-tpl\').slideToggle();">'.$k.' - <font color="blue">'.sizeof($newLang).'</font> '.$this->l('expressions').' (<font color="red">'.$empty.'</font>)</legend>
- <div name="back_div" id="'.$k.'-tpl" style="display: '.($empty ? 'block' : 'none').';">
- <table cellpadding="2">';
- foreach ($newLang AS $key => $value)
- {
- $str_output .= '<tr><td style="width: 40%">'.stripslashes($key).'</td><td>= ';
- if (strlen($key) < TEXTAREA_SIZED)
- $str_output .= '<input type="text" style="width: 450px" name="'.$k.md5($key).'" value="'.stripslashes(preg_replace('/"/', '\"', $value)).'" /></td></tr>';
- else
- $str_output .= '<textarea rows="'.(int)(strlen($key) / TEXTAREA_SIZED).'" style="width: 450px" name="'.$k.md5($key).'">'.stripslashes(preg_replace('/"/', '\"', $value)).'</textarea></td></tr>';
- }
- $str_output .= '
- </table>
- </div>
- </fieldset><br />';
- }
- $str_output .= '<br /><input type="submit" name="submitTranslationsBack" value="'.$this->l('Update translations').'" class="button" /></form>';
- }
- echo $str_output;
- }
- public function displayFormErrors($lang)
- {
- global $currentIndex;
- $_ERRORS = $this->fileExists(_PS_TRANSLATIONS_DIR_.$lang, 'errors.php', '_ERRORS');
-
- $str_output = '';
-
- /* List files to parse */
- $stringToTranslate = array();
- $dirToParse = array(PS_ADMIN_DIR.'/../',
- PS_ADMIN_DIR.'/../classes/',
- PS_ADMIN_DIR.'/../controllers/',
- PS_ADMIN_DIR.'/../override/classes/',
- PS_ADMIN_DIR.'/../override/controllers/',
- PS_ADMIN_DIR.'/',
- PS_ADMIN_DIR.'/tabs/');
- 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
- {
- $count = 0;
- foreach ($modules AS $module)
- if (is_dir(_PS_MODULE_DIR_.$module) && $module != '.' && $module != '..' && $module != '.svn' )
- $dirToParse[] = _PS_MODULE_DIR_.$module.'/';
- }
- foreach ($dirToParse AS $dir)
- foreach (scandir($dir) AS $file)
- if (preg_match('/\.php$/', $file) AND file_exists($fn = $dir.$file) AND $file != 'index.php')
- {
- if (!filesize($fn))
- continue;
- preg_match_all('/Tools::displayError\(\''._PS_TRANS_PATTERN_.'\'(, (true|false))?\)/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;
- $str_output .= $this->displayAutoTranslate();
- $str_output .= '<h2>'.$this->l('Language').' : '.Tools::strtoupper($lang).' - '.$this->l('Error translations').'</h2>'
- .$this->l('Errors to translate').' : <b>'.sizeof($stringToTranslate).'</b><br /><br />';
- $str_output .= $this->displayLimitPostWarning(sizeof($stringToTranslate));
- if (!$this->suhosin_limit_exceed)
- {
- $str_output .= '
- <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">';
- ksort($stringToTranslate);
- foreach ($stringToTranslate AS $key => $value)
- $str_output .= '<tr '.(empty($value) ? 'style="background-color:#FBB"' : (++$irow % 2 ? 'class="alt_row"' : '')).'><td>'.stripslashes($key).'</td><td style="width: 430px">= <input type="text" name="'.md5($key).'" value="'.preg_replace('/"/', '"', stripslashes($value)).'" style="width: 380px"></td></tr>';
- $str_output .= '</table><br /><input type="submit" name="submitTranslationsErrors" value="'.$this->l('Update translations').'" class="button" /></form>';
- }
- echo $str_output;
- }
- public function displayFormFields($lang)
- {
- global $currentIndex;
- $_FIELDS = $this->fileExists(_PS_TRANSLATIONS_DIR_.$lang, 'fields.php', '_FIELDS');
- $str_output = '';
- $classArray = array();
- $count = 0;
- foreach (scandir(_PS_CLASS_DIR_) AS $classFile)
- {
- if (!preg_match('/\.php$/', $classFile) OR $classFile …
Large files files are truncated, but you can click here to view the full file