Merge branch 'zentaopms_289'
This commit is contained in:
@@ -424,6 +424,7 @@ $config->programPriv->waterfall = array_merge($config->programPriv->scrum, a
|
||||
$config->programPriv->agileplus = $config->programPriv->scrum;
|
||||
$config->programPriv->waterfallplus = $config->programPriv->waterfall;
|
||||
|
||||
$config->safeFileTimeout = 3600;
|
||||
$config->waterfallModules = array('workestimation', 'durationestimation', 'budget', 'programplan', 'review', 'reviewissue', 'weekly', 'cm', 'milestone', 'design', 'opportunity', 'auditplan', 'trainplan', 'gapanalysis', 'pssp', 'researchplan', 'researchreport');
|
||||
|
||||
$config->showMainMenu = true;
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
ALTER TABLE `zt_lang` MODIFY COLUMN `section` varchar(50) NOT NULL;
|
||||
DELETE FROM `zt_grouppriv` WHERE `module` = 'dev' AND `method` = 'editor';
|
||||
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system','common','','setPercent','1');
|
||||
+1
-1
@@ -1024,7 +1024,7 @@ CREATE TABLE IF NOT EXISTS `zt_lang` (
|
||||
`id` mediumint(8) unsigned NOT NULL auto_increment,
|
||||
`lang` varchar(30) NOT NULL,
|
||||
`module` varchar(30) NOT NULL,
|
||||
`section` varchar(30) NOT NULL,
|
||||
`section` varchar(50) NOT NULL,
|
||||
`key` varchar(60) NOT NULL,
|
||||
`value` text NOT NULL,
|
||||
`system` enum('0','1') NOT NULL default '1',
|
||||
|
||||
@@ -20,15 +20,10 @@
|
||||
<ul class='nav'>
|
||||
<?php
|
||||
$methodName = strtolower($this->app->getMethodName());
|
||||
foreach($lang->attend->featurebar as $key => $menu)
|
||||
foreach($lang->attend->featureBar['personal'] as $type => $name)
|
||||
{
|
||||
if(is_string($menu)) $link = $menu;
|
||||
if(is_array($menu)) $link = $menu['link'];
|
||||
|
||||
list($name, $currentModule, $currentMethod, $params) = explode('|', $link);
|
||||
$class = strtolower($key) == $methodName ? "class='active'" : '';
|
||||
if(isset($menu['alias'])) $class = strpos(strtolower($menu['alias']), strtolower($key)) !== false ? "class='active'" : $class;
|
||||
if(common::hasPriv($currentModule, $currentMethod)) echo "<li id='$key' $class>" . html::a($this->createLink($currentModule, $currentMethod, $params), $name) . '</li>';
|
||||
$class = strtolower($type) == $methodName ? "class='active'" : '';
|
||||
if(common::hasPriv('attend', $type)) echo "<li id='$type' $class>" . html::a($this->createLink('attend', $type), $name) . '</li>';
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
|
||||
@@ -7,7 +7,7 @@ $lang->story->common = 'Story';
|
||||
/* Main Navigation. */
|
||||
$lang->mainNav = new stdclass();
|
||||
$lang->mainNav->my = "{$lang->navIcons['my']} {$lang->my->shortCommon}|my|index|";
|
||||
$lang->mainNav->project = "{$lang->navIcons['project']} {$lang->project->common}|$projectModule|$projectMethod|";
|
||||
$lang->mainNav->project = "{$lang->navIcons['project']} {$lang->projectCommon}|$projectModule|$projectMethod|";
|
||||
$lang->mainNav->execution = "{$lang->navIcons['execution']} Task|$executionModule|$executionMethod|";
|
||||
$lang->mainNav->kanban = "{$lang->navIcons['kanban']} {$lang->kanban->common}|kanban|space|";
|
||||
$lang->mainNav->doc = "{$lang->navIcons['doc']} {$lang->doc->common}|doc|index|";
|
||||
@@ -143,6 +143,9 @@ $lang->doc->menuOrder[30] = 'custom';
|
||||
$lang->doc->menu->project['subMenu'] = new stdclass();
|
||||
$lang->doc->menu->custom['subMenu'] = new stdclass();
|
||||
|
||||
/* Admin menu. */
|
||||
$lang->admin->menu = new stdclass();
|
||||
|
||||
/* adjust items of search. */
|
||||
$lang->searchObjects['all'] = 'All';
|
||||
$lang->searchObjects['todo'] = 'Todo';
|
||||
|
||||
@@ -7,7 +7,7 @@ $lang->story->common = 'Story';
|
||||
/* Main Navigation. */
|
||||
$lang->mainNav = new stdclass();
|
||||
$lang->mainNav->my = "{$lang->navIcons['my']} {$lang->my->shortCommon}|my|index|";
|
||||
$lang->mainNav->project = "{$lang->navIcons['project']} {$lang->project->common}|$projectModule|$projectMethod|";
|
||||
$lang->mainNav->project = "{$lang->navIcons['project']} {$lang->projectCommon}|$projectModule|$projectMethod|";
|
||||
$lang->mainNav->execution = "{$lang->navIcons['execution']} Task|$executionModule|$executionMethod|";
|
||||
$lang->mainNav->kanban = "{$lang->navIcons['kanban']} {$lang->kanban->common}|kanban|space|";
|
||||
$lang->mainNav->doc = "{$lang->navIcons['doc']} {$lang->doc->common}|doc|index|";
|
||||
@@ -143,6 +143,9 @@ $lang->doc->menuOrder[30] = 'custom';
|
||||
$lang->doc->menu->project['subMenu'] = new stdclass();
|
||||
$lang->doc->menu->custom['subMenu'] = new stdclass();
|
||||
|
||||
/* Admin menu. */
|
||||
$lang->admin->menu = new stdclass();
|
||||
|
||||
/* adjust items of search. */
|
||||
$lang->searchObjects['all'] = 'All';
|
||||
$lang->searchObjects['todo'] = 'Todo';
|
||||
|
||||
@@ -7,7 +7,7 @@ $lang->story->common = 'Story';
|
||||
/* Main Navigation. */
|
||||
$lang->mainNav = new stdclass();
|
||||
$lang->mainNav->my = "{$lang->navIcons['my']} {$lang->my->shortCommon}|my|index|";
|
||||
$lang->mainNav->project = "{$lang->navIcons['project']} {$lang->project->common}|$projectModule|$projectMethod|";
|
||||
$lang->mainNav->project = "{$lang->navIcons['project']} {$lang->projectCommon}|$projectModule|$projectMethod|";
|
||||
$lang->mainNav->execution = "{$lang->navIcons['execution']} Task|$executionModule|$executionMethod|";
|
||||
$lang->mainNav->kanban = "{$lang->navIcons['kanban']} {$lang->kanban->common}|kanban|space|";
|
||||
$lang->mainNav->doc = "{$lang->navIcons['doc']} {$lang->doc->common}|doc|index|";
|
||||
@@ -143,6 +143,9 @@ $lang->doc->menuOrder[30] = 'custom';
|
||||
$lang->doc->menu->project['subMenu'] = new stdclass();
|
||||
$lang->doc->menu->custom['subMenu'] = new stdclass();
|
||||
|
||||
/* Admin menu. */
|
||||
$lang->admin->menu = new stdclass();
|
||||
|
||||
/* adjust items of search. */
|
||||
$lang->searchObjects['all'] = 'All';
|
||||
$lang->searchObjects['todo'] = 'Todo';
|
||||
|
||||
@@ -7,7 +7,7 @@ $lang->story->common = '目标';
|
||||
/* Main Navigation. */
|
||||
$lang->mainNav = new stdclass();
|
||||
$lang->mainNav->my = "{$lang->navIcons['my']} {$lang->my->shortCommon}|my|index|";
|
||||
$lang->mainNav->project = "{$lang->navIcons['project']} {$lang->project->common}|$projectModule|$projectMethod|";
|
||||
$lang->mainNav->project = "{$lang->navIcons['project']} {$lang->projectCommon}|$projectModule|$projectMethod|";
|
||||
$lang->mainNav->execution = "{$lang->navIcons['execution']} 任务|$executionModule|$executionMethod|";
|
||||
$lang->mainNav->kanban = "{$lang->navIcons['kanban']} {$lang->kanban->common}|kanban|space|";
|
||||
$lang->mainNav->doc = "{$lang->navIcons['doc']} {$lang->doc->common}|doc|index|";
|
||||
@@ -143,6 +143,9 @@ $lang->doc->menuOrder[30] = 'custom';
|
||||
$lang->doc->menu->project['subMenu'] = new stdclass();
|
||||
$lang->doc->menu->custom['subMenu'] = new stdclass();
|
||||
|
||||
/* Admin menu. */
|
||||
$lang->admin->menu = new stdclass();
|
||||
|
||||
/* adjust items of search. */
|
||||
$lang->searchObjects['all'] = '全部';
|
||||
$lang->searchObjects['todo'] = '待办';
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
$lang->my->featureBar['contribute']['task'] = array();
|
||||
$lang->my->featureBar['contribute']['task']['assignedTo'] = 'AssignedToMe';
|
||||
$lang->my->featureBar['contribute']['task']['openedBy'] = 'CreatedByMe';
|
||||
$lang->my->featureBar['contribute']['task']['finishedBy'] = 'FinishedByMe';
|
||||
$lang->my->featureBar['contribute']['task']['closedBy'] = 'ClosedByMe';
|
||||
$lang->my->featureBar['contribute']['task']['canceledBy'] = 'CancelledByMe';
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
$lang->my->featureBar['contribute']['task'] = array();
|
||||
$lang->my->featureBar['contribute']['task']['assignedTo'] = 'AssignedToMe';
|
||||
$lang->my->featureBar['contribute']['task']['openedBy'] = 'CreatedByMe';
|
||||
$lang->my->featureBar['contribute']['task']['finishedBy'] = 'FinishedByMe';
|
||||
$lang->my->featureBar['contribute']['task']['closedBy'] = 'ClosedByMe';
|
||||
$lang->my->featureBar['contribute']['task']['canceledBy'] = 'CancelledByMe';
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
$lang->my->featureBar['contribute']['task'] = array();
|
||||
$lang->my->featureBar['contribute']['task']['assignedTo'] = 'AssignedToMe';
|
||||
$lang->my->featureBar['contribute']['task']['openedBy'] = 'CreatedByMe';
|
||||
$lang->my->featureBar['contribute']['task']['finishedBy'] = 'FinishedByMe';
|
||||
$lang->my->featureBar['contribute']['task']['closedBy'] = 'ClosedByMe';
|
||||
$lang->my->featureBar['contribute']['task']['canceledBy'] = 'CancelledByMe';
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
$lang->my->featureBar['contribute']['task'] = array();
|
||||
$lang->my->featureBar['contribute']['task']['assignedTo'] = '指派给我';
|
||||
$lang->my->featureBar['contribute']['task']['openedBy'] = '由我创建';
|
||||
$lang->my->featureBar['contribute']['task']['finishedBy'] = '由我完成';
|
||||
$lang->my->featureBar['contribute']['task']['closedBy'] = '由我关闭';
|
||||
$lang->my->featureBar['contribute']['task']['canceledBy'] = '由我取消';
|
||||
@@ -19,11 +19,10 @@
|
||||
<?php $recTotalLabel = " <span class='label label-light label-badge'>{$pager->recTotal}</span>"; ?>
|
||||
<?php if($app->rawMethod == 'contribute'):?>
|
||||
<?php
|
||||
echo html::a(inlink($app->rawMethod, "mode=$mode&type=assignedTo"), "<span class='text'>{$lang->my->taskMenu->assignedToMe}</span>" . ($type == 'assignedTo' ? $recTotalLabel : ''), '', "class='btn btn-link" . ($type == 'assignedTo' ? ' btn-active-text' : '') . "'");
|
||||
echo html::a(inlink($app->rawMethod, "mode=$mode&type=openedBy"), "<span class='text'>{$lang->my->taskMenu->openedByMe}</span>" . ($type == 'openedBy' ? $recTotalLabel : ''), '', "class='btn btn-link" . ($type == 'openedBy' ? ' btn-active-text' : '') . "'");
|
||||
echo html::a(inlink($app->rawMethod, "mode=$mode&type=finishedBy"), "<span class='text'>{$lang->my->taskMenu->finishedByMe}</span>" . ($type == 'finishedBy' ? $recTotalLabel : ''), '', "class='btn btn-link" . ($type == 'finishedBy' ? ' btn-active-text' : '') . "'");
|
||||
echo html::a(inlink($app->rawMethod, "mode=$mode&type=closedBy"), "<span class='text'>{$lang->my->taskMenu->closedByMe}</span>" . ($type == 'closedBy' ? $recTotalLabel : ''), '', "class='btn btn-link" . ($type == 'closedBy' ? ' btn-active-text' : '') . "'");
|
||||
echo html::a(inlink($app->rawMethod, "mode=$mode&type=canceledBy"), "<span class='text'>{$lang->my->taskMenu->canceledByMe}</span>" . ($type == 'canceledBy' ? $recTotalLabel : ''), '', "class='btn btn-link" . ($type == 'canceledBy' ? ' btn-active-text' : '') . "'");
|
||||
foreach($lang->my->featureBar[$app->rawMethod]['task'] as $key => $name)
|
||||
{
|
||||
echo html::a(inlink($app->rawMethod, "mode=$mode&type=$key"), "<span class='text'>{$name}</span>" . ($type == $key ? $recTotalLabel : ''), '', "class='btn btn-link" . ($type == $key ? ' btn-active-text' : '') . "'");
|
||||
}
|
||||
?>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<div class='clearfix' id='mainMenu'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php
|
||||
foreach($lang->project->featureBar['browse'] as $label => $labelName)
|
||||
foreach($lang->project->featureBar['execution'] as $label => $labelName)
|
||||
{
|
||||
$active = $status == $label ? 'btn-active-text' : '';
|
||||
echo html::a($this->createLink('project', 'execution', "status=$label&projectID=$projectID"), '<span class="text">' . $labelName . '</span> ' . ($status == $label ? "<span class='label label-light label-badge'>" . (int)count($kanbanList) . '</span>' : ''), '', "class='btn btn-link $active'");
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
}
|
||||
unset($visibleFields['module']);
|
||||
?>
|
||||
<form method='post' class='load-indicator main-form' enctype='multipart/form-data' target='hiddenwin' id="batchCreateForm">
|
||||
<form method='post' class='load-indicator main-form form-ajax' enctype='multipart/form-data' id="batchCreateForm">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-form">
|
||||
<thead>
|
||||
|
||||
@@ -2506,29 +2506,9 @@ class baseRouter
|
||||
|
||||
if($config and (!isset($config->$moduleName) or !is_object($config->$moduleName))) $config->$moduleName = new stdclass();
|
||||
|
||||
/* 初始化数组。Init the variables. */
|
||||
$extConfigFiles = array();
|
||||
$commonExtConfigFiles = array();
|
||||
$siteExtConfigFiles = array();
|
||||
|
||||
/* 先获得模块的主配置文件。Get the main config file for current module first. */
|
||||
$mainConfigFile = $this->getModulePath($appName, $moduleName) . 'config.php';
|
||||
|
||||
/* 查找扩展配置文件。Get extension config files. */
|
||||
if($config->framework->extensionLevel > 0) $extConfigPath = $this->getModuleExtPath($appName, $moduleName, 'config');
|
||||
if($config->framework->extensionLevel >= 1)
|
||||
{
|
||||
if(!empty($extConfigPath['common'])) $commonExtConfigFiles = helper::ls($extConfigPath['common'], '.php');
|
||||
if(!empty($extConfigPath['xuan'])) $commonExtConfigFiles = array_merge($commonExtConfigFiles, helper::ls($extConfigPath['xuan'], '.php'));
|
||||
if(!empty($extConfigPath['vision'])) $commonExtConfigFiles = array_merge($commonExtConfigFiles, helper::ls($extConfigPath['vision'], '.php'));
|
||||
if(!empty($extConfigPath['saas'])) $commonExtConfigFiles = array_merge($commonExtConfigFiles, helper::ls($extConfigPath['saas'], '.php'));
|
||||
if(!empty($extConfigPath['custom'])) $commonExtConfigFiles = array_merge($commonExtConfigFiles, helper::ls($extConfigPath['custom'], '.php'));
|
||||
}
|
||||
if($config->framework->extensionLevel == 2 and !empty($extConfigPath['site'])) $siteExtConfigFiles = helper::ls($extConfigPath['site'], '.php');
|
||||
$extConfigFiles = array_merge($commonExtConfigFiles, $siteExtConfigFiles);
|
||||
|
||||
/* 将主配置文件和扩展配置文件合并在一起。Put the main config file and extension config files together. */
|
||||
$configFiles = array_merge(array($mainConfigFile), $extConfigFiles);
|
||||
$configFiles = $this->getMainAndExtFiles($moduleName, $appName, 'config');
|
||||
if(empty($configFiles)) return false;
|
||||
|
||||
/* 加载每一个配置文件。Load every config file. */
|
||||
static $loadedConfigs = array();
|
||||
@@ -2670,36 +2650,8 @@ class baseRouter
|
||||
*/
|
||||
public function loadLang($moduleName, $appName = '')
|
||||
{
|
||||
/* 初始化变量。Init vars. */
|
||||
$modulePath = $this->getModulePath($appName, $moduleName);
|
||||
$extLangFiles = array();
|
||||
$langFilesToLoad = array();
|
||||
|
||||
/* 判断主语言文件是否存在。Whether the main lang file exists or not. */
|
||||
$mainLangFile = $this->getMainLangFile($moduleName, $appName);
|
||||
if($mainLangFile) $langFilesToLoad[] = $mainLangFile;
|
||||
|
||||
/* 获取扩展语言文件。If extensionLevel > 0, get extension lang files. */
|
||||
if($this->config->framework->extensionLevel > 0)
|
||||
{
|
||||
$commonExtLangFiles = array();
|
||||
$siteExtLangFiles = array();
|
||||
|
||||
$extLangPath = $this->getModuleExtPath($appName, $moduleName, 'lang');
|
||||
if($this->config->framework->extensionLevel >= 1)
|
||||
{
|
||||
if(!empty($extLangPath['common'])) $commonExtLangFiles = helper::ls($extLangPath['common'] . $this->clientLang, '.php');
|
||||
if(!empty($extLangPath['xuan'])) $commonExtLangFiles = array_merge($commonExtLangFiles, helper::ls($extLangPath['xuan'] . $this->clientLang, '.php'));
|
||||
if(!empty($extLangPath['vision'])) $commonExtLangFiles = array_merge($commonExtLangFiles, helper::ls($extLangPath['vision'] . $this->clientLang, '.php'));
|
||||
if(!empty($extLangPath['custom'])) $commonExtLangFiles = array_merge($commonExtLangFiles, helper::ls($extLangPath['custom'] . $this->clientLang, '.php'));
|
||||
if(!empty($extLangPath['saas'])) $commonExtLangFiles = array_merge($commonExtLangFiles, helper::ls($extLangPath['saas'] . $this->clientLang, '.php'));
|
||||
}
|
||||
if($this->config->framework->extensionLevel == 2 and !empty($extLangPath['site'])) $siteExtLangFiles = helper::ls($extLangPath['site'] . $this->clientLang, '.php');
|
||||
$extLangFiles = array_merge($commonExtLangFiles, $siteExtLangFiles);
|
||||
}
|
||||
|
||||
/* 计算最终要加载的语言文件。 Get the lang files to be loaded. */
|
||||
$langFilesToLoad = array_merge($langFilesToLoad, $extLangFiles);
|
||||
$langFilesToLoad = $this->getMainAndExtFiles($moduleName, $appName, 'lang');
|
||||
if(empty($langFilesToLoad)) return false;
|
||||
|
||||
/* 加载语言文件。Load lang files. */
|
||||
@@ -2972,6 +2924,59 @@ class baseRouter
|
||||
{
|
||||
return strtolower(getenv('IS_CONTAINER')) == 'true';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get main file and ext files.
|
||||
*
|
||||
* @param string $moduleName
|
||||
* @param string $appName
|
||||
* @param string $type lang|config|control|model
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getMainAndExtFiles($moduleName, $appName = '', $type = 'lang')
|
||||
{
|
||||
/* 初始化变量。Init vars. */
|
||||
$modulePath = $this->getModulePath($appName, $moduleName);
|
||||
$extFiles = array();
|
||||
$filesToLoad = array();
|
||||
|
||||
/* 判断主文件是否存在。Whether the main file exists or not. */
|
||||
if($type == 'lang')
|
||||
{
|
||||
$mainFile = $this->getMainLangFile($moduleName, $appName);
|
||||
}
|
||||
else
|
||||
{
|
||||
$mainFile = $modulePath . $type . '.php';
|
||||
}
|
||||
if($mainFile) $filesToLoad[] = $mainFile;
|
||||
|
||||
/* 获取扩展文件。If extensionLevel > 0, get extension files. */
|
||||
if($this->config->framework->extensionLevel > 0)
|
||||
{
|
||||
$commonExtFiles = array();
|
||||
$siteExtFiles = array();
|
||||
|
||||
$extPath = $this->getModuleExtPath($appName, $moduleName, $type);
|
||||
if($this->config->framework->extensionLevel >= 1)
|
||||
{
|
||||
$clientLang = $type == 'lang' ? $this->clientLang : '';
|
||||
if(!empty($extPath['common'])) $commonExtFiles = helper::ls($extPath['common'] . $clientLang, '.php');
|
||||
if(!empty($extPath['xuan'])) $commonExtFiles = array_merge($commonExtFiles, helper::ls($extPath['xuan'] . $clientLang, '.php'));
|
||||
if(!empty($extPath['vision'])) $commonExtFiles = array_merge($commonExtFiles, helper::ls($extPath['vision'] . $clientLang, '.php'));
|
||||
if(!empty($extPath['custom'])) $commonExtFiles = array_merge($commonExtFiles, helper::ls($extPath['custom'] . $clientLang, '.php'));
|
||||
if(!empty($extPath['saas'])) $commonExtFiles = array_merge($commonExtFiles, helper::ls($extPath['saas'] . $clientLang, '.php'));
|
||||
}
|
||||
if($this->config->framework->extensionLevel == 2 and !empty($extPath['site'])) $siteExtFiles = helper::ls($extPath['site'] . $clientLang, '.php');
|
||||
$extFiles = array_merge($commonExtFiles, $siteExtFiles);
|
||||
}
|
||||
|
||||
/* 计算最终要加载的文件。 Get the files to be loaded. */
|
||||
$filesToLoad = array_merge($filesToLoad, $extFiles);
|
||||
if(empty($filesToLoad)) return false;
|
||||
return $filesToLoad;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+52
-17
@@ -108,34 +108,65 @@ class router extends baseRouter
|
||||
|
||||
parent::loadLang($moduleName, $appName);
|
||||
|
||||
/* Replace main nav lang. */
|
||||
if($moduleName == 'common' and $this->dbh and !empty($this->config->db->name))
|
||||
{
|
||||
$customMenus = $this->dbh->query('SELECT * FROM' . TABLE_LANG . "WHERE `module`='common' AND `section`='mainNav' AND `lang`='{$this->clientLang}' AND `vision`='{$this->config->vision}'")->fetchAll();
|
||||
foreach($customMenus as $menu)
|
||||
{
|
||||
$menuKey = $menu->key;
|
||||
if(isset($lang->mainNav->$menuKey)) $lang->mainNav->$menuKey = zget($lang->navIcons, $menuKey, '') . " {$menu->value}" . substr($lang->mainNav->$menuKey, strpos($lang->mainNav->$menuKey, '|'));
|
||||
}
|
||||
}
|
||||
|
||||
/* Merge from the db lang. */
|
||||
if($moduleName != 'common' and isset($lang->db->custom[$moduleName]))
|
||||
{
|
||||
foreach($lang->db->custom[$moduleName] as $section => $fields)
|
||||
{
|
||||
if(isset($lang->{$moduleName}->{$section}['']))
|
||||
if(in_array($section, array('featureBar', 'moreSelects')))
|
||||
{
|
||||
$nullKey = '';
|
||||
$nullValue = $lang->{$moduleName}->{$section}[$nullKey];
|
||||
foreach($fields as $featureBarMethod => $featureBarValues)
|
||||
{
|
||||
foreach($featureBarValues as $featureBarKey => $featureBarValue)
|
||||
{
|
||||
if(is_array($featureBarValue))
|
||||
{
|
||||
foreach($featureBarValue as $key => $value) $lang->{$moduleName}->{$section}[$featureBarMethod][$featureBarKey][$key] = $value;
|
||||
}
|
||||
else
|
||||
{
|
||||
$lang->{$moduleName}->{$section}[$featureBarMethod][$featureBarKey] = $featureBarValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
elseif(isset($lang->{$moduleName}->{$section}[0]))
|
||||
else
|
||||
{
|
||||
$nullKey = 0;
|
||||
$nullValue = $lang->{$moduleName}->{$section}[0];
|
||||
}
|
||||
unset($lang->{$moduleName}->{$section});
|
||||
if(isset($lang->{$moduleName}->{$section}['']))
|
||||
{
|
||||
$nullKey = '';
|
||||
$nullValue = $lang->{$moduleName}->{$section}[$nullKey];
|
||||
}
|
||||
elseif(isset($lang->{$moduleName}->{$section}[0]))
|
||||
{
|
||||
$nullKey = 0;
|
||||
$nullValue = $lang->{$moduleName}->{$section}[0];
|
||||
}
|
||||
unset($lang->{$moduleName}->{$section});
|
||||
|
||||
if(isset($nullKey))$lang->{$moduleName}->{$section}[$nullKey] = $nullValue;
|
||||
foreach($fields as $key => $value)
|
||||
{
|
||||
if($section == 'priList' and $key > 0 and trim($value) === '') continue; // Fix bug #23538.
|
||||
if(isset($nullKey))$lang->{$moduleName}->{$section}[$nullKey] = $nullValue;
|
||||
foreach($fields as $key => $value)
|
||||
{
|
||||
if($section == 'priList' and $key > 0 and trim($value) === '') continue; // Fix bug #23538.
|
||||
|
||||
if(!isset($lang->{$moduleName})) $lang->{$moduleName} = new stdclass();
|
||||
if(!isset($lang->{$moduleName}->{$section})) $lang->{$moduleName}->{$section} = array();
|
||||
$lang->{$moduleName}->{$section}[$key] = $value;
|
||||
if(!isset($lang->{$moduleName})) $lang->{$moduleName} = new stdclass();
|
||||
if(!isset($lang->{$moduleName}->{$section})) $lang->{$moduleName}->{$section} = array();
|
||||
$lang->{$moduleName}->{$section}[$key] = $value;
|
||||
}
|
||||
unset($nullKey);
|
||||
unset($nullValue);
|
||||
}
|
||||
unset($nullKey);
|
||||
unset($nullValue);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -284,6 +315,10 @@ class router extends baseRouter
|
||||
$lang->URCommon = isset($URPairs[$config->URSR]) ? $URPairs[$config->URSR] : reset($URPairs);
|
||||
$lang->SRCommon = isset($SRPairs[$config->URSR]) ? $SRPairs[$config->URSR] : reset($SRPairs);
|
||||
}
|
||||
|
||||
/* Replace common lang. */
|
||||
$customMenus = $this->dbh->query('SELECT * FROM' . TABLE_LANG . "WHERE `module`='common' AND `lang`='{$this->clientLang}' AND `section`='' AND `vision`='{$config->vision}'")->fetchAll();
|
||||
foreach($customMenus as $menu) if(isset($lang->{$menu->key})) $lang->{$menu->key} = $menu->value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1196,10 +1196,27 @@ EOT;
|
||||
if($config->tabSession and helper::isWithTID()) $jsConfig->tid = zget($_GET, 'tid', '');
|
||||
|
||||
$jsLang = new stdclass();
|
||||
$jsLang->submitting = isset($lang->loading) ? $lang->loading : '';
|
||||
$jsLang->save = $jsConfig->save;
|
||||
$jsLang->expand = isset($lang->expand) ? $lang->expand : '';
|
||||
$jsLang->timeout = isset($lang->timeout) ? $lang->timeout : '';
|
||||
$jsLang->submitting = isset($lang->loading) ? $lang->loading : '';
|
||||
$jsLang->save = $jsConfig->save;
|
||||
$jsLang->expand = isset($lang->expand) ? $lang->expand : '';
|
||||
$jsLang->timeout = isset($lang->timeout) ? $lang->timeout : '';
|
||||
$jsLang->confirmDraft = isset($lang->confirmDraft) ? $lang->confirmDraft : '';
|
||||
$jsLang->resume = isset($lang->resume) ? $lang->resume : '';
|
||||
$jsLang->program = zget($lang->program, 'common', '');
|
||||
$jsLang->project = zget($lang->project, 'common', '');
|
||||
$jsLang->product = zget($lang->product, 'common', '');
|
||||
$jsLang->task = zget($lang->task, 'common', '');
|
||||
$jsLang->story = zget($lang->story, 'common', '');
|
||||
$jsLang->bug = zget($lang->bug, 'common', '');
|
||||
$jsLang->testcase = zget($lang->testcase, 'common', '');
|
||||
$jsLang->zahost = zget($lang->zahost, 'common', '');
|
||||
$jsLang->zanode = zget($lang->zanode, 'common', '');
|
||||
$jsLang->gitlab = zget($lang->gitlab, 'common', '');
|
||||
$jsLang->gogs = zget($lang->gogs, 'common', '');
|
||||
$jsLang->gitea = zget($lang->gitea, 'common', '');
|
||||
$jsLang->jenkins = zget($lang->jenkins, 'common', '');
|
||||
$jsLang->sonarqube = zget($lang->sonarqube, 'common', '');
|
||||
$jsLang->repo = zget($lang->repo, 'common', '');
|
||||
|
||||
$js = static::start(false);
|
||||
$js .= 'window.config=' . json_encode($jsConfig) . ";\n";
|
||||
|
||||
+23
-23
@@ -13,11 +13,11 @@ class zfile
|
||||
{
|
||||
/**
|
||||
* Copy a directory from an directory to another directory.
|
||||
*
|
||||
* @param string $from
|
||||
* @param string $to
|
||||
*
|
||||
* @param string $from
|
||||
* @param string $to
|
||||
* @param bool $logLevel
|
||||
* @param string $logFile
|
||||
* @param string $logFile
|
||||
* @param array $excludeFiles
|
||||
* @param bool $toIsLink
|
||||
* @access public
|
||||
@@ -110,9 +110,9 @@ class zfile
|
||||
|
||||
/**
|
||||
* Get count.
|
||||
*
|
||||
* @param string $dir
|
||||
* @param array $excludeFiles
|
||||
*
|
||||
* @param string $dir
|
||||
* @param array $excludeFiles
|
||||
* @access public
|
||||
* @return int
|
||||
*/
|
||||
@@ -136,8 +136,8 @@ class zfile
|
||||
|
||||
/**
|
||||
* Remove a dir.
|
||||
*
|
||||
* @param string $dir
|
||||
*
|
||||
* @param string $dir
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
@@ -171,9 +171,9 @@ class zfile
|
||||
|
||||
/**
|
||||
* Get files under a directory recursive.
|
||||
*
|
||||
* @param string $dir
|
||||
* @param array $exceptions
|
||||
*
|
||||
* @param string $dir
|
||||
* @param array $exceptions
|
||||
* @access private
|
||||
* @return array
|
||||
*/
|
||||
@@ -207,8 +207,8 @@ class zfile
|
||||
|
||||
/**
|
||||
* Make a dir.
|
||||
*
|
||||
* @param string $dir
|
||||
*
|
||||
* @param string $dir
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
@@ -219,8 +219,8 @@ class zfile
|
||||
|
||||
/**
|
||||
* Remove a file
|
||||
*
|
||||
* @param string $file
|
||||
*
|
||||
* @param string $file
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
@@ -232,7 +232,7 @@ class zfile
|
||||
|
||||
/**
|
||||
* Batch remove files. use glob function.
|
||||
*
|
||||
*
|
||||
* @param string $patern
|
||||
* @access public
|
||||
* @return void
|
||||
@@ -245,7 +245,7 @@ class zfile
|
||||
|
||||
/**
|
||||
* Remove a file
|
||||
*
|
||||
*
|
||||
* @param string from
|
||||
* @param string to
|
||||
* @access public
|
||||
@@ -258,7 +258,7 @@ class zfile
|
||||
|
||||
/**
|
||||
* Rename a file or directory.
|
||||
*
|
||||
*
|
||||
* @param string from
|
||||
* @param string to
|
||||
* @access public
|
||||
@@ -271,8 +271,8 @@ class zfile
|
||||
|
||||
/**
|
||||
* Get file size.
|
||||
*
|
||||
* @param string $file
|
||||
*
|
||||
* @param string $file
|
||||
* @access public
|
||||
* @return int
|
||||
*/
|
||||
@@ -283,10 +283,10 @@ class zfile
|
||||
|
||||
/**
|
||||
* Get directory size.
|
||||
*
|
||||
*
|
||||
* @param string $dir
|
||||
* @access public
|
||||
* @return int
|
||||
* @return int
|
||||
*/
|
||||
public function getDirSize($dir)
|
||||
{
|
||||
|
||||
@@ -91,14 +91,6 @@ $lang->action->dynamic->all = 'Alle';
|
||||
$lang->action->dynamic->hidden = 'Versteckt';
|
||||
$lang->action->dynamic->search = 'Suche';
|
||||
|
||||
$lang->action->periods['all'] = $lang->action->dynamic->all;
|
||||
$lang->action->periods['today'] = $lang->action->dynamic->today;
|
||||
$lang->action->periods['yesterday'] = $lang->action->dynamic->yesterday;
|
||||
$lang->action->periods['thisweek'] = $lang->action->dynamic->thisWeek;
|
||||
$lang->action->periods['lastweek'] = $lang->action->dynamic->lastWeek;
|
||||
$lang->action->periods['thismonth'] = $lang->action->dynamic->thisMonth;
|
||||
$lang->action->periods['lastmonth'] = $lang->action->dynamic->lastMonth;
|
||||
|
||||
$lang->action->objectTypes['product'] = $lang->productCommon;
|
||||
$lang->action->objectTypes['branch'] = 'Branch';
|
||||
$lang->action->objectTypes['story'] = $lang->SRCommon;
|
||||
|
||||
@@ -91,14 +91,6 @@ $lang->action->dynamic->all = 'All';
|
||||
$lang->action->dynamic->hidden = 'Hidden';
|
||||
$lang->action->dynamic->search = 'Search';
|
||||
|
||||
$lang->action->periods['all'] = $lang->action->dynamic->all;
|
||||
$lang->action->periods['today'] = $lang->action->dynamic->today;
|
||||
$lang->action->periods['yesterday'] = $lang->action->dynamic->yesterday;
|
||||
$lang->action->periods['thisweek'] = $lang->action->dynamic->thisWeek;
|
||||
$lang->action->periods['lastweek'] = $lang->action->dynamic->lastWeek;
|
||||
$lang->action->periods['thismonth'] = $lang->action->dynamic->thisMonth;
|
||||
$lang->action->periods['lastmonth'] = $lang->action->dynamic->lastMonth;
|
||||
|
||||
$lang->action->objectTypes['product'] = $lang->productCommon;
|
||||
$lang->action->objectTypes['branch'] = 'Branch';
|
||||
$lang->action->objectTypes['story'] = $lang->SRCommon;
|
||||
|
||||
@@ -91,14 +91,6 @@ $lang->action->dynamic->all = 'Tout';
|
||||
$lang->action->dynamic->hidden = 'Caché';
|
||||
$lang->action->dynamic->search = 'Rechercher';
|
||||
|
||||
$lang->action->periods['all'] = $lang->action->dynamic->all;
|
||||
$lang->action->periods['today'] = $lang->action->dynamic->today;
|
||||
$lang->action->periods['yesterday'] = $lang->action->dynamic->yesterday;
|
||||
$lang->action->periods['thisweek'] = $lang->action->dynamic->thisWeek;
|
||||
$lang->action->periods['lastweek'] = $lang->action->dynamic->lastWeek;
|
||||
$lang->action->periods['thismonth'] = $lang->action->dynamic->thisMonth;
|
||||
$lang->action->periods['lastmonth'] = $lang->action->dynamic->lastMonth;
|
||||
|
||||
$lang->action->objectTypes['product'] = $lang->productCommon;
|
||||
$lang->action->objectTypes['branch'] = 'Branche';
|
||||
$lang->action->objectTypes['story'] = $lang->SRCommon;
|
||||
|
||||
@@ -60,14 +60,6 @@ $lang->action->dynamic->all = 'Tất cả';
|
||||
$lang->action->dynamic->hidden = 'Ẩn';
|
||||
$lang->action->dynamic->search = 'Tìm kiếm';
|
||||
|
||||
$lang->action->periods['all'] = $lang->action->dynamic->all;
|
||||
$lang->action->periods['today'] = $lang->action->dynamic->today;
|
||||
$lang->action->periods['yesterday'] = $lang->action->dynamic->yesterday;
|
||||
$lang->action->periods['thisweek'] = $lang->action->dynamic->thisWeek;
|
||||
$lang->action->periods['lastweek'] = $lang->action->dynamic->lastWeek;
|
||||
$lang->action->periods['thismonth'] = $lang->action->dynamic->thisMonth;
|
||||
$lang->action->periods['lastmonth'] = $lang->action->dynamic->lastMonth;
|
||||
|
||||
$lang->action->objectTypes['product'] = $lang->productCommon;
|
||||
$lang->action->objectTypes['branch'] = 'Nhánh';
|
||||
$lang->action->objectTypes['story'] = $lang->SRCommon;
|
||||
|
||||
@@ -91,14 +91,6 @@ $lang->action->dynamic->all = '所有';
|
||||
$lang->action->dynamic->hidden = '已隐藏';
|
||||
$lang->action->dynamic->search = '搜索';
|
||||
|
||||
$lang->action->periods['all'] = '全部';
|
||||
$lang->action->periods['today'] = $lang->action->dynamic->today;
|
||||
$lang->action->periods['yesterday'] = $lang->action->dynamic->yesterday;
|
||||
$lang->action->periods['thisweek'] = $lang->action->dynamic->thisWeek;
|
||||
$lang->action->periods['lastweek'] = $lang->action->dynamic->lastWeek;
|
||||
$lang->action->periods['thismonth'] = $lang->action->dynamic->thisMonth;
|
||||
$lang->action->periods['lastmonth'] = $lang->action->dynamic->lastMonth;
|
||||
|
||||
$lang->action->objectTypes['product'] = $lang->productCommon;
|
||||
$lang->action->objectTypes['branch'] = '分支';
|
||||
$lang->action->objectTypes['story'] = $lang->SRCommon;
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php $activeClass = $currentObjectType == 'all' ? 'btn-active-text' : '';?>
|
||||
<?php echo html::a($this->createLink('action', 'trash', "objectType=all&type=$type"), "<span class='text'>" . $lang->action->periods['all'] . "</span>", '', "class='btn btn-link $activeClass'");?>
|
||||
<?php echo html::a($this->createLink('action', 'trash', "objectType=all&type=$type"), "<span class='text'>" . $lang->all . "</span>", '', "class='btn btn-link $activeClass'");?>
|
||||
<?php
|
||||
/* Output the objectType order by preferredTypeConfig. */
|
||||
foreach($preferredTypeConfig as $objectType)
|
||||
|
||||
@@ -10,11 +10,11 @@ if(!isset($config->safe->weak)) $config->safe->weak = '123456,password,12345,123
|
||||
$config->admin->menuGroup['system'] = array('custom|mode', 'backup', 'cron', 'action|trash', 'admin|xuanxuan', 'setting|xuanxuan', 'admin|license', 'admin|checkweak', 'admin|resetpwdsetting', 'admin|safe', 'custom|timezone', 'search|buildindex', 'admin|tableengine', 'ldap', 'custom|libreoffice', 'conference', 'client');
|
||||
$config->admin->menuGroup['company'] = array('dept', 'company', 'user', 'group', 'tutorial');
|
||||
$config->admin->menuGroup['switch'] = array('admin|setmodule');
|
||||
$config->admin->menuGroup['model'] = array('auditcl', 'stage', 'design', 'cmcl', 'reviewcl', 'custom|required', 'custom|set', 'custom|flow', 'custom|code', 'custom|estimate', 'custom|hours', 'subject', 'process', 'activity', 'zoutput', 'classify', 'holiday', 'reviewsetting');
|
||||
$config->admin->menuGroup['model'] = array('auditcl', 'stage', 'design', 'cmcl', 'reviewcl', 'custom|required', 'custom|set', 'custom|flow', 'custom|code', 'custom|percent','custom|estimate', 'custom|hours', 'subject', 'process', 'activity', 'zoutput', 'classify', 'holiday', 'reviewsetting');
|
||||
$config->admin->menuGroup['feature'] = array('custom|set', 'custom|product', 'custom|execution', 'custom|required', 'custom|kanban', 'approvalflow', 'measurement', 'meetingroom', 'custom|browsestoryconcept', 'custom|kanban', 'sqlbuilder', 'report');
|
||||
$config->admin->menuGroup['template'] = array('custom|set', 'baseline');
|
||||
$config->admin->menuGroup['message'] = array('mail', 'webhook', 'sms', 'message');
|
||||
$config->admin->menuGroup['dev'] = array('dev', 'entry');
|
||||
$config->admin->menuGroup['dev'] = array('dev', 'entry', 'editor');
|
||||
$config->admin->menuGroup['extension'] = array('extension');
|
||||
$config->admin->menuGroup['convert'] = array('convert');
|
||||
|
||||
|
||||
@@ -89,15 +89,17 @@ if(helper::hasFeature('waterfall') or helper::hasFeature('waterfallplus')) $lang
|
||||
$lang->admin->menuList->model['tabMenu']['common']['build'] = array('link' => "{$lang->build->common}|custom|required|module=build", 'alias' => 'set', 'exclude' => 'custom');
|
||||
$lang->admin->menuList->model['tabMenu']['common']['flow'] = array('link' => "{$lang->custom->flow}|custom|flow|", 'divider' => true);
|
||||
$lang->admin->menuList->model['tabMenu']['common']['code'] = array('link' => "{$lang->code}|custom|code|");
|
||||
|
||||
$lang->admin->menuList->model['tabMenu']['common']['percent'] = array('link' => "{$lang->stage->percent}|custom|percent|");
|
||||
$lang->admin->menuList->model['tabMenu']['common']['hours'] = array('link' => "{$lang->workingHour}|custom|hours|", 'subModule' => 'holiday', 'links' => array('holiday|browse|', 'custom|hours|'));
|
||||
if(helper::hasFeature('waterfall')) $lang->admin->menuList->model['tabMenu']['waterfall']['stage'] = array('link' => "{$lang->stage->list}|stage|browse|", 'subModule' => 'stage', 'exclude' => 'stage-plusbrowse');
|
||||
if(helper::hasFeature('waterfallplus')) $lang->admin->menuList->model['tabMenu']['waterfallplus']['stage'] = array('link' => "{$lang->stage->list}|stage|plusbrowse|", 'subModule' => 'stage', 'exclude' => 'stage-browse');
|
||||
|
||||
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['5'] = 'project';
|
||||
if(helper::hasFeature('waterfall') or helper::hasFeature('waterfallplus')) $lang->admin->menuList->model['tabMenu']['menuOrder']['common']['7'] = 'stage';
|
||||
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['10'] = 'build';
|
||||
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['35'] = 'flow';
|
||||
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['40'] = 'code';
|
||||
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['43'] = 'percent';
|
||||
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['45'] = 'hours';
|
||||
if(helper::hasFeature('waterfall')) $lang->admin->menuList->model['tabMenu']['menuOrder']['waterfall']['5'] = 'stage';
|
||||
if(helper::hasFeature('waterfallplus')) $lang->admin->menuList->model['tabMenu']['menuOrder']['waterfallplus']['5'] = 'stage';
|
||||
@@ -163,15 +165,17 @@ $lang->admin->menuList->message['menuOrder']['10'] = 'webhook';
|
||||
$lang->admin->menuList->message['menuOrder']['20'] = 'browser';
|
||||
$lang->admin->menuList->message['menuOrder']['25'] = 'setting';
|
||||
|
||||
$lang->admin->menuList->dev['subMenu']['api'] = array('link' => "{$lang->api->doc}|dev|api|module=index");
|
||||
$lang->admin->menuList->dev['subMenu']['db'] = array('link' => "{$lang->database}|dev|db|table=" . trim(TABLE_EFFORT, '`'));
|
||||
$lang->admin->menuList->dev['subMenu']['editor'] = array('link' => "{$lang->editor}|dev|editor|");
|
||||
$lang->admin->menuList->dev['subMenu']['entry'] = array('link' => "{$lang->admin->entry}|entry|browse|", 'subModule' => 'entry');
|
||||
$lang->admin->menuList->dev['subMenu']['api'] = array('link' => "{$lang->api->doc}|dev|api|module=index");
|
||||
$lang->admin->menuList->dev['subMenu']['db'] = array('link' => "{$lang->database}|dev|db|table=" . trim(TABLE_EFFORT, '`'));
|
||||
$lang->admin->menuList->dev['subMenu']['langItem'] = array('link' => "{$lang->langItem}|dev|langitem|");
|
||||
$lang->admin->menuList->dev['subMenu']['editor'] = array('link' => "{$lang->editor->common}|dev|editor|", 'subModule' => 'editor');
|
||||
$lang->admin->menuList->dev['subMenu']['entry'] = array('link' => "{$lang->admin->entry}|entry|browse|", 'subModule' => 'entry');
|
||||
|
||||
$lang->admin->menuList->dev['menuOrder']['5'] = 'api';
|
||||
$lang->admin->menuList->dev['menuOrder']['10'] = 'db';
|
||||
$lang->admin->menuList->dev['menuOrder']['15'] = 'editor';
|
||||
$lang->admin->menuList->dev['menuOrder']['20'] = 'entry';
|
||||
$lang->admin->menuList->dev['menuOrder']['15'] = 'langItem';
|
||||
$lang->admin->menuList->dev['menuOrder']['20'] = 'editor';
|
||||
$lang->admin->menuList->dev['menuOrder']['25'] = 'entry';
|
||||
|
||||
if($config->edition != 'max')
|
||||
{
|
||||
|
||||
@@ -333,6 +333,13 @@ class adminModel extends model
|
||||
/* Check sub menu priv. */
|
||||
foreach($subMenuList as $subMenuKey => $subMenu)
|
||||
{
|
||||
if($menuKey == 'message' and $subMenuKey == 'mail')
|
||||
{
|
||||
$this->loadModel('mail');
|
||||
if(!$this->config->mail->turnon and !$this->session->mailConfig) $subMenu['link'] = $this->lang->mail->common . '|mail|detect|';
|
||||
}
|
||||
if($menuKey == 'dev' and $subMenuKey == 'editor' and !empty($this->config->global->editor)) $subMenu['link'] = $this->lang->editor->common . '|editor|index|';
|
||||
|
||||
$link = array();
|
||||
if(isset($menu['tabMenu'][$subMenuKey]))
|
||||
{
|
||||
@@ -362,12 +369,6 @@ class adminModel extends model
|
||||
}
|
||||
else
|
||||
{
|
||||
if($menuKey == 'message' and $subMenuKey == 'mail')
|
||||
{
|
||||
$this->loadModel('mail');
|
||||
if(!$this->config->mail->turnon and !$this->session->mailConfig) $subMenu['link'] = $this->lang->mail->common . '|mail|detect|';
|
||||
}
|
||||
|
||||
$link = $this->getHasPrivLink($subMenu);
|
||||
}
|
||||
|
||||
@@ -634,7 +635,7 @@ class adminModel extends model
|
||||
$connected = curl_exec($curl);
|
||||
curl_close($curl);
|
||||
|
||||
return (bool)$connected;
|
||||
return $connected ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -205,7 +205,7 @@ $(function()
|
||||
<div class='col-7'>
|
||||
<div class='progress progress-text-left'>
|
||||
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="<?php echo $project->executions[0]->hours->progress;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $project->executions[0]->hours->progress;?>%">
|
||||
<span class='progress-text'><?php echo $project->executions[0]->hours->progress . '%';?></span>
|
||||
<span class='progress-text'><?php echo !empty($project->executions[0]->hours->progress) ? $project->executions[0]->hours->progress . '%' : '0%';?></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
$typeName = '';
|
||||
if(isset($lang->{$review->type}->common)) $typeName = $lang->{$review->type}->common;
|
||||
if($type == 'story') $typeName = $lang->my->auditMenu->audit->story;
|
||||
if($type == 'story') $typeName = $lang->SRCommon;
|
||||
if($review->type == 'projectreview') $typeName = $lang->project->common;
|
||||
if(isset($flows[$review->type])) $typeName = $flows[$review->type];
|
||||
|
||||
|
||||
@@ -1165,6 +1165,9 @@ class bug extends control
|
||||
$productBugs = $this->bug->getProductBugPairs($productID, $branch);
|
||||
unset($productBugs[$bugID]);
|
||||
|
||||
$executions = array(0 => '') + $this->product->getExecutionPairsByProduct($bug->product, $bug->branch, 'id_desc', $bug->project);
|
||||
if(!empty($bug->execution) and empty($executions[$bug->execution])) $executions[$execution->id] = $execution->name;
|
||||
|
||||
if($product->shadow) $this->view->project = $this->loadModel('project')->getByShadowProduct($bug->product);
|
||||
|
||||
$this->view->bug = $bug;
|
||||
@@ -1177,7 +1180,7 @@ class bug extends control
|
||||
$this->view->projectExecutionPairs = $this->loadModel('project')->getProjectExecutionPairs();
|
||||
$this->view->moduleOptionMenu = $moduleOptionMenu;
|
||||
$this->view->currentModuleID = $currentModuleID;
|
||||
$this->view->executions = array(0 => '') + $this->product->getExecutionPairsByProduct($bug->product, $bug->branch, 'id_desc', $bug->project);
|
||||
$this->view->executions = $executions;
|
||||
$this->view->stories = $bug->execution ? $this->story->getExecutionStoryPairs($bug->execution) : $this->story->getProductStoryPairs($bug->product, $bug->branch, 0, 'all', 'id_desc', 0, 'full', 'story', false);
|
||||
$this->view->branchOption = $branchOption;
|
||||
$this->view->branchTagOption = $branchTagOption;
|
||||
|
||||
@@ -66,6 +66,7 @@ class build extends control
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('build', 'view', "buildID=$buildID") . "#app={$this->app->tab}"));
|
||||
}
|
||||
|
||||
$status = empty($this->config->CRProduct) ? 'noclosed' : '';
|
||||
$this->loadModel('product');
|
||||
$this->loadModel('project');
|
||||
/* Set menu. */
|
||||
@@ -74,7 +75,7 @@ class build extends control
|
||||
$this->project->setMenu($projectID);
|
||||
$executions = $this->execution->getPairs($projectID, 'all', 'stagefilter|leaf|order_asc');
|
||||
$executionID = empty($executionID) ? key($executions) : $executionID;
|
||||
$productGroups = $executionID ? $this->product->getProducts($executionID) : array();
|
||||
$productGroups = $executionID ? $this->product->getProducts($executionID, $status) : array();
|
||||
$branchGroups = $executionID ? $this->project->getBranchesByProject($executionID) : array();
|
||||
$this->session->set('project', $projectID);
|
||||
}
|
||||
@@ -83,7 +84,7 @@ class build extends control
|
||||
$execution = $this->execution->getByID($executionID);
|
||||
$executions = $this->execution->getPairs($execution->project, 'all', 'stagefilter|leaf|order_asc');
|
||||
$projectID = $execution->project;
|
||||
$productGroups = $this->product->getProducts($executionID);
|
||||
$productGroups = $this->product->getProducts($executionID, $status);
|
||||
$branchGroups = $this->project->getBranchesByProject($executionID);
|
||||
$this->execution->setMenu($executionID);
|
||||
$this->session->set('project', $execution->project);
|
||||
@@ -93,7 +94,7 @@ class build extends control
|
||||
$execution = $this->execution->getByID($executionID);
|
||||
$projectID = $execution ? $execution->project : 0;
|
||||
$executions = $this->execution->getPairs($projectID, 'all', 'stagefilter|leaf');
|
||||
$productGroups = $this->product->getProducts($executionID);
|
||||
$productGroups = $this->product->getProducts($executionID, $status);
|
||||
$branchGroups = $this->project->getBranchesByProject($executionID);
|
||||
}
|
||||
|
||||
@@ -171,14 +172,15 @@ class build extends control
|
||||
if($this->app->tab == 'execution') $this->execution->setMenu($build->execution);
|
||||
|
||||
$builds = array();
|
||||
$status = empty($this->config->CRProduct) ? 'noclosed' : '';
|
||||
if($build->execution)
|
||||
{
|
||||
$productGroups = $this->product->getProducts($build->execution);
|
||||
$productGroups = $this->product->getProducts($build->execution, $status);
|
||||
$branches = $this->loadModel('branch')->getList($build->product, $build->execution, 'all');
|
||||
}
|
||||
else
|
||||
{
|
||||
$productGroups = $this->product->getProducts($build->project);
|
||||
$productGroups = $this->product->getProducts($build->project, $status);
|
||||
$branches = $this->loadModel('branch')->getList($build->product, $build->project, 'all');
|
||||
$builds = $this->build->getBuildPairs($build->product, 'all', 'noempty,notrunk,singled,separate', $build->project, 'project', $build->builds, false);
|
||||
}
|
||||
|
||||
@@ -65,6 +65,7 @@ $lang->custom = new stdclass();
|
||||
$lang->mail = new stdclass();
|
||||
$lang->cron = new stdclass();
|
||||
$lang->dev = new stdclass();
|
||||
$lang->editor = new stdclass();
|
||||
$lang->entry = new stdclass();
|
||||
$lang->webhook = new stdclass();
|
||||
$lang->message = new stdclass();
|
||||
|
||||
@@ -90,6 +90,8 @@ $lang->viewDetails = 'View Details';
|
||||
|
||||
$lang->actions = 'Aktionen';
|
||||
$lang->restore = 'Wiederherstellen';
|
||||
$lang->confirmDraft = 'There are unsaved form of %name%. Do you want to restore them?';
|
||||
$lang->resume = 'resume';
|
||||
$lang->comment = 'Notiz';
|
||||
$lang->history = 'Historie';
|
||||
$lang->attatch = 'Anlagen';
|
||||
@@ -194,6 +196,7 @@ $lang->extension->common = 'Extension';
|
||||
$lang->company->common = 'Company';
|
||||
$lang->dept->common = 'Dept';
|
||||
$lang->upgrade->common = 'Update';
|
||||
$lang->editor->common = 'Editor';
|
||||
$lang->program->list = 'Program List';
|
||||
$lang->program->kanban = 'Program Kanban';
|
||||
$lang->design->common = 'Design';
|
||||
@@ -204,6 +207,7 @@ $lang->design->ADS = 'ADS';
|
||||
$lang->stage->common = 'Stage';
|
||||
$lang->stage->type = 'Stage Type';
|
||||
$lang->stage->list = 'Stage List';
|
||||
$lang->stage->percent = 'Workload Ratio';
|
||||
$lang->execution->list = "{$lang->executionCommon} List";
|
||||
$lang->kanban->common = 'Kanban';
|
||||
$lang->backup->common = 'Backup';
|
||||
@@ -254,17 +258,18 @@ $lang->indexPage = 'Index';
|
||||
$lang->model = 'Model';
|
||||
$lang->redev = 'Develop';
|
||||
$lang->browser = 'Browser';
|
||||
$lang->db = 'Database';
|
||||
$lang->langItem = 'Lang Item';
|
||||
$lang->api->doc = 'API Document';
|
||||
$lang->database = 'Data Dictionary';
|
||||
$lang->editor = 'Editor';
|
||||
$lang->timezone = 'Timezone';
|
||||
$lang->security = 'Security';
|
||||
$lang->calendar = 'Calendar';
|
||||
|
||||
$lang->my->work = 'Work';
|
||||
|
||||
$lang->project->list = 'Project List';
|
||||
$lang->project->kanban = 'Project Kanban';
|
||||
$lang->project->list = $lang->projectCommon . ' List';
|
||||
$lang->project->kanban = $lang->projectCommon . ' Kanban';
|
||||
|
||||
$lang->execution->executionKanban = "{$lang->execution->common} Kanban";
|
||||
$lang->execution->all = "{$lang->execution->common} List";
|
||||
@@ -272,8 +277,8 @@ $lang->execution->all = "{$lang->execution->common} List";
|
||||
$lang->doc->recent = 'Recent';
|
||||
$lang->doc->my = 'My';
|
||||
$lang->doc->favorite = 'Favorite';
|
||||
$lang->doc->product = 'Product';
|
||||
$lang->doc->project = 'Project';
|
||||
$lang->doc->product = $lang->productCommon;
|
||||
$lang->doc->project = $lang->projectCommon;
|
||||
$lang->doc->api = 'API';
|
||||
$lang->doc->execution = $lang->execution->common;
|
||||
$lang->doc->custom = 'Custom';
|
||||
|
||||
@@ -90,6 +90,8 @@ $lang->viewDetails = 'View Details';
|
||||
|
||||
$lang->actions = 'Action';
|
||||
$lang->restore = 'Reset';
|
||||
$lang->confirmDraft = 'There are unsaved form of %name%. Do you want to restore them?';
|
||||
$lang->resume = 'resume';
|
||||
$lang->comment = 'Note';
|
||||
$lang->history = 'History';
|
||||
$lang->attatch = 'Files';
|
||||
@@ -194,6 +196,7 @@ $lang->extension->common = 'Extension';
|
||||
$lang->company->common = 'Company';
|
||||
$lang->dept->common = 'Dept';
|
||||
$lang->upgrade->common = 'Update';
|
||||
$lang->editor->common = 'Editor';
|
||||
$lang->program->list = 'Program List';
|
||||
$lang->program->kanban = 'Program Kanban';
|
||||
$lang->design->common = 'Design';
|
||||
@@ -204,6 +207,7 @@ $lang->design->ADS = 'Interface Design';
|
||||
$lang->stage->common = 'Stage';
|
||||
$lang->stage->type = 'Stage Type';
|
||||
$lang->stage->list = 'Stage List';
|
||||
$lang->stage->percent = 'Workload Ratio';
|
||||
$lang->execution->list = "{$lang->executionCommon} List";
|
||||
$lang->kanban->common = 'Kanban';
|
||||
$lang->backup->common = 'Backup';
|
||||
@@ -254,17 +258,18 @@ $lang->indexPage = 'Index';
|
||||
$lang->model = 'Model';
|
||||
$lang->redev = 'Develop';
|
||||
$lang->browser = 'Browser';
|
||||
$lang->db = 'Database';
|
||||
$lang->langItem = 'Lang Item';
|
||||
$lang->api->doc = 'API Document';
|
||||
$lang->database = 'Data Dictionary';
|
||||
$lang->editor = 'Editor';
|
||||
$lang->timezone = 'Timezone';
|
||||
$lang->security = 'Security';
|
||||
$lang->calendar = 'Calendar';
|
||||
|
||||
$lang->my->work = 'Work';
|
||||
|
||||
$lang->project->list = 'Project List';
|
||||
$lang->project->kanban = 'Project Kanban';
|
||||
$lang->project->list = $lang->projectCommon . ' List';
|
||||
$lang->project->kanban = $lang->projectCommon . ' Kanban';
|
||||
|
||||
$lang->execution->executionKanban = "{$lang->execution->common} Kanban";
|
||||
$lang->execution->all = "{$lang->execution->common} List";
|
||||
@@ -272,8 +277,8 @@ $lang->execution->all = "{$lang->execution->common} List";
|
||||
$lang->doc->recent = 'Recent';
|
||||
$lang->doc->my = 'My';
|
||||
$lang->doc->favorite = 'Favorite';
|
||||
$lang->doc->product = 'Product';
|
||||
$lang->doc->project = 'Project';
|
||||
$lang->doc->product = $lang->productCommon;
|
||||
$lang->doc->project = $lang->projectCommon;
|
||||
$lang->doc->api = 'API';
|
||||
$lang->doc->execution = $lang->execution->common;
|
||||
$lang->doc->custom = 'Custom';
|
||||
|
||||
@@ -90,6 +90,8 @@ $lang->viewDetails = 'View Details';
|
||||
|
||||
$lang->actions = 'Action';
|
||||
$lang->restore = 'Réinitialiser';
|
||||
$lang->confirmDraft = 'There are unsaved form of %name%. Do you want to restore them?';
|
||||
$lang->resume = 'resume';
|
||||
$lang->comment = 'Note';
|
||||
$lang->history = 'Historique';
|
||||
$lang->attatch = 'Fichiers';
|
||||
@@ -194,6 +196,7 @@ $lang->extension->common = 'Extension';
|
||||
$lang->company->common = 'Company';
|
||||
$lang->dept->common = 'Dept';
|
||||
$lang->upgrade->common = 'Update';
|
||||
$lang->editor->common = 'Editor';
|
||||
$lang->program->list = 'Program List';
|
||||
$lang->program->kanban = 'Program Kanban';
|
||||
$lang->design->common = 'Design';
|
||||
@@ -204,6 +207,7 @@ $lang->design->ADS = 'ADS';
|
||||
$lang->stage->common = 'Stage';
|
||||
$lang->stage->type = 'Stage Type';
|
||||
$lang->stage->list = 'Stage List';
|
||||
$lang->stage->percent = 'Workload Ratio';
|
||||
$lang->execution->list = "{$lang->executionCommon} List";
|
||||
$lang->kanban->common = 'Kanban';
|
||||
$lang->backup->common = 'Backup';
|
||||
@@ -254,17 +258,18 @@ $lang->indexPage = 'Index';
|
||||
$lang->model = 'Model';
|
||||
$lang->redev = 'Develop';
|
||||
$lang->browser = 'Browser';
|
||||
$lang->db = 'Database';
|
||||
$lang->langItem = 'Lang Item';
|
||||
$lang->api->doc = 'API Document';
|
||||
$lang->database = 'Data Dictionary';
|
||||
$lang->editor = 'Editor';
|
||||
$lang->timezone = 'Timezone';
|
||||
$lang->security = 'Security';
|
||||
$lang->calendar = 'Calendar';
|
||||
|
||||
$lang->my->work = 'Work';
|
||||
|
||||
$lang->project->list = 'Project List';
|
||||
$lang->project->kanban = 'Project Kanban';
|
||||
$lang->project->list = $lang->projectCommon . ' List';
|
||||
$lang->project->kanban = $lang->projectCommon . ' Kanban';
|
||||
|
||||
$lang->execution->executionKanban = "{$lang->execution->common} Kanban";
|
||||
$lang->execution->all = "{$lang->execution->common} List";
|
||||
@@ -272,8 +277,8 @@ $lang->execution->all = "{$lang->execution->common} List";
|
||||
$lang->doc->recent = 'Recent';
|
||||
$lang->doc->my = 'My';
|
||||
$lang->doc->favorite = 'Favorite';
|
||||
$lang->doc->product = 'Product';
|
||||
$lang->doc->project = 'Project';
|
||||
$lang->doc->product = $lang->productCommon;
|
||||
$lang->doc->project = $lang->projectCommon;
|
||||
$lang->doc->api = 'API';
|
||||
$lang->doc->execution = $lang->execution->common;
|
||||
$lang->doc->custom = 'Custom';
|
||||
|
||||
@@ -35,8 +35,8 @@ if(defined('TUTORIAL'))
|
||||
$lang->mainNav = new stdclass();
|
||||
$lang->mainNav->my = "{$lang->navIcons['my']} {$lang->my->shortCommon}|my|index|";
|
||||
$lang->mainNav->program = "{$lang->navIcons['program']} {$lang->program->common}|$programModule|$programMethod|";
|
||||
$lang->mainNav->product = "{$lang->navIcons['product']} {$lang->product->common}|$productModule|$productMethod|";
|
||||
$lang->mainNav->project = "{$lang->navIcons['project']} {$lang->project->common}|$projectModule|$projectMethod|";
|
||||
$lang->mainNav->product = "{$lang->navIcons['product']} {$lang->productCommon}|$productModule|$productMethod|";
|
||||
$lang->mainNav->project = "{$lang->navIcons['project']} {$lang->projectCommon}|$projectModule|$projectMethod|";
|
||||
$lang->mainNav->execution = "{$lang->navIcons['execution']} {$lang->execution->common}|$executionModule|$executionMethod|";
|
||||
$lang->mainNav->qa = "{$lang->navIcons['qa']} {$lang->qa->common}|qa|index|";
|
||||
$lang->mainNav->devops = "{$lang->navIcons['devops']} DevOps|repo|browse|";
|
||||
@@ -137,8 +137,8 @@ $lang->program->homeMenu->browse = array('link' => "{$lang->program->list}|progr
|
||||
$lang->program->homeMenu->kanban = array('link' => "{$lang->program->kanban}|program|kanban|");
|
||||
|
||||
$lang->program->menu = new stdclass();
|
||||
$lang->program->menu->product = array('link' => "{$lang->product->common}|program|product|programID=%s", 'alias' => 'view');
|
||||
$lang->program->menu->project = array('link' => "{$lang->project->common}|program|project|programID=%s");
|
||||
$lang->program->menu->product = array('link' => "{$lang->productCommon}|program|product|programID=%s", 'alias' => 'view');
|
||||
$lang->program->menu->project = array('link' => "{$lang->projectCommon}|program|project|programID=%s");
|
||||
$lang->program->menu->personnel = array('link' => "{$lang->personnel->common}|personnel|invest|programID=%s");
|
||||
$lang->program->menu->stakeholder = array('link' => "{$lang->stakeholder->common}|program|stakeholder|programID=%s", 'alias' => 'createstakeholder');
|
||||
|
||||
@@ -163,7 +163,7 @@ $lang->product->menu = new stdclass();
|
||||
$lang->product->menu->dashboard = array('link' => "{$lang->dashboard}|product|dashboard|productID=%s");
|
||||
$lang->product->menu->story = array('link' => "$lang->SRCommon|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->product->menu->plan = array('link' => "{$lang->productplan->shortCommon}|productplan|browse|productID=%s", 'subModule' => 'productplan,bug');
|
||||
$lang->product->menu->project = array('link' => "{$lang->project->common}|product|project|status=all&productID=%s");
|
||||
$lang->product->menu->project = array('link' => "{$lang->projectCommon}|product|project|status=all&productID=%s");
|
||||
$lang->product->menu->release = array('link' => "{$lang->release->common}|release|browse|productID=%s", 'subModule' => 'release');
|
||||
$lang->product->menu->roadmap = array('link' => "{$lang->roadmap}|product|roadmap|productID=%s");
|
||||
$lang->product->menu->requirement = array('link' => "{$lang->URCommon}|product|browse|productID=%s&branch=&browseType=unclosed¶m=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
@@ -234,8 +234,8 @@ $lang->scrum->menuOrder[25] = 'devops';
|
||||
$lang->scrum->menuOrder[30] = 'doc';
|
||||
$lang->scrum->menuOrder[35] = 'build';
|
||||
$lang->scrum->menuOrder[40] = 'release';
|
||||
$lang->scrum->menuOrder[48] = 'dynamic';
|
||||
$lang->scrum->menuOrder[50] = 'settings';
|
||||
$lang->scrum->menuOrder[45] = 'dynamic';
|
||||
$lang->scrum->menuOrder[55] = 'settings';
|
||||
|
||||
$lang->scrum->menu->doc['subMenu'] = new stdclass();
|
||||
|
||||
@@ -248,7 +248,7 @@ $lang->scrum->menu->qa['subMenu']->testreport = array('link' => "{$lang->testrep
|
||||
|
||||
$lang->scrum->menu->settings['subMenu'] = new stdclass();
|
||||
$lang->scrum->menu->settings['subMenu']->view = array('link' => "$lang->overview|project|view|project=%s", 'alias' => 'edit');
|
||||
$lang->scrum->menu->settings['subMenu']->products = array('link' => "{$lang->product->common}|project|manageProducts|project=%s", 'alias' => 'manageproducts');
|
||||
$lang->scrum->menu->settings['subMenu']->products = array('link' => "{$lang->productCommon}|project|manageProducts|project=%s", 'alias' => 'manageproducts');
|
||||
$lang->scrum->menu->settings['subMenu']->members = array('link' => "{$lang->team->common}|project|team|project=%s", 'alias' => 'managemembers,team');
|
||||
$lang->scrum->menu->settings['subMenu']->whitelist = array('link' => "{$lang->whitelist}|project|whitelist|project=%s", 'subModule' => 'personnel');
|
||||
$lang->scrum->menu->settings['subMenu']->stakeholder = array('link' => "{$lang->stakeholder->common}|stakeholder|browse|project=%s", 'subModule' => 'stakeholder');
|
||||
@@ -324,7 +324,7 @@ $lang->kanbanProject->menuOrder[15] = 'settings';
|
||||
|
||||
$lang->kanbanProject->menu->settings['subMenu'] = new stdclass();
|
||||
$lang->kanbanProject->menu->settings['subMenu']->view = array('link' => "$lang->overview|project|view|project=%s", 'alias' => 'edit');
|
||||
$lang->kanbanProject->menu->settings['subMenu']->products = array('link' => "{$lang->product->common}|project|manageProducts|project=%s", 'alias' => 'manageproducts');
|
||||
$lang->kanbanProject->menu->settings['subMenu']->products = array('link' => "{$lang->productCommon}|project|manageProducts|project=%s", 'alias' => 'manageproducts');
|
||||
$lang->kanbanProject->menu->settings['subMenu']->members = array('link' => "{$lang->team->common}|project|team|project=%s", 'alias' => 'managemembers,team');
|
||||
$lang->kanbanProject->menu->settings['subMenu']->whitelist = array('link' => "{$lang->whitelist}|project|whitelist|project=%s", 'subModule' => 'personnel');
|
||||
$lang->kanbanProject->menu->settings['subMenu']->module = array('link' => "{$lang->module}|tree|browse|product=%s&view=story");
|
||||
@@ -693,6 +693,7 @@ $lang->navGroup->cron = 'admin';
|
||||
$lang->navGroup->backup = 'admin';
|
||||
$lang->navGroup->mail = 'admin';
|
||||
$lang->navGroup->dev = 'admin';
|
||||
$lang->navGroup->editor = 'admin';
|
||||
$lang->navGroup->entry = 'admin';
|
||||
$lang->navGroup->extension = 'admin';
|
||||
$lang->navGroup->action = 'admin';
|
||||
|
||||
@@ -27,6 +27,7 @@ $lang->welcome = "%s";
|
||||
$lang->logout = 'Thoát';
|
||||
$lang->login = 'Đăng nhập';
|
||||
$lang->help = 'Trợ giúp';
|
||||
$lang->langItem = 'Lang Item';
|
||||
$lang->aboutZenTao = 'Giới thiệu';
|
||||
$lang->profile = 'Hồ sơ';
|
||||
$lang->changePassword = 'Mật khẩu';
|
||||
@@ -68,6 +69,8 @@ $lang->whitelist = 'Lista bianca';
|
||||
|
||||
$lang->actions = 'Hành động';
|
||||
$lang->restore = 'Thiết lập lại';
|
||||
$lang->confirmDraft = 'There are unsaved form of %name%. Do you want to restore them?';
|
||||
$lang->resume = 'resume';
|
||||
$lang->comment = 'Ghi chú';
|
||||
$lang->history = 'Lịch sử';
|
||||
$lang->attatch = 'Files';
|
||||
|
||||
@@ -85,11 +85,13 @@ $lang->waterfallModel = '瀑布模型';
|
||||
$lang->scrumModel = '敏捷模型';
|
||||
$lang->agilePlusModel = '融合敏捷模型';
|
||||
$lang->waterfallPlusModel = '融合瀑布模型';
|
||||
$lang->all = '所有';
|
||||
$lang->all = '全部';
|
||||
$lang->viewDetails = '查看详情';
|
||||
|
||||
$lang->actions = '操作';
|
||||
$lang->restore = '恢复默认';
|
||||
$lang->confirmDraft = '有未保存的%name%表单,是否恢复?';
|
||||
$lang->resume = '恢复';
|
||||
$lang->comment = '备注';
|
||||
$lang->history = '历史记录';
|
||||
$lang->attatch = '附件';
|
||||
@@ -194,6 +196,7 @@ $lang->extension->common = '插件';
|
||||
$lang->company->common = '公司';
|
||||
$lang->dept->common = '部门';
|
||||
$lang->upgrade->common = '升级';
|
||||
$lang->editor->common = '编辑器';
|
||||
$lang->program->list = '项目集列表';
|
||||
$lang->program->kanban = '项目集看板';
|
||||
$lang->design->common = '设计';
|
||||
@@ -204,6 +207,7 @@ $lang->design->ADS = '接口设计';
|
||||
$lang->stage->common = '阶段';
|
||||
$lang->stage->type = '阶段类型';
|
||||
$lang->stage->list = '阶段列表';
|
||||
$lang->stage->percent = '工作量占比';
|
||||
$lang->execution->list = "{$lang->executionCommon}列表";
|
||||
$lang->kanban->common = '看板';
|
||||
$lang->backup->common = '备份';
|
||||
@@ -254,17 +258,18 @@ $lang->indexPage = '首页';
|
||||
$lang->model = '模型';
|
||||
$lang->redev = '二次开发';
|
||||
$lang->browser = '浏览器';
|
||||
$lang->db = '数据库';
|
||||
$lang->langItem = '语言项';
|
||||
$lang->api->doc = '接口文档';
|
||||
$lang->database = '数据字典';
|
||||
$lang->editor = '编辑器';
|
||||
$lang->timezone = '时区';
|
||||
$lang->security = '安全';
|
||||
$lang->calendar = '日程';
|
||||
|
||||
$lang->my->work = '待处理';
|
||||
|
||||
$lang->project->list = '项目列表';
|
||||
$lang->project->kanban = '项目看板';
|
||||
$lang->project->list = $lang->projectCommon . '列表';
|
||||
$lang->project->kanban = $lang->projectCommon . '看板';
|
||||
|
||||
$lang->execution->executionKanban = "{$lang->execution->common}看板";
|
||||
$lang->execution->all = "{$lang->execution->common}列表";
|
||||
@@ -272,8 +277,8 @@ $lang->execution->all = "{$lang->execution->common}列表";
|
||||
$lang->doc->recent = '最近文档';
|
||||
$lang->doc->my = '我的文档';
|
||||
$lang->doc->favorite = '我的收藏';
|
||||
$lang->doc->product = '产品库';
|
||||
$lang->doc->project = '项目库';
|
||||
$lang->doc->product = $lang->productCommon . '库';
|
||||
$lang->doc->project = $lang->projectCommon . '库';
|
||||
$lang->doc->api = '接口库';
|
||||
$lang->doc->execution = "{$lang->execution->common}库";
|
||||
$lang->doc->custom = '自定义库';
|
||||
|
||||
+72
-6
@@ -910,9 +910,13 @@ class commonModel extends model
|
||||
if($tab == 'product') $currentMethod = 'all';
|
||||
}
|
||||
|
||||
$link = helper::createLink($currentModule, $currentMethod);
|
||||
$btnTitle = isset($lang->db->custom['common']['mainNav'][$tab]) ? $lang->db->custom['common']['mainNav'][$tab] : $lang->$tab->common;
|
||||
$commonKey = $tab . 'Common';
|
||||
if(isset($lang->$commonKey)) $btnTitle = $lang->$commonKey;
|
||||
|
||||
$link = helper::createLink($currentModule, $currentMethod);
|
||||
$className = $tab == 'devops' ? 'btn num' : 'btn';
|
||||
$html = $link ? html::a($link, "$icon {$lang->$tab->common}", '', "class='$className' style='padding-top: 2px'") : "$icon {$lang->$tab->common}";
|
||||
$html = $link ? html::a($link, "$icon $btnTitle", '', "class='$className' style='padding-top: 2px'") : "$icon $btnTitle";
|
||||
|
||||
echo "<div class='btn-group header-btn'>" . $html . '</div>';
|
||||
}
|
||||
@@ -1094,8 +1098,9 @@ class commonModel extends model
|
||||
global $app, $lang, $config;
|
||||
|
||||
/* Set main menu by app tab and module. */
|
||||
self::setMainMenu();
|
||||
self::checkMenuVarsReplaced();
|
||||
static::replaceMenuLang();
|
||||
static::setMainMenu();
|
||||
static::checkMenuVarsReplaced();
|
||||
|
||||
$activeMenu = '';
|
||||
$tab = $app->tab;
|
||||
@@ -1850,7 +1855,8 @@ EOD;
|
||||
$pipelineList = $app->dbh->query("SELECT type,name,url FROM " . TABLE_PIPELINE . " WHERE `deleted` = '0' $condition order by type")->fetchAll();
|
||||
if(empty($pipelineList)) return;
|
||||
|
||||
$html = "<li class='dropdown dropdown-hover'><a href='javascript:;' data-toggle='dropdown'>{$lang->app->common}<span class='caret'></span></a>";
|
||||
$appCommon = isset($lang->db->custom['devopsMenu']['menu']['app']) ? $lang->db->custom['devopsMenu']['menu']['app'] : $lang->app->common;
|
||||
$html = "<li class='dropdown dropdown-hover'><a href='javascript:;' data-toggle='dropdown'>{$appCommon}<span class='caret'></span></a>";
|
||||
$html .= "<ul class='dropdown-menu'>";
|
||||
|
||||
foreach($pipelineList as $pipeline)
|
||||
@@ -2391,7 +2397,7 @@ EOD;
|
||||
if($this->app->getModuleName() == 'upgrade' and $this->session->upgrading) return false;
|
||||
|
||||
$statusFile = $this->app->getAppRoot() . 'www' . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'ok.txt';
|
||||
return (!is_file($statusFile) or (time() - filemtime($statusFile)) > 3600) ? $statusFile : false;
|
||||
return (!is_file($statusFile) or (time() - filemtime($statusFile)) > $this->config->safeFileTimeout) ? $statusFile : false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3527,6 +3533,66 @@ EOD;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace menu lang.
|
||||
*
|
||||
* @static
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public static function replaceMenuLang()
|
||||
{
|
||||
global $lang;
|
||||
if(empty($lang->db->custom)) return;
|
||||
foreach($lang->db->custom as $moduleName => $sectionMenus)
|
||||
{
|
||||
if(strpos($moduleName, 'Menu') === false) continue;
|
||||
|
||||
$isSecondMenu = strpos($moduleName, 'SubMenu') === false;
|
||||
$moduleName = str_replace($isSecondMenu ? 'Menu' : 'SubMenu', '', $moduleName);
|
||||
|
||||
foreach($sectionMenus as $section => $menus)
|
||||
{
|
||||
foreach($menus as $key => $value)
|
||||
{
|
||||
/* Get second menu. */
|
||||
if($isSecondMenu)
|
||||
{
|
||||
$isDropMenu = strpos($section, 'DropMenu') !== false;
|
||||
if(!$isDropMenu)
|
||||
{
|
||||
if(!isset($lang->{$moduleName}->{$section})) break;
|
||||
if(is_object($lang->{$moduleName}->{$section}) and isset($lang->{$moduleName}->{$section}->{$key})) $settingMenu = &$lang->{$moduleName}->{$section}->{$key};
|
||||
if(is_array($lang->{$moduleName}->{$section}) and isset($lang->{$moduleName}->{$section}[$key])) $settingMenu = &$lang->{$moduleName}->{$section}[$key];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Get drop menu in second menu. */
|
||||
$dropMenuKey = str_replace('DropMenu', '', $section);
|
||||
if(!isset($lang->{$moduleName}->menu->{$dropMenuKey}['dropMenu']->{$key})) break;
|
||||
$settingMenu = &$lang->{$moduleName}->menu->{$dropMenuKey}['dropMenu']->{$key};
|
||||
}
|
||||
}
|
||||
/* Get third menu. */
|
||||
elseif(isset($lang->{$moduleName}->menu->{$section}['subMenu']))
|
||||
{
|
||||
$subMenu = $lang->{$moduleName}->menu->{$section}['subMenu'];
|
||||
if(is_object($subMenu) and isset($subMenu->{$key})) $settingMenu = &$lang->{$moduleName}->menu->{$section}['subMenu']->{$key};
|
||||
if(is_array($subMenu) and isset($subMenu[$key])) $settingMenu = &$lang->{$moduleName}->menu->{$section}['subMenu'][$key];
|
||||
}
|
||||
|
||||
/* Set custom menu lang. */
|
||||
if(!empty($settingMenu))
|
||||
{
|
||||
if(is_string($settingMenu)) $settingMenu = $value . substr($settingMenu, strpos($settingMenu, '|'));
|
||||
if(is_array($settingMenu) and isset($settingMenu['link'])) $settingMenu['link'] = $value . substr($settingMenu['link'], strpos($settingMenu['link'], '|'));
|
||||
unset($settingMenu);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check valid row.
|
||||
*
|
||||
|
||||
@@ -41,3 +41,11 @@ $lang->company->guestOptions[1] = 'Erlauben';
|
||||
|
||||
$lang->company->order['date_desc'] = 'Descending';
|
||||
$lang->company->order['date_asc'] = 'Ascending';
|
||||
|
||||
$lang->company->featureBar['dynamic']['all'] = 'All';
|
||||
$lang->company->featureBar['dynamic']['today'] = 'Today';
|
||||
$lang->company->featureBar['dynamic']['yesterday'] = 'Yesterday';
|
||||
$lang->company->featureBar['dynamic']['thisWeek'] = 'This Week';
|
||||
$lang->company->featureBar['dynamic']['lastWeek'] = 'Last Week';
|
||||
$lang->company->featureBar['dynamic']['thisMonth'] = 'This Month';
|
||||
$lang->company->featureBar['dynamic']['lastMonth'] = 'Last Month';
|
||||
|
||||
@@ -41,3 +41,11 @@ $lang->company->guestOptions[1] = 'Allow';
|
||||
|
||||
$lang->company->order['date_desc'] = 'Descending';
|
||||
$lang->company->order['date_asc'] = 'Ascending';
|
||||
|
||||
$lang->company->featureBar['dynamic']['all'] = 'All';
|
||||
$lang->company->featureBar['dynamic']['today'] = 'Today';
|
||||
$lang->company->featureBar['dynamic']['yesterday'] = 'Yesterday';
|
||||
$lang->company->featureBar['dynamic']['thisWeek'] = 'This Week';
|
||||
$lang->company->featureBar['dynamic']['lastWeek'] = 'Last Week';
|
||||
$lang->company->featureBar['dynamic']['thisMonth'] = 'This Month';
|
||||
$lang->company->featureBar['dynamic']['lastMonth'] = 'Last Month';
|
||||
|
||||
@@ -41,3 +41,11 @@ $lang->company->guestOptions[1] = 'Autorisée';
|
||||
|
||||
$lang->company->order['date_desc'] = 'Descending';
|
||||
$lang->company->order['date_asc'] = 'Ascending';
|
||||
|
||||
$lang->company->featureBar['dynamic']['all'] = 'All';
|
||||
$lang->company->featureBar['dynamic']['today'] = 'Today';
|
||||
$lang->company->featureBar['dynamic']['yesterday'] = 'Yesterday';
|
||||
$lang->company->featureBar['dynamic']['thisWeek'] = 'This Week';
|
||||
$lang->company->featureBar['dynamic']['lastWeek'] = 'Last Week';
|
||||
$lang->company->featureBar['dynamic']['thisMonth'] = 'This Month';
|
||||
$lang->company->featureBar['dynamic']['lastMonth'] = 'Last Month';
|
||||
|
||||
@@ -41,3 +41,11 @@ $lang->company->guestOptions[1] = '允许';
|
||||
|
||||
$lang->company->order['date_desc'] = '倒序排列';
|
||||
$lang->company->order['date_asc'] = '正序排列';
|
||||
|
||||
$lang->company->featureBar['dynamic']['all'] = '全部';
|
||||
$lang->company->featureBar['dynamic']['today'] = '今天';
|
||||
$lang->company->featureBar['dynamic']['yesterday'] = '昨天';
|
||||
$lang->company->featureBar['dynamic']['thisWeek'] = '本周';
|
||||
$lang->company->featureBar['dynamic']['lastWeek'] = '上周';
|
||||
$lang->company->featureBar['dynamic']['thisMonth'] = '本月';
|
||||
$lang->company->featureBar['dynamic']['lastMonth'] = '上月';
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<?php js::set('browseType', $browseType);?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php foreach($lang->action->periods as $period => $label):?>
|
||||
<?php foreach($lang->company->featureBar['dynamic'] as $period => $label):?>
|
||||
<?php
|
||||
$label = "<span class='text'>$label</span>";
|
||||
$active = '';
|
||||
|
||||
@@ -14,8 +14,12 @@
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php
|
||||
echo html::a($this->createLink('job', 'browse', "repoID=$repoID"), "<span class='text'>{$lang->ci->list}</span>", '', "class='btn btn-link'");
|
||||
echo html::a($this->createLink('compile', 'browse', "repoID=$repoID&jobID=$jobID"), "<span class='text'>" . ($jobID ? $job->name : '') . " {$lang->ci->history}</span>", '', "class='btn btn-link btn-active-text'");
|
||||
$menus = customModel::getFeatureMenu('job', 'browse');
|
||||
foreach($menus as $menuItem)
|
||||
{
|
||||
$active = $menuItem->name == 'compile' ? 'btn-active-text' : '';
|
||||
echo html::a($this->createLink($menuItem->name, 'browse', "repoID=$repoID"), "<span class='text'>{$menuItem->text}</span>", '', "class='btn btn-link $active'");
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -43,8 +43,8 @@ $config->custom->fieldList['project']['create'] = 'budget,PM,desc';
|
||||
$config->custom->fieldList['project']['edit'] = 'budget,PM,desc';
|
||||
$config->custom->fieldList['product']['create'] = 'PO,QD,RD,type,desc';
|
||||
$config->custom->fieldList['product']['edit'] = 'PO,QD,RD,type,desc,status';
|
||||
$config->custom->fieldList['story']['create'] = 'module,plan,source,pri,estimate,keywords,spec';
|
||||
$config->custom->fieldList['story']['change'] = 'comment,spec';
|
||||
$config->custom->fieldList['story']['create'] = 'module,plan,source,pri,estimate,keywords,spec,verify';
|
||||
$config->custom->fieldList['story']['change'] = 'comment,spec,verify';
|
||||
$config->custom->fieldList['story']['close'] = 'comment';
|
||||
$config->custom->fieldList['story']['review'] = 'reviewedDate,comment';
|
||||
$config->custom->fieldList['productplan'] = 'begin,end,desc';
|
||||
@@ -72,3 +72,6 @@ $config->custom->fieldList['user']['create'] = 'dept,role,email,commiter
|
||||
$config->custom->fieldList['user']['edit'] = 'dept,role,email,commiter,skype,qq,mobile,phone,address,zipcode,dingding,slack,whatsapp,weixin';
|
||||
|
||||
$config->custom->notSetMethods = array('required', 'browsestoryconcept', 'product', 'role', 'execution');
|
||||
|
||||
global $lang;
|
||||
$config->custom->commonLang = array('$URCOMMON' => $lang->URCommon, '$SRCOMMON' => $lang->SRCommon, '$PRODUCTCOMMON' => $lang->productCommon, '$PROJECTCOMMON' => $lang->projectCommon, '$EXECUTIONCOMMON' => $lang->executionCommon);
|
||||
|
||||
@@ -862,6 +862,25 @@ class custom extends control
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set stage percent.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function percent()
|
||||
{
|
||||
if($_POST)
|
||||
{
|
||||
$this->loadModel('setting')->setItem('system.common.setPercent', $this->post->percent);
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'reload'));
|
||||
}
|
||||
|
||||
$this->view->title = $this->lang->stage->percent;
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set hours and weekend
|
||||
*
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
.table-form>tbody>tr>th.c-setPercent {width: 135px;}
|
||||
#readOnlyOfPercent {font-size: 13px; color: #5e626d; display: flex; width: 200%;}
|
||||
#readOnlyOfPercent i {font-size: 14px; color: #0075ff; margin-right: 3px;}
|
||||
@@ -59,6 +59,8 @@ $lang->custom->executionCommon = 'Execution';
|
||||
$lang->custom->selectDefaultProgram = 'Please select default program';
|
||||
$lang->custom->defaultProgram = 'Default program';
|
||||
$lang->custom->modeManagement = 'Mode Management';
|
||||
$lang->custom->percent = $lang->stage->percent;
|
||||
$lang->custom->setPercent = "Enable or Disable {$lang->stage->percent}";
|
||||
|
||||
$lang->custom->unitList['efficiency'] = 'Working Hours/';
|
||||
$lang->custom->unitList['manhour'] = 'Man-hour/';
|
||||
@@ -188,7 +190,7 @@ $lang->custom->notice->noClosedBlock = 'You have no blocks that are closed
|
||||
$lang->custom->notice->required = 'The selected field is required.';
|
||||
$lang->custom->notice->conceptResult = 'According to your preference, <b> %s-%s </b> is set for you. Use <b>%s</b> + <b> %s</b>。';
|
||||
$lang->custom->notice->conceptPath = 'Go to Admin -> Custom -> Concept to set it.';
|
||||
$lang->custom->notice->readOnlyOfProduct = 'If Change Forbidden, any change on stories, bugs, cases, efforts, releases and plans of the closed product is also forbidden.';
|
||||
$lang->custom->notice->readOnlyOfProduct = 'If Change Forbidden, any change on stories, bugs, cases, efforts, releases, plans and builds of the closed product is also forbidden.';
|
||||
$lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on tasks, builds, efforts and stories of the closed {$lang->executionCommon} is also forbidden.";
|
||||
$lang->custom->notice->readOnlyOfKanban = "If Change Forbidden, any change on kanban card and related operations of {$lang->custom->kanban} is also forbidden.";
|
||||
$lang->custom->notice->URSREmpty = 'Custom requirement name can not be empty!';
|
||||
@@ -199,6 +201,7 @@ $lang->custom->notice->storyReviewTip = 'After selecting by individual, pos
|
||||
$lang->custom->notice->selectAllTip = 'After selecting all people, the reviewers will be emptied and grayed out while hiding their positions and departments.';
|
||||
$lang->custom->notice->repeatKey = 'Repeat Key %s';
|
||||
$lang->custom->notice->readOnlyOfCode = 'A code is a management term that exists for secrecy or as an antonym. When code management is enabled, the code information of product, project, and execution in the system will be displayed in the creation, editing, detail, and list pages.';
|
||||
$lang->custom->notice->readOnlyOfPercent = 'The "Workload Ratio" is used to divide the workload of a project into different stages. The sum of the percentages of the same level stages cannot exceed 100%. After enabling the "Workload Ratio", users have to fill in the ratio fields when setting up the stages in the Waterfall project and Waterfall Plus project management models.';
|
||||
|
||||
$lang->custom->notice->indexPage['product'] = "ZenTao 8.2+ has Product Homepage. Do you want to go to Product Homepage?";
|
||||
$lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ has Project Homepage. Do you want to go to Project Homepage?";
|
||||
|
||||
@@ -59,6 +59,8 @@ $lang->custom->executionCommon = 'Execution';
|
||||
$lang->custom->selectDefaultProgram = 'Please select default program';
|
||||
$lang->custom->defaultProgram = 'Default program';
|
||||
$lang->custom->modeManagement = 'Mode Management';
|
||||
$lang->custom->percent = $lang->stage->percent;
|
||||
$lang->custom->setPercent = "Enable or Disable {$lang->stage->percent}";
|
||||
|
||||
$lang->custom->unitList['efficiency'] = 'Working Hours/';
|
||||
$lang->custom->unitList['manhour'] = 'Man-hour/';
|
||||
@@ -188,7 +190,7 @@ $lang->custom->notice->noClosedBlock = 'You have no blocks that are closed
|
||||
$lang->custom->notice->required = 'The selected field is required.';
|
||||
$lang->custom->notice->conceptResult = 'According to your preference, <b> %s-%s </b> is set for you. Use <b>%s</b> + <b> %s</b>.';
|
||||
$lang->custom->notice->conceptPath = 'Go to Admin -> Custom -> Concept to set it.';
|
||||
$lang->custom->notice->readOnlyOfProduct = 'If Change Forbidden, any change on stories, bugs, cases, efforts, releases and plans of the closed product is also forbidden.';
|
||||
$lang->custom->notice->readOnlyOfProduct = 'If Change Forbidden, any change on stories, bugs, cases, efforts, releases, plans and builds of the closed product is also forbidden.';
|
||||
$lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on tasks, builds, efforts and stories of the closed {$lang->executionCommon} is also forbidden.";
|
||||
$lang->custom->notice->readOnlyOfKanban = "If Change Forbidden, any change on kanban card and related operations of {$lang->custom->kanban} is also forbidden.";
|
||||
$lang->custom->notice->URSREmpty = 'Custom requirement name can not be empty!';
|
||||
@@ -199,6 +201,7 @@ $lang->custom->notice->storyReviewTip = 'After selecting by individual, pos
|
||||
$lang->custom->notice->selectAllTip = 'After selecting all people, the reviewers will be emptied and grayed out while hiding their positions and departments.';
|
||||
$lang->custom->notice->repeatKey = 'Repeat Key %s';
|
||||
$lang->custom->notice->readOnlyOfCode = 'A code is a management term that exists for secrecy or as an antonym. When code management is enabled, the code information of product, project, and execution in the system will be displayed in the creation, editing, detail, and list pages.';
|
||||
$lang->custom->notice->readOnlyOfPercent = 'The "Workload Ratio" is used to divide the workload of a project into different stages. The sum of the percentages of the same level stages cannot exceed 100%. After enabling the "Workload Ratio", users have to fill in the ratio fields when setting up the stages in the Waterfall project and Waterfall Plus project management models.';
|
||||
|
||||
$lang->custom->notice->indexPage['product'] = "ZenTao 8.2+ has Product Home. Do you want to go to Product Home?";
|
||||
$lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ has Project Home. Do you want to go to Project Home?";
|
||||
|
||||
@@ -59,6 +59,8 @@ $lang->custom->executionCommon = 'Execution';
|
||||
$lang->custom->selectDefaultProgram = 'Please select default program';
|
||||
$lang->custom->defaultProgram = 'Default program';
|
||||
$lang->custom->modeManagement = 'Mode Management';
|
||||
$lang->custom->percent = $lang->stage->percent;
|
||||
$lang->custom->setPercent = "Enable or Disable {$lang->stage->percent}";
|
||||
|
||||
$lang->custom->unitList['efficiency'] = 'Working Hours/';
|
||||
$lang->custom->unitList['manhour'] = 'Man-hour/';
|
||||
@@ -188,7 +190,7 @@ $lang->custom->notice->noClosedBlock = "Vous n'avez aucun bloc fermé déf
|
||||
$lang->custom->notice->required = 'Le champ sélectionné est obligatoire.';
|
||||
$lang->custom->notice->conceptResult = 'Selon votre préférence, <b> %s-%s </b> peut être fixé pour vous. Utilisez <b>%s</b> + <b> %s</b>。';
|
||||
$lang->custom->notice->conceptPath = 'Allez à Admin -> Custom -> Concept pour le paramétrer.';
|
||||
$lang->custom->notice->readOnlyOfProduct = 'If Change Forbidden, any change on stories, bugs, cases, efforts, releases and plans of the closed product is also forbidden.';
|
||||
$lang->custom->notice->readOnlyOfProduct = 'If Change Forbidden, any change on stories, bugs, cases, efforts, releases, plans and builds of the closed product is also forbidden.';
|
||||
$lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on tasks, builds, efforts and stories of the closed {$lang->executionCommon} is also forbidden.";
|
||||
$lang->custom->notice->readOnlyOfKanban = "If Change Forbidden, any change on kanban card and related operations of {$lang->custom->kanban} is also forbidden.";
|
||||
$lang->custom->notice->URSREmpty = 'Custom requirement name can not be empty!';
|
||||
@@ -199,6 +201,7 @@ $lang->custom->notice->storyReviewTip = 'After selecting by individual, pos
|
||||
$lang->custom->notice->selectAllTip = 'After selecting all people, the reviewers will be emptied and grayed out while hiding their positions and departments.';
|
||||
$lang->custom->notice->repeatKey = 'Repeat Key %s';
|
||||
$lang->custom->notice->readOnlyOfCode = "Le code est un terme de gestion utilisé pour la confidentialité ou comme alias. Lorsque la gestion du code est activée, le produit, le projet et l'exécution dans le système afficheront les informations de code sur les pages de création, de modification, de détails et de liste.";
|
||||
$lang->custom->notice->readOnlyOfPercent = 'The "Workload Ratio" is used to divide the workload of a project into different stages. The sum of the percentages of the same level stages cannot exceed 100%. After enabling the "Workload Ratio", users have to fill in the ratio fields when setting up the stages in the Waterfall project and Waterfall Plus project management models.';
|
||||
|
||||
$lang->custom->notice->indexPage['product'] = "ZenTao 8.2+ possède une page d'accueil. Voulez-vous consulter la page d'accueil du produit ?";
|
||||
$lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ possède une page d'accueil. Voulez-vous consulter la page d'accueil du produit ?";
|
||||
|
||||
@@ -59,6 +59,8 @@ $lang->custom->executionCommon = '执行';
|
||||
$lang->custom->selectDefaultProgram = '请选择一个默认项目集';
|
||||
$lang->custom->defaultProgram = '默认项目集';
|
||||
$lang->custom->modeManagement = '模式管理';
|
||||
$lang->custom->percent = $lang->stage->percent;
|
||||
$lang->custom->setPercent = "是否启用{$lang->stage->percent}";
|
||||
|
||||
$lang->custom->unitList['efficiency'] = '工时/';
|
||||
$lang->custom->unitList['manhour'] = '人时/';
|
||||
@@ -188,7 +190,7 @@ $lang->custom->notice->noClosedBlock = '没有永久关闭的区块';
|
||||
$lang->custom->notice->required = '页面提交时,选中的字段必填';
|
||||
$lang->custom->notice->conceptResult = '我们已经根据您的选择为您设置了<b> %s-%s </b>模式,使用<b>%s</b> + <b> %s</b>。';
|
||||
$lang->custom->notice->conceptPath = '您可以在:后台 -> 自定义 -> 流程页面修改。';
|
||||
$lang->custom->notice->readOnlyOfProduct = '禁止修改后,已关闭' . $lang->productCommon . '下的' . $lang->SRCommon . '、Bug、用例、日志、发布、计划都禁止修改。';
|
||||
$lang->custom->notice->readOnlyOfProduct = '禁止修改后,已关闭' . $lang->productCommon . '下的' . $lang->SRCommon . '、Bug、用例、日志、发布、计划、版本都禁止修改。';
|
||||
$lang->custom->notice->readOnlyOfExecution = "禁止修改后,已关闭{$lang->custom->executionCommon}下的任务、版本、日志以及关联需求都禁止修改。";
|
||||
$lang->custom->notice->readOnlyOfKanban = "禁止修改后,已关闭{$lang->custom->kanban}下的卡片以及相关设置都禁止修改。";
|
||||
$lang->custom->notice->URSREmpty = '自定义需求名称不能为空!';
|
||||
@@ -199,6 +201,7 @@ $lang->custom->notice->storyReviewTip = '按人员、职位、部门勾选
|
||||
$lang->custom->notice->selectAllTip = '勾选所有人员后,会清空并置灰评审人员,同时隐藏职位、部门。';
|
||||
$lang->custom->notice->repeatKey = '%s键重复';
|
||||
$lang->custom->notice->readOnlyOfCode = '代号是一种管理话术,主要便于保密或作为别名存在。启用代号管理后,系统中的产品、项目、执行在创建、编辑、详情、列表等页面均会展示代号信息。';
|
||||
$lang->custom->notice->readOnlyOfPercent = '工作量占比用于划分项目中存在多个阶段时的工作量的占比,同一级阶段的百分比之和最高为100%。启用工作量占比后,系统中的瀑布项目和融合瀑布项目模型中设置阶段时需要维护阶段的工作量占比。';
|
||||
|
||||
$lang->custom->notice->indexPage['product'] = "从8.2版本起增加了产品主页视图,是否默认进入产品主页?";
|
||||
$lang->custom->notice->indexPage['project'] = "从8.2版本起增加了项目主页视图,是否默认进入项目主页?";
|
||||
|
||||
+41
-9
@@ -27,7 +27,15 @@ class customModel extends model
|
||||
$stmt = $this->dbh->query($sql);
|
||||
|
||||
$allCustomLang = array();
|
||||
while($row = $stmt->fetch()) $allCustomLang[$row->id] = $row;
|
||||
while($row = $stmt->fetch())
|
||||
{
|
||||
/* Replace common lang for menu. */
|
||||
if(strpos($row->module, 'Menu') !== false or strpos($row->section, 'featureBar-') !== false or $row->section == 'mainNav' or strpos($row->section, 'moreSelects-') !== false)
|
||||
{
|
||||
$row->value = strtr($row->value, $this->config->custom->commonLang);
|
||||
}
|
||||
$allCustomLang[$row->id] = $row;
|
||||
}
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
@@ -43,8 +51,26 @@ class customModel extends model
|
||||
$processedLang = array();
|
||||
foreach($allCustomLang as $id => $customLang)
|
||||
{
|
||||
if(isset($sectionLang[$customLang->module][$customLang->section]['all']) && isset($sectionLang[$customLang->module][$customLang->section][$currentLang]) && $customLang->lang == 'all') continue;
|
||||
$processedLang[$customLang->module][$customLang->section][$customLang->key] = $customLang->value;
|
||||
if(isset($sectionLang[$customLang->module][$customLang->section]['all']) and isset($sectionLang[$customLang->module][$customLang->section][$currentLang]) and $customLang->lang == 'all') continue;
|
||||
|
||||
if(strpos($customLang->section, 'featureBar-') !== false or strpos($customLang->section, 'moreSelects-') !== false)
|
||||
{
|
||||
$sections = explode('-', $customLang->section);
|
||||
$sections = array_reverse($sections);
|
||||
if(!isset($processedLang[$customLang->module])) $processedLang[$customLang->module] = array();
|
||||
$sectionArr = array($customLang->key => $customLang->value);
|
||||
foreach($sections as $section)
|
||||
{
|
||||
$sectionKey = key($sectionArr);
|
||||
$sectionArr[$section] = $sectionArr;
|
||||
if($sectionKey != $section) unset($sectionArr[$sectionKey]);
|
||||
}
|
||||
if(!empty($sectionArr)) $processedLang[$customLang->module] = array_merge_recursive($processedLang[$customLang->module], $sectionArr);
|
||||
}
|
||||
else
|
||||
{
|
||||
$processedLang[$customLang->module][$customLang->section][$customLang->key] = $customLang->value;
|
||||
}
|
||||
}
|
||||
|
||||
return $processedLang;
|
||||
@@ -778,20 +804,26 @@ class customModel extends model
|
||||
/**
|
||||
* Edit UR and SR concept.
|
||||
*
|
||||
* @param int $key
|
||||
* @param int $key
|
||||
* @param string $lang zh-cn|zh-tw|en|fr|de
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function updateURAndSR($key = 0)
|
||||
public function updateURAndSR($key = 0, $lang = '')
|
||||
{
|
||||
$lang = $this->app->getClientLang();
|
||||
if(empty($lang)) $lang = $this->app->getClientLang();
|
||||
$data = fixer::input('post')->get();
|
||||
|
||||
if(!$data->SRName || !$data->URName) return false;
|
||||
if(empty($data->SRName) || empty($data->URName)) return false;
|
||||
|
||||
$oldValue = $this->dao->select('*')->from(TABLE_LANG)->where('`key`')->eq($key)->andWhere('section')->eq('URSRList')->andWhere('lang')->eq($lang)->andWhere('module')->eq('custom')->fetch('value');
|
||||
$oldValue = json_decode($oldValue);
|
||||
|
||||
$URSRList = new stdclass();
|
||||
$URSRList->SRName = $data->SRName;
|
||||
$URSRList->URName = $data->URName;
|
||||
$URSRList->defaultSRName = zget($oldValue, 'defaultSRName', $oldValue->SRName);
|
||||
$URSRList->defaultURName = zget($oldValue, 'defaultURName', $oldValue->URName);
|
||||
$URSRList->SRName = empty($data->SRName) ? $URSRList->defaultSRName : $data->SRName;
|
||||
$URSRList->URName = empty($data->URName) ? $URSRList->defaultURName : $data->URName;
|
||||
|
||||
$value = json_encode($URSRList);
|
||||
$this->dao->update(TABLE_LANG)->set('value')->eq($value)
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
/**
|
||||
* The percent view file of custom module of ZenTaoPMS.
|
||||
* @copyright Copyright 2009-2022 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.cnezsoft.com)
|
||||
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
* @author Shujie Tian <tianshujie@cnezsoft.com>
|
||||
* @package custom
|
||||
* @version $Id$
|
||||
* @link https://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<form class="load-indicator main-form form-ajax" method='post'>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='c-setPercent'><?php echo $lang->custom->setPercent;?></th>
|
||||
<td class='c-percent text-left'>
|
||||
<?php $checkedKey = isset($config->setPercent) ? $config->setPercent : 0;?>
|
||||
<?php foreach($lang->custom->conceptOptions->URAndSR as $key => $value):?>
|
||||
<label class="radio-inline"><input type="radio" name="percent" value="<?php echo $key?>"<?php echo $key == $checkedKey ? " checked='checked'" : ''?> id="percent<?php echo $key;?>"><?php echo $value;?></label>
|
||||
<?php endforeach;?>
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th>
|
||||
<td colspan="2" id="readOnlyOfPercent">
|
||||
<div class="inline-block"><i class="icon-exclamation-sign"></i> </div>
|
||||
<div class="inline-block"><?php echo $lang->custom->notice->readOnlyOfPercent;?></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th>
|
||||
<td class='form-actions'>
|
||||
<?php echo html::submitButton();?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
@@ -87,6 +87,7 @@ $config->dev->group['mail'] = 'admin';
|
||||
$config->dev->group['backup'] = 'admin';
|
||||
$config->dev->group['cron'] = 'admin';
|
||||
$config->dev->group['dev'] = 'admin';
|
||||
$config->dev->group['editor'] = 'admin';
|
||||
$config->dev->group['custom'] = 'admin';
|
||||
$config->dev->group['score'] = 'admin';
|
||||
$config->dev->group['config'] = 'admin';
|
||||
@@ -240,3 +241,57 @@ $config->dev->postParams['testcase']['create']['steps'] = 'string';
|
||||
$config->dev->postParams['testcase']['create']['expect'] = 'string';
|
||||
$config->dev->postParams['testcase']['create']['mailto'] = 'string';
|
||||
$config->dev->postParams['testcase']['create']['keywords'] = 'string';
|
||||
|
||||
$config->dev->navTypes = array('second', 'third', 'tag');
|
||||
|
||||
$config->disableFeature = array();
|
||||
if(!helper::hasFeature('waterfall')) $config->disableFeature = array('design', 'stage', 'programplan', 'weekly', 'researchplan', 'researchreport', 'gapanalysis');
|
||||
|
||||
$config->dev->projectMenus = array('project', 'scrum', 'waterfall', 'kanbanProject');
|
||||
$config->dev->hideMainMenu = array('admin', 'kanban');
|
||||
if($config->vision == 'lite')
|
||||
{
|
||||
$config->dev->projectMenus = array('project', 'kanbanProject');
|
||||
$config->dev->hideMainMenu = array('execution', 'kanban', 'admin');
|
||||
}
|
||||
|
||||
$config->dev->linkMethods['my']['my-calendar'] = array('my', 'todo');
|
||||
|
||||
$config->dev->skipMenus['first'] = array('project', 'product');
|
||||
$config->dev->skipMenus['second'] = array('menu_storyGroup', 'menu_story', 'menu_other', 'menu_more');
|
||||
$config->dev->skipMenus['third'] = array('bysearch');
|
||||
if($config->vision == 'lite')
|
||||
{
|
||||
$config->dev->skipMenus['first'][] = 'execution';
|
||||
$config->dev->skipMenus['second'] = array('menu_other', 'menu_more');
|
||||
}
|
||||
|
||||
$config->dev->skipMenus['scrum'] = array();
|
||||
if(!helper::hasFeature('scrum_issue') and !helper::hasFeature('agileplus_issue')) $config->dev->skipMenus['scrum']['issue'] = 'otherDropMenu_issue';
|
||||
if(!helper::hasFeature('scrum_risk') and !helper::hasFeature('agileplus_risk')) $config->dev->skipMenus['scrum']['risk'] = 'otherDropMenu_risk';
|
||||
if(!helper::hasFeature('scrum_meeting') and !helper::hasFeature('agileplus_meeting')) $config->dev->skipMenus['scrum']['meeting'] = 'otherDropMenu_meeting';
|
||||
if(!helper::hasFeature('scrum_measrecord') and !helper::hasFeature('agileplus_measrecord')) $config->dev->skipMenus['scrum']['measrecord'] = 'otherDropMenu_report';
|
||||
|
||||
$config->dev->skipMenus['waterfall'] = array();
|
||||
if(!helper::hasFeature('waterfall_track') and !helper::hasFeature('waterfallplus_track')) $config->dev->skipMenus['waterfall']['track'] = 'menu_track';
|
||||
if(!helper::hasFeature('waterfall_researchplan') and !helper::hasFeature('waterfallplus_researchplan')) $config->dev->skipMenus['waterfall']['researchplan'] = 'otherDropMenu_research';
|
||||
if(!helper::hasFeature('waterfall_issue') and !helper::hasFeature('waterfallplus_issue')) $config->dev->skipMenus['waterfall']['issue'] = 'otherDropMenu_issue';
|
||||
if(!helper::hasFeature('waterfall_risk') and !helper::hasFeature('waterfallplus_risk')) $config->dev->skipMenus['waterfall']['risk'] = 'otherDropMenu_risk';
|
||||
if(!helper::hasFeature('waterfall_opportunity') and !helper::hasFeature('waterfallplus_opportunity')) $config->dev->skipMenus['waterfall']['opportunity'] = 'otherDropMenu_opportunity';
|
||||
if(!helper::hasFeature('waterfall_process') and !helper::hasFeature('waterfallplus_process')) $config->dev->skipMenus['waterfall']['process'] = 'otherDropMenu_pssp';
|
||||
if(!helper::hasFeature('waterfall_measrecord') and !helper::hasFeature('waterfallplus_measrecord')) $config->dev->skipMenus['waterfall']['measrecord'] = 'otherDropMenu_report';
|
||||
if(!helper::hasFeature('waterfall_auditplan') and !helper::hasFeature('waterfallplus_auditplan')) $config->dev->skipMenus['waterfall']['auditplan'] = 'otherDropMenu_auditplan';
|
||||
if(!helper::hasFeature('waterfall_meeting') and !helper::hasFeature('waterfallplus_meeting')) $config->dev->skipMenus['waterfall']['meeting'] = 'otherDropMenu_meeting';
|
||||
if(!helper::hasFeature('waterfall_gapanalysis') and !helper::hasFeature('waterfallplus_gapanalysis')) $config->dev->skipMenus['waterfall']['gapanalysis'] = 'otherDropMenu_gapanalysis';
|
||||
|
||||
$config->dev->skipMenus['execution'] = array();
|
||||
if(!helper::hasFeature('issue')) $config->dev->skipMenus['execution']['issue'] = 'otherDropMenu_issue';
|
||||
if(!helper::hasFeature('risk')) $config->dev->skipMenus['execution']['risk'] = 'otherDropMenu_risk';
|
||||
if(!helper::hasFeature('opportunity')) $config->dev->skipMenus['execution']['opportunity'] = 'otherDropMenu_opportunity';
|
||||
if(!helper::hasFeature('process')) $config->dev->skipMenus['execution']['process'] = 'otherDropMenu_pssp';
|
||||
if(!helper::hasFeature('auditplan')) $config->dev->skipMenus['execution']['auditplan'] = 'otherDropMenu_auditplan';
|
||||
if(!helper::hasFeature('meeting')) $config->dev->skipMenus['execution']['meeting'] = 'otherDropMenu_meeting';
|
||||
|
||||
$config->dev->liteTagMethod['my-contribute'] = 'contribute_task';
|
||||
|
||||
$config->dev->onlyMainMenu = array('kanban');
|
||||
|
||||
@@ -81,4 +81,128 @@ class dev extends control
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom menu lang item.
|
||||
*
|
||||
* @param string $type common|first|second|third|tag
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @param string $language zh_cn|en|fr|de|zh_tw
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function langItem($type = 'common', $module = '', $method = '', $language = '')
|
||||
{
|
||||
$clientLang = $this->app->getClientLang();
|
||||
if(empty($language)) $language = $clientLang;
|
||||
$language = str_replace('_', '-', $language);
|
||||
|
||||
if($type == 'second' and empty($module)) $module = 'my';
|
||||
$moduleName = $module;
|
||||
if($type == 'common' or $type == 'first') $moduleName = 'common';
|
||||
if($type == 'second') $moduleName = $module . 'Menu';
|
||||
|
||||
if($type == 'third')
|
||||
{
|
||||
if($this->config->vision == 'lite')
|
||||
{
|
||||
$module = $module == '' ? 'kanbanProject' : $module;
|
||||
$method = $method == '' ? 'settings' : $method;
|
||||
}
|
||||
elseif(empty($method))
|
||||
{
|
||||
$module = 'my';
|
||||
$method = 'work';
|
||||
}
|
||||
$moduleName = $module . 'SubMenu';
|
||||
}
|
||||
|
||||
if($type == 'tag')
|
||||
{
|
||||
if(empty($module)) $module = 'my';
|
||||
if(empty($method)) $method = 'todo';
|
||||
|
||||
$moduleName = $module;
|
||||
}
|
||||
|
||||
if($this->server->request_method == 'POST')
|
||||
{
|
||||
$this->dev->saveCustomedLang($type, $moduleName, $method, $language);
|
||||
return $this->send(array('result' => 'success', 'locate' => 'top', 'message' => $this->lang->saveSuccess));
|
||||
}
|
||||
|
||||
if($clientLang != $language)
|
||||
{
|
||||
$currentCommonLang = $this->config->custom->commonLang;
|
||||
|
||||
$commonLang = $this->dev->getOriginalLang('common', '', '', $language);
|
||||
$commonLang = array_merge($commonLang, $this->dev->getCustomedLang('common', '', '', $language));
|
||||
foreach($commonLang as $commonKey => $langValue)
|
||||
{
|
||||
$upperKey = '$' . strtoupper($commonKey);
|
||||
if(isset($this->config->custom->commonLang[$upperKey])) $this->config->custom->commonLang[$upperKey] = $langValue;
|
||||
}
|
||||
|
||||
$this->view->currentLangs = $this->dev->getOriginalLang($type, $module, $method, $clientLang);
|
||||
$this->view->currentCommonLang = $currentCommonLang;
|
||||
}
|
||||
|
||||
$this->view->title = $this->lang->langItem;
|
||||
$this->view->type = $type;
|
||||
$this->view->originalLangs = $this->dev->getOriginalLang($type, $module, $method, $language);
|
||||
$this->view->customedLangs = $this->dev->getCustomedLang($type, $module, $method, $language);
|
||||
$this->view->menuTree = $this->dev->getMenuTree($type, $module, $method);
|
||||
$this->view->moduleName = $moduleName;
|
||||
$this->view->module = $module;
|
||||
$this->view->method = $method;
|
||||
$this->view->language = str_replace('-', '_', $language);
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset customed menu lang.
|
||||
*
|
||||
* @param string $type common|first|second|third|tag
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @param string $language zh_cn|en|fr|de|zh_tw
|
||||
* @param string $confirm no|yes
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function resetLang($type = 'common', $module = '', $method = '', $language = 'zh_cn', $confirm = 'no')
|
||||
{
|
||||
if($confirm == 'no') return print(js::confirm($this->lang->dev->confirmRestore, inlink('resetLang', "type={$type}&module={$module}&method={$method}&language={$language}&confirm=yes")));
|
||||
|
||||
$language = str_replace('_', '-', $language);
|
||||
$section = '';
|
||||
if($type == 'common') $section = '§ion=';
|
||||
if($type == 'first') $section = '§ion=mainNav';
|
||||
if($type == 'tag')
|
||||
{
|
||||
if($this->config->vision == 'lite' and isset($this->config->dev->liteTagMethod["$module-$method"])) $method = $this->config->dev->liteTagMethod["$module-$method"];
|
||||
$section = str_replace('_', '-', "§ion=featureBar-{$method}");
|
||||
$this->dao->delete()->from(TABLE_LANG)->where('lang')->eq($language)->andWhere('module')->eq($module)->andWhere('section')->like("moreSelects-$method%")->andWhere('vision')->eq($this->config->vision)->exec();
|
||||
}
|
||||
|
||||
$key = '';
|
||||
if($type == 'common') $key = '&key=projectCommon,productCommon,executionCommon';
|
||||
|
||||
$this->loadModel('custom')->deleteItems("lang={$language}&module={$module}&vision={$this->config->vision}{$section}{$key}");
|
||||
if($this->config->vision == 'rnd' and $type == 'common' and $this->config->custom->URSR)
|
||||
{
|
||||
$oldValue = $this->dao->select('*')->from(TABLE_LANG)->where('`key`')->eq($this->config->custom->URSR)->andWhere('section')->eq('URSRList')->andWhere('lang')->eq($language)->andWhere('module')->eq('custom')->fetch('value');
|
||||
if($oldValue)
|
||||
{
|
||||
$oldValue = json_decode($oldValue);
|
||||
$_POST = array();
|
||||
$_POST['SRName'] = zget($oldValue, 'defaultSRName', $oldValue->SRName);
|
||||
$_POST['URName'] = zget($oldValue, 'defaultURName', $oldValue->URName);
|
||||
$this->custom->updateURAndSR($this->config->custom->URSR, $language);
|
||||
}
|
||||
}
|
||||
|
||||
return print(js::reload('parent.parent'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
.flex {display: flex;}
|
||||
.flex-1 {flex: 1;}
|
||||
.align-center {align-items: center;}
|
||||
.justify-center {justify-content: center;}
|
||||
.reset-btn {margin-left: 20px;}
|
||||
.title {font-size: 13px; color: #313C52; font-weight: 700; height: 40px; padding-left: 40px;}
|
||||
.h-full {height: 100%;}
|
||||
.flex-center {display: flex; justify-content: center; align-items: center;}
|
||||
|
||||
/* menu-tree */
|
||||
.menu-tree {flex: 0 0 200px; background: #fff; padding: 10px 10px; overflow: hidden;}
|
||||
.menu-tree > .tree {padding-top: 20px;}
|
||||
.tree ul {margin-bottom: 0;}
|
||||
#menuTree > li.has-list > ul > li {padding-left: 10px;}
|
||||
#menuTree > li.has-list > ul > li.has-list {padding-left: 15px;}
|
||||
|
||||
/* main-box */
|
||||
.flex.main-box {gap: 15px;}
|
||||
|
||||
/* title-content */
|
||||
.title-content {gap: 20px;}
|
||||
.title-content > .title {margin-left: 44px; width: 160px;}
|
||||
.title-content > .title.title-input {padding-left: unset; text-align: center; width: 220px;}
|
||||
|
||||
/* form-content */
|
||||
.form-item-content {padding-left: 44px;}
|
||||
.form-item-content > .form-item {gap: 64px; height: 56px; align-items: center; position: relative; width: 500px;}
|
||||
.form-item-content > .form-item.w-expand {width: 700px;}
|
||||
.form-item-content > .form-item > .label {flex: 0 0 160px; padding-left: 40px; background: #F8F8F8; display: flex; align-items: center; color: currentColor;}
|
||||
.form-item-content > .form-item > .input-group {margin-left: 20px; width:200px; height:32px;}
|
||||
.form-item-content > .form-item > .input-group > .input-group-addon {flex: 1 1 30%; border-left: 1px solid #dcdcdc;}
|
||||
.form-item-content > .form-item > .input-control > input {margin-left: 40px;}
|
||||
.form-item-content > .form-item.active .icon {display: unset;}
|
||||
.form-item-content > .form-item .icon {display: none; position: absolute; left: -50px; top: 2px; font-size: 25px;}
|
||||
.form-item-content.hover-color-primary > .form-item.active > .label {color: blue;}
|
||||
.form-item-content.hover-color-primary > .form-item.active .form-control {border-color: blue;}
|
||||
.form-item-content.border-color-primary > .form-item .form-control {border: 1px solid blue;}
|
||||
|
||||
#menuTree > li > a, #menuTree > li > ul > li > a {white-space: nowrap; text-overflow: clip; overflow: hidden;}
|
||||
|
||||
/* bottom-btn */
|
||||
.bottom-btn {display: flex; align-items: center; background: #fff; padding-left: 150px; padding-bottom: 20px;}
|
||||
@@ -0,0 +1,152 @@
|
||||
$(function()
|
||||
{
|
||||
/**
|
||||
* Add class active while click item in form.
|
||||
*
|
||||
* @param string $id
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function addActive(id)
|
||||
{
|
||||
$('[data-id=' + id + ']').addClass('active');
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove class active while blur or click item in form.
|
||||
*
|
||||
* @param string $id
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function removeActive(id)
|
||||
{
|
||||
$('[data-id=' + id + ']').removeClass('active');
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle function click in label.
|
||||
*
|
||||
* @param string $id
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function handleClickItem(clickId)
|
||||
{
|
||||
var clearId = $('.form-item.active').attr('data-id');
|
||||
if(clearId !== clickId)
|
||||
{
|
||||
if(clearId) removeActive(clearId);
|
||||
if(clickId) addActive(clickId);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle function input on search comp and update menu tree.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function handleInputSearch()
|
||||
{
|
||||
$('.menu-tree .search-input').on('input', function()
|
||||
{
|
||||
var val = $(this).val();
|
||||
if (!val)
|
||||
{
|
||||
var updateData = menuTree;
|
||||
}
|
||||
else
|
||||
{
|
||||
var updateData = [];
|
||||
for (var i = 0; i < menuTree.length; i++)
|
||||
{
|
||||
var item = {};
|
||||
$.extend(true, item, menuTree[i]);
|
||||
item.children = filterChildren(item, val);
|
||||
if ((item.children && item.children.length) || item.title.indexOf(val) != -1 || (item.key && item.key.indexOf(val) != -1))
|
||||
{
|
||||
updateData.push(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
$('#menuTree').data('zui.tree').reload(updateData);
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle function filter in array children in every item in menu tree.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function filterChildren(item, val)
|
||||
{
|
||||
var children = null;
|
||||
if (item && item.children && item.children.length)
|
||||
{
|
||||
children = [];
|
||||
for (var i = 0; i < item.children.length; i++)
|
||||
{
|
||||
item.children[i].children = filterChildren(item.children[i], val);
|
||||
if (item.children[i].title.indexOf(val) != -1 || (item.children[i].key && item.children[i].key.indexOf(val) != -1) || item.children[i].children)
|
||||
{
|
||||
children.push(item.children[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return children && children.length ? children : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Init menu tree by zui.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function initMenu()
|
||||
{
|
||||
if (navTypes.indexOf(type) != -1)
|
||||
{
|
||||
$('#menuTree').tree(
|
||||
{
|
||||
data: menuTree,
|
||||
initialState: 'active',
|
||||
itemCreator: function($li, item)
|
||||
{
|
||||
$li.append('<a data-module="' + item.module + '" data-method="' + item.method + '" data-has-children="' + (item.children ? !!item.children.length : false) + '" href=# title="' + item.title + '">' + item.title + '</a>');
|
||||
if (item.active) $li.addClass('active open in');
|
||||
}
|
||||
});
|
||||
}
|
||||
$('#menuTree').on('click', 'a', function(e)
|
||||
{
|
||||
var target = $(e.target);
|
||||
if (target.attr('data-has-children') === 'true') return;
|
||||
self.location.href = createLink('dev', 'langItem', 'type=' + type + '&module=' + target.attr('data-module') + '&method=' + target.attr('data-method') + '&language=' + language);
|
||||
})
|
||||
}
|
||||
|
||||
$(".form-item-content").on("click", '.form-item', function(e)
|
||||
{
|
||||
handleClickItem($(this).data('id'));
|
||||
});
|
||||
|
||||
$('.form-item-content > .form-item > .input-group').on('click', function()
|
||||
{
|
||||
handleClickItem($(this).data('id'));
|
||||
});
|
||||
|
||||
$(".form-item-content").on('mouseover', '.form-item', function(e)
|
||||
{
|
||||
$(this).addClass('hover');
|
||||
}).on('mouseout', '.form-item', function()
|
||||
{
|
||||
$(this).removeClass('hover');
|
||||
})
|
||||
|
||||
initMenu();
|
||||
handleInputSearch();
|
||||
|
||||
$('li.has-list > ul').addClass("menu-active-primary menu-hover-primary");
|
||||
})
|
||||
+42
-18
@@ -1,23 +1,34 @@
|
||||
<?php
|
||||
$lang->dev->common = 'Entwicklung';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = 'Datenbank';
|
||||
$lang->dev->editor = 'Bearbeiter';
|
||||
$lang->dev->translate = 'Translate';
|
||||
$lang->dev->dbList = 'Datenbank';
|
||||
$lang->dev->moduleList = 'Module';
|
||||
$lang->dev->params = 'Parameter';
|
||||
$lang->dev->type = 'Typ';
|
||||
$lang->dev->desc = 'Beschreibung';
|
||||
$lang->dev->noParams = 'Keine Parameter';
|
||||
$lang->dev->post = 'POST Parameter';
|
||||
$lang->dev->common = 'Entwicklung';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = 'Datenbank';
|
||||
$lang->dev->editor = 'Bearbeiter';
|
||||
$lang->dev->translate = 'Translate';
|
||||
$lang->dev->dbList = 'Datenbank';
|
||||
$lang->dev->moduleList = 'Module';
|
||||
$lang->dev->params = 'Parameter';
|
||||
$lang->dev->type = 'Typ';
|
||||
$lang->dev->desc = 'Beschreibung';
|
||||
$lang->dev->noParams = 'Keine Parameter';
|
||||
$lang->dev->post = 'POST Parameter';
|
||||
$lang->dev->modifyValue = 'modifyValue';
|
||||
$lang->dev->defaultValue = 'defaultValue';
|
||||
|
||||
$lang->dev->paramRange = 'Parameter Range: %s';
|
||||
$lang->dev->paramDate = 'Date format: YY-mm-dd, e.g 2019-01-01';
|
||||
$lang->dev->paramColor = 'Color format: #RGB, e.g. #3da7f5';
|
||||
$lang->dev->paramMailto = "User account. Separate accounts by ','.";
|
||||
$lang->dev->noteEditor = "The editor is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of the <a href='https://www.zentao.net/extension-viewExt-150.html' target='_blank'>editor</a>.";
|
||||
$lang->dev->noteTranslate = "The translation is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of <a href='https://www.zentao.net/extension-viewExt-151.html' target='_blank'>translation</a>.";
|
||||
$lang->dev->paramRange = 'Parameter Range: %s';
|
||||
$lang->dev->paramDate = 'Date format: YY-mm-dd, e.g 2019-01-01';
|
||||
$lang->dev->paramColor = 'Color format: #RGB, e.g. #3da7f5';
|
||||
$lang->dev->paramMailto = "User account. Separate accounts by ','.";
|
||||
$lang->dev->noteEditor = "The editor is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of the <a href='https://www.zentao.net/extension-viewExt-150.html' target='_blank'>editor</a>.";
|
||||
$lang->dev->noteTranslate = "The translation is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of <a href='https://www.zentao.net/extension-viewExt-151.html' target='_blank'>translation</a>.";
|
||||
$lang->dev->confirmRestore = 'Do you want to reset?';
|
||||
|
||||
$lang->dev->language = 'Language: %s';
|
||||
$lang->dev->default = 'Default';
|
||||
$lang->dev->currentLang = 'Current Language';
|
||||
$lang->dev->change = 'Change';
|
||||
$lang->dev->UR = 'Epic';
|
||||
$lang->dev->SR = 'Story';
|
||||
$lang->dev->branch = 'Branch';
|
||||
|
||||
$lang->dev->fields = array();
|
||||
$lang->dev->fields['id'] = 'ID';
|
||||
@@ -79,6 +90,7 @@ $lang->dev->tableList['backup'] = 'Backup';
|
||||
$lang->dev->tableList['common'] = 'Common';
|
||||
$lang->dev->tableList['convert'] = 'Konvertieren';
|
||||
$lang->dev->tableList['dev'] = 'Entwickeln';
|
||||
$lang->dev->tableList['editor'] = 'Editor';
|
||||
$lang->dev->tableList['git'] = 'GIT';
|
||||
$lang->dev->tableList['index'] = 'Home';
|
||||
$lang->dev->tableList['install'] = 'Installation';
|
||||
@@ -177,3 +189,15 @@ if($config->systemMode != 'ALM') unset($lang->dev->groupList['program']);
|
||||
$lang->dev->endGroupList['admin'] = 'Admin';
|
||||
$lang->dev->endGroupList['system'] = 'System';
|
||||
$lang->dev->endGroupList['other'] = 'Andere';
|
||||
|
||||
$lang->dev->featureBar['langItem']['common'] = 'Common';
|
||||
$lang->dev->featureBar['langItem']['first'] = 'First Menu';
|
||||
$lang->dev->featureBar['langItem']['second'] = 'Second Menu';
|
||||
$lang->dev->featureBar['langItem']['third'] = 'Third Menu';
|
||||
$lang->dev->featureBar['langItem']['tag'] = 'Search Tag';
|
||||
|
||||
$lang->dev->projectMenu['project'] = "{$lang->projectCommon} Common";
|
||||
$lang->dev->projectMenu['scrum'] = "Scrum / Scrum + {$lang->projectCommon}";
|
||||
$lang->dev->projectMenu['waterfall'] = "Waterfall / Waterfall + {$lang->projectCommon}";
|
||||
$lang->dev->projectMenu['kanbanProject'] = "Kanban {$lang->projectCommon}";
|
||||
if($config->vision == 'lite') $lang->dev->projectMenu['kanbanProject'] = $lang->projectCommon;
|
||||
|
||||
+42
-18
@@ -1,23 +1,34 @@
|
||||
<?php
|
||||
$lang->dev->common = 'Develop';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = 'Database';
|
||||
$lang->dev->editor = 'Editor';
|
||||
$lang->dev->translate = 'Translate';
|
||||
$lang->dev->dbList = 'Database';
|
||||
$lang->dev->moduleList = 'Modules';
|
||||
$lang->dev->params = 'Parameters';
|
||||
$lang->dev->type = 'Type';
|
||||
$lang->dev->desc = 'Description';
|
||||
$lang->dev->noParams = 'No Parameters';
|
||||
$lang->dev->post = 'POST Parameter';
|
||||
$lang->dev->common = 'Develop';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = 'Database';
|
||||
$lang->dev->editor = 'Editor';
|
||||
$lang->dev->translate = 'Translate';
|
||||
$lang->dev->dbList = 'Database';
|
||||
$lang->dev->moduleList = 'Modules';
|
||||
$lang->dev->params = 'Parameters';
|
||||
$lang->dev->type = 'Type';
|
||||
$lang->dev->desc = 'Description';
|
||||
$lang->dev->noParams = 'No Parameters';
|
||||
$lang->dev->post = 'POST Parameter';
|
||||
$lang->dev->modifyValue = 'modifyValue';
|
||||
$lang->dev->defaultValue = 'defaultValue';
|
||||
|
||||
$lang->dev->paramRange = 'Parameter Range: %s';
|
||||
$lang->dev->paramDate = 'Date format: YY-mm-dd, e.g 2019-01-01';
|
||||
$lang->dev->paramColor = 'Color format: #RGB, e.g. #3da7f5';
|
||||
$lang->dev->paramMailto = "User account. Separate accounts by ','.";
|
||||
$lang->dev->noteEditor = "The editor is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of the <a href='https://www.zentao.net/extension-viewExt-150.html' target='_blank'>editor</a>.";
|
||||
$lang->dev->noteTranslate = "The translation is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of <a href='https://www.zentao.net/extension-viewExt-151.html' target='_blank'>translation</a>.";
|
||||
$lang->dev->paramRange = 'Parameter Range: %s';
|
||||
$lang->dev->paramDate = 'Date format: YY-mm-dd, e.g 2019-01-01';
|
||||
$lang->dev->paramColor = 'Color format: #RGB, e.g. #3da7f5';
|
||||
$lang->dev->paramMailto = "User account. Separate accounts by ','.";
|
||||
$lang->dev->noteEditor = "The editor is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of the <a href='https://www.zentao.net/extension-viewExt-150.html' target='_blank'>editor</a>.";
|
||||
$lang->dev->noteTranslate = "The translation is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of <a href='https://www.zentao.net/extension-viewExt-151.html' target='_blank'>translation</a>.";
|
||||
$lang->dev->confirmRestore = 'Do you want to reset?';
|
||||
|
||||
$lang->dev->language = 'Language: %s';
|
||||
$lang->dev->default = 'Default';
|
||||
$lang->dev->currentLang = 'Current Language';
|
||||
$lang->dev->change = 'Change';
|
||||
$lang->dev->UR = 'Epic';
|
||||
$lang->dev->SR = 'Story';
|
||||
$lang->dev->branch = 'Branch';
|
||||
|
||||
$lang->dev->fields = array();
|
||||
$lang->dev->fields['id'] = 'ID';
|
||||
@@ -79,6 +90,7 @@ $lang->dev->tableList['backup'] = 'Backup';
|
||||
$lang->dev->tableList['common'] = 'Common';
|
||||
$lang->dev->tableList['convert'] = 'Convert';
|
||||
$lang->dev->tableList['dev'] = 'Develop';
|
||||
$lang->dev->tableList['editor'] = 'Editor';
|
||||
$lang->dev->tableList['git'] = 'GIT';
|
||||
$lang->dev->tableList['index'] = 'Home';
|
||||
$lang->dev->tableList['install'] = 'Install';
|
||||
@@ -177,3 +189,15 @@ if($config->systemMode != 'ALM') unset($lang->dev->groupList['program']);
|
||||
$lang->dev->endGroupList['admin'] = 'Admin';
|
||||
$lang->dev->endGroupList['system'] = 'System';
|
||||
$lang->dev->endGroupList['other'] = 'Others';
|
||||
|
||||
$lang->dev->featureBar['langItem']['common'] = 'Common';
|
||||
$lang->dev->featureBar['langItem']['first'] = 'First Menu';
|
||||
$lang->dev->featureBar['langItem']['second'] = 'Second Menu';
|
||||
$lang->dev->featureBar['langItem']['third'] = 'Third Menu';
|
||||
$lang->dev->featureBar['langItem']['tag'] = 'Search Tag';
|
||||
|
||||
$lang->dev->projectMenu['project'] = "{$lang->projectCommon} Common";
|
||||
$lang->dev->projectMenu['scrum'] = "Scrum / Scrum + {$lang->projectCommon}";
|
||||
$lang->dev->projectMenu['waterfall'] = "Waterfall / Waterfall + {$lang->projectCommon}";
|
||||
$lang->dev->projectMenu['kanbanProject'] = "Kanban {$lang->projectCommon}";
|
||||
if($config->vision == 'lite') $lang->dev->projectMenu['kanbanProject'] = $lang->projectCommon;
|
||||
|
||||
+42
-18
@@ -1,23 +1,34 @@
|
||||
<?php
|
||||
$lang->dev->common = 'Develop';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = 'Database';
|
||||
$lang->dev->editor = 'Editor';
|
||||
$lang->dev->translate = 'Translate';
|
||||
$lang->dev->dbList = 'Database';
|
||||
$lang->dev->moduleList = 'Modules';
|
||||
$lang->dev->params = 'Parameters';
|
||||
$lang->dev->type = 'Type';
|
||||
$lang->dev->desc = 'Description';
|
||||
$lang->dev->noParams = 'No Parameters';
|
||||
$lang->dev->post = 'POST Parameter';
|
||||
$lang->dev->common = 'Develop';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = 'Database';
|
||||
$lang->dev->editor = 'Editor';
|
||||
$lang->dev->translate = 'Translate';
|
||||
$lang->dev->dbList = 'Database';
|
||||
$lang->dev->moduleList = 'Modules';
|
||||
$lang->dev->params = 'Parameters';
|
||||
$lang->dev->type = 'Type';
|
||||
$lang->dev->desc = 'Description';
|
||||
$lang->dev->noParams = 'No Parameters';
|
||||
$lang->dev->post = 'POST Parameter';
|
||||
$lang->dev->modifyValue = 'modifyValue';
|
||||
$lang->dev->defaultValue = 'defaultValue';
|
||||
|
||||
$lang->dev->paramRange = 'Parameter Range: %s';
|
||||
$lang->dev->paramDate = 'Date format: YY-mm-dd, e.g 2019-01-01';
|
||||
$lang->dev->paramColor = 'Color format: #RGB, e.g. #3da7f5';
|
||||
$lang->dev->paramMailto = "User account. Separate accounts by ','.";
|
||||
$lang->dev->noteEditor = "The editor is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of the <a href='https://www.zentao.net/extension-viewExt-150.html' target='_blank'>editor</a>.";
|
||||
$lang->dev->noteTranslate = "The translation is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of <a href='https://www.zentao.net/extension-viewExt-151.html' target='_blank'>translation</a>.";
|
||||
$lang->dev->paramRange = 'Parameter Range: %s';
|
||||
$lang->dev->paramDate = 'Date format: YY-mm-dd, e.g 2019-01-01';
|
||||
$lang->dev->paramColor = 'Color format: #RGB, e.g. #3da7f5';
|
||||
$lang->dev->paramMailto = "User account. Separate accounts by ','.";
|
||||
$lang->dev->noteEditor = "The editor is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of the <a href='https://www.zentao.net/extension-viewExt-150.html' target='_blank'>editor</a>.";
|
||||
$lang->dev->noteTranslate = "The translation is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of <a href='https://www.zentao.net/extension-viewExt-151.html' target='_blank'>translation</a>.";
|
||||
$lang->dev->confirmRestore = 'Do you want to reset?';
|
||||
|
||||
$lang->dev->language = 'Language: %s';
|
||||
$lang->dev->default = 'Default';
|
||||
$lang->dev->currentLang = 'Current Language';
|
||||
$lang->dev->change = 'Change';
|
||||
$lang->dev->UR = 'Epic';
|
||||
$lang->dev->SR = 'Story';
|
||||
$lang->dev->branch = 'Branch';
|
||||
|
||||
$lang->dev->fields = array();
|
||||
$lang->dev->fields['id'] = 'ID';
|
||||
@@ -79,6 +90,7 @@ $lang->dev->tableList['backup'] = 'Backup';
|
||||
$lang->dev->tableList['common'] = 'Common';
|
||||
$lang->dev->tableList['convert'] = 'Convert';
|
||||
$lang->dev->tableList['dev'] = 'Develop';
|
||||
$lang->dev->tableList['editor'] = 'Editor';
|
||||
$lang->dev->tableList['git'] = 'GIT';
|
||||
$lang->dev->tableList['index'] = 'Home';
|
||||
$lang->dev->tableList['install'] = 'Install';
|
||||
@@ -177,3 +189,15 @@ if($config->systemMode != 'ALM') unset($lang->dev->groupList['program']);
|
||||
$lang->dev->endGroupList['admin'] = 'Admin';
|
||||
$lang->dev->endGroupList['system'] = 'System';
|
||||
$lang->dev->endGroupList['other'] = 'Others';
|
||||
|
||||
$lang->dev->featureBar['langItem']['common'] = 'Common';
|
||||
$lang->dev->featureBar['langItem']['first'] = 'First Menu';
|
||||
$lang->dev->featureBar['langItem']['second'] = 'Second Menu';
|
||||
$lang->dev->featureBar['langItem']['third'] = 'Third Menu';
|
||||
$lang->dev->featureBar['langItem']['tag'] = 'Search Tag';
|
||||
|
||||
$lang->dev->projectMenu['project'] = "{$lang->projectCommon} Common";
|
||||
$lang->dev->projectMenu['scrum'] = "Scrum / Scrum + {$lang->projectCommon}";
|
||||
$lang->dev->projectMenu['waterfall'] = "Waterfall / Waterfall + {$lang->projectCommon}";
|
||||
$lang->dev->projectMenu['kanbanProject'] = "Kanban {$lang->projectCommon}";
|
||||
if($config->vision == 'lite') $lang->dev->projectMenu['kanbanProject'] = $lang->projectCommon;
|
||||
|
||||
+15
-12
@@ -1,16 +1,19 @@
|
||||
<?php
|
||||
$lang->dev->common = 'Phát triển';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = 'Database';
|
||||
$lang->dev->editor = 'Editor';
|
||||
$lang->dev->translate = 'Translate';
|
||||
$lang->dev->dbList = 'Database';
|
||||
$lang->dev->moduleList = 'Modules';
|
||||
$lang->dev->params = 'Thông số';
|
||||
$lang->dev->type = 'Loại';
|
||||
$lang->dev->desc = 'Mô tả';
|
||||
$lang->dev->noParams = 'Không có Parameters';
|
||||
$lang->dev->post = 'POST Parameter';
|
||||
$lang->dev->common = 'Phát triển';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = 'Database';
|
||||
$lang->dev->editor = 'Editor';
|
||||
$lang->dev->translate = 'Translate';
|
||||
$lang->dev->dbList = 'Database';
|
||||
$lang->dev->moduleList = 'Modules';
|
||||
$lang->dev->params = 'Thông số';
|
||||
$lang->dev->type = 'Loại';
|
||||
$lang->dev->desc = 'Mô tả';
|
||||
$lang->dev->noParams = 'Không có Parameters';
|
||||
$lang->dev->post = 'POST Parameter';
|
||||
$lang->dev->modifyValue = 'modifyValue';
|
||||
$lang->dev->defaultValue = 'defaultValue';
|
||||
|
||||
|
||||
$lang->dev->paramRange = 'Parameter Range: %s';
|
||||
$lang->dev->paramDate = 'Date format: YY-mm-dd, e.g 2019-01-01';
|
||||
|
||||
+45
-18
@@ -1,23 +1,34 @@
|
||||
<?php
|
||||
$lang->dev->common = '二次开发';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = '数据库';
|
||||
$lang->dev->editor = '编辑器';
|
||||
$lang->dev->translate = '翻译';
|
||||
$lang->dev->dbList = '数据库';
|
||||
$lang->dev->moduleList = '模块列表';
|
||||
$lang->dev->params = '参数列表';
|
||||
$lang->dev->type = '类型';
|
||||
$lang->dev->desc = '描述';
|
||||
$lang->dev->noParams = '无参数';
|
||||
$lang->dev->post = 'POST参数';
|
||||
$lang->dev->common = '二次开发';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = '数据库';
|
||||
$lang->dev->editor = '编辑器';
|
||||
$lang->dev->translate = '翻译';
|
||||
$lang->dev->dbList = '数据库';
|
||||
$lang->dev->moduleList = '模块列表';
|
||||
$lang->dev->params = '参数列表';
|
||||
$lang->dev->type = '类型';
|
||||
$lang->dev->desc = '描述';
|
||||
$lang->dev->noParams = '无参数';
|
||||
$lang->dev->post = 'POST参数';
|
||||
$lang->dev->modifyValue = '修改值';
|
||||
$lang->dev->defaultValue = '默认值';
|
||||
|
||||
$lang->dev->paramRange = '取值范围:%s';
|
||||
$lang->dev->paramDate = '日期格式:YY-mm-dd,如:2019-01-01';
|
||||
$lang->dev->paramColor = '颜色格式:#RGB,如:#3da7f5';
|
||||
$lang->dev->paramMailto = "填写帐号,多个账号用','分隔。";
|
||||
$lang->dev->noteEditor = "编辑器功能因为安全原因被禁用。使用该功能,请到官网下载安装 <a href='https://www.zentao.net/extension-viewExt-150.html' target='_blank'>扩展编辑器</a> 插件。";
|
||||
$lang->dev->noteTranslate = "翻译功能因为安全原因被禁用。使用该功能,请到官网下载安装 <a href='https://www.zentao.net/extension-viewExt-151.html' target='_blank'>翻译</a> 插件。";
|
||||
$lang->dev->paramRange = '取值范围:%s';
|
||||
$lang->dev->paramDate = '日期格式:YY-mm-dd,如:2019-01-01';
|
||||
$lang->dev->paramColor = '颜色格式:#RGB,如:#3da7f5';
|
||||
$lang->dev->paramMailto = "填写帐号,多个账号用','分隔。";
|
||||
$lang->dev->noteEditor = "编辑器功能存在部分安全问题,如需使用该功能,可在此开启。";
|
||||
$lang->dev->noteTranslate = "翻译功能因为安全原因被禁用。使用该功能,请到官网下载安装 <a href='https://www.zentao.net/extension-viewExt-151.html' target='_blank'>翻译</a> 插件。";
|
||||
$lang->dev->confirmRestore = '是否要恢复默认?';
|
||||
|
||||
$lang->dev->language = '语言:%s';
|
||||
$lang->dev->default = '默认值';
|
||||
$lang->dev->currentLang = '当前语言';
|
||||
$lang->dev->change = '修改值';
|
||||
$lang->dev->UR = '用户需求';
|
||||
$lang->dev->SR = '软件需求';
|
||||
$lang->dev->branch = '平台/分支';
|
||||
|
||||
$lang->dev->fields = array();
|
||||
$lang->dev->fields['id'] = '序号';
|
||||
@@ -27,6 +38,9 @@ $lang->dev->fields['type'] = '类型';
|
||||
$lang->dev->fields['length'] = '长度';
|
||||
$lang->dev->fields['null'] = '是否可空';
|
||||
|
||||
$lang->dev->switchList['1'] = '开启';
|
||||
$lang->dev->switchList['0'] = '关闭';
|
||||
|
||||
$lang->dev->tableList = array();
|
||||
$lang->dev->tableList['action'] = '系统日志';
|
||||
$lang->dev->tableList['bug'] = 'Bug';
|
||||
@@ -79,6 +93,7 @@ $lang->dev->tableList['backup'] = '备份';
|
||||
$lang->dev->tableList['common'] = '公有模块';
|
||||
$lang->dev->tableList['convert'] = '导入';
|
||||
$lang->dev->tableList['dev'] = '二次开发';
|
||||
$lang->dev->tableList['editor'] = '编辑器';
|
||||
$lang->dev->tableList['git'] = 'GIT';
|
||||
$lang->dev->tableList['index'] = '首页';
|
||||
$lang->dev->tableList['install'] = '安装';
|
||||
@@ -177,3 +192,15 @@ if($config->systemMode != 'ALM') unset($lang->dev->groupList['program']);
|
||||
$lang->dev->endGroupList['admin'] = '后台';
|
||||
$lang->dev->endGroupList['system'] = '系统';
|
||||
$lang->dev->endGroupList['other'] = '其他';
|
||||
|
||||
$lang->dev->featureBar['langItem']['common'] = '公共';
|
||||
$lang->dev->featureBar['langItem']['first'] = '一级菜单';
|
||||
$lang->dev->featureBar['langItem']['second'] = '二级菜单';
|
||||
$lang->dev->featureBar['langItem']['third'] = '三级菜单';
|
||||
$lang->dev->featureBar['langItem']['tag'] = '检索标签';
|
||||
|
||||
$lang->dev->projectMenu['project'] = "{$lang->projectCommon}通用";
|
||||
$lang->dev->projectMenu['scrum'] = "敏捷 / 融合敏捷{$lang->projectCommon}";
|
||||
$lang->dev->projectMenu['waterfall'] = "瀑布 / 融合瀑布{$lang->projectCommon}";
|
||||
$lang->dev->projectMenu['kanbanProject'] = "看板{$lang->projectCommon}";
|
||||
if($config->vision == 'lite') $lang->dev->projectMenu['kanbanProject'] = $lang->projectCommon;
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
<?php
|
||||
class devModel extends model
|
||||
{
|
||||
/**
|
||||
* Default lang object.
|
||||
*
|
||||
* @var object
|
||||
* @access public
|
||||
*/
|
||||
public $defaultLang;
|
||||
|
||||
/**
|
||||
* Get All tables.
|
||||
*
|
||||
@@ -284,6 +292,271 @@ class devModel extends model
|
||||
return $extPaths;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get nav lang.
|
||||
*
|
||||
* @param string $type
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @param string $language
|
||||
* @param object $defaultLang
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function getNavLang($type, $module, $method, $language = 'zh-cn', $defaultLang = null)
|
||||
{
|
||||
if(empty($defaultLang)) $defaultLang = $this->loadDefaultLang($language);
|
||||
|
||||
$menus = new stdclass();
|
||||
if($type == 'second')
|
||||
{
|
||||
if(isset($defaultLang->$module->homeMenu))
|
||||
{
|
||||
foreach($defaultLang->$module->homeMenu as $menuKey => $menu)
|
||||
{
|
||||
$menuKey = 'homeMenu_' . $menuKey;
|
||||
$menus->{$menuKey} = $menu;
|
||||
}
|
||||
}
|
||||
|
||||
if(isset($defaultLang->$module->menu))
|
||||
{
|
||||
$menuList = $defaultLang->$module->menu;
|
||||
if(isset($defaultLang->$module->menuOrder)) $menuList->menuOrder = $defaultLang->$module->menuOrder;
|
||||
$menuList = $this->sortMenus($menuList);
|
||||
foreach($menuList as $menuKey => $menu)
|
||||
{
|
||||
if(is_array($menu) and !isset($menu['link'])) continue;
|
||||
|
||||
$newKey = 'menu_' . $menuKey;
|
||||
$menus->{$newKey} = $menu;
|
||||
|
||||
if(!isset($menu['dropMenu'])) continue;
|
||||
foreach($menu['dropMenu'] as $key => $menu)
|
||||
{
|
||||
$dropMenuKey = $menuKey . 'DropMenu_' . $key;
|
||||
$menus->{$dropMenuKey} = $menu;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$menus = ($type == 'third' and isset($defaultLang->$module->menu->{$method}['subMenu'])) ? $defaultLang->$module->menu->{$method}['subMenu'] : $defaultLang->mainNav;
|
||||
if(!empty($module) and isset($defaultLang->$module->menu->{$method}['menuOrder'])) $menus->menuOrder = $defaultLang->$module->menu->{$method}['menuOrder'];
|
||||
$menus = $this->sortMenus($menus);
|
||||
}
|
||||
|
||||
return $menus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort menus.
|
||||
*
|
||||
* @param array|object $menus
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function sortMenus($menus)
|
||||
{
|
||||
if(!is_array($menus)) $menus = (array)$menus;
|
||||
if(!isset($menus['menuOrder'])) return $menus;
|
||||
$sortedMenus = array();
|
||||
$menuOrders = $menus['menuOrder'];
|
||||
ksort($menuOrders);
|
||||
foreach($menuOrders as $menuKey)
|
||||
{
|
||||
if($menuKey == 'project')
|
||||
{
|
||||
$projectTypeList = array('scrum', 'waterfall', 'kanbanProject');
|
||||
foreach($projectTypeList as $projectType)
|
||||
{
|
||||
if(isset($menus[$projectType])) $sortedMenus[$projectType] = $menus[$projectType];
|
||||
}
|
||||
}
|
||||
if(isset($menus[$menuKey])) $sortedMenus[$menuKey] = $menus[$menuKey];
|
||||
}
|
||||
|
||||
$sortedMenus = array_merge($sortedMenus, $menus);
|
||||
return $sortedMenus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get original lang.
|
||||
*
|
||||
* @param string $type
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @param string $language
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getOriginalLang($type, $module = '', $method = '', $language = 'zh-cn')
|
||||
{
|
||||
if(empty($language)) $language = $this->app->getClientLang();
|
||||
$originalLangs = array();
|
||||
$defaultLang = $this->loadDefaultLang($language);
|
||||
if($type == 'tag')
|
||||
{
|
||||
if(in_array($module, $this->config->dev->projectMenus)) $module = 'project';
|
||||
|
||||
$this->defaultLang = $defaultLang;
|
||||
$defaultLang = $this->loadDefaultLang($language, $module);
|
||||
}
|
||||
|
||||
$lang = new stdClass();
|
||||
$langKey = '';
|
||||
if($type == 'common')
|
||||
{
|
||||
if($this->config->vision == 'rnd')
|
||||
{
|
||||
$projectKey = (int)$this->loadModel('setting')->getItem('owner=system&key=sprintConcept');
|
||||
$originalLangs['productCommon'] = $this->config->productCommonList[$language][PRODUCT_KEY];
|
||||
$originalLangs['projectCommon'] = $this->config->projectCommonList[$language][PROJECT_KEY];
|
||||
$originalLangs['executionCommon'] = $this->config->executionCommonList[$language][$projectKey];
|
||||
$originalLangs['URCommon'] = $this->lang->dev->UR;
|
||||
$originalLangs['SRCommon'] = $this->lang->dev->SR;
|
||||
|
||||
$URSRList = $this->loadModel('custom')->getItems("lang={$language}&module=custom§ion=URSRList&key={$this->config->custom->URSR}&vision={$this->config->vision}");
|
||||
$URSRList = array_shift($URSRList);
|
||||
if($URSRList)
|
||||
{
|
||||
$URSRList = json_decode($URSRList->value);
|
||||
$originalLangs['URCommon'] = isset($URSRList->defaultURName) ? $URSRList->defaultURName : $URSRList->URName;
|
||||
$originalLangs['SRCommon'] = isset($URSRList->defaultSRName) ? $URSRList->defaultSRName : $URSRList->SRName;
|
||||
}
|
||||
if(!$this->config->URAndSR) unset($originalLangs['URCommon']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$originalLangs['projectCommon'] = $this->config->projectCommonList[$language][PROJECT_KEY];
|
||||
}
|
||||
}
|
||||
elseif($type == 'tag')
|
||||
{
|
||||
if(!isset($defaultLang->$module->featureBar)) return $originalLangs;
|
||||
if($this->config->vision == 'lite' and isset($this->config->dev->liteTagMethod["$module-$method"])) $method = $this->config->dev->liteTagMethod["$module-$method"];
|
||||
|
||||
$langKey = 'featureBar-' . $method . '_';
|
||||
$featureBars = zget($defaultLang->$module->featureBar, $method, array());
|
||||
if(strpos($method, '_') !== false)
|
||||
{
|
||||
$langKey = 'featureBar-' . str_replace('_', '-', $method) . '_';
|
||||
list($subMethod, $thirdMethod) = explode('_', $method);
|
||||
$featureBars = $defaultLang->$module->featureBar[$subMethod][$thirdMethod];
|
||||
}
|
||||
|
||||
foreach($featureBars as $feature => $featureName)
|
||||
{
|
||||
$moreSelectsTags = isset($defaultLang->{$module}->moreSelects[$method][$feature]) ? $defaultLang->{$module}->moreSelects[$method][$feature] : '';
|
||||
if($moreSelectsTags)
|
||||
{
|
||||
foreach($moreSelectsTags as $tagKey => $tagName) $originalLangs["moreSelects-{$method}-{$feature}_" . $tagKey] = $tagName;
|
||||
continue;
|
||||
}
|
||||
$originalLangs[$langKey . $feature] = $featureName;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$lang = $this->getNavLang($type, $module, $method, $language, $defaultLang);
|
||||
$langKey = $type == 'first' ? 'mainNav_' : ($type == 'third' ? "{$method}_" : '');
|
||||
|
||||
$menus = $this->getLinkTitle($lang);
|
||||
foreach($menus as $linkKey => $menu)
|
||||
{
|
||||
foreach($this->config->dev->skipMenus as $menuType => $skipMenus)
|
||||
{
|
||||
if($type == $menuType and in_array($linkKey, $skipMenus)) continue 2;
|
||||
}
|
||||
if(in_array($module, array('scrum', 'waterfall', 'execution')) and in_array($linkKey, $this->config->dev->skipMenus[$module])) continue;
|
||||
|
||||
if($menu == '@branch@') $menu = $this->lang->dev->branch;
|
||||
$originalLangs[$langKey . $linkKey] = $menu;
|
||||
}
|
||||
}
|
||||
|
||||
return $originalLangs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get customed lang.
|
||||
*
|
||||
* @param string $type
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @param string $language
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getCustomedLang($type, $module = '', $method = '', $language = 'zh-cn')
|
||||
{
|
||||
$customedLangs = array();
|
||||
|
||||
$langKey = '';
|
||||
$customeds = array();
|
||||
switch($type)
|
||||
{
|
||||
case 'common':
|
||||
$customeds = $this->loadModel('custom')->getItems("lang={$language}&module=common§ion=&vision={$this->config->vision}");
|
||||
foreach($customeds as $customed) $customedLangs[$customed->key] = $customed->value;
|
||||
|
||||
$customedLangs['URCommon'] = $this->lang->dev->UR == $this->lang->URCommon ? '' : $this->lang->URCommon;
|
||||
$customedLangs['SRCommon'] = $this->lang->dev->SR == $this->lang->SRCommon ? '' : $this->lang->SRCommon;
|
||||
$URSRList = $this->custom->getItems("lang={$language}&module=custom§ion=URSRList&key={$this->config->custom->URSR}&vision={$this->config->vision}");
|
||||
$URSRList = array_shift($URSRList);
|
||||
if($URSRList)
|
||||
{
|
||||
$URSRList = json_decode($URSRList->value);
|
||||
$defaultURName = isset($URSRList->defaultURName) ? $URSRList->defaultURName : $URSRList->URName;
|
||||
$defaultSRName = isset($URSRList->defaultSRName) ? $URSRList->defaultSRName : $URSRList->SRName;
|
||||
$customedLangs['URCommon'] = $defaultURName == $URSRList->URName ? '' : $URSRList->URName;
|
||||
$customedLangs['SRCommon'] = $defaultSRName == $URSRList->SRName ? '' : $URSRList->SRName;
|
||||
}
|
||||
if(!$this->config->URAndSR) unset($customedLangs['URCommon']);
|
||||
break;
|
||||
case 'first':
|
||||
$customeds = $this->loadModel('custom')->getItems("lang={$language}&module=common§ion=mainNav&vision={$this->config->vision}");
|
||||
$langKey = 'mainNav_';
|
||||
break;
|
||||
case 'second':
|
||||
$customeds = $this->loadModel('custom')->getItems("lang={$language}&module={$module}Menu&vision={$this->config->vision}");
|
||||
break;
|
||||
case 'third':
|
||||
$customeds = $this->loadModel('custom')->getItems("lang={$language}&module={$module}SubMenu§ion=$method&vision={$this->config->vision}");
|
||||
$langKey = "{$method}_";
|
||||
break;
|
||||
case 'tag':
|
||||
if($this->config->vision == 'lite' and isset($this->config->dev->liteTagMethod["$module-$method"])) $method = $this->config->dev->liteTagMethod["$module-$method"];
|
||||
|
||||
$method = str_replace('_', '-', $method);
|
||||
$customeds['featureBar'] = $this->loadModel('custom')->getItems("lang={$language}&module={$module}§ion=featureBar-$method&vision={$this->config->vision}");
|
||||
$customeds['moreSelects'] = $this->dao->select('*')->from(TABLE_LANG)->where('`lang`')->eq($language)->andWhere('module')->eq($module)->andWhere('section')->like("moreSelects-$method%")->andWhere('vision')->eq($this->config->vision)->fetchAll();
|
||||
break;
|
||||
}
|
||||
|
||||
foreach($customeds as $type => $customed)
|
||||
{
|
||||
if(is_array($customed))
|
||||
{
|
||||
foreach($customed as $row)
|
||||
{
|
||||
$langKey = $type == 'featureBar' ? "featureBar-{$method}_" : $row->section . '_';
|
||||
$rowKey = $row->key;
|
||||
$customedLangs[$langKey . $rowKey] = $row->value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$customedKey = $customed->key;
|
||||
if($type == 'second') $customedKey = $customed->section . '_' . $customed->key;
|
||||
$customedLangs[$langKey . $customedKey] = $customed->value;
|
||||
}
|
||||
}
|
||||
|
||||
return $customedLangs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Trim asterisks and whitespace from the beginning and whitespace from the end of lines.
|
||||
*
|
||||
@@ -295,4 +568,460 @@ class devModel extends model
|
||||
{
|
||||
return ltrim(rtrim($line), "* \t\n\r\0\x0B");
|
||||
}
|
||||
|
||||
/**
|
||||
* Load default lang.
|
||||
*
|
||||
* @param string $language
|
||||
* @param string $module
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function loadDefaultLang($language = 'zh-cn', $module = 'common')
|
||||
{
|
||||
if(empty($language)) $language = 'zh-cn';
|
||||
if(empty($module)) $module = 'common';
|
||||
if($module != 'common' and !isset($this->defaultLang)) return null;
|
||||
|
||||
$clientLang = $this->app->clientLang;
|
||||
if($language and $language != $clientLang) $this->app->clientLang = $language;
|
||||
|
||||
$langFilesToLoad = $this->app->getMainAndExtFiles($module);
|
||||
if($language != $clientLang) $this->app->clientLang = $clientLang;
|
||||
|
||||
if(empty($langFilesToLoad)) return false;
|
||||
|
||||
$lang = $module == 'common' ? new language() : $this->defaultLang;
|
||||
$lang->URCommon = '$URCOMMON';
|
||||
$lang->SRCommon = '$SRCOMMON';
|
||||
$lang->productCommon = '$PRODUCTCOMMON';
|
||||
$lang->projectCommon = '$PROJECTCOMMON';
|
||||
$lang->executionCommon = '$EXECUTIONCOMMON';
|
||||
$lang->hourCommon = $this->lang->hourCommon;
|
||||
if(!isset($lang->common)) $lang->common = new stdclass();
|
||||
|
||||
foreach($langFilesToLoad as $langFile) include $langFile;
|
||||
|
||||
return $lang;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get second menus.
|
||||
*
|
||||
* @param string $menu
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getSecondMenus($menu, $module = '', $method = '')
|
||||
{
|
||||
$menus = array();
|
||||
if($menu == 'project')
|
||||
{
|
||||
$menusPinYin = common::convert2Pinyin($this->lang->dev->projectMenu);
|
||||
foreach($this->config->dev->projectMenus as $subMenuKey)
|
||||
{
|
||||
$subMenu = new stdClass();
|
||||
$subMenu->title = $this->lang->dev->projectMenu[$subMenuKey];
|
||||
$subMenu->key = zget($menusPinYin, $this->lang->dev->projectMenu[$subMenuKey], '');
|
||||
$subMenu->module = $subMenuKey;
|
||||
$subMenu->method = '';
|
||||
$subMenu->active = ($module == $subMenuKey and $method == '') ? 1 : 0;
|
||||
|
||||
$menus[] = $subMenu;
|
||||
}
|
||||
}
|
||||
|
||||
return $menus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get third menus.
|
||||
*
|
||||
* @param string $menu
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getThirdMenus($menu, $module = '', $method = '')
|
||||
{
|
||||
$menus = array();
|
||||
if(!isset($this->lang->$menu->menu)) return $menus;
|
||||
if(isset($this->lang->$menu->menuOrder)) $this->lang->$menu->menu->menuOrder = $this->lang->$menu->menuOrder;
|
||||
|
||||
$menuLang = $this->getLinkTitle($this->lang->$menu->menu);
|
||||
$menusPinYin = common::convert2Pinyin($menuLang);
|
||||
foreach($menuLang as $menuKey => $menuName)
|
||||
{
|
||||
if(!isset($this->lang->$menu->menu->{$menuKey}['subMenu']) or (is_object($this->lang->$menu->menu->{$menuKey}['subMenu']) and !get_object_vars($this->lang->$menu->menu->{$menuKey}['subMenu']))) continue;
|
||||
|
||||
$subMenu = new stdClass();
|
||||
$subMenu->title = $menuName;
|
||||
$subMenu->key = zget($menusPinYin, $menuName, '');
|
||||
$subMenu->module = $menu;
|
||||
$subMenu->method = $menuKey;
|
||||
$subMenu->active = ($method == $menuKey and $module == $menu) ? 1 : 0;
|
||||
|
||||
$menus[] = $subMenu;
|
||||
}
|
||||
|
||||
return $menus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tags.
|
||||
*
|
||||
* @param string $menu
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getTagMenus($module, $moduleName = '', $methodName = '')
|
||||
{
|
||||
$menus = array();
|
||||
if($this->config->vision == 'lite' and $module == 'execution') return $menus;
|
||||
|
||||
$titleList = array();
|
||||
foreach(array('homeMenu', 'menu') as $menu)
|
||||
{
|
||||
if(!isset($this->lang->$module->$menu)) continue;
|
||||
$menuList = $this->lang->$module->$menu;
|
||||
if($menu == 'menu' and isset($this->lang->$module->menuOrder))
|
||||
{
|
||||
$menuList->menuOrder = $this->lang->$module->menuOrder;
|
||||
$menuList = $this->sortMenus($menuList);
|
||||
}
|
||||
|
||||
foreach($menuList as $menuKey => $menuValue)
|
||||
{
|
||||
if(is_array($menuValue) and !isset($menuValue['link'])) continue;
|
||||
$link = is_array($menuValue) ? $menuValue['link'] : $menuValue;
|
||||
if(strpos($link, '|') === false) continue;
|
||||
list($label, $thisModule, $thisMethod) = explode('|', $link);
|
||||
|
||||
if(isset($this->config->dev->linkMethods[$module]["{$thisModule}-{$thisMethod}"]))
|
||||
{
|
||||
list($thisModule, $thisMethod) = $this->config->dev->linkMethods[$module]["{$thisModule}-{$thisMethod}"];
|
||||
}
|
||||
|
||||
$titleList[] = $label;
|
||||
|
||||
$subMenu = new stdclass();
|
||||
$subMenu->title = $label;
|
||||
$subMenu->key = '';
|
||||
$subMenu->module = $thisModule;
|
||||
$subMenu->method = $thisMethod;
|
||||
$subMenu->active = ($methodName == $thisMethod and $moduleName == $thisModule) ? 1 : 0;
|
||||
$subMenu->children = array();
|
||||
|
||||
$this->app->loadLang($thisModule);
|
||||
$hasFeatureBar = false;
|
||||
if(isset($this->lang->$thisModule->featureBar[$thisMethod])) $hasFeatureBar = true;
|
||||
|
||||
if(is_array($menuValue))
|
||||
{
|
||||
foreach(array('subMenu', 'dropMenu') as $menu)
|
||||
{
|
||||
if(!isset($menuValue[$menu])) continue;
|
||||
if($menu == 'subMenu' and isset($menuValue['menuOrder']))
|
||||
{
|
||||
$menuValue[$menu]->menuOrder = $menuValue['menuOrder'];
|
||||
$menuValue[$menu] = $this->sortMenus($menuValue[$menu]);
|
||||
}
|
||||
foreach($menuValue[$menu] as $subMenuKey => $subMenuValue)
|
||||
{
|
||||
if(is_array($subMenuValue) and !isset($subMenuValue['link'])) continue;
|
||||
$link = is_array($subMenuValue) ? $subMenuValue['link'] : $subMenuValue;
|
||||
if(strpos($link, '|') === false) continue;
|
||||
list($label, $thisModule, $thisMethod) = explode('|', $link);
|
||||
if($label == '@branch@') $label = $this->lang->dev->branch;
|
||||
|
||||
$this->app->loadLang($thisModule);
|
||||
if(isset($this->lang->$thisModule->featureBar[$menuKey][$subMenuKey]))
|
||||
{
|
||||
$titleList[] = $label;
|
||||
|
||||
$thirdMenu = new stdClass();
|
||||
$thirdMenu->title = $label;
|
||||
$thirdMenu->key = '';
|
||||
$thirdMenu->module = $thisModule;
|
||||
$thirdMenu->method = "{$thisMethod}_{$subMenuKey}";
|
||||
$thirdMenu->active = ($methodName == $thirdMenu->method and $moduleName == $thisModule) ? 1 : 0;
|
||||
|
||||
$subMenu->active = 0;
|
||||
$subMenu->children[] = $thirdMenu;
|
||||
$hasFeatureBar = true;
|
||||
}
|
||||
elseif(isset($this->lang->$thisModule->featureBar[$thisMethod]))
|
||||
{
|
||||
if(is_array($this->lang->$thisModule->featureBar[$thisMethod]))
|
||||
{
|
||||
$arrayKey = key($this->lang->$thisModule->featureBar[$thisMethod]);
|
||||
if(is_array($this->lang->$thisModule->featureBar[$thisMethod][$arrayKey])) continue;
|
||||
}
|
||||
|
||||
$titleList[] = $label;
|
||||
|
||||
$subMenu = new stdClass();
|
||||
$subMenu->title = $label;
|
||||
$subMenu->key = '';
|
||||
$subMenu->module = $thisModule;
|
||||
$subMenu->method = $thisMethod;
|
||||
$subMenu->active = ($methodName == $thisMethod and $moduleName == $thisModule) ? 1 : 0;
|
||||
$subMenu->children = array();
|
||||
|
||||
$menus["$thisModule-$thisMethod"] = $subMenu;
|
||||
$hasFeatureBar = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($hasFeatureBar) $menus[$menuKey] = $subMenu;
|
||||
}
|
||||
}
|
||||
|
||||
if(in_array($module, $this->config->dev->onlyMainMenu))
|
||||
{
|
||||
$mainNav = strip_tags($this->lang->mainNav->$module);
|
||||
list($label, $thisModule, $thisMethod) = explode('|', $mainNav);
|
||||
$titleList[] = $label;
|
||||
|
||||
$subMenu = new stdClass();
|
||||
$subMenu->title = $label;
|
||||
$subMenu->key = '';
|
||||
$subMenu->module = $thisModule;
|
||||
$subMenu->method = $thisMethod;
|
||||
$subMenu->active = ($methodName == $thisMethod and $moduleName == $thisModule) ? 1 : 0;
|
||||
$subMenu->children = array();
|
||||
|
||||
$menus[] = $subMenu;
|
||||
}
|
||||
|
||||
$titlePinYin = common::convert2Pinyin($titleList);
|
||||
foreach($menus as &$menu) $menu->key = zget($titlePinYin, $menu->title, '');
|
||||
|
||||
return $menus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get menu tree.
|
||||
*
|
||||
* @param string $type
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getMenuTree($type = 'second', $module = '', $method = '')
|
||||
{
|
||||
$menuTree = array();
|
||||
if(!in_array($type, $this->config->dev->navTypes)) return $menuTree;
|
||||
|
||||
$mainNav = $type == 'second' ? $this->lang->mainNav : array();
|
||||
if($type != 'second')
|
||||
{
|
||||
foreach($this->lang->mainNav as $menuKey => $menu)
|
||||
{
|
||||
if($menuKey == 'project')
|
||||
{
|
||||
foreach($this->config->dev->projectMenus as $subMenuKey) $mainNav[$subMenuKey] = $this->lang->dev->projectMenu[$subMenuKey];
|
||||
}
|
||||
|
||||
$mainNav[$menuKey] = $menu;
|
||||
}
|
||||
}
|
||||
|
||||
$mainNav = $this->getLinkTitle($mainNav);
|
||||
$maimNavPinYin = common::convert2Pinyin($mainNav);
|
||||
foreach($mainNav as $menuKey => $menu)
|
||||
{
|
||||
$menuItem = new stdclass();
|
||||
$menuItem->title = $menu;
|
||||
$menuItem->module = $menuKey;
|
||||
$menuItem->method = '';
|
||||
$menuItem->active = ($module == $menuKey and $method == '') ? 1 : 0;
|
||||
$menuItem->key = zget($maimNavPinYin, $menu, '');
|
||||
$menuItem->children = array();
|
||||
|
||||
$childFunc = 'get' . ucfirst($type) . 'Menus';
|
||||
if($type == 'tag' and in_array($menuKey, $this->config->dev->projectMenus))
|
||||
{
|
||||
if($menuKey != 'project') continue;
|
||||
foreach($this->config->dev->projectMenus as $projectModule)
|
||||
{
|
||||
$children = $this->getTagMenus($projectModule, $module, $method);
|
||||
$menuItem->children = array_merge($menuItem->children, $children);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$menuItem->children = $this->$childFunc($menuKey, $module, $method);
|
||||
}
|
||||
$menuItem->children = array_values($menuItem->children);
|
||||
|
||||
if($type != 'second' and empty($menuItem->children)) continue;
|
||||
if($type == 'second' and in_array($menuKey, $this->config->dev->hideMainMenu)) continue;
|
||||
|
||||
$menuTree[] = $menuItem;
|
||||
}
|
||||
|
||||
/* Unique menu tree by module and method. */
|
||||
if($type == 'tag')
|
||||
{
|
||||
$methods = array();
|
||||
foreach($menuTree as $index => $menuItem)
|
||||
{
|
||||
foreach($menuItem->children as $subIndex => $subMenuItem)
|
||||
{
|
||||
$key = "{$subMenuItem->module}|{$subMenuItem->method}";
|
||||
if(isset($methods[$key]))
|
||||
{
|
||||
unset($menuItem->children[$subIndex]);
|
||||
continue;
|
||||
}
|
||||
$methods[$key] = true;
|
||||
}
|
||||
$menuItem->children = array_values($menuItem->children);
|
||||
}
|
||||
}
|
||||
|
||||
return $menuTree;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get links title.
|
||||
*
|
||||
* @param array $menus
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getLinkTitle($menus)
|
||||
{
|
||||
$linksTitle = array();
|
||||
$menus = $this->sortMenus($menus);
|
||||
foreach($menus as $menuKey => $menu)
|
||||
{
|
||||
if(is_array($menu) and !isset($menu['link'])) continue;
|
||||
|
||||
$link = is_array($menu) ? strip_tags($menu['link']) : strip_tags($menu);
|
||||
$link = explode('|', $link);
|
||||
|
||||
$linksTitle[$menuKey] = trim($link[0]);
|
||||
}
|
||||
|
||||
return $linksTitle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse lang that with commonLang.
|
||||
*
|
||||
* @param string $lang
|
||||
* @access public
|
||||
* @return string|array
|
||||
*/
|
||||
public function parseCommonLang($lang)
|
||||
{
|
||||
if(empty($lang)) return $lang;
|
||||
|
||||
$reg = implode('|', str_replace('$', '\$', array_keys($this->config->custom->commonLang)));
|
||||
if(!preg_match("/($reg)/", $lang)) return $lang;
|
||||
|
||||
$lang = preg_replace("/($reg)/", '$$$1$$', $lang);
|
||||
$subLangs = array_filter(explode('$$', $lang));
|
||||
|
||||
return array_values($subLangs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check original lang changed.
|
||||
*
|
||||
* @param string|array $defaultValue
|
||||
* @param string|array $customedLang
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function isOriginalLangChanged($defaultValue, $customedLang)
|
||||
{
|
||||
if(empty($customedLang)) return false;
|
||||
if(!is_array($defaultValue) and !is_array($customedLang)) return false;
|
||||
if(!is_array($defaultValue) and is_array($customedLang)) return true;
|
||||
if(!is_array($customedLang) or count($defaultValue) != count($customedLang)) return true;
|
||||
|
||||
$commonLang = $this->config->custom->commonLang;
|
||||
foreach($defaultValue as $i => $subLang)
|
||||
{
|
||||
if(!isset($customedLang[$i])) return true;
|
||||
|
||||
$customedSubLang = $customedLang[$i];
|
||||
if(!isset($commonLang[$subLang]) and isset($commonLang[$customedSubLang])) return true;
|
||||
if(isset($commonLang[$subLang]) and !isset($commonLang[$customedSubLang])) return true;
|
||||
if(isset($commonLang[$subLang]) and $subLang != $customedSubLang) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save customed lang.
|
||||
*
|
||||
* @param string $type common|first|second|third|tag
|
||||
* @param string $moduleName
|
||||
* @param string $method
|
||||
* @param string $language zh-cn|zh-tw|en|fr|de
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function saveCustomedLang($type, $moduleName, $method, $language)
|
||||
{
|
||||
$section = '';
|
||||
if($type == 'common') $section = '§ion=';
|
||||
if($type == 'first') $section = '§ion=mainNav';
|
||||
if($type == 'tag')
|
||||
{
|
||||
$section = str_replace('_', '-', "§ion=featureBar-{$method}");
|
||||
$this->dao->delete()->from(TABLE_LANG)->where('lang')->eq($language)->andWhere('module')->eq($moduleName)->andWhere('section')->like("moreSelects-$method%")->andWhere('vision')->eq($this->config->vision)->exec();
|
||||
}
|
||||
|
||||
$key = '';
|
||||
if($type == 'common') $key = '&key=projectCommon,productCommon,executionCommon';
|
||||
|
||||
$this->loadModel('custom')->deleteItems("lang={$language}&module={$moduleName}&vision={$this->config->vision}{$section}{$key}");
|
||||
|
||||
$data = fixer::input('post')->get();
|
||||
if($type == 'common') unset($data->common_SRCommon, $data->common_URCommon);
|
||||
foreach($data as $langKey => $customedLang)
|
||||
{
|
||||
if(strpos($langKey, "{$moduleName}_") !== 0) continue;
|
||||
if(is_array($customedLang))
|
||||
{
|
||||
$isCustomed = false;
|
||||
foreach($customedLang as $subLang)
|
||||
{
|
||||
if(!isset($this->config->custom->commonLang[$subLang]) and !empty($subLang)) $isCustomed = true;
|
||||
}
|
||||
$customedLang = $isCustomed ? implode(common::checkNotCN() ? ' ' : '', $customedLang) : '';
|
||||
}
|
||||
if(empty($customedLang)) continue;
|
||||
|
||||
$this->custom->setItem("{$language}." . str_replace('_', '.', $langKey), $customedLang);
|
||||
}
|
||||
|
||||
if($type == 'common' and $this->config->custom->URSR)
|
||||
{
|
||||
$post = $_POST;
|
||||
$_POST = array();
|
||||
|
||||
$oldValue = $this->dao->select('*')->from(TABLE_LANG)->where('`key`')->eq($this->config->custom->URSR)->andWhere('section')->eq('URSRList')->andWhere('lang')->eq($language)->andWhere('module')->eq('custom')->fetch('value');
|
||||
$oldValue = json_decode($oldValue);
|
||||
|
||||
$_POST['SRName'] = !empty($post['common_SRCommon']) ? $post['common_SRCommon'] : zget($oldValue, 'defaultSRName', $oldValue->SRName);
|
||||
$_POST['URName'] = !empty($post['common_URCommon']) ? $post['common_URCommon'] : zget($oldValue, 'defaultURName', $oldValue->URName);
|
||||
$this->custom->updateURAndSR($this->config->custom->URSR, $language);
|
||||
|
||||
$_POST = $post;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
?>
|
||||
<?php include 'header.html.php';?>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='alert alert-danger'><?php echo $lang->dev->noteEditor;?></div>
|
||||
<div class='text-center'>
|
||||
<?php
|
||||
echo $lang->dev->noteEditor;
|
||||
if(common::hasPriv('editor', 'switch')) echo html::a($this->createLink('editor', 'switch', 'status=1'), $lang->dev->switchList[1], 'hiddenwin', "class='btn btn-primary'");
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'><?php // common::printAdminSubMenu('dev');?></div>
|
||||
</div>
|
||||
<?php if(isset($tab)):?>
|
||||
<script>$('#mainMenu #<?php echo $tab;?>').addClass('btn-active-text')</script>
|
||||
<?php endif;?>
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/**
|
||||
* The editor view file of dev module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package dev
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include 'header.html.php';?>
|
||||
<?php js::set('type', $type); ?>
|
||||
<?php js::set('navTypes', $config->dev->navTypes); ?>
|
||||
<?php js::set('menuTree', $menuTree)?>
|
||||
<?php js::set('language', $language)?>
|
||||
<div id='mainMenu' class='clearfix menu-secondary'>
|
||||
<div class="btn-toolbar pull-left">
|
||||
<div class="dropdown">
|
||||
<button class="btn" type="button" data-toggle="dropdown"><?php printf($lang->dev->language, $config->langs[str_replace('_', '-', $language)]);?> <span class="caret"></span></button>
|
||||
<ul class="dropdown-menu">
|
||||
<?php foreach($config->langs as $key => $value):?>
|
||||
<?php
|
||||
$key = str_replace('-', '_', $key);
|
||||
$active = $key == $language ? 'active' : '';
|
||||
?>
|
||||
<li class='<?php echo $active?>'><?php echo html::a(inlink('langItem', "type=$type&module=$module&method=$method&language=$key"), $value);?></li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php foreach($lang->dev->featureBar['langItem'] as $key => $label):?>
|
||||
<?php $active = $type == $key ? 'btn-active-text' : '';?>
|
||||
<?php $label = "<span class='text'>$label</span>";?>
|
||||
<?php echo html::a(inlink('langItem', "type=$key&module=&method=&language=$language"), $label, '', "class='btn btn-link $active'");?>
|
||||
<?php endforeach;?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex main-box">
|
||||
<?php if(in_array($type, $config->dev->navTypes)):?>
|
||||
<div class="menu-tree">
|
||||
<div class="input-control search-box has-icon-left has-icon-right search-example">
|
||||
<input type="search" class="form-control search-input"/>
|
||||
<label class="input-control-icon-left search-icon flex align-center justify-center"><i class="icon icon-search"></i></label>
|
||||
</div>
|
||||
<div id="menuTree" class="menu-active-primary menu-hover-primary"></div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
|
||||
<form class='main-form form-ajax flex-1' method='post'>
|
||||
<div class="main-content">
|
||||
<div class="title-content flex">
|
||||
<?php if(str_replace('-', '_', $this->app->getClientLang()) != $language):?>
|
||||
<div class="title"><?php echo $lang->dev->currentLang;?> </div>
|
||||
<?php endif;?>
|
||||
<div class="title"><?php echo $lang->dev->defaultValue?></div>
|
||||
<div class="title title-input"><?php echo $lang->dev->modifyValue?></div>
|
||||
</div>
|
||||
<div class="form-item-content form-active-primary">
|
||||
<?php $isCurrentLang = str_replace('-', '_', $this->app->getClientLang()) == $language;?>
|
||||
<?php foreach($originalLangs as $langKey => $originalLang):?>
|
||||
<?php
|
||||
if(isset($config->custom->commonLang[$originalLang])) continue;
|
||||
$itemKey = "{$moduleName}_{$langKey}";
|
||||
if(!$isCurrentLang) $currentLangs[$langKey] = strtr($currentLangs[$langKey], $currentCommonLang);
|
||||
$defaultValue = $this->dev->parseCommonLang($originalLang);
|
||||
$customedLang = $this->dev->parseCommonLang(zget($customedLangs, $langKey, ''));
|
||||
$originalLang = strtr($originalLang, $config->custom->commonLang);
|
||||
?>
|
||||
<div data-id="<?php echo $itemKey?>" class="form-item flex <?php if(!$isCurrentLang):?>w-expand<?php endif;?>">
|
||||
<?php if(!$isCurrentLang):?>
|
||||
<div data-id="<?php echo $itemKey?>" class="label h-full"><?php echo $currentLangs[$langKey]?></div>
|
||||
<?php endif;?>
|
||||
<div data-id="<?php echo $itemKey?>" class="label h-full"><?php echo $originalLang?></div>
|
||||
<div class="input-group flex">
|
||||
<i class="icon icon-angle-right text-primary"></i>
|
||||
<?php $originalLangChanged = $this->dev->isOriginalLangChanged($defaultValue, $customedLang);?>
|
||||
<?php if(($originalLangChanged and is_array($customedLang)) or (!$originalLangChanged and is_array($defaultValue))):?>
|
||||
<?php $foreachLang = $originalLangChanged ? $customedLang : $defaultValue;?>
|
||||
<?php foreach($foreachLang as $i => $subLang):?>
|
||||
<?php if(isset($config->custom->commonLang[$subLang])):?>
|
||||
<span class='input-group-addon flex-center'><?php echo $config->custom->commonLang[$subLang] . html::hidden("{$itemKey}[]", $subLang);?></span>
|
||||
<?php else:?>
|
||||
<?php
|
||||
$placeholder = $originalLangChanged ? '' : "placeholder='{$subLang}'";
|
||||
$customedSubLang = $subLang;
|
||||
if(!$originalLangChanged) $customedSubLang = empty($customedLang) ? '' : zget($customedLang, $i, '');
|
||||
echo html::input("{$itemKey}[]", $customedSubLang, "class='form-control shadow-primary-hover' $placeholder");
|
||||
?>
|
||||
<?php endif;?>
|
||||
<?php endforeach;?>
|
||||
<?php else:?>
|
||||
<?php echo html::input($itemKey, $customedLang, "class='form-control shadow-primary-hover' placeholder='{$originalLang}'");?>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom-btn">
|
||||
<?php echo html::submitButton(); ?>
|
||||
<?php echo html::a(inlink('resetLang', "type={$type}&module={$moduleName}&method={$method}&language={$language}"), $lang->restore, 'hiddenwin', "id='reset' class='btn btn-wide reset-btn'");?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
$config->editor->sort[] = 'model.php';
|
||||
$config->editor->sort[] = 'control.php';
|
||||
$config->editor->sort[] = 'view';
|
||||
$config->editor->sort[] = 'lang';
|
||||
$config->editor->sort[] = 'config.php';
|
||||
$config->editor->sort[] = 'js';
|
||||
$config->editor->sort[] = 'css';
|
||||
|
||||
$config->editor->extSort[] = 'model';
|
||||
$config->editor->extSort[] = 'control';
|
||||
$config->editor->extSort[] = 'view';
|
||||
$config->editor->extSort[] = 'lang';
|
||||
$config->editor->extSort[] = 'js';
|
||||
$config->editor->extSort[] = 'css';
|
||||
$config->editor->extSort[] = 'config';
|
||||
@@ -0,0 +1,203 @@
|
||||
<?php
|
||||
/**
|
||||
* The control file of editor of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package editor
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
class editor extends control
|
||||
{
|
||||
/**
|
||||
* Construct
|
||||
*
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($module = '', $method = '')
|
||||
{
|
||||
parent::__construct($module, $method);
|
||||
if($this->app->getMethodName() != 'switch' and empty($this->config->global->editor)) $this->locate($this->createLink('dev', 'editor'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show module files and edit them.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function index($type = 'editor')
|
||||
{
|
||||
$this->app->loadLang('dev');
|
||||
$this->view->title = $this->lang->editor->common;
|
||||
$this->view->position[] = $this->lang->editor->common;
|
||||
$this->view->modules = $this->loadModel('dev')->getModules();
|
||||
$this->view->tab = $type;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show files and methods of the module.
|
||||
*
|
||||
* @param string $moduleDir
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function extend($moduleDir = '')
|
||||
{
|
||||
$moduleFiles = $this->editor->getModuleFiles($moduleDir);
|
||||
$this->view->module = $moduleDir;
|
||||
$this->view->tree = $this->editor->printTree($moduleFiles);
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit extend.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @param string $action
|
||||
* @param string $isExtends
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function edit($filePath = '', $action = '', $isExtends = '')
|
||||
{
|
||||
$this->view->safeFilePath = $filePath;
|
||||
$fileContent = '';
|
||||
$extension = 'php';
|
||||
if($filePath)
|
||||
{
|
||||
$filePath = helper::safe64Decode($filePath);
|
||||
if(strpos(strtolower($filePath), strtolower($this->app->getBasePath())) !== 0) return print($this->lang->editor->editFileError);
|
||||
if($action == 'extendOther' and file_exists($filePath)) $this->view->showContent = file_get_contents($filePath);
|
||||
|
||||
if($action == 'edit' or $action == 'override')
|
||||
{
|
||||
if(file_exists($filePath))
|
||||
{
|
||||
$fileContent = file_get_contents($filePath);
|
||||
if($action == 'override')
|
||||
{
|
||||
$fileContent = str_replace("'../../", '$this->app->getModuleRoot() . \'', $fileContent);
|
||||
$fileContent = str_replace(array('\'./', '"./'), array('\'../../view/', '"../../view'), $fileContent);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$filePath = '';
|
||||
}
|
||||
}
|
||||
elseif($action == 'extendModel')
|
||||
{
|
||||
$fileContent = $this->editor->extendModel($filePath);
|
||||
}
|
||||
elseif($action == 'extendControl')
|
||||
{
|
||||
$okUrl = $this->editor->getExtendLink($filePath, 'extendControl', 'yes');
|
||||
$cancelUrl = $this->editor->getExtendLink($filePath, 'extendControl', 'no');
|
||||
if(!$isExtends) return print(js::confirm($this->lang->editor->extendConfirm, $okUrl, $cancelUrl));
|
||||
$fileContent = $this->editor->extendControl($filePath, $isExtends);
|
||||
}
|
||||
elseif($action == 'newPage')
|
||||
{
|
||||
$fileContent = $this->editor->newControl($filePath);
|
||||
}
|
||||
elseif(strrpos(basename($filePath), '.php') !== false and empty($fileContent))
|
||||
{
|
||||
$fileContent = "<?php\n";
|
||||
}
|
||||
|
||||
$fileName = basename($filePath);
|
||||
if(strpos($fileName, '.') !== false) $extension = substr($fileName, strpos($fileName, '.') + 1);
|
||||
}
|
||||
$this->view->fileContent = $fileContent;
|
||||
$this->view->filePath = $filePath;
|
||||
$this->view->fileExtension = $extension;
|
||||
$this->view->action = $action;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Page name.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function newPage($filePath)
|
||||
{
|
||||
$filePath = helper::safe64Decode($filePath);
|
||||
if($_POST)
|
||||
{
|
||||
$saveFilePath = $this->editor->getSavePath($filePath, 'newMethod');
|
||||
$extendLink = $this->editor->getExtendLink($saveFilePath, 'newPage');
|
||||
if(file_exists($saveFilePath) and !$this->post->override) return print(js::confirm($this->lang->editor->repeatPage, $extendLink, '', 'parent'));
|
||||
return print(js::locate($extendLink, 'parent'));
|
||||
}
|
||||
$this->view->filePath = $filePath;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Save file to extension.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function save($filePath = '', $action = '')
|
||||
{
|
||||
if($filePath and $_POST)
|
||||
{
|
||||
$filePath = helper::safe64Decode($filePath);
|
||||
if(strpos(strtolower($filePath), strtolower($this->app->getBasePath())) !== 0) return print($this->lang->editor->editFileError);
|
||||
if($action != 'edit' and $action != 'newPage') $filePath = $this->editor->getSavePath($filePath, $action);
|
||||
if($action != 'edit' and $action != 'newPage' and file_exists($filePath) and !$this->post->override) return print(js::error($this->lang->editor->repeatFile));
|
||||
if(!$this->editor->save($filePath)) return;
|
||||
echo js::reload('parent.parent.extendWin');
|
||||
return print(js::locate(inlink('edit', "filePath=" . helper::safe64Encode($filePath) . "&action=edit"), 'parent'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete extension file.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @param string $confirm
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function delete($filePath = '', $confirm = 'no')
|
||||
{
|
||||
if($confirm == 'no') return print(js::confirm($this->lang->editor->deleteConfirm, inlink('delete', "filePath=$filePath&confirm=yes")));
|
||||
|
||||
$filePath = helper::safe64Decode($filePath);
|
||||
if(file_exists($filePath) and unlink($filePath))
|
||||
{
|
||||
echo js::locate(inlink('edit'), 'parent.parent.editWin');
|
||||
return print(js::reload('parent'));
|
||||
}
|
||||
return print(js::alert($this->lang->editor->notDelete));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch editor feature.
|
||||
*
|
||||
* @param int $status 1|0
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function switch($status)
|
||||
{
|
||||
$this->loadModel('setting')->setItem('system.common.global.editor', $status);
|
||||
|
||||
$link = empty($status) ? $this->createLink('dev', 'editor') : $this->createLink('editor', 'index');
|
||||
return print(js::locate($link, 'parent'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
body{padding-bottom:0px;background-color:#fff;}
|
||||
#showContentEditor, #fileContentEditor {border:1px solid #ddd;}
|
||||
.main-content {padding:0px;}
|
||||
.checkbox-primary {display:inline-block; padding-left:12px;}
|
||||
.checkbox-primary label {padding-left:12px;}
|
||||
@@ -0,0 +1,5 @@
|
||||
body{padding-bottom:0px;background-color:#fff;}
|
||||
.expandable > ul {display: none!important}
|
||||
.collapsable > ul {display: block!important}
|
||||
.tree li:before {margin-right: 4px;}
|
||||
.tree li>a{display:inline;}
|
||||
@@ -0,0 +1,7 @@
|
||||
table td {padding: 0 10px; vertical-align: top;}
|
||||
table tr > td:first-child {padding-left: 0;}
|
||||
table tr > td:last-child {padding-right: 0;}
|
||||
.modulegroup {font-weight:bold; padding-top:8px; border-top:1px solid #ddd;}
|
||||
td.w-200px a:hover {font-weight:bold;}
|
||||
.w-350px{width:350px;}
|
||||
.module-col{padding-bottom:30px;}
|
||||
@@ -0,0 +1 @@
|
||||
$(function(){ })
|
||||
@@ -0,0 +1,12 @@
|
||||
$(function()
|
||||
{
|
||||
var showHeight = $('#main').height() - $('#mainMenu').height() - 40;
|
||||
$('#editWin').height(showHeight);
|
||||
$('#extendWin').height(showHeight);
|
||||
|
||||
$('.side-col a').click(function()
|
||||
{
|
||||
$('.side-col a.active').removeClass('active');
|
||||
$(this).addClass('active');
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
$lang->editor->common = 'Editor';
|
||||
$lang->editor->api = 'API';
|
||||
$lang->editor->index = 'Home';
|
||||
$lang->editor->newMethod = 'Neue Methode';
|
||||
$lang->editor->extend = 'Erweiterung';
|
||||
$lang->editor->api = 'API';
|
||||
$lang->editor->newLang = 'Neue Sprache';
|
||||
$lang->editor->newConfig = 'Neue Konfiguration';
|
||||
$lang->editor->newHook = 'Neuer Hook';
|
||||
$lang->editor->newExtend = 'Neue Erweiterung';
|
||||
$lang->editor->newPage = 'Neue Seite';
|
||||
$lang->editor->override = 'Überschreiben';
|
||||
$lang->editor->edit = 'Erweiterung bearbeiten';
|
||||
$lang->editor->save = 'Seite speichern';
|
||||
$lang->editor->delete = 'Seite löschen';
|
||||
|
||||
$lang->editor->moduleList = 'Module';
|
||||
$lang->editor->filePath = "Erweiterung:";
|
||||
$lang->editor->sourceFile = 'Source Datei:';
|
||||
$lang->editor->fileName = "Dateiname:";
|
||||
$lang->editor->isOverride = "Dublette überschrieben";
|
||||
$lang->editor->exampleHook = "(z.B. ***.html.hook.php)";
|
||||
$lang->editor->exampleJs = "(z.B. ***.js)";
|
||||
$lang->editor->exampleCss = "(z.B. ***.css)";
|
||||
$lang->editor->examplePHP = "(z.B. ***.php)";
|
||||
$lang->editor->pageName = "Seitenname:";
|
||||
|
||||
$lang->editor->deleteConfirm = 'Möchten Sie das löschen?';
|
||||
$lang->editor->extendConfirm = 'Möchten Sie den Originalcode verwenden?';
|
||||
$lang->editor->repeatFile = 'Datei existiert bereits';
|
||||
$lang->editor->repeatPage = 'Seite existiert bereits. Möchten Sie die Seite überschreiben?';
|
||||
$lang->editor->noticeOkFile = 'Aus Sicherheitsgründen muss Ihr Adminkonto bestätigt werden. \n Bitte melden Sie sich an und erstellen Sie die Datei %s File.\n Hinweis:\n 1. Die Datei ist leer.\n 2. Wenn die Datei bereits existiert, löschen Sie sie und erstellen Sie eine neue Datei.';
|
||||
$lang->editor->editFileError = 'Sie können nur ZenTao Dateien verändern!';
|
||||
|
||||
$lang->editor->notWritable = "Nicht beschreibbar. Berechtigung erforderlich. Bitte versuchen Sie chmod 777 -R ";
|
||||
$lang->editor->notDelete = 'Kann nicht gelöscht werden. Bitte prüfen Sie Ihre Berechtigungen!';
|
||||
$lang->editor->emptyFileName = 'Bitte geben Sie einen Dateinamen an!';
|
||||
$lang->editor->onlyLocalVisit = "This feature only works when the IP is 127.0.0.1. <a href='https://api.zentao.pm/goto.php?item=howtodevelop&from=en' target='_blank'>Help</a>";
|
||||
|
||||
$lang->editor->translate['config.php'] = 'config';
|
||||
$lang->editor->translate['control.php'] = 'control';
|
||||
$lang->editor->translate['model.php'] = 'model';
|
||||
|
||||
$lang->editor->modules['action'] = 'System Log';
|
||||
$lang->editor->modules['admin'] = 'Admin';
|
||||
$lang->editor->modules['api'] = 'API';
|
||||
$lang->editor->modules['bug'] = 'Bug';
|
||||
$lang->editor->modules['build'] = 'Build';
|
||||
$lang->editor->modules['common'] = 'Bekannte Module';
|
||||
$lang->editor->modules['company'] = 'Unternehmen';
|
||||
$lang->editor->modules['convert'] = 'Konvertieren';
|
||||
$lang->editor->modules['dept'] = 'Abteilung';
|
||||
$lang->editor->modules['doc'] = 'Dok';
|
||||
$lang->editor->modules['extension'] = 'Erweiterung';
|
||||
$lang->editor->modules['file'] = 'Datei';
|
||||
$lang->editor->modules['group'] = 'Gruppe';
|
||||
$lang->editor->modules['index'] = 'Homepage';
|
||||
$lang->editor->modules['install'] = 'Installieren';
|
||||
$lang->editor->modules['misc'] = 'Sonstiges';
|
||||
$lang->editor->modules['my'] = 'Dashboard';
|
||||
$lang->editor->modules['product'] = $lang->productCommon;
|
||||
$lang->editor->modules['productplan'] = 'Plan';
|
||||
$lang->editor->modules['project'] = $lang->projectCommon;
|
||||
$lang->editor->modules['qa'] = 'QA';
|
||||
$lang->editor->modules['release'] = 'Release';
|
||||
$lang->editor->modules['report'] = 'Berichte';
|
||||
$lang->editor->modules['search'] = 'Suche';
|
||||
$lang->editor->modules['story'] = 'Story';
|
||||
$lang->editor->modules['task'] = 'Aufgaben';
|
||||
$lang->editor->modules['testcase'] = 'Fälle';
|
||||
$lang->editor->modules['testtask'] = 'Testaufgaben';
|
||||
$lang->editor->modules['todo'] = 'Todos';
|
||||
$lang->editor->modules['tree'] = 'Module';
|
||||
$lang->editor->modules['upgrade'] = 'Upgrade';
|
||||
$lang->editor->modules['user'] = 'Benutzer';
|
||||
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
$lang->editor->common = 'Editor';
|
||||
$lang->editor->api = 'API';
|
||||
$lang->editor->index = 'Home';
|
||||
$lang->editor->newMethod = 'New Method';
|
||||
$lang->editor->extend = 'Extension';
|
||||
$lang->editor->api = 'API';
|
||||
$lang->editor->newLang = 'New Language';
|
||||
$lang->editor->newConfig = 'New Config';
|
||||
$lang->editor->newHook = 'New Hook';
|
||||
$lang->editor->newExtend = 'New Extension';
|
||||
$lang->editor->newPage = 'New Page';
|
||||
$lang->editor->override = 'Overwrite';
|
||||
$lang->editor->edit = 'Edit Extension';
|
||||
$lang->editor->save = 'Save Page';
|
||||
$lang->editor->delete = 'Delete Page';
|
||||
|
||||
$lang->editor->moduleList = 'Module';
|
||||
$lang->editor->filePath = "Extension:";
|
||||
$lang->editor->sourceFile = 'Source File:';
|
||||
$lang->editor->fileName = "File Name:";
|
||||
$lang->editor->isOverride = "Override Duplicated File";
|
||||
$lang->editor->exampleHook = "(e.g. ***.html.hook.php)";
|
||||
$lang->editor->exampleJs = "(e.g. ***.js)";
|
||||
$lang->editor->exampleCss = "(e.g. ***.css)";
|
||||
$lang->editor->examplePHP = "(e.g. ***.php)";
|
||||
$lang->editor->pageName = "Page Name:";
|
||||
|
||||
$lang->editor->deleteConfirm = 'Do you want to delete it?';
|
||||
$lang->editor->extendConfirm = 'Do you want to use original code?';
|
||||
$lang->editor->repeatFile = 'File Name Duplicated';
|
||||
$lang->editor->repeatPage = 'This page exists. Do you want to overwrite it?';
|
||||
$lang->editor->noticeOkFile = 'For security reasons, your Admin account has to be confirmed. \n Please login ZenTao server and create %s File.\n Note:\n 1. File is blank.\n 2. If the file existed, delete it and then create a new one.';
|
||||
$lang->editor->editFileError = 'You can only modify ZenTao files!';
|
||||
|
||||
$lang->editor->notWritable = "Not wirtable. Permission is required. Please try chmod 777 -R ";
|
||||
$lang->editor->notDelete = 'Cannot be deleted. Please check your permissions!';
|
||||
$lang->editor->emptyFileName = 'Please enter a File Name!';
|
||||
$lang->editor->onlyLocalVisit = "This feature only works when the IP is 127.0.0.1 for security. <a href='https://api.zentao.pm/goto.php?item=howtodevelop&from=en' target='_blank'>Help</a>";
|
||||
|
||||
$lang->editor->translate['config.php'] = 'config';
|
||||
$lang->editor->translate['control.php'] = 'control';
|
||||
$lang->editor->translate['model.php'] = 'model';
|
||||
|
||||
$lang->editor->modules['action'] = 'System Log';
|
||||
$lang->editor->modules['admin'] = 'Admin';
|
||||
$lang->editor->modules['api'] = 'API';
|
||||
$lang->editor->modules['bug'] = 'Bug';
|
||||
$lang->editor->modules['build'] = 'Build';
|
||||
$lang->editor->modules['common'] = 'Common Module';
|
||||
$lang->editor->modules['company'] = 'Company';
|
||||
$lang->editor->modules['convert'] = 'Convert';
|
||||
$lang->editor->modules['dept'] = 'Department';
|
||||
$lang->editor->modules['doc'] = 'Doc';
|
||||
$lang->editor->modules['extension'] = 'Extension';
|
||||
$lang->editor->modules['file'] = 'File';
|
||||
$lang->editor->modules['group'] = 'Group';
|
||||
$lang->editor->modules['index'] = 'Homepage';
|
||||
$lang->editor->modules['install'] = 'Install';
|
||||
$lang->editor->modules['misc'] = 'Misc';
|
||||
$lang->editor->modules['my'] = 'Dashboard';
|
||||
$lang->editor->modules['product'] = $lang->productCommon;
|
||||
$lang->editor->modules['productplan'] = 'Plan';
|
||||
$lang->editor->modules['project'] = $lang->projectCommon;
|
||||
$lang->editor->modules['execution'] = $lang->executionCommon;
|
||||
$lang->editor->modules['qa'] = 'QA';
|
||||
$lang->editor->modules['release'] = 'Release';
|
||||
$lang->editor->modules['report'] = 'Report';
|
||||
$lang->editor->modules['search'] = 'Search';
|
||||
$lang->editor->modules['story'] = $lang->URCommon;
|
||||
$lang->editor->modules['task'] = 'Task';
|
||||
$lang->editor->modules['testcase'] = 'Case';
|
||||
$lang->editor->modules['testtask'] = 'Request';
|
||||
$lang->editor->modules['todo'] = 'Todo';
|
||||
$lang->editor->modules['tree'] = 'Module Maintenance';
|
||||
$lang->editor->modules['upgrade'] = 'Upgrade';
|
||||
$lang->editor->modules['user'] = 'User';
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
$lang->editor->common = 'Editeur';
|
||||
$lang->editor->api = 'API';
|
||||
$lang->editor->index = 'Accueil';
|
||||
$lang->editor->newMethod = 'New Méthode';
|
||||
$lang->editor->extend = 'Extension';
|
||||
$lang->editor->api = 'API';
|
||||
$lang->editor->newLang = 'New Language';
|
||||
$lang->editor->newConfig = 'New Config';
|
||||
$lang->editor->newHook = 'New Hook';
|
||||
$lang->editor->newExtend = 'New Extension';
|
||||
$lang->editor->newPage = 'New Page';
|
||||
$lang->editor->override = 'Ecraser';
|
||||
$lang->editor->edit = 'Editer Extension';
|
||||
$lang->editor->save = 'Sauver Page';
|
||||
$lang->editor->delete = 'Supprimer Page';
|
||||
|
||||
$lang->editor->moduleList = 'Module';
|
||||
$lang->editor->filePath = "Extension:";
|
||||
$lang->editor->sourceFile = 'Fichier Source :';
|
||||
$lang->editor->fileName = "Nom Fichier :";
|
||||
$lang->editor->isOverride = "Override Duplicated File";
|
||||
$lang->editor->exampleHook = "(e.g. ***.html.hook.php)";
|
||||
$lang->editor->exampleJs = "(e.g. ***.js)";
|
||||
$lang->editor->exampleCss = "(e.g. ***.css)";
|
||||
$lang->editor->examplePHP = "(e.g. ***.php)";
|
||||
$lang->editor->pageName = "Nom Page :";
|
||||
|
||||
$lang->editor->deleteConfirm = 'Voulez-vous le supprimer ?';
|
||||
$lang->editor->extendConfirm = 'Voulez-vous utiliser le code original ?';
|
||||
$lang->editor->repeatFile = 'Doublon';
|
||||
$lang->editor->repeatPage = "Cette page existe. Voulez-vous l'écraser ?";
|
||||
$lang->editor->noticeOkFile = 'Pour des raisons de sécurité, votre compte administrateur doit être confirmé. \n Please login ZenTao server and create %s File.\n Note:\n 1. File is blank.\n 2. If the file existed, delete it and then create a new one.';
|
||||
$lang->editor->editFileError = 'Vous pouvez seulement modifier les fichiers ZenTao !';
|
||||
|
||||
$lang->editor->notWritable = "Non inscriptible. Permission requise. Essayez chmod 777 -R ";
|
||||
$lang->editor->notDelete = 'Ne peut pas être supprimé. Vérifiez les permissions !';
|
||||
$lang->editor->emptyFileName = 'Entrez un nom de fichier !';
|
||||
$lang->editor->onlyLocalVisit = "Cette fonctionnalité ne fonctionne que pour une IP 127.0.0.1. <a href='https://api.zentao.pm/goto.php?item=howtodevelop&from=en' target='_blank'>Aide</a>";
|
||||
|
||||
$lang->editor->translate['config.php'] = 'config';
|
||||
$lang->editor->translate['control.php'] = 'contrôle';
|
||||
$lang->editor->translate['model.php'] = 'modèle';
|
||||
|
||||
$lang->editor->modules['action'] = 'System Log';
|
||||
$lang->editor->modules['admin'] = 'Admin';
|
||||
$lang->editor->modules['api'] = 'API';
|
||||
$lang->editor->modules['bug'] = 'Bug';
|
||||
$lang->editor->modules['build'] = 'Build';
|
||||
$lang->editor->modules['common'] = 'Module Commun';
|
||||
$lang->editor->modules['company'] = 'Entreprise';
|
||||
$lang->editor->modules['convert'] = 'Convertir';
|
||||
$lang->editor->modules['dept'] = 'Compartiment';
|
||||
$lang->editor->modules['doc'] = 'Doc';
|
||||
$lang->editor->modules['extension'] = 'Extension';
|
||||
$lang->editor->modules['file'] = 'Fichier';
|
||||
$lang->editor->modules['group'] = 'Groupe';
|
||||
$lang->editor->modules['index'] = 'Accueil';
|
||||
$lang->editor->modules['install'] = 'Installer';
|
||||
$lang->editor->modules['misc'] = 'Divers';
|
||||
$lang->editor->modules['my'] = 'Dashboard';
|
||||
$lang->editor->modules['product'] = $lang->productCommon;
|
||||
$lang->editor->modules['productplan'] = 'Plan';
|
||||
$lang->editor->modules['project'] = $lang->projectCommon;
|
||||
$lang->editor->modules['qa'] = 'QA';
|
||||
$lang->editor->modules['release'] = 'Release';
|
||||
$lang->editor->modules['report'] = 'Rapport';
|
||||
$lang->editor->modules['search'] = 'Recherche';
|
||||
$lang->editor->modules['story'] = 'Story';
|
||||
$lang->editor->modules['task'] = 'Tâche';
|
||||
$lang->editor->modules['testcase'] = 'CasTest';
|
||||
$lang->editor->modules['testtask'] = 'Recette';
|
||||
$lang->editor->modules['todo'] = 'Agenda';
|
||||
$lang->editor->modules['tree'] = 'Module Maintenance';
|
||||
$lang->editor->modules['upgrade'] = 'Upgrade';
|
||||
$lang->editor->modules['user'] = 'User';
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
$lang->editor->common = 'Editor';
|
||||
$lang->editor->api = 'API';
|
||||
$lang->editor->index = 'Home';
|
||||
$lang->editor->newMethod = 'New Method';
|
||||
$lang->editor->extend = 'Extension';
|
||||
$lang->editor->api = 'API';
|
||||
$lang->editor->newLang = 'Ngôn ngữ mới';
|
||||
$lang->editor->newConfig = 'Cấu hình mới';
|
||||
$lang->editor->newHook = 'New Hook';
|
||||
$lang->editor->newExtend = 'New Extension';
|
||||
$lang->editor->newPage = 'Trang mới';
|
||||
$lang->editor->override = 'Ghi đè';
|
||||
$lang->editor->edit = 'Edit Extension';
|
||||
$lang->editor->save = 'Save Page';
|
||||
$lang->editor->delete = 'Delete Page';
|
||||
|
||||
$lang->editor->moduleList = 'Module';
|
||||
$lang->editor->filePath = "Extension:";
|
||||
$lang->editor->sourceFile = 'Nguồn File:';
|
||||
$lang->editor->fileName = "File Name:";
|
||||
$lang->editor->isOverride = "Override Duplicated File";
|
||||
$lang->editor->exampleHook = "(ví dụ: ***.html.hook.php)";
|
||||
$lang->editor->exampleJs = "(ví dụ: ***.js)";
|
||||
$lang->editor->exampleCss = "(ví dụ: ***.css)";
|
||||
$lang->editor->examplePHP = "(ví dụ: ***.php)";
|
||||
$lang->editor->pageName = "Tên trang:";
|
||||
|
||||
$lang->editor->deleteConfirm = 'Bạn có muốn xóa nó?';
|
||||
$lang->editor->extendConfirm = 'Do you want to use original code?';
|
||||
$lang->editor->repeatFile = 'File Name Duplicated';
|
||||
$lang->editor->repeatPage = 'This page exists. Do you want to overwrite it?';
|
||||
$lang->editor->noticeOkFile = 'For security reasons, your Admin account has to be confirmed. \n Please login ZenTao server and create %s File.\n Note:\n 1. File is blank.\n 2. If the file existed, delete it and then create a new one.';
|
||||
$lang->editor->editFileError = 'Bạn có thể only modify ZenTao files!';
|
||||
|
||||
$lang->editor->notWritable = "Not wirtable. Permission là bắt buộc. Please try chmod 777 -R ";
|
||||
$lang->editor->notDelete = 'Không thể be deleted. Please check your permissions!';
|
||||
$lang->editor->emptyFileName = 'Please enter a File Name!';
|
||||
$lang->editor->onlyLocalVisit = "This feature only works when the IP is 127.0.0.1 for security. <a href='https://api.zentao.pm/goto.php?item=howtodevelop&from=en' target='_blank'>Giúp</a>";
|
||||
|
||||
$lang->editor->translate['config.php'] = 'config';
|
||||
$lang->editor->translate['control.php'] = 'control';
|
||||
$lang->editor->translate['model.php'] = 'model';
|
||||
|
||||
$lang->editor->modules['action'] = 'Nhật ký hệ thống';
|
||||
$lang->editor->modules['admin'] = 'Quản trị';
|
||||
$lang->editor->modules['api'] = 'API';
|
||||
$lang->editor->modules['bug'] = 'Bug';
|
||||
$lang->editor->modules['build'] = 'Bản dựng';
|
||||
$lang->editor->modules['common'] = 'Module chung';
|
||||
$lang->editor->modules['company'] = 'Doanh nghiệp';
|
||||
$lang->editor->modules['convert'] = 'Chuyển đổi';
|
||||
$lang->editor->modules['dept'] = 'Phòng/Ban';
|
||||
$lang->editor->modules['doc'] = 'Tài liệu';
|
||||
$lang->editor->modules['extension'] = 'Extension';
|
||||
$lang->editor->modules['file'] = 'File';
|
||||
$lang->editor->modules['group'] = 'Nhóm';
|
||||
$lang->editor->modules['index'] = 'Homepage';
|
||||
$lang->editor->modules['install'] = 'Cài đặt';
|
||||
$lang->editor->modules['misc'] = 'Khác';
|
||||
$lang->editor->modules['my'] = 'Dashboard';
|
||||
$lang->editor->modules['product'] = $lang->productCommon;
|
||||
$lang->editor->modules['productplan'] = 'Kế hoạch';
|
||||
$lang->editor->modules['project'] = $lang->projectCommon;
|
||||
$lang->editor->modules['qa'] = 'QA';
|
||||
$lang->editor->modules['release'] = 'Phát hành';
|
||||
$lang->editor->modules['report'] = 'Báo cáo';
|
||||
$lang->editor->modules['search'] = 'Tìm kiếm';
|
||||
$lang->editor->modules['story'] = 'Câu chuyện';
|
||||
$lang->editor->modules['task'] = 'Nhiệm vụ';
|
||||
$lang->editor->modules['testcase'] = 'Tình huống';
|
||||
$lang->editor->modules['testtask'] = 'Yêu cầu';
|
||||
$lang->editor->modules['todo'] = 'Việc làm';
|
||||
$lang->editor->modules['tree'] = 'Bảo trì';
|
||||
$lang->editor->modules['upgrade'] = 'Nâng cấp';
|
||||
$lang->editor->modules['user'] = 'Người dùng';
|
||||
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
$lang->editor->common = '编辑器';
|
||||
$lang->editor->api = 'API';
|
||||
$lang->editor->index = '首页';
|
||||
$lang->editor->newMethod = '新增方法';
|
||||
$lang->editor->extend = '扩展';
|
||||
$lang->editor->api = 'API';
|
||||
$lang->editor->newLang = '新增语言';
|
||||
$lang->editor->newConfig = '新增配置';
|
||||
$lang->editor->newHook = '新增钩子';
|
||||
$lang->editor->newExtend = '新增扩展';
|
||||
$lang->editor->newPage = '新增页面';
|
||||
$lang->editor->override = '覆盖';
|
||||
$lang->editor->edit = '编辑扩展';
|
||||
$lang->editor->save = '保存页面';
|
||||
$lang->editor->delete = '删除页面';
|
||||
|
||||
$lang->editor->moduleList = '模块列表';
|
||||
$lang->editor->filePath = "扩展:";
|
||||
$lang->editor->sourceFile = '源文件:';
|
||||
$lang->editor->fileName = "文件名:";
|
||||
$lang->editor->isOverride = "覆盖重复文件";
|
||||
$lang->editor->exampleHook = "(例如:***.html.hook.php)";
|
||||
$lang->editor->exampleJs = "(例如:***.js)";
|
||||
$lang->editor->exampleCss = "(例如:***.css)";
|
||||
$lang->editor->examplePHP = "(例如:***.php)";
|
||||
$lang->editor->pageName = "页面名称:";
|
||||
|
||||
$lang->editor->deleteConfirm = '是否要删除?';
|
||||
$lang->editor->extendConfirm = '是否要重用原来代码?';
|
||||
$lang->editor->repeatFile = '文件名重复';
|
||||
$lang->editor->repeatPage = '已经有此页面。是否覆盖?';
|
||||
$lang->editor->noticeOkFile = '为了安全起见,系统需要确认您的管理员身份。\n 请登录禅道所在的服务器,创建%s文件。\n 注意:\n 1. 文件内容为空。\n 2. 如果之前文件存在,删除之后重新创建。';
|
||||
$lang->editor->editFileError = '只能修改禅道文件!';
|
||||
$lang->editor->turnOff = '如不使用编辑器功能,可在此关闭。';
|
||||
|
||||
$lang->editor->notWritable = "无法写入,可能没有权限。请尝试执行 chmod 777 -R ";
|
||||
$lang->editor->notDelete = '无法删除,请检查权限!';
|
||||
$lang->editor->emptyFileName = '请写入一个文件名!';
|
||||
$lang->editor->onlyLocalVisit = "该功能只能在IP:127.0.0.1下访问。<a href='https://api.zentao.net/goto.php?item=howtodevelop' target='_blank'>说明文档</a>";
|
||||
|
||||
$lang->editor->translate['config.php'] = 'config';
|
||||
$lang->editor->translate['control.php'] = 'control';
|
||||
$lang->editor->translate['model.php'] = 'model';
|
||||
|
||||
$lang->editor->modules['action'] = '系统日志';
|
||||
$lang->editor->modules['admin'] = '后台管理';
|
||||
$lang->editor->modules['api'] = 'API接口';
|
||||
$lang->editor->modules['bug'] = 'Bug管理';
|
||||
$lang->editor->modules['build'] = 'Build';
|
||||
$lang->editor->modules['common'] = '公有模块';
|
||||
$lang->editor->modules['company'] = '组织视图';
|
||||
$lang->editor->modules['convert'] = '从其他系统导入';
|
||||
$lang->editor->modules['dept'] = '部门结构';
|
||||
$lang->editor->modules['doc'] = '文档视图';
|
||||
$lang->editor->modules['extension'] = '插件管理';
|
||||
$lang->editor->modules['file'] = '附件';
|
||||
$lang->editor->modules['group'] = '权限分组';
|
||||
$lang->editor->modules['index'] = '首页';
|
||||
$lang->editor->modules['install'] = '安装';
|
||||
$lang->editor->modules['misc'] = '杂项';
|
||||
$lang->editor->modules['my'] = '我的地盘';
|
||||
$lang->editor->modules['product'] = $lang->productCommon . '视图';
|
||||
$lang->editor->modules['productplan'] = '计划';
|
||||
$lang->editor->modules['project'] = '项目视图';
|
||||
$lang->editor->modules['execution'] = $lang->executionCommon . '视图';
|
||||
$lang->editor->modules['qa'] = '测试视图';
|
||||
$lang->editor->modules['release'] = '发布';
|
||||
$lang->editor->modules['report'] = '报表';
|
||||
$lang->editor->modules['search'] = '搜索';
|
||||
$lang->editor->modules['story'] = $lang->URCommon;
|
||||
$lang->editor->modules['task'] = '任务';
|
||||
$lang->editor->modules['testcase'] = '用例管理';
|
||||
$lang->editor->modules['testtask'] = '测试单';
|
||||
$lang->editor->modules['todo'] = '待办';
|
||||
$lang->editor->modules['tree'] = '模块维护';
|
||||
$lang->editor->modules['upgrade'] = '升级';
|
||||
$lang->editor->modules['user'] = '用户';
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
$lang->editor->common = '編輯器';
|
||||
$lang->editor->api = 'API';
|
||||
$lang->editor->index = '首頁';
|
||||
$lang->editor->newMethod = '新增方法';
|
||||
$lang->editor->extend = '擴展';
|
||||
$lang->editor->api = 'API';
|
||||
$lang->editor->newLang = '新增語言';
|
||||
$lang->editor->newConfig = '新增配置';
|
||||
$lang->editor->newHook = '新增鈎子';
|
||||
$lang->editor->newExtend = '新增擴展';
|
||||
$lang->editor->newPage = '新增頁面';
|
||||
$lang->editor->override = '覆蓋';
|
||||
$lang->editor->edit = '編輯擴展';
|
||||
$lang->editor->save = '保存頁面';
|
||||
$lang->editor->delete = '刪除頁面';
|
||||
|
||||
$lang->editor->moduleList = '模組列表';
|
||||
$lang->editor->filePath = "擴展:";
|
||||
$lang->editor->sourceFile = '源檔案:';
|
||||
$lang->editor->fileName = "檔案名:";
|
||||
$lang->editor->isOverride = "覆蓋重複檔案";
|
||||
$lang->editor->exampleHook = "(例如:***.html.hook.php)";
|
||||
$lang->editor->exampleJs = "(例如:***.js)";
|
||||
$lang->editor->exampleCss = "(例如:***.css)";
|
||||
$lang->editor->examplePHP = "(例如:***.php)";
|
||||
$lang->editor->pageName = "頁面名稱:";
|
||||
|
||||
$lang->editor->deleteConfirm = '是否要刪除?';
|
||||
$lang->editor->extendConfirm = '是否要重用原來代碼?';
|
||||
$lang->editor->repeatFile = '檔案名重複';
|
||||
$lang->editor->repeatPage = '已經有此頁面。是否覆蓋?';
|
||||
$lang->editor->noticeOkFile = '為了安全起見,系統需要確認您的管理員身份。\n 請登錄禪道所在的伺服器,創建%s檔案。\n 注意:\n 1. 檔案內容為空。\n 2. 如果之前檔案存在,刪除之後重新創建。';
|
||||
$lang->editor->editFileError = '只能修改禪道檔案!';
|
||||
|
||||
$lang->editor->notWritable = "無法寫入,可能沒有權限。請嘗試執行 chmod 777 -R ";
|
||||
$lang->editor->notDelete = '無法刪除,請檢查權限!';
|
||||
$lang->editor->emptyFileName = '請寫入一個檔案名!';
|
||||
$lang->editor->onlyLocalVisit = "該功能只能在IP:127.0.0.1下訪問。<a href='https://api.zentao.net/goto.php?item=howtodevelop' target='_blank'>說明文檔</a>";
|
||||
|
||||
$lang->editor->translate['config.php'] = 'config';
|
||||
$lang->editor->translate['control.php'] = 'control';
|
||||
$lang->editor->translate['model.php'] = 'model';
|
||||
|
||||
$lang->editor->modules['action'] = '系統日誌';
|
||||
$lang->editor->modules['admin'] = '後台管理';
|
||||
$lang->editor->modules['api'] = 'API介面';
|
||||
$lang->editor->modules['bug'] = 'Bug管理';
|
||||
$lang->editor->modules['build'] = 'Build';
|
||||
$lang->editor->modules['common'] = '公有模組';
|
||||
$lang->editor->modules['company'] = '組織視圖';
|
||||
$lang->editor->modules['convert'] = '從其他系統導入';
|
||||
$lang->editor->modules['dept'] = '部門結構';
|
||||
$lang->editor->modules['doc'] = '文檔視圖';
|
||||
$lang->editor->modules['extension'] = '插件管理';
|
||||
$lang->editor->modules['file'] = '附件';
|
||||
$lang->editor->modules['group'] = '權限分組';
|
||||
$lang->editor->modules['index'] = '首頁';
|
||||
$lang->editor->modules['install'] = '安裝';
|
||||
$lang->editor->modules['misc'] = '雜項';
|
||||
$lang->editor->modules['my'] = '我的地盤';
|
||||
$lang->editor->modules['product'] = $lang->productCommon . '視圖';
|
||||
$lang->editor->modules['productplan'] = '計劃';
|
||||
$lang->editor->modules['project'] = $lang->projectCommon . '視圖';
|
||||
$lang->editor->modules['qa'] = '測試視圖';
|
||||
$lang->editor->modules['release'] = '發佈';
|
||||
$lang->editor->modules['report'] = '報表';
|
||||
$lang->editor->modules['search'] = '搜索';
|
||||
$lang->editor->modules['story'] = $lang->storyCommon;
|
||||
$lang->editor->modules['task'] = '任務';
|
||||
$lang->editor->modules['testcase'] = '用例管理';
|
||||
$lang->editor->modules['testtask'] = '測試單';
|
||||
$lang->editor->modules['todo'] = '待辦';
|
||||
$lang->editor->modules['tree'] = '模組維護';
|
||||
$lang->editor->modules['upgrade'] = '升級';
|
||||
$lang->editor->modules['user'] = '用戶';
|
||||
@@ -0,0 +1,537 @@
|
||||
<?php
|
||||
/**
|
||||
* The model file of editor module of ZenTaoCMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package editor
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
class editorModel extends model
|
||||
{
|
||||
/**
|
||||
* Get module files, contain control's methods and model's method but except ext.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getModuleFiles($moduleName)
|
||||
{
|
||||
$allModules = array();
|
||||
$modulePath = $this->app->getModulePath('', $moduleName);
|
||||
foreach($this->config->editor->sort as $name)
|
||||
{
|
||||
$moduleFullFile = $modulePath . $name;
|
||||
if($name == 'control.php' or $name == 'model.php')
|
||||
{
|
||||
$allModules[$modulePath][$moduleFullFile] = $this->analysis($moduleFullFile);
|
||||
}
|
||||
elseif(is_dir($moduleFullFile))
|
||||
{
|
||||
$ext = ($name == 'js' or $name == 'css') ? $name : 'php';
|
||||
foreach(glob($moduleFullFile . DS . "*.$ext") as $fileName) $allModules[$modulePath][$moduleFullFile][$fileName] = basename($fileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
$allModules[$modulePath][$moduleFullFile] = $name;
|
||||
}
|
||||
}
|
||||
$allModules += $this->getExtensionFiles($moduleName);
|
||||
return $allModules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get extension files.
|
||||
*
|
||||
* @param int $extPath
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getExtensionFiles($moduleName)
|
||||
{
|
||||
$extensionList = array();
|
||||
foreach($this->config->editor->extSort as $ext)
|
||||
{
|
||||
$extModulePaths = $this->app->getModuleExtPath('', $moduleName, $ext);
|
||||
foreach($extModulePaths as $extType => $extensionFullDir)
|
||||
{
|
||||
if(empty($extensionFullDir) or !is_dir($extensionFullDir)) continue;
|
||||
|
||||
if($extType == 'common') $extType = $this->config->edition;
|
||||
if($ext == 'lang' or $ext == 'js' or $ext == 'css')
|
||||
{
|
||||
$extensionList[$extType][$extensionFullDir] = $this->getTwoGradeFiles($extensionFullDir);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach(glob($extensionFullDir . '*') as $extensionFullFile)
|
||||
{
|
||||
$fileName = basename($extensionFullFile);
|
||||
if($fileName == 'index.html') continue;
|
||||
$extensionList[$extType][$extensionFullDir][$extensionFullFile] = $fileName;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $extensionList;
|
||||
}
|
||||
|
||||
/**
|
||||
* if a directory has two grage, this method will get files
|
||||
*
|
||||
* @param string $extensionFullDir
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getTwoGradeFiles($extensionFullDir)
|
||||
{
|
||||
$fileList = array();
|
||||
$langDirs = scandir($extensionFullDir);
|
||||
foreach($langDirs as $langDir)
|
||||
{
|
||||
if($langDir == '.' or $langDir == '..' or $langDir == '.svn' or $langDir == 'index.html') continue;
|
||||
$langFullDir = $extensionFullDir . $langDir;
|
||||
$fileList[$langFullDir] = array();
|
||||
if(is_dir($langFullDir))
|
||||
{
|
||||
$langFiles = scandir($langFullDir);
|
||||
foreach($langFiles as $langFile)
|
||||
{
|
||||
if($langFile == '.' or $langFile == '..' or $langFile == '.svn' or $langFile == 'index.html') continue;
|
||||
$langFullFile = $langFullDir . DS . $langFile;
|
||||
$fileList[$langFullDir][$langFullFile] = $langFile;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $fileList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Analysis methods of control and model.
|
||||
*
|
||||
* @param string $fileName
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function analysis($fileName)
|
||||
{
|
||||
$classMethod = array();
|
||||
$class = $this->getClassNameByPath($fileName);
|
||||
if(strpos($fileName, 'model.php') !== false) $class .= 'Model';
|
||||
if(!class_exists($class)) include $fileName;
|
||||
$reflection = new ReflectionClass($class);
|
||||
foreach($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method)
|
||||
{
|
||||
$methodName = $method->name;
|
||||
if($method->getFileName() != $fileName) continue;
|
||||
if($methodName == '__construct') continue;
|
||||
$classMethod[$fileName . DS . $methodName] = $methodName;
|
||||
}
|
||||
return $classMethod;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print tree from module files.
|
||||
*
|
||||
* @param int $files
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function printTree($files, $isRoot = true)
|
||||
{
|
||||
if(empty($files) or !is_array($files)) return false;
|
||||
|
||||
$tree = $isRoot ? "<ul id='extendTree' class='tree tree-lines' data-ride='tree'>\n" : "<ul>\n";
|
||||
if($isRoot)
|
||||
{
|
||||
$module = basename(dirname(key($files)));
|
||||
$langFile = dirname(key($files)) . DS . 'lang' . DS . $this->app->getClientLang() . '.php';
|
||||
if(file_exists($langFile))
|
||||
{
|
||||
if(!isset($lang)) $lang = new stdclass();
|
||||
if(!isset($lang->$module)) $lang->$module = new stdclass();
|
||||
include $langFile;
|
||||
}
|
||||
|
||||
$this->module = '';
|
||||
if(isset($lang->$module)) $this->module = $lang->$module;
|
||||
if(empty($this->module) and isset($this->lang->$module)) $this->module = $this->lang->$module;
|
||||
}
|
||||
|
||||
foreach($files as $key => $file)
|
||||
{
|
||||
$tree .= "<li>\n";
|
||||
if(is_array($file))
|
||||
{
|
||||
$tree .= $this->addLink4Dir($key);
|
||||
$tree .= $this->printTree($file, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
$tree .= $this->addLink4File($key, $file);
|
||||
}
|
||||
$tree .= "</li>\n";
|
||||
}
|
||||
$tree .= "</ul>\n";
|
||||
return $tree;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add link for directory or has children grade
|
||||
*
|
||||
* @param string $filePath
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function addLink4Dir($filePath)
|
||||
{
|
||||
$tree = '';
|
||||
$fileName = basename($filePath);
|
||||
$file = "<span title='$fileName'>$fileName</span>";
|
||||
if(isset($this->lang->editor->modules[$fileName])) $file = "<span title='$fileName'>" . $this->lang->editor->modules[$fileName] . '</span>';
|
||||
if(isset($this->lang->editor->translate[$fileName])) $file = "<span title='$fileName'>" . $this->lang->editor->translate[$fileName] . '</span>';
|
||||
|
||||
if(strpos($filePath, DS . 'ext' . DS) !== false)
|
||||
{
|
||||
switch($fileName)
|
||||
{
|
||||
case 'lang': $tree .= $file; break;
|
||||
case 'js': $tree .= "$file " . html::a($this->getExtendLink($filePath, "newJS"), $this->lang->editor->newExtend, 'editWin'); break;
|
||||
case 'css': $tree .= "$file " . html::a($this->getExtendLink($filePath, "newCSS"), $this->lang->editor->newExtend, 'editWin'); break;
|
||||
default: $tree .= "$file " . html::a($this->getExtendLink($filePath, "newExtend"), $this->lang->editor->newExtend, 'editWin');
|
||||
}
|
||||
}
|
||||
elseif($fileName == 'model.php')
|
||||
{
|
||||
$tree .= "$file " . html::a($this->getExtendLink($filePath, 'newMethod'), $this->lang->editor->newMethod, 'editWin');
|
||||
}
|
||||
elseif($fileName == 'control.php')
|
||||
{
|
||||
$tree .= "$file " . html::a(inlink('newPage', "filePath=" . helper::safe64Encode($filePath)), $this->lang->editor->newPage, 'editWin');
|
||||
}
|
||||
else
|
||||
{
|
||||
$tree .= $file;
|
||||
}
|
||||
return $tree;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add link for file
|
||||
*
|
||||
* @param string $filePath
|
||||
* @param string $file
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function addLink4File($filePath, $file)
|
||||
{
|
||||
$tree = '';
|
||||
$file = "<span title='$file'>$file</span>";
|
||||
if(strpos($filePath, DS . 'ext' . DS) !== false)
|
||||
{
|
||||
$tree .= "$file " . html::a($this->getExtendLink($filePath, "edit"), $this->lang->edit, 'editWin');
|
||||
$tree .= html::a(inlink('delete', 'path=' . helper::safe64Encode($filePath)), $this->lang->delete, 'hiddenwin') . "\n";
|
||||
}
|
||||
elseif(basename(dirname($filePath))== 'view')
|
||||
{
|
||||
$tree .= "$file " . html::a($this->getExtendLink($filePath, "override"), $this->lang->editor->override, 'editWin');
|
||||
$tree .= html::a($this->getExtendLink($filePath, "newHook"), $this->lang->editor->newHook, 'editWin') . "\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
$parentDir = basename(dirname($filePath));
|
||||
$action = 'extendOther';
|
||||
if($parentDir == 'control.php') $action = 'extendControl';
|
||||
if($parentDir == 'model.php') $action = 'extendModel';
|
||||
|
||||
$tree .= "$file " . html::a($this->getExtendLink($filePath, $action), $this->lang->editor->extend, 'editWin');
|
||||
if($action != 'extendOther') $tree .= html::a($this->getAPILink($filePath, $action), $this->lang->editor->api, 'editWin');
|
||||
if($parentDir == 'lang') $tree .= html::a($this->getExtendLink($filePath, "new" . str_replace('-', '_', basename($filePath, '.php'))), $this->lang->editor->newLang, 'editWin');
|
||||
if(basename($filePath) == 'config.php') $tree .= html::a($this->getExtendLink($filePath, "newConfig"), $this->lang->editor->newConfig, 'editWin');
|
||||
}
|
||||
return $tree;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get extend link
|
||||
*
|
||||
* @param string $filePath
|
||||
* @param string $action
|
||||
* @param string $isExtends
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getExtendLink($filePath, $action, $isExtends = '')
|
||||
{
|
||||
return inlink('edit', "filePath=" . helper::safe64Encode($filePath) . "&action=$action&isExtends=$isExtends");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get api link.
|
||||
*
|
||||
* @param int $filePath
|
||||
* @param int $action
|
||||
* @param string $type
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getAPILink($filePath, $action)
|
||||
{
|
||||
return helper::createLink('api', 'debug', "filePath=" . helper::safe64Encode($filePath) . "&action=$action");
|
||||
}
|
||||
|
||||
/**
|
||||
* Save file to extension.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function save($filePath)
|
||||
{
|
||||
/* Reduce expiration time for check safe file. */
|
||||
$this->config->safeFileTimeout = 15 * 60;
|
||||
$statusFile = $this->loadModel('common')->checkSafeFile();
|
||||
if($statusFile)
|
||||
{
|
||||
print(js::alert(sprintf($this->lang->editor->noticeOkFile, str_replace('\\', '/', $statusFile))));
|
||||
return false;
|
||||
}
|
||||
|
||||
$dirPath = dirname($filePath);
|
||||
$extFilePath = substr($filePath, 0, strpos($filePath, DS . 'ext' . DS) + 4);
|
||||
if(!is_dir($dirPath) and is_writable($extFilePath)) mkdir($dirPath, 0777, true);
|
||||
if(!is_dir($dirPath) or !is_writable($dirPath)) return print(js::alert($this->lang->editor->notWritable . $extFilePath));
|
||||
if(strpos(strtolower(realpath($dirPath)), strtolower($this->app->getBasePath())) !== 0) return print(js::alert($this->lang->editor->editFileError));
|
||||
|
||||
$fileContent = $this->post->fileContent;
|
||||
$evils = array('eval', 'exec', 'passthru', 'proc_open', 'shell_exec', 'system', '$$', 'include', 'require', 'assert', 'javascript', 'onclick');
|
||||
$gibbedEvils = array('e v a l', 'e x e c', ' p a s s t h r u', ' p r o c _ o p e n', 's h e l l _ e x e c', 's y s t e m', '$ $', 'i n c l u d e', 'r e q u i r e', 'a s s e r t', 'j a v a s c r i p t', 'o n c l i c k');
|
||||
$fileContent = str_ireplace($gibbedEvils, $evils, $fileContent);
|
||||
if(get_magic_quotes_gpc()) $fileContent = stripslashes($fileContent);
|
||||
|
||||
file_put_contents($filePath, $fileContent);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extend model.php and get file content.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function extendModel($filePath)
|
||||
{
|
||||
$className = basename(dirname(dirname($filePath)));
|
||||
if(!class_exists($className)) helper::import(dirname($filePath));
|
||||
|
||||
$methodName = basename($filePath);
|
||||
$methodParam = $this->getParam($className, $methodName, 'Model');
|
||||
return <<<EOD
|
||||
<?php
|
||||
public function $methodName($methodParam)
|
||||
{
|
||||
return parent::$methodName($methodParam);
|
||||
}
|
||||
EOD;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extend control.php and get file content.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function extendControl($filePath, $isExtends)
|
||||
{
|
||||
$className = basename(dirname(dirname($filePath)));
|
||||
if(!class_exists($className)) helper::import(dirname($filePath));
|
||||
|
||||
$methodName = basename($filePath);
|
||||
if($isExtends == 'yes')
|
||||
{
|
||||
$methodParam = $this->getParam($className, $methodName);
|
||||
return <<<EOD
|
||||
<?php
|
||||
helper::importControl('$className');
|
||||
class my$className extends $className
|
||||
{
|
||||
public function $methodName($methodParam)
|
||||
{
|
||||
return parent::$methodName($methodParam);
|
||||
}
|
||||
}
|
||||
EOD;
|
||||
}
|
||||
else
|
||||
{
|
||||
$methodCode = $this->getMethodCode($className, $methodName);
|
||||
return <<<EOD
|
||||
<?php
|
||||
class $className extends control
|
||||
{
|
||||
$methodCode
|
||||
}
|
||||
EOD;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a control method.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function newControl($filePath)
|
||||
{
|
||||
$className = $this->getClassNameByPath($filePath);
|
||||
$methodName = basename($filePath, '.php');
|
||||
return <<<EOD
|
||||
<?php
|
||||
class $className extends control
|
||||
{
|
||||
public function $methodName()
|
||||
{
|
||||
}
|
||||
}
|
||||
EOD;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get method's parameters.
|
||||
*
|
||||
* @param string $className
|
||||
* @param string $methodName
|
||||
* @param string $ext
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getParam($className, $methodName, $ext = '')
|
||||
{
|
||||
$method = new ReflectionMethod($className . $ext, $methodName);
|
||||
$methodParam = '';
|
||||
foreach ($method->getParameters() as $param)
|
||||
{
|
||||
$methodParam .= '$' . $param->getName();
|
||||
if($param->isOptional())
|
||||
{
|
||||
$defaultParam = $param->getDefaultValue();
|
||||
if(is_string($defaultParam)) $methodParam .= "='$defaultParam', ";
|
||||
else $methodParam .= "=$defaultParam, ";
|
||||
}
|
||||
else
|
||||
{
|
||||
$methodParam .= ', ';
|
||||
}
|
||||
}
|
||||
$methodParam = rtrim($methodParam, ', ');
|
||||
return $methodParam;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get method code.
|
||||
*
|
||||
* @param string $className
|
||||
* @param string $methodName
|
||||
* @param string $ext value may be Model
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getMethodCode($className, $methodName, $ext = '')
|
||||
{
|
||||
$method = new ReflectionMethod($className . $ext, $methodName);
|
||||
$fileName = $method->getFileName();
|
||||
$startLine = $method->getStartLine();
|
||||
$endLine = $method->getEndLine();
|
||||
|
||||
$file = file($fileName);
|
||||
$code = '';
|
||||
for($i = $startLine - 1; $i <= $endLine; $i++) $code .= $file[$i];
|
||||
return $code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get save path.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @param string $action
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getSavePath($filePath, $action)
|
||||
{
|
||||
$fileExtension = 'php';
|
||||
$sourceFileName = basename($filePath);
|
||||
if(strpos($sourceFileName, '.') !== false) $fileExtension = substr($sourceFileName, strpos($sourceFileName, '.') + 1);
|
||||
|
||||
$fileName = empty($_POST['fileName']) ? '' : trim($this->post->fileName);
|
||||
$moduleName = $this->getClassNameByPath($filePath);
|
||||
$extPath = $this->app->getExtensionRoot() . 'custom' . DS . $moduleName . DS . 'ext' . DS;
|
||||
if($fileName and (strpos($fileName, '.' . $fileExtension) !== (strlen($fileName) - strlen($fileExtension) - 1))) $fileName .= '.' . $fileExtension;
|
||||
switch($action)
|
||||
{
|
||||
case 'extendModel':
|
||||
$fileName = empty($fileName) ? strtolower(basename($filePath)) . ".{$fileExtension}" : $fileName;
|
||||
return $extPath . 'model' . DS . $fileName;
|
||||
case 'extendControl':
|
||||
$fileName = strtolower(basename($filePath)) . ".{$fileExtension}";
|
||||
return $extPath . 'control' . DS . $fileName;
|
||||
case 'override':
|
||||
$fileName = basename($filePath);
|
||||
return $extPath . 'view' . DS . $fileName;
|
||||
case 'extendOther':
|
||||
$editName = basename($filePath);
|
||||
$fileName = empty($fileName) ? $editName: $fileName;
|
||||
if($editName == 'config.php') return $extPath . 'config' .DS . $fileName;
|
||||
if(strpos($editName, '.php') !== false) return $extPath . 'lang' . DS . basename($editName, ".{$fileExtension}") . DS . $fileName;
|
||||
return $extPath . $fileExtension . DS . basename($editName, ".{$fileExtension}") . DS . $fileName;
|
||||
default:
|
||||
if(empty($fileName)) return print(js::error($this->lang->editor->emptyFileName));
|
||||
|
||||
$action = strtolower(str_replace('new', '', $action));
|
||||
if($action == 'hook') return $extPath . 'view' . DS . $fileName;
|
||||
if($action == 'method') return $extPath . basename($filePath, ".{$fileExtension}") . DS . $fileName;
|
||||
if($action == 'extend') return $filePath . DS . $fileName;
|
||||
if($action == 'config') return $extPath . 'config' . DS . $fileName;
|
||||
if($action == 'js') return $extPath . 'js' . DS . basename($fileName, ".{$fileExtension}") . DS . $fileName;
|
||||
if($action == 'css') return $extPath . 'css' . DS . basename($fileName, ".{$fileExtension}") . DS . $fileName;
|
||||
return $extPath . 'lang' . DS . str_replace('_', '-', $action) . DS . $fileName;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get class name by path.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getClassNameByPath($filePath)
|
||||
{
|
||||
$className = '';
|
||||
if(strpos($filePath, DS . 'module' . DS) !== false)
|
||||
{
|
||||
$className = strstr($filePath, DS . 'module' . DS);
|
||||
$className = substr($className, 0, strpos($className, DS, 9));
|
||||
}
|
||||
elseif(strpos($filePath, DS . 'ext' . DS) !== false)
|
||||
{
|
||||
$className = substr($filePath, 0, strpos($filePath, DS . 'ext' . DS));
|
||||
}
|
||||
elseif(strpos($filePath, DS . 'extension' . DS) !== false)
|
||||
{
|
||||
$className = strstr($filePath, DS . 'extension' . DS);
|
||||
$className = str_replace(DS . 'extension' . DS, '', $className);
|
||||
$className = substr($className, 0, strpos($className, DS, strpos($className, DS) + 1));
|
||||
}
|
||||
$className = basename($className);
|
||||
|
||||
return $className;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
/**
|
||||
* The deny view file of editor module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package editor
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include $app->getModuleRoot() . 'common/view/header.lite.html.php';?>
|
||||
<style>
|
||||
html{height:100%}
|
||||
body{height:100%;padding-bottom:0px;}
|
||||
#mainContent{height:100%}
|
||||
</style>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='alert alert-warning'><?php echo $this->lang->editor->onlyLocalVisit;?></div>
|
||||
</div>
|
||||
<?php include $app->getModuleRoot() . 'common/view/footer.lite.html.php';?>
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
<?php
|
||||
/**
|
||||
* The editor view file of dir module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package editor
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php if(empty($filePath)) die();?>
|
||||
<?php include $app->getModuleRoot() . 'common/view/header.lite.html.php';?>
|
||||
<?php
|
||||
js::set('jsRoot', $jsRoot);
|
||||
js::set('clientLang', $app->clientLang);
|
||||
js::import($jsRoot . 'monaco-editor/min/vs/loader.js');
|
||||
?>
|
||||
<div class='main-header'>
|
||||
<div class='heading'>
|
||||
<i class='icon-edit'></i>
|
||||
<?php if($filePath):?>
|
||||
<strong><?php echo $lang->editor->filePath;?></strong>
|
||||
<code><?php echo $filePath?></code>
|
||||
<?php endif?>
|
||||
</div>
|
||||
</div>
|
||||
<form method='post' target='hiddenwin' action='<?php echo inlink('save', "filePath=$safeFilePath&action=$action")?>'>
|
||||
<table class='table table-form'>
|
||||
<?php if(!empty($showContent)):?>
|
||||
<tr>
|
||||
<td>
|
||||
<?php echo "<span class='strong'>" . $lang->editor->sourceFile . '</span>'?><br />
|
||||
<div id='showContentEditor'></div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif?>
|
||||
<tr>
|
||||
<td>
|
||||
<div id='fileContentEditor'></div>
|
||||
<?php echo html::hidden('fileContent');?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if($action and $action != 'edit' and $action != 'newPage' and $action != 'override' and $action != 'extendControl'):?>
|
||||
<tr id='fileNameBox'>
|
||||
<td>
|
||||
<div class='form-group'>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->editor->fileName;?></span>
|
||||
<?php echo html::input('fileName', '', "class='form-control'");?>
|
||||
<span class='input-group-addon'>
|
||||
<?php
|
||||
if($action == 'newHook')
|
||||
{
|
||||
echo $lang->editor->exampleHook;
|
||||
}
|
||||
elseif($action and $action == 'extendOther' and strpos(basename($filePath), '.js') !== false or $action == 'newJS')
|
||||
{
|
||||
echo $lang->editor->exampleJs;
|
||||
}
|
||||
elseif($action and $action == 'extendOther' and strpos(basename($filePath), '.css') !== false or $action == 'newCSS')
|
||||
{
|
||||
echo $lang->editor->exampleCss;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo $lang->editor->examplePHP;
|
||||
}
|
||||
?>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
<td class='text-center'>
|
||||
<?php echo html::submitButton()?>
|
||||
<?php if($action and $action != 'edit' and $action != 'newPage'):?>
|
||||
<div class='checkbox-primary'>
|
||||
<input type='checkbox' name='override' id='override' />
|
||||
<label for='override'><?php echo $lang->editor->isOverride?></span>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<?php if(!empty($showContent)) js::set('showContent', $showContent);?>
|
||||
<?php js::set('fileContent', $fileContent);?>
|
||||
<?php js::set('language', $fileExtension == 'js' ? 'javascript' : $fileExtension);?>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
fileContentEditor = showContentEditor = null;
|
||||
require.config({
|
||||
paths: {vs: jsRoot + 'monaco-editor/min/vs'},
|
||||
'vs/nls': {
|
||||
availableLanguages:{'*': clientLang}
|
||||
}
|
||||
});
|
||||
require(['vs/editor/editor.main'], function ()
|
||||
{
|
||||
<?php if(!empty($showContent)):?>
|
||||
showContentEditor = monaco.editor.create(document.getElementById('showContentEditor'),
|
||||
{
|
||||
value: showContent.toString(),
|
||||
language: language,
|
||||
readOnly: true,
|
||||
autoIndent: true,
|
||||
contextmenu: true,
|
||||
automaticLayout: true,
|
||||
minimap: {enabled: false}
|
||||
});
|
||||
<?php endif;?>
|
||||
fileContentEditor = monaco.editor.create(document.getElementById('fileContentEditor'),
|
||||
{
|
||||
value: fileContent.toString(),
|
||||
language: language,
|
||||
readOnly: false,
|
||||
autoIndent: true,
|
||||
contextmenu: true,
|
||||
automaticLayout: true,
|
||||
minimap: {enabled: false}
|
||||
});
|
||||
var codeHeight = top.window.innerHeight - 280;
|
||||
if($('#fileNameBox').length == 0) codeHeight += 56;
|
||||
<?php if(!empty($showContent)):?>
|
||||
contentHeight = showContentEditor.getContentHeight();
|
||||
if(contentHeight > 300) contentHeight = 300;
|
||||
if(contentHeight < 200) contentHeight = 200;
|
||||
$('#showContentEditor').height(contentHeight);
|
||||
codeHeight -= contentHeight + 30;
|
||||
if(codeHeight < 300) codeHeight = 300;
|
||||
<?php endif;?>
|
||||
$('#fileContentEditor').height(codeHeight);
|
||||
});
|
||||
$('#submit').click(function()
|
||||
{
|
||||
$('#fileContent').val(fileContentEditor.getValue());
|
||||
})
|
||||
})
|
||||
</script>
|
||||
<?php include $app->getModuleRoot() . 'common/view/footer.lite.html.php';?>
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
/**
|
||||
* The editor view file of dir module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package editor
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include $app->getModuleRoot() . 'common/view/header.lite.html.php';?>
|
||||
<div class='main-header'>
|
||||
<div class='heading'>
|
||||
<i class='icon-list-ul'></i>
|
||||
<strong><?php echo zget($lang->editor->modules, $module, isset($lang->{$module}->common) ? $lang->{$module}->common : $module);?></strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class='main-content'>
|
||||
<?php echo $tree?>
|
||||
</div>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
$('.hitarea').click(function()
|
||||
{
|
||||
var $this = $(this);
|
||||
var parent = $this.parent();
|
||||
if(parent.hasClass('expandable'))
|
||||
{
|
||||
parent.removeClass('expandable').addClass('collapsable');
|
||||
$this.removeClass('expandable-hitarea').addClass('collapsable-hitarea');
|
||||
}
|
||||
else
|
||||
{
|
||||
parent.addClass('expandable').removeClass('collapsable');
|
||||
$this.addClass('expandable-hitarea').removeClass('collapsable-hitarea');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<iframe frameborder='0' name='hiddenwin' id='hiddenwin' scrolling='no' class='hidden'></iframe>
|
||||
<body>
|
||||
</html>
|
||||
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
/**
|
||||
* The editor view file of dir module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package editor
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include $app->getModuleRoot() . 'dev/view/header.html.php';?>
|
||||
<?php if(common::hasPriv('editor', 'switch')):?>
|
||||
<div id='mainMenu' class='clearfix menu-secondary'>
|
||||
<div class="pull-left">
|
||||
<?php
|
||||
echo $lang->editor->turnOff;
|
||||
echo html::a($this->createLink('editor', 'switch', 'status=0'), $lang->dev->switchList['0'], 'hiddenwin', "class='btn btn-sm'");
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div id='mainContent' class='main-row'>
|
||||
<div class='side-col' id='sidebar'>
|
||||
<div class='cell'>
|
||||
<div class='panel panel-sm with-list'>
|
||||
<div class='panel-heading'><i class='icon-list'></i> <strong><?php echo $lang->editor->moduleList?></strong></div>
|
||||
<?php foreach($lang->dev->groupList as $group => $groupName):?>
|
||||
<?php if(!empty($modules[$group])):?>
|
||||
<div class='modulegroup'><?php echo $groupName?></div>
|
||||
<?php foreach($modules[$group] as $module):?>
|
||||
<?php $moduleName = zget($lang->dev->tableList, $module, $module);?>
|
||||
<?php echo html::a(inlink('extend', "moduleDir=$module"), $moduleName, 'extendWin');?>
|
||||
<?php endforeach;?>
|
||||
<?php endif;?>
|
||||
<?php endforeach;?>
|
||||
<?php foreach($lang->dev->endGroupList as $group => $groupName):?>
|
||||
<?php if(!empty($modules[$group])):?>
|
||||
<div class='modulegroup'><?php echo $groupName?></div>
|
||||
<?php foreach($modules[$group] as $module):?>
|
||||
<?php $moduleName = zget($lang->dev->tableList, $module, $module);?>
|
||||
<?php echo html::a(inlink('extend', "moduleDir=$module"), $moduleName, 'extendWin');?>
|
||||
<?php endforeach;?>
|
||||
<?php endif;?>
|
||||
<?php endforeach;?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class='side-col w-350px'>
|
||||
<div class='cell module-col'>
|
||||
<iframe frameborder='0' name='extendWin' id='extendWin' width='100%'></iframe>
|
||||
</div>
|
||||
</div>
|
||||
<div class='main-col main-content'>
|
||||
<iframe frameborder='0' name='editWin' id='editWin' width='100%'></iframe>
|
||||
</div>
|
||||
</div>
|
||||
<?php include $app->getModuleRoot() . 'common/view/footer.html.php';?>
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
/**
|
||||
* The editor view file of dir module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package editor
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include $app->getModuleRoot() . 'common/view/header.lite.html.php';?>
|
||||
<style>body{padding-bottom:0px;background-color:#fff;}</style>
|
||||
<div class='main-header'>
|
||||
<div class='heading'><i class='icon-plus'></i> <strong><?php echo $lang->editor->newPage?></strong></div>
|
||||
</div>
|
||||
<form method='post' target='hiddenwin'>
|
||||
<div class='main-content'>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='w-80px'><?php echo $lang->editor->filePath?></th>
|
||||
<td><code><?php echo $filePath?></code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->editor->pageName?></th>
|
||||
<td>
|
||||
<?php
|
||||
echo html::input('fileName', '', "class='form-control' placeholder='{$lang->editor->examplePHP}'");
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr><td colspan='2' align='center'><?php echo html::submitButton()?></td></tr>
|
||||
</table>
|
||||
</div>
|
||||
</form>
|
||||
<?php include $app->getModuleRoot() . 'common/view/footer.lite.html.php';?>
|
||||
@@ -16,17 +16,17 @@ $lang->execution->id = $lang->executionCommon . ' ID';
|
||||
$lang->execution->type = 'Typ';
|
||||
$lang->execution->name = 'Name';
|
||||
$lang->execution->code = 'Alias';
|
||||
$lang->execution->projectName = 'Project';
|
||||
$lang->execution->project = 'Project';
|
||||
$lang->execution->projectName = $lang->projectCommon;
|
||||
$lang->execution->project = $lang->projectCommon;
|
||||
$lang->execution->execId = "{$lang->execution->common} ID";
|
||||
$lang->execution->execName = 'Execution Name';
|
||||
$lang->execution->execCode = 'Execution Code';
|
||||
$lang->execution->execType = 'Execution Type';
|
||||
$lang->execution->lifetime = 'Project Cycle';
|
||||
$lang->execution->lifetime = $lang->projectCommon . ' Cycle';
|
||||
$lang->execution->attribute = 'Stage Type';
|
||||
$lang->execution->percent = 'Workload %';
|
||||
$lang->execution->milestone = 'Milestone';
|
||||
$lang->execution->parent = 'Project';
|
||||
$lang->execution->parent = $lang->projectCommon;
|
||||
$lang->execution->path = 'Path';
|
||||
$lang->execution->grade = 'Grade';
|
||||
$lang->execution->output = 'Output';
|
||||
@@ -128,7 +128,7 @@ $lang->execution->recent = 'Recent visits: ';
|
||||
$lang->execution->copyNoExecution = 'There are no ' . $lang->executionCommon . 'available to copy.';
|
||||
$lang->execution->noTeam = 'No team members at the moment';
|
||||
$lang->execution->or = ' or ';
|
||||
$lang->execution->selectProject = 'Please select project';
|
||||
$lang->execution->selectProject = 'Please select ' . $lang->projectCommon;
|
||||
$lang->execution->unfoldClosed = 'Unfold Closed';
|
||||
$lang->execution->editName = 'Edit Name';
|
||||
$lang->execution->setWIP = 'WIP Settings';
|
||||
@@ -148,12 +148,12 @@ $lang->execution->estimate = 'estimate';
|
||||
$lang->execution->consumed = 'consumed';
|
||||
$lang->execution->left = 'Left';
|
||||
|
||||
$lang->execution->copyTeamTip = "copy Project/project team members";
|
||||
$lang->execution->copyTeamTip = "copy {$lang->projectCommon}/{$lang->execution->common} team members";
|
||||
$lang->execution->daysGreaterProject = 'Days cannot be greater than days of execution 『%s』';
|
||||
$lang->execution->errorHours = 'Hours/Day cannot be greater than『24』';
|
||||
$lang->execution->agileplusMethodTip = 'When creating executions in an Agile Plus project, both Iteration and Kanban management methods are supported.';
|
||||
$lang->execution->agileplusMethodTip = "When creating executions in an Agile Plus {$lang->projectCommon}, both Iteration and Kanban management methods are supported.";
|
||||
$lang->execution->typeTip = "The sub-stages of other types can be created under the parent stage of the 'mix' type, while the type of other parent-child levels is consistent.";
|
||||
$lang->execution->waterfallTip = 'In the Waterfall project or in the Waterfall + project,';
|
||||
$lang->execution->waterfallTip = "In the Waterfall {$lang->projectCommon} or in the Waterfall + {$lang->projectCommon},";
|
||||
|
||||
$lang->execution->start = 'Start';
|
||||
$lang->execution->activate = 'Aktivieren';
|
||||
@@ -201,11 +201,11 @@ $lang->execution->statusList['suspended'] = 'Ausgesetzt';
|
||||
$lang->execution->statusList['closed'] = 'Geschlossen';
|
||||
|
||||
global $config;
|
||||
$lang->execution->aclList['private'] = 'Private (for team members and project stakeholders)';
|
||||
$lang->execution->aclList['open'] = 'Inherited Project ACL (for who can access the current project)';
|
||||
$lang->execution->aclList['private'] = "Private (for team members and {$lang->projectCommon} stakeholders)";
|
||||
$lang->execution->aclList['open'] = "Inherited {$lang->projectCommon} ACL (for who can access the current {$lang->projectCommon})";
|
||||
|
||||
$lang->execution->kanbanAclList['private'] = 'Private';
|
||||
$lang->execution->kanbanAclList['open'] = 'Inherited Project';
|
||||
$lang->execution->kanbanAclList['open'] = "Inherited {$lang->projectCommon}";
|
||||
|
||||
$lang->execution->storyPoint = 'Story Point';
|
||||
|
||||
@@ -355,7 +355,7 @@ $lang->execution->wbs = "Aufgaben aufteilen";
|
||||
$lang->execution->batchWBS = "Mehrere aufteilen";
|
||||
$lang->execution->howToUpdateBurn = "<a href='https://api.zentao.pm/goto.php?item=burndown' target='_blank' title='Wie wird der Burndown Chart aktualisiert?' class='btn btn-link'>Hilfe <i class='icon icon-help'></i></a>";
|
||||
$lang->execution->whyNoStories = "Keine Story kann verknüpft werden. Bitte prüfen Sie ob ein Story mit {$lang->executionCommon} verknüpft ist {$lang->productCommon} und stellen Sie sicher das diese geprüft ist.";
|
||||
$lang->execution->projectNoStories = "No story can be linked. Please check whether there is any story in project and make sure it has been reviewed.";
|
||||
$lang->execution->projectNoStories = "No story can be linked. Please check whether there is any story in {$lang->projectCommon} and make sure it has been reviewed.";
|
||||
$lang->execution->productStories = "{$lang->executionCommon} verknüpfte Story ist ein Subset von {$lang->productCommon}, welche nur nach überprüfung verknüpft werden kann. Bitte <a href='%s'> Story verknüpfen</a>。";
|
||||
$lang->execution->haveBranchDraft = "There are %s draft stories or not associated with this {$lang->executionCommon} can't be linked.";
|
||||
$lang->execution->haveDraft = "There are %s draft stories with this {$lang->executionCommon} can't be linked.";
|
||||
@@ -376,27 +376,26 @@ $lang->execution->noExecutions = "No {$lang->execution->common}.";
|
||||
$lang->execution->noPrintData = "No data can be printed.";
|
||||
$lang->execution->noMembers = 'Keine Mitglieder. ';
|
||||
$lang->execution->workloadTotal = "The cumulative workload ratio should not exceed 100%s, and the total workload under the current product is: %s";
|
||||
// $lang->execution->linkProjectStoryTip = "(Link {$lang->SRCommon} comes from {$lang->SRCommon} linked under the execution)";
|
||||
$lang->execution->linkAllStoryTip = "({$lang->SRCommon} has never been linked under the project, and can be directly linked with {$lang->SRCommon} of the product linked with the sprint/stage)";
|
||||
$lang->execution->linkAllStoryTip = "({$lang->SRCommon} has never been linked under the {$lang->projectCommon}, and can be directly linked with {$lang->SRCommon} of the product linked with the sprint/stage)";
|
||||
$lang->execution->copyTeamTitle = "Choose a {$lang->project->common} or {$lang->execution->common} Team to copy.";
|
||||
|
||||
/* Interactive prompts. */
|
||||
$lang->execution->confirmDelete = "Möchten Sie {$lang->executionCommon}[%s] löschen?";
|
||||
$lang->execution->confirmUnlinkMember = "Möchten Sie den Benutzer vom {$lang->executionCommon} entfernen?";
|
||||
$lang->execution->confirmUnlinkStory = "After {$lang->SRCommon} is removed, cased linked to {$lang->SRCommon} will be reomoved and tasks linked to {$lang->SRCommon} will be cancelled. Do you want to continue?";
|
||||
$lang->execution->confirmSync = "After modifying the project, in order to maintain the consistency of data, the data of products, requirements, teams and whitelist associated with the implementation will be synchronized to the new project. Please know.";
|
||||
$lang->execution->confirmUnlinkExecutionStory = "Do you want to unlink this Story from the project?";
|
||||
$lang->execution->notAllowedUnlinkStory = "This {$lang->SRCommon} is linked to the {$lang->executionCommon} of the project. Remove it from the {$lang->executionCommon}, then try again.";
|
||||
$lang->execution->confirmSync = "After modifying the {$lang->projectCommon}, in order to maintain the consistency of data, the data of products, requirements, teams and whitelist associated with the implementation will be synchronized to the new {$lang->projectCommon}. Please know.";
|
||||
$lang->execution->confirmUnlinkExecutionStory = "Do you want to unlink this Story from the {$lang->projectCommon}?";
|
||||
$lang->execution->notAllowedUnlinkStory = "This {$lang->SRCommon} is linked to the {$lang->executionCommon} of the {$lang->projectCommon}. Remove it from the {$lang->executionCommon}, then try again.";
|
||||
$lang->execution->notAllowRemoveProducts = "The story of this product is linked with the {$lang->executionCommon}. Unlink it before doing any action.";
|
||||
$lang->execution->errorNoLinkedProducts = "Kein verknüpftes {$lang->productCommon} in {$lang->executionCommon} gefunden. Sie werden auf die {$lang->productCommon} Seite geleitet.";
|
||||
$lang->execution->errorSameProducts = "{$lang->executionCommon} Kann nicht mit mehreren identischen {$lang->productCommon} verknüpft werden";
|
||||
$lang->execution->errorSameBranches = "{$lang->executionCommon} cannot be linked to the same branch twice";
|
||||
$lang->execution->errorBegin = "The start time of {$lang->executionCommon} cannot be less than the start time of the project %s.";
|
||||
$lang->execution->errorEnd = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the project.";
|
||||
$lang->execution->errorLetterProject = "The start time of {$lang->executionCommon} cannot be less than the start time of the project %s.";
|
||||
$lang->execution->errorGreaterProject = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the project.";
|
||||
$lang->execution->errorCommonBegin = 'The start date of ' . $lang->executionCommon . ' should be ≥ the start date of project : %s.';
|
||||
$lang->execution->errorCommonEnd = 'The deadline of ' . $lang->executionCommon . ' should be ≤ the deadline of project : %s.';
|
||||
$lang->execution->errorBegin = "The start time of {$lang->executionCommon} cannot be less than the start time of the {$lang->projectCommon} %s.";
|
||||
$lang->execution->errorEnd = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the {$lang->projectCommon}.";
|
||||
$lang->execution->errorLetterProject = "The start time of {$lang->executionCommon} cannot be less than the start time of the {$lang->projectCommon} %s.";
|
||||
$lang->execution->errorGreaterProject = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the {$lang->projectCommon}.";
|
||||
$lang->execution->errorCommonBegin = "The start date of ' . $lang->executionCommon . ' should be ≥ the start date of {$lang->projectCommon} : %s.";
|
||||
$lang->execution->errorCommonEnd = "The deadline of ' . $lang->executionCommon . ' should be ≤ the deadline of {$lang->projectCommon} : %s.";
|
||||
$lang->execution->errorLetterParent = 'The begin cannot be less than the begin of the parent stage to which it belongs: %s.';
|
||||
$lang->execution->errorGreaterParent = 'The end cannot be greater than the end of the parent stage to which it belongs:%s.';
|
||||
$lang->execution->errorNameRepeat = "Child %s of the same parent stage cannot have the same name.";
|
||||
@@ -419,7 +418,7 @@ $lang->execution->fixFirstWithLeft = 'Modify the left';
|
||||
$lang->execution->unfinishedExecution = "This {$lang->executionCommon} has ";
|
||||
$lang->execution->unfinishedTask = "[%s] unfinished tasks. ";
|
||||
$lang->execution->unresolvedBug = "[%s] unresolved bugs. ";
|
||||
$lang->execution->projectNotEmpty = 'Project cannot be empty.';
|
||||
$lang->execution->projectNotEmpty = "{$lang->projectCommon} cannot be empty.";
|
||||
$lang->execution->confirmStoryToTask = $lang->SRCommon . '%s are converted to tasks in the current. Do you want to convert them anyways?';
|
||||
$lang->execution->ge = "『%s』should be >= actual begin『%s』.";
|
||||
$lang->execution->storyDragError = "The {$lang->SRCommon} is not active. Please activate and drag again.";
|
||||
@@ -540,7 +539,7 @@ $lang->execution->featureBar['bug']['unresolved'] = 'Active';
|
||||
$lang->execution->featureBar['build']['all'] = 'Build List';
|
||||
|
||||
$lang->execution->myExecutions = 'Ich bin beteiligt.';
|
||||
$lang->execution->doingProject = 'Laufende Projekte';
|
||||
$lang->execution->doingProject = "Ongoing {$lang->projectCommon}s";
|
||||
|
||||
$lang->execution->kanbanColType['wait'] = $lang->execution->statusList['wait'] . ' ' . $lang->execution->common;
|
||||
$lang->execution->kanbanColType['doing'] = $lang->execution->statusList['doing'] . ' ' . $lang->execution->common;
|
||||
@@ -642,3 +641,11 @@ $lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F
|
||||
|
||||
$lang->execution->linkBranchStoryByPlanTips = "When a scheduled association requirement is executed, only the active requirements associated with the %s of this execution are imported.";
|
||||
$lang->execution->linkNormalStoryByPlanTips = "Only the active requirements are imported when the scheduled requirements are associated.";
|
||||
|
||||
$lang->execution->featureBar['dynamic']['all'] = 'All';
|
||||
$lang->execution->featureBar['dynamic']['today'] = 'Today';
|
||||
$lang->execution->featureBar['dynamic']['yesterday'] = 'Yesterday';
|
||||
$lang->execution->featureBar['dynamic']['thisWeek'] = 'This Week';
|
||||
$lang->execution->featureBar['dynamic']['lastWeek'] = 'Last Week';
|
||||
$lang->execution->featureBar['dynamic']['thisMonth'] = 'This Month';
|
||||
$lang->execution->featureBar['dynamic']['lastMonth'] = 'Last Month';
|
||||
|
||||
@@ -16,17 +16,17 @@ $lang->execution->id = $lang->executionCommon . ' ID';
|
||||
$lang->execution->type = $lang->executionCommon . ' Type';
|
||||
$lang->execution->name = "{$lang->executionCommon} Name";
|
||||
$lang->execution->code = "{$lang->executionCommon} Code";
|
||||
$lang->execution->projectName = 'Project';
|
||||
$lang->execution->project = 'Project';
|
||||
$lang->execution->projectName = $lang->projectCommon;
|
||||
$lang->execution->project = $lang->projectCommon;
|
||||
$lang->execution->execId = "{$lang->execution->common} ID";
|
||||
$lang->execution->execName = "{$lang->execution->common} Name";
|
||||
$lang->execution->execCode = "{$lang->execution->common} Code";
|
||||
$lang->execution->execType = 'Execution Type';
|
||||
$lang->execution->lifetime = 'Project Cycle';
|
||||
$lang->execution->lifetime = $lang->projectCommon . ' Cycle';
|
||||
$lang->execution->attribute = 'Stage Type';
|
||||
$lang->execution->percent = 'Workload %';
|
||||
$lang->execution->milestone = 'Milestone';
|
||||
$lang->execution->parent = 'Project';
|
||||
$lang->execution->parent = $lang->projectCommon;
|
||||
$lang->execution->path = 'Path';
|
||||
$lang->execution->grade = 'Grade';
|
||||
$lang->execution->output = 'Output';
|
||||
@@ -128,7 +128,7 @@ $lang->execution->recent = 'Recent visits: ';
|
||||
$lang->execution->copyNoExecution = 'There are no ' . $lang->executionCommon . 'available to copy.';
|
||||
$lang->execution->noTeam = 'No team members at the moment';
|
||||
$lang->execution->or = ' or ';
|
||||
$lang->execution->selectProject = 'Please select project';
|
||||
$lang->execution->selectProject = 'Please select ' . $lang->projectCommon;
|
||||
$lang->execution->unfoldClosed = 'Unfold Closed';
|
||||
$lang->execution->editName = 'Edit Name';
|
||||
$lang->execution->setWIP = 'WIP Settings';
|
||||
@@ -148,12 +148,12 @@ $lang->execution->estimate = 'Estimate';
|
||||
$lang->execution->consumed = 'Consumed';
|
||||
$lang->execution->left = 'Left';
|
||||
|
||||
$lang->execution->copyTeamTip = "copy Project/project team members";
|
||||
$lang->execution->copyTeamTip = "copy {$lang->projectCommon}/{$lang->execution->common} team members";
|
||||
$lang->execution->daysGreaterProject = 'Days cannot be greater than days of execution 『%s』';
|
||||
$lang->execution->errorHours = 'Hours/Day cannot be greater than『24』';
|
||||
$lang->execution->agileplusMethodTip = 'When creating executions in an Agile Plus project, both Iteration and Kanban management methods are supported.';
|
||||
$lang->execution->agileplusMethodTip = "When creating executions in an Agile Plus {$lang->projectCommon}, both Iteration and Kanban management methods are supported.";
|
||||
$lang->execution->typeTip = "The sub-stages of other types can be created under the parent stage of the 'mix' type, while the type of other parent-child levels is consistent.";
|
||||
$lang->execution->waterfallTip = 'In the Waterfall project or in the Waterfall + project,';
|
||||
$lang->execution->waterfallTip = "In the Waterfall {$lang->projectCommon} or in the Waterfall + {$lang->projectCommon},";
|
||||
|
||||
$lang->execution->start = 'Start';
|
||||
$lang->execution->activate = 'Activate';
|
||||
@@ -201,11 +201,11 @@ $lang->execution->statusList['suspended'] = 'Suspended';
|
||||
$lang->execution->statusList['closed'] = 'Closed';
|
||||
|
||||
global $config;
|
||||
$lang->execution->aclList['private'] = 'Private (for team members and project stakeholders)';
|
||||
$lang->execution->aclList['open'] = 'Inherited Project ACL (for who can access the current project)';
|
||||
$lang->execution->aclList['private'] = "Private (for team members and {$lang->projectCommon} stakeholders)";
|
||||
$lang->execution->aclList['open'] = "Inherited {$lang->projectCommon} ACL (for who can access the current {$lang->projectCommon})";
|
||||
|
||||
$lang->execution->kanbanAclList['private'] = 'Private';
|
||||
$lang->execution->kanbanAclList['open'] = 'Inherited Project';
|
||||
$lang->execution->kanbanAclList['open'] = "Inherited {$lang->projectCommon}";
|
||||
|
||||
$lang->execution->storyPoint = 'Story Point';
|
||||
|
||||
@@ -355,7 +355,7 @@ $lang->execution->wbs = "Create Task";
|
||||
$lang->execution->batchWBS = "Batch Create Tasks";
|
||||
$lang->execution->howToUpdateBurn = "<a href='https://api.zentao.pm/goto.php?item=burndown' target='_blank' title='How to update the Burndown Chart?' class='btn btn-link'>Help <i class='icon icon-help'></i></a>";
|
||||
$lang->execution->whyNoStories = "No story can be linked. Please check whether there is any story in {$lang->executionCommon} which is linked to {$lang->productCommon} and make sure it has been reviewed.";
|
||||
$lang->execution->projectNoStories = "No story can be linked. Please check whether there is any story in project and make sure it has been reviewed.";
|
||||
$lang->execution->projectNoStories = "No story can be linked. Please check whether there is any story in {$lang->projectCommon} and make sure it has been reviewed.";
|
||||
$lang->execution->productStories = "Stories linked to {$lang->executionCommon} are the subeset of stories linked to {$lang->productCommon}. Stories can only be linked after they pass the review. <a href='%s'> Link Stories</a> now.";
|
||||
$lang->execution->haveBranchDraft = "There are %s draft stories or not associated with this {$lang->executionCommon} can't be linked.";
|
||||
$lang->execution->haveDraft = "There are %s draft stories with this {$lang->executionCommon} can't be linked.";
|
||||
@@ -376,27 +376,26 @@ $lang->execution->noExecutions = "No {$lang->execution->common}.";
|
||||
$lang->execution->noPrintData = "No data can be printed.";
|
||||
$lang->execution->noMembers = 'No team members yet. ';
|
||||
$lang->execution->workloadTotal = "The cumulative workload ratio should not exceed 100%s, and the total workload under the current product is: %s";
|
||||
// $lang->execution->linkProjectStoryTip = "(Link {$lang->SRCommon} comes from {$lang->SRCommon} linked under the execution)";
|
||||
$lang->execution->linkAllStoryTip = "({$lang->SRCommon} has never been linked under the execution, and can be directly linked with {$lang->SRCommon} of the product linked with the sprint/stage)";
|
||||
$lang->execution->linkAllStoryTip = "({$lang->SRCommon} has never been linked under the {$lang->projectCommon}, and can be directly linked with {$lang->SRCommon} of the product linked with the sprint/stage)";
|
||||
$lang->execution->copyTeamTitle = "Choose a {$lang->project->common} or {$lang->execution->common} Team to copy.";
|
||||
|
||||
/* Interactive prompts. */
|
||||
$lang->execution->confirmDelete = "Do you want to delete the {$lang->executionCommon}[%s]?";
|
||||
$lang->execution->confirmUnlinkMember = "Do you want to unlink this User from {$lang->executionCommon}?";
|
||||
$lang->execution->confirmUnlinkStory = "After {$lang->SRCommon} is removed, cased linked to {$lang->SRCommon} will be reomoved and tasks linked to {$lang->SRCommon} will be cancelled. Do you want to continue?";
|
||||
$lang->execution->confirmSync = "After modifying the project, in order to maintain the consistency of data, the data of products, requirements, teams and whitelist associated with the implementation will be synchronized to the new project. Please know.";
|
||||
$lang->execution->confirmUnlinkExecutionStory = "Do you want to unlink this Story from the execution?";
|
||||
$lang->execution->notAllowedUnlinkStory = "This {$lang->SRCommon} is linked to the {$lang->executionCommon} of the execution. Remove it from the {$lang->executionCommon}, then try again.";
|
||||
$lang->execution->confirmSync = "After modifying the {$lang->projectCommon}, in order to maintain the consistency of data, the data of products, requirements, teams and whitelist associated with the implementation will be synchronized to the new {$lang->projectCommon}. Please know.";
|
||||
$lang->execution->confirmUnlinkExecutionStory = "Do you want to unlink this Story from the {$lang->projectCommon}?";
|
||||
$lang->execution->notAllowedUnlinkStory = "This {$lang->SRCommon} is linked to the {$lang->executionCommon} of the {$lang->projectCommon}. Remove it from the {$lang->executionCommon}, then try again.";
|
||||
$lang->execution->notAllowRemoveProducts = "The story %s of this product is linked with the {$lang->executionCommon}. Unlink it before doing any action.";
|
||||
$lang->execution->errorNoLinkedProducts = "No {$lang->productCommon} is linked to {$lang->executionCommon}. You will be directed to {$lang->productCommon} page to link one.";
|
||||
$lang->execution->errorSameProducts = "{$lang->executionCommon} cannot be linked to the same {$lang->productCommon} twice.";
|
||||
$lang->execution->errorSameBranches = "{$lang->executionCommon} cannot be linked to the same branch twice";
|
||||
$lang->execution->errorBegin = "The start time of {$lang->executionCommon} cannot be less than the start time of the project %s.";
|
||||
$lang->execution->errorEnd = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the project.";
|
||||
$lang->execution->errorLetterProject = "The start time of {$lang->executionCommon} cannot be less than the start time of the project %s.";
|
||||
$lang->execution->errorGreaterProject = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the project.";
|
||||
$lang->execution->errorCommonBegin = 'The start date of ' . $lang->executionCommon . ' should be ≥ the start date of project : %s.';
|
||||
$lang->execution->errorCommonEnd = 'The deadline of ' . $lang->executionCommon . ' should be ≤ the deadline of project : %s.';
|
||||
$lang->execution->errorBegin = "The start time of {$lang->executionCommon} cannot be less than the start time of the {$lang->projectCommon} %s.";
|
||||
$lang->execution->errorEnd = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the {$lang->projectCommon}.";
|
||||
$lang->execution->errorLetterProject = "The start time of {$lang->executionCommon} cannot be less than the start time of the {$lang->projectCommon} %s.";
|
||||
$lang->execution->errorGreaterProject = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the {$lang->projectCommon}.";
|
||||
$lang->execution->errorCommonBegin = "The start date of ' . $lang->executionCommon . ' should be ≥ the start date of {$lang->projectCommon} : %s.";
|
||||
$lang->execution->errorCommonEnd = "The deadline of ' . $lang->executionCommon . ' should be ≤ the deadline of {$lang->projectCommon} : %s.";
|
||||
$lang->execution->errorLetterParent = 'The begin cannot be less than the begin of the parent stage to which it belongs: %s.';
|
||||
$lang->execution->errorGreaterParent = 'The end cannot be greater than the end of the parent stage to which it belongs:%s.';
|
||||
$lang->execution->errorNameRepeat = "Child %s of the same parent stage cannot have the same name.";
|
||||
@@ -419,7 +418,7 @@ $lang->execution->fixFirstWithLeft = 'Update hours left too';
|
||||
$lang->execution->unfinishedExecution = "This {$lang->executionCommon} has ";
|
||||
$lang->execution->unfinishedTask = "[%s] unfinished tasks. ";
|
||||
$lang->execution->unresolvedBug = "[%s] unresolved bugs. ";
|
||||
$lang->execution->projectNotEmpty = 'Project cannot be empty.';
|
||||
$lang->execution->projectNotEmpty = "{$lang->projectCommon} cannot be empty.";
|
||||
$lang->execution->confirmStoryToTask = $lang->SRCommon . '%s are converted to tasks in the current. Do you want to convert them anyways?';
|
||||
$lang->execution->ge = "『%s』should be >= actual begin『%s』.";
|
||||
$lang->execution->storyDragError = "The {$lang->SRCommon} is not active. Please activate and drag again.";
|
||||
@@ -540,7 +539,7 @@ $lang->execution->featureBar['bug']['unresolved'] = 'Active';
|
||||
$lang->execution->featureBar['build']['all'] = 'Build List';
|
||||
|
||||
$lang->execution->myExecutions = 'Mine';
|
||||
$lang->execution->doingProject = 'Ongoing Projects';
|
||||
$lang->execution->doingProject = "Ongoing {$lang->projectCommon}s";
|
||||
|
||||
$lang->execution->kanbanColType['wait'] = $lang->execution->statusList['wait'] . ' ' . $lang->execution->common;
|
||||
$lang->execution->kanbanColType['doing'] = $lang->execution->statusList['doing'] . ' ' . $lang->execution->common;
|
||||
@@ -642,3 +641,11 @@ $lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F
|
||||
|
||||
$lang->execution->linkBranchStoryByPlanTips = "When a scheduled association requirement is executed, only the active requirements associated with the %s of this execution are imported.";
|
||||
$lang->execution->linkNormalStoryByPlanTips = "Only the active requirements are imported when the scheduled requirements are associated.";
|
||||
|
||||
$lang->execution->featureBar['dynamic']['all'] = 'All';
|
||||
$lang->execution->featureBar['dynamic']['today'] = 'Today';
|
||||
$lang->execution->featureBar['dynamic']['yesterday'] = 'Yesterday';
|
||||
$lang->execution->featureBar['dynamic']['thisWeek'] = 'This Week';
|
||||
$lang->execution->featureBar['dynamic']['lastWeek'] = 'Last Week';
|
||||
$lang->execution->featureBar['dynamic']['thisMonth'] = 'This Month';
|
||||
$lang->execution->featureBar['dynamic']['lastMonth'] = 'Last Month';
|
||||
|
||||
@@ -22,11 +22,11 @@ $lang->execution->execId = "{$lang->execution->common} ID";
|
||||
$lang->execution->execName = 'Execution Name';
|
||||
$lang->execution->execCode = 'Execution Code';
|
||||
$lang->execution->execType = 'Execution Type';
|
||||
$lang->execution->lifetime = 'Project Cycle';
|
||||
$lang->execution->lifetime = $lang->projectCommon . ' Cycle';
|
||||
$lang->execution->attribute = 'Stage Type';
|
||||
$lang->execution->percent = 'Workload %';
|
||||
$lang->execution->milestone = 'Milestone';
|
||||
$lang->execution->parent = 'Project';
|
||||
$lang->execution->parent = $lang->projectCommon;
|
||||
$lang->execution->path = 'Path';
|
||||
$lang->execution->grade = 'Grade';
|
||||
$lang->execution->output = 'Output';
|
||||
@@ -128,7 +128,7 @@ $lang->execution->recent = 'Recent visits: ';
|
||||
$lang->execution->copyNoExecution = 'There are no ' . $lang->executionCommon . 'available to copy.';
|
||||
$lang->execution->noTeam = 'No team members at the moment';
|
||||
$lang->execution->or = ' or ';
|
||||
$lang->execution->selectProject = 'Please select project';
|
||||
$lang->execution->selectProject = 'Please select ' . $lang->projectCommon;
|
||||
$lang->execution->unfoldClosed = 'Unfold Closed';
|
||||
$lang->execution->editName = 'Edit Name';
|
||||
$lang->execution->setWIP = 'WIP Settings';
|
||||
@@ -148,12 +148,12 @@ $lang->execution->estimate = 'estimate';
|
||||
$lang->execution->consumed = 'consumed';
|
||||
$lang->execution->left = 'Left';
|
||||
|
||||
$lang->execution->copyTeamTip = "copy Project/project team members";
|
||||
$lang->execution->copyTeamTip = "copy {$lang->projectCommon}/{$lang->execution->common} team members";
|
||||
$lang->execution->daysGreaterProject = 'Days cannot be greater than days of execution 『%s』';
|
||||
$lang->execution->errorHours = 'Hours/Day cannot be greater than『24』';
|
||||
$lang->execution->agileplusMethodTip = 'When creating executions in an Agile Plus project, both Iteration and Kanban management methods are supported.';
|
||||
$lang->execution->agileplusMethodTip = "When creating executions in an Agile Plus {$lang->projectCommon}, both Iteration and Kanban management methods are supported.";
|
||||
$lang->execution->typeTip = "The sub-stages of other types can be created under the parent stage of the 'mix' type, while the type of other parent-child levels is consistent.";
|
||||
$lang->execution->waterfallTip = 'In the Waterfall project or in the Waterfall + project,';
|
||||
$lang->execution->waterfallTip = "In the Waterfall {$lang->projectCommon} or in the Waterfall + {$lang->projectCommon},";
|
||||
|
||||
$lang->execution->start = 'Démarrer';
|
||||
$lang->execution->activate = 'Activer';
|
||||
@@ -201,11 +201,11 @@ $lang->execution->statusList['suspended'] = 'Suspendu';
|
||||
$lang->execution->statusList['closed'] = 'Fermé';
|
||||
|
||||
global $config;
|
||||
$lang->execution->aclList['private'] = 'Private (for team members and project stakeholders)';
|
||||
$lang->execution->aclList['open'] = 'Inherited Project ACL (for who can access the current project)';
|
||||
$lang->execution->aclList['private'] = "Private (for team members and {$lang->projectCommon} stakeholders)";
|
||||
$lang->execution->aclList['open'] = "Inherited {$lang->projectCommon} ACL (for who can access the current {$lang->projectCommon})";
|
||||
|
||||
$lang->execution->kanbanAclList['private'] = 'Private';
|
||||
$lang->execution->kanbanAclList['open'] = 'Inherited Project';
|
||||
$lang->execution->kanbanAclList['open'] = "Inherited {$lang->projectCommon}";
|
||||
|
||||
$lang->execution->storyPoint = 'Story Point';
|
||||
|
||||
@@ -355,7 +355,7 @@ $lang->execution->wbs = "Créer Tâche";
|
||||
$lang->execution->batchWBS = "Créer Tâche en lot";
|
||||
$lang->execution->howToUpdateBurn = "<a href='https://api.zentao.pm/goto.php?item=burndown' target='_blank' title='Comment mettre à jour le Graphe d´atterrissage ?' class='btn btn-link'>Mise à jour <i class='icon icon-help'></i></a>";
|
||||
$lang->execution->whyNoStories = "Aucune story ne peut être associée. Vérifiez s'il existe des stories dans {$lang->executionCommon} qui sont associées à {$lang->productCommon} et vérifiez qu'elles ont bien été validées.";
|
||||
$lang->execution->projectNoStories = "No story can be linked. Please check whether there is any story in project and make sure it has been reviewed.";
|
||||
$lang->execution->projectNoStories = "No story can be linked. Please check whether there is any story in {$lang->projectCommon} and make sure it has been reviewed.";
|
||||
$lang->execution->productStories = "Les stories associées au {$lang->executionCommon} sont une portion des stories associées au {$lang->productCommon}. Les stories ne peuvent être associées à un {$lang->executionCommon} qu'après avoir été validées. <a href='%s'> Associer Stories</a> maintenant.";
|
||||
$lang->execution->haveBranchDraft = "There are %s draft stories or not associated with this {$lang->executionCommon} can't be linked.";
|
||||
$lang->execution->haveDraft = "There are %s draft stories with this {$lang->executionCommon} can't be linked.";
|
||||
@@ -376,27 +376,26 @@ $lang->execution->noExecutions = "Aucun {$lang->execution->common}.";
|
||||
$lang->execution->noPrintData = "No data can be printed.";
|
||||
$lang->execution->noMembers = "Actuellement il n'y a aucun membre dans l'équipe. On ne va pas aller loin... ";
|
||||
$lang->execution->workloadTotal = "The cumulative workload ratio should not exceed 100%s, and the total workload under the current product is: %s";
|
||||
// $lang->execution->linkProjectStoryTip = "(Link {$lang->SRCommon} comes from {$lang->SRCommon} linked under the execution)";
|
||||
$lang->execution->linkAllStoryTip = "({$lang->SRCommon} has never been linked under the project, and can be directly linked with {$lang->SRCommon} of the product linked with the sprint/stage)";
|
||||
$lang->execution->linkAllStoryTip = "({$lang->SRCommon} has never been linked under the {$lang->projectCommon}, and can be directly linked with {$lang->SRCommon} of the product linked with the sprint/stage)";
|
||||
$lang->execution->copyTeamTitle = "Choose a {$lang->project->common} or {$lang->execution->common} Team to copy.";
|
||||
|
||||
/* Interactive prompts. */
|
||||
$lang->execution->confirmDelete = "Voulez-vous réellement supprimer le {$lang->executionCommon}[%s] ?";
|
||||
$lang->execution->confirmUnlinkMember = "Voulez-vous retirer cet utilisateur du {$lang->executionCommon} ?";
|
||||
$lang->execution->confirmUnlinkStory = "After {$lang->SRCommon} is removed, cased linked to {$lang->SRCommon} will be reomoved and tasks linked to {$lang->SRCommon} will be cancelled. Do you want to continue?";
|
||||
$lang->execution->confirmSync = "After modifying the project, in order to maintain the consistency of data, the data of products, requirements, teams and whitelist associated with the implementation will be synchronized to the new project. Please know.";
|
||||
$lang->execution->confirmUnlinkExecutionStory = "Do you want to unlink this Story from the project?";
|
||||
$lang->execution->notAllowedUnlinkStory = "This {$lang->SRCommon} is linked to the {$lang->executionCommon} of the project. Remove it from the {$lang->executionCommon}, then try again.";
|
||||
$lang->execution->confirmSync = "After modifying the {$lang->projectCommon}, in order to maintain the consistency of data, the data of products, requirements, teams and whitelist associated with the implementation will be synchronized to the new {$lang->projectCommon}. Please know.";
|
||||
$lang->execution->confirmUnlinkExecutionStory = "Do you want to unlink this Story from the {$lang->projectCommon}?";
|
||||
$lang->execution->notAllowedUnlinkStory = "This {$lang->SRCommon} is linked to the {$lang->executionCommon} of the {$lang->projectCommon}. Remove it from the {$lang->executionCommon}, then try again.";
|
||||
$lang->execution->notAllowRemoveProducts = "The story of this product is linked with the {$lang->executionCommon}. Unlink it before doing any action.";
|
||||
$lang->execution->errorNoLinkedProducts = "Aucun {$lang->productCommon} n'est associé à ce {$lang->executionCommon}. Vous allez être redirigé vers la page {$lang->productCommon} pour en associer un.";
|
||||
$lang->execution->errorSameProducts = "Ce {$lang->executionCommon} ne peut pas être associé deux fois au même {$lang->productCommon}. Imaginez un peu les résultats !";
|
||||
$lang->execution->errorSameBranches = "{$lang->executionCommon} cannot be linked to the same branch twice";
|
||||
$lang->execution->errorBegin = "The start time of {$lang->executionCommon} cannot be less than the start time of the project %s.";
|
||||
$lang->execution->errorEnd = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the project.";
|
||||
$lang->execution->errorLetterProject = "The start time of {$lang->executionCommon} cannot be less than the start time of the project %s.";
|
||||
$lang->execution->errorGreaterProject = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the project.";
|
||||
$lang->execution->errorCommonBegin = 'The start date of ' . $lang->executionCommon . ' should be ≥ the start date of project : %s.';
|
||||
$lang->execution->errorCommonEnd = 'The deadline of ' . $lang->executionCommon . ' should be ≤ the deadline of project : %s.';
|
||||
$lang->execution->errorBegin = "The start time of {$lang->executionCommon} cannot be less than the start time of the {$lang->projectCommon} %s.";
|
||||
$lang->execution->errorEnd = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the {$lang->projectCommon}.";
|
||||
$lang->execution->errorLetterProject = "The start time of {$lang->executionCommon} cannot be less than the start time of the {$lang->projectCommon} %s.";
|
||||
$lang->execution->errorGreaterProject = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the {$lang->projectCommon}.";
|
||||
$lang->execution->errorCommonBegin = "The start date of ' . $lang->executionCommon . ' should be ≥ the start date of {$lang->projectCommon} : %s.";
|
||||
$lang->execution->errorCommonEnd = "The deadline of ' . $lang->executionCommon . ' should be ≤ the deadline of {$lang->projectCommon} : %s.";
|
||||
$lang->execution->errorLetterParent = 'The begin cannot be less than the begin of the parent stage to which it belongs: %s.';
|
||||
$lang->execution->errorGreaterParent = 'The end cannot be greater than the end of the parent stage to which it belongs:%s.';
|
||||
$lang->execution->errorNameRepeat = "Child %s of the same parent stage cannot have the same name.";
|
||||
@@ -419,7 +418,7 @@ $lang->execution->fixFirstWithLeft = 'Mettre à jour les heures éga
|
||||
$lang->execution->unfinishedExecution = "This {$lang->executionCommon} has ";
|
||||
$lang->execution->unfinishedTask = "[%s] unfinished tasks. ";
|
||||
$lang->execution->unresolvedBug = "[%s] unresolved bugs. ";
|
||||
$lang->execution->projectNotEmpty = 'Project cannot be empty.';
|
||||
$lang->execution->projectNotEmpty = "{$lang->projectCommon} cannot be empty.";
|
||||
$lang->execution->confirmStoryToTask = $lang->SRCommon . '%s are converted to tasks in the current. Do you want to convert them anyways?';
|
||||
$lang->execution->ge = "『%s』should be >= actual begin『%s』.";
|
||||
$lang->execution->storyDragError = "The {$lang->SRCommon} is not active. Please activate and drag again.";
|
||||
@@ -540,7 +539,7 @@ $lang->execution->featureBar['bug']['unresolved'] = 'Active';
|
||||
$lang->execution->featureBar['build']['all'] = 'Build List';
|
||||
|
||||
$lang->execution->myExecutions = "J'étais impliqué";
|
||||
$lang->execution->doingProject = 'Projets en cours';
|
||||
$lang->execution->doingProject = "Ongoing {$lang->projectCommon}s";
|
||||
|
||||
$lang->execution->kanbanColType['wait'] = $lang->execution->statusList['wait'] . ' ' . $lang->execution->common;
|
||||
$lang->execution->kanbanColType['doing'] = $lang->execution->statusList['doing'] . ' ' . $lang->execution->common;
|
||||
@@ -642,3 +641,11 @@ $lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F
|
||||
|
||||
$lang->execution->linkBranchStoryByPlanTips = "When a scheduled association requirement is executed, only the active requirements associated with the %s of this execution are imported.";
|
||||
$lang->execution->linkNormalStoryByPlanTips = "Only the active requirements are imported when the scheduled requirements are associated.";
|
||||
|
||||
$lang->execution->featureBar['dynamic']['all'] = 'All';
|
||||
$lang->execution->featureBar['dynamic']['today'] = 'Today';
|
||||
$lang->execution->featureBar['dynamic']['yesterday'] = 'Yesterday';
|
||||
$lang->execution->featureBar['dynamic']['thisWeek'] = 'This Week';
|
||||
$lang->execution->featureBar['dynamic']['lastWeek'] = 'Last Week';
|
||||
$lang->execution->featureBar['dynamic']['thisMonth'] = 'This Month';
|
||||
$lang->execution->featureBar['dynamic']['lastMonth'] = 'Last Month';
|
||||
|
||||
@@ -16,17 +16,17 @@ $lang->execution->id = $lang->executionCommon . '编号';
|
||||
$lang->execution->type = $lang->executionCommon . '类型';
|
||||
$lang->execution->name = $lang->executionCommon . '名称';
|
||||
$lang->execution->code = $lang->executionCommon . '代号';
|
||||
$lang->execution->projectName = '所属项目';
|
||||
$lang->execution->project = '所属项目';
|
||||
$lang->execution->projectName = '所属' . $lang->projectCommon;
|
||||
$lang->execution->project = '所属' . $lang->projectCommon;
|
||||
$lang->execution->execId = "{$lang->execution->common}编号";
|
||||
$lang->execution->execName = "{$lang->execution->common}名称";
|
||||
$lang->execution->execCode = "{$lang->execution->common}代号";
|
||||
$lang->execution->execType = "{$lang->execution->common}类型";
|
||||
$lang->execution->lifetime = '项目周期';
|
||||
$lang->execution->lifetime = $lang->projectCommon . '周期';
|
||||
$lang->execution->attribute = '阶段类型';
|
||||
$lang->execution->percent = '工作量占比';
|
||||
$lang->execution->milestone = '里程碑';
|
||||
$lang->execution->parent = '所属项目';
|
||||
$lang->execution->parent = '所属' . $lang->projectCommon;
|
||||
$lang->execution->path = '路径';
|
||||
$lang->execution->grade = '层级';
|
||||
$lang->execution->output = '输出';
|
||||
@@ -128,7 +128,7 @@ $lang->execution->recent = '近期访问:';
|
||||
$lang->execution->copyNoExecution = '没有可用的' . $lang->executionCommon . '来复制';
|
||||
$lang->execution->noTeam = '暂时没有团队成员';
|
||||
$lang->execution->or = '或';
|
||||
$lang->execution->selectProject = '请选择项目';
|
||||
$lang->execution->selectProject = '请选择' . $lang->projectCommon;
|
||||
$lang->execution->unfoldClosed = '展开已结束';
|
||||
$lang->execution->editName = '编辑名称';
|
||||
$lang->execution->setWIP = '在制品数量设置(WIP)';
|
||||
@@ -138,7 +138,7 @@ $lang->execution->batchCreateTask = '批量建任务';
|
||||
$lang->execution->kanbanNoLinkProduct = "看板没有关联{$lang->productCommon}";
|
||||
$lang->execution->myTask = "我的任务";
|
||||
$lang->execution->list = '列表';
|
||||
$lang->execution->allProject = '全部项目';
|
||||
$lang->execution->allProject = '全部' . $lang->projectCommon;
|
||||
$lang->execution->method = '管理方法';
|
||||
$lang->execution->sameAsParent = "同父阶段";
|
||||
|
||||
@@ -148,12 +148,12 @@ $lang->execution->estimate = '预计';
|
||||
$lang->execution->consumed = '消耗';
|
||||
$lang->execution->left = '剩余';
|
||||
|
||||
$lang->execution->copyTeamTip = "可以选择复制项目或{$lang->execution->common}团队的成员";
|
||||
$lang->execution->copyTeamTip = "可以选择复制{$lang->projectCommon}或{$lang->execution->common}团队的成员";
|
||||
$lang->execution->daysGreaterProject = '可用工日不能大于执行的可用工日『%s』';
|
||||
$lang->execution->errorHours = '可用工时/天不能大于『24』';
|
||||
$lang->execution->agileplusMethodTip = '融合敏捷项目创建执行时,支持迭代和看板两种管理方法。';
|
||||
$lang->execution->agileplusMethodTip = "融合敏捷{$lang->projectCommon}创建执行时,支持迭代和看板两种管理方法。";
|
||||
$lang->execution->typeTip = '“综合”类型的父阶段可以创建其它类型的子级,其它父子层级的类型均一致。';
|
||||
$lang->execution->waterfallTip = '瀑布项目和融合瀑布项目中,';
|
||||
$lang->execution->waterfallTip = "瀑布{$lang->projectCommon}和融合瀑布{$lang->projectCommon}中,";
|
||||
|
||||
$lang->execution->start = "开始";
|
||||
$lang->execution->activate = "激活";
|
||||
@@ -201,11 +201,11 @@ $lang->execution->statusList['suspended'] = '已挂起';
|
||||
$lang->execution->statusList['closed'] = '已关闭';
|
||||
|
||||
global $config;
|
||||
$lang->execution->aclList['private'] = "私有(团队成员和项目负责人、干系人可访问)";
|
||||
$lang->execution->aclList['open'] = "继承项目访问权限(能访问当前项目,即可访问)";
|
||||
$lang->execution->aclList['private'] = "私有(团队成员和{$lang->projectCommon}负责人、干系人可访问)";
|
||||
$lang->execution->aclList['open'] = "继承{$lang->projectCommon}访问权限(能访问当前{$lang->projectCommon},即可访问)";
|
||||
|
||||
$lang->execution->kanbanAclList['private'] = '私有';
|
||||
$lang->execution->kanbanAclList['open'] = '继承项目';
|
||||
$lang->execution->kanbanAclList['open'] = "继承{$lang->projectCommon}";
|
||||
|
||||
$lang->execution->storyPoint = '故事点';
|
||||
|
||||
@@ -355,7 +355,7 @@ $lang->execution->wbs = "分解任务";
|
||||
$lang->execution->batchWBS = "批量分解";
|
||||
$lang->execution->howToUpdateBurn = "<a href='https://api.zentao.net/goto.php?item=burndown&lang=zh-cn' target='_blank' title='如何更新燃尽图?' class='btn btn-link'>帮助 <i class='icon icon-help'></i></a>";
|
||||
$lang->execution->whyNoStories = "看起来没有{$lang->SRCommon}可以关联。请检查下{$lang->executionCommon}关联的{$lang->productCommon}中有没有{$lang->SRCommon},而且要确保它们已经审核通过。";
|
||||
$lang->execution->projectNoStories = "看起来没有{$lang->SRCommon}可以关联。请检查下项目中有没有{$lang->SRCommon},而且要确保它们已经审核通过。";
|
||||
$lang->execution->projectNoStories = "看起来没有{$lang->SRCommon}可以关联。请检查下{$lang->projectCommon}中有没有{$lang->SRCommon},而且要确保它们已经审核通过。";
|
||||
$lang->execution->productStories = "{$lang->executionCommon}关联的{$lang->SRCommon}是{$lang->productCommon}{$lang->SRCommon}的子集,并且只有评审通过的{$lang->SRCommon}才能关联。请<a href='%s'>关联{$lang->SRCommon}</a>。";
|
||||
$lang->execution->haveBranchDraft = "导入完成!有%s条非激活状态或不是{$lang->executionCommon}关联分支的{$lang->SRCommon}无法导入";
|
||||
$lang->execution->haveDraft = "导入完成!有%s条非激活状态的{$lang->SRCommon}无法导入";
|
||||
@@ -376,27 +376,26 @@ $lang->execution->noExecutions = "暂时没有{$lang->execution->common}
|
||||
$lang->execution->noPrintData = "暂无数据可打印";
|
||||
$lang->execution->noMembers = '暂时没有团队成员。';
|
||||
$lang->execution->workloadTotal = "工作量占比累计不应当超过100%s, 当前产品下的工作量之和为%s";
|
||||
// $lang->execution->linkProjectStoryTip = "(关联{$lang->SRCommon}来源于项目下所关联的{$lang->SRCommon})";
|
||||
$lang->execution->linkAllStoryTip = "(项目下还未关联{$lang->SRCommon},可直接关联该{$lang->execution->common}所关联产品的{$lang->SRCommon})";
|
||||
$lang->execution->linkAllStoryTip = "({$lang->projectCommon}下还未关联{$lang->SRCommon},可直接关联该{$lang->execution->common}所关联产品的{$lang->SRCommon})";
|
||||
$lang->execution->copyTeamTitle = "选择一个{$lang->project->common}或{$lang->execution->common}团队";
|
||||
|
||||
/* 交互提示。*/
|
||||
$lang->execution->confirmDelete = "您确定删除{$lang->executionCommon}[%s]吗?";
|
||||
$lang->execution->confirmUnlinkMember = "您确定从该{$lang->executionCommon}中移除该用户吗?";
|
||||
$lang->execution->confirmUnlinkStory = "移除该{$lang->SRCommon}后,该{$lang->SRCommon}关联的用例将被移除,该{$lang->SRCommon}关联的任务将被取消,请确认。";
|
||||
$lang->execution->confirmSync = "修改所属项目后,为了保持数据的一致性,该执行所关联的产品、需求、团队和白名单数据将会同步到新的项目中,请知悉。";
|
||||
$lang->execution->confirmUnlinkExecutionStory = "您确定从该项目中移除该{$lang->SRCommon}吗?";
|
||||
$lang->execution->notAllowedUnlinkStory = "该{$lang->SRCommon}已经与项目下{$lang->executionCommon}相关联,请从{$lang->executionCommon}中移除后再操作。";
|
||||
$lang->execution->confirmSync = "修改所属{$lang->projectCommon}后,为了保持数据的一致性,该执行所关联的产品、需求、团队和白名单数据将会同步到新的{$lang->projectCommon}中,请知悉。";
|
||||
$lang->execution->confirmUnlinkExecutionStory = "您确定从该{$lang->projectCommon}中移除该{$lang->SRCommon}吗?";
|
||||
$lang->execution->notAllowedUnlinkStory = "该{$lang->SRCommon}已经与{$lang->projectCommon}下{$lang->executionCommon}相关联,请从{$lang->executionCommon}中移除后再操作。";
|
||||
$lang->execution->notAllowRemoveProducts = "该{$lang->productCommon}中的{$lang->SRCommon}%s已与该{$lang->executionCommon}进行了关联,请取消关联后再操作。";
|
||||
$lang->execution->errorNoLinkedProducts = "该{$lang->executionCommon}没有关联的{$lang->productCommon},系统将转到{$lang->productCommon}关联页面";
|
||||
$lang->execution->errorSameProducts = "{$lang->executionCommon}不能关联多个相同的{$lang->productCommon}。";
|
||||
$lang->execution->errorSameBranches = "{$lang->executionCommon}不能关联多个相同的分支。";
|
||||
$lang->execution->errorBegin = "{$lang->executionCommon}的开始时间不能小于所属项目的开始时间%s。";
|
||||
$lang->execution->errorEnd = "{$lang->executionCommon}的截止时间不能大于所属项目的结束时间%s。";
|
||||
$lang->execution->errorLetterProject = "{$lang->executionCommon}的计划开始时间不能小于所属项目的计划开始时间%s。";
|
||||
$lang->execution->errorGreaterProject = "{$lang->executionCommon}的计划完成时间不能大于所属项目的计划完成时间%s。";
|
||||
$lang->execution->errorCommonBegin = $lang->executionCommon . '开始日期应大于等于项目的开始日期:%s。';
|
||||
$lang->execution->errorCommonEnd = $lang->executionCommon . '截止日期应小于等于项目的截止日期:%s。';
|
||||
$lang->execution->errorBegin = "{$lang->executionCommon}的开始时间不能小于所属{$lang->projectCommon}的开始时间%s。";
|
||||
$lang->execution->errorEnd = "{$lang->executionCommon}的截止时间不能大于所属{$lang->projectCommon}的结束时间%s。";
|
||||
$lang->execution->errorLetterProject = "{$lang->executionCommon}的计划开始时间不能小于所属{$lang->projectCommon}的计划开始时间%s。";
|
||||
$lang->execution->errorGreaterProject = "{$lang->executionCommon}的计划完成时间不能大于所属{$lang->projectCommon}的计划完成时间%s。";
|
||||
$lang->execution->errorCommonBegin = $lang->executionCommon . '开始日期应大于等于{$lang->projectCommon}的开始日期:%s。';
|
||||
$lang->execution->errorCommonEnd = $lang->executionCommon . '截止日期应小于等于{$lang->projectCommon}的截止日期:%s。';
|
||||
$lang->execution->errorLetterParent = '计划开始时间不能小于所属父阶段的计划开始时间:%s。';
|
||||
$lang->execution->errorGreaterParent = '计划完成时间不能大于所属父阶段的计划完成时间:%s。';
|
||||
$lang->execution->errorNameRepeat = "相同父阶段的子%s名称不能相同";
|
||||
@@ -419,7 +418,7 @@ $lang->execution->fixFirstWithLeft = '修改剩余工时';
|
||||
$lang->execution->unfinishedExecution = "该{$lang->executionCommon}下还有";
|
||||
$lang->execution->unfinishedTask = "[%s]个未完成的任务,";
|
||||
$lang->execution->unresolvedBug = "[%s]个未解决的bug,";
|
||||
$lang->execution->projectNotEmpty = '所属项目不能为空。';
|
||||
$lang->execution->projectNotEmpty = "所属{$lang->projectCommon}不能为空。";
|
||||
$lang->execution->confirmStoryToTask = '%s' . $lang->SRCommon . '已经在当前' . $lang->execution->common . '中转了任务,请确认是否重复转任务。';
|
||||
$lang->execution->ge = "『%s』应当不小于实际开始时间『%s』。";
|
||||
$lang->execution->storyDragError = "该{$lang->SRCommon}不是激活状态,请激活后再拖动";
|
||||
@@ -540,7 +539,7 @@ $lang->execution->featureBar['bug']['unresolved'] = '未解决';
|
||||
$lang->execution->featureBar['build']['all'] = '全部版本';
|
||||
|
||||
$lang->execution->myExecutions = '我参与的';
|
||||
$lang->execution->doingProject = '进行中的项目';
|
||||
$lang->execution->doingProject = "进行中的{$lang->projectCommon}";
|
||||
|
||||
$lang->execution->kanbanColType['wait'] = $lang->execution->statusList['wait'] . '的' . $lang->execution->common;
|
||||
$lang->execution->kanbanColType['doing'] = $lang->execution->statusList['doing'] . '的' . $lang->execution->common;
|
||||
@@ -642,3 +641,11 @@ $lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F
|
||||
|
||||
$lang->execution->linkBranchStoryByPlanTips = "执行按计划关联需求时,只导入本执行所关联%s的激活状态的需求。";
|
||||
$lang->execution->linkNormalStoryByPlanTips = "执行按计划关联需求时,只导入激活状态的需求。";
|
||||
|
||||
$lang->execution->featureBar['dynamic']['all'] = '全部';
|
||||
$lang->execution->featureBar['dynamic']['today'] = '今天';
|
||||
$lang->execution->featureBar['dynamic']['yesterday'] = '昨天';
|
||||
$lang->execution->featureBar['dynamic']['thisWeek'] = '本周';
|
||||
$lang->execution->featureBar['dynamic']['lastWeek'] = '上周';
|
||||
$lang->execution->featureBar['dynamic']['thisMonth'] = '本月';
|
||||
$lang->execution->featureBar['dynamic']['lastMonth'] = '上月';
|
||||
|
||||
@@ -384,7 +384,7 @@ class executionModel extends model
|
||||
$type = 'sprint';
|
||||
if($project) $type = zget($this->config->execution->modelList, $project->model, 'sprint');
|
||||
|
||||
if($project->model == 'waterfall' or $project->model == 'waterfallplus')
|
||||
if(($project->model == 'waterfall' or $project->model == 'waterfallplus') and isset($this->config->setPercent) and $this->config->setPercent == 1)
|
||||
{
|
||||
$this->checkWorkload('create', $_POST['percent'], $project);
|
||||
if(dao::isError()) return false;
|
||||
@@ -433,7 +433,7 @@ class executionModel extends model
|
||||
}
|
||||
|
||||
/* Check the workload format and total. */
|
||||
if(!empty($sprint->percent)) $this->checkWorkload('create', $sprint->percent, $sprint->project);
|
||||
if(!empty($sprint->percent) and isset($this->config->setPercent) and $this->config->setPercent == 1) $this->checkWorkload('create', $sprint->percent, $sprint->project);
|
||||
|
||||
/* Set planDuration and realDuration. */
|
||||
if($this->config->edition == 'max')
|
||||
@@ -622,7 +622,7 @@ class executionModel extends model
|
||||
$execution = $this->loadModel('file')->processImgURL($execution, $this->config->execution->editor->edit['id'], $this->post->uid);
|
||||
|
||||
/* Check the workload format and total. */
|
||||
if(!empty($execution->percent)) $this->checkWorkload('update', $execution->percent, $oldExecution);
|
||||
if(!empty($execution->percent) and isset($this->config->setPercent) and $this->config->setPercent == 1) $this->checkWorkload('update', $execution->percent, $oldExecution);
|
||||
|
||||
/* Set planDuration and realDuration. */
|
||||
if($this->config->edition == 'max')
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
<td class='muted' colspan='2'><div id='lifeTimeTips'><?php echo $lang->execution->typeDesc;?></div></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<?php if($isStage):?>
|
||||
<?php if($isStage and isset($config->setPercent) and $config->setPercent == 1):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->stage->percent;?></th>
|
||||
<td class='required'>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php foreach($lang->action->periods as $period => $label):?>
|
||||
<?php foreach($lang->execution->featureBar['dynamic'] as $period => $label):?>
|
||||
<?php
|
||||
$label = "<span class='text'>$label</span>";
|
||||
$active = '';
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if($execution->type == 'stage'):?>
|
||||
<?php if($execution->type == 'stage' and isset($config->setPercent) and $config->setPercent == 1):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->stage->percent;?></th>
|
||||
<td>
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<?php echo html::a(inlink('grouptask', "executionID=$executionID&groupBy=$groupBy&filter=$filterKey"), $name, '', "class='btn btn-link $active'");?>
|
||||
<?php endforeach;?>
|
||||
<?php else:?>
|
||||
<?php echo html::a(inlink('grouptask', "executionID=$executionID&groupBy=$groupBy"), "<span class='text'>{$lang->execution->featureBar['task']['all']}</span> <span class='label label-light label-badge'>{$allCount}</span>", '', "class='btn btn-link btn-active-text'");?>
|
||||
<?php echo html::a(inlink('grouptask', "executionID=$executionID&groupBy=$groupBy"), "<span class='text'>{$lang->all}</span> <span class='label label-light label-badge'>{$allCount}</span>", '', "class='btn btn-link btn-active-text'");?>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<div class="btn-toolbar pull-right">
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php echo html::a(inlink('testcase', "executionID=$executionID&productID=$productID&branchID=$branchID&type=$type&moduleID=$moduleID&orderBy=$orderBy"), "<span class='text'>{$lang->execution->featureBar['all']['all']}</span> <span class='label label-light label-badge'>{$pager->recTotal}</span>", '', "class='btn btn-link btn-active-text'");?>
|
||||
<?php echo html::a(inlink('testcase', "executionID=$executionID&productID=$productID&branchID=$branchID&type=$type&moduleID=$moduleID&orderBy=$orderBy"), "<span class='text'>{$lang->all}</span> <span class='label label-light label-badge'>{$pager->recTotal}</span>", '', "class='btn btn-link btn-active-text'");?>
|
||||
</div>
|
||||
<div class="btn-toolbar pull-right">
|
||||
<?php if(common::canModify('execution', $execution)) echo html::a(helper::createLink('testcase', 'create', "productID=$productID&branch=0&moduleID=0&from=execution¶m=$execution->id", '', '', '', true), "<i class='icon icon-plus'></i> " . $lang->testcase->create, '', "class='btn btn-primary' data-app='{$this->app->tab}'");?>
|
||||
|
||||
@@ -69,13 +69,14 @@ $lang->moduleOrder[195] = 'misc';
|
||||
$lang->moduleOrder[200] = 'backup';
|
||||
$lang->moduleOrder[205] = 'cron';
|
||||
$lang->moduleOrder[210] = 'dev';
|
||||
$lang->moduleOrder[215] = 'message';
|
||||
$lang->moduleOrder[220] = 'gitlab';
|
||||
$lang->moduleOrder[225] = 'mr';
|
||||
$lang->moduleOrder[230] = 'app';
|
||||
$lang->moduleOrder[235] = 'gogs';
|
||||
$lang->moduleOrder[240] = 'gitea';
|
||||
$lang->moduleOrder[245] = 'holiday';
|
||||
$lang->moduleOrder[215] = 'editor';
|
||||
$lang->moduleOrder[220] = 'message';
|
||||
$lang->moduleOrder[225] = 'gitlab';
|
||||
$lang->moduleOrder[230] = 'mr';
|
||||
$lang->moduleOrder[235] = 'app';
|
||||
$lang->moduleOrder[240] = 'gogs';
|
||||
$lang->moduleOrder[245] = 'gitea';
|
||||
$lang->moduleOrder[250] = 'holiday';
|
||||
|
||||
$lang->resource = new stdclass();
|
||||
|
||||
@@ -1445,6 +1446,7 @@ $lang->resource->custom->deleteStoryConcept = 'deleteStoryConcept';
|
||||
$lang->resource->custom->kanban = 'kanban';
|
||||
$lang->resource->custom->code = 'code';
|
||||
$lang->resource->custom->hours = 'hours';
|
||||
$lang->resource->custom->percent = 'percent';
|
||||
|
||||
$lang->custom->methodOrder[5] = 'index';
|
||||
$lang->custom->methodOrder[10] = 'set';
|
||||
@@ -1463,6 +1465,7 @@ $lang->custom->methodOrder[70] = 'deleteStoryConcept';
|
||||
$lang->custom->methodOrder[75] = 'kanban';
|
||||
$lang->custom->methodOrder[80] = 'code';
|
||||
$lang->custom->methodOrder[85] = 'hours';
|
||||
$lang->custom->methodOrder[90] = 'percent';
|
||||
|
||||
$lang->resource->datatable = new stdclass();
|
||||
$lang->resource->datatable->setGlobal = 'setGlobal';
|
||||
@@ -1998,13 +2001,26 @@ $lang->cron->methodOrder[35] = 'openProcess';
|
||||
$lang->resource->dev = new stdclass();
|
||||
$lang->resource->dev->api = 'api';
|
||||
$lang->resource->dev->db = 'db';
|
||||
$lang->resource->dev->editor = 'editor';
|
||||
$lang->resource->dev->translate = 'translate';
|
||||
|
||||
$lang->dev->methodOrder[5] = 'api';
|
||||
$lang->dev->methodOrder[10] = 'db';
|
||||
$lang->dev->methodOrder[15] = 'editor';
|
||||
$lang->dev->methodOrder[20] = 'translate';
|
||||
$lang->dev->methodOrder[15] = 'translate';
|
||||
|
||||
$lang->resource->editor = new stdclass();
|
||||
$lang->resource->editor->index = 'index';
|
||||
$lang->resource->editor->extend = 'extend';
|
||||
$lang->resource->editor->edit = 'edit';
|
||||
$lang->resource->editor->newPage = 'newPage';
|
||||
$lang->resource->editor->save = 'save';
|
||||
$lang->resource->editor->delete = 'delete';
|
||||
|
||||
$lang->editor->methodOrder[5] = 'index';
|
||||
$lang->editor->methodOrder[10] = 'extend';
|
||||
$lang->editor->methodOrder[15] = 'edit';
|
||||
$lang->editor->methodOrder[20] = 'newPage';
|
||||
$lang->editor->methodOrder[25] = 'save';
|
||||
$lang->editor->methodOrder[30] = 'delete';
|
||||
|
||||
global $config;
|
||||
$inUpgrade = (defined('IN_UPGRADE') and IN_UPGRADE);
|
||||
|
||||
@@ -100,3 +100,6 @@ $lang->job->pipelineVariables = "Variables";
|
||||
$lang->job->pipelineVariablesKeyPlaceHolder = "Input variable key";
|
||||
$lang->job->pipelineVariablesValuePlaceHolder = "Input variable value";
|
||||
$lang->job->pipelineVariablesTips = "Specify variable values to be used in this run. The values specified in CI/CD settings will be used by default.";
|
||||
|
||||
$lang->job->featureBar['browse']['job'] = 'List';
|
||||
$lang->job->featureBar['browse']['compile'] = 'History';
|
||||
|
||||
@@ -100,3 +100,6 @@ $lang->job->pipelineVariables = "Variables";
|
||||
$lang->job->pipelineVariablesKeyPlaceHolder = "Input variable key";
|
||||
$lang->job->pipelineVariablesValuePlaceHolder = "Input variable value";
|
||||
$lang->job->pipelineVariablesTips = "Specify variable values to be used in this run. The values specified in CI/CD settings will be used by default.";
|
||||
|
||||
$lang->job->featureBar['browse']['job'] = 'List';
|
||||
$lang->job->featureBar['browse']['compile'] = 'History';
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user