Merge branch 'master' of github.com:easysoft/zentaopms

This commit is contained in:
wangyidong
2019-07-08 14:15:40 +08:00
17 changed files with 291 additions and 51 deletions
+1 -1
View File
@@ -1599,8 +1599,8 @@ class baseRouter
$moduleName = isset($_GET[$this->config->moduleVar]) ? strtolower($_GET[$this->config->moduleVar]) : $this->config->default->module;
$methodName = isset($_GET[$this->config->methodVar]) ? strtolower($_GET[$this->config->methodVar]) : $this->config->default->method;
$this->setModuleName($moduleName);
$this->setControlFile();
$this->setMethodName($methodName);
$this->setControlFile();
}
/**
+61
View File
@@ -20,6 +20,67 @@
include dirname(__FILE__) . '/base/control.class.php';
class control extends baseControl
{
/**
* 加载指定模块的model文件。
* Load the model file of one module.
*
* Extension: set appName as empty.
*
* @param string $moduleName 模块名,如果为空,使用当前模块。The module name, if empty, use current module's name.
* @param string $appName The app name, if empty, use current app's name.
* @access public
* @return object|bool 如果没有model文件,返回false,否则返回model对象。If no model file, return false, else return the model object.
*/
public function loadModel($moduleName = '', $appName = '')
{
$appName = '';
if(empty($moduleName)) $moduleName = $this->moduleName;
if(empty($appName)) $appName = $this->appName;
global $loadedModels;
if(isset($loadedModels[$appName][$moduleName]))
{
$this->$moduleName = $loadedModels[$appName][$moduleName];
$this->dao = $this->$moduleName->dao;
return $this->$moduleName;
}
$modelFile = $this->app->setModelFile($moduleName, $appName);
/**
* 如果没有model文件,尝试加载config配置信息。
* If no model file, try load config.
*/
if(!helper::import($modelFile))
{
$this->app->loadModuleConfig($moduleName, $appName);
$this->app->loadLang($moduleName, $appName);
$this->dao = new dao();
return false;
}
/**
* 如果没有扩展文件,model类名是$moduleName + 'model',如果有扩展,还需要增加ext前缀。
* If no extension file, model class name is $moduleName + 'model', else with 'ext' as the prefix.
*/
$modelClass = class_exists('ext' . $appName . $moduleName. 'model') ? 'ext' . $appName . $moduleName . 'model' : $appName . $moduleName . 'model';
if(!class_exists($modelClass))
{
$modelClass = class_exists('ext' . $moduleName. 'model') ? 'ext' . $moduleName . 'model' : $moduleName . 'model';
if(!class_exists($modelClass)) $this->app->triggerError(" The model $modelClass not found", __FILE__, __LINE__, $exit = true);
}
/**
* 初始化model对象,在control对象中可以通过$this->$moduleName来引用。同时将dao对象赋为control对象的成员变量,方便引用。
* Init the model object thus you can try $this->$moduleName to access it. Also assign the $dao object as a member of control object.
*/
$loadedModels[$appName][$moduleName] = new $modelClass($appName);
$this->$moduleName = $loadedModels[$appName][$moduleName];
$this->dao = $this->$moduleName->dao;
return $this->$moduleName;
}
/**
* 设置视图文件:主视图文件,扩展视图文件, 站点扩展视图文件,以及钩子脚本。
* Set view files: the main file, extension view file, site extension view file and hook files.
+42 -1
View File
@@ -20,10 +20,51 @@
include dirname(__FILE__) . '/base/model.class.php';
class model extends baseModel
{
/**
* 加载一个模块的model。加载完成后,使用$this->$moduleName来访问这个model对象。
* 比如:loadModel('user')引入user模块的model实例对象,可以通过$this->user来访问它。
*
* Load the model of one module. After loaded, can use $this->$moduleName to visit the model object.
*
* Extension: set appName as empty.
*
* @param string $moduleName
* @access public
* @return object|bool the model object or false if model file not exists.
*/
public function loadModel($moduleName, $appName = '')
{
$appName = '';
if(empty($moduleName)) return false;
if(empty($appName)) $appName = $this->appName;
global $loadedModels;
if(isset($loadedModels[$appName][$moduleName]))
{
$this->$moduleName = $loadedModels[$appName][$moduleName];
return $this->$moduleName;
}
$modelFile = $this->app->setModelFile($moduleName, $appName);
if(!helper::import($modelFile)) return false;
$modelClass = class_exists('ext' . $appName . $moduleName. 'model') ? 'ext' . $appName . $moduleName . 'model' : $appName . $moduleName . 'model';
if(!class_exists($modelClass))
{
$modelClass = class_exists('ext' . $moduleName. 'model') ? 'ext' . $moduleName . 'model' : $moduleName . 'model';
if(!class_exists($modelClass)) $this->app->triggerError(" The model $modelClass not found", __FILE__, __LINE__, $exit = true);
}
$loadedModels[$appName][$moduleName] = new $modelClass($appName);
$this->$moduleName = $loadedModels[$appName][$moduleName];
return $this->$moduleName;
}
/**
* 删除记录
* Delete one record.
*
*
* @param string $table the table name
* @param string $id the id value of the record to be deleted
* @access public
+146 -10
View File
@@ -20,6 +20,24 @@
include dirname(__FILE__) . '/base/router.class.php';
class router extends baseRouter
{
/**
* 工作流模块名。
* The module name of a flow.
*
* @var string
* @access public
*/
public $workflowModule;
/**
* 工作流方法名。
* The method name of a flow.
*
* @var string
* @access public
*/
public $workflowMethod;
/**
* Add custom langs when set client lang.
*
@@ -38,7 +56,7 @@ class router extends baseRouter
/**
* 加载语言文件,返回全局$lang对象。
* Load lang and return it as the global lang object.
*
*
* @param string $moduleName the module name
* @param string $appName the app name
* @access public
@@ -49,6 +67,8 @@ class router extends baseRouter
global $lang;
if(!is_object($lang)) $lang = new language();
$appName = '';
/* Set productCommon and projectCommon for flow. */
if($moduleName == 'common')
{
@@ -123,11 +143,11 @@ class router extends baseRouter
/**
* Save error info.
*
* @param int $level
* @param string $message
* @param string $file
* @param int $line
*
* @param int $level
* @param string $message
* @param string $file
* @param int $line
* @access public
* @return void
*/
@@ -141,22 +161,83 @@ class router extends baseRouter
parent::saveError($level, $message, $file, $line);
}
/**
* 加载模块的config文件,返回全局$config对象。
* 如果该模块是common,加载$configRoot的配置文件,其他模块则加载其模块的配置文件。
*
* Load config and return it as the global config object.
* If the module is common, search in $configRoot, else in $modulePath.
*
* Extension: set appName as empty.
*
* @param string $moduleName module name
* @param string $appName app name
* @param bool $exitIfNone exit or not
* @access public
* @return object|bool the config object or false.
*/
public function loadModuleConfig($moduleName, $appName = '')
{
global $config;
$appName = '';
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 and !empty($extConfigPath['common'])) $commonExtConfigFiles = helper::ls($extConfigPath['common'], '.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);
/* 加载每一个配置文件。Load every config file. */
static $loadedConfigs = array();
foreach($configFiles as $configFile)
{
if(in_array($configFile, $loadedConfigs)) continue;
if(file_exists($configFile)) include $configFile;
$loadedConfigs[] = $configFile;
}
/* 加载数据库中与本模块相关的配置项。Merge from the db configs. */
if($moduleName != 'common')
{
if(isset($config->system->$moduleName)) $this->mergeConfig($config->system->$moduleName, $moduleName);
if(isset($config->personal->$moduleName)) $this->mergeConfig($config->personal->$moduleName, $moduleName);
}
}
/**
* Alias load module config.
*
* @param string $moduleName
* @param string $appName
*
* Extension: set appName as empty.
*
* @param string $moduleName
* @param string $appName
* @access public
* @return void
*/
public function loadConfig($moduleName, $appName = '')
{
$appName = '';
return parent::loadModuleConfig($moduleName, $appName);
}
/**
* Export config.
*
*
* @access public
* @return void
*/
@@ -173,6 +254,46 @@ class router extends baseRouter
echo json_encode($view);
}
/**
* 设置要被调用的控制器文件。
* Set the control file of the module to be called.
*
* Extension: If the module and method is defined in workflow, run workflow engine.
*
* @param bool $exitIfNone 没有找到该控制器文件的情况:如果该参数为true,则终止程序;如果为false,则打印错误日志
* If control file not foundde, how to do. True, die the whole app. false, log error.
* @access public
* @return bool
*/
public function setControlFile($exitIfNone = true)
{
/* If the module and method is defined in workflow, run workflow engine. */
if(defined('TABLE_WORKFLOW'))
{
$flow = $this->dbh->query("SELECT * FROM " . TABLE_WORKFLOW . " WHERE `module` = '$this->moduleName'")->fetch();
if($flow)
{
$action = $this->dbh->query("SELECT * FROM " . TABLE_WORKFLOWACTION . " WHERE `module` = '$this->moduleName' AND `action` = '$this->methodName'")->fetch();
if($action)
{
$this->workflowModule = $this->moduleName;
$this->workflowMethod = $this->methodName;
$this->loadModuleConfig('workflowaction');
$moduleName = 'flow';
$methodName = in_array($this->methodName, $this->config->workflowaction->default->actions) ? $this->methodName : 'operate';
$this->setModuleName($moduleName);
$this->setMethodName($methodName);
}
}
}
/* Call method of parent. */
return parent::setControlFile($exitIfNone);
}
/**
* PATH_INFO方式解析,获取$URI和$viewType。
* Parse PATH_INFO, get the $URI and $viewType.
@@ -205,6 +326,8 @@ class router extends baseRouter
* 合并请求的参数和默认参数,这样就可以省略已经有默认值的参数了。
* Merge the params passed in and the default params. Thus the params which have default values needn't pass value, just like a function.
*
* Extension: If the workflowmodule and workflowmethod is not empty, reset the passed params.
*
* @param array $defaultParams the default params defined by the method.
* @param array $passedParams the params passed in through url.
* @access public
@@ -212,6 +335,19 @@ class router extends baseRouter
*/
public function mergeParams($defaultParams, $passedParams)
{
/* If the workflowmodule and workflowmethod is not empty, reset the passed params. */
if($this->workflowModule && $this->workflowMethod)
{
$passedParams = array_reverse($passedParams);
if(!in_array($this->workflowMethod, $this->config->workflowaction->default->actions))
{
$passedParams['method'] = $this->workflowMethod;
}
$passedParams['module'] = $this->workflowModule;
$passedParams = array_reverse($passedParams);
}
unset($passedParams['display']);
return parent::mergeParams($defaultParams, $passedParams);
}
+8 -8
View File
@@ -53,15 +53,15 @@ $lang->admin->bind->success = "Account is linked!";
$lang->admin->safe = new stdclass();
$lang->admin->safe->common = 'Security Policy';
$lang->admin->safe->set = 'Strong Password';
$lang->admin->safe->password = 'Strong Password';
$lang->admin->safe->set = 'Password Settings';
$lang->admin->safe->password = 'Strong Password Required';
$lang->admin->safe->weak = 'Weak Password';
$lang->admin->safe->reason = 'Type';
$lang->admin->safe->checkWeak = 'Weak Password';
$lang->admin->safe->checkWeak = 'Weak Password Scan';
$lang->admin->safe->changeWeak = 'Require to change weak password';
$lang->admin->safe->modifyPasswordFirstLogin = 'Require to change password after first login';
$lang->admin->safe->modeList[0] = 'N/A';
$lang->admin->safe->modeList[0] = 'I don\'t care.';
$lang->admin->safe->modeList[1] = 'Medium';
$lang->admin->safe->modeList[2] = 'Strong';
@@ -69,10 +69,10 @@ $lang->admin->safe->modeRuleList[1] = ' >= 6 upper and lower case, and numbers';
$lang->admin->safe->modeRuleList[2] = ' >= 10 upper and lower case, numbers and special characters.';
$lang->admin->safe->reasonList['weak'] = 'Common Weak Password';
$lang->admin->safe->reasonList['account'] = 'Same as your account';
$lang->admin->safe->reasonList['mobile'] = 'Same as your cellphone number';
$lang->admin->safe->reasonList['phone'] = 'Same as your phone number';
$lang->admin->safe->reasonList['birthday'] = 'Same as your DOB';
$lang->admin->safe->reasonList['account'] = 'Same as account';
$lang->admin->safe->reasonList['mobile'] = 'Same as mobilephone number';
$lang->admin->safe->reasonList['phone'] = 'Same as phone number';
$lang->admin->safe->reasonList['birthday'] = 'Same as DOB';
$lang->admin->safe->modifyPasswordList[1] = 'Yes';
$lang->admin->safe->modifyPasswordList[0] = 'No';
+7 -7
View File
@@ -59,7 +59,7 @@ $lang->bug->plan = 'Plan';
$lang->bug->closedBy = 'ClosedBy';
$lang->bug->closedDate = 'ClosedDate';
$lang->bug->duplicateBug = 'Duplicated Bug ID';
$lang->bug->lastEditedBy = 'ModifiedBy';
$lang->bug->lastEditedBy = 'EditedBy';
$lang->bug->linkBug = 'Linked Bugs';
$lang->bug->linkBugs = 'Link Bug';
$lang->bug->unlinkBug = 'Unlink';
@@ -107,9 +107,9 @@ $lang->bug->openedByMe = 'ReportedByMe';
$lang->bug->resolvedByMe = 'ResolvedByMe';
$lang->bug->closedByMe = 'ClosedByMe';
$lang->bug->assignToNull = 'Unassigned';
$lang->bug->unResolved = 'Unresolved';
$lang->bug->toClosed = 'Unclosed';
$lang->bug->unclosed = 'Active';
$lang->bug->unResolved = 'Active';
$lang->bug->toClosed = 'ToClose';
$lang->bug->unclosed = 'Unclosed';
$lang->bug->unconfirmed = 'Unconfirmed';
$lang->bug->longLifeBugs = 'Stalled';
$lang->bug->postponedBugs = 'Postponed';
@@ -137,7 +137,7 @@ $lang->bug->delayWarning = " <strong class='text-danger'> Delay %s days </strong
/* 页面标签。*/
$lang->bug->lblAssignedTo = 'AssignTo';
$lang->bug->lblMailto = 'Mailto';
$lang->bug->lblLastEdited = 'ModifiedBy';
$lang->bug->lblLastEdited = 'EditedBy';
$lang->bug->lblResolved = 'ResolvedBy';
$lang->bug->allUsers = 'Load All Users';
$lang->bug->allBuilds = 'All Builds';
@@ -159,11 +159,11 @@ $lang->bug->legendRelated = 'Related Info';
$lang->bug->buttonConfirm = 'Confirm';
/* 交互提示。*/
$lang->bug->summary = "Total <strong>%s</strong> bugs on this page, and <strong>%s</strong> unresolved.";
$lang->bug->summary = "Total <strong>%s</strong> bugs on this page, and <strong>%s</strong> Active.";
$lang->bug->confirmChangeProduct = "Any change to {$lang->productCommon} will cause linked {$lang->projectCommon}s, stories and tasks change. Do you want to do this?";
$lang->bug->confirmDelete = 'Do you want to delete this bug?';
$lang->bug->remindTask = 'This bug has been converted to a task. Do you want to update the status of Task(ID %s)?';
$lang->bug->skipClose = 'Bug %s is not resolved. You cannot close it.';
$lang->bug->skipClose = 'Bug %s is active. You cannot close it.';
/* 模板。*/
$lang->bug->tplStep = "<p>[Steps]</p><br/>";
+3 -2
View File
@@ -486,6 +486,7 @@ $lang->error->equal = "『%s』has to be『%s』.";
$lang->error->int = array("『%s』should be numbers", "『%s』should be 『%s-%s』.");
$lang->error->float = "『%s』should have numbers, or decimals.";
$lang->error->email = "『%s』should be valid Email.";
$lang->error->URL = "『%s』should be url.";
$lang->error->date = "『%s』should be valid date.";
$lang->error->datetime = "『%s』should be valid date.";
$lang->error->code = "『%s』should be letters or numbers.";
@@ -757,12 +758,12 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Adjust sub menu of bug module. */
$lang->bug->menu = new stdclass();
$lang->bug->menu->all = 'All|bug|browse|productID=%s&branch=%s&browseType=all&param=%s';
$lang->bug->menu->unclosed = 'Open|bug|browse|productID=%s&branch=%s&browseType=unclosed&param=%s';
$lang->bug->menu->unclosed = 'Unclosed|bug|browse|productID=%s&branch=%s&browseType=unclosed&param=%s';
$lang->bug->menu->openedbyme = 'ReportedByMe|bug|browse|productID=%s&branch=%s&browseType=openedbyme&param=%s';
$lang->bug->menu->assigntome = 'AssignedToMe|bug|browse|productID=%s&branch=%s&browseType=assigntome&param=%s';
$lang->bug->menu->resolvedbyme = 'ResolvedByMe|bug|browse|productID=%s&branch=%s&browseType=resolvedbyme&param=%s';
$lang->bug->menu->toclosed = 'ToBeClosed|bug|browse|productID=%s&branch=%s&browseType=toclosed&param=%s';
$lang->bug->menu->unresolved = 'Unresolved|bug|browse|productID=%s&branch=%s&browseType=unresolved&param=%s';
$lang->bug->menu->unresolved = 'Active|bug|browse|productID=%s&branch=%s&browseType=unresolved&param=%s';
$lang->bug->menu->more = array('link' => 'More|bug|browse|productID=%s&branch=%s&browseType=unconfirmed&param=%s', 'class' => 'dropdown dropdown-hover');
$lang->bug->subMenu = new stdclass();
+1
View File
@@ -486,6 +486,7 @@ $lang->error->equal = "『%s』必须为『%s』。";
$lang->error->int = array("『%s』应当是数字。", "『%s』应当介于『%s-%s』之间。");
$lang->error->float = "『%s』应当是数字,可以是小数。";
$lang->error->email = "『%s』应当为合法的EMAIL。";
$lang->error->URL = "『%s』应当为合法的URL。";
$lang->error->date = "『%s』应当为合法的日期。";
$lang->error->datetime = "『%s』应当为合法的日期。";
$lang->error->code = "『%s』应当为字母或数字的组合。";
+2 -2
View File
@@ -58,8 +58,8 @@ $lang->doc->openedByMe = 'My';
$lang->doc->orderByOpen = 'Recent Added';
$lang->doc->orderByEdit = 'Recent Edited';
$lang->doc->orderByVisit = 'Last Visited';
$lang->doc->todayEdited = 'Update Today';
$lang->doc->pastEdited = 'Total Updated';
$lang->doc->todayEdited = 'Edited Today';
$lang->doc->pastEdited = 'Total Edited';
$lang->doc->myDoc = 'My Documents';
$lang->doc->myCollection = 'My Favorites';
+2 -2
View File
@@ -28,13 +28,13 @@ $lang->mail->auth = 'SMTP Validation';
$lang->mail->username = 'SMTP Account';
$lang->mail->password = 'SMTP Password';
$lang->mail->secure = 'Encryption';
$lang->mail->debug = 'Debugging Level';
$lang->mail->debug = 'Debugging';
$lang->mail->charset = 'Charset';
$lang->mail->accessKey = 'Access Key';
$lang->mail->secretKey = 'Secret Key';
$lang->mail->license = 'ZenTao CloudMail Notice';
$lang->mail->selectMTA = 'Select MTA (Mail Transfer Agent)';
$lang->mail->selectMTA = 'Select Type';
$lang->mail->smtp = 'SMTP';
$lang->mail->syncedUser = 'Synchronized';
+4 -4
View File
@@ -247,7 +247,7 @@ $lang->project->goback = "Go Back";
$lang->project->noweekend = 'Exclude Weekend';
$lang->project->withweekend = 'Include Weekend';
$lang->project->interval = 'Intervals';
$lang->project->fixFirstWithLeft = 'Update hours left';
$lang->project->fixFirstWithLeft = 'Update hours left too';
$lang->project->action = new stdclass();
$lang->project->action->opened = '$date, created by <strong>$actor</strong> .' . "\n";
@@ -271,7 +271,7 @@ $lang->project->charts->burn->graph->actuality = 'Actual';
$lang->project->placeholder = new stdclass();
$lang->project->placeholder->code = "Abbreviation of {$lang->projectCommon} name";
$lang->project->placeholder->totalLeft = "Estimates at the beginning of the {$lang->projectCommon}.";
$lang->project->placeholder->totalLeft = "Hours estimated on the first day of the {$lang->projectCommon}.";
$lang->project->selectGroup = new stdclass();
$lang->project->selectGroup->done = '(Done)';
@@ -319,8 +319,8 @@ $lang->project->featureBar['task']['status'] = $lang->project->statusSelec
$lang->project->treeLevel = array();
$lang->project->treeLevel['all'] = 'Expand All';
$lang->project->treeLevel['root'] = 'Collapse All';
$lang->project->treeLevel['task'] = 'Show All';
$lang->project->treeLevel['story'] = 'Show Story';
$lang->project->treeLevel['task'] = 'Stories&Tasks';
$lang->project->treeLevel['story'] = 'Only Stories';
global $config;
if($config->global->flow == 'onlyTask')
+1 -1
View File
@@ -69,7 +69,7 @@ $lang->report->to = 'to';
$lang->report->taskTotal = "Total Tasks";
$lang->report->manhourTotal = "Total Hours";
$lang->report->validRate = "Valid Rate";
$lang->report->validRateTips = "Solution is Resolved/Postponed or status is Resolved/Closed.";
$lang->report->validRateTips = "Resolution is Resolved/Postponed or status is Resolved/Closed.";
$lang->report->unplanned = 'Unplanned';
$lang->report->workday = 'Hours/Day';
$lang->report->diffDays = 'days';
+1 -1
View File
@@ -23,7 +23,7 @@ $lang->search->setQueryTitle = 'Enter a title. Search then the query is saved.';
$lang->search->select = 'Story/Task Filter';
$lang->search->me = 'Me';
$lang->search->noQuery = 'No query is saved yet!';
$lang->search->onMenuBar = 'Show in the Menu';
$lang->search->onMenuBar = 'Show in Menu';
$lang->search->custom = 'Custom';
$lang->search->account = 'Account';
+3 -3
View File
@@ -77,8 +77,8 @@ $lang->story->openedBy = 'CreatedBy';
$lang->story->openedDate = 'CreatedDate';
$lang->story->assignedTo = 'AssignTo';
$lang->story->assignedDate = 'AssignedDate';
$lang->story->lastEditedBy = 'ModifiedBy';
$lang->story->lastEditedDate = 'ModifiedDate';
$lang->story->lastEditedBy = 'EditedBy';
$lang->story->lastEditedDate = 'EditedDate';
$lang->story->closedBy = 'ClosedBy';
$lang->story->closedDate = 'ClosedDate';
$lang->story->closedReason = 'Reason';
@@ -179,7 +179,7 @@ $lang->story->legendBugs = 'Linked Bugs';
$lang->story->legendFromBug = 'From Bug';
$lang->story->legendCases = 'Linked Cases';
$lang->story->legendLinkStories = 'Linked Stories';
$lang->story->legendChildStories = 'Children Stories';
$lang->story->legendChildStories = 'Child Stories';
$lang->story->legendSpec = 'Description';
$lang->story->legendVerify = 'Acceptance';
$lang->story->legendMisc = 'Misc.';
+4 -4
View File
@@ -62,7 +62,7 @@ $lang->task->estimate = 'Estimates';
$lang->task->estimateAB = 'Est.';
$lang->task->left = 'Hours Left';
$lang->task->leftAB = 'Left';
$lang->task->consumed = 'Hours Cost';
$lang->task->consumed = 'Total Cost';
$lang->task->currentConsumed = 'Current Cost';
$lang->task->myConsumed = 'My Cost';
$lang->task->consumedAB = 'Cost';
@@ -96,9 +96,9 @@ $lang->task->canceledDate = 'CancelledDate';
$lang->task->closedBy = 'ClosedBy';
$lang->task->closedDate = 'ClosedDate';
$lang->task->closedReason = 'CloseReason';
$lang->task->lastEditedBy = 'ModifiedBy';
$lang->task->lastEditedDate = 'ModifiedDate';
$lang->task->lastEdited = 'Last Edited';
$lang->task->lastEditedBy = 'EditedBy';
$lang->task->lastEditedDate = 'EditedDate';
$lang->task->lastEdited = 'EditedBy';
$lang->task->recordEstimate = 'Effort';
$lang->task->editEstimate = 'Edit Estimates';
$lang->task->deleteEstimate = 'Delete Estimates';
+1 -1
View File
@@ -130,7 +130,7 @@ $lang->testcase->bySearch = 'Search';
$lang->testcase->unexecuted = 'Pending';
$lang->testcase->lblStory = 'Linked Story';
$lang->testcase->lblLastEdited = 'Last Edited';
$lang->testcase->lblLastEdited = 'EditedBy';
$lang->testcase->lblTypeValue = 'Type Value';
$lang->testcase->lblStageValue = 'Phase Value';
$lang->testcase->lblStatusValue = 'Status Value';
+4 -4
View File
@@ -62,9 +62,9 @@ $lang->testreport->confirmDelete = 'Do you want to delete this report?';
$lang->testreport->moreNotice = 'More features can be extended with reference to the ZenTao extension manual, or you can contact us at renee@easysoft.ltd for customization.';
$lang->testreport->exportNotice = "Exported By <a href='https://www.zentao.net' target='_blank' style='color:grey'>ZenTao</a>";
$lang->testreport->noReport = "No report has been generated. Please check it later.";
$lang->testreport->foundBugTip = "Bugs generated in this build and generated in the test period.";
$lang->testreport->foundBugTip = "Bugs found in this build period and the affected build is in this test period.";
$lang->testreport->legacyBugTip = "Active bugs, or resolved bugs that are not in the test period.";
$lang->testreport->fromCaseBugTip = "Bugs generated due to the failed case run in the test period.";
$lang->testreport->fromCaseBugTip = "Bugs found from the running of cases in the test period.";
$lang->testreport->errorTrunk = "You cannot create a Testing report for the trunk. Please modify the linked build!";
$lang->testreport->noTestTask = "No test requests for this {$lang->productCommon}, so no reports can be generated. Please go to {$lang->productCommon} which has test requests and then generate the report.";
$lang->testreport->noObjectID = "No test request or {$lang->projectCommon} is selected, so no report can be generated.";
@@ -73,6 +73,6 @@ $lang->testreport->moreProduct = "Testing reports can only be generated for t
$lang->testreport->bugSummary = <<<EOD
Total <strong>%s</strong> Bugs reported <a data-toggle='tooltip' class='text-warning' title='{$lang->testreport->foundBugTip}'><i class='icon-help'></i></a>,
<strong>%s</strong> Bugs remained unresolved <a data-toggle='tooltip' class='text-warning' title='{$lang->testreport->legacyBugTip}'><i class='icon-help'></i></a>,
<strong>%s</strong> Bugs generated due to the failure of case run <a data-toggle='tooltip' class='text-warning' title='{$lang->testreport->fromCaseBugTip}'><i class='icon-help'></i></a>.
Bug Effective Rate <a data-toggle='tooltip' class='text-warning' title='Resolution is resolved or delayed / status is resolved or closed'><i class='icon-help'></i></a>: <strong>%s</strong>,Bugs reported from case rate<a data-toggle='tooltip' class='text-warning' title='Bugs created from cases / bugs'><i class='icon-help'></i></a>: <strong>%s</strong>
<strong>%s</strong> Bugs found from the running of cases<a data-toggle='tooltip' class='text-warning' title='{$lang->testreport->fromCaseBugTip}'><i class='icon-help'></i></a>.
Bug Effective Rate <a data-toggle='tooltip' class='text-warning' title='Resolution is resolved or delayed / status is resolved or closed'><i class='icon-help'></i></a>: <strong>%s</strong>,Bugs-reported-from-cases rate<a data-toggle='tooltip' class='text-warning' title='Bugs created from cases / bugs'><i class='icon-help'></i></a>: <strong>%s</strong>
EOD;