AntonLV 5 tahun lalu
induk
melakukan
7ca721af37

+ 23 - 10
inc/classes/BxDolLanguagesQuery.php

@@ -248,17 +248,17 @@ class BxDolLanguagesQuery extends BxDolDb implements iBxDolSingleton
             case 'by_name':
             case 'by_name':
                 $aMethod['name'] = 'getRow';
                 $aMethod['name'] = 'getRow';
                 $aMethod['params'][1] = array(
                 $aMethod['params'][1] = array(
-                	'key' => $aParams['value']
+                    'key' => $aParams['value']
                 );
                 );
 
 
                 $sWhereClause = " AND `tk`.`Key`=:key ";
                 $sWhereClause = " AND `tk`.`Key`=:key ";
                 break;
                 break;
 
 
-			case 'by_language_name_key_key':
+            case 'by_language_name_key_key':
             	$aMethod['name'] = 'getAllWithKey';
             	$aMethod['name'] = 'getAllWithKey';
             	$aMethod['params'][1] = 'key';
             	$aMethod['params'][1] = 'key';
             	$aMethod['params'][2] = array(
             	$aMethod['params'][2] = array(
-                	'name' => $aParams['value']
+                    'name' => $aParams['value']
                 );
                 );
 
 
                 $sSelectClause .= ", `ts`.`String` AS `string` ";
                 $sSelectClause .= ", `ts`.`String` AS `string` ";
@@ -270,7 +270,7 @@ class BxDolLanguagesQuery extends BxDolDb implements iBxDolSingleton
             	$aMethod['name'] = 'getAllWithKey';
             	$aMethod['name'] = 'getAllWithKey';
             	$aMethod['params'][1] = 'key';
             	$aMethod['params'][1] = 'key';
             	$aMethod['params'][2] = array(
             	$aMethod['params'][2] = array(
-                	'language_id' => (int)$aParams['value']
+                    'language_id' => (int)$aParams['value']
                 );
                 );
 
 
                 $sSelectClause .= ", `ts`.`String` AS `string` ";
                 $sSelectClause .= ", `ts`.`String` AS `string` ";
@@ -278,6 +278,19 @@ class BxDolLanguagesQuery extends BxDolDb implements iBxDolSingleton
                 $sWhereClause = " AND `ts`.`IDLanguage`=:language_id ";
                 $sWhereClause = " AND `ts`.`IDLanguage`=:language_id ";
                 break;
                 break;
 
 
+            case 'autogenerated':
+                $sWhereClause = " AND `tk`.`Key` REGEXP '.+_[0-9]{8,10}$' ";
+
+                if(isset($aParams['empty']) && $aParams['empty'] === true) {
+                    $aMethod['params'][1] = array(
+                        'language_id' => (int)$aParams['language_id']
+                    );
+                    
+                    $sJoinClause = " LEFT JOIN `sys_localization_strings` AS `ts` ON `tk`.`ID`=`ts`.`IDKey` AND `ts`.`IDLanguage`=:language_id ";
+                    $sWhereClause .= " AND ISNULL(`ts`.`String`)";
+                }
+                break;
+
             case 'search':
             case 'search':
                 $aMethod['name'] = 'getColumn';
                 $aMethod['name'] = 'getColumn';
                 $aMethod['params'][1] = array();
                 $aMethod['params'][1] = array();
