- createLink('action', 'trash', "objectType=all&type=$type"), "
" . $lang->action->periods['all'] . "", '', "class='btn btn-link $activeClass'");?>
+ createLink('action', 'trash', "objectType=all&type=$type"), "
" . $lang->all . "", '', "class='btn btn-link $activeClass'");?>
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');
diff --git a/module/admin/control.php b/module/admin/control.php
index 2a38dac0ef..97238f0cfe 100755
--- a/module/admin/control.php
+++ b/module/admin/control.php
@@ -53,23 +53,52 @@ class admin extends control
$this->loadModel('misc');
- $hasInternet = $this->admin->checkInternet();
- $clientLang = $this->app->getClientLang();
- $langNotCN = common::checkNotCN();
- $dateUsed = $this->admin->genDateUsed();
+ $clientLang = $this->app->getClientLang();
+ $langNotCN = common::checkNotCN();
+ $dateUsed = $this->admin->genDateUsed();
+
+ $zentaoData = $this->admin->getZentaoData();
+ $hasInternet = $zentaoData->hasData;
$this->view->title = $this->lang->admin->common;
$this->view->position[] = $this->lang->admin->index;
- $this->view->plugins = $this->admin->getExtensionsByAPI('plugin', $langNotCN ? 5 : 6, $hasInternet);
- $this->view->patches = $this->admin->getExtensionsByAPI('patch', 5, $hasInternet);
+ $this->view->plugins = $zentaoData->plugins;
+ $this->view->patches = $zentaoData->patches;
$this->view->dateUsed = $dateUsed;
$this->view->hasInternet = $hasInternet;
- $this->view->dynamics = ($hasInternet and !$langNotCN) ? $this->admin->getDynamicsByAPI(3) : array();
- $this->view->publicClass = ($hasInternet and !$langNotCN) ? $this->admin->getPublicClassByAPI(3) : array();
+ $this->view->dynamics = $zentaoData->news;
+ $this->view->publicClass = $zentaoData->publicclass;
$this->view->langNotCN = $langNotCN;
$this->display();
}
+ /**
+ * Get zentao.net data by api.
+ *
+ * @access public
+ * @return void
+ */
+ public function ajaxSetZentaoData()
+ {
+ $hasInternet = $this->admin->checkInternet();
+
+ if($hasInternet)
+ {
+ $nextWeek = date('Y-m-d', strtotime('-7 days'));
+ $zentaoData = $this->loadModel('block')->getZentaoData($nextWeek);
+
+ if(empty($zentaoData))
+ {
+ $this->admin->setExtensionsByAPI('plugin', 6);
+ $this->admin->setExtensionsByAPI('patch', 5);
+ $this->admin->setDynamicsByAPI(3);
+ $this->admin->setPublicClassByAPI(3);
+ }
+ }
+
+ return $this->send(array('result' => 'success'));
+ }
+
/**
* Ignore notice of register and bind.
*
diff --git a/module/admin/css/index.css b/module/admin/css/index.css
index e3770ac26c..d457164dbc 100755
--- a/module/admin/css/index.css
+++ b/module/admin/css/index.css
@@ -85,6 +85,7 @@
/* css for without internet */
.main.without-internet {display: flex; flex-wrap: wrap;}
.main.without-internet > .plug.panel {flex: 1 1 60%; margin-bottom: unset; margin-right: 16px;}
+.main.without-internet > .bottom {flex: 1 1 30%;}
.main.without-internet > .bottom > .official.panel {margin-right: unset;}
.main.without-internet > .bottom > .official.panel > .main-panel {flex-direction: row-reverse;}
diff --git a/module/admin/js/index.js b/module/admin/js/index.js
index f97411945c..fed2be7c68 100644
--- a/module/admin/js/index.js
+++ b/module/admin/js/index.js
@@ -10,4 +10,6 @@ $(function()
{
window.open($(this).data('link'));
});
+
+ if(!hasInternet) $.get(createLink('admin', 'ajaxSetZentaoData'));
});
diff --git a/module/admin/lang/menu.php b/module/admin/lang/menu.php
index ce5e83a732..3c2ff3b8ef 100644
--- a/module/admin/lang/menu.php
+++ b/module/admin/lang/menu.php
@@ -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')
{
diff --git a/module/admin/lang/zh-cn.php b/module/admin/lang/zh-cn.php
index f63f4d25c4..bc4a35220a 100755
--- a/module/admin/lang/zh-cn.php
+++ b/module/admin/lang/zh-cn.php
@@ -61,7 +61,7 @@ $lang->admin->info->account = "您的禅道社区账户为%s。";
$lang->admin->info->log = '超出存天数的日志会被删除,需要开启计划任务。';
$lang->admin->notice = new stdclass();
-$lang->admin->notice->register = "可%s禅道社区 www.zentao.net, 及时获得禅道最新信息。";
+$lang->admin->notice->register = "可%s禅道社区 www.zentao.net,及时获得禅道最新信息。";
$lang->admin->notice->ignore = "不再提示";
$lang->admin->notice->int = "『%s』应当是正整数。";
diff --git a/module/admin/model.php b/module/admin/model.php
index c23ea0103c..e2b8302278 100755
--- a/module/admin/model.php
+++ b/module/admin/model.php
@@ -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);
}
@@ -506,7 +507,7 @@ class adminModel extends model
}
/**
- * Get extensions from zentao.net.
+ * Set extensions from zentao.net.
*
* @param string $type plugin|patch
* @param int $limit
@@ -514,41 +515,22 @@ class adminModel extends model
* @access public
* @return array
*/
- public function getExtensionsByAPI($type = 'plugin', $limit = 6, $hasInternet = true)
+ public function setExtensionsByAPI($type = 'plugin', $limit = 5)
{
- if($hasInternet)
+ $searchType = $type == 'plugin' ? 'byModule,offcial' : 'byModule';
+ $param = $type == 'plugin' ? '' : 'MTIxOA==';
+ $extensions = $this->loadModel('extension')->getExtensionsByAPI($searchType, $param, 0, $limit);
+ $extensions = isset($extensions->extensions) ? (array)$extensions->extensions : array();
+ $plugins = array();
+ foreach($extensions as $extension)
{
- $searchType = $type == 'plugin' ? 'byUpdatedTime,offcial' : 'byModule';
- $param = $type == 'plugin' ? '' : 'MTIxOA==';
- $extensions = $this->loadModel('extension')->getExtensionsByAPI($searchType, $param, 0, $limit);
- $plugins = isset($extensions->extensions) ? (array)$extensions->extensions : array();
- foreach($plugins as $id => $plugin)
- {
- $plugin->viewLink = str_replace(array('info', 'client'), '', $plugin->viewLink);
- if($type == 'patch' and !isset($plugin->compatibleRelease)) unset($plugins[$id]);
- }
- }
- else
- {
- if($this->config->edition == 'open')
- {
- $plugins = array(
- $this->config->admin->plugins[27],
- $this->config->admin->plugins[26],
- $this->config->admin->plugins[30]
- );
- }
- else
- {
- $plugins = array(
- $this->config->admin->plugins[198],
- $this->config->admin->plugins[194],
- $this->config->admin->plugins[203]
- );
- }
+ if($type == 'patch' and !isset($extension->compatibleRelease)) continue;
+
+ $extension->viewLink = str_replace(array('info', 'client'), '', $extension->viewLink);
+ $plugins[] = $extension;
}
- return $plugins;
+ return $this->loadModel('block')->setZentaoData($type, $plugins);
}
/**
@@ -572,13 +554,13 @@ class adminModel extends model
}
/**
- * Get public class from zentao.net.
+ * Set public class from zentao.net.
*
* @param int $limit
* @access public
- * @return array
+ * @return void
*/
- public function getPublicClassByAPI($limit = 2)
+ public function setPublicClassByAPI($limit = 3)
{
$apiURL = $this->config->admin->videoAPIURL;
$data = $this->fetchAPI($apiURL);
@@ -596,24 +578,25 @@ class adminModel extends model
$publicClass[$index]->viewLink = $this->config->admin->apiRoot . '/publicclass/' . ($course->alias ? "{$course->alias}-" : '') . "{$course->id}.html";
$index ++;
}
- return $publicClass;
+
+ return $this->loadModel('block')->setZentaoData('publicclass', $publicClass);
}
/**
- * Get dynamics by API.
+ * Set dynamics by API.
*
* @param int $limit
* @access public
- * @return array
+ * @return void
*/
- public function getDynamicsByAPI($limit = 2)
+ public function setDynamicsByAPI($limit = 2)
{
$apiURL = $this->config->admin->downloadAPIURL;
$data = $this->fetchAPI($apiURL);
$articles = $data->articles;
- $index = 1;
- $downloads = array();
+ $index = 1;
+ $news = array();
foreach($articles as $article)
{
if($index > $limit) break;
@@ -622,14 +605,15 @@ class adminModel extends model
if(!isset($this->lang->admin->$tagKey)) break;
if(!preg_match("/{$this->lang->admin->$tagKey}\d/", $article->title)) continue;
- $downloads[$index] = new stdClass();
- $downloads[$index]->id = $article->id;
- $downloads[$index]->title = $article->title;
- $downloads[$index]->addedDate = $article->addedDate;
- $downloads[$index]->link = $this->config->admin->apiRoot . "/download/{$article->alias}-{$article->id}.html";
+ $news[$index] = new stdClass();
+ $news[$index]->id = $article->id;
+ $news[$index]->title = $article->title;
+ $news[$index]->addedDate = $article->addedDate;
+ $news[$index]->link = $this->config->admin->apiRoot . "/download/{$article->alias}-{$article->id}.html";
$index ++;
}
- return $downloads;
+
+ return $this->loadModel('block')->setZentaoData('news', $news);
}
/**
@@ -640,17 +624,18 @@ class adminModel extends model
*/
public function checkInternet()
{
- $curl = curl_init();
+ $timeout = 3;
+ $curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $this->config->admin->apiSite);
- curl_setopt($curl, CURLOPT_TIMEOUT_MS, 1000);
- curl_setopt($curl, CURLOPT_CONNECTTIMEOUT_MS, 1000);
+ curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
+ curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
$connected = curl_exec($curl);
curl_close($curl);
- return (bool)$connected;
+ return $connected ? true : false;
}
/**
@@ -670,4 +655,58 @@ class adminModel extends model
return helper::getDateInterval($firstUseDate);
}
+
+ /**
+ * Get zentao.net data.
+ *
+ * @access public
+ * @return object
+ */
+ public function getZentaoData()
+ {
+ $zentaoData = $this->loadModel('block')->getZentaoData();
+
+ $data = new stdclass();
+ $data->hasData = true;
+
+ $news = array();
+ $publicclass = array();
+ $plugins = array();
+ $patches = array();
+ if(empty($zentaoData))
+ {
+ $data->hasData = false;
+ if($this->config->edition == 'open')
+ {
+ $plugins = array(
+ $this->config->admin->plugins[27],
+ $this->config->admin->plugins[26],
+ $this->config->admin->plugins[30]
+ );
+ }
+ else
+ {
+ $plugins = array(
+ $this->config->admin->plugins[198],
+ $this->config->admin->plugins[194],
+ $this->config->admin->plugins[203]
+ );
+ }
+ }
+ else
+ {
+ $news = json_decode($zentaoData['news']);
+ $publicclass = json_decode($zentaoData['publicclass']);
+ $plugins = json_decode($zentaoData['plugin']);
+ $patches = json_decode($zentaoData['patch']);
+ if(common::checkNotCN()) array_pop($plugins);
+ }
+
+ $data->news = $news;
+ $data->publicclass = $publicclass;
+ $data->plugins = $plugins;
+ $data->patches = $patches;
+
+ return $data;
+ }
}
diff --git a/module/admin/view/index.html.php b/module/admin/view/index.html.php
index 594c0b0270..cc7e7ec861 100755
--- a/module/admin/view/index.html.php
+++ b/module/admin/view/index.html.php
@@ -26,7 +26,7 @@
- admin->helpURL[$menuKey], "
", '_blank', 'class="text-muted setting-help"');?>
+ admin->helpURL[$menuKey], "
", '_blank', 'class="text-muted setting-help"');?>
diff --git a/module/api/js/create.js b/module/api/js/create.js
index e073d9d82e..8d0e441826 100644
--- a/module/api/js/create.js
+++ b/module/api/js/create.js
@@ -41,7 +41,6 @@ var app = new Vue({
},
methods: {
changeAttr(val) {
- // console.log('更新之前', JSON.stringify(val))
this.body = val;
},
changeType(val) {
diff --git a/module/api/js/edit.js b/module/api/js/edit.js
index 1dc4d3074b..50ca3eb7f8 100644
--- a/module/api/js/edit.js
+++ b/module/api/js/edit.js
@@ -58,7 +58,6 @@ var app = new Vue({
},
methods: {
changeAttr(val) {
- // console.log('新的值', JSON.stringify(val))
this.body = val
},
changeType(val) {
diff --git a/module/block/lang/de.php b/module/block/lang/de.php
index 8da269b3dd..978f144d63 100644
--- a/module/block/lang/de.php
+++ b/module/block/lang/de.php
@@ -76,7 +76,7 @@ $lang->block->consumedHours = 'Cost';
$lang->block->time = 'No';
$lang->block->week = 'Week';
$lang->block->month = 'Month';
-$lang->block->selectProduct = 'Product selection';
+$lang->block->selectProduct = "{$lang->productCommon} selection";
$lang->block->of = ' von ';
$lang->block->remain = 'Left';
$lang->block->allStories = 'All';
@@ -114,10 +114,10 @@ $lang->block->left = 'Remain';
$lang->block->titleList['flowchart'] = 'Flow Chart';
$lang->block->titleList['guide'] = 'Guides';
$lang->block->titleList['statistic'] = 'Statistic';
-$lang->block->titleList['recentproject'] = 'Recent Project';
+$lang->block->titleList['recentproject'] = "Recent {$lang->projectCommon}";
$lang->block->titleList['assigntome'] = 'Assign to me';
-$lang->block->titleList['projectteam'] = 'Project manpower input';
-$lang->block->titleList['project'] = 'Project List';
+$lang->block->titleList['projectteam'] = "{$lang->projectCommon} manpower input";
+$lang->block->titleList['project'] = "{$lang->projectCommon} List";
$lang->block->titleList['dynamic'] = 'Dynamic';
$lang->block->titleList['list'] = 'Todo List';
$lang->block->titleList['contribute'] = 'Contribute';
@@ -125,7 +125,7 @@ $lang->block->titleList['scrumoverview'] = 'Scrumoverview';
$lang->block->titleList['scrumtest'] = 'Scrum Test';
$lang->block->titleList['scrumlist'] = 'Scrum List';
$lang->block->titleList['sprint'] = 'Sprint';
-$lang->block->titleList['projectdynamic'] = 'Project Dynamic';
+$lang->block->titleList['projectdynamic'] = "{$lang->projectCommon} Dynamic";
$lang->block->titleList['bug'] = 'Bug';
$lang->block->titleList['case'] = 'Case';
$lang->block->titleList['testtask'] = 'Test Task';
@@ -142,7 +142,7 @@ $lang->block->default['waterfall']['project']['6']['source'] = 'project';
$lang->block->default['waterfallplus'] = $lang->block->default['waterfall'];
-$lang->block->default['scrum']['project']['1']['title'] = 'Project Overall';
+$lang->block->default['scrum']['project']['1']['title'] = $lang->projectCommon . ' Overall';
$lang->block->default['scrum']['project']['1']['block'] = 'scrumoverview';
$lang->block->default['scrum']['project']['1']['grid'] = 8;
@@ -288,7 +288,7 @@ $lang->block->default['full']['my']['4']['grid'] = 4;
$lang->block->default['full']['my']['4']['source'] = 'todo';
$lang->block->default['full']['my']['4']['params']['count'] = '20';
-$lang->block->default['full']['my']['5']['title'] = 'Project Statistic';
+$lang->block->default['full']['my']['5']['title'] = "{$lang->projectCommon} Statistic";
$lang->block->default['full']['my']['5']['block'] = 'statistic';
$lang->block->default['full']['my']['5']['source'] = 'project';
$lang->block->default['full']['my']['5']['grid'] = 8;
@@ -299,8 +299,8 @@ $lang->block->default['full']['my']['6']['block'] = 'contribute';
$lang->block->default['full']['my']['6']['source'] = '';
$lang->block->default['full']['my']['6']['grid'] = 4;
-$lang->block->default['full']['my']['7']['title'] = 'Recent Project';
-$lang->block->default['full']['my']['7']['block'] = 'recentproject';
+$lang->block->default['full']['my']['7']['title'] = "Recent {$lang->projectCommon}s";
+$lang->block->default['full']['my']['7']['block'] = "recent{$lang->projectCommon}";
$lang->block->default['full']['my']['7']['source'] = 'project';
$lang->block->default['full']['my']['7']['grid'] = 8;
@@ -324,8 +324,8 @@ $lang->block->default['full']['my']['9']['block'] = 'project';
$lang->block->default['full']['my']['9']['source'] = 'project';
$lang->block->default['full']['my']['9']['grid'] = 8;
-$lang->block->default['full']['my']['10']['title'] = 'Project List';
-$lang->block->default['full']['my']['10']['block'] = 'project';
+$lang->block->default['full']['my']['10']['title'] = "{$lang->projectCommon} List";
+$lang->block->default['full']['my']['10']['block'] = $lang->projectCommon;
$lang->block->default['full']['my']['10']['source'] = 'project';
$lang->block->default['full']['my']['10']['grid'] = 8;
@@ -356,21 +356,21 @@ $lang->block->availableBlocks->feedback = 'Feedbacks';
$lang->block->availableBlocks->ticket = 'Tickets';
$lang->block->moduleList['product'] = $lang->productCommon;
-$lang->block->moduleList['project'] = 'Project';
+$lang->block->moduleList['project'] = $lang->projectCommon;
$lang->block->moduleList['execution'] = $lang->execution->common;
$lang->block->moduleList['qa'] = 'QA';
$lang->block->moduleList['todo'] = 'Todos';
$lang->block->modules['project'] = new stdclass();
$lang->block->modules['project']->availableBlocks = new stdclass();
-$lang->block->modules['project']->availableBlocks->project = 'Project List';
-$lang->block->modules['project']->availableBlocks->recentproject = 'Recent Project';
-$lang->block->modules['project']->availableBlocks->statistic = 'Project Statistic';
-$lang->block->modules['project']->availableBlocks->projectteam = 'Project Human Input';
+$lang->block->modules['project']->availableBlocks->project = "{$lang->projectCommon} List";
+$lang->block->modules['project']->availableBlocks->recentproject = "Recent {$lang->projectCommon}";
+$lang->block->modules['project']->availableBlocks->statistic = "{$lang->projectCommon} Statistic";
+$lang->block->modules['project']->availableBlocks->projectteam = "{$lang->projectCommon} Manpower Input";
$lang->block->modules['scrum']['index'] = new stdclass();
$lang->block->modules['scrum']['index']->availableBlocks = new stdclass();
-$lang->block->modules['scrum']['index']->availableBlocks->scrumoverview = 'Project Overview';
+$lang->block->modules['scrum']['index']->availableBlocks->scrumoverview = "{$lang->projectCommon} Overview";
$lang->block->modules['scrum']['index']->availableBlocks->scrumlist = $lang->executionCommon . ' List';
$lang->block->modules['scrum']['index']->availableBlocks->sprint = $lang->executionCommon . ' Overview';
$lang->block->modules['scrum']['index']->availableBlocks->scrumtest = 'Test Version';
@@ -423,10 +423,10 @@ $lang->block->orderByList->product['status_asc'] = 'Status Aufsteigend';
$lang->block->orderByList->product['status_desc'] = 'Status Absteigend';
$lang->block->orderByList->project = array();
-$lang->block->orderByList->project['id_asc'] = 'ID Aufsteigend';
-$lang->block->orderByList->project['id_desc'] = 'ID Absteigend';
-$lang->block->orderByList->project['status_asc'] = 'Status Aufsteigend';
-$lang->block->orderByList->project['status_desc'] = 'Status Absteigend';
+$lang->block->orderByList->project['id_asc'] = "{$lang->projectCommon} ID ASC";
+$lang->block->orderByList->project['id_desc'] = "{$lang->projectCommon} ID DESC";
+$lang->block->orderByList->project['status_asc'] = "{$lang->projectCommon} Status ASC";
+$lang->block->orderByList->project['status_desc'] = "{$lang->projectCommon} Status DESC";
$lang->block->orderByList->execution = array();
$lang->block->orderByList->execution['id_asc'] = 'ID Aufsteigend';
@@ -529,18 +529,18 @@ $lang->block->typeList->testtask['done'] = 'Erledigt';
$lang->block->typeList->testtask['all'] = 'Alle';
$lang->block->modules['project']->moreLinkList = new stdclass();
-$lang->block->modules['project']->moreLinkList->recentproject = 'project|browse|';
-$lang->block->modules['project']->moreLinkList->statistic = 'project|browse|';
-$lang->block->modules['project']->moreLinkList->project = 'project|browse|';
+$lang->block->modules['project']->moreLinkList->recentproject = "project|browse|";
+$lang->block->modules['project']->moreLinkList->statistic = "project|browse|";
+$lang->block->modules['project']->moreLinkList->project = "project|browse|";
$lang->block->modules['project']->moreLinkList->cmmireport = 'weekly|index|';
$lang->block->modules['project']->moreLinkList->cmmiestimate = 'workestimation|index|';
$lang->block->modules['project']->moreLinkList->cmmiissue = 'issue|browse|';
$lang->block->modules['project']->moreLinkList->cmmirisk = 'risk|browse|';
-$lang->block->modules['project']->moreLinkList->scrumlist = 'project|execution|';
+$lang->block->modules['project']->moreLinkList->scrumlist = "project|execution|";
$lang->block->modules['project']->moreLinkList->scrumtest = 'testtask|browse|';
$lang->block->modules['project']->moreLinkList->scrumproduct = 'product|all|';
-$lang->block->modules['project']->moreLinkList->sprint = 'project|execution|';
-$lang->block->modules['project']->moreLinkList->projectdynamic = 'project|dynamic|';
+$lang->block->modules['project']->moreLinkList->sprint = "project|execution|";
+$lang->block->modules['project']->moreLinkList->projectdynamic = "project|dynamic|";
$lang->block->modules['product']->moreLinkList = new stdclass();
$lang->block->modules['product']->moreLinkList->list = 'product|all|';
@@ -572,9 +572,9 @@ $lang->block->gridOptions[4] = 'Rechts';
$lang->block->flowchart = array();
$lang->block->flowchart['admin'] = array('Administrator', 'Add Departments', 'Benutzer erstellen', 'Rechte pflegen');
-if($config->systemMode == 'ALM') $lang->block->flowchart['program'] = array('Program Owner', 'Create Program', 'Link Product', "Create Project", "Budgeting and planning", 'Add Stakeholder');
+if($config->systemMode == 'ALM') $lang->block->flowchart['program'] = array('Program Owner', 'Create Program', "Link {$lang->productCommon}", "Create {$lang->projectCommon}", "Budgeting and planning", 'Add Stakeholder');
$lang->block->flowchart['product'] = array($lang->productCommon . ' Besitzer', $lang->productCommon . ' erstellen', 'Module pflegen', 'Pläne pflegen', 'Storys pflegen', 'Release erstellen');
-$lang->block->flowchart['project'] = array('Project Manager', 'Add projects and ' . $lang->execution->common . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
+$lang->block->flowchart['project'] = array('Project Manager', "Add {$lang->productCommon}s and " . $lang->execution->common . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
$lang->block->flowchart['dev'] = array('Entwickler', 'Aufgabe/Bugs anfordern', 'Update Status', 'Aufgaben/Bugs abschließen');
$lang->block->flowchart['tester'] = array('QS Team', 'Fälle erstellen', 'Fälle ausführen', 'Bug Berichte', 'Bugs überprüfen', 'Bugs schließen');
@@ -587,8 +587,8 @@ $lang->block->zentaoapp->allStorySum = 'Total Stories';
$lang->block->zentaoapp->storyCompleteRate = 'Story CompleteRate';
$lang->block->zentaoapp->latestExecution = 'Latest Execution';
$lang->block->zentaoapp->involvedExecution = 'Involved Execution';
-$lang->block->zentaoapp->mangedProduct = 'Manged Product';
-$lang->block->zentaoapp->involvedProject = 'Involved Project';
+$lang->block->zentaoapp->mangedProduct = "Manged {$lang->productCommon}";
+$lang->block->zentaoapp->involvedProject = "Involved {$lang->projectCommon}";
$lang->block->zentaoapp->customIndexCard = 'Custom Index Cards';
$lang->block->zentaoapp->createStory = 'Story Create';
$lang->block->zentaoapp->createEffort = 'Effort Create';
@@ -599,7 +599,7 @@ $lang->block->zentaoapp->notSupportKanban = 'The mobile terminal does not su
$lang->block->zentaoapp->notSupportVersion = 'This version of ZenTao is not currently supported on the mobile terminal';
$lang->block->zentaoapp->incompatibleVersion = 'The current version of ZenTao is lower, please upgrade to the latest version and try again';
$lang->block->zentaoapp->canNotGetVersion = 'Failed to get ZenTao version, please confirm if the URL is correct';
-$lang->block->zentaoapp->desc = 'ZenTao mobile app provides you with a mobile work environment, which is convenient for managing personal to-do tasks at any time, tracking project progress, and enhancing the flexibility and agility of project management.';
+$lang->block->zentaoapp->desc = "ZenTao mobile app provides you with a mobile work environment, which is convenient for managing personal to-do tasks at any time, tracking {$lang->projectCommon} progress, and enhancing the flexibility and agility of {$lang->projectCommon} management.";
$lang->block->zentaoapp->downloadTip = 'Scan QR code to download';
$lang->block->zentaoclient = new stdClass();
@@ -632,11 +632,11 @@ $lang->block->visionTitle = 'The user interface of ZenTao is divided
$lang->block->visions['rnd'] = new stdclass();
$lang->block->visions['rnd']->key = 'rnd';
$lang->block->visions['rnd']->title = 'Full feature interface';
-$lang->block->visions['rnd']->text = 'Integrate the program, product, project, execution, test, etc., and provide the lifecycle project management solution.';
+$lang->block->visions['rnd']->text = "Integrate the program, {$lang->productCommon}, {$lang->projectCommon}, execution, test, etc., and provide the lifecycle {$lang->projectCommon} management solution.";
$lang->block->visions['lite'] = new stdclass();
$lang->block->visions['lite']->key = 'lite';
$lang->block->visions['lite']->title = 'Operation Management Interface';
-$lang->block->visions['lite']->text = 'Specially designed for Non-R&D teams, and based on the visual Kanban project management model.';
+$lang->block->visions['lite']->text = "Specially designed for Non-R&D teams, and based on the visual Kanban {$lang->projectCommon} management model.";
$lang->block->customModes['light'] = 'Light Mode';
$lang->block->customModes['ALM'] = 'ALM Mode';
@@ -644,4 +644,4 @@ $lang->block->customModes['ALM'] = 'ALM Mode';
$lang->block->customModeTip = new stdClass();
$lang->block->customModeTip->common = 'There are 2 running modes of ZenTao: Light Mode and ALM Mode.';
$lang->block->customModeTip->ALM = 'The concept is more complete and rigorous, and the function is more abundant. It is suitable for medium and large R&D teams.';
-$lang->block->customModeTip->light = 'Provides the core function of project management, suitable for small R&D teams.';
+$lang->block->customModeTip->light = "Provides the core function of {$lang->projectCommon} management, suitable for small R&D teams.";
diff --git a/module/block/lang/en.php b/module/block/lang/en.php
index 52ad95e84c..2a19a3bcec 100644
--- a/module/block/lang/en.php
+++ b/module/block/lang/en.php
@@ -76,7 +76,7 @@ $lang->block->consumedHours = 'Cost';
$lang->block->time = 'No';
$lang->block->week = 'Week';
$lang->block->month = 'Month';
-$lang->block->selectProduct = 'Product selection';
+$lang->block->selectProduct = "{$lang->productCommon} selection";
$lang->block->of = ' of ';
$lang->block->remain = 'Left';
$lang->block->allStories = 'All';
@@ -114,10 +114,10 @@ $lang->block->left = 'Remain';
$lang->block->titleList['flowchart'] = 'Flow Chart';
$lang->block->titleList['guide'] = 'Guides';
$lang->block->titleList['statistic'] = 'Statistic';
-$lang->block->titleList['recentproject'] = 'Recent Project';
+$lang->block->titleList['recentproject'] = "Recent {$lang->projectCommon}";
$lang->block->titleList['assigntome'] = 'Assign to me';
-$lang->block->titleList['projectteam'] = 'Project manpower input';
-$lang->block->titleList['project'] = 'Project List';
+$lang->block->titleList['projectteam'] = "{$lang->projectCommon} manpower input";
+$lang->block->titleList['project'] = "{$lang->projectCommon} List";
$lang->block->titleList['dynamic'] = 'Dynamic';
$lang->block->titleList['list'] = 'Todo List';
$lang->block->titleList['contribute'] = 'Contribute';
@@ -125,7 +125,7 @@ $lang->block->titleList['scrumoverview'] = 'Scrumoverview';
$lang->block->titleList['scrumtest'] = 'Scrum Test';
$lang->block->titleList['scrumlist'] = 'Scrum List';
$lang->block->titleList['sprint'] = 'Sprint';
-$lang->block->titleList['projectdynamic'] = 'Project Dynamic';
+$lang->block->titleList['projectdynamic'] = "{$lang->projectCommon} Dynamic";
$lang->block->titleList['bug'] = 'Bug';
$lang->block->titleList['case'] = 'Case';
$lang->block->titleList['testtask'] = 'Test Task';
@@ -142,7 +142,7 @@ $lang->block->default['waterfall']['project']['6']['source'] = 'project';
$lang->block->default['waterfallplus'] = $lang->block->default['waterfall'];
-$lang->block->default['scrum']['project']['1']['title'] = 'Project Overview';
+$lang->block->default['scrum']['project']['1']['title'] = $lang->projectCommon . ' Overview';
$lang->block->default['scrum']['project']['1']['block'] = 'scrumoverview';
$lang->block->default['scrum']['project']['1']['grid'] = 8;
@@ -288,7 +288,7 @@ $lang->block->default['full']['my']['4']['grid'] = 4;
$lang->block->default['full']['my']['4']['source'] = 'todo';
$lang->block->default['full']['my']['4']['params']['count'] = '20';
-$lang->block->default['full']['my']['5']['title'] = 'Project Statistic';
+$lang->block->default['full']['my']['5']['title'] = "{$lang->projectCommon} Statistic";
$lang->block->default['full']['my']['5']['block'] = 'statistic';
$lang->block->default['full']['my']['5']['source'] = 'project';
$lang->block->default['full']['my']['5']['grid'] = 8;
@@ -299,8 +299,8 @@ $lang->block->default['full']['my']['6']['block'] = 'contribute';
$lang->block->default['full']['my']['6']['source'] = '';
$lang->block->default['full']['my']['6']['grid'] = 4;
-$lang->block->default['full']['my']['7']['title'] = 'Recent Projects';
-$lang->block->default['full']['my']['7']['block'] = 'recentproject';
+$lang->block->default['full']['my']['7']['title'] = "Recent {$lang->projectCommon}s";
+$lang->block->default['full']['my']['7']['block'] = "recent{$lang->projectCommon}";
$lang->block->default['full']['my']['7']['source'] = 'project';
$lang->block->default['full']['my']['7']['grid'] = 8;
@@ -324,8 +324,8 @@ $lang->block->default['full']['my']['9']['block'] = 'projectteam';
$lang->block->default['full']['my']['9']['source'] = 'project';
$lang->block->default['full']['my']['9']['grid'] = 8;
-$lang->block->default['full']['my']['10']['title'] = 'Project List';
-$lang->block->default['full']['my']['10']['block'] = 'project';
+$lang->block->default['full']['my']['10']['title'] = "{$lang->projectCommon} List";
+$lang->block->default['full']['my']['10']['block'] = $lang->projectCommon;
$lang->block->default['full']['my']['10']['source'] = 'project';
$lang->block->default['full']['my']['10']['grid'] = 8;
@@ -356,21 +356,21 @@ $lang->block->availableBlocks->feedback = 'Feedbacks';
$lang->block->availableBlocks->ticket = 'Tickets';
$lang->block->moduleList['product'] = $lang->productCommon;
-$lang->block->moduleList['project'] = 'Project';
+$lang->block->moduleList['project'] = $lang->projectCommon;
$lang->block->moduleList['execution'] = $lang->execution->common;
$lang->block->moduleList['qa'] = 'Test';
$lang->block->moduleList['todo'] = 'Todo';
$lang->block->modules['project'] = new stdclass();
$lang->block->modules['project']->availableBlocks = new stdclass();
-$lang->block->modules['project']->availableBlocks->project = 'Project List';
-$lang->block->modules['project']->availableBlocks->recentproject = 'Recent Project';
-$lang->block->modules['project']->availableBlocks->statistic = 'Project Statistic';
-$lang->block->modules['project']->availableBlocks->projectteam = 'Project Manpower Input';
+$lang->block->modules['project']->availableBlocks->project = "{$lang->projectCommon} List";
+$lang->block->modules['project']->availableBlocks->recentproject = "Recent {$lang->projectCommon}";
+$lang->block->modules['project']->availableBlocks->statistic = "{$lang->projectCommon} Statistic";
+$lang->block->modules['project']->availableBlocks->projectteam = "{$lang->projectCommon} Manpower Input";
$lang->block->modules['scrum']['index'] = new stdclass();
$lang->block->modules['scrum']['index']->availableBlocks = new stdclass();
-$lang->block->modules['scrum']['index']->availableBlocks->scrumoverview = 'Project Overview';
+$lang->block->modules['scrum']['index']->availableBlocks->scrumoverview = "{$lang->projectCommon} Overview";
$lang->block->modules['scrum']['index']->availableBlocks->scrumlist = $lang->executionCommon . ' List';
$lang->block->modules['scrum']['index']->availableBlocks->sprint = $lang->executionCommon . ' Overview';
$lang->block->modules['scrum']['index']->availableBlocks->scrumtest = 'Test Version';
@@ -423,10 +423,10 @@ $lang->block->orderByList->product['status_asc'] = 'Product Status ASC';
$lang->block->orderByList->product['status_desc'] = 'Product Status DESC';
$lang->block->orderByList->project = array();
-$lang->block->orderByList->project['id_asc'] = 'Project ID ASC';
-$lang->block->orderByList->project['id_desc'] = 'Project ID DESC';
-$lang->block->orderByList->project['status_asc'] = 'Project Status ASC';
-$lang->block->orderByList->project['status_desc'] = 'Project Status DESC';
+$lang->block->orderByList->project['id_asc'] = "{$lang->projectCommon} ID ASC";
+$lang->block->orderByList->project['id_desc'] = "{$lang->projectCommon} ID DESC";
+$lang->block->orderByList->project['status_asc'] = "{$lang->projectCommon} Status ASC";
+$lang->block->orderByList->project['status_desc'] = "{$lang->projectCommon} Status DESC";
$lang->block->orderByList->execution = array();
$lang->block->orderByList->execution['id_asc'] = 'Execution ID ASC';
@@ -529,18 +529,18 @@ $lang->block->typeList->testtask['done'] = 'Done';
$lang->block->typeList->testtask['all'] = 'All';
$lang->block->modules['project']->moreLinkList = new stdclass();
-$lang->block->modules['project']->moreLinkList->recentproject = 'project|browse|';
-$lang->block->modules['project']->moreLinkList->statistic = 'project|browse|';
-$lang->block->modules['project']->moreLinkList->project = 'project|browse|';
+$lang->block->modules['project']->moreLinkList->recentproject = "project|browse|";
+$lang->block->modules['project']->moreLinkList->statistic = "project|browse|";
+$lang->block->modules['project']->moreLinkList->project = "project|browse|";
$lang->block->modules['project']->moreLinkList->cmmireport = 'weekly|index|';
$lang->block->modules['project']->moreLinkList->cmmiestimate = 'workestimation|index|';
$lang->block->modules['project']->moreLinkList->cmmiissue = 'issue|browse|';
$lang->block->modules['project']->moreLinkList->cmmirisk = 'risk|browse|';
-$lang->block->modules['project']->moreLinkList->scrumlist = 'project|execution|';
+$lang->block->modules['project']->moreLinkList->scrumlist = "project|execution|";
$lang->block->modules['project']->moreLinkList->scrumtest = 'testtask|browse|';
$lang->block->modules['project']->moreLinkList->scrumproduct = 'product|all|';
-$lang->block->modules['project']->moreLinkList->sprint = 'project|execution|';
-$lang->block->modules['project']->moreLinkList->projectdynamic = 'project|dynamic|';
+$lang->block->modules['project']->moreLinkList->sprint = "project|execution|";
+$lang->block->modules['project']->moreLinkList->projectdynamic = "project|dynamic|";
$lang->block->modules['product']->moreLinkList = new stdclass();
$lang->block->modules['product']->moreLinkList->list = 'product|all|';
@@ -572,9 +572,9 @@ $lang->block->gridOptions[4] = 'Right';
$lang->block->flowchart = array();
$lang->block->flowchart['admin'] = array('Administrator', 'Add Departments', 'Add Users', 'Maintain Privileges');
-if($config->systemMode == 'ALM') $lang->block->flowchart['program'] = array('Program Owner', 'Create Program', 'Link Product', "Create Project", "Budgeting and planning", 'Add Stakeholder');
+if($config->systemMode == 'ALM') $lang->block->flowchart['program'] = array('Program Owner', 'Create Program', "Link {$lang->productCommon}", "Create {$lang->projectCommon}", "Budgeting and planning", 'Add Stakeholder');
$lang->block->flowchart['product'] = array($lang->productCommon . ' Owner', 'Add ' . $lang->productCommon, 'Maintain Modules', 'Maintain Plans', 'Maintain Stories', 'Create Releases');
-$lang->block->flowchart['project'] = array('Project Manager', 'Add projects and ' . $lang->execution->common . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
+$lang->block->flowchart['project'] = array('Project Manager', "Add {$lang->productCommon}s and " . $lang->execution->common . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
$lang->block->flowchart['dev'] = array('Dev Team', 'Claim Tasks/Bugs', 'Design', 'Update Status', 'Finish Tasks/Bugs', 'Commit Code');
$lang->block->flowchart['tester'] = array('Test Team', 'Write Cases', 'Run Cases', 'Report Bugs', 'Verify Bugs', 'Close Bugs');
@@ -587,8 +587,8 @@ $lang->block->zentaoapp->allStorySum = 'Total Stories';
$lang->block->zentaoapp->storyCompleteRate = 'Story CompleteRate';
$lang->block->zentaoapp->latestExecution = 'Latest Execution';
$lang->block->zentaoapp->involvedExecution = 'Involved Execution';
-$lang->block->zentaoapp->mangedProduct = 'Manged Product';
-$lang->block->zentaoapp->involvedProject = 'Involved Project';
+$lang->block->zentaoapp->mangedProduct = "Manged {$lang->productCommon}";
+$lang->block->zentaoapp->involvedProject = "Involved {$lang->projectCommon}";
$lang->block->zentaoapp->customIndexCard = 'Custom Index Cards';
$lang->block->zentaoapp->createStory = 'Story Create';
$lang->block->zentaoapp->createEffort = 'Effort Create';
@@ -599,7 +599,7 @@ $lang->block->zentaoapp->notSupportKanban = 'The mobile terminal does not su
$lang->block->zentaoapp->notSupportVersion = 'This version of ZenTao is not currently supported on the mobile terminal';
$lang->block->zentaoapp->incompatibleVersion = 'The current version of ZenTao is lower, please upgrade to the latest version and try again';
$lang->block->zentaoapp->canNotGetVersion = 'Failed to get ZenTao version, please confirm if the URL is correct';
-$lang->block->zentaoapp->desc = 'ZenTao mobile app provides you with a mobile work environment, which is convenient for managing personal to-do tasks at any time, tracking project progress, and enhancing the flexibility and agility of project management.';
+$lang->block->zentaoapp->desc = "ZenTao mobile app provides you with a mobile work environment, which is convenient for managing personal to-do tasks at any time, tracking {$lang->projectCommon} progress, and enhancing the flexibility and agility of {$lang->projectCommon} management.";
$lang->block->zentaoapp->downloadTip = 'Scan QR code to download';
$lang->block->zentaoclient = new stdClass();
@@ -632,11 +632,11 @@ $lang->block->visionTitle = 'The user interface of ZenTao is divided
$lang->block->visions['rnd'] = new stdclass();
$lang->block->visions['rnd']->key = 'rnd';
$lang->block->visions['rnd']->title = 'Full feature interface';
-$lang->block->visions['rnd']->text = 'Integrate the program, product, project, execution, test, etc., and provide the lifecycle project management solution.';
+$lang->block->visions['rnd']->text = "Integrate the program, {$lang->productCommon}, {$lang->projectCommon}, execution, test, etc., and provide the lifecycle {$lang->projectCommon} management solution.";
$lang->block->visions['lite'] = new stdclass();
$lang->block->visions['lite']->key = 'lite';
$lang->block->visions['lite']->title = 'Operation Management Interface';
-$lang->block->visions['lite']->text = 'Specially designed for Non-R&D teams, and based on the visual Kanban project management model.';
+$lang->block->visions['lite']->text = "Specially designed for Non-R&D teams, and based on the visual Kanban {$lang->projectCommon} management model.";
$lang->block->customModes['light'] = 'Light Mode';
$lang->block->customModes['ALM'] = 'ALM Mode';
@@ -644,4 +644,4 @@ $lang->block->customModes['ALM'] = 'ALM Mode';
$lang->block->customModeTip = new stdClass();
$lang->block->customModeTip->common = 'There are 2 running modes of ZenTao: Light Mode and ALM Mode.';
$lang->block->customModeTip->ALM = 'The concept is more complete and rigorous, and the function is more abundant. It is suitable for medium and large R&D teams.';
-$lang->block->customModeTip->light = 'Provides the core function of project management, suitable for small R&D teams.';
+$lang->block->customModeTip->light = "Provides the core function of {$lang->projectCommon} management, suitable for small R&D teams.";
diff --git a/module/block/lang/fr.php b/module/block/lang/fr.php
index fa7f693d87..0485e43e45 100644
--- a/module/block/lang/fr.php
+++ b/module/block/lang/fr.php
@@ -76,7 +76,7 @@ $lang->block->consumedHours = 'Cost';
$lang->block->time = 'No';
$lang->block->week = 'Week';
$lang->block->month = 'Month';
-$lang->block->selectProduct = 'Product selection';
+$lang->block->selectProduct = "{$lang->productCommon} selection";
$lang->block->of = ' di ';
$lang->block->remain = 'Left';
$lang->block->allStories = 'All';
@@ -114,10 +114,10 @@ $lang->block->left = 'Remain';
$lang->block->titleList['flowchart'] = 'Flow Chart';
$lang->block->titleList['guide'] = 'Guides';
$lang->block->titleList['statistic'] = 'Statistic';
-$lang->block->titleList['recentproject'] = 'Recent Project';
+$lang->block->titleList['recentproject'] = "Recent {$lang->projectCommon}";
$lang->block->titleList['assigntome'] = 'Assign to me';
-$lang->block->titleList['projectteam'] = 'Project manpower input';
-$lang->block->titleList['project'] = 'Project List';
+$lang->block->titleList['projectteam'] = "{$lang->projectCommon} manpower input";
+$lang->block->titleList['project'] = "{$lang->projectCommon} List";
$lang->block->titleList['dynamic'] = 'Dynamic';
$lang->block->titleList['list'] = 'Todo List';
$lang->block->titleList['contribute'] = 'Contribute';
@@ -125,7 +125,7 @@ $lang->block->titleList['scrumoverview'] = 'Scrumoverview';
$lang->block->titleList['scrumtest'] = 'Scrum Test';
$lang->block->titleList['scrumlist'] = 'Scrum List';
$lang->block->titleList['sprint'] = 'Sprint';
-$lang->block->titleList['projectdynamic'] = 'Project Dynamic';
+$lang->block->titleList['projectdynamic'] = "{$lang->projectCommon} Dynamic";
$lang->block->titleList['bug'] = 'Bug';
$lang->block->titleList['case'] = 'Case';
$lang->block->titleList['testtask'] = 'Test Task';
@@ -136,13 +136,13 @@ $lang->block->default['waterfall']['project']['3']['source'] = 'project';
$lang->block->default['waterfall']['project']['3']['grid'] = 8;
$lang->block->default['waterfall']['project']['6']['title'] = 'Dynamic';
-$lang->block->default['waterfall']['project']['6']['block'] = 'dynamic';
+$lang->block->default['waterfall']['project']['6']['block'] = 'projectdynamic';
$lang->block->default['waterfall']['project']['6']['grid'] = 4;
-$lang->block->default['waterfall']['project']['6']['source'] = '';
+$lang->block->default['waterfall']['project']['6']['source'] = 'project';
$lang->block->default['waterfallplus'] = $lang->block->default['waterfall'];
-$lang->block->default['scrum']['project']['1']['title'] = 'Project Overall';
+$lang->block->default['scrum']['project']['1']['title'] = $lang->projectCommon . ' Overall';
$lang->block->default['scrum']['project']['1']['block'] = 'scrumoverview';
$lang->block->default['scrum']['project']['1']['grid'] = 8;
@@ -288,7 +288,7 @@ $lang->block->default['full']['my']['4']['grid'] = 4;
$lang->block->default['full']['my']['4']['source'] = 'todo';
$lang->block->default['full']['my']['4']['params']['count'] = '20';
-$lang->block->default['full']['my']['5']['title'] = 'Project Statistic';
+$lang->block->default['full']['my']['5']['title'] = "{$lang->projectCommon} Statistic";
$lang->block->default['full']['my']['5']['block'] = 'statistic';
$lang->block->default['full']['my']['5']['source'] = 'project';
$lang->block->default['full']['my']['5']['grid'] = 8;
@@ -299,9 +299,9 @@ $lang->block->default['full']['my']['6']['block'] = 'recentproject';
$lang->block->default['full']['my']['6']['source'] = 'project';
$lang->block->default['full']['my']['6']['grid'] = 8;
-$lang->block->default['full']['my']['7']['title'] = 'Todo';
-$lang->block->default['full']['my']['7']['block'] = 'assigntome';
-$lang->block->default['full']['my']['7']['source'] = '';
+$lang->block->default['full']['my']['7']['title'] = "Recent {$lang->projectCommon}s";
+$lang->block->default['full']['my']['7']['block'] = "recent{$lang->projectCommon}";
+$lang->block->default['full']['my']['7']['source'] = 'project';
$lang->block->default['full']['my']['7']['grid'] = 8;
$lang->block->default['full']['my']['8']['title'] = 'Human Input';
@@ -324,8 +324,8 @@ $lang->block->default['full']['my']['9']['block'] = 'project';
$lang->block->default['full']['my']['9']['source'] = 'project';
$lang->block->default['full']['my']['9']['grid'] = 8;
-$lang->block->default['full']['my']['10']['title'] = 'Project List';
-$lang->block->default['full']['my']['10']['block'] = 'project';
+$lang->block->default['full']['my']['10']['title'] = "{$lang->projectCommon} List";
+$lang->block->default['full']['my']['10']['block'] = $lang->projectCommon;
$lang->block->default['full']['my']['10']['source'] = 'project';
$lang->block->default['full']['my']['10']['grid'] = 8;
@@ -356,21 +356,21 @@ $lang->block->availableBlocks->feedback = 'Feedbacks';
$lang->block->availableBlocks->ticket = 'Tickets';
$lang->block->moduleList['product'] = $lang->productCommon;
-$lang->block->moduleList['project'] = 'Project';
+$lang->block->moduleList['project'] = $lang->projectCommon;
$lang->block->moduleList['execution'] = $lang->execution->common;
$lang->block->moduleList['qa'] = 'Test';
$lang->block->moduleList['todo'] = 'Todo';
$lang->block->modules['project'] = new stdclass();
$lang->block->modules['project']->availableBlocks = new stdclass();
-$lang->block->modules['project']->availableBlocks->project = 'Project List';
-$lang->block->modules['project']->availableBlocks->recentproject = 'Recent Projects';
-$lang->block->modules['project']->availableBlocks->statistic = 'Project Statistic';
-$lang->block->modules['project']->availableBlocks->projectteam = 'Project Human Input';
+$lang->block->modules['project']->availableBlocks->project = "{$lang->projectCommon} List";
+$lang->block->modules['project']->availableBlocks->recentproject = "Recent {$lang->projectCommon}";
+$lang->block->modules['project']->availableBlocks->statistic = "{$lang->projectCommon} Statistic";
+$lang->block->modules['project']->availableBlocks->projectteam = "{$lang->projectCommon} Manpower Input";
$lang->block->modules['scrum']['index'] = new stdclass();
$lang->block->modules['scrum']['index']->availableBlocks = new stdclass();
-$lang->block->modules['scrum']['index']->availableBlocks->scrumoverview = 'Project Overview';
+$lang->block->modules['scrum']['index']->availableBlocks->scrumoverview = "{$lang->projectCommon} Overview";
$lang->block->modules['scrum']['index']->availableBlocks->scrumlist = $lang->executionCommon . ' List';
$lang->block->modules['scrum']['index']->availableBlocks->sprint = $lang->executionCommon . ' Overview';
$lang->block->modules['scrum']['index']->availableBlocks->scrumtest = 'Test Version';
@@ -423,10 +423,10 @@ $lang->block->orderByList->product['status_asc'] = 'Tri par Statut ASC';
$lang->block->orderByList->product['status_desc'] = 'Tri par Statut DESC';
$lang->block->orderByList->project = array();
-$lang->block->orderByList->project['id_asc'] = 'Tri par ID Projet ASC';
-$lang->block->orderByList->project['id_desc'] = 'Tri par ID Projet DESC';
-$lang->block->orderByList->project['status_asc'] = 'Tri par Statut ASC';
-$lang->block->orderByList->project['status_desc'] = 'Tri par Statut DESC';
+$lang->block->orderByList->project['id_asc'] = "{$lang->projectCommon} ID ASC";
+$lang->block->orderByList->project['id_desc'] = "{$lang->projectCommon} ID DESC";
+$lang->block->orderByList->project['status_asc'] = "{$lang->projectCommon} Status ASC";
+$lang->block->orderByList->project['status_desc'] = "{$lang->projectCommon} Status DESC";
$lang->block->orderByList->execution = array();
$lang->block->orderByList->execution['id_asc'] = 'Tri par ID Execution ASC';
@@ -529,18 +529,18 @@ $lang->block->typeList->testtask['done'] = 'Jouées';
$lang->block->typeList->testtask['all'] = 'Toutes';
$lang->block->modules['project']->moreLinkList = new stdclass();
-$lang->block->modules['project']->moreLinkList->recentproject = 'project|browse|';
-$lang->block->modules['project']->moreLinkList->statistic = 'project|browse|';
-$lang->block->modules['project']->moreLinkList->project = 'project|browse|';
+$lang->block->modules['project']->moreLinkList->recentproject = "project|browse|";
+$lang->block->modules['project']->moreLinkList->statistic = "project|browse|";
+$lang->block->modules['project']->moreLinkList->project = "project|browse|";
$lang->block->modules['project']->moreLinkList->cmmireport = 'weekly|index|';
$lang->block->modules['project']->moreLinkList->cmmiestimate = 'workestimation|index|';
$lang->block->modules['project']->moreLinkList->cmmiissue = 'issue|browse|';
$lang->block->modules['project']->moreLinkList->cmmirisk = 'risk|browse|';
-$lang->block->modules['project']->moreLinkList->scrumlist = 'project|execution|';
+$lang->block->modules['project']->moreLinkList->scrumlist = "project|execution|";
$lang->block->modules['project']->moreLinkList->scrumtest = 'testtask|browse|';
$lang->block->modules['project']->moreLinkList->scrumproduct = 'product|all|';
-$lang->block->modules['project']->moreLinkList->sprint = 'project|execution|';
-$lang->block->modules['project']->moreLinkList->projectdynamic = 'project|dynamic|';
+$lang->block->modules['project']->moreLinkList->sprint = "project|execution|";
+$lang->block->modules['project']->moreLinkList->projectdynamic = "project|dynamic|";
$lang->block->modules['product']->moreLinkList = new stdclass();
$lang->block->modules['product']->moreLinkList->list = 'product|all|';
@@ -572,9 +572,9 @@ $lang->block->gridOptions[4] = 'Right';
$lang->block->flowchart = array();
$lang->block->flowchart['admin'] = array('Administrateur', 'Add Departments', 'Ajoute Utilisateurs', 'Administre Privilèges');
-if($config->systemMode == 'ALM') $lang->block->flowchart['program'] = array('Program Owner', 'Create Program', 'Link Product', "Create Project", "Budgeting and planning", 'Add Stakeholder');
+if($config->systemMode == 'ALM') $lang->block->flowchart['program'] = array('Program Owner', 'Create Program', "Link {$lang->productCommon}", "Create {$lang->projectCommon}", "Budgeting and planning", 'Add Stakeholder');
$lang->block->flowchart['product'] = array($lang->productCommon . ' Owner', 'Ajoute ' . $lang->productCommon . '/Modules', 'Ajoute ' . $lang->executionCommon . 's', 'Ajoute Stories', 'Maintient Plans', 'Crée Releases');
-$lang->block->flowchart['project'] = array('Project Manager', 'Add projects and ' . $lang->execution->common . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
+$lang->block->flowchart['project'] = array('Project Manager', "Add {$lang->productCommon}s and " . $lang->execution->common . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
$lang->block->flowchart['dev'] = array('Développeurs', 'Réclament Tâches/Bugs', 'Effectuent Tâches', 'Corrigent Bugs', 'MàJ Statuts', 'Terminent Tâches/Bugs');
$lang->block->flowchart['tester'] = array('Testeurs', 'Rédigent CasTests', 'Jouent CasTests', 'Détectent Bugs', 'Vérifient Corrections', 'Ferment Bugs');
@@ -587,8 +587,8 @@ $lang->block->zentaoapp->allStorySum = 'Total Stories';
$lang->block->zentaoapp->storyCompleteRate = 'Story CompleteRate';
$lang->block->zentaoapp->latestExecution = 'Latest Execution';
$lang->block->zentaoapp->involvedExecution = 'Involved Execution';
-$lang->block->zentaoapp->mangedProduct = 'Manged Product';
-$lang->block->zentaoapp->involvedProject = 'Involved Project';
+$lang->block->zentaoapp->mangedProduct = "Manged {$lang->productCommon}";
+$lang->block->zentaoapp->involvedProject = "Involved {$lang->projectCommon}";
$lang->block->zentaoapp->customIndexCard = 'Custom Index Cards';
$lang->block->zentaoapp->createStory = 'Story Create';
$lang->block->zentaoapp->createEffort = 'Effort Create';
@@ -599,7 +599,7 @@ $lang->block->zentaoapp->notSupportKanban = 'The mobile terminal does not su
$lang->block->zentaoapp->notSupportVersion = 'This version of ZenTao is not currently supported on the mobile terminal';
$lang->block->zentaoapp->incompatibleVersion = 'The current version of ZenTao is lower, please upgrade to the latest version and try again';
$lang->block->zentaoapp->canNotGetVersion = 'Failed to get ZenTao version, please confirm if the URL is correct';
-$lang->block->zentaoapp->desc = 'ZenTao mobile app provides you with a mobile work environment, which is convenient for managing personal to-do tasks at any time, tracking project progress, and enhancing the flexibility and agility of project management.';
+$lang->block->zentaoapp->desc = "ZenTao mobile app provides you with a mobile work environment, which is convenient for managing personal to-do tasks at any time, tracking {$lang->projectCommon} progress, and enhancing the flexibility and agility of {$lang->projectCommon} management.";
$lang->block->zentaoapp->downloadTip = 'Scan QR code to download';
$lang->block->zentaoclient = new stdClass();
@@ -632,11 +632,11 @@ $lang->block->visionTitle = 'The user interface of ZenTao is divided
$lang->block->visions['rnd'] = new stdclass();
$lang->block->visions['rnd']->key = 'rnd';
$lang->block->visions['rnd']->title = 'Full feature interface';
-$lang->block->visions['rnd']->text = 'Integrate the program, product, project, execution, test, etc., and provide the lifecycle project management solution.';
+$lang->block->visions['rnd']->text = "Integrate the program, {$lang->productCommon}, {$lang->projectCommon}, execution, test, etc., and provide the lifecycle {$lang->projectCommon} management solution.";
$lang->block->visions['lite'] = new stdclass();
$lang->block->visions['lite']->key = 'lite';
$lang->block->visions['lite']->title = 'Operation Management Interface';
-$lang->block->visions['lite']->text = 'Specially designed for Non-R&D teams, and based on the visual Kanban project management model.';
+$lang->block->visions['lite']->text = "Specially designed for Non-R&D teams, and based on the visual Kanban {$lang->projectCommon} management model.";
$lang->block->customModes['light'] = 'Light Mode';
$lang->block->customModes['ALM'] = 'ALM Mode';
@@ -644,4 +644,4 @@ $lang->block->customModes['ALM'] = 'ALM Mode';
$lang->block->customModeTip = new stdClass();
$lang->block->customModeTip->common = 'There are 2 running modes of ZenTao: Light Mode and ALM Mode.';
$lang->block->customModeTip->ALM = 'The concept is more complete and rigorous, and the function is more abundant. It is suitable for medium and large R&D teams.';
-$lang->block->customModeTip->light = 'Provides the core function of project management, suitable for small R&D teams.';
+$lang->block->customModeTip->light = "Provides the core function of {$lang->projectCommon} management, suitable for small R&D teams.";
diff --git a/module/block/lang/zh-cn.php b/module/block/lang/zh-cn.php
index d110b596ca..0af3f1887a 100644
--- a/module/block/lang/zh-cn.php
+++ b/module/block/lang/zh-cn.php
@@ -76,7 +76,7 @@ $lang->block->consumedHours = '已消耗';
$lang->block->time = '第';
$lang->block->week = '周';
$lang->block->month = '月';
-$lang->block->selectProduct = '选择产品';
+$lang->block->selectProduct = "选择{$lang->productCommon}";
$lang->block->of = '的';
$lang->block->remain = '剩余工时';
$lang->block->allStories = '总需求';
@@ -113,15 +113,15 @@ $lang->block->left = '剩余';
$lang->block->titleList['flowchart'] = '流程图';
$lang->block->titleList['guide'] = '使用帮助';
-$lang->block->titleList['statistic'] = '项目统计';
-$lang->block->titleList['recentproject'] = '我近期参与的项目';
+$lang->block->titleList['statistic'] = "{$lang->projectCommon}统计";
+$lang->block->titleList['recentproject'] = "我近期参与的{$lang->projectCommon}";
$lang->block->titleList['assigntome'] = '待处理';
-$lang->block->titleList['projectteam'] = '项目人力投入';
-$lang->block->titleList['project'] = '项目列表';
+$lang->block->titleList['projectteam'] = "{$lang->projectCommon}人力投入";
+$lang->block->titleList['project'] = "{$lang->projectCommon}列表";
$lang->block->titleList['dynamic'] = '最新动态';
$lang->block->titleList['list'] = '我的待办';
$lang->block->titleList['contribute'] = '我的贡献';
-$lang->block->titleList['scrumoverview'] = '项目概况';
+$lang->block->titleList['scrumoverview'] = "{$lang->projectCommon}概况";
$lang->block->titleList['scrumtest'] = '待测版本';
$lang->block->titleList['scrumlist'] = '迭代列表';
$lang->block->titleList['sprint'] = '迭代总览';
@@ -130,7 +130,7 @@ $lang->block->titleList['bug'] = '指派给我的Bug';
$lang->block->titleList['case'] = '指派给我的用例';
$lang->block->titleList['testtask'] = '待测版本列表';
-$lang->block->default['waterfall']['project']['3']['title'] = "项目计划";
+$lang->block->default['waterfall']['project']['3']['title'] = "{$lang->projectCommon}计划";
$lang->block->default['waterfall']['project']['3']['block'] = 'waterfallgantt';
$lang->block->default['waterfall']['project']['3']['source'] = 'project';
$lang->block->default['waterfall']['project']['3']['grid'] = 8;
@@ -142,7 +142,7 @@ $lang->block->default['waterfall']['project']['6']['source'] = 'project';
$lang->block->default['waterfallplus'] = $lang->block->default['waterfall'];
-$lang->block->default['scrum']['project']['1']['title'] = '项目概况';
+$lang->block->default['scrum']['project']['1']['title'] = $lang->projectCommon . '概况';
$lang->block->default['scrum']['project']['1']['block'] = 'scrumoverview';
$lang->block->default['scrum']['project']['1']['grid'] = 8;
@@ -288,7 +288,7 @@ $lang->block->default['full']['my']['4']['grid'] = 4;
$lang->block->default['full']['my']['4']['source'] = 'todo';
$lang->block->default['full']['my']['4']['params']['count'] = '20';
-$lang->block->default['full']['my']['5']['title'] = '项目统计';
+$lang->block->default['full']['my']['5']['title'] = "{$lang->projectCommon}统计";
$lang->block->default['full']['my']['5']['block'] = 'statistic';
$lang->block->default['full']['my']['5']['source'] = 'project';
$lang->block->default['full']['my']['5']['grid'] = 8;
@@ -299,7 +299,7 @@ $lang->block->default['full']['my']['6']['block'] = 'contribute';
$lang->block->default['full']['my']['6']['source'] = '';
$lang->block->default['full']['my']['6']['grid'] = 4;
-$lang->block->default['full']['my']['7']['title'] = '我近期参与的项目';
+$lang->block->default['full']['my']['7']['title'] = "我近期参与的{$lang->projectCommon}";
$lang->block->default['full']['my']['7']['block'] = 'recentproject';
$lang->block->default['full']['my']['7']['source'] = 'project';
$lang->block->default['full']['my']['7']['grid'] = 8;
@@ -319,12 +319,12 @@ $lang->block->default['full']['my']['8']['params']['reviewCount'] = '20';
$lang->block->default['full']['my']['8']['params']['meetingCount'] = '20';
$lang->block->default['full']['my']['8']['params']['feedbackCount'] = '20';
-$lang->block->default['full']['my']['9']['title'] = '项目人力投入';
+$lang->block->default['full']['my']['9']['title'] = "{$lang->projectCommon}人力投入";
$lang->block->default['full']['my']['9']['block'] = 'projectteam';
$lang->block->default['full']['my']['9']['source'] = 'project';
$lang->block->default['full']['my']['9']['grid'] = 8;
-$lang->block->default['full']['my']['10']['title'] = '项目列表';
+$lang->block->default['full']['my']['10']['title'] = "{$lang->projectCommon}列表";
$lang->block->default['full']['my']['10']['block'] = 'project';
$lang->block->default['full']['my']['10']['source'] = 'project';
$lang->block->default['full']['my']['10']['grid'] = 8;
@@ -356,21 +356,21 @@ $lang->block->availableBlocks->feedback = '反馈';
$lang->block->availableBlocks->ticket = '工单';
$lang->block->moduleList['product'] = $lang->productCommon;
-$lang->block->moduleList['project'] = '项目';
+$lang->block->moduleList['project'] = $lang->projectCommon;
$lang->block->moduleList['execution'] = $lang->execution->common;
$lang->block->moduleList['qa'] = '测试';
$lang->block->moduleList['todo'] = '待办';
$lang->block->modules['project'] = new stdclass();
$lang->block->modules['project']->availableBlocks = new stdclass();
-$lang->block->modules['project']->availableBlocks->project = '项目列表';
-$lang->block->modules['project']->availableBlocks->recentproject = '近期项目';
-$lang->block->modules['project']->availableBlocks->statistic = '项目统计';
-$lang->block->modules['project']->availableBlocks->projectteam = '项目人力投入';
+$lang->block->modules['project']->availableBlocks->project = "{$lang->projectCommon}列表";
+$lang->block->modules['project']->availableBlocks->recentproject = "近期{$lang->projectCommon}";
+$lang->block->modules['project']->availableBlocks->statistic = "{$lang->projectCommon}统计";
+$lang->block->modules['project']->availableBlocks->projectteam = "{$lang->projectCommon}人力投入";
$lang->block->modules['scrum']['index'] = new stdclass();
$lang->block->modules['scrum']['index']->availableBlocks = new stdclass();
-$lang->block->modules['scrum']['index']->availableBlocks->scrumoverview = '项目概况';
+$lang->block->modules['scrum']['index']->availableBlocks->scrumoverview = "{$lang->projectCommon}概况";
$lang->block->modules['scrum']['index']->availableBlocks->scrumlist = $lang->executionCommon . '列表';
$lang->block->modules['scrum']['index']->availableBlocks->sprint = $lang->executionCommon . '总览';
$lang->block->modules['scrum']['index']->availableBlocks->scrumtest = '待测版本';
@@ -380,7 +380,7 @@ $lang->block->modules['agileplus']['index'] = $lang->block->modules['scrum']['in
$lang->block->modules['waterfall']['index'] = new stdclass();
$lang->block->modules['waterfall']['index']->availableBlocks = new stdclass();
-$lang->block->modules['waterfall']['index']->availableBlocks->waterfallgantt = "项目计划";
+$lang->block->modules['waterfall']['index']->availableBlocks->waterfallgantt = "{$lang->projectCommon}计划";
$lang->block->modules['waterfall']['index']->availableBlocks->projectdynamic = '最新动态';
$lang->block->modules['waterfallplus']['index'] = $lang->block->modules['waterfall']['index'];
@@ -572,9 +572,9 @@ $lang->block->gridOptions[4] = '右侧';
$lang->block->flowchart = array();
$lang->block->flowchart['admin'] = array('管理员', '维护部门', '添加用户', '维护权限');
-if($config->systemMode == 'ALM') $lang->block->flowchart['program'] = array('项目集负责人', '创建项目集', '关联产品', "创建项目", "制定预算和规划", '添加干系人');
+if($config->systemMode == 'ALM') $lang->block->flowchart['program'] = array('项目集负责人', '创建项目集', "关联{$lang->productCommon}", "创建{$lang->projectCommon}", "制定预算和规划", '添加干系人');
$lang->block->flowchart['product'] = array($lang->productCommon . '经理', '创建' . $lang->productCommon, '维护模块', "维护计划", "维护需求", '创建发布');
-$lang->block->flowchart['project'] = array('项目经理', '创建项目、' . $lang->execution->common, '维护团队', "关联需求", '分解任务', '跟踪进度');
+$lang->block->flowchart['project'] = array('项目经理', "创建{$lang->productCommon}、" . $lang->execution->common, '维护团队', "关联需求", '分解任务', '跟踪进度');
$lang->block->flowchart['dev'] = array('研发人员', '领取任务和Bug', '设计实现方案', '更新状态', '完成任务和Bug', '提交代码');
$lang->block->flowchart['tester'] = array('测试人员', '撰写用例', '执行用例', '提交Bug', '验证Bug', '关闭Bug');
@@ -587,8 +587,8 @@ $lang->block->zentaoapp->allStorySum = '需求总数';
$lang->block->zentaoapp->storyCompleteRate = '需求完成率';
$lang->block->zentaoapp->latestExecution = '近期执行';
$lang->block->zentaoapp->involvedExecution = '我参与的执行';
-$lang->block->zentaoapp->mangedProduct = '负责产品';
-$lang->block->zentaoapp->involvedProject = '参与项目';
+$lang->block->zentaoapp->mangedProduct = "负责{$lang->productCommon}";
+$lang->block->zentaoapp->involvedProject = "参与{$lang->projectCommon}";
$lang->block->zentaoapp->customIndexCard = '定制首页卡片';
$lang->block->zentaoapp->createStory = '提需求';
$lang->block->zentaoapp->createEffort = '记日志';
@@ -599,7 +599,7 @@ $lang->block->zentaoapp->notSupportKanban = '移动端暂不支持研发看
$lang->block->zentaoapp->notSupportVersion = '移动端暂不支持该禅道版本';
$lang->block->zentaoapp->incompatibleVersion = '当前禅道版本较低,请升级至最新版本后再试';
$lang->block->zentaoapp->canNotGetVersion = '获取禅道版本失败,请确认网址是否正确';
-$lang->block->zentaoapp->desc = '禅道移动端为您提供移动办公的环境,方便随时管理个人待办事务,跟进项目进度,增强了项目管理的灵活性和敏捷性。';
+$lang->block->zentaoapp->desc = "禅道移动端为您提供移动办公的环境,方便随时管理个人待办事务,跟进{$lang->projectCommon}进度,增强了{$lang->projectCommon}管理的灵活性和敏捷性。";
$lang->block->zentaoapp->downloadTip = '扫描二维码下载';
$lang->block->zentaoclient = new stdClass();
@@ -632,11 +632,11 @@ $lang->block->visionTitle = '禅道使用界面分为【研发综合
$lang->block->visions['rnd'] = new stdclass();
$lang->block->visions['rnd']->key = 'rnd';
$lang->block->visions['rnd']->title = '研发综合界面';
-$lang->block->visions['rnd']->text = '集项目集、产品、项目、执行、测试等多维度管理于一体,提供全过程项目管理解决方案。';
+$lang->block->visions['rnd']->text = "集项目集、{$lang->productCommon}、{$lang->projectCommon}、执行、测试等多维度管理于一体,提供全过程{$lang->projectCommon}管理解决方案。";
$lang->block->visions['lite'] = new stdclass();
$lang->block->visions['lite']->key = 'lite';
$lang->block->visions['lite']->title = '运营管理界面';
-$lang->block->visions['lite']->text = '专为非研发团队打造,主要以直观、可视化的看板项目管理模型为主。';
+$lang->block->visions['lite']->text = "专为非研发团队打造,主要以直观、可视化的看板{$lang->projectCommon}管理模型为主。";
$lang->block->customModes['light'] = '轻量管理模式';
$lang->block->customModes['ALM'] = '全生命周期管理模式';
@@ -644,4 +644,4 @@ $lang->block->customModes['ALM'] = '全生命周期管理模式';
$lang->block->customModeTip = new stdClass();
$lang->block->customModeTip->common = '禅道运行模式分为【轻量级管理模式】和【全生命周期管理模式】。';
$lang->block->customModeTip->ALM = '适用于中大型团队的管理模式,概念更加完整、严谨,功能更丰富。';
-$lang->block->customModeTip->light = '适用于小型研发团队的管理模式,提供项目管理的核心功能。';
+$lang->block->customModeTip->light = "适用于小型研发团队的管理模式,提供{$lang->projectCommon}管理的核心功能。";
diff --git a/module/block/model.php b/module/block/model.php
index 383315585e..fcb3d99bab 100644
--- a/module/block/model.php
+++ b/module/block/model.php
@@ -1072,4 +1072,43 @@ class blockModel extends model
{
return $this->dao->select('count(estimate) as estimate')->from(TABLE_STORY)->where('id')->in($storyID)->fetch('estimate');
}
+
+ /**
+ * Get zentao.net data.
+ *
+ * @param string $minTime
+ * @access public
+ * @return array
+ */
+ public function getZentaoData($minTime = '')
+ {
+ return $this->dao->select('type,params')->from(TABLE_BLOCK)
+ ->where('account')->eq('system')
+ ->andWhere('vision')->eq('rnd')
+ ->andWhere('module')->eq('zentao')
+ ->beginIF($minTime)->andWhere('source')->ge($minTime)->fi()
+ ->andWhere('type')->in('plugin,patch,publicclass,news')
+ ->fetchPairs('type');
+ }
+
+ /**
+ * Set zentao data.
+ *
+ * @param string $type
+ * @param string $params
+ * @access public
+ * @return void
+ */
+ public function setZentaoData($type = 'patch', $params = '')
+ {
+ $data = new stdclass();
+ $data->account = 'system';
+ $data->vision = 'rnd';
+ $data->module = 'zentao';
+ $data->type = $type;
+ $data->source = date('Y-m-d');
+ $data->params = json_encode($params);
+
+ $this->dao->replace(TABLE_BLOCK)->data($data)->exec();
+ }
}
diff --git a/module/block/view/preference.html.php b/module/block/view/preference.html.php
index 3f93a22484..dedd47f4f3 100644
--- a/module/block/view/preference.html.php
+++ b/module/block/view/preference.html.php
@@ -53,7 +53,6 @@
.picker-single .picker-option.picker-option-selected.picker-option-active.option-ursr > .border,
.picker-single .picker-option.picker-option-selected.picker-option-active.option-ursr > .border {
background: rgba(230,240,255, 0.4)!important;
- border: 1px solid #2E7FFF;
}
#pickerDropMenu-pk_URSR > .picker-option-list {
display: flex;
@@ -173,7 +172,7 @@ function initPreference() {
$option.addClass('option-ursr');
$option.parent().addClass('list-ursr');
$option.empty();
- $option.prepend('
');
+ $option.prepend('
');
}
return $option;
}
@@ -204,4 +203,5 @@ $(function()
initPreference();
})
-
\ No newline at end of file
+
+
diff --git a/module/block/view/projectstatisticblock.html.php b/module/block/view/projectstatisticblock.html.php
index cf797124b2..b19671ee3c 100755
--- a/module/block/view/projectstatisticblock.html.php
+++ b/module/block/view/projectstatisticblock.html.php
@@ -205,7 +205,7 @@ $(function()
- executions[0]->hours->progress . '%';?>
+ executions[0]->hours->progress) ? $project->executions[0]->hours->progress . '%' : '0%';?>
diff --git a/module/block/view/reviewblock.html.php b/module/block/view/reviewblock.html.php
index 99d7e0859d..6ade6c5873 100644
--- a/module/block/view/reviewblock.html.php
+++ b/module/block/view/reviewblock.html.php
@@ -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];
diff --git a/module/branch/lang/de.php b/module/branch/lang/de.php
index c75f2eb77f..581f013394 100644
--- a/module/branch/lang/de.php
+++ b/module/branch/lang/de.php
@@ -27,7 +27,7 @@ $lang->branch->mergeBranch = 'Merge branch';
$lang->branch->mergeBranchAction = 'Merge branch';
$lang->branch->id = 'ID';
-$lang->branch->product = 'Produkt';
+$lang->branch->product = $lang->productCommon;
$lang->branch->name = 'Name';
$lang->branch->status = 'Status';
$lang->branch->createdDate = 'Created Date';
@@ -51,7 +51,7 @@ $lang->branch->targetBranchTips = 'You can merge it into an existing branch, me
$lang->branch->confirmMerge = 'The data of "mergedBranch" will be merged into "targetBranch", please confirm whether you want to perform the branch merge operation, the data will not be restored after the merge!';
$lang->branch->noData = 'No branches.';
-$lang->branch->mainBranch = 'The default main branch of the product.';
+$lang->branch->mainBranch = "The default main %s of the {$lang->productCommon}.";
$lang->branch->statusList = array();
$lang->branch->statusList['active'] = 'Active';
diff --git a/module/branch/lang/en.php b/module/branch/lang/en.php
index de6a6dd0fa..432566089d 100644
--- a/module/branch/lang/en.php
+++ b/module/branch/lang/en.php
@@ -27,7 +27,7 @@ $lang->branch->mergeBranch = 'Merge branch';
$lang->branch->mergeBranchAction = 'Merge branch';
$lang->branch->id = 'ID';
-$lang->branch->product = 'Product';
+$lang->branch->product = $lang->productCommon;
$lang->branch->name = 'Name';
$lang->branch->status = 'Status';
$lang->branch->createdDate = 'Created Date';
@@ -51,7 +51,7 @@ $lang->branch->targetBranchTips = 'You can merge it into an existing branch, me
$lang->branch->confirmMerge = 'The data of "mergedBranch" will be merged into "targetBranch", please confirm whether you want to perform the branch merge operation, the data will not be restored after the merge!';
$lang->branch->noData = 'No branches.';
-$lang->branch->mainBranch = 'The default main %s of the product.';
+$lang->branch->mainBranch = "The default main %s of the {$lang->productCommon}.";
$lang->branch->statusList = array();
$lang->branch->statusList['active'] = 'Active';
diff --git a/module/branch/lang/fr.php b/module/branch/lang/fr.php
index 7d33096926..bbd6e6196a 100644
--- a/module/branch/lang/fr.php
+++ b/module/branch/lang/fr.php
@@ -27,7 +27,7 @@ $lang->branch->mergeBranch = 'Merge branch';
$lang->branch->mergeBranchAction = 'Merge branch';
$lang->branch->id = 'ID';
-$lang->branch->product = 'Product';
+$lang->branch->product = $lang->productCommon;
$lang->branch->name = 'Nom';
$lang->branch->status = 'Status';
$lang->branch->createdDate = 'Created Date';
@@ -51,7 +51,7 @@ $lang->branch->targetBranchTips = 'You can merge it into an existing branch, me
$lang->branch->confirmMerge = 'The data of "mergedBranch" will be merged into "targetBranch", please confirm whether you want to perform the branch merge operation, the data will not be restored after the merge!';
$lang->branch->noData = 'No branches.';
-$lang->branch->mainBranch = 'The default main branch of the product.';
+$lang->branch->mainBranch = "The default main %s of the {$lang->productCommon}.";
$lang->branch->statusList = array();
$lang->branch->statusList['active'] = 'Active';
diff --git a/module/branch/lang/zh-cn.php b/module/branch/lang/zh-cn.php
index aa1fcaf3dd..c2a7e52d53 100644
--- a/module/branch/lang/zh-cn.php
+++ b/module/branch/lang/zh-cn.php
@@ -27,7 +27,7 @@ $lang->branch->mergeBranch = '合并@branch@';
$lang->branch->mergeBranchAction = '合并分支';
$lang->branch->id = 'ID';
-$lang->branch->product = '所属产品';
+$lang->branch->product = "所属{$lang->productCommon}";
$lang->branch->name = '%s名称';
$lang->branch->status = '状态';
$lang->branch->createdDate = '创建时间';
@@ -51,7 +51,7 @@ $lang->branch->targetBranchTips = '您可以将其合并到已有的一个@bran
$lang->branch->confirmMerge = '"mergedBranch"的数据将被合并到"targetBranch",请确认是否要执行分支合并操作,合并后数据将不可再恢复!';
$lang->branch->noData = '暂时没有分支。';
-$lang->branch->mainBranch = '产品默认主干%s。';
+$lang->branch->mainBranch = "{$lang->productCommon}默认主干%s。";
$lang->branch->statusList = array();
$lang->branch->statusList['active'] = '激活';
diff --git a/module/bug/config.php b/module/bug/config.php
old mode 100644
new mode 100755
index 060992e9ab..d9c707e2f2
--- a/module/bug/config.php
+++ b/module/bug/config.php
@@ -223,7 +223,7 @@ $config->bug->datatable->fieldList['execution']['title'] = 'execution';
$config->bug->datatable->fieldList['execution']['fixed'] = 'no';
$config->bug->datatable->fieldList['execution']['width'] = '120';
$config->bug->datatable->fieldList['execution']['required'] = 'no';
-$config->bug->datatable->fieldList['execution']['dataSource'] = array('module' => 'product', 'method' =>'getAllExecutionPairsByProduct', 'params' => '$productID&$branch');
+$config->bug->datatable->fieldList['execution']['dataSource'] = array('module' => 'product', 'method' =>'getAllExecutionPairsByProduct', 'params' => '$productID&$branch&0&stagefilter');
$config->bug->datatable->fieldList['plan']['title'] = 'plan';
$config->bug->datatable->fieldList['plan']['fixed'] = 'no';
diff --git a/module/bug/control.php b/module/bug/control.php
index 5981d7067e..9c3cbe038f 100755
--- a/module/bug/control.php
+++ b/module/bug/control.php
@@ -636,7 +636,7 @@ class bug extends control
/* Get executions. */
$executions = array(0 => '');
- if(isset($projects[$projectID])) $executions += $this->product->getExecutionPairsByProduct($productID, $branch ? "0,$branch" : 0, 'id_desc', $projectID, !$projectID ? 'multiple' : '');
+ if(isset($projects[$projectID])) $executions += $this->product->getExecutionPairsByProduct($productID, $branch ? "0,$branch" : 0, 'id_desc', $projectID, !$projectID ? 'multiple|stagefilter' : 'stagefilter');
$execution = $executionID ? $this->loadModel('execution')->getByID($executionID) : '';
$executions = isset($executions[$executionID]) ? $executions : $executions + array($executionID => $execution->name);
@@ -859,7 +859,7 @@ class bug extends control
$this->view->users = $this->user->getPairs('devfirst|noclosed');
$this->view->projects = array('' => '') + $this->product->getProjectPairsByProduct($productID, $branch ? "0,$branch" : 0, 'id_desc', $projectID);
$this->view->projectID = $projectID;
- $this->view->executions = array('' => '') + $this->product->getExecutionPairsByProduct($productID, $branch ? "0,$branch" : 0, 'id_desc', $projectID, 'multiple');
+ $this->view->executions = array('' => '') + $this->product->getExecutionPairsByProduct($productID, $branch ? "0,$branch" : 0, 'id_desc', $projectID, 'multiple,stagefilter');
$this->view->executionID = $executionID;
$this->view->moduleOptionMenu = $this->tree->getOptionMenu($productID, $viewType = 'bug', $startModuleID = 0, $branch === 'all' ? 0 : $branch);
$this->view->moduleID = $moduleID;
@@ -1165,6 +1165,16 @@ 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 . "({$this->lang->bug->deleted})";
+
+ $projects = array(0 => '') + $this->product->getProjectPairsByProduct($productID, $bug->branch);
+ if(!empty($bug->project) and empty($projects[$bug->project]))
+ {
+ $project = $this->loadModel('project')->getByID($bug->project);
+ $projects[$project->id] = $project->name . "({$this->lang->bug->deleted})";
+ }
+
if($product->shadow) $this->view->project = $this->loadModel('project')->getByShadowProduct($bug->product);
$this->view->bug = $bug;
@@ -1173,11 +1183,11 @@ class bug extends control
$this->view->productBugs = $productBugs;
$this->view->productName = $this->products[$productID];
$this->view->plans = $this->loadModel('productplan')->getPairs($productID, $bug->branch, '', true);
- $this->view->projects = array(0 => '') + $this->product->getProjectPairsByProduct($productID, $bug->branch, $bug->project);
+ $this->view->projects = $projects;
$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;
@@ -1398,7 +1408,7 @@ class bug extends control
}
/* Set users. */
- $users = $this->user->getPairs('devfirst', '', $this->config->maxCount);
+ $users = $this->user->getPairs('devfirst');
$users = array('' => '', 'ditto' => $this->lang->bug->ditto) + $users;
/* Assign. */
@@ -2490,6 +2500,7 @@ class bug extends control
public function ajaxGetProductBugs($productID, $bugID)
{
$product = $this->loadModel('product')->getById($productID);
+ $bug = $this->bug->getById($bugID);
$branch = $product->type == 'branch' ? ($bug->branch > 0 ? $bug->branch . ',0' : '0') : '';
$productBugs = $this->bug->getProductBugPairs($productID, $branch);
unset($productBugs[$bugID]);
diff --git a/module/bug/js/common.js b/module/bug/js/common.js
index 8c1fb0a745..e50f5bf3ed 100644
--- a/module/bug/js/common.js
+++ b/module/bug/js/common.js
@@ -369,7 +369,7 @@ function loadProductExecutions(productID, projectID = 0)
var execution = $('#execution').val();
}
- link = createLink('product', 'ajaxGetExecutions', 'productID=' + productID + '&projectID=' + projectID + '&branch=' + branch + '&number=&executionID=' + execution);
+ link = createLink('product', 'ajaxGetExecutions', 'productID=' + productID + '&projectID=' + projectID + '&branch=' + branch + '&number=&executionID=' + execution + '&from=&mode=stagefilter');
$('#executionIdBox').load(link, function()
{
$(this).find('select').chosen();
diff --git a/module/bug/lang/de.php b/module/bug/lang/de.php
index ad03e40bd5..d08ee36c26 100644
--- a/module/bug/lang/de.php
+++ b/module/bug/lang/de.php
@@ -17,7 +17,7 @@ $lang->bug->branch = 'Branch/Platform';
$lang->bug->productplan = 'Plan';
$lang->bug->module = 'Modul';
$lang->bug->moduleAB = 'Modul';
-$lang->bug->project = 'Project';
+$lang->bug->project = $lang->projectCommon;
$lang->bug->execution = $lang->execution->common;
$lang->bug->kanban = 'Kanban';
$lang->bug->story = 'Story';
@@ -95,9 +95,9 @@ $lang->bug->toCase = 'Zu Fall';
$lang->bug->colorTag = 'Farb Tag';
$lang->bug->fixedRate = 'Fixed Rate';
$lang->bug->noticefeedbackBy = 'NoticeFeedbackBy';
-$lang->bug->selectProjects = 'Select Projects';
+$lang->bug->selectProjects = "Select {$lang->projectCommon}s";
$lang->bug->nextStep = 'Next Step';
-$lang->bug->noProject = 'Haven’t chosen a project yet.';
+$lang->bug->noProject = "Haven’t chosen a {$lang->projectCommon} yet.";
$lang->bug->noExecution = 'Haven’t chosen a ' . strtolower($lang->execution->common) . ' yet.';
/* Method list. */
@@ -154,7 +154,7 @@ $lang->bug->overdueBugs = 'Überfällig';
$lang->bug->allBugs = 'Alle';
$lang->bug->byQuery = 'Suche';
$lang->bug->needConfirm = 'Story geändert';
-$lang->bug->allProject = 'All Projects';
+$lang->bug->allProject = "All {$lang->projectCommon}s";
$lang->bug->allProduct = 'Alle' . $lang->productCommon;
$lang->bug->my = 'Meine';
$lang->bug->yesterdayResolved = 'Gestern gelöst ';
@@ -166,7 +166,7 @@ $lang->bug->openedByMeAB = 'Von mir erstellt';
$lang->bug->resolvedByMeAB = 'Von mir gelöst';
$lang->bug->ditto = 'Dito';
-$lang->bug->dittoNotice = 'This bug is not linked to the same product as the last one!';
+$lang->bug->dittoNotice = "This bug is not linked to the same {$lang->productCommon} as the last one is!";
$lang->bug->noAssigned = 'Zuweisen';
$lang->bug->noBug = 'Keine Bugs. ';
$lang->bug->noModule = '
Sie haben keine Module
Jetzt verwalten
';
@@ -192,8 +192,8 @@ global $config;
/* Legend list. */
$lang->bug->legendBasicInfo = 'Basis Info';
$lang->bug->legendAttatch = 'Anlagen';
-$lang->bug->legendPRJExecStoryTask = 'Project/' . $lang->executionCommon . '/Story/Task';
-$lang->bug->legendExecStoryTask = 'Porject/Story/Task';
+$lang->bug->legendPRJExecStoryTask = "{$lang->SRCommon}/{$lang->executionCommon}/Story/Task";
+$lang->bug->legendExecStoryTask = "{$lang->SRCommon}/Story/Task";
$lang->bug->lblTypeAndSeverity = 'Typ/Schwere';
$lang->bug->lblSystemBrowserAndHardware = 'System/Browser';
$lang->bug->legendSteps = 'Reproduktionsschritte';
@@ -426,11 +426,11 @@ $lang->bug->featureBar['browse']['resolvedbyme'] = $lang->bug->resolvedByMe;
$lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved;
$lang->bug->featureBar['browse']['more'] = $lang->more;
-$lang->bug->moreSelects['assignedbyme'] = $lang->bug->assignedByMe;
-$lang->bug->moreSelects['unconfirmed'] = $lang->bug->unconfirmed;
-$lang->bug->moreSelects['assigntonull'] = $lang->bug->assignToNull;
-$lang->bug->moreSelects['longlifebugs'] = $lang->bug->longLifeBugs;
-$lang->bug->moreSelects['toclosed'] = $lang->bug->toClosed;
-$lang->bug->moreSelects['postponedbugs'] = $lang->bug->postponedBugs;
-$lang->bug->moreSelects['overduebugs'] = $lang->bug->overdueBugs;
-$lang->bug->moreSelects['needconfirm'] = $lang->bug->needConfirm;
+$lang->bug->moreSelects['browse']['more']['assignedbyme'] = $lang->bug->assignedByMe;
+$lang->bug->moreSelects['browse']['more']['unconfirmed'] = $lang->bug->unconfirmed;
+$lang->bug->moreSelects['browse']['more']['assigntonull'] = $lang->bug->assignToNull;
+$lang->bug->moreSelects['browse']['more']['longlifebugs'] = $lang->bug->longLifeBugs;
+$lang->bug->moreSelects['browse']['more']['toclosed'] = $lang->bug->toClosed;
+$lang->bug->moreSelects['browse']['more']['postponedbugs'] = $lang->bug->postponedBugs;
+$lang->bug->moreSelects['browse']['more']['overduebugs'] = $lang->bug->overdueBugs;
+$lang->bug->moreSelects['browse']['more']['needconfirm'] = $lang->bug->needConfirm;
diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php
index 480117db33..1e3c5a687f 100644
--- a/module/bug/lang/en.php
+++ b/module/bug/lang/en.php
@@ -17,7 +17,7 @@ $lang->bug->branch = 'Branch/Platform';
$lang->bug->productplan = 'Plan';
$lang->bug->module = 'Module';
$lang->bug->moduleAB = 'Module';
-$lang->bug->project = 'Project';
+$lang->bug->project = $lang->projectCommon;
$lang->bug->execution = $lang->execution->common;
$lang->bug->kanban = 'Kanban';
$lang->bug->story = 'Story';
@@ -95,9 +95,9 @@ $lang->bug->toCase = 'To Case';
$lang->bug->colorTag = 'Color';
$lang->bug->fixedRate = 'Fixed Rate';
$lang->bug->noticefeedbackBy = 'NoticeFeedbackBy';
-$lang->bug->selectProjects = 'Select Projects';
+$lang->bug->selectProjects = "Select {$lang->projectCommon}s";
$lang->bug->nextStep = 'Next Step';
-$lang->bug->noProject = 'Haven’t chosen a project yet.';
+$lang->bug->noProject = "Haven’t chosen a {$lang->projectCommon} yet.";
$lang->bug->noExecution = 'Haven’t chosen a ' . strtolower($lang->execution->common) . ' yet.';
/* Method list. */
@@ -166,7 +166,7 @@ $lang->bug->openedByMeAB = 'ReportedByMe';
$lang->bug->resolvedByMeAB = 'ResolvedByMe';
$lang->bug->ditto = 'Ditto';
-$lang->bug->dittoNotice = 'This bug is not linked to the same product as the last one is!';
+$lang->bug->dittoNotice = "This bug is not linked to the same {$lang->productCommon} as the last one is!";
$lang->bug->noAssigned = 'Unassigned';
$lang->bug->noBug = 'No bugs yet.';
$lang->bug->noModule = '
You have no modules.
Manage now
';
@@ -192,8 +192,8 @@ global $config;
/* Legend list. */
$lang->bug->legendBasicInfo = 'Basic Info';
$lang->bug->legendAttatch = 'Files';
-$lang->bug->legendPRJExecStoryTask = 'Project/' . $lang->executionCommon . '/Story/Task';
-$lang->bug->legendExecStoryTask = 'Porject/Story/Task';
+$lang->bug->legendPRJExecStoryTask = "{$lang->SRCommon}/{$lang->executionCommon}/Story/Task";
+$lang->bug->legendExecStoryTask = "{$lang->SRCommon}/Story/Task";
$lang->bug->lblTypeAndSeverity = 'Type/Severity';
$lang->bug->lblSystemBrowserAndHardware = 'System/Browser';
$lang->bug->legendSteps = 'Repro Steps';
@@ -426,11 +426,11 @@ $lang->bug->featureBar['browse']['resolvedbyme'] = $lang->bug->resolvedByMe;
$lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved;
$lang->bug->featureBar['browse']['more'] = $lang->more;
-$lang->bug->moreSelects['assignedbyme'] = $lang->bug->assignedByMe;
-$lang->bug->moreSelects['unconfirmed'] = $lang->bug->unconfirmed;
-$lang->bug->moreSelects['assigntonull'] = $lang->bug->assignToNull;
-$lang->bug->moreSelects['longlifebugs'] = $lang->bug->longLifeBugs;
-$lang->bug->moreSelects['toclosed'] = $lang->bug->toClosed;
-$lang->bug->moreSelects['postponedbugs'] = $lang->bug->postponedBugs;
-$lang->bug->moreSelects['overduebugs'] = $lang->bug->overdueBugs;
-$lang->bug->moreSelects['needconfirm'] = $lang->bug->needConfirm;
+$lang->bug->moreSelects['browse']['more']['assignedbyme'] = $lang->bug->assignedByMe;
+$lang->bug->moreSelects['browse']['more']['unconfirmed'] = $lang->bug->unconfirmed;
+$lang->bug->moreSelects['browse']['more']['assigntonull'] = $lang->bug->assignToNull;
+$lang->bug->moreSelects['browse']['more']['longlifebugs'] = $lang->bug->longLifeBugs;
+$lang->bug->moreSelects['browse']['more']['toclosed'] = $lang->bug->toClosed;
+$lang->bug->moreSelects['browse']['more']['postponedbugs'] = $lang->bug->postponedBugs;
+$lang->bug->moreSelects['browse']['more']['overduebugs'] = $lang->bug->overdueBugs;
+$lang->bug->moreSelects['browse']['more']['needconfirm'] = $lang->bug->needConfirm;
diff --git a/module/bug/lang/fr.php b/module/bug/lang/fr.php
index 7e25a7dde0..afdb271cbc 100644
--- a/module/bug/lang/fr.php
+++ b/module/bug/lang/fr.php
@@ -17,7 +17,7 @@ $lang->bug->branch = 'Branche/Plateforme';
$lang->bug->productplan = 'Plan';
$lang->bug->module = 'Module';
$lang->bug->moduleAB = 'Module';
-$lang->bug->project = 'Project';
+$lang->bug->project = $lang->projectCommon;
$lang->bug->execution = $lang->execution->common;
$lang->bug->kanban = 'Kanban';
$lang->bug->story = 'Story';
@@ -95,9 +95,9 @@ $lang->bug->toCase = 'vers CasTest';
$lang->bug->colorTag = 'Couleur';
$lang->bug->fixedRate = 'Repair Rate';
$lang->bug->noticefeedbackBy = 'NoticeFeedbackBy';
-$lang->bug->selectProjects = 'Select Projects';
+$lang->bug->selectProjects = "Select {$lang->projectCommon}s";
$lang->bug->nextStep = 'Next Step';
-$lang->bug->noProject = 'Haven’t chosen a project yet.';
+$lang->bug->noProject = "Haven’t chosen a {$lang->projectCommon} yet.";
$lang->bug->noExecution = 'Haven’t chosen a ' . strtolower($lang->execution->common) . ' yet.';
/* Method list. */
@@ -154,7 +154,7 @@ $lang->bug->overdueBugs = 'Retard';
$lang->bug->allBugs = 'Tous';
$lang->bug->byQuery = 'Rechercher';
$lang->bug->needConfirm = 'Story Changée';
-$lang->bug->allProject = 'All Projects';
+$lang->bug->allProject = "All {$lang->projectCommon}s";
$lang->bug->allProduct = 'Tous les ' . $lang->productCommon . 's';
$lang->bug->my = 'Mes';
$lang->bug->yesterdayResolved = 'Bugs Résolus Hier ';
@@ -166,7 +166,7 @@ $lang->bug->openedByMeAB = 'Signalés par Moi';
$lang->bug->resolvedByMeAB = 'Résolus par Moi';
$lang->bug->ditto = 'Idem';
-$lang->bug->dittoNotice = "Ce bug n'est pas lié au même product que le précédent !";
+$lang->bug->dittoNotice = 'This bug is not linked to the same product as the last one!';
$lang->bug->noAssigned = 'Non affectés';
$lang->bug->noBug = "Pas de bug pour l'instant. Bravo !";
$lang->bug->noModule = "
Vous n'avez pas de modules.
Gérer Modules maintenant
";
@@ -192,8 +192,8 @@ global $config;
/* Legend list. */
$lang->bug->legendBasicInfo = 'Infos de Base';
$lang->bug->legendAttatch = 'Fichiers';
-$lang->bug->legendPRJExecStoryTask = 'Project/' . $lang->executionCommon . '/Story/Task';
-$lang->bug->legendExecStoryTask = 'Porject/Story/Task';
+$lang->bug->legendPRJExecStoryTask = "{$lang->SRCommon}/{$lang->executionCommon}/Story/Task";
+$lang->bug->legendExecStoryTask = "{$lang->SRCommon}/Story/Task";
$lang->bug->lblTypeAndSeverity = 'Type/Severité';
$lang->bug->lblSystemBrowserAndHardware = 'Système/Browser';
$lang->bug->legendSteps = 'Etapes Repro';
@@ -426,11 +426,11 @@ $lang->bug->featureBar['browse']['resolvedbyme'] = $lang->bug->resolvedByMe;
$lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved;
$lang->bug->featureBar['browse']['more'] = $lang->more;
-$lang->bug->moreSelects['assignedbyme'] = $lang->bug->assignedByMe;
-$lang->bug->moreSelects['unconfirmed'] = $lang->bug->unconfirmed;
-$lang->bug->moreSelects['assigntonull'] = $lang->bug->assignToNull;
-$lang->bug->moreSelects['longlifebugs'] = $lang->bug->longLifeBugs;
-$lang->bug->moreSelects['toclosed'] = $lang->bug->toClosed;
-$lang->bug->moreSelects['postponedbugs'] = $lang->bug->postponedBugs;
-$lang->bug->moreSelects['overduebugs'] = $lang->bug->overdueBugs;
-$lang->bug->moreSelects['needconfirm'] = $lang->bug->needConfirm;
+$lang->bug->moreSelects['browse']['more']['assignedbyme'] = $lang->bug->assignedByMe;
+$lang->bug->moreSelects['browse']['more']['unconfirmed'] = $lang->bug->unconfirmed;
+$lang->bug->moreSelects['browse']['more']['assigntonull'] = $lang->bug->assignToNull;
+$lang->bug->moreSelects['browse']['more']['longlifebugs'] = $lang->bug->longLifeBugs;
+$lang->bug->moreSelects['browse']['more']['toclosed'] = $lang->bug->toClosed;
+$lang->bug->moreSelects['browse']['more']['postponedbugs'] = $lang->bug->postponedBugs;
+$lang->bug->moreSelects['browse']['more']['overduebugs'] = $lang->bug->overdueBugs;
+$lang->bug->moreSelects['browse']['more']['needconfirm'] = $lang->bug->needConfirm;
diff --git a/module/bug/lang/zh-cn.php b/module/bug/lang/zh-cn.php
index a573c9842a..3b98c2d36c 100644
--- a/module/bug/lang/zh-cn.php
+++ b/module/bug/lang/zh-cn.php
@@ -17,7 +17,7 @@ $lang->bug->branch = '平台/分支';
$lang->bug->productplan = '所属' . '计划';
$lang->bug->module = '所属模块';
$lang->bug->moduleAB = '模块';
-$lang->bug->project = '所属项目';
+$lang->bug->project = '所属' . $lang->projectCommon;
$lang->bug->execution = '所属' . $lang->execution->common;
$lang->bug->kanban = '所属看板';
$lang->bug->story = "相关需求";
@@ -95,9 +95,9 @@ $lang->bug->toCase = '生成用例';
$lang->bug->colorTag = '颜色标签';
$lang->bug->fixedRate = '修复率';
$lang->bug->noticefeedbackBy = '通知反馈者';
-$lang->bug->selectProjects = '选择项目';
+$lang->bug->selectProjects = '选择' . $lang->projectCommon;
$lang->bug->nextStep = '下一步';
-$lang->bug->noProject = '还没有选择项目!';
+$lang->bug->noProject = "还没有选择{$lang->projectCommon}!";
$lang->bug->noExecution = "还没有选择{$lang->execution->common}!";
/* 方法列表。*/
@@ -154,7 +154,7 @@ $lang->bug->overdueBugs = '过期Bug';
$lang->bug->allBugs = '所有';
$lang->bug->byQuery = '搜索';
$lang->bug->needConfirm = "{$lang->SRCommon}变动";
-$lang->bug->allProject = '所有项目';
+$lang->bug->allProject = '所有' . $lang->projectCommon;
$lang->bug->allProduct = '所有' . $lang->productCommon;
$lang->bug->my = '我的';
$lang->bug->yesterdayResolved = '昨天解决Bug数';
@@ -166,7 +166,7 @@ $lang->bug->openedByMeAB = '由我创建';
$lang->bug->resolvedByMeAB = '由我解决';
$lang->bug->ditto = '同上';
-$lang->bug->dittoNotice = '该bug与上一bug不属于同一产品!';
+$lang->bug->dittoNotice = "该bug与上一bug不属于同一{$lang->productCommon}!";
$lang->bug->noAssigned = '未指派';
$lang->bug->noBug = '暂时没有Bug。';
$lang->bug->noModule = '
您现在还没有模块信息
请维护测试模块
';
@@ -192,8 +192,8 @@ global $config;
/* legend列表。*/
$lang->bug->legendBasicInfo = '基本信息';
$lang->bug->legendAttatch = '附件';
-$lang->bug->legendPRJExecStoryTask = "项目/{$lang->executionCommon}/{$lang->SRCommon}/任务";
-$lang->bug->legendExecStoryTask = "项目/{$lang->SRCommon}/任务";
+$lang->bug->legendPRJExecStoryTask = "{$lang->projectCommon}/{$lang->executionCommon}/{$lang->SRCommon}/任务";
+$lang->bug->legendExecStoryTask = "{$lang->projectCommon}/{$lang->SRCommon}/任务";
$lang->bug->lblTypeAndSeverity = '类型/严重程度';
$lang->bug->lblSystemBrowserAndHardware = '系统/浏览器';
$lang->bug->legendSteps = '重现步骤';
@@ -427,10 +427,10 @@ $lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved;
$lang->bug->featureBar['browse']['more'] = $lang->more;
-$lang->bug->moreSelects['unconfirmed'] = $lang->bug->unconfirmed;
-$lang->bug->moreSelects['assigntonull'] = $lang->bug->assignToNull;
-$lang->bug->moreSelects['longlifebugs'] = $lang->bug->longLifeBugs;
-$lang->bug->moreSelects['toclosed'] = $lang->bug->toClosed;
-$lang->bug->moreSelects['postponedbugs'] = $lang->bug->postponedBugs;
-$lang->bug->moreSelects['overduebugs'] = $lang->bug->overdueBugs;
-$lang->bug->moreSelects['needconfirm'] = $lang->bug->needConfirm;
+$lang->bug->moreSelects['browse']['more']['unconfirmed'] = $lang->bug->unconfirmed;
+$lang->bug->moreSelects['browse']['more']['assigntonull'] = $lang->bug->assignToNull;
+$lang->bug->moreSelects['browse']['more']['longlifebugs'] = $lang->bug->longLifeBugs;
+$lang->bug->moreSelects['browse']['more']['toclosed'] = $lang->bug->toClosed;
+$lang->bug->moreSelects['browse']['more']['postponedbugs'] = $lang->bug->postponedBugs;
+$lang->bug->moreSelects['browse']['more']['overduebugs'] = $lang->bug->overdueBugs;
+$lang->bug->moreSelects['browse']['more']['needconfirm'] = $lang->bug->needConfirm;
diff --git a/module/bug/view/batchedit.html.php b/module/bug/view/batchedit.html.php
index c3ed89d702..95cf0ba72d 100644
--- a/module/bug/view/batchedit.html.php
+++ b/module/bug/view/batchedit.html.php
@@ -74,9 +74,6 @@