<?php
/**
* [PHPFOX_HEADER]
*/
defined('PHPFOX') or exit('NO DICE!');
/**
*
*
* @copyright [PHPFOX_COPYRIGHT]
* @author Raymond Benc
* @package Module_Language
* @version $Id: language.class.php 4605 2012-08-20 11:17:45Z Miguel_Espinoza $
*/
class Language_Service_Language extends Phpfox_Service
{
/**
* Class constructor
*/
public function __construct()
{
$this->_sTable = Phpfox::getT('language');
}
/**
* get some phrases by conditions
*
* @param array $aConds
*
* @return array
*/
public function get($aConds = array())
{
$sCacheId = $this->cache()->set(array('locale', 'language_table_' . md5((is_array($aConds) ? implode('', $aConds) : $aConds))));
if (!($aRows = $this->cache()->get($sCacheId)))
{
$aRows = $this->database()->select('l.*')
->from($this->_sTable, 'l')
->where($aConds)
->order('l.is_default DESC, l.title')
->execute('getSlaveRows');
foreach ($aRows as $iKey => $aRow)
{
$aRows[$iKey]['image'] = (file_exists(Phpfox::getParam('core.dir_pic') . 'flag' . PHPFOX_DS . $aRow['language_id'] . '.' . $aRow['flag_id']) ? Phpfox::getParam('core.url_pic') . 'flag/' . $aRow['language_id'] . '.' . $aRow['flag_id'] : '');
}
$this->cache()->save($sCacheId, $aRows);
}
$this->database()->clean();
return $aRows;
}
/**
* get phrases for admin
*
* @param array $aConds
*
* @return array
*/
public function getForAdminCp($aConds = [])
{
$aRows = $this->database()->select('l.*')
->from($this->_sTable, 'l')
->where($aConds)
->order('l.is_default DESC, l.title')
->execute('getSlaveRows');
foreach ($aRows as $iKey => $aRow)
{
$aRows[$iKey]['image'] = (file_exists(Phpfox::getParam('core.dir_pic') . 'flag' . PHPFOX_DS . $aRow['language_id'] . '.' . $aRow['flag_id']) ? Phpfox::getParam('core.url_pic') . 'flag/' . $aRow['language_id'] . '.' . $aRow['flag_id'] : '');
}
return $aRows;
}
/**
* Get all language package of site
*
* @param boolean $defaultFirst
*
* @return array
*/
public function getAll($defaultFirst = false)
{
$sCacheId = $this->cache()->set('language_all');
if (!$aLanguage = $this->cache()->get($sCacheId)){
if ($defaultFirst) {
$aLanguage = $this->database()->select('*')
->from(Phpfox::getT('language'))
->order('is_default DESC')
->execute('getSlaveRows');
}
else {
$aLanguage = $this->database()->select('*')
->from(Phpfox::getT('language'))
->execute('getSlaveRows');
}
$this->cache()->save($sCacheId, $aLanguage);
}
return $aLanguage;
}
/**
* @param $sPhrase
*
* @return array
*/
public function getWithPhrase($sPhrase)
{
$aRows = $this->database()->select('l.language_id, l.title, p.phrase_id, p.text')
->from($this->_sTable, 'l')
->leftJoin(Phpfox::getT('language_phrase'), 'p', "p.language_id = l.language_id AND p.var_name = '" . $this->database()->escape($sPhrase) . "'")
->execute('getSlaveRows');
$aLanguages = [];
foreach ($aRows as $aRow)
{
$aLanguages[$aRow['language_id']] = $aRow;
}
return $aLanguages;
}
/**
* @param int $iId
*
* @return array|false
*/
public function getLanguage($iId)
{
$aRow = $this->database()->select('l.*')
->from($this->_sTable, 'l')
->where('l.language_id = \'' . $this->database()->escape($iId) . '\'')
->execute('getSlaveRow');
if (!isset($aRow['language_id']))
{
return false;
}
$aRow['image'] = (file_exists(Phpfox::getParam('core.dir_pic') . 'flag' . PHPFOX_DS . $aRow['language_id'] . '.' . $aRow['flag_id']) ? Phpfox::getParam('core.url_pic') . 'flag/' . $aRow['language_id'] . '.' . $aRow['flag_id'] : '');
return $aRow;
}
/**
* @param string $sName
*
* @return array
*/
public function getLanguageByName($sName)
{
return $this->database()->select('l.*')
->from($this->_sTable, 'l')
->where("l.title = '" . $this->database()->escape($sName) . "'")
->execute('getSlaveRow');
}
/**
* @param string $sLanguageId
* @param bool $bDoCustom
*
* @return array|false
*/
public function exportForDownload($sLanguageId, $bDoCustom = false)
{
if (!defined('PHPFOX_XML_SKIP_STAMP')) {
define('PHPFOX_XML_SKIP_STAMP', true);
}
$oXmlBuilder = Phpfox::getLib('xml.builder');
$aLanguage = $this->getLanguage($sLanguageId);
if (!isset($aLanguage['language_id']))
{
return false;
}
$sFolder = md5($aLanguage['language_id'] . uniqid() . Phpfox::getUserId());
$sFullPath = PHPFOX_DIR_CACHE . $sFolder . PHPFOX_DS . 'upload' . PHPFOX_DS . 'include' . PHPFOX_DS . 'xml' . PHPFOX_DS . 'language' . PHPFOX_DS . $aLanguage['language_id'] . PHPFOX_DS;
Phpfox_File::instance()->mkdir($sFullPath, true);
$oXmlBuilder->addGroup('language');
$oXmlBuilder->addGroup('settings');
foreach ($aLanguage as $sKey => $sValue)
{
if ($sKey == 'language_id' || $sKey == 'is_default' || $sKey == 'is_master' || $sKey == 'image')
{
continue;
}
$oXmlBuilder->addTag($sKey, $sValue);
}
if (!empty($aLanguage['image']))
{
$oXmlBuilder->addTag('image', base64_encode(file_get_contents(str_replace(Phpfox::getParam('core.url_pic'), Phpfox::getParam('core.dir_pic'), $aLanguage['image']))));
}
$oXmlBuilder->closeGroup();
$oXmlBuilder->closeGroup();
Phpfox_File::instance()->write($sFullPath . 'phpfox-language-import.xml', $oXmlBuilder->output());
//Assume all phrase belong to module core
$this->export($aLanguage['language_id'], true, false);
Phpfox_File::instance()->write($sFullPath . 'module-' . 'core' . '.xml', $oXmlBuilder->output());
$iServerId = 0;
if (Phpfox::getParam('core.allow_cdn')) {
$iServerId = Phpfox::getLib('cdn')->getServerId();
}
return [
'name' => $aLanguage['language_id'],
'folder' => $sFolder,
'server_id' => $iServerId
];
}
/**
* @param int $iLanguageId
* @param bool $bOnlyPhrases
* @param bool $bCore
*
* @return bool
*/
public function export($iLanguageId, $bOnlyPhrases = false, $bCore = false)
{
$aPhrases = $this->database()->select('lp.*')
->from(':language_phrase', 'lp')
->where("lp.language_id = '" . $iLanguageId . "'")
->order('lp.phrase_id ASC')
->executeRows();
if (!count($aPhrases)) {
return false;
}
$oXmlBuilder = Phpfox::getLib('xml.builder');
if (!$bOnlyPhrases) {
$aLanguage = $this->database()
->select('l.*')
->from($this->_sTable, 'l')
->where("l.language_id = '" . $iLanguageId . "'")
->executeRow();
$oXmlBuilder->addGroup('language');
$oXmlBuilder->addGroup('settings');
foreach ($aLanguage as $sKey => $sValue) {
if ($sKey == 'language_id' || $sKey == 'is_default' || $sKey == 'is_master') {
continue;
}
$oXmlBuilder->addTag($sKey, $sValue);
}
$oXmlBuilder->closeGroup();
}
$oXmlBuilder->addGroup('phrases');
$aCache = [];
foreach ($aPhrases as $aPhrase) {
if (isset($aCache[$aPhrase['var_name']])) {
continue;
}
$aCache[$aPhrase['var_name']] = true;
$oXmlBuilder->addTag('phrase', $aPhrase[($bCore ? 'text_default' : 'text')], [
'var_name' => $aPhrase['var_name'],
'added' => $aPhrase['added']
]);
}
$oXmlBuilder->closeGroup();
if (!$bOnlyPhrases) {
// Close main group
$oXmlBuilder->closeGroup();
}
return true;
}
public function exportForModule($sModule = '')
{
$sPhrasePath = PHPFOX_DIR . 'module' . PHPFOX_DS . $sModule . PHPFOX_DS . 'phrase.json';
if (file_exists($sPhrasePath)) {
$aPhrases = json_decode(file_get_contents($sPhrasePath), true);
} else {
$aPhrases = [];
}
if (!count($aPhrases)) {
return false;
}
$oXmlBuilder = Phpfox::getLib('xml.builder');
$oXmlBuilder->addGroup('phrases');
$aCache = [];
foreach ($aPhrases as $var_name => $sPhrase) {
if (isset($aCache[$var_name])) {
continue;
}
$aCache[$var_name] = true;
$oXmlBuilder->addTag('phrase', $sPhrase, [
'var_name' => $var_name,
'added' => PHPFOX_TIME
]);
}
$oXmlBuilder->closeGroup();
return true;
}
/**
* @return array
*/
public function getForInstall()
{
$aPacks = array();
$sDir = PHPFOX_DIR_INCLUDE . 'xml' . PHPFOX_DS . 'language' . PHPFOX_DS;
$hDir = opendir($sDir);
while ($sFolder = readdir($hDir))
{
if ($sFolder == '.' || $sFolder == '..')
{
continue;
}
if (!file_exists($sDir . $sFolder . PHPFOX_DS . 'phpfox-language-import.xml'))
{
continue;
}
$iCnt = $this->database()->select('COUNT(*)')
->from(Phpfox::getT('language'))
->where('language_id = \'' . $this->database()->escape($sFolder) . '\'')
->execute('getSlaveField');
if (!$iCnt)
{
$aData = Phpfox::getLib('xml.parser')->parse(file_get_contents($sDir . $sFolder . PHPFOX_DS . 'phpfox-language-import.xml'));
$aPacks[] = array_merge(array('language_id' => $sFolder), $aData['settings']);
}
}
closedir($hDir);
return $aPacks;
}
/**
* @deprecated will be removed from 4.6.0
* This function scans every .php file in PHPFOX_DIR for >subject() and >message() and picks up
* the language phrase used in each case then it renews the cache file
*
* @param bool $bForce Forces to create the cache file anew, if false it only returns the cache file if available
*
* @return array|string
*/
public function getMailPhrases($bForce = false)
{
return [];
}
/**
* @deprecated will be removed from 4.6.0
* @param string $sModule
* @param string $sVar
*
* @return array|int|string
*/
public function getPhraseInEveryLanguage($sModule, $sVar){}
/**
* @return string
*/
public function getDefaultLanguage(){
$sLangId = $this->database()->select('language_id')
->from(Phpfox::getT('language'))
->where('is_default=1')
->execute('getSlaveField');
if (isset($sLangId) && !empty($sLangId)){
return $sLangId;
} else {
//Return English in case can't get default language
return 'en';
}
}
/**
* validate input array
* @param array $aVals
* @param string $sKey
* @param boolean $bIsArray
*
* @return mixed
*/
public function validateInput($aVals, $sKey = 'name', $bIsArray = true)
{
$sDefault = $this->getDefaultLanguage();
if ($bIsArray) {
if (empty($aVals[$sKey][$sDefault])) {
Phpfox_Error::set(_p('category_name_is_required'));
return false;
}
$sValueDefault = $aVals[$sKey][$sDefault];
$aLanguages = Language_Service_Language::instance()->getAll(true);
foreach ($aLanguages as $aLanguage) {
if (empty($aVals[$sKey][$aLanguage['language_id']])) {
$aVals[$sKey][$aLanguage['language_id']] = $sValueDefault;
}
}
}
else {
if (empty($aVals[$sKey . '_' . $sDefault])) {
Phpfox_Error::set(_p('category_name_is_required'));
return false;
}
$sValueDefault = $aVals[$sKey . '_' . $sDefault];
$aLanguages = Language_Service_Language::instance()->getAll(true);
foreach ($aLanguages as $aLanguage) {
if (empty($aVals[$sKey . '_' . $aLanguage['language_id']])) {
$aVals[$sKey . '_' . $aLanguage['language_id']] = $sValueDefault;
}
}
}
return $aVals;
}
/**
* If a call is made to an unknown method attempt to connect
* it to a specific plug-in with the same name thus allowing
* plug-in developers the ability to extend classes.
*
* @param string $sMethod is the name of the method
* @param array $aArguments is the array of arguments of being passed
*
* @return null
*/
public function __call($sMethod, $aArguments)
{
/**
* Check if such a plug-in exists and if it does call it.
*/
if ($sPlugin = Phpfox_Plugin::get('language.service_language__call'))
{
eval($sPlugin);
return null;
}
/**
* No method or plug-in found we must throw a error.
*/
Phpfox_Error::trigger('Call to undefined method ' . __CLASS__ . '::' . $sMethod . '()', E_USER_ERROR);
}
}