2009-05-10 10:50:39 +03:00
|
|
|
|
<?php
|
2008-11-16 01:11:15 +02:00
|
|
|
|
/*-------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* LiveStreet Engine Social Networking
|
|
|
|
|
* Copyright © 2008 Mzhelskiy Maxim
|
|
|
|
|
*
|
|
|
|
|
*--------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* Official site: www.livestreet.ru
|
|
|
|
|
* Contact e-mail: rus.engine@gmail.com
|
|
|
|
|
*
|
|
|
|
|
* GNU General Public License, version 2:
|
|
|
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
|
|
|
*
|
|
|
|
|
---------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
/**
|
|
|
|
|
* Модуль поддержки языковых файлов
|
|
|
|
|
*
|
|
|
|
|
*/
|
2011-07-10 20:46:45 +03:00
|
|
|
|
class ModuleLang extends Module {
|
2009-11-06 02:24:02 +02:00
|
|
|
|
/**
|
|
|
|
|
* Текущий язык ресурса
|
|
|
|
|
*
|
|
|
|
|
* @var string
|
|
|
|
|
*/
|
2009-08-19 15:50:45 +03:00
|
|
|
|
protected $sCurrentLang;
|
2009-11-06 02:24:02 +02:00
|
|
|
|
/**
|
|
|
|
|
* Язык ресурса, используемый по умолчанию
|
|
|
|
|
*
|
|
|
|
|
* @var string
|
|
|
|
|
*/
|
|
|
|
|
protected $sDefaultLang;
|
|
|
|
|
/**
|
|
|
|
|
* Путь к языковым файлам
|
|
|
|
|
*
|
|
|
|
|
* @var string
|
|
|
|
|
*/
|
2009-08-19 15:50:45 +03:00
|
|
|
|
protected $sLangPath;
|
2009-11-06 02:24:02 +02:00
|
|
|
|
/**
|
|
|
|
|
* @var array
|
|
|
|
|
*/
|
2008-11-16 01:11:15 +02:00
|
|
|
|
protected $aLangMsg=array();
|
2011-07-24 14:48:08 +03:00
|
|
|
|
/**
|
|
|
|
|
* Список текстовок для JS
|
|
|
|
|
*
|
|
|
|
|
* @var unknown_type
|
|
|
|
|
*/
|
|
|
|
|
protected $aLangMsgJs=array();
|
2011-07-10 20:46:45 +03:00
|
|
|
|
|
2008-11-16 01:11:15 +02:00
|
|
|
|
/**
|
|
|
|
|
* Инициализация модуля
|
|
|
|
|
*
|
2009-11-06 02:24:02 +02:00
|
|
|
|
* @return null
|
2008-11-16 01:11:15 +02:00
|
|
|
|
*/
|
2009-11-22 21:38:44 +02:00
|
|
|
|
public function Init() {
|
|
|
|
|
$this->Hook_Run('lang_init_start');
|
2011-07-10 20:46:45 +03:00
|
|
|
|
|
2009-08-19 15:50:45 +03:00
|
|
|
|
$this->sCurrentLang = Config::Get('lang.current');
|
2009-11-06 02:24:02 +02:00
|
|
|
|
$this->sDefaultLang = Config::Get('lang.default');
|
2009-08-19 15:50:45 +03:00
|
|
|
|
$this->sLangPath = Config::Get('lang.path');
|
2009-11-20 22:53:15 +02:00
|
|
|
|
$this->InitLang();
|
2008-11-16 01:11:15 +02:00
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Инициализирует языковой файл
|
|
|
|
|
*
|
2009-11-06 02:24:02 +02:00
|
|
|
|
* @return null
|
2008-11-16 01:11:15 +02:00
|
|
|
|
*/
|
2011-07-10 20:46:45 +03:00
|
|
|
|
protected function InitLang() {
|
2008-11-16 01:11:15 +02:00
|
|
|
|
/**
|
|
|
|
|
* Если используется кеширование через memcaсhed, то сохраняем данные языкового файла в кеш
|
|
|
|
|
*/
|
2011-07-10 20:46:45 +03:00
|
|
|
|
if (Config::Get('sys.cache.type')=='memory') {
|
2011-07-31 21:46:01 +03:00
|
|
|
|
if (false === ($this->aLangMsg = $this->Cache_Get("lang_{$this->sCurrentLang}_".Config::Get('view.skin')))) {
|
2009-11-09 17:17:49 +02:00
|
|
|
|
$this->aLangMsg=array();
|
2011-07-10 20:46:45 +03:00
|
|
|
|
$this->LoadLangFiles($this->sDefaultLang);
|
2009-11-07 02:35:40 +02:00
|
|
|
|
if($this->sCurrentLang!=$this->sDefaultLang) $this->LoadLangFiles($this->sCurrentLang);
|
2011-07-01 16:41:39 +03:00
|
|
|
|
$this->Cache_Set($this->aLangMsg, "lang_{$this->sCurrentLang}_".Config::Get('view.skin'), array(), 60*60);
|
2009-11-06 02:24:02 +02:00
|
|
|
|
}
|
2008-11-16 01:11:15 +02:00
|
|
|
|
} else {
|
2009-11-06 02:24:02 +02:00
|
|
|
|
$this->LoadLangFiles($this->sDefaultLang);
|
2009-11-07 02:35:40 +02:00
|
|
|
|
if($this->sCurrentLang!=$this->sDefaultLang) $this->LoadLangFiles($this->sCurrentLang);
|
2009-11-20 22:53:15 +02:00
|
|
|
|
}
|
2009-11-23 14:53:06 +02:00
|
|
|
|
|
2011-07-24 14:48:08 +03:00
|
|
|
|
$this->LoadLangJs();
|
2009-11-23 14:53:06 +02:00
|
|
|
|
/**
|
|
|
|
|
* Загружаем в шаблон
|
|
|
|
|
*/
|
2011-07-10 20:46:45 +03:00
|
|
|
|
$this->Viewer_Assign('aLang',$this->aLangMsg);
|
2008-11-16 01:11:15 +02:00
|
|
|
|
}
|
2011-07-24 14:48:08 +03:00
|
|
|
|
/**
|
|
|
|
|
* Загружает из конфига текстовки для JS
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function LoadLangJs() {
|
|
|
|
|
$aMsg=Config::Get('lang.load_to_js');
|
|
|
|
|
if (is_array($aMsg) and count($aMsg)) {
|
|
|
|
|
$this->aLangMsgJs=$aMsg;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Прогружает в шаблон текстовки в виде JS
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function AssignToJs() {
|
|
|
|
|
$aLangMsg=array();
|
|
|
|
|
foreach ($this->aLangMsgJs as $sName) {
|
|
|
|
|
$aLangMsg[$sName]=$this->Get($sName,array(),false);
|
|
|
|
|
}
|
|
|
|
|
$this->Viewer_Assign('aLangJs',$aLangMsg);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Добавляет текстовку к JS
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $aKeys
|
|
|
|
|
*/
|
|
|
|
|
public function AddLangJs($aKeys) {
|
|
|
|
|
if (!is_array($aKeys)) {
|
|
|
|
|
$aKeys=array($aKeys);
|
|
|
|
|
}
|
|
|
|
|
$this->aLangMsgJs=array_merge($this->aLangMsgJs,$aKeys);
|
|
|
|
|
}
|
2009-04-10 15:34:20 +03:00
|
|
|
|
/**
|
|
|
|
|
* Загружает текстовки из языковых файлов
|
|
|
|
|
*
|
2009-11-06 02:24:02 +02:00
|
|
|
|
* @return null
|
2009-04-10 15:34:20 +03:00
|
|
|
|
*/
|
2009-11-06 02:24:02 +02:00
|
|
|
|
protected function LoadLangFiles($sLangName) {
|
2011-07-10 20:46:45 +03:00
|
|
|
|
$sLangFilePath = $this->sLangPath.'/'.$sLangName.'.php';
|
2009-11-06 02:24:02 +02:00
|
|
|
|
if(file_exists($sLangFilePath)) {
|
2011-07-10 20:46:45 +03:00
|
|
|
|
$this->AddMessages(include($sLangFilePath));
|
2009-11-06 02:24:02 +02:00
|
|
|
|
}
|
2009-04-10 15:34:20 +03:00
|
|
|
|
/**
|
2009-12-25 16:59:47 +02:00
|
|
|
|
* Ищет языковые файлы модулей и объединяет их с текущим
|
2009-04-10 15:34:20 +03:00
|
|
|
|
*/
|
|
|
|
|
$sDirConfig=$this->sLangPath.'/modules/';
|
|
|
|
|
if ($hDirConfig = opendir($sDirConfig)) {
|
|
|
|
|
while (false !== ($sDirModule = readdir($hDirConfig))) {
|
|
|
|
|
if ($sDirModule !='.' and $sDirModule !='..' and is_dir($sDirConfig.$sDirModule)) {
|
2009-11-06 02:24:02 +02:00
|
|
|
|
$sFileConfig=$sDirConfig.$sDirModule.'/'.$sLangName.'.php';
|
2009-04-10 15:34:20 +03:00
|
|
|
|
if (file_exists($sFileConfig)) {
|
2011-07-01 15:08:09 +03:00
|
|
|
|
$this->AddMessages(include($sFileConfig), array('category' =>'module', 'name' =>$sDirModule));
|
2011-07-10 20:46:45 +03:00
|
|
|
|
}
|
2009-04-10 15:34:20 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
closedir($hDirConfig);
|
|
|
|
|
}
|
2011-07-10 20:46:45 +03:00
|
|
|
|
|
2009-12-25 16:59:47 +02:00
|
|
|
|
/**
|
|
|
|
|
* Ищет языковые файлы актвиированных плагинов
|
|
|
|
|
*/
|
2010-09-15 18:52:58 +03:00
|
|
|
|
if($aPluginList = Engine::getInstance()->GetPlugins()) {
|
|
|
|
|
$aPluginList=array_keys($aPluginList);
|
2010-01-08 22:01:40 +02:00
|
|
|
|
$sDir=Config::Get('path.root.server').'/plugins/';
|
2011-07-10 20:46:45 +03:00
|
|
|
|
|
2009-12-25 16:59:47 +02:00
|
|
|
|
foreach ($aPluginList as $sPluginName) {
|
|
|
|
|
$aFiles=glob($sDir.$sPluginName.'/templates/language/'.$sLangName.'.php');
|
|
|
|
|
if($aFiles and count($aFiles)) {
|
2011-07-10 20:46:45 +03:00
|
|
|
|
foreach ($aFiles as $sFile) {
|
|
|
|
|
if (file_exists($sFile)) {
|
|
|
|
|
$this->AddMessages(include($sFile), array('category' =>'plugin', 'name' =>$sPluginName));
|
|
|
|
|
}
|
2009-12-25 16:59:47 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
2011-07-10 20:46:45 +03:00
|
|
|
|
|
2010-06-02 19:00:49 +03:00
|
|
|
|
/**
|
|
|
|
|
* Ищет языковой файл текущего шаблона
|
|
|
|
|
*/
|
|
|
|
|
$this->LoadLangFileTemplate($sLangName);
|
|
|
|
|
}
|
2011-07-10 20:46:45 +03:00
|
|
|
|
|
2010-06-02 19:00:49 +03:00
|
|
|
|
/**
|
|
|
|
|
* Загружает языковой файл текущего шаблона
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $sLangName
|
|
|
|
|
*/
|
|
|
|
|
public function LoadLangFileTemplate($sLangName) {
|
|
|
|
|
$sFile=Config::Get('path.smarty.template').'/settings/language/'.$sLangName.'.php';
|
|
|
|
|
if (file_exists($sFile)) {
|
|
|
|
|
$this->AddMessages(include($sFile));
|
|
|
|
|
}
|
2009-04-10 15:34:20 +03:00
|
|
|
|
}
|
2008-11-16 01:11:15 +02:00
|
|
|
|
/**
|
|
|
|
|
* Установить текущий язык
|
|
|
|
|
*
|
2009-11-06 02:24:02 +02:00
|
|
|
|
* @param string $sLang
|
2008-11-16 01:11:15 +02:00
|
|
|
|
*/
|
|
|
|
|
public function SetLang($sLang) {
|
|
|
|
|
$this->sCurrentLang=$sLang;
|
|
|
|
|
$this->InitLang();
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Получить текущий язык
|
|
|
|
|
*
|
2009-12-19 13:02:42 +02:00
|
|
|
|
* @return string
|
2008-11-16 01:11:15 +02:00
|
|
|
|
*/
|
|
|
|
|
public function GetLang() {
|
|
|
|
|
return $this->sCurrentLang;
|
|
|
|
|
}
|
2009-12-19 13:02:42 +02:00
|
|
|
|
/**
|
|
|
|
|
* Получить дефолтный язык
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public function GetLangDefault() {
|
|
|
|
|
return $this->sDefaultLang;
|
2011-07-10 20:46:45 +03:00
|
|
|
|
}
|
2009-03-30 18:38:56 +03:00
|
|
|
|
/**
|
|
|
|
|
* Получить список текстовок
|
|
|
|
|
*
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function GetLangMsg() {
|
|
|
|
|
return $this->aLangMsg;
|
|
|
|
|
}
|
2009-12-19 13:02:42 +02:00
|
|
|
|
|
2008-11-16 01:11:15 +02:00
|
|
|
|
/**
|
|
|
|
|
* Получает текстовку по её имени
|
|
|
|
|
*
|
2009-08-27 22:54:31 +03:00
|
|
|
|
* @param string $sName
|
|
|
|
|
* @param array $aReplace
|
|
|
|
|
* @return string
|
2008-11-16 01:11:15 +02:00
|
|
|
|
*/
|
2011-07-24 14:48:08 +03:00
|
|
|
|
public function Get($sName,$aReplace=array(),$bDelete=true) {
|
2011-07-10 20:46:45 +03:00
|
|
|
|
if (!Config::Get('lang.disable_blocks') && strpos($sName, '.')) {
|
|
|
|
|
$sLang = &$this->aLangMsg;
|
|
|
|
|
$aKeys = explode('.', $sName);
|
|
|
|
|
foreach ($aKeys as $k) {
|
|
|
|
|
if (isset($sLang[$k])) {
|
|
|
|
|
$sLang = $sLang[$k];
|
|
|
|
|
} else {
|
|
|
|
|
return 'NOT_FOUND_LANG_TEXT';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (isset($this->aLangMsg[$sName])) {
|
|
|
|
|
$sLang=$this->aLangMsg[$sName];
|
|
|
|
|
} else {
|
|
|
|
|
return 'NOT_FOUND_LANG_TEXT';
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-08-27 17:10:50 +03:00
|
|
|
|
|
2011-07-10 20:46:45 +03:00
|
|
|
|
if(is_array($aReplace)&&count($aReplace)&&is_string($sLang)) {
|
|
|
|
|
foreach ($aReplace as $sFrom => $sTo) {
|
|
|
|
|
$aReplacePairs["%%{$sFrom}%%"]=$sTo;
|
|
|
|
|
}
|
|
|
|
|
$sLang=strtr($sLang,$aReplacePairs);
|
|
|
|
|
}
|
2009-08-27 22:54:31 +03:00
|
|
|
|
|
2011-07-24 14:48:08 +03:00
|
|
|
|
if(Config::Get('module.lang.delete_undefined') and $bDelete and is_string($sLang)) {
|
2011-07-10 20:46:45 +03:00
|
|
|
|
$sLang=preg_replace("/\%\%[\S]+\%\%/U",'',$sLang);
|
|
|
|
|
}
|
|
|
|
|
return $sLang;
|
2008-11-16 01:11:15 +02:00
|
|
|
|
}
|
2011-07-10 20:46:45 +03:00
|
|
|
|
|
2010-05-18 15:24:37 +03:00
|
|
|
|
/**
|
|
|
|
|
* Добавить к текстовкам массив сообщений
|
|
|
|
|
*
|
|
|
|
|
* @param array $aMessages
|
|
|
|
|
*/
|
2011-07-01 15:08:09 +03:00
|
|
|
|
public function AddMessages($aMessages, $aBlock = null) {
|
2010-05-18 15:24:37 +03:00
|
|
|
|
if (is_array($aMessages)) {
|
2011-07-10 20:46:45 +03:00
|
|
|
|
if (!Config::Get('lang.disable_blocks') && is_array($aBlock)) {
|
|
|
|
|
if (isset($aBlock['category'])) {
|
|
|
|
|
if (!isset($this->aLangMsg[$aBlock['category']]) || !$this->aLangMsg[$aBlock['category']]) {$this->aLangMsg[$aBlock['category']] = array();}
|
|
|
|
|
$this->aLangMsg[$aBlock['category']][$aBlock['name']] = $aMessages;
|
|
|
|
|
} else {
|
|
|
|
|
$this->aLangMsg [$aBlock['name']] = $aMessages;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (count($this->aLangMsg)==0) {
|
|
|
|
|
$this->aLangMsg = $aMessages;
|
|
|
|
|
} else {
|
|
|
|
|
$this->aLangMsg = array_merge($this->aLangMsg, $aMessages);
|
|
|
|
|
}
|
2010-05-18 15:24:37 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Добавить к текстовкам отдельное сообщение
|
|
|
|
|
*
|
|
|
|
|
* @param string $sKey
|
|
|
|
|
* @param string $sMessage
|
|
|
|
|
*/
|
|
|
|
|
public function AddMessage($sKey, $sMessage) {
|
|
|
|
|
$this->aLangMsg[$sKey] = $sMessage;
|
|
|
|
|
}
|
2011-07-10 20:46:45 +03:00
|
|
|
|
|
2009-11-20 22:53:15 +02:00
|
|
|
|
/**
|
|
|
|
|
* Завершаем работу модуля
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public function Shutdown() {
|
2011-07-24 14:48:08 +03:00
|
|
|
|
/**
|
|
|
|
|
* Делаем выгрузку необходимых текстовок в шаблон в виде js
|
|
|
|
|
*/
|
|
|
|
|
$this->AssignToJs();
|
2009-11-20 22:53:15 +02:00
|
|
|
|
}
|
2008-11-16 01:11:15 +02:00
|
|
|
|
}
|
|
|
|
|
?>
|