@@ -286,20 +299,20 @@ class BxDolLanguagesQuery extends BxDolDb implements iBxDolSingleton
                 $sJoinClause = " LEFT JOIN `sys_localization_categories` AS `tc` ON `tk`.`IDCategory`=`tc`.`ID` LEFT JOIN `sys_localization_strings` AS `ts` ON `tk`.`ID`=`ts`.`IDKey` LEFT JOIN `sys_localization_languages` AS `tl` ON `ts`.`IDLanguage`=`tl`.`ID` ";
                 $sJoinClause = " LEFT JOIN `sys_localization_categories` AS `tc` ON `tk`.`IDCategory`=`tc`.`ID` LEFT JOIN `sys_localization_strings` AS `ts` ON `tk`.`ID`=`ts`.`IDKey` LEFT JOIN `sys_localization_languages` AS `tl` ON `ts`.`IDLanguage`=`tl`.`ID` ";
 
 
                 if(isset($aParams['category']) && (int)$aParams['category'] != 0) {
                 if(isset($aParams['category']) && (int)$aParams['category'] != 0) {
-                	$aMethod['params'][1]['category_id'] = $aParams['category'];
+                    $aMethod['params'][1]['category_id'] = $aParams['category'];
 
 
                     $sWhereClause .= " AND `tc`.`ID`=:category_id";
                     $sWhereClause .= " AND `tc`.`ID`=:category_id";
                 }
                 }
 
 
                 if(isset($aParams['language']) && (int)$aParams['language'] != 0) {
                 if(isset($aParams['language']) && (int)$aParams['language'] != 0) {
-                	$aMethod['params'][1]['language_id'] = $aParams['language'];
+                    $aMethod['params'][1]['language_id'] = $aParams['language'];
 
 
                     $sWhereClause .= " AND `tl`.`ID`=:language_id";
                     $sWhereClause .= " AND `tl`.`ID`=:language_id";
                 }
                 }
 
 
                 if(isset($aParams['keyword']) && $aParams['keyword'] != '' && $aParams['keyword'] != _t('_adm_pgt_txt_keyword')) {
                 if(isset($aParams['keyword']) && $aParams['keyword'] != '' && $aParams['keyword'] != _t('_adm_pgt_txt_keyword')) {
-                	$aMethod['params'][1]['key'] = '%' . $aParams['keyword'] . '%';
-                	$aMethod['params'][1]['string'] = '%' . $aParams['keyword'] . '%';
+                    $aMethod['params'][1]['key'] = '%' . $aParams['keyword'] . '%';
+                    $aMethod['params'][1]['string'] = '%' . $aParams['keyword'] . '%';
 
 
                     $sWhereClause .= " AND (`tk`.`Key` LIKE :key OR `ts`.`String` LIKE :string)";
                     $sWhereClause .= " AND (`tk`.`Key` LIKE :key OR `ts`.`String` LIKE :string)";
                 }
                 }
@@ -312,8 +325,8 @@ class BxDolLanguagesQuery extends BxDolDb implements iBxDolSingleton
                 if(isset($aParams['length']) && (int)$aParams['length'] != 0)
                 if(isset($aParams['length']) && (int)$aParams['length'] != 0)
                     $iLength = $aParams['length'];
                     $iLength = $aParams['length'];
 
 
-				$aMethod['params'][1]['start'] = $iStart;
-				$aMethod['params'][1]['length'] = $iLength;
+                $aMethod['params'][1]['start'] = $iStart;
+                $aMethod['params'][1]['length'] = $iLength;
                 $sLimitClause .= " LIMIT :start, :length";
                 $sLimitClause .= " LIMIT :start, :length";
                 break;
                 break;
 
 

+ 6 - 0
inc/classes/BxDolModuleQuery.php

@@ -151,6 +151,12 @@ class BxDolModuleQuery extends BxDolDb implements iBxDolSingleton
             	$aMethod['params'][2] = 'uri';
             	$aMethod['params'][2] = 'uri';
             	break;
             	break;
 
 
+            case 'all_key_name':
+                $sPostfix .= 'all_key_name';
+            	$aMethod['name'] = 'getAllWithKey';
+            	$aMethod['params'][1] = 'name';
+            	break;
+
             case 'all':
             case 'all':
             	break;
             	break;
         }
         }

+ 5 - 1
studio/classes/BxDolStudioInstaller.php

