* @copyright 2007-2011 PrestaShop SA * @version Release: $Revision: 7541 $ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ class AdminLanguages extends AdminTab { public function __construct() { $this->table = 'lang'; $this->className = 'Language'; $this->lang = false; $this->edit = true; $this->delete = true; $this->fieldImageSettings = array(array('name' => 'flag', 'dir' => 'l'), array('name' => 'no-picture', 'dir' => 'p')); $this->fieldsDisplay = array( 'id_lang' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), 'flag' => array('title' => $this->l('Logo'), 'align' => 'center', 'image' => 'l', 'orderby' => false, 'search' => false), 'name' => array('title' => $this->l('Name'), 'width' => 120), 'iso_code' => array('title' => $this->l('ISO code'), 'width' => 70, 'align' => 'center'), 'language_code' => array('title' => $this->l('Language code'), 'width' => 70, 'align' => 'center'), 'active' => array('title' => $this->l('Enabled'), 'align' => 'center', 'active' => 'status', 'type' => 'bool')); $this->optionTitle = $this->l('Languages options'); $this->_fieldsOptions = array( 'PS_LANG_DEFAULT' => array('title' => $this->l('Default language:'), 'desc' => $this->l('The default language used in shop'), 'cast' => 'intval', 'type' => 'select', 'identifier' => 'id_lang', 'list' => Language::getlanguages(false)), ); parent::__construct(); } /** * Copy a no-product image * * @param string $language Language iso_code for no-picture image filename */ public function copyNoPictureImage($language) { if (isset($_FILES['no-picture']) and $_FILES['no-picture']['error'] === 0) if ($error = checkImage($_FILES['no-picture'], $this->maxImageSize)) $this->_errors[] = $error; else { if (!$tmpName = tempnam(_PS_TMP_IMG_DIR_, 'PS') OR !move_uploaded_file($_FILES['no-picture']['tmp_name'], $tmpName)) return false; if (!imageResize($tmpName, _PS_IMG_DIR_.'p/'.$language.'.jpg')) $this->_errors[] = Tools::displayError('An error occurred while copying no-picture image to your product folder.'); if (!imageResize($tmpName, _PS_IMG_DIR_.'c/'.$language.'.jpg')) $this->_errors[] = Tools::displayError('An error occurred while copying no-picture image to your category folder.'); if (!imageResize($tmpName, _PS_IMG_DIR_.'m/'.$language.'.jpg')) $this->_errors[] = Tools::displayError('An error occurred while copying no-picture image to your manufacturer folder'); else { $imagesTypes = ImageType::getImagesTypes('products'); foreach ($imagesTypes AS $k => $imageType) { if (!imageResize($tmpName, _PS_IMG_DIR_.'p/'.$language.'-default-'.stripslashes($imageType['name']).'.jpg', $imageType['width'], $imageType['height'])) $this->_errors[] = Tools::displayError('An error occurred while resizing no-picture image to your product directory.'); if (!imageResize($tmpName, _PS_IMG_DIR_.'c/'.$language.'-default-'.stripslashes($imageType['name']).'.jpg', $imageType['width'], $imageType['height'])) $this->_errors[] = Tools::displayError('An error occurred while resizing no-picture image to your category directory.'); if (!imageResize($tmpName, _PS_IMG_DIR_.'m/'.$language.'-default-'.stripslashes($imageType['name']).'.jpg', $imageType['width'], $imageType['height'])) $this->_errors[] = Tools::displayError('An error occurred while resizing no-picture image to your manufacturer directory.'); } } unlink($tmpName); } } /** * deleteNoPictureImages will delete all default image created for the language id_language * * @param string $id_language * @return boolean true if no error */ private function deleteNoPictureImages($id_language) { $language = Language::getIsoById($id_language); $imagesTypes = ImageType::getImagesTypes('products'); $dirs = array(_PS_PROD_IMG_DIR_, _PS_CAT_IMG_DIR_, _PS_MANU_IMG_DIR_, _PS_SUPP_IMG_DIR_, _PS_MANU_IMG_DIR_); foreach ($dirs AS $dir) { foreach ($imagesTypes AS $k => $imageType) if (file_exists($dir.$language.'-default-'.stripslashes($imageType['name']).'.jpg')) if (!unlink($dir.$language.'-default-'.stripslashes($imageType['name']).'.jpg')) $this->_errors[] = Tools::displayError('An error occurred during image deletion.'); if (file_exists($dir.$language.'.jpg')) if (!unlink($dir.$language.'.jpg')) $this->_errors[] = Tools::displayError('An error occurred during image deletion.'); } return !sizeof($this->_errors) ? true : false; } public function postProcess() { global $currentIndex, $cookie; if (isset($_GET['delete'.$this->table])) { if ($this->tabAccess['delete'] === '1') { if (Validate::isLoadedObject($object = $this->loadObject()) AND isset($this->fieldImageSettings)) { // English is needed by the system (ex. translations) if ($object->id == Language::getIdByIso('en')) $this->_errors[] = $this->l('You cannot delete the English language as it is a system requirement, you can only deactivate it.'); if ($object->id == Configuration::get('PS_LANG_DEFAULT')) $this->_errors[] = $this->l('you cannot delete the default language'); elseif ($object->id == $cookie->id_lang) $this->_errors[] = $this->l('You cannot delete the language currently in use. Please change languages before deleting.'); elseif ($this->deleteNoPictureImages((int)(Tools::getValue('id_lang'))) AND $object->delete()) Tools::redirectAdmin($currentIndex.'&conf=1'.'&token='.$this->token); } else $this->_errors[] = Tools::displayError('An error occurred while deleting object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); } else $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); } elseif (Tools::getValue('submitDel'.$this->table) AND isset($_POST[$this->table.'Box'])) { if ($this->tabAccess['delete'] === '1') { if (in_array(Configuration::get('PS_LANG_DEFAULT'), $_POST[$this->table.'Box'])) $this->_errors[] = $this->l('you cannot delete the default language'); elseif (in_array($cookie->id_lang, $_POST[$this->table.'Box'])) $this->_errors[] = $this->l('you cannot delete the language currently in use, please change languages before deleting'); else { foreach ($_POST[$this->table.'Box'] AS $language) $this->deleteNoPictureImages($language); parent::postProcess(); } } else $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); } elseif (Tools::isSubmit('submitAddlang')) { /* New language */ if ((int)(Tools::getValue('id_'.$this->table)) == 0) { if ($this->tabAccess['add'] === '1') { if (isset($_POST['iso_code']) AND !empty($_POST['iso_code']) AND Validate::isLanguageIsoCode(Tools::getValue('iso_code')) AND Language::getIdByIso($_POST['iso_code'])) $this->_errors[] = Tools::displayError('This ISO code is already linked to another language.'); if ((!empty($_FILES['no-picture']['tmp_name']) OR !empty($_FILES['flag']['tmp_name'])) AND Validate::isLanguageIsoCode(Tools::getValue('iso_code'))) { if ($_FILES['no-picture']['error'] == UPLOAD_ERR_OK) $this->copyNoPictureImage(strtolower(Tools::getValue('iso_code'))); // class AdminTab deal with every $_FILES content, don't do that for no-picture unset($_FILES['no-picture']); parent::postProcess(); } else { $this->validateRules(); $this->_errors[] = Tools::displayError('Flag and No-Picture image fields are required.'); } } else $this->_errors[] = Tools::displayError('You do not have permission to add here.'); } /* Language edition */ else { if ($this->tabAccess['edit'] === '1') { if (( isset($_FILES['no-picture']) AND !$_FILES['no-picture']['error'] OR isset($_FILES['flag']) AND !$_FILES['flag']['error']) AND Validate::isLanguageIsoCode(Tools::getValue('iso_code'))) { if ($_FILES['no-picture']['error'] == UPLOAD_ERR_OK) $this->copyNoPictureImage(strtolower(Tools::getValue('iso_code'))); // class AdminTab deal with every $_FILES content, don't do that for no-picture unset($_FILES['no-picture']); parent::postProcess(); } if (!Validate::isLoadedObject($object = $this->loadObject())) die(Tools::displayError()); if ((int)($object->id) == (int)(Configuration::get('PS_LANG_DEFAULT')) AND (int)($_POST['active']) != (int)($object->active)) $this->_errors[] = Tools::displayError('You cannot change the status of the default language.'); else parent::postProcess(); $this->validateRules(); } else $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); } } elseif (isset($_GET['status']) AND isset($_GET['id_lang'])) { if ($this->tabAccess['edit'] === '1') { if (!Validate::isLoadedObject($object = $this->loadObject())) die(Tools::displayError()); if ((int)($object->id) == (int)(Configuration::get('PS_LANG_DEFAULT'))) $this->_errors[] = Tools::displayError('You cannot change the status of the default language.'); else return parent::postProcess(); } else $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); } elseif (Tools::isSubmit('submitOptions'.$this->table)) { $lang = new Language((int)Tools::getValue('PS_LANG_DEFAULT')); if (!$lang->active) $this->_errors[] = Tools::displayError('You cannot set this language as default language because it\'s disabled'); else return parent::postProcess(); } else return parent::postProcess(); } public function displayList() { global $currentIndex; $this->displayWarning($this->l('When you delete a language, all related translations in the database will be deleted.')); parent::displayList(); $languages = Language::getLanguages(false); } public function displayListContent($token=NULL) { global $currentIndex; $irow = 0; if ($this->_list) foreach ($this->_list AS $tr) { $id = $tr[$this->identifier]; if ($tr['active']) { $active['title'] = "Enabled"; $active['img'] = "enabled"; if (!Language::checkFilesWithIsoCode($tr['iso_code'])) { $active['title'] = "Warning, some translations files are missing for that iso-code"; $active['img'] = "warning"; } } else { $active['title'] = "Disabled"; $active['img'] = "disabled"; } echo 'colorOnBackground) ? 'style="background-color: '.$tr['color'].'"' : '').'>'; echo ''; foreach ($this->fieldsDisplay AS $key => $params) { $tmp = explode('!', $key); $key = isset($tmp[1]) ? $tmp[1] : $tmp[0]; echo ''; if (isset($params['active']) AND isset($tr[$key])) echo 'active'; elseif (isset($params['image'])) echo cacheImage(_PS_IMG_DIR_.$params['image'].'/'.$id.(isset($tr['id_image']) ? '-'.(int)($tr['id_image']) : '').'.'.$this->imageType, $this->table.'_mini_'.$id.'.'.$this->imageType, 45, $this->imageType); elseif (isset($tr[$key])) echo $tr[$key]; else echo '--'; ''; } if ($this->edit OR $this->delete OR ($this->view AND $this->view !== 'noActionColumn')) { echo ''; if ($this->edit) echo ' '.$this->l('Edit').''; if ($this->delete) echo ' '.$this->l('Delete').''; echo ''; } echo ''; } } public function displayForm($isMainTab = true) { global $currentIndex; parent::displayForm(); if (!($obj = $this->loadObject(true))) return; echo '
'.($obj->id ? '' : '').'
'.$this->l('Languages').'
*
*

'.$this->l('2-letter ISO code (e.g., fr, en, de)').'

*

'.$this->l('Full language code (e.g., en-us, pt-br)').'

*

'.$this->l('Upload country flag from your computer').'

*

'.$this->l('Image displayed when "no picture found"').'

getFieldValue($obj, 'is_rtl')) ? 'checked="checked" ' : '').'/> getFieldValue($obj, 'is_rtl')) ? 'checked="checked" ' : '').'/>

'.$this->l('To active if this language is a right to left language').' '.$this->l('(Experimental: your theme must be compliant with RTL language)').'

id OR $this->getFieldValue($obj, 'active')) ? 'checked="checked" ' : '').'/> getFieldValue($obj, 'active') AND $obj->id) ? 'checked="checked" ' : '').'/>

'.$this->l('Allow or disallow this language to be selected by the customer').'

'.$this->l('Check if a language pack is available for this ISO code...').'

* '.$this->l('Required field').'
'; if ($obj->id AND !$obj->checkFiles()) { echo '

'.$this->l('Warning').'

'.$this->l('This language is NOT complete and cannot be used in the Front or Back Office because some files are missing.').'


'; $files = Language::getFilesList($obj->iso_code, _THEME_NAME_, false, false, 'tr', true); $this->displayFilesList($files); echo '

'; $files = Language::getFilesList($obj->iso_code, _THEME_NAME_, false, false, 'theme', true); $this->displayFilesList($files); echo '

'; $files = Language::getFilesList($obj->iso_code, _THEME_NAME_, false, false, 'mail', true); $this->displayFilesList($files); echo '

'.$this->l('Missing files are marked in red').'
'; } } public function displayFilesList($files) { foreach ($files as $key => $file) { if (!file_exists($key)) echo ''; echo $key; if (!file_exists($key)) echo ''; echo '
'; } } }