Exemple #1
0
 function GetLang($cur_dir = false, $cur_host = false)
 {
     $err_mess = CMain::err_mess() . "<br>Function: GetLang<br>Line: ";
     global $DB, $lang, $DOCUMENT_ROOT, $MAIN_LANGS_CACHE, $MAIN_LANGS_ADMIN_CACHE;
     $arDef = array("LID" => "en", "ID" => "en", "SITE_ID" => "en", "FORMAT_DATE" => "MM/DD/YYYY", "FORMAT_DATETIME" => "MM/DD/YYYY HH24:MI:SS");
     if ($cur_dir === false) {
         $cur_dir = $this->GetCurDir();
     }
     if ($cur_host === false) {
         $cur_host = $_SERVER["HTTP_HOST"];
     }
     if (substr($cur_dir, 0, strlen(BX_ROOT . "/admin/")) == BX_ROOT . "/admin/" || substr($cur_dir, 0, strlen(BX_ROOT . "/updates/")) == BX_ROOT . "/updates/" || defined("ADMIN_SECTION") && ADMIN_SECTION == true || defined("BX_PUBLIC_TOOLS") && BX_PUBLIC_TOOLS === true) {
         //путь по параметру
         if (strlen($lang) <= 0) {
             $lang = COption::GetOptionString("main", "admin_lid", "ru");
         }
         $rs = CLanguage::GetList($o, $b, array("LID" => $lang, "ACTIVE" => $ACTIVE));
         if ($ar = $rs->Fetch()) {
             $MAIN_LANGS_ADMIN_CACHE[$ar["LID"]] = $ar;
             return $ar;
         }
         //если переменная не задана - берем язык по умолчанию
         $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\t*\n\t\t\t\tFROM\n\t\t\t\t\tb_language\n\t\t\t\tWHERE\n\t\t\t\t\tACTIVE='Y'\n\t\t\t\tORDER BY\n\t\t\t\t\tDEF DESC, SORT\n\t\t\t\t";
         $rs = $DB->Query($strSql, false, $err_mess . __LINE__);
         if ($ar = $rs->Fetch()) {
             $MAIN_LANGS_ADMIN_CACHE[$ar["LID"]] = $ar;
             return $ar;
         }
         //ну если вообще ничего не задано - вернем просто
         return $arDef;
     } else {
         $arURL = parse_url("http://" . $cur_host);
         if ($arURL["scheme"] == "" && strlen($arURL["host"]) > 0) {
             $CURR_DOMAIN = $arURL["host"];
         } else {
             $CURR_DOMAIN = $cur_host;
         }
         if (strpos($CURR_DOMAIN, ':') > 0) {
             $CURR_DOMAIN = substr($CURR_DOMAIN, 0, strpos($CURR_DOMAIN, ':'));
         }
         $CURR_DOMAIN = trim($CURR_DOMAIN, "\t\r\n .");
         //текущий язык определяем по пути
         if (CACHED_b_lang !== false && CACHED_b_lang_domain !== false) {
             global $CACHE_MANAGER;
             $strSql = "SELECT L.*, L.LID as ID, L.LID as SITE_ID " . "FROM b_lang L " . "WHERE L.ACTIVE='Y' " . "ORDER BY " . "\tLEN(L.DIR) DESC, " . "\tL.DOMAIN_LIMITED DESC, " . "\tSORT ";
             if ($CACHE_MANAGER->Read(CACHED_b_lang, "b_lang" . md5($strSql), "b_lang")) {
                 $arLang = $CACHE_MANAGER->Get("b_lang" . md5($strSql));
             } else {
                 $arLang = array();
                 $R = $DB->Query($strSql, false, "FILE: " . __FILE__ . "<br> LINE: " . __LINE__);
                 while ($row = $R->Fetch()) {
                     $arLang[] = $row;
                 }
                 $CACHE_MANAGER->Set("b_lang" . md5($strSql), $arLang);
             }
             $strSql = "SELECT  " . "LD.LID as LD_LID,LD.DOMAIN as LD_DOMAIN " . "FROM  " . "\t b_lang_domain LD  " . "ORDER BY " . "\tLEN(LD.DOMAIN) DESC ";
             if ($CACHE_MANAGER->Read(CACHED_b_lang_domain, "b_lang_domain2", "b_lang_domain")) {
                 $arLangDomain = $CACHE_MANAGER->Get("b_lang_domain2");
             } else {
                 $arLangDomain = array();
                 $R = $DB->Query($strSql, false, "FILE: " . __FILE__ . "<br> LINE: " . __LINE__);
                 while ($row = $R->Fetch()) {
                     $arLangDomain[$row["LD_LID"]][] = $row;
                 }
                 $CACHE_MANAGER->Set("b_lang_domain2", $arLangDomain);
             }
             $arJoin = array();
             foreach ($arLang as $row) {
                 //LEFT JOIN
                 $bLeft = true;
                 //LEFT JOIN b_lang_domain LD ON L.LID=LD.LID
                 if (array_key_exists($row["LID"], $arLangDomain)) {
                     foreach ($arLangDomain[$row["LID"]] as $dom) {
                         //AND '".$DB->ForSql($CURR_DOMAIN, 255)."' LIKE CONCAT('%', LD.DOMAIN)
                         if (strcasecmp(substr($CURR_DOMAIN, -strlen($dom["LD_DOMAIN"])), $dom["LD_DOMAIN"]) == 0) {
                             $arJoin[] = $row + $dom;
                             $bLeft = false;
                         }
                     }
                 }
                 if ($bLeft) {
                     $arJoin[] = $row + array("LD_LID" => "", "LD_DOMAIN" => "");
                 }
             }
             $A = array();
             foreach ($arJoin as $row) {
                 //WHERE ('".$DB->ForSql($cur_dir)."' LIKE CONCAT(L.DIR, '%') OR LD.LID IS NOT NULL)
                 if ($row["LD_LID"] != "" || strcasecmp(substr($cur_dir, 0, strlen($row["DIR"])), $row["DIR"]) == 0) {
                     $A[] = $row;
                 }
             }
             $res = false;
             if ($res === false) {
                 foreach ($A as $row) {
                     if (strcasecmp(substr($cur_dir, 0, strlen($row["DIR"])), $row["DIR"]) == 0 && ($row["DOMAIN_LIMITED"] == "Y" && $row["LD_LID"] != "" || $row["DOMAIN_LIMITED"] != "Y")) {
                         $res = $row;
                         break;
                     }
                 }
             }
             if ($res === false) {
                 foreach ($A as $row) {
                     if (strncasecmp($cur_dir, $row["DIR"], strlen($cur_dir)) == 0) {
                         $res = $row;
                         break;
                     }
                 }
             }
             if ($res === false) {
                 foreach ($A as $row) {
                     if ($row["DOMAIN_LIMITED"] == "Y" && $row["LD_LID"] != "" || $row["DOMAIN_LIMITED"] != "Y") {
                         $res = $row;
                         break;
                     }
                 }
             }
             if ($res === false && count($A) > 0) {
                 $res = $A[0];
             }
         } else {
             $strSql = "\n\t\t\t\t\tSELECT\n\t\t\t\t\t\tL.*,\n\t\t\t\t\t\tL.LID as ID,\n\t\t\t\t\t\tL.LID as SITE_ID\n\t\t\t\t\tFROM\n\t\t\t\t\t\tb_lang L\n\t\t\t\t\tLEFT JOIN b_lang_domain LD ON (L.LID = LD.LID and '" . $DB->ForSql($CURR_DOMAIN, 255) . "' like '%' + LD.DOMAIN)\n\t\t\t\t\tWHERE\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\t'" . $DB->ForSql($cur_dir) . "' like L.DIR + '%' or\n\t\t\t\t\t\t\tLD.LID is not null\n\t\t\t\t\t\t)\n\t\t\t\t\tand L.ACTIVE='Y'\n\t\t\t\t\tORDER BY\n\t\t\t\t\t\tCASE\n\t\t\t\t\t\t\twhen (L.DOMAIN_LIMITED='Y' and LD.LID is not null) or L.DOMAIN_LIMITED<>'Y' THEN\n\t\t\t\t\t\t\t\tCASE\n\t\t\t\t\t\t\t\t\tWHEN '" . $DB->ForSql($cur_dir) . "' like L.DIR + '%' THEN 3\n\t\t\t\t\t\t\t\t\tELSE 1\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t\t\t\tELSE\n\t\t\t\t\t\t\t\tCASE\n\t\t\t\t\t\t\t\t\tWHEN '" . $DB->ForSql($cur_dir) . "' like L.DIR + '%' THEN 2\n\t\t\t\t\t\t\t\t\tELSE 0\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t\t\tEND DESC,\n\t\t\t\t\t\tLEN(L.DIR) DESC,\n\t\t\t\t\t\tL.DOMAIN_LIMITED DESC,\n\t\t\t\t\t\tSORT,\n\t\t\t\t\t\tLEN(LD.DOMAIN) DESC\n\t\t\t\t\t";
             $R = $DB->Query($strSql, false, "File: " . __FILE__ . " Line:" . __LINE__);
             $res = $R->Fetch();
         }
         if ($res) {
             $MAIN_LANGS_CACHE[$res["LID"]] = $res;
             return $res;
         }
         //если переменная не задана - берем язык по умолчанию
         $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tL.*,\n\t\t\t\t\tL.LID as ID,\n\t\t\t\t\tL.LID as SITE_ID\n\t\t\t\tFROM\n\t\t\t\t\tb_lang L\n\t\t\t\tWHERE\n\t\t\t\t\tACTIVE='Y'\n\t\t\t\tORDER BY\n\t\t\t\t\tDEF DESC,\n\t\t\t\t\tSORT\n\t\t\t\t";
         $rs = $DB->Query($strSql, false, $err_mess . __LINE__);
         while ($ar = $rs->Fetch()) {
             $MAIN_LANGS_CACHE[$ar["LID"]] = $ar;
             return $ar;
         }
     }
     return $arDef;
 }