/*
##############################################
# Bitrix: SiteManager #
# Copyright (c) 2002 Bitrix #
# http://www.bitrix.ru #
# mailto:admin@bitrix.ru #
##############################################
*/
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/translate/prolog.php");
$TRANS_RIGHT = $APPLICATION->GetGroupRight("translate");
if($TRANS_RIGHT=="D") $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"));
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/translate/include.php");
IncludeModuleLangFile(__FILE__);
@set_time_limit(0);
$sTableID = "tbl_translate_list";
$lAdmin = new CAdminList($sTableID);
/***************************************************************************
Функции
***************************************************************************/
function GetTDirList($path)
{
global $arDirs, $arFiles, $arTLangs;
$handle=@opendir(prepare_path($_SERVER["DOCUMENT_ROOT"]."/".$path."/"));
if ($handle)
{
while (false!==($file=readdir($handle)))
{
if ($file!="." && $file!=".." && $file!=".access.php" && $file!=".htaccess")
{
$IS_DIR = (is_dir(prepare_path($_SERVER["DOCUMENT_ROOT"]."/".$path."/".$file))) ? "Y" : "N";
$path_prepared=prepare_path("/".$path."/".$file);
if ($IS_DIR=="Y" &&
($path_prepared=="/bitrix/updates" ||
$path_prepared=="/bitrix/updates_enc" ||
$path_prepared=="/bitrix/updates_enc5" ||
$path_prepared=="/bitrix/help")
)
continue;
/////////////////
//if (strpos(prepare_path("/".$path."/".$file), "modules")!==false) continue;
//if (strpos(prepare_path("/".$path."/".$file), "php_interface")!==false) continue;
/////////////////
$bIsLangDir=is_lang_dir($path_prepared);
if ($IS_DIR=="Y" || $bIsLangDir)
{
$arr["IS_DIR"] = $IS_DIR;
$arr["PARENT"] = prepare_path("/".$path."/");
$arr["PATH"] = ($IS_DIR=="Y") ? $path_prepared."/" : $path_prepared;
$arr["FILE"] = $file;
if ($IS_DIR=="Y") $arDirs[] = $arr;
else $arFiles[] = $arr;
}
if ($IS_DIR=="Y") GetTDirList($path_prepared."/");
}
}
closedir($handle);
}
}
function GetLangDirs($arDirs)
{
global $arLangDirs;
if (is_array($arDirs))
{
$arLDirs=array();
foreach($arDirs as $arr1)
if(strpos($arr1["PATH"],"/lang/")!==false)
$arLDirs[]=$arr1["PATH"];
sort($arLDirs);
foreach ($arDirs as $arr1)
{
if ($arr1["IS_DIR"]=="Y")
{
$path = $arr1["PATH"];
$pathl=strlen($path);
$next=1;$last=count($arLDirs);$found=false;
while($next<=$last && !$found)
{
$i=intval(($next+$last)/2);
$c=strncmp($path,$arLDirs[$i-1],$pathl);
if($c<0)
$last=$i-1;
elseif($c>0)
$next=$i+1;
else
$found=true;
}
if ($found) $arLangDirs[] = $arr1;
}
else $arLangDirs[] = $arr1;
}
}
}
function GetPhraseCounters($arCommon, $path, $key)
{
global $arCommonCounter, $Counter, $arTLangs;
$Counter++;
// если директория то
if (is_dir(prepare_path($_SERVER["DOCUMENT_ROOT"]."/".$path."/")))
{
if (is_lang_dir($path))
{
if (is_array($arTLangs))
{
// сформируем массив файлов для языковой директории
foreach ($arTLangs as $lng)
{
$path = replace_lang_id($path, $lng);
foreach ($arCommon as $arr)
{
if (substr($arr["PATH"],0,strlen($path))==$path)
{
if ($arr["IS_DIR"]=="N") $arDirFiles[] = $arr["PATH"];
}
}
}
}
}
else
{
if (is_array($arCommon))
{
// сформируем массив файлов для обычной директории
foreach ($arCommon as $arr)
{
if (substr($arr["PATH"],0,strlen($path))==$path)
{
if ($arr["IS_DIR"]=="N") $arDirFiles[] = $arr["PATH"];
}
}
}
}
}
else // если файл то
{
// сформируем массив одноименных файлов для разных языков
foreach ($arTLangs as $lng) $arDirFiles[] = replace_lang_id($path, $lng);
}
if (is_array($arDirFiles))
{
// сформируем массив для каждого файла по языкам
$MESS_tmp = $MESS;
foreach ($arDirFiles as $file)
{
if (file_exists($_SERVER["DOCUMENT_ROOT"].$file))
{
$arKeys = array();
$MESS_TRANS = array();
$arSlash = explode("/",$file);
$lang_key = array_search("lang", $arSlash) + 1;
$file_lang = $arSlash[$lang_key];
if (in_array($file_lang, $arTLangs))
{
$MESS = array();
if (substr($file, -3)!="php") continue;
@include($_SERVER["DOCUMENT_ROOT"].$file);
ob_start();print_r($_SERVER["DOCUMENT_ROOT"].$file);$m=ob_get_contents();ob_end_clean();
$m="$m\n";$f=fopen("D:\\debug.log", "a");
fwrite($f, $m);fclose($f);
$file_name = str_replace("/".$file_lang."/","/", $file);
$arFilesLng[$file_name][$file_lang] = $MESS;
}
}
}
$MESS = $MESS_tmp;
if (is_array($arFilesLng))
{
// посчитаем сумму и расхождения для каждого файла
foreach ($arFilesLng as $file=>$arLns)
{
// посчитаем сумму
$total_arr = array();
foreach ($arLns as $ln=>$arLn)
foreach($arLn as $message_key=>$message_value)
$total_arr[$message_key]++;
$total = sizeof($total_arr);
$arr = array();
$arr["TOTAL"] = $total;
// посчитаем расхождения для каждого языка
foreach($arTLangs as $lang)
{
if(is_array($arLns[$lang]))
{
$diff=0;
foreach($arLns[$lang] as $message_key=>$message_value)
if(!array_key_exists($message_key, $total_arr))
++$diff;
}
else
$diff = $total;
$arr["DIFF"] = $diff;
$arFilesLngCounter[$file][$lang] = $arr;
}
}
if (is_array($arFilesLngCounter))
{
// посчитаем сумму и расхождения для всей директории
foreach ($arFilesLngCounter as $arCount)
{
while (list($ln, $arLn)=each($arCount))
{
$arCommonCounter[$key][$ln]["TOTAL"] += $arLn["TOTAL"];
$arCommonCounter[$key][$ln]["DIFF"] += $arLn["DIFF"];
}
}
}
}
}
}
$s=getmicrotime();
$arLangCounters = array();
$arTLangs = array();
$ln = @CLanguage::GetList($o, $b, Array("ACTIVE"=>"Y"));
while ($lnr = $ln->Fetch()) $arTLangs[] = $lnr["LID"];
// если была нажата кнопка "Перейти"
if(strlen($go_path)>0 && !preg_match("#\.\.[\\/]#", $path))
$path = add_lang_id($go_path, reset($arTLangs), $arTLangs);
// проверка на правильность
if(preg_match("#\.\.[\\/]#", $path))
$path = "";
// если путь не задан то
if (strlen($path)<=0) $path = COption::GetOptionString("translate", "INIT_FOLDERS");
$path = prepare_path("/".$path."/");
$go_path = remove_lang_id($path, $arTLangs);
$IS_LANG_DIR = is_lang_dir($path);
// если мы зашли в каталог /lang/...
echo getmicrotime()-$s,"
";$s=getmicrotime();
if ($IS_LANG_DIR)
{
reset($arTLangs);
foreach ($arTLangs as $hlang)
{
$ph = add_lang_id($path, $hlang, $arTLangs);
if (strlen($ph)>0) GetTDirList($ph);
$ph = "";
}
}
else GetTDirList($path);
echo "GetTDirList:",getmicrotime()-$s,"
";$s=getmicrotime();
// формируем навигационную цепочку
$arrChain = array();
if ($path!="/") $arrChain[] = array("NAME" => "..", "PATH" => "/");
$arr = explode("/",$go_path);
if (is_array($arr))
{
$arrP = array();
TrimArr($arr);
foreach($arr as $d)
{
$arrP[] = $d;
$p = prepare_path("/".implode("/",$arrP)."/");
if (remove_lang_id($path, $arTLangs)==$p) $p="";
$arrChain[] = array("NAME" => $d, "PATH" => $p);
}
}
$show_error = COption::GetOptionString("translate", "ONLY_ERRORS");
$show_error = ($show_error=="Y") ? "Y" : "";
echo "arrChain:",getmicrotime()-$s,"
";$s=getmicrotime();
GetLangDirs($arDirs);
echo "GetLangDirs:",getmicrotime()-$s,"
";$s=getmicrotime();
function files_sort($a,$b)
{
global $arFiles;
$va = $arFiles[$a]["FILE"];
$vb = $arFiles[$b]["FILE"];
if ($va==$vb) return 0;
elseif (strtolower($va)>strtolower($vb)) return 1;
else return -1;
}
function dirs_sort($a,$b)
{
global $arLangDirs;
$va = $arLangDirs[$a]["FILE"];
$vb = $arLangDirs[$b]["FILE"];
if ($va==$vb) return 0;
elseif (strtolower($va)>strtolower($vb)) return 1;
else return -1;
}
if(!is_array($arFiles)) $arFiles = Array();
else uksort($arFiles, "files_sort");
if(!is_array($arLangDirs)) $arLangDirs = Array();
else uksort($arLangDirs, "dirs_sort");
$arLangDirFiles = array_merge($arLangDirs, $arFiles);
$lAdmin->BeginPrologContent();
?>
for ($i=0; $i<=sizeof($arrChain)-1; $i++) : if ($i>0) : ?> / endif; if (strlen($arrChain[$i]["PATH"])>0): $last_path = $arrChain[$i]["PATH"]; ?>