@@ -622,8 +622,12 @@ class BxDolStudioInstaller extends BxDolInstallerUtils
         $bResult = true;
         $bResult = true;
         if($sOperation == 'install')
         if($sOperation == 'install')
             $bResult = $oLanguages->installLanguage(array('name' => $this->_aConfig['name'], 'path' => $this->_aConfig['home_dir'], 'uri' => $this->_aConfig['home_uri'], 'lang_category' => $this->_aConfig['language_category']), false);
             $bResult = $oLanguages->installLanguage(array('name' => $this->_aConfig['name'], 'path' => $this->_aConfig['home_dir'], 'uri' => $this->_aConfig['home_uri'], 'lang_category' => $this->_aConfig['language_category']), false);
+        if($bResult)
+            $bResult &= $oLanguages->compileLanguage(0, true);
 
 
-        return $bResult && $oLanguages->compileLanguage(0, true) ? BX_DOL_STUDIO_INSTALLER_SUCCESS : BX_DOL_STUDIO_INSTALLER_FAILED;
+        $oLanguages->fixLanguage($sLanguage);
+
+        return $bResult ? BX_DOL_STUDIO_INSTALLER_SUCCESS : BX_DOL_STUDIO_INSTALLER_FAILED;
     }
     }
     protected function actionUpdateLanguages($sOperation)
     protected function actionUpdateLanguages($sOperation)
     {
     {

+ 74 - 16
studio/classes/BxDolStudioLanguagesUtils.php

@@ -183,26 +183,44 @@ class BxDolStudioLanguagesUtils extends BxDolLanguages implements iBxDolSingleto
         if(empty($aLanguage) || !is_array($aLanguage))
         if(empty($aLanguage) || !is_array($aLanguage))
             return false;
             return false;
 
 
+        $aModulesToProcess = array();
+        $oModuleQuery = BxDolModuleQuery::getInstance();
+
+        /*
+         * Get modules to be processed from language module.
+         */
         $sPath = BX_DIRECTORY_PATH_MODULES . $aLanguageModule['path'] . 'data/langs/';
         $sPath = BX_DIRECTORY_PATH_MODULES . $aLanguageModule['path'] . 'data/langs/';
-        if(!($rHandler = opendir($sPath)))
-            return false;
+        if(($rHandler = opendir($sPath)) !== false) {
+            while(($sFileName = readdir($rHandler)) !== false) {
+                if($sFileName == '.' || $sFileName == '..')
+                    continue;
 
 
-		$oModuleQuery = BxDolModuleQuery::getInstance();
+                $aModule = $oModuleQuery->getModuleByName($sFileName);
+                if(empty($aModule) || !is_array($aModule))
+                    continue;
 
 
-        $bResult = false;
-        while(($sFileName = readdir($rHandler)) !== false) {
-        	if($sFileName == '.' || $sFileName == '..')
-				continue;
-
-			$aModule = $oModuleQuery->getModuleByName($sFileName);
-            if(empty($aModule) || !is_array($aModule))
-            	continue;
+                $aModulesToProcess[$aModule['name']] = $aModule;
+            }
 
 
-			$bResult |= $this->_restoreLanguageByModule($aLanguage, $sPath, $aModule);
+            closedir($rHandler);
         }
         }
-        closedir($rHandler);
 
 
-        $bResult |= $this->_restoreLanguageByModule($aLanguage, $sPath, $aLanguageModule);
+        /*
+         * Get modules to be processed from a list of already installed modules.
+         */
+        $aModulesInstalled = $oModuleQuery->getModulesBy(array('type' => 'all_key_name'));
+        if(!empty($aModulesInstalled) && is_array($aModulesInstalled))
+            $aModulesToProcess = array_merge($aModulesToProcess, $aModulesInstalled);
+
+        /*
+         * Add language module itself.
+         */
+        $aModulesToProcess[$aLanguageModule['name']] = $aLanguageModule;
+
+        $bResult = false;
+        foreach($aModulesToProcess as $aModuleToProcess)
+            $bResult |= $this->_restoreLanguageByModule($aLanguage, $sPath, $aModuleToProcess);
+
         return $bResult && ($bRecompile ? $this->compileLanguage($aLanguage['id']) : true);
         return $bResult && ($bRecompile ? $this->compileLanguage($aLanguage['id']) : true);
     }
     }
 
 
