337 lines
9.9 KiB
PHP
337 lines
9.9 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Language class, Language.php
|
|
* Languages management
|
|
* @category classes
|
|
*
|
|
* @author PrestaShop <support@prestashop.com>
|
|
* @copyright PrestaShop
|
|
* @license http://www.opensource.org/licenses/osl-3.0.php Open-source licence 3.0
|
|
* @version 1.3
|
|
*
|
|
*/
|
|
|
|
class Language extends ObjectModel
|
|
{
|
|
public $id;
|
|
|
|
/** @var string Name */
|
|
public $name;
|
|
|
|
/** @var string 2 letters iso code */
|
|
public $iso_code;
|
|
|
|
/** @var boolean Status */
|
|
public $active = true;
|
|
|
|
protected $fieldsRequired = array('name', 'iso_code');
|
|
protected $fieldsSize = array('name' => 32, 'iso_code' => 3);
|
|
protected $fieldsValidate = array('name' => 'isGenericName', 'iso_code' => 'isLanguageIsoCode', 'active' => 'isBool');
|
|
|
|
protected $table = 'lang';
|
|
protected $identifier = 'id_lang';
|
|
|
|
/** @var array Languages cache */
|
|
private static $_checkedLangs;
|
|
private static $_LANGUAGES;
|
|
|
|
public function __construct($id = NULL, $id_lang = NULL)
|
|
{
|
|
parent::__construct($id);
|
|
}
|
|
|
|
public function checkFiles()
|
|
{
|
|
return self::checkFilesWithIsoCode($this->iso_code);
|
|
}
|
|
|
|
|
|
static public function checkFilesWithIsoCode($iso_code)
|
|
{
|
|
if (isset(self::$_checkedLangs[$iso_code]) AND self::$_checkedLangs[$iso_code])
|
|
return true;
|
|
foreach (self::getFilesList($iso_code, _THEME_NAME_, false, false, false, true) as $key => $file)
|
|
if (!file_exists($key))
|
|
return false;
|
|
self::$_checkedLangs[$iso_code] = true;
|
|
return true;
|
|
}
|
|
|
|
static public function getFilesList($iso_from, $theme_from, $iso_to = false, $theme_to = false, $select = false, $check = false, $modules = false)
|
|
{
|
|
$copy = ($iso_to AND $theme_to) ? true : false;
|
|
|
|
$lPath_from = _PS_TRANSLATIONS_DIR_.strval($iso_from).'/';
|
|
$tPath_from = _PS_ROOT_DIR_.'/themes/'.strval($theme_from).'/lang/';
|
|
$mPath_from = _PS_MAIL_DIR_.strval($iso_from).'/';
|
|
|
|
if ($copy)
|
|
{
|
|
$lPath_to = _PS_TRANSLATIONS_DIR_.strval($iso_to).'/';
|
|
$tPath_to = _PS_ROOT_DIR_.'/themes/'.strval($theme_to).'/lang/';
|
|
$mPath_to = _PS_MAIL_DIR_.strval($iso_to).'/';
|
|
}
|
|
|
|
$lFiles = array('admin'.'.php', 'errors'.'.php', 'fields'.'.php', 'pdf'.'.php');
|
|
$mFiles = array(
|
|
'account.html', 'account.txt',
|
|
'bankwire.html', 'bankwire.txt',
|
|
'cheque.html', 'cheque.txt',
|
|
'contact.html', 'contact.txt',
|
|
'credit_slip.html', 'credit_slip.txt',
|
|
'download_product.html', 'download_product.txt',
|
|
'download-product.tpl',
|
|
'employee_password.html', 'employee_password.txt',
|
|
'newsletter.html', 'newsletter.txt',
|
|
'order_canceled.html', 'order_canceled.txt',
|
|
'order_conf.html', 'order_conf.txt',
|
|
'order_customer_comment.html', 'order_customer_comment.txt',
|
|
'order_merchant_comment.html', 'order_merchant_comment.txt',
|
|
'order_return_state.html', 'order_return_state.txt',
|
|
'outofstock.html', 'outofstock.txt',
|
|
'password.html', 'password.txt',
|
|
'payment.html', 'payment.txt',
|
|
'payment_error.html', 'payment_error.txt',
|
|
'preparation.html', 'preparation.txt',
|
|
'refund.html', 'refund.txt',
|
|
'shipped.html', 'shipped.txt',
|
|
'in_transit.txt', 'in_transit.html',
|
|
'test.html', 'test.txt',
|
|
'voucher.html', 'voucher.txt',
|
|
);
|
|
|
|
$number = -1;
|
|
|
|
$files = array();
|
|
$files_tr = array();
|
|
$files_theme = array();
|
|
$files_mail = array();
|
|
$files_modules = array();
|
|
|
|
// Translations files
|
|
if (!$check OR ($check AND strval($iso_from) != 'en'))
|
|
foreach ($lFiles as $file)
|
|
$files_tr[$lPath_from.$file] = ($copy ? $lPath_to.$file : ++$number);
|
|
if ($select == 'tr')
|
|
return $files_tr;
|
|
$files = array_merge($files, $files_tr);
|
|
|
|
// Theme files
|
|
if (!$check OR ($check AND strval($iso_from) != 'en'))
|
|
$files_theme[$tPath_from.strval($iso_from).'.php'] = ($copy ? $tPath_to.strval($iso_to).'.php' : ++$number);
|
|
if ($select == 'theme')
|
|
return $files_theme;
|
|
$files = array_merge($files, $files_theme);
|
|
|
|
// Mail files
|
|
if (!$check OR ($check AND strval($iso_from) != 'en'))
|
|
$files_mail[$mPath_from.'lang.php'] = ($copy ? $mPath_to.'lang.php' : ++$number);
|
|
foreach ($mFiles as $file)
|
|
$files_mail[$mPath_from.$file] = ($copy ? $mPath_to.$file : ++$number);
|
|
if ($select == 'mail')
|
|
return $files_mail;
|
|
$files = array_merge($files, $files_mail);
|
|
|
|
// Modules
|
|
if ($modules)
|
|
{
|
|
$modList = Module::getModulesDirOnDisk();
|
|
foreach ($modList as $k => $mod)
|
|
{
|
|
// Lang file
|
|
$modDir = _PS_MODULE_DIR_.$mod;
|
|
if (file_exists($modDir.'/'.strval($iso_from).'.php'))
|
|
$files_modules[$modDir.'/'.strval($iso_from).'.php'] = ($copy ? $modDir.'/'.strval($iso_to).'.php' : ++$number);
|
|
// Mails files
|
|
$modMailDirFrom = $modDir.'/mails/'.strval($iso_from);
|
|
$modMailDirTo = $modDir.'/mails/'.strval($iso_to);
|
|
if (file_exists($modMailDirFrom))
|
|
{
|
|
$dirFiles = scandir($modMailDirFrom);
|
|
foreach ($dirFiles as $file)
|
|
if (file_exists($modMailDirFrom.'/'.$file) AND $file != '.' AND $file != '..' AND $file != '.svn')
|
|
$files_modules[$modMailDirFrom.'/'.$file] = ($copy ? $modMailDirTo.'/'.$file : ++$number);
|
|
}
|
|
}
|
|
if ($select == 'modules')
|
|
return $files_modules;
|
|
$files = array_merge($files, $files_modules);
|
|
}
|
|
|
|
// Return
|
|
return $files;
|
|
}
|
|
|
|
public function getFields()
|
|
{
|
|
parent::validateFields();
|
|
|
|
$fields['name'] = pSQL($this->name);
|
|
$fields['iso_code'] = pSQL(strtolower($this->iso_code));
|
|
$fields['active'] = intval($this->active);
|
|
|
|
return $fields;
|
|
}
|
|
|
|
public function add($autodate = true, $nullValues = false)
|
|
{
|
|
if (!parent::add($autodate))
|
|
return false;
|
|
return $this->loadUpdateSQL();
|
|
}
|
|
|
|
public function loadUpdateSQL()
|
|
{
|
|
$file = _PS_TOOL_DIR_.'/languages/updateLanguages.sql';
|
|
if (!file_exists($file))
|
|
Tools::dieObject($file);
|
|
if (!$sqlContent = file_get_contents($file))
|
|
Tools::dieObject(file_get_contents($file));
|
|
$sqlContent .= "\n";
|
|
$sqlContent = str_replace('PREFIX_', _DB_PREFIX_, $sqlContent);
|
|
$sqlContent = preg_split("/;\s*[\r\n]+/", $sqlContent);
|
|
foreach ($sqlContent as $query)
|
|
{
|
|
$query = trim($query);
|
|
if (!empty($query))
|
|
if (!Db::getInstance()->Execute($query))
|
|
Tools::dieObject($query);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public function delete()
|
|
{
|
|
/* Database translations deletion */
|
|
$result = Db::getInstance()->ExecuteS('SHOW TABLES FROM `'._DB_NAME_.'`');
|
|
foreach ($result AS $row)
|
|
if (preg_match('/_lang/', $row['Tables_in_'._DB_NAME_]))
|
|
if (!Db::getInstance()->Execute('DELETE FROM `'.$row['Tables_in_'._DB_NAME_].'` WHERE `id_lang` = '.intval($this->id)))
|
|
return false;
|
|
|
|
/* Delete tags */
|
|
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'tag WHERE id_lang = '.intval($this->id));
|
|
|
|
/* Delete search words */
|
|
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'search_word WHERE id_lang = '.intval($this->id));
|
|
|
|
/* Files deletion */
|
|
foreach (self::getFilesList($this->iso_code, _THEME_NAME_, false, false, false, true, true) as $key => $file)
|
|
unlink($key);
|
|
if (file_exists(_PS_MAIL_DIR_.$this->iso_code))
|
|
rmdir(_PS_TRANSLATIONS_DIR_.$this->iso_code);
|
|
return parent::delete();
|
|
}
|
|
|
|
/**
|
|
* Return available languages
|
|
*
|
|
* @return array Languages
|
|
*/
|
|
static public function getLanguages($active = true)
|
|
{
|
|
$languages = array();
|
|
foreach (self::$_LANGUAGES AS $language)
|
|
if (!$active OR ($active AND intval($language['active'])))
|
|
$languages[] = $language;
|
|
return $languages;
|
|
}
|
|
|
|
static public function getLanguage($id_lang)
|
|
{
|
|
if (!array_key_exists(intval($id_lang), self::$_LANGUAGES))
|
|
return false;
|
|
return self::$_LANGUAGES[intval($id_lang)];
|
|
}
|
|
|
|
/**
|
|
* Return iso code from id
|
|
*
|
|
* @param integer $id_lang Language ID
|
|
* @return string Iso code
|
|
*/
|
|
static public function getIsoById($id_lang)
|
|
{
|
|
if (isset(self::$_LANGUAGES[intval($id_lang)]['iso_code']))
|
|
return self::$_LANGUAGES[intval($id_lang)]['iso_code'];
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Return id from iso code
|
|
*
|
|
* @param string $iso_code Iso code
|
|
* @return integer Language ID
|
|
*/
|
|
static public function getIdByIso($iso_code)
|
|
{
|
|
if (!Validate::isLanguageIsoCode($iso_code))
|
|
die(Tools::displayError());
|
|
|
|
$result = Db::getInstance()->getRow('
|
|
SELECT `id_lang`
|
|
FROM `'._DB_PREFIX_.'lang`
|
|
WHERE `iso_code` = \''.pSQL(strtolower($iso_code)).'\'');
|
|
if (isset($result['id_lang']))
|
|
return intval($result['id_lang']);
|
|
}
|
|
|
|
/**
|
|
* Return array (id_lang, iso_code)
|
|
*
|
|
* @param string $iso_code Iso code
|
|
* @return array Language (id_lang, iso_code)
|
|
*/
|
|
static public function getIsoIds()
|
|
{
|
|
$result = Db::getInstance()->ExecuteS('
|
|
SELECT `id_lang`, `iso_code`
|
|
FROM `'._DB_PREFIX_.'lang`');
|
|
|
|
return $result;
|
|
}
|
|
|
|
static public function copyLanguageData($from, $to)
|
|
{
|
|
$result = Db::getInstance()->ExecuteS('SHOW TABLES FROM `'._DB_NAME_.'`');
|
|
foreach ($result AS $row)
|
|
if (preg_match('/_lang/', $row['Tables_in_'._DB_NAME_]) AND $row['Tables_in_'._DB_NAME_] != _DB_PREFIX_.'lang')
|
|
{
|
|
$result2 = Db::getInstance()->ExecuteS('SELECT * FROM `'.$row['Tables_in_'._DB_NAME_].'` WHERE `id_lang` = '.intval($from));
|
|
if (!sizeof($result2))
|
|
continue;
|
|
Db::getInstance()->Execute('DELETE FROM `'.$row['Tables_in_'._DB_NAME_].'` WHERE `id_lang` = '.intval($to));
|
|
$query = 'INSERT INTO `'.$row['Tables_in_'._DB_NAME_].'` VALUES ';
|
|
foreach ($result2 AS $row2)
|
|
{
|
|
$query .= '(';
|
|
$row2['id_lang'] = $to;
|
|
foreach ($row2 AS $field)
|
|
$query .= '\''.pSQL($field, true).'\',';
|
|
$query = rtrim($query, ',').'),';
|
|
}
|
|
$query = rtrim($query, ',');
|
|
Db::getInstance()->Execute($query);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Load all languages in memory for caching
|
|
*/
|
|
static public function loadLanguages()
|
|
{
|
|
self::$_LANGUAGES = array();
|
|
|
|
$result = Db::getInstance()->ExecuteS('
|
|
SELECT `id_lang`, `name`, `iso_code`, `active`
|
|
FROM `'._DB_PREFIX_.'lang`');
|
|
|
|
foreach ($result AS $row)
|
|
self::$_LANGUAGES[intval($row['id_lang'])] = array('id_lang' => intval($row['id_lang']), 'name' => $row['name'], 'iso_code' => $row['iso_code'], 'active' => intval($row['active']));
|
|
}
|
|
}
|
|
|
|
?>
|