@@ -214,7 +232,7 @@ class BxDolStudioLanguagesUtils extends BxDolLanguages implements iBxDolSingleto
             $this->oDb->getLanguagesBy(array('type' => $sType, 'value' => $mixedLang), $aLanguages[0], false);
             $this->oDb->getLanguagesBy(array('type' => $sType, 'value' => $mixedLang), $aLanguages[0], false);
         } 
         } 
         else
         else
-			$this->oDb->getLanguagesBy(array('type' => 'all'), $aLanguages, false);
+            $this->oDb->getLanguagesBy(array('type' => 'all'), $aLanguages, false);
 
 
         $bResult = true;
         $bResult = true;
         foreach($aLanguages as $aLanguage) {
         foreach($aLanguages as $aLanguage) {
@@ -244,6 +262,46 @@ class BxDolStudioLanguagesUtils extends BxDolLanguages implements iBxDolSingleto
         return $bResult;
         return $bResult;
     }
     }
 
 
+    function fixLanguage($mixedLang = 0, $bRecompile = true)
+    {
+        $aLanguages = array();
+        if(!empty($mixedLang)) {
+            $sType = is_string($mixedLang) && !is_numeric($mixedLang) ? 'by_name' : 'by_id';
+            $this->oDb->getLanguagesBy(array('type' => $sType, 'value' => $mixedLang), $aLanguages[0], false);
+        }
+        else
+            $this->oDb->getLanguagesBy(array('type' => 'all'), $aLanguages, false);
+
+        foreach($aLanguages as $aLanguage) {
+            if(empty($aLanguage) || !is_array($aLanguage))
+                continue;
+
+            $iLanguageId = (int)$aLanguage['id'];
+
+            $aKeys = array();
+            $this->oDb->getKeysBy(array('type' => 'autogenerated', 'language_id' => $iLanguageId, 'empty' => true), $aKeys);
+            if(empty($aKeys) || !is_array($aKeys))
+                continue;
+
+            foreach($aKeys as $aKey) {
+                $sKey = preg_replace("/_[0-9]{8,10}$/i", '', $aKey['key']);
+                if(empty($sKey))
+                    continue;
+
+                $sString = '';
+                $aString = array();
+                $this->oDb->getStringsBy(array('type' => 'by_key_language_id', 'key' => $sKey, 'language_id' => $iLanguageId), $aString, false);
+                if(!empty($aString) && is_array($aString) && isset($aString['string']))
+                    $sString = $aString['string'];
+
+                $this->addLanguageString($aKey['key'], $sString, $iLanguageId, 0, false);
+            }
+
+            if($bRecompile)
+                $this->compileLanguage($iLanguageId, true);
+        }
+    }
+
     function removeLanguageById($mixedLang = 0, $bRecompile = true)
     function removeLanguageById($mixedLang = 0, $bRecompile = true)
     {
     {
         $aLanguages = array();
         $aLanguages = array();
@@ -440,7 +498,7 @@ class BxDolStudioLanguagesUtils extends BxDolLanguages implements iBxDolSingleto
         if(empty($aModule) || !is_array($aModule) || !$aModule['name'] || !$aModule['lang_category'])
         if(empty($aModule) || !is_array($aModule) || !$aModule['name'] || !$aModule['lang_category'])
             return true;
             return true;
 
 
-		$sPath = $sPath . $aModule['name'] . '/' . $aLanguage['name'] . '.xml';
+        $sPath = $sPath . $aModule['name'] . '/' . $aLanguage['name'] . '.xml';
         if(!file_exists($sPath) && isset($aModule['path'])) {
         if(!file_exists($sPath) && isset($aModule['path'])) {
             $sPath = BX_DIRECTORY_PATH_MODULES . $aModule['path'] . 'install/langs/' . $aLanguage['name'] . '.xml';
             $sPath = BX_DIRECTORY_PATH_MODULES . $aModule['path'] . 'install/langs/' . $aLanguage['name'] . '.xml';
             if(!file_exists($sPath))
             if(!file_exists($sPath))