diff --git a/framework/base/router.class.php b/framework/base/router.class.php
index 71166f0bb7..9f2fb42df5 100644
--- a/framework/base/router.class.php
+++ b/framework/base/router.class.php
@@ -407,6 +407,7 @@ class baseRouter
$this->loadClass('front', $static = true);
$this->loadClass('filter', $static = true);
+ $this->loadClass('form', $static = true);
$this->loadClass('dbh', $static = true);
$this->loadClass('dao', $static = true);
$this->loadClass('mobile', $static = true);
diff --git a/lib/form/form.class.php b/lib/form/form.class.php
new file mode 100644
index 0000000000..6b90f1b15c
--- /dev/null
+++ b/lib/form/form.class.php
@@ -0,0 +1,322 @@
+
+ * @package form
+ * @link https://www.zentao.net
+ */
+
+helper::import(dirname(dirname(__FILE__)) . '/filter/filter.class.php');
+
+class form extends fixer
+{
+ /**
+ * 批量处理的数据。
+ * The data to be fixed.
+ *
+ * @var object
+ * @access public
+ */
+ public $dataList;
+
+ /**
+ * 类型。single|batch
+ * Type. single|batch
+ *
+ * @var string
+ */
+ protected $formType = 'single';
+
+ /**
+ * 原始配置。
+ * The raw cofig.
+ *
+ * @var array
+ */
+ protected $rawconfig;
+
+ /**
+ * 错误信息列表。
+ * Error list.
+ *
+ * @var array
+ */
+ public $errors;
+
+ /**
+ * 构造方法。
+ * The construct function.
+ *
+ * @return void
+ */
+ public function __construct()
+ {
+ $this->rawdata = (object)$_POST;
+ $this->data = (object)array();
+ $this->errors = array();
+ }
+
+ /**
+ * 获取表单数据。
+ * Get the form data.
+ *
+ * @param array|null $configObject
+ * @return form
+ */
+ public static function data(array $configObject = null): form
+ {
+ global $app, $config;
+
+ if($configObject === null) $configObject = $config->{$app->moduleName}->form->{$app->methodName};
+ return (new form)->config($configObject);
+ }
+
+ /**
+ * 获取批量表单数据。
+ * Get the batch form data.
+ *
+ * @param array|null $configObject
+ * @return form
+ */
+ public static function batchData(array $configObject = null): form
+ {
+ global $app, $config;
+
+ if($configObject === null) $configObject = $config->{$app->moduleName}->form->{$app->methodName};
+ return (new form)->config($configObject, 'batch');
+ }
+
+ /**
+ * 设置表单配置项。
+ * Set form configuration.
+ *
+ * @param array $config
+ * @param string $type single|batch
+ * @return $this
+ * @throws EndResponseException
+ */
+ public function config(array $config, string $type = 'single')
+ {
+ $this->rawconfig = $config;
+ $this->formType = $type;
+
+ if($type == 'single')
+ {
+ foreach($this->rawconfig as $field => $fieldConfig)
+ {
+ if(isset($fieldConfig['control']) && in_array($fieldConfig['control'], array('textarea', 'richtext'))) $this->skipSpecial($field);
+ $this->convertField($field, $fieldConfig);
+ }
+ }
+ else
+ {
+ $this->batchConvertField($config);
+ }
+
+ if(!empty($this->errors))
+ {
+ $response = array('result' => 'fail', 'message' => $this->errors);
+ helper::end(json_encode($response));
+ }
+
+ return $this;
+ }
+
+ /**
+ * 批量转换字段类型。
+ * Batch convert the field type.
+ *
+ * @param array $config
+ * @return void
+ */
+ public function batchConvertField(array $fieldConfigs)
+ {
+ global $app;
+
+ $rowDataList = array();
+ $baseField = '';
+
+ foreach($fieldConfigs as $field => $config)
+ {
+ /* 在第一行提示类型未定义。 Display type error in the first row. */
+ if(!isset($config['type']))
+ {
+ if(empty($this->errors)) $this->errors[1] = array();
+ if(!isset($this->errors[1][$field])) $this->errors[1][$field] = array();
+
+ $this->errors[1][$field][] = "Field '{$field}' need defined type";
+ }
+
+ /* 以该字段为标准,判断某一行是否要构造数据。 If the value of the field in a row is empty, skip that row. */
+ if(!empty($config['base'])) $baseField = $field;
+
+ if(isset($config['control']) && in_array($config['control'], array('textarea', 'richtext'))) $this->skipSpecial($field);
+ }
+
+ /* 在第一行提示标准字段不能为空。 Display the field error in the first row. */
+ if(!isset($this->rawdata->$baseField))
+ {
+ if(empty($this->errors)) $this->errors[1] = array();
+ if(!isset($this->errors[1][$field])) $this->errors[1][$field] = array();
+ $this->errors[1][$field][] = "Field '{$field}' not empty";
+ }
+
+ /* 构造批量表单数据。Construct batch form data. */
+ foreach($this->rawdata->$baseField as $rowIndex => $value)
+ {
+ if(empty($value)) continue;
+
+ $rowData = new stdclass();
+ foreach($fieldConfigs as $field => $config)
+ {
+ $defaultValue = zget($config, 'default', '');
+
+ $rowData->$field = isset($this->rawdata->$field) ? zget($this->rawdata->$field, $rowIndex, $defaultValue) : $defaultValue;
+ $rowData->$field = helper::convertType($rowData->$field, $config['type']);
+ if(isset($config['filter'])) $rowData->$field = $this->filter($rowData->$field, $config['filter']);
+
+ /* 检查必填字段。Check required fields. */
+ if(isset($config['required']) && $config['required'] && empty($rowData->$field))
+ {
+ $fieldName = isset($app->lang->{$app->rawModule}->$field) ? $app->lang->{$app->rawModule}->$field : $field;
+ if(!isset($this->errors["{$field}[{$rowIndex}]"])) $this->errors["{$field}[{$rowIndex}]"] = array();
+ $this->errors["{$field}[{$rowIndex}]"] = sprintf($app->lang->error->notempty, $fieldName);
+ }
+ }
+
+ $rowDataList[$rowIndex] = $rowData;
+ }
+
+ $this->dataList = $rowDataList;
+ }
+
+ /**
+ * 获取$_POST的数据。
+ * Get the data of $_POST.
+ *
+ * @param bool $isRaw 是否获取原始数据。Whether to get the raw data.
+ * @return object
+ */
+ public function getAll(bool $isRaw = false): object
+ {
+ return $isRaw ? $this->rawdata : $this->data;
+ }
+
+ /**
+ * 转换字段类型。
+ * Convert the field type.
+ *
+ * @param string $field
+ * @param array $config
+ * @return void
+ */
+ public function convertField(string $field, array $config)
+ {
+ global $app;
+
+ if(!isset($config['type']))
+ {
+ if(!isset($this->errors[$field])) $this->errors[$field] = array();
+ $this->errors[$field][] = "Field '{$field}' need defined type";
+ }
+
+ $requireValue = isset($config['required']) && $config['required'] && !isset($config['default']);
+ if($requireValue && (!isset($this->rawdata->$field) || $this->rawdata->$field === ''))
+ {
+ if(!isset($this->errors[$field])) $this->errors[$field] = array();
+ $fieldName = isset($app->lang->{$app->rawModule}->$field) ? $app->lang->{$app->rawModule}->$field : $field;
+ $this->errors[$field][] = sprintf($app->lang->error->notempty, $fieldName);
+ }
+
+ if(isset($this->rawdata->$field))
+ {
+ $data = $this->rawdata->$field;
+ }
+
+ if(array_key_exists('default', $config) && !isset($this->rawdata->$field))
+ {
+ $data = $config['default'];
+ }
+
+ $data = helper::convertType($data, $config['type']);
+
+ if(isset($config['filter']))
+ {
+ $data = $this->filter($data, $config['filter']);
+ }
+
+ $this->data->$field = $data;
+ }
+
+ /**
+ * Special array.
+ *
+ * @param mixed $data
+ * @access public
+ * @return mixed
+ */
+ public function specialArray($data): mixed
+ {
+ if(!is_array($data))
+ {
+ if(is_string($data)) return htmlspecialchars($data, ENT_QUOTES);
+
+ return $data;
+ }
+
+ foreach($data as &$value) $value = $this->specialArray($value);
+
+ return $data;
+ }
+
+ /**
+ * 过滤表单字段数据。
+ * Filter the form field data.
+ *
+ * @param mixed $value
+ * @param mixed $filter
+ * @return string
+ */
+ protected function filter($value, $filter)
+ {
+ switch($filter)
+ {
+ case 'trim':
+ return trim($value);
+ case 'join':
+ return implode(',', $value);
+ default:
+ return $value;
+ }
+ }
+
+ /**
+ * 过滤富文字段数据。
+ * Filter the editor fields.
+ *
+ * @param string $fields
+ * @access public
+ * @return mixed
+ */
+ public function get($fields = ''): mixed
+ {
+ global $config;
+
+ foreach($this->rawconfig as $field => $fieldConfig)
+ {
+ if(isset($fieldConfig['control']) && $fieldConfig['control'] == 'editor') $this->stripTags($field, $config->allowedTags);
+ }
+
+ if($this->formType == 'single') return parent::get($fields);
+ foreach($this->dataList as $rowIndex => $data)
+ {
+ $this->data = $data;
+ $this->dataList[$rowIndex] = parent::get($fields);
+ }
+ return $this->dataList;
+ }
+}
diff --git a/lib/zin/wg/formbatchitem/v1.php b/lib/zin/wg/formbatchitem/v1.php
index da08e19436..8757a6c4f3 100644
--- a/lib/zin/wg/formbatchitem/v1.php
+++ b/lib/zin/wg/formbatchitem/v1.php
@@ -30,7 +30,7 @@ class formBatchItem extends wg
*/
protected static array $defineProps = array(
'name: string', // 表单项名称,无需包含 `[]`。
- 'label: string|bool', // 列标题。
+ 'label?: string|bool', // 列标题。
'labelClass?: string', // 列标题类名。
'labelProps?: string', // 列标题属性,例如 `array('data-toggle' => 'tooltip', 'data-title' 。=> 'This is a tip')`
'required?:bool|string="auto"', // 是否必填,如果设置为 `"auto"`,则自动从当前模块 config 中查询。
diff --git a/lib/zin/wg/picker/v1.php b/lib/zin/wg/picker/v1.php
index 9c0939c3e9..be9a5892d1 100644
--- a/lib/zin/wg/picker/v1.php
+++ b/lib/zin/wg/picker/v1.php
@@ -98,7 +98,7 @@ class picker extends wg
$pickerProps['items'] = $pickerItems;
$pickerProps['defaultValue'] = $defaultValue;
- if(!isset($pickerProps['emptyValue'])) $pickerProps['emptyValue'] = ($hasZeroValue || "$defaultValue" !== '0') ? '' : '0,';
+ if(!isset($pickerProps['emptyValue'])) $pickerProps['emptyValue'] = ($hasZeroValue || (!is_array($defaultValue) && "$defaultValue" !== '0')) ? '' : '0,';
if(isset($pickerProps['id']))
{
diff --git a/module/action/lang/de.php b/module/action/lang/de.php
index 94df6129c5..96b3a3b584 100644
--- a/module/action/lang/de.php
+++ b/module/action/lang/de.php
@@ -162,6 +162,9 @@ $lang->action->objectTypes['repo'] = 'Repo';
$lang->action->objectTypes['dataview'] = 'Data View';
$lang->action->objectTypes['privlang'] = 'Priv';
$lang->action->objectTypes['scene'] = 'Scene';
+$lang->action->objectTypes['serverroom'] = 'IDC';
+$lang->action->objectTypes['account'] = 'Account';
+$lang->action->objectTypes['host'] = 'Host';
/* Used to describe operation history. */
$lang->action->desc = new stdclass();
@@ -248,6 +251,9 @@ $lang->action->desc->createdsnapshot = '$date, $actor crea
$lang->action->desc->restoredsnapshot = '$date, $actor restored a snapshot $extra。' . "\n";
$lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n";
$lang->action->desc->deletesnapshot = '$date, $actor deleted snapshot $extra。' . "\n";
+$lang->action->desc->online = '$date, set online by $actor .' . "\n";
+$lang->action->desc->offline = '$date, set offline by $actor .' . "\n";
+$lang->action->desc->linkhost = '$date, the host is linked by $actor .' . "\n";
/* Used to describe the history of operations related to parent-child tasks. */
$lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n";
@@ -283,170 +289,214 @@ $lang->action->desc->releaseddoc = '$date, 由 $actor released
$lang->action->desc->collected = '$date, 由 $actor collected $extra。' . "\n";
$lang->action->desc->uncollected = '$date, 由 $actor uncollected $extra。' . "\n";
+/* 用来描述应用的历史操作记录。*/
+$lang->action->desc->install = '$date, installed by $actor.' . "\n";
+$lang->action->desc->uninstall = '$date, uninstalled by $actor.' . "\n";
+$lang->action->desc->start = '$date, started by $actor.' . "\n";
+$lang->action->desc->stop = '$date, closed by $actor.' . "\n";
+$lang->action->desc->editextra = '$date, updated from $oldname to $newName by $actor.' . "\n";
+$lang->action->desc->upgrade = '$date, upgraded from $oldVersion to $newVersion by $actor.' . "\n";
+$lang->action->desc->backup = '$date, backuped by $actor.' . "\n";
+$lang->action->desc->adjustmemory = '$date, resized to $newMemory of memory by $actor.' . "\n";
+$lang->action->desc->enableldap = '$date, enabled by $actor of LDAP。' . "\n";
+$lang->action->desc->disableldap = '$date, disabled by $actor of LDAP。' . "\n";
+$lang->action->desc->enablesmtp = '$date, enabled by $actor of SMTP。' . "\n";
+$lang->action->desc->disablesmtp = '$date, disabled by $actor of SMTP。' . "\n";
+$lang->action->desc->updatecustom = '$date, updated by $actor of custom settings.' . "\n";
+$lang->action->desc->tosenior = '$date, upgraded from $oldAppName to $newAppName by $actor .' . "\n";
+$lang->action->desc->saveautobackupsettings = '$date, opened by $actor of autobackup.' . "\n";
+$lang->action->desc->closeautobackupsettings = '$date, closed by $actor of autobackup' . "\n";
+$lang->action->desc->saveautorestoresettings = '$date, updated by $actor of autorestore.' . "\n";
+$lang->action->desc->autobackup = '$date, backed up of system' . "\n";
+$lang->action->desc->autorestore = '$date, restored by system.' . "\n";
+$lang->action->desc->deleteexpiredbackup = '$date, deleted the expired automatic backups by system.' . "\n";
+
/* Used to display dynamic information. */
-$lang->action->label = new stdclass();
-$lang->action->label->install = 'install ';
-$lang->action->label->revert = 'revert ';
-$lang->action->label->created = 'created ';
-$lang->action->label->opened = 'opened ';
-$lang->action->label->openedbysystem = 'Opened by system ';
-$lang->action->label->closedbysystem = 'Closed by system ';
-$lang->action->label->added = 'added';
-$lang->action->label->changed = 'changed ';
-$lang->action->label->edited = 'edited ';
-$lang->action->label->assigned = 'assigned ';
-$lang->action->label->closed = 'closed ';
-$lang->action->label->deleted = 'deleted ';
-$lang->action->label->deletedfile = 'deleted ';
-$lang->action->label->editfile = 'edit ';
-$lang->action->label->erased = 'erased ';
-$lang->action->label->undeleted = 'restored ';
-$lang->action->label->hidden = 'hid ';
-$lang->action->label->commented = 'commented ';
-$lang->action->label->communicated = 'communicated';
-$lang->action->label->activated = 'activated ';
-$lang->action->label->blocked = 'blocked ';
-$lang->action->label->resolved = 'resolved ';
-$lang->action->label->reviewed = 'reviewed ';
-$lang->action->label->recalled = 'recalled';
-$lang->action->label->recalledchange = 'undo changes';
-$lang->action->label->moved = 'moved ';
-$lang->action->label->confirmed = 'Confirm Story';
-$lang->action->label->bugconfirmed = 'Confirmed';
-$lang->action->label->tostory = 'Convert to Story';
-$lang->action->label->frombug = 'Converted from Bug';
-$lang->action->label->fromlib = 'Import from library';
-$lang->action->label->totask = 'Convert to Task';
-$lang->action->label->converttotask = 'converted to Task ';
-$lang->action->label->svncommited = 'SVN Commit';
-$lang->action->label->gitcommited = 'Git Commit';
-$lang->action->label->linked2plan = 'Link to Plan';
-$lang->action->label->unlinkedfromplan = 'Unlink';
-$lang->action->label->changestatus = 'Change Status';
-$lang->action->label->marked = 'marked';
-$lang->action->label->linked2execution = "Link {$lang->executionCommon}";
-$lang->action->label->unlinkedfromexecution = "Unlink {$lang->executionCommon}";
-$lang->action->label->linked2kanban = 'linked to kanban';
-$lang->action->label->linked2project = "linked to {$lang->projectCommon}";
-$lang->action->label->unlinkedfromproject = "unlinked from {$lang->projectCommon}";
-$lang->action->label->unlinkedfrombuild = "Unlink Build";
-$lang->action->label->linked2release = "Link Release";
-$lang->action->label->unlinkedfromrelease = "Unlink Release";
-$lang->action->label->linked2revision = "Link Revision";
-$lang->action->label->unlinkedfromrevision = "Unlink Revision";
-$lang->action->label->linkrelatedbug = "Link to Bug";
-$lang->action->label->unlinkrelatedbug = "Unlink";
-$lang->action->label->linkrelatedcase = "Link to Case";
-$lang->action->label->unlinkrelatedcase = "Unlink";
-$lang->action->label->linkrelatedstory = "Link to Story";
-$lang->action->label->unlinkrelatedstory = "Unlink";
-$lang->action->label->subdividestory = "Decompose Story";
-$lang->action->label->unlinkchildstory = "Unlink";
-$lang->action->label->started = 'started ';
-$lang->action->label->restarted = 'continued ';
-$lang->action->label->recordestimate = 'recorded ';
-$lang->action->label->editestimate = 'edited ';
-$lang->action->label->canceled = 'cancelled ';
-$lang->action->label->finished = 'finished ';
-$lang->action->label->paused = 'paused ';
-$lang->action->label->verified = 'verified ';
-$lang->action->label->delayed = 'delayed ';
-$lang->action->label->suspended = 'suspended ';
-$lang->action->label->login = 'Login';
-$lang->action->label->logout = "Logout";
-$lang->action->label->notified = "Notified";
-$lang->action->label->deleteestimate = "deleted hours";
-$lang->action->label->linked2build = "linked ";
-$lang->action->label->linked2bug = "linked ";
-$lang->action->label->linked2testtask = "linked";
-$lang->action->label->unlinkedfromtesttask = "unlinked";
-$lang->action->label->linkchildtask = "linked a child task";
-$lang->action->label->unlinkchildrentask = "unlinked a child task";
-$lang->action->label->linkparenttask = "linked a parent task";
-$lang->action->label->unlinkparenttask = "unlink from parent task";
-$lang->action->label->batchcreate = "batch created tasks";
-$lang->action->label->createchildren = "create child tasks";
-$lang->action->label->managed = "managed";
-$lang->action->label->managedteam = "managed";
-$lang->action->label->managedwhitelist = "managed";
-$lang->action->label->deletechildrentask = "delete children task";
-$lang->action->label->createchildrenstory = "create child stories";
-$lang->action->label->linkchildstory = "linked a child story";
-$lang->action->label->unlinkchildrenstory = "unlinked a child story";
-$lang->action->label->linkparentstory = "linked a parent story";
-$lang->action->label->unlinkparentstory = "unlink from parent story";
-$lang->action->label->deletechildrenstory = "delete children story";
-$lang->action->label->tracked = 'tracked';
-$lang->action->label->hangup = 'hangup';
-$lang->action->label->run = 'run';
-$lang->action->label->estimated = 'estimated';
-$lang->action->label->reviewpassed = 'Pass';
-$lang->action->label->reviewrejected = 'Reject';
-$lang->action->label->reviewclarified = 'Clarify';
-$lang->action->label->reviewreverted = 'Revert';
-$lang->action->label->commitsummary = 'Commit Summary';
-$lang->action->label->updatetrainee = 'Update Trainee';
-$lang->action->label->setdefaultbranch = 'Set default branch';
-$lang->action->label->syncprogram = 'start';
-$lang->action->label->syncproject = 'start';
-$lang->action->label->syncexecution = 'start';
-$lang->action->label->syncexecutionbychild = 'start';
-$lang->action->label->startProgram = '(The start of the project sets the status of the program as Ongoing)';
-$lang->action->label->createmr = 'Merge Request Linked';
-$lang->action->label->deletemr = 'Merge Request Unlinked';
-$lang->action->label->mergedmr = 'Merge Request Merged';
-$lang->action->label->compilepass = 'Compile Success';
-$lang->action->label->compilefail = 'Compile Fail';
-$lang->action->label->reopen = 'Reopen';
-$lang->action->label->approve = 'Passed';
-$lang->action->label->reject = 'Rejected';
-$lang->action->label->importfromgitlab = 'Issue associate created';
-$lang->action->label->archived = 'Archived';
-$lang->action->label->restore = 'Restore';
-$lang->action->label->mergedbranch = 'Merge Branch';
-$lang->action->label->startedbychild = 'started';
-$lang->action->label->finishedbychild = 'finished';
-$lang->action->label->closedbychild = 'closed';
-$lang->action->label->activatedbychild = 'activated';
-$lang->action->label->createchild = 'activated';
-$lang->action->label->executed = 'executed';
-$lang->action->label->importedcard = 'imported';
-$lang->action->label->importedproductplan = 'imported';
-$lang->action->label->importedrelease = 'imported';
-$lang->action->label->importedexecution = 'imported';
-$lang->action->label->importedbuild = 'imported';
-$lang->action->label->importedticket = 'imported';
-$lang->action->label->fromsonarqube = 'created a bug from SonarQube Issue named:';
-$lang->action->label->bind = 'bound';
-$lang->action->label->unbind = 'unbound';
-$lang->action->label->linkstory = 'link stories to';
-$lang->action->label->linkbug = 'link bugs to';
-$lang->action->label->unlinkstory = 'unlink stories from';
-$lang->action->label->unlinkbug = 'unlink bugs from';
-$lang->action->label->tolib = 'imported';
-$lang->action->label->updatetolib = 'updated';
-$lang->action->label->ganttmove = 'sorted';
-$lang->action->label->submitreview = 'submitted';
-$lang->action->label->suspend = 'suspended';
-$lang->action->label->resume = 'resumed';
-$lang->action->label->reboot = 'reboot';
-$lang->action->label->boot = 'boot';
-$lang->action->label->destroy = 'destroyed';
-$lang->action->label->getvnc = 'remote control';
-$lang->action->label->synctwins = 'synchronized changes';
-$lang->action->label->relieved = 'relieved';
-$lang->action->label->switchtolight = 'switch from ALM mode to light mode';
-$lang->action->label->linkedrepo = 'Linked Code Repo';
-$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
-$lang->action->label->unlinkproduct = "Unlinked {$lang->productCommon}";
-$lang->action->label->createdsnapshot = 'create snapshot';
-$lang->action->label->restoredsnapshot = 'create snapshot';
-$lang->action->label->editsnapshot = 'edit snapshot';
-$lang->action->label->deletesnapshot = 'deleted snapshot';
-$lang->action->label->saveddraft = 'save draft';
-$lang->action->label->releaseddoc = 'released';
-$lang->action->label->collected = 'collected';
-$lang->action->label->uncollected = 'uncollected';
+$lang->action->label = new stdclass();
+$lang->action->label->install = 'install ';
+$lang->action->label->uninstall = 'uninstall ';
+$lang->action->label->upgrade = 'upgrade ';
+$lang->action->label->start = 'start ';
+$lang->action->label->stop = 'stop ';
+$lang->action->label->editname = 'edit name ';
+$lang->action->label->backup = 'backup ';
+$lang->action->label->adjustmemory = 'adjust memory ';
+$lang->action->label->enableldap = 'enable LDAP ';
+$lang->action->label->disableldap = 'disable LDAP ';
+$lang->action->label->enablesmtp = 'enable SMTP ';
+$lang->action->label->disablesmtp = 'disable SMTP ';
+$lang->action->label->tosenior = 'upgrade to senior ';
+$lang->action->label->saveautobackupsettings = 'enable auto backup ';
+$lang->action->label->closeautobackupsettings = 'disable auto backup ';
+$lang->action->label->autobackup = 'auto backup by system ';
+$lang->action->label->autorestore = 'auto restore by system ';
+$lang->action->label->deleteexpiredbackup = 'delete expire backup by system ';
+$lang->action->label->revert = 'revert ';
+$lang->action->label->install = 'install ';
+$lang->action->label->revert = 'revert ';
+$lang->action->label->created = 'created ';
+$lang->action->label->opened = 'opened ';
+$lang->action->label->openedbysystem = 'Opened by system ';
+$lang->action->label->closedbysystem = 'Closed by system ';
+$lang->action->label->added = 'added';
+$lang->action->label->changed = 'changed ';
+$lang->action->label->edited = 'edited ';
+$lang->action->label->assigned = 'assigned ';
+$lang->action->label->closed = 'closed ';
+$lang->action->label->deleted = 'deleted ';
+$lang->action->label->deletedfile = 'deleted ';
+$lang->action->label->editfile = 'edit ';
+$lang->action->label->erased = 'erased ';
+$lang->action->label->undeleted = 'restored ';
+$lang->action->label->hidden = 'hid ';
+$lang->action->label->commented = 'commented ';
+$lang->action->label->communicated = 'communicated';
+$lang->action->label->activated = 'activated ';
+$lang->action->label->blocked = 'blocked ';
+$lang->action->label->resolved = 'resolved ';
+$lang->action->label->reviewed = 'reviewed ';
+$lang->action->label->recalled = 'recalled';
+$lang->action->label->recalledchange = 'undo changes';
+$lang->action->label->moved = 'moved ';
+$lang->action->label->confirmed = 'Confirm Story';
+$lang->action->label->bugconfirmed = 'Confirmed';
+$lang->action->label->tostory = 'Convert to Story';
+$lang->action->label->frombug = 'Converted from Bug';
+$lang->action->label->fromlib = 'Import from library';
+$lang->action->label->totask = 'Convert to Task';
+$lang->action->label->converttotask = 'converted to Task ';
+$lang->action->label->svncommited = 'SVN Commit';
+$lang->action->label->gitcommited = 'Git Commit';
+$lang->action->label->linked2plan = 'Link to Plan';
+$lang->action->label->unlinkedfromplan = 'Unlink';
+$lang->action->label->changestatus = 'Change Status';
+$lang->action->label->marked = 'marked';
+$lang->action->label->linked2execution = "Link {$lang->executionCommon}";
+$lang->action->label->unlinkedfromexecution = "Unlink {$lang->executionCommon}";
+$lang->action->label->linked2kanban = 'linked to kanban';
+$lang->action->label->linked2project = "linked to {$lang->projectCommon}";
+$lang->action->label->unlinkedfromproject = "unlinked from {$lang->projectCommon}";
+$lang->action->label->unlinkedfrombuild = "Unlink Build";
+$lang->action->label->linked2release = "Link Release";
+$lang->action->label->unlinkedfromrelease = "Unlink Release";
+$lang->action->label->linked2revision = "Link Revision";
+$lang->action->label->unlinkedfromrevision = "Unlink Revision";
+$lang->action->label->linkrelatedbug = "Link to Bug";
+$lang->action->label->unlinkrelatedbug = "Unlink";
+$lang->action->label->linkrelatedcase = "Link to Case";
+$lang->action->label->unlinkrelatedcase = "Unlink";
+$lang->action->label->linkrelatedstory = "Link to Story";
+$lang->action->label->unlinkrelatedstory = "Unlink";
+$lang->action->label->subdividestory = "Decompose Story";
+$lang->action->label->unlinkchildstory = "Unlink";
+$lang->action->label->started = 'started ';
+$lang->action->label->restarted = 'continued ';
+$lang->action->label->recordestimate = 'recorded ';
+$lang->action->label->editestimate = 'edited ';
+$lang->action->label->canceled = 'cancelled ';
+$lang->action->label->finished = 'finished ';
+$lang->action->label->paused = 'paused ';
+$lang->action->label->verified = 'verified ';
+$lang->action->label->delayed = 'delayed ';
+$lang->action->label->suspended = 'suspended ';
+$lang->action->label->login = 'Login';
+$lang->action->label->logout = "Logout";
+$lang->action->label->notified = "Notified";
+$lang->action->label->deleteestimate = "deleted hours";
+$lang->action->label->linked2build = "linked ";
+$lang->action->label->linked2bug = "linked ";
+$lang->action->label->linked2testtask = "linked";
+$lang->action->label->unlinkedfromtesttask = "unlinked";
+$lang->action->label->linkchildtask = "linked a child task";
+$lang->action->label->unlinkchildrentask = "unlinked a child task";
+$lang->action->label->linkparenttask = "linked a parent task";
+$lang->action->label->unlinkparenttask = "unlink from parent task";
+$lang->action->label->batchcreate = "batch created tasks";
+$lang->action->label->createchildren = "create child tasks";
+$lang->action->label->managed = "managed";
+$lang->action->label->managedteam = "managed";
+$lang->action->label->managedwhitelist = "managed";
+$lang->action->label->deletechildrentask = "delete children task";
+$lang->action->label->createchildrenstory = "create child stories";
+$lang->action->label->linkchildstory = "linked a child story";
+$lang->action->label->unlinkchildrenstory = "unlinked a child story";
+$lang->action->label->linkparentstory = "linked a parent story";
+$lang->action->label->unlinkparentstory = "unlink from parent story";
+$lang->action->label->deletechildrenstory = "delete children story";
+$lang->action->label->tracked = 'tracked';
+$lang->action->label->hangup = 'hangup';
+$lang->action->label->run = 'run';
+$lang->action->label->estimated = 'estimated';
+$lang->action->label->reviewpassed = 'Pass';
+$lang->action->label->reviewrejected = 'Reject';
+$lang->action->label->reviewclarified = 'Clarify';
+$lang->action->label->reviewreverted = 'Revert';
+$lang->action->label->commitsummary = 'Commit Summary';
+$lang->action->label->updatetrainee = 'Update Trainee';
+$lang->action->label->setdefaultbranch = 'Set default branch';
+$lang->action->label->syncprogram = 'start';
+$lang->action->label->syncproject = 'start';
+$lang->action->label->syncexecution = 'start';
+$lang->action->label->syncexecutionbychild = 'start';
+$lang->action->label->startProgram = '(The start of the project sets the status of the program as Ongoing)';
+$lang->action->label->createmr = 'Merge Request Linked';
+$lang->action->label->deletemr = 'Merge Request Unlinked';
+$lang->action->label->mergedmr = 'Merge Request Merged';
+$lang->action->label->compilepass = 'Compile Success';
+$lang->action->label->compilefail = 'Compile Fail';
+$lang->action->label->reopen = 'Reopen';
+$lang->action->label->approve = 'Passed';
+$lang->action->label->reject = 'Rejected';
+$lang->action->label->importfromgitlab = 'Issue associate created';
+$lang->action->label->archived = 'Archived';
+$lang->action->label->restore = 'Restore';
+$lang->action->label->mergedbranch = 'Merge Branch';
+$lang->action->label->startedbychild = 'started';
+$lang->action->label->finishedbychild = 'finished';
+$lang->action->label->closedbychild = 'closed';
+$lang->action->label->activatedbychild = 'activated';
+$lang->action->label->createchild = 'activated';
+$lang->action->label->executed = 'executed';
+$lang->action->label->importedcard = 'imported';
+$lang->action->label->importedproductplan = 'imported';
+$lang->action->label->importedrelease = 'imported';
+$lang->action->label->importedexecution = 'imported';
+$lang->action->label->importedbuild = 'imported';
+$lang->action->label->importedticket = 'imported';
+$lang->action->label->fromsonarqube = 'created a bug from SonarQube Issue named:';
+$lang->action->label->bind = 'bound';
+$lang->action->label->unbind = 'unbound';
+$lang->action->label->linkstory = 'link stories to';
+$lang->action->label->linkbug = 'link bugs to';
+$lang->action->label->unlinkstory = 'unlink stories from';
+$lang->action->label->unlinkbug = 'unlink bugs from';
+$lang->action->label->tolib = 'imported';
+$lang->action->label->updatetolib = 'updated';
+$lang->action->label->ganttmove = 'sorted';
+$lang->action->label->submitreview = 'submitted';
+$lang->action->label->suspend = 'suspended';
+$lang->action->label->resume = 'resumed';
+$lang->action->label->reboot = 'reboot';
+$lang->action->label->boot = 'boot';
+$lang->action->label->destroy = 'destroyed';
+$lang->action->label->getvnc = 'remote control';
+$lang->action->label->synctwins = 'synchronized changes';
+$lang->action->label->relieved = 'relieved';
+$lang->action->label->switchtolight = 'switch from ALM mode to light mode';
+$lang->action->label->linkedrepo = 'Linked Code Repo';
+$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
+$lang->action->label->unlinkproduct = "Unlinked {$lang->productCommon}";
+$lang->action->label->createdsnapshot = 'create snapshot';
+$lang->action->label->restoredsnapshot = 'create snapshot';
+$lang->action->label->editsnapshot = 'edit snapshot';
+$lang->action->label->deletesnapshot = 'deleted snapshot';
+$lang->action->label->saveddraft = 'save draft';
+$lang->action->label->releaseddoc = 'released';
+$lang->action->label->collected = 'collected';
+$lang->action->label->uncollected = 'uncollected';
+$lang->action->label->online = 'online';
+$lang->action->label->offline = 'offline';
+$lang->action->label->linkhost = 'link hosts to';
/* Dynamic information is grouped by object. */
$lang->action->dynamicAction = new stdclass;
diff --git a/module/action/lang/en.php b/module/action/lang/en.php
index 90c811b6ea..fe2d93a648 100755
--- a/module/action/lang/en.php
+++ b/module/action/lang/en.php
@@ -162,6 +162,9 @@ $lang->action->objectTypes['repo'] = 'Repo';
$lang->action->objectTypes['dataview'] = 'Data View';
$lang->action->objectTypes['privlang'] = 'Priv';
$lang->action->objectTypes['scene'] = 'Scene';
+$lang->action->objectTypes['serverroom'] = 'IDC';
+$lang->action->objectTypes['account'] = 'Account';
+$lang->action->objectTypes['host'] = 'Host';
/* Used to describe operation history. */
$lang->action->desc = new stdclass();
@@ -248,6 +251,10 @@ $lang->action->desc->createdsnapshot = '$date, $actor crea
$lang->action->desc->restoredsnapshot = '$date, $actor restored a snapshot $extra。' . "\n";
$lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n";
$lang->action->desc->deletesnapshot = '$date, $actor deleted snapshot $extra。' . "\n";
+$lang->action->desc->online = '$date, set online by $actor .' . "\n";
+$lang->action->desc->offline = '$date, set offline by $actor .' . "\n";
+$lang->action->desc->linkhost = '$date, the host is linked by $actor .' . "\n";
+
/* Used to describe the history of operations related to parent-child tasks. */
$lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n";
@@ -283,170 +290,215 @@ $lang->action->desc->releaseddoc = '$date, 由 $actor released
$lang->action->desc->collected = '$date, 由 $actor collected $extra。' . "\n";
$lang->action->desc->uncollected = '$date, 由 $actor uncollected $extra。' . "\n";
+/* 用来描述应用的历史操作记录。*/
+$lang->action->desc->install = '$date, installed by $actor.' . "\n";
+$lang->action->desc->uninstall = '$date, uninstalled by $actor.' . "\n";
+$lang->action->desc->start = '$date, started by $actor.' . "\n";
+$lang->action->desc->stop = '$date, closed by $actor.' . "\n";
+$lang->action->desc->editextra = '$date, updated from $oldname to $newName by $actor.' . "\n";
+$lang->action->desc->upgrade = '$date, upgraded from $oldVersion to $newVersion by $actor.' . "\n";
+$lang->action->desc->backup = '$date, backuped by $actor.' . "\n";
+$lang->action->desc->adjustmemory = '$date, resized to $newMemory of memory by $actor.' . "\n";
+$lang->action->desc->enableldap = '$date, enabled by $actor of LDAP。' . "\n";
+$lang->action->desc->disableldap = '$date, disabled by $actor of LDAP。' . "\n";
+$lang->action->desc->enablesmtp = '$date, enabled by $actor of SMTP。' . "\n";
+$lang->action->desc->disablesmtp = '$date, disabled by $actor of SMTP。' . "\n";
+$lang->action->desc->updatecustom = '$date, updated by $actor of custom settings.' . "\n";
+$lang->action->desc->tosenior = '$date, upgraded from $oldAppName to $newAppName by $actor .' . "\n";
+$lang->action->desc->saveautobackupsettings = '$date, opened by $actor of autobackup.' . "\n";
+$lang->action->desc->closeautobackupsettings = '$date, closed by $actor of autobackup' . "\n";
+$lang->action->desc->saveautorestoresettings = '$date, updated by $actor of autorestore.' . "\n";
+$lang->action->desc->autobackup = '$date, backed up of system' . "\n";
+$lang->action->desc->autorestore = '$date, restored by system.' . "\n";
+$lang->action->desc->deleteexpiredbackup = '$date, deleted the expired automatic backups by system.' . "\n";
+
/* Used to display dynamic information. */
-$lang->action->label = new stdclass();
-$lang->action->label->install = 'install ';
-$lang->action->label->revert = 'revert ';
-$lang->action->label->created = 'created ';
-$lang->action->label->opened = 'opened ';
-$lang->action->label->openedbysystem = 'Opened by system ';
-$lang->action->label->closedbysystem = 'Closed by system ';
-$lang->action->label->added = 'added';
-$lang->action->label->changed = 'changed ';
-$lang->action->label->edited = 'edited ';
-$lang->action->label->assigned = 'assigned ';
-$lang->action->label->closed = 'closed ';
-$lang->action->label->deleted = 'deleted ';
-$lang->action->label->deletedfile = 'deleted ';
-$lang->action->label->editfile = 'edited ';
-$lang->action->label->erased = 'erased ';
-$lang->action->label->undeleted = 'restored ';
-$lang->action->label->hidden = 'hid ';
-$lang->action->label->commented = 'commented ';
-$lang->action->label->communicated = 'communicated';
-$lang->action->label->activated = 'activated ';
-$lang->action->label->blocked = 'blocked ';
-$lang->action->label->resolved = 'resolved ';
-$lang->action->label->reviewed = 'reviewed ';
-$lang->action->label->recalled = 'recalled';
-$lang->action->label->recalledchange = 'undo changes';
-$lang->action->label->moved = 'moved ';
-$lang->action->label->confirmed = 'confirmed Story ';
-$lang->action->label->bugconfirmed = 'confirmed';
-$lang->action->label->tostory = 'converted to Story ';
-$lang->action->label->frombug = 'converted from Bug ';
-$lang->action->label->fromlib = 'imported from Library ';
-$lang->action->label->totask = 'converted to Task ';
-$lang->action->label->converttotask = 'converted to Task ';
-$lang->action->label->svncommited = 'committed SVN ';
-$lang->action->label->gitcommited = 'committed Git ';
-$lang->action->label->linked2plan = 'linked to Plan ';
-$lang->action->label->unlinkedfromplan = 'unlinked from ';
-$lang->action->label->changestatus = 'changed status';
-$lang->action->label->marked = 'marked';
-$lang->action->label->linked2execution = "linked to {$lang->executionCommon}";
-$lang->action->label->unlinkedfromexecution = "unlinked from {$lang->executionCommon}";
-$lang->action->label->linked2kanban = 'linked to kanban';
-$lang->action->label->linked2project = "linked to {$lang->projectCommon}";
-$lang->action->label->unlinkedfromproject = "unlinked from {$lang->projectCommon}";
-$lang->action->label->unlinkedfrombuild = "unlinked Build ";
-$lang->action->label->linked2release = "linked Release ";
-$lang->action->label->unlinkedfromrelease = "unlinked Release ";
-$lang->action->label->linked2revision = "Link Revision";
-$lang->action->label->unlinkedfromrevision = "Unlink Revision";
-$lang->action->label->linkrelatedbug = "linked Bug ";
-$lang->action->label->unlinkrelatedbug = "unlinked Bug ";
-$lang->action->label->linkrelatedcase = "linked Case ";
-$lang->action->label->unlinkrelatedcase = "unlinked Case ";
-$lang->action->label->linkrelatedstory = "linked Story ";
-$lang->action->label->unlinkrelatedstory = "unlinked Story ";
-$lang->action->label->subdividestory = "decomposed Story ";
-$lang->action->label->unlinkchildstory = "unlinked Story ";
-$lang->action->label->started = 'started ';
-$lang->action->label->restarted = 'continued ';
-$lang->action->label->recordestimate = 'recorded ';
-$lang->action->label->editestimate = 'edited ';
-$lang->action->label->canceled = 'cancelled ';
-$lang->action->label->finished = 'finished ';
-$lang->action->label->paused = 'paused ';
-$lang->action->label->verified = 'verified ';
-$lang->action->label->delayed = 'delayed ';
-$lang->action->label->suspended = 'suspended ';
-$lang->action->label->login = 'login';
-$lang->action->label->logout = "logout";
-$lang->action->label->notified = "Notified";
-$lang->action->label->deleteestimate = "deleted hours";
-$lang->action->label->linked2build = "linked ";
-$lang->action->label->linked2bug = "linked ";
-$lang->action->label->linked2testtask = "linked";
-$lang->action->label->unlinkedfromtesttask = "unlinked";
-$lang->action->label->linkchildtask = "linked a child task";
-$lang->action->label->unlinkchildrentask = "unlinked a child task";
-$lang->action->label->linkparenttask = "linked a parent task";
-$lang->action->label->unlinkparenttask = "unlink from parent task";
-$lang->action->label->batchcreate = "batch created tasks";
-$lang->action->label->createchildren = "create child tasks";
-$lang->action->label->managed = "managed";
-$lang->action->label->managedteam = "managed";
-$lang->action->label->managedwhitelist = "managed";
-$lang->action->label->deletechildrentask = "delete children task";
-$lang->action->label->createchildrenstory = "create child stories";
-$lang->action->label->linkchildstory = "linked a child story";
-$lang->action->label->unlinkchildrenstory = "unlinked a child story";
-$lang->action->label->linkparentstory = "linked a parent story";
-$lang->action->label->unlinkparentstory = "unlink from parent story";
-$lang->action->label->deletechildrenstory = "delete children story";
-$lang->action->label->tracked = 'tracked';
-$lang->action->label->hangup = 'hangup';
-$lang->action->label->run = 'run';
-$lang->action->label->estimated = 'estimated';
-$lang->action->label->reviewpassed = 'Pass';
-$lang->action->label->reviewrejected = 'Reject';
-$lang->action->label->reviewclarified = 'Clarify';
-$lang->action->label->reviewreverted = 'Revert';
-$lang->action->label->commitsummary = 'Commit Summary';
-$lang->action->label->updatetrainee = 'Update Trainee';
-$lang->action->label->setdefaultbranch = 'Set default branch';
-$lang->action->label->syncprogram = 'start';
-$lang->action->label->syncproject = 'start';
-$lang->action->label->syncexecution = 'start';
-$lang->action->label->syncexecutionbychild = 'start';
-$lang->action->label->startProgram = '(The start of the project sets the status of the program as Ongoing)';
-$lang->action->label->createmr = 'Merge Request Linked';
-$lang->action->label->deletemr = 'Merge Request Unlinked';
-$lang->action->label->mergedmr = 'Merge Request Merged';
-$lang->action->label->compilepass = 'Compile Success';
-$lang->action->label->compilefail = 'Compile Fail';
-$lang->action->label->reopen = 'Reopen';
-$lang->action->label->approve = 'Passed';
-$lang->action->label->reject = 'Rejected';
-$lang->action->label->importfromgitlab = 'Issue associate created';
-$lang->action->label->archived = 'Archived';
-$lang->action->label->restore = 'Restore';
-$lang->action->label->mergedbranch = 'Merge Branch';
-$lang->action->label->startedbychild = 'started';
-$lang->action->label->finishedbychild = 'finished';
-$lang->action->label->closedbychild = 'closed';
-$lang->action->label->activatedbychild = 'activated';
-$lang->action->label->createchild = 'activated';
-$lang->action->label->executed = 'executed';
-$lang->action->label->importedcard = 'imported';
-$lang->action->label->importedproductplan = 'imported';
-$lang->action->label->importedrelease = 'imported';
-$lang->action->label->importedexecution = 'imported';
-$lang->action->label->importedbuild = 'imported';
-$lang->action->label->importedticket = 'imported';
-$lang->action->label->fromsonarqube = 'created a bug from SonarQube Issue named:';
-$lang->action->label->bind = 'bound';
-$lang->action->label->unbind = 'unbound';
-$lang->action->label->linkstory = 'link stories to';
-$lang->action->label->linkbug = 'link bugs to';
-$lang->action->label->unlinkstory = 'unlink stories from';
-$lang->action->label->unlinkbug = 'unlink bugs from';
-$lang->action->label->tolib = 'imported';
-$lang->action->label->updatetolib = 'updated';
-$lang->action->label->ganttmove = 'sorted';
-$lang->action->label->submitreview = 'submitted';
-$lang->action->label->suspend = 'suspended';
-$lang->action->label->resume = 'resumed';
-$lang->action->label->reboot = 'reboot';
-$lang->action->label->boot = 'boot';
-$lang->action->label->destroy = 'destroyed';
-$lang->action->label->getvnc = 'remote control';
-$lang->action->label->synctwins = 'synchronized changes';
-$lang->action->label->relieved = 'relieved';
-$lang->action->label->switchtolight = 'switch from ALM mode to light mode';
-$lang->action->label->linkedrepo = 'Linked Code Repo';
-$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
-$lang->action->label->unlinkproduct = "Unlinked {$lang->productCommon}";
-$lang->action->label->createdsnapshot = 'create snapshot';
-$lang->action->label->restoredsnapshot = 'create snapshot';
-$lang->action->label->editsnapshot = 'edit snapshot';
-$lang->action->label->deletesnapshot = 'deleted snapshot';
-$lang->action->label->saveddraft = 'save draft';
-$lang->action->label->releaseddoc = 'released';
-$lang->action->label->collected = 'collected';
-$lang->action->label->uncollected = 'uncollected';
+$lang->action->label = new stdclass();
+$lang->action->label->install = 'install ';
+$lang->action->label->uninstall = 'uninstall ';
+$lang->action->label->upgrade = 'upgrade ';
+$lang->action->label->start = 'start ';
+$lang->action->label->stop = 'stop ';
+$lang->action->label->editname = 'edit name ';
+$lang->action->label->backup = 'backup ';
+$lang->action->label->adjustmemory = 'adjust memory ';
+$lang->action->label->enableldap = 'enable LDAP ';
+$lang->action->label->disableldap = 'disable LDAP ';
+$lang->action->label->enablesmtp = 'enable SMTP ';
+$lang->action->label->disablesmtp = 'disable SMTP ';
+$lang->action->label->tosenior = 'upgrade to senior ';
+$lang->action->label->saveautobackupsettings = 'enable auto backup ';
+$lang->action->label->closeautobackupsettings = 'disable auto backup ';
+$lang->action->label->autobackup = 'auto backup by system ';
+$lang->action->label->autorestore = 'auto restore by system ';
+$lang->action->label->deleteexpiredbackup = 'delete expire backup by system ';
+$lang->action->label->revert = 'revert ';
+$lang->action->label->install = 'install ';
+$lang->action->label->revert = 'revert ';
+$lang->action->label->created = 'created ';
+$lang->action->label->opened = 'opened ';
+$lang->action->label->openedbysystem = 'Opened by system ';
+$lang->action->label->closedbysystem = 'Closed by system ';
+$lang->action->label->added = 'added';
+$lang->action->label->changed = 'changed ';
+$lang->action->label->edited = 'edited ';
+$lang->action->label->assigned = 'assigned ';
+$lang->action->label->closed = 'closed ';
+$lang->action->label->deleted = 'deleted ';
+$lang->action->label->deletedfile = 'deleted ';
+$lang->action->label->editfile = 'edited ';
+$lang->action->label->erased = 'erased ';
+$lang->action->label->undeleted = 'restored ';
+$lang->action->label->hidden = 'hid ';
+$lang->action->label->commented = 'commented ';
+$lang->action->label->communicated = 'communicated';
+$lang->action->label->activated = 'activated ';
+$lang->action->label->blocked = 'blocked ';
+$lang->action->label->resolved = 'resolved ';
+$lang->action->label->reviewed = 'reviewed ';
+$lang->action->label->recalled = 'recalled';
+$lang->action->label->recalledchange = 'undo changes';
+$lang->action->label->moved = 'moved ';
+$lang->action->label->confirmed = 'confirmed Story ';
+$lang->action->label->bugconfirmed = 'confirmed';
+$lang->action->label->tostory = 'converted to Story ';
+$lang->action->label->frombug = 'converted from Bug ';
+$lang->action->label->fromlib = 'imported from Library ';
+$lang->action->label->totask = 'converted to Task ';
+$lang->action->label->converttotask = 'converted to Task ';
+$lang->action->label->svncommited = 'committed SVN ';
+$lang->action->label->gitcommited = 'committed Git ';
+$lang->action->label->linked2plan = 'linked to Plan ';
+$lang->action->label->unlinkedfromplan = 'unlinked from ';
+$lang->action->label->changestatus = 'changed status';
+$lang->action->label->marked = 'marked';
+$lang->action->label->linked2execution = "linked to {$lang->executionCommon}";
+$lang->action->label->unlinkedfromexecution = "unlinked from {$lang->executionCommon}";
+$lang->action->label->linked2kanban = 'linked to kanban';
+$lang->action->label->linked2project = "linked to {$lang->projectCommon}";
+$lang->action->label->unlinkedfromproject = "unlinked from {$lang->projectCommon}";
+$lang->action->label->unlinkedfrombuild = "unlinked Build ";
+$lang->action->label->linked2release = "linked Release ";
+$lang->action->label->unlinkedfromrelease = "unlinked Release ";
+$lang->action->label->linked2revision = "Link Revision";
+$lang->action->label->unlinkedfromrevision = "Unlink Revision";
+$lang->action->label->linkrelatedbug = "linked Bug ";
+$lang->action->label->unlinkrelatedbug = "unlinked Bug ";
+$lang->action->label->linkrelatedcase = "linked Case ";
+$lang->action->label->unlinkrelatedcase = "unlinked Case ";
+$lang->action->label->linkrelatedstory = "linked Story ";
+$lang->action->label->unlinkrelatedstory = "unlinked Story ";
+$lang->action->label->subdividestory = "decomposed Story ";
+$lang->action->label->unlinkchildstory = "unlinked Story ";
+$lang->action->label->started = 'started ';
+$lang->action->label->restarted = 'continued ';
+$lang->action->label->recordestimate = 'recorded ';
+$lang->action->label->editestimate = 'edited ';
+$lang->action->label->canceled = 'cancelled ';
+$lang->action->label->finished = 'finished ';
+$lang->action->label->paused = 'paused ';
+$lang->action->label->verified = 'verified ';
+$lang->action->label->delayed = 'delayed ';
+$lang->action->label->suspended = 'suspended ';
+$lang->action->label->login = 'login';
+$lang->action->label->logout = "logout";
+$lang->action->label->notified = "Notified";
+$lang->action->label->deleteestimate = "deleted hours";
+$lang->action->label->linked2build = "linked ";
+$lang->action->label->linked2bug = "linked ";
+$lang->action->label->linked2testtask = "linked";
+$lang->action->label->unlinkedfromtesttask = "unlinked";
+$lang->action->label->linkchildtask = "linked a child task";
+$lang->action->label->unlinkchildrentask = "unlinked a child task";
+$lang->action->label->linkparenttask = "linked a parent task";
+$lang->action->label->unlinkparenttask = "unlink from parent task";
+$lang->action->label->batchcreate = "batch created tasks";
+$lang->action->label->createchildren = "create child tasks";
+$lang->action->label->managed = "managed";
+$lang->action->label->managedteam = "managed";
+$lang->action->label->managedwhitelist = "managed";
+$lang->action->label->deletechildrentask = "delete children task";
+$lang->action->label->createchildrenstory = "create child stories";
+$lang->action->label->linkchildstory = "linked a child story";
+$lang->action->label->unlinkchildrenstory = "unlinked a child story";
+$lang->action->label->linkparentstory = "linked a parent story";
+$lang->action->label->unlinkparentstory = "unlink from parent story";
+$lang->action->label->deletechildrenstory = "delete children story";
+$lang->action->label->tracked = 'tracked';
+$lang->action->label->hangup = 'hangup';
+$lang->action->label->run = 'run';
+$lang->action->label->estimated = 'estimated';
+$lang->action->label->reviewpassed = 'Pass';
+$lang->action->label->reviewrejected = 'Reject';
+$lang->action->label->reviewclarified = 'Clarify';
+$lang->action->label->reviewreverted = 'Revert';
+$lang->action->label->commitsummary = 'Commit Summary';
+$lang->action->label->updatetrainee = 'Update Trainee';
+$lang->action->label->setdefaultbranch = 'Set default branch';
+$lang->action->label->syncprogram = 'start';
+$lang->action->label->syncproject = 'start';
+$lang->action->label->syncexecution = 'start';
+$lang->action->label->syncexecutionbychild = 'start';
+$lang->action->label->startProgram = '(The start of the project sets the status of the program as Ongoing)';
+$lang->action->label->createmr = 'Merge Request Linked';
+$lang->action->label->deletemr = 'Merge Request Unlinked';
+$lang->action->label->mergedmr = 'Merge Request Merged';
+$lang->action->label->compilepass = 'Compile Success';
+$lang->action->label->compilefail = 'Compile Fail';
+$lang->action->label->reopen = 'Reopen';
+$lang->action->label->approve = 'Passed';
+$lang->action->label->reject = 'Rejected';
+$lang->action->label->importfromgitlab = 'Issue associate created';
+$lang->action->label->archived = 'Archived';
+$lang->action->label->restore = 'Restore';
+$lang->action->label->mergedbranch = 'Merge Branch';
+$lang->action->label->startedbychild = 'started';
+$lang->action->label->finishedbychild = 'finished';
+$lang->action->label->closedbychild = 'closed';
+$lang->action->label->activatedbychild = 'activated';
+$lang->action->label->createchild = 'activated';
+$lang->action->label->executed = 'executed';
+$lang->action->label->importedcard = 'imported';
+$lang->action->label->importedproductplan = 'imported';
+$lang->action->label->importedrelease = 'imported';
+$lang->action->label->importedexecution = 'imported';
+$lang->action->label->importedbuild = 'imported';
+$lang->action->label->importedticket = 'imported';
+$lang->action->label->fromsonarqube = 'created a bug from SonarQube Issue named:';
+$lang->action->label->bind = 'bound';
+$lang->action->label->unbind = 'unbound';
+$lang->action->label->linkstory = 'link stories to';
+$lang->action->label->linkbug = 'link bugs to';
+$lang->action->label->unlinkstory = 'unlink stories from';
+$lang->action->label->unlinkbug = 'unlink bugs from';
+$lang->action->label->tolib = 'imported';
+$lang->action->label->updatetolib = 'updated';
+$lang->action->label->ganttmove = 'sorted';
+$lang->action->label->submitreview = 'submitted';
+$lang->action->label->suspend = 'suspended';
+$lang->action->label->resume = 'resumed';
+$lang->action->label->reboot = 'reboot';
+$lang->action->label->boot = 'boot';
+$lang->action->label->destroy = 'destroyed';
+$lang->action->label->getvnc = 'remote control';
+$lang->action->label->synctwins = 'synchronized changes';
+$lang->action->label->relieved = 'relieved';
+$lang->action->label->switchtolight = 'switch from ALM mode to light mode';
+$lang->action->label->linkedrepo = 'Linked Code Repo';
+$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
+$lang->action->label->unlinkproduct = "Unlinked {$lang->productCommon}";
+$lang->action->label->createdsnapshot = 'create snapshot';
+$lang->action->label->restoredsnapshot = 'create snapshot';
+$lang->action->label->editsnapshot = 'edit snapshot';
+$lang->action->label->deletesnapshot = 'deleted snapshot';
+$lang->action->label->saveddraft = 'save draft';
+$lang->action->label->releaseddoc = 'released';
+$lang->action->label->collected = 'collected';
+$lang->action->label->uncollected = 'uncollected';
+$lang->action->label->online = 'online';
+$lang->action->label->offline = 'offline';
+$lang->action->label->linkhost = 'link hosts to';
+
/* Dynamic information is grouped by object. */
$lang->action->dynamicAction = new stdclass;
diff --git a/module/action/lang/fr.php b/module/action/lang/fr.php
index 2a20698c8c..572c7c1c4e 100644
--- a/module/action/lang/fr.php
+++ b/module/action/lang/fr.php
@@ -248,6 +248,9 @@ $lang->action->desc->createdsnapshot = '$date, $actor crea
$lang->action->desc->restoredsnapshot = '$date, $actor restored a snapshot $extra。' . "\n";
$lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n";
$lang->action->desc->deletesnapshot = '$date, $actor deleted snapshot $extra。' . "\n";
+$lang->action->desc->online = '$date, set online by $actor .' . "\n";
+$lang->action->desc->offline = '$date, set offline by $actor .' . "\n";
+$lang->action->desc->linkhost = '$date, the host is linked by $actor .' . "\n";
/* Used to describe the history of operations related to parent-child tasks. */
$lang->action->desc->createchildren = '$date, $actor a créé un sous-tâche $extra。' . "\n";
@@ -282,171 +285,215 @@ $lang->action->desc->releaseddoc = '$date, 由 $actor released
/* This parameter describes historical operations that are performed when a document is collected or uncollected. */
$lang->action->desc->collected = '$date, 由 $actor collected $extra。' . "\n";
$lang->action->desc->uncollected = '$date, 由 $actor uncollected $extra。' . "\n";
+$lang->action->label->online = 'online';
+$lang->action->label->offline = 'offline';
+$lang->action->label->linkhost = 'link hosts to';
+
+/* 用来描述应用的历史操作记录。*/
+$lang->action->desc->install = '$date, installed by $actor.' . "\n";
+$lang->action->desc->uninstall = '$date, uninstalled by $actor.' . "\n";
+$lang->action->desc->start = '$date, started by $actor.' . "\n";
+$lang->action->desc->stop = '$date, closed by $actor.' . "\n";
+$lang->action->desc->editextra = '$date, updated from $oldname to $newName by $actor.' . "\n";
+$lang->action->desc->upgrade = '$date, upgraded from $oldVersion to $newVersion by $actor.' . "\n";
+$lang->action->desc->backup = '$date, backuped by $actor.' . "\n";
+$lang->action->desc->adjustmemory = '$date, resized to $newMemory of memory by $actor.' . "\n";
+$lang->action->desc->enableldap = '$date, enabled by $actor of LDAP。' . "\n";
+$lang->action->desc->disableldap = '$date, disabled by $actor of LDAP。' . "\n";
+$lang->action->desc->enablesmtp = '$date, enabled by $actor of SMTP。' . "\n";
+$lang->action->desc->disablesmtp = '$date, disabled by $actor of SMTP。' . "\n";
+$lang->action->desc->updatecustom = '$date, updated by $actor of custom settings.' . "\n";
+$lang->action->desc->tosenior = '$date, upgraded from $oldAppName to $newAppName by $actor .' . "\n";
+$lang->action->desc->saveautobackupsettings = '$date, opened by $actor of autobackup.' . "\n";
+$lang->action->desc->closeautobackupsettings = '$date, closed by $actor of autobackup' . "\n";
+$lang->action->desc->saveautorestoresettings = '$date, updated by $actor of autorestore.' . "\n";
+$lang->action->desc->autobackup = '$date, backed up of system' . "\n";
+$lang->action->desc->autorestore = '$date, restored by system.' . "\n";
+$lang->action->desc->deleteexpiredbackup = '$date, deleted the expired automatic backups by system.' . "\n";
/* Used to display dynamic information. */
-$lang->action->label = new stdclass();
-$lang->action->label->install = 'install ';
-$lang->action->label->revert = 'revert ';
-$lang->action->label->created = 'a créé ';
-$lang->action->label->opened = 'a ouvert ';
-$lang->action->label->openedbysystem = 'Opened by system ';
-$lang->action->label->closedbysystem = 'Closed by system ';
-$lang->action->label->added = 'ajouter';
-$lang->action->label->changed = 'a changé ';
-$lang->action->label->edited = 'a édité ';
-$lang->action->label->assigned = 'a affecté ';
-$lang->action->label->closed = 'a fermé ';
-$lang->action->label->deleted = 'a supprimé ';
-$lang->action->label->deletedfile = 'a supprimé ';
-$lang->action->label->editfile = 'a édité ';
-$lang->action->label->erased = 'a détruit ';
-$lang->action->label->undeleted = 'a restauré ';
-$lang->action->label->hidden = 'a masqué ';
-$lang->action->label->commented = 'a commenté ';
-$lang->action->label->communicated = 'communicated';
-$lang->action->label->activated = 'a activé ';
-$lang->action->label->blocked = 'a bloqué ';
-$lang->action->label->resolved = 'a résolu ';
-$lang->action->label->reviewed = 'a revu ';
-$lang->action->label->recalled = 'recalled';
-$lang->action->label->recalledchange = 'undo changes';
-$lang->action->label->moved = 'a déplacé ';
-$lang->action->label->confirmed = 'a confirmé Story ';
-$lang->action->label->bugconfirmed = 'a confirmé le Bug ';
-$lang->action->label->tostory = 'a converti en Story ';
-$lang->action->label->frombug = 'a converti du Bug ';
-$lang->action->label->fromlib = 'a importé de la Library ';
-$lang->action->label->totask = 'a converti en Tâche ';
-$lang->action->label->converttotask = 'converted to Task ';
-$lang->action->label->svncommited = 'a committé SVN ';
-$lang->action->label->gitcommited = 'a committé GIT ';
-$lang->action->label->linked2plan = 'a raccordé au Plan ';
-$lang->action->label->unlinkedfromplan = 'a extrait du plan ';
-$lang->action->label->changestatus = 'a changé le statut ';
-$lang->action->label->marked = 'a marqué';
-$lang->action->label->linked2execution = "a ajouté à {$lang->executionCommon}";
-$lang->action->label->unlinkedfromexecution = "a enlevé de {$lang->executionCommon}";
-$lang->action->label->linked2kanban = 'linked to kanban';
-$lang->action->label->linked2project = "linked to {$lang->projectCommon}";
-$lang->action->label->unlinkedfromproject = "unlinked from {$lang->projectCommon}";
-$lang->action->label->unlinkedfrombuild = "a enlevé du Build ";
-$lang->action->label->linked2release = "a ajouté à une Release ";
-$lang->action->label->unlinkedfromrelease = "a enlevé de la Release ";
-$lang->action->label->linked2revision = "Link Revision";
-$lang->action->label->unlinkedfromrevision = "Unlink Revision";
-$lang->action->label->linkrelatedbug = "a lié à un Bug ";
-$lang->action->label->unlinkrelatedbug = "a délié du Bug ";
-$lang->action->label->linkrelatedcase = "a mis en relation avec un CasTest ";
-$lang->action->label->unlinkrelatedcase = "a libéré du CasTest ";
-$lang->action->label->linkrelatedstory = "a lié à une Story ";
-$lang->action->label->unlinkrelatedstory = "a dégagé de la Story ";
-$lang->action->label->subdividestory = "a décomposé la Story ";
-$lang->action->label->unlinkchildstory = "a dissocié de la Story fille ";
-$lang->action->label->started = 'a commencé ';
-$lang->action->label->restarted = 'a continué ';
-$lang->action->label->recordestimate = 'a estimé ';
-$lang->action->label->editestimate = 'a réestimé ';
-$lang->action->label->canceled = 'a annulé ';
-$lang->action->label->finished = 'a fini ';
-$lang->action->label->paused = 'a stoppé ';
-$lang->action->label->verified = 'a vérifié ';
-$lang->action->label->delayed = 'a ajourné ';
-$lang->action->label->suspended = 'a suspendu ';
-$lang->action->label->login = "s'est Connecté";
-$lang->action->label->logout = "s'est Déconnecté";
-$lang->action->label->notified = "Notified";
-$lang->action->label->deleteestimate = "a remis à zéro ";
-$lang->action->label->linked2build = "a ajouté au Build ";
-$lang->action->label->linked2bug = "a lié au Bug ";
-$lang->action->label->linked2testtask = "linked";
-$lang->action->label->unlinkedfromtesttask = "unlinked";
-$lang->action->label->linkchildtask = "a raccroché à une sous-tâche";
-$lang->action->label->unlinkchildrentask = "a décroché la sous-tâche";
-$lang->action->label->linkparenttask = "a raccroché à une tâche parent";
-$lang->action->label->unlinkparenttask = "a décroché de la tâche parent";
-$lang->action->label->batchcreate = "a créé tâches par lot";
-$lang->action->label->createchildren = "a créé sous-tâches par lot";
-$lang->action->label->managed = "a managé";
-$lang->action->label->managedteam = "managed";
-$lang->action->label->managedwhitelist = "managed";
-$lang->action->label->deletechildrentask = "a supprimé une sous-tâche";
-$lang->action->label->createchildrenstory = "a créé une sous-story";
-$lang->action->label->linkchildstory = "a raccroché à une sous-story";
-$lang->action->label->unlinkchildrenstory = "a décroché de la sous-story";
-$lang->action->label->linkparentstory = "a raccroché à une story parent";
-$lang->action->label->unlinkparentstory = "a décroché de la story parent";
-$lang->action->label->deletechildrenstory = "a supprimé la sous-story";
-$lang->action->label->tracked = 'tracked';
-$lang->action->label->hangup = 'hangup';
-$lang->action->label->run = 'run';
-$lang->action->label->estimated = 'estimated';
-$lang->action->label->reviewpassed = 'Pass';
-$lang->action->label->reviewrejected = 'Reject';
-$lang->action->label->reviewclarified = 'Clarify';
-$lang->action->label->reviewreverted = 'Revert';
-$lang->action->label->commitsummary = 'Commit Summary';
-$lang->action->label->updatetrainee = 'Update Trainee';
-$lang->action->label->setdefaultbranch = 'Set default branch';
-$lang->action->label->syncprogram = 'start';
-$lang->action->label->syncproject = 'start';
-$lang->action->label->syncexecution = 'start';
-$lang->action->label->syncexecutionbychild = 'start';
-$lang->action->label->startProgram = '(The start of the project sets the status of the program as Ongoing)';
-$lang->action->label->createmr = 'Merge Request Linked';
-$lang->action->label->deletemr = 'Merge Request Unlinked';
-$lang->action->label->mergedmr = 'Merge Request Merged';
-$lang->action->label->compilepass = 'Compile Success';
-$lang->action->label->compilefail = 'Compile Fail';
-$lang->action->label->reopen = 'Reopen';
-$lang->action->label->approve = 'Passed';
-$lang->action->label->reject = 'Rejected';
-$lang->action->label->importfromgitlab = 'Issue associate created';
-$lang->action->label->archived = 'Archived';
-$lang->action->label->restore = 'Restore';
-$lang->action->label->mergedbranch = 'Merge Branch';
-$lang->action->label->startedbychild = 'started';
-$lang->action->label->finishedbychild = 'finished';
-$lang->action->label->closedbychild = 'closed';
-$lang->action->label->activatedbychild = 'activated';
-$lang->action->label->createchild = 'activated';
-$lang->action->label->executed = 'executed';
-$lang->action->label->importedcard = 'imported';
-$lang->action->label->importedproductplan = 'imported';
-$lang->action->label->importedrelease = 'imported';
-$lang->action->label->importedexecution = 'imported';
-$lang->action->label->importedbuild = 'imported';
-$lang->action->label->importedticket = 'imported';
-$lang->action->label->fromsonarqube = 'created a bug from SonarQube Issue named:';
-$lang->action->label->bind = 'bound';
-$lang->action->label->unbind = 'unbound';
-$lang->action->label->linkstory = 'link stories to';
-$lang->action->label->linkbug = 'link bugs to';
-$lang->action->label->unlinkstory = 'unlink stories from';
-$lang->action->label->unlinkbug = 'unlink bugs from';
-$lang->action->label->tolib = 'Importé';
-$lang->action->label->updatetolib = 'MàJ';
-$lang->action->label->ganttmove = 'sorted';
-$lang->action->label->submitreview = 'submitted';
-$lang->action->label->suspend = 'suspended';
-$lang->action->label->resume = 'resumed';
-$lang->action->label->reboot = 'reboot';
-$lang->action->label->boot = 'boot';
-$lang->action->label->destroy = 'destroyed';
-$lang->action->label->getvnc = 'remote control';
-$lang->action->label->synctwins = 'synchronized changes';
-$lang->action->label->relieved = 'relieved';
-$lang->action->label->switchtolight = 'switch from ALM mode to light mode';
-$lang->action->label->linkedrepo = 'Linked Code Repo';
-$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
-$lang->action->label->unlinkproduct = "Unlinked {$lang->productCommon}";
-$lang->action->label->createdsnapshot = 'create snapshot';
-$lang->action->label->restoredsnapshot = 'create snapshot';
-$lang->action->label->editsnapshot = 'edit snapshot';
-$lang->action->label->deletesnapshot = 'deleted snapshot';
-$lang->action->label->saveddraft = 'save draft';
-$lang->action->label->releaseddoc = 'released';
-$lang->action->label->collected = 'collected';
-$lang->action->label->uncollected = 'uncollected';
+$lang->action->label = new stdclass();
+$lang->action->label->install = 'install ';
+$lang->action->label->uninstall = 'uninstall ';
+$lang->action->label->upgrade = 'upgrade ';
+$lang->action->label->start = 'start ';
+$lang->action->label->stop = 'stop ';
+$lang->action->label->editname = 'edit name ';
+$lang->action->label->backup = 'backup ';
+$lang->action->label->adjustmemory = 'adjust memory ';
+$lang->action->label->enableldap = 'enable LDAP ';
+$lang->action->label->disableldap = 'disable LDAP ';
+$lang->action->label->enablesmtp = 'enable SMTP ';
+$lang->action->label->disablesmtp = 'disable SMTP ';
+$lang->action->label->tosenior = 'upgrade to senior ';
+$lang->action->label->saveautobackupsettings = 'enable auto backup ';
+$lang->action->label->closeautobackupsettings = 'disable auto backup ';
+$lang->action->label->autobackup = 'auto backup by system ';
+$lang->action->label->autorestore = 'auto restore by system ';
+$lang->action->label->deleteexpiredbackup = 'delete expire backup by system ';
+$lang->action->label->revert = 'revert ';
+$lang->action->label->install = 'install ';
+$lang->action->label->revert = 'revert ';
+$lang->action->label->created = 'a créé ';
+$lang->action->label->opened = 'a ouvert ';
+$lang->action->label->openedbysystem = 'Opened by system ';
+$lang->action->label->closedbysystem = 'Closed by system ';
+$lang->action->label->added = 'ajouter';
+$lang->action->label->changed = 'a changé ';
+$lang->action->label->edited = 'a édité ';
+$lang->action->label->assigned = 'a affecté ';
+$lang->action->label->closed = 'a fermé ';
+$lang->action->label->deleted = 'a supprimé ';
+$lang->action->label->deletedfile = 'a supprimé ';
+$lang->action->label->editfile = 'a édité ';
+$lang->action->label->erased = 'a détruit ';
+$lang->action->label->undeleted = 'a restauré ';
+$lang->action->label->hidden = 'a masqué ';
+$lang->action->label->commented = 'a commenté ';
+$lang->action->label->communicated = 'communicated';
+$lang->action->label->activated = 'a activé ';
+$lang->action->label->blocked = 'a bloqué ';
+$lang->action->label->resolved = 'a résolu ';
+$lang->action->label->reviewed = 'a revu ';
+$lang->action->label->recalled = 'recalled';
+$lang->action->label->recalledchange = 'undo changes';
+$lang->action->label->moved = 'a déplacé ';
+$lang->action->label->confirmed = 'a confirmé Story ';
+$lang->action->label->bugconfirmed = 'a confirmé le Bug ';
+$lang->action->label->tostory = 'a converti en Story ';
+$lang->action->label->frombug = 'a converti du Bug ';
+$lang->action->label->fromlib = 'a importé de la Library ';
+$lang->action->label->totask = 'a converti en Tâche ';
+$lang->action->label->converttotask = 'converted to Task ';
+$lang->action->label->svncommited = 'a committé SVN ';
+$lang->action->label->gitcommited = 'a committé GIT ';
+$lang->action->label->linked2plan = 'a raccordé au Plan ';
+$lang->action->label->unlinkedfromplan = 'a extrait du plan ';
+$lang->action->label->changestatus = 'a changé le statut ';
+$lang->action->label->marked = 'a marqué';
+$lang->action->label->linked2execution = "a ajouté à {$lang->executionCommon}";
+$lang->action->label->unlinkedfromexecution = "a enlevé de {$lang->executionCommon}";
+$lang->action->label->linked2kanban = 'linked to kanban';
+$lang->action->label->linked2project = "linked to {$lang->projectCommon}";
+$lang->action->label->unlinkedfromproject = "unlinked from {$lang->projectCommon}";
+$lang->action->label->unlinkedfrombuild = "a enlevé du Build ";
+$lang->action->label->linked2release = "a ajouté à une Release ";
+$lang->action->label->unlinkedfromrelease = "a enlevé de la Release ";
+$lang->action->label->linked2revision = "Link Revision";
+$lang->action->label->unlinkedfromrevision = "Unlink Revision";
+$lang->action->label->linkrelatedbug = "a lié à un Bug ";
+$lang->action->label->unlinkrelatedbug = "a délié du Bug ";
+$lang->action->label->linkrelatedcase = "a mis en relation avec un CasTest ";
+$lang->action->label->unlinkrelatedcase = "a libéré du CasTest ";
+$lang->action->label->linkrelatedstory = "a lié à une Story ";
+$lang->action->label->unlinkrelatedstory = "a dégagé de la Story ";
+$lang->action->label->subdividestory = "a décomposé la Story ";
+$lang->action->label->unlinkchildstory = "a dissocié de la Story fille ";
+$lang->action->label->started = 'a commencé ';
+$lang->action->label->restarted = 'a continué ';
+$lang->action->label->recordestimate = 'a estimé ';
+$lang->action->label->editestimate = 'a réestimé ';
+$lang->action->label->canceled = 'a annulé ';
+$lang->action->label->finished = 'a fini ';
+$lang->action->label->paused = 'a stoppé ';
+$lang->action->label->verified = 'a vérifié ';
+$lang->action->label->delayed = 'a ajourné ';
+$lang->action->label->suspended = 'a suspendu ';
+$lang->action->label->login = "s'est Connecté";
+$lang->action->label->logout = "s'est Déconnecté";
+$lang->action->label->notified = "Notified";
+$lang->action->label->deleteestimate = "a remis à zéro ";
+$lang->action->label->linked2build = "a ajouté au Build ";
+$lang->action->label->linked2bug = "a lié au Bug ";
+$lang->action->label->linked2testtask = "linked";
+$lang->action->label->unlinkedfromtesttask = "unlinked";
+$lang->action->label->linkchildtask = "a raccroché à une sous-tâche";
+$lang->action->label->unlinkchildrentask = "a décroché la sous-tâche";
+$lang->action->label->linkparenttask = "a raccroché à une tâche parent";
+$lang->action->label->unlinkparenttask = "a décroché de la tâche parent";
+$lang->action->label->batchcreate = "a créé tâches par lot";
+$lang->action->label->createchildren = "a créé sous-tâches par lot";
+$lang->action->label->managed = "a managé";
+$lang->action->label->managedteam = "managed";
+$lang->action->label->managedwhitelist = "managed";
+$lang->action->label->deletechildrentask = "a supprimé une sous-tâche";
+$lang->action->label->createchildrenstory = "a créé une sous-story";
+$lang->action->label->linkchildstory = "a raccroché à une sous-story";
+$lang->action->label->unlinkchildrenstory = "a décroché de la sous-story";
+$lang->action->label->linkparentstory = "a raccroché à une story parent";
+$lang->action->label->unlinkparentstory = "a décroché de la story parent";
+$lang->action->label->deletechildrenstory = "a supprimé la sous-story";
+$lang->action->label->tracked = 'tracked';
+$lang->action->label->hangup = 'hangup';
+$lang->action->label->run = 'run';
+$lang->action->label->estimated = 'estimated';
+$lang->action->label->reviewpassed = 'Pass';
+$lang->action->label->reviewrejected = 'Reject';
+$lang->action->label->reviewclarified = 'Clarify';
+$lang->action->label->reviewreverted = 'Revert';
+$lang->action->label->commitsummary = 'Commit Summary';
+$lang->action->label->updatetrainee = 'Update Trainee';
+$lang->action->label->setdefaultbranch = 'Set default branch';
+$lang->action->label->syncprogram = 'start';
+$lang->action->label->syncproject = 'start';
+$lang->action->label->syncexecution = 'start';
+$lang->action->label->syncexecutionbychild = 'start';
+$lang->action->label->startProgram = '(The start of the project sets the status of the program as Ongoing)';
+$lang->action->label->createmr = 'Merge Request Linked';
+$lang->action->label->deletemr = 'Merge Request Unlinked';
+$lang->action->label->mergedmr = 'Merge Request Merged';
+$lang->action->label->compilepass = 'Compile Success';
+$lang->action->label->compilefail = 'Compile Fail';
+$lang->action->label->reopen = 'Reopen';
+$lang->action->label->approve = 'Passed';
+$lang->action->label->reject = 'Rejected';
+$lang->action->label->importfromgitlab = 'Issue associate created';
+$lang->action->label->archived = 'Archived';
+$lang->action->label->restore = 'Restore';
+$lang->action->label->mergedbranch = 'Merge Branch';
+$lang->action->label->startedbychild = 'started';
+$lang->action->label->finishedbychild = 'finished';
+$lang->action->label->closedbychild = 'closed';
+$lang->action->label->activatedbychild = 'activated';
+$lang->action->label->createchild = 'activated';
+$lang->action->label->executed = 'executed';
+$lang->action->label->importedcard = 'imported';
+$lang->action->label->importedproductplan = 'imported';
+$lang->action->label->importedrelease = 'imported';
+$lang->action->label->importedexecution = 'imported';
+$lang->action->label->importedbuild = 'imported';
+$lang->action->label->importedticket = 'imported';
+$lang->action->label->fromsonarqube = 'created a bug from SonarQube Issue named:';
+$lang->action->label->bind = 'bound';
+$lang->action->label->unbind = 'unbound';
+$lang->action->label->linkstory = 'link stories to';
+$lang->action->label->linkbug = 'link bugs to';
+$lang->action->label->unlinkstory = 'unlink stories from';
+$lang->action->label->unlinkbug = 'unlink bugs from';
+$lang->action->label->tolib = 'Importé';
+$lang->action->label->updatetolib = 'MàJ';
+$lang->action->label->ganttmove = 'sorted';
+$lang->action->label->submitreview = 'submitted';
+$lang->action->label->suspend = 'suspended';
+$lang->action->label->resume = 'resumed';
+$lang->action->label->reboot = 'reboot';
+$lang->action->label->boot = 'boot';
+$lang->action->label->destroy = 'destroyed';
+$lang->action->label->getvnc = 'remote control';
+$lang->action->label->synctwins = 'synchronized changes';
+$lang->action->label->relieved = 'relieved';
+$lang->action->label->switchtolight = 'switch from ALM mode to light mode';
+$lang->action->label->linkedrepo = 'Linked Code Repo';
+$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
+$lang->action->label->unlinkproduct = "Unlinked {$lang->productCommon}";
+$lang->action->label->createdsnapshot = 'create snapshot';
+$lang->action->label->restoredsnapshot = 'create snapshot';
+$lang->action->label->editsnapshot = 'edit snapshot';
+$lang->action->label->deletesnapshot = 'deleted snapshot';
+$lang->action->label->saveddraft = 'save draft';
+$lang->action->label->releaseddoc = 'released';
+$lang->action->label->collected = 'collected';
+$lang->action->label->uncollected = 'uncollected';
/* Dynamic information is grouped by object. */
$lang->action->dynamicAction = new stdclass();
diff --git a/module/action/lang/vi.php b/module/action/lang/vi.php
index fcbf931b03..88655ec532 100644
--- a/module/action/lang/vi.php
+++ b/module/action/lang/vi.php
@@ -127,6 +127,10 @@ $lang->action->objectTypes['patch'] = 'Patch';
$lang->action->objectTypes['repo'] = 'Repo';
$lang->action->objectTypes['dataview'] = 'Data View';
$lang->action->objectTypes['scene'] = 'Scene';
+$lang->action->objectTypes['pivot'] = 'Pivot';
+$lang->action->objectTypes['serverroom'] = 'IDC';
+$lang->action->objectTypes['account'] = 'Account';
+$lang->action->objectTypes['host'] = 'Host';
/* Used to describe operation history. */
$lang->action->desc = new stdclass();
@@ -208,118 +212,165 @@ $lang->action->desc->deletechildrenstory = '$date, $actor delet
/* Historical record of actions when associating and removing tình huống. */
$lang->action->desc->linkrelatedcase = '$date, $actor linked a case $extra.' . "\n";
$lang->action->desc->unlinkrelatedcase = '$date, $actor unlinked a case $extra.' . "\n";
+$lang->action->desc->online = '$date, set online by $actor .' . "\n";
+$lang->action->desc->offline = '$date, set offline by $actor .' . "\n";
+$lang->action->desc->linkhost = '$date, the host is linked by $actor .' . "\n";
+
+/* 用来描述应用的历史操作记录。*/
+$lang->action->desc->install = '$date, installed by $actor.' . "\n";
+$lang->action->desc->uninstall = '$date, uninstalled by $actor.' . "\n";
+$lang->action->desc->start = '$date, started by $actor.' . "\n";
+$lang->action->desc->stop = '$date, closed by $actor.' . "\n";
+$lang->action->desc->editextra = '$date, updated from $oldname to $newName by $actor.' . "\n";
+$lang->action->desc->upgrade = '$date, upgraded from $oldVersion to $newVersion by $actor.' . "\n";
+$lang->action->desc->backup = '$date, backuped by $actor.' . "\n";
+$lang->action->desc->adjustmemory = '$date, resized to $newMemory of memory by $actor.' . "\n";
+$lang->action->desc->enableldap = '$date, enabled by $actor of LDAP。' . "\n";
+$lang->action->desc->disableldap = '$date, disabled by $actor of LDAP。' . "\n";
+$lang->action->desc->enablesmtp = '$date, enabled by $actor of SMTP。' . "\n";
+$lang->action->desc->disablesmtp = '$date, disabled by $actor of SMTP。' . "\n";
+$lang->action->desc->updatecustom = '$date, updated by $actor of custom settings.' . "\n";
+$lang->action->desc->tosenior = '$date, upgraded from $oldAppName to $newAppName by $actor .' . "\n";
+$lang->action->desc->saveautobackupsettings = '$date, opened by $actor of autobackup.' . "\n";
+$lang->action->desc->closeautobackupsettings = '$date, closed by $actor of autobackup' . "\n";
+$lang->action->desc->saveautorestoresettings = '$date, updated by $actor of autorestore.' . "\n";
+$lang->action->desc->autobackup = '$date, backed up of system' . "\n";
+$lang->action->desc->autorestore = '$date, restored by system.' . "\n";
+$lang->action->desc->deleteexpiredbackup = '$date, deleted the expired automatic backups by system.' . "\n";
/* Used to display dynamic information. */
-$lang->action->label = new stdclass();
-$lang->action->label->created = 'created ';
-$lang->action->label->opened = 'opened ';
-$lang->action->label->openedbysystem = 'Opened by system ';
-$lang->action->label->closedbysystem = 'Closed by system ';
-$lang->action->label->added = 'added';
-$lang->action->label->changed = 'changed ';
-$lang->action->label->edited = 'edited ';
-$lang->action->label->assigned = 'assigned ';
-$lang->action->label->closed = 'closed ';
-$lang->action->label->deleted = 'deleted ';
-$lang->action->label->deletedfile = 'deleted ';
-$lang->action->label->editfile = 'edited ';
-$lang->action->label->erased = 'erased ';
-$lang->action->label->undeleted = 'restored ';
-$lang->action->label->hidden = 'hid ';
-$lang->action->label->commented = 'commented ';
-$lang->action->label->communicated = 'communicated';
-$lang->action->label->activated = 'activated ';
-$lang->action->label->blocked = 'blocked ';
-$lang->action->label->resolved = 'resolved ';
-$lang->action->label->reviewed = 'reviewed ';
-$lang->action->label->recalled = 'recalled';
-$lang->action->label->recalledchange = 'undo changes';
-$lang->action->label->moved = 'moved ';
-$lang->action->label->confirmed = 'confirmed Story ';
-$lang->action->label->bugconfirmed = 'Đã xác nhận';
-$lang->action->label->tostory = 'converted tới Câu chuyện ';
-$lang->action->label->frombug = 'converted từ Bug ';
-$lang->action->label->fromlib = 'imported from Library ';
-$lang->action->label->totask = 'converted to Task ';
-$lang->action->label->svncommited = 'committed SVN ';
-$lang->action->label->gitcommited = 'committed Git ';
-$lang->action->label->linked2plan = 'linked cho kế hoạch ';
-$lang->action->label->unlinkedfromplan = 'unlinked from ';
-$lang->action->label->changestatus = 'changed status';
-$lang->action->label->marked = 'marked';
-$lang->action->label->linked2execution = "đã liên kết tới {$lang->executionCommon}";
-$lang->action->label->unlinkedfromexecution = "hủy liên kết từ {$lang->executionCommon}";
-$lang->action->label->linked2project = "Link Project";
-$lang->action->label->unlinkedfromproject = "Unlink Project";
-$lang->action->label->unlinkedfrombuild = "hủy liên kết Bản dựng ";
-$lang->action->label->linked2release = "liên kết Phát hành ";
-$lang->action->label->unlinkedfromrelease = "hủy liên kết Release ";
-$lang->action->label->linked2revision = "Link Revision";
-$lang->action->label->unlinkedfromrevision = "Unlink Revision";
-$lang->action->label->linkrelatedbug = "linked Bug ";
-$lang->action->label->unlinkrelatedbug = "hủy liên kết Bug ";
-$lang->action->label->linkrelatedcase = "linked Case ";
-$lang->action->label->unlinkrelatedcase = "hủy liên kết Case ";
-$lang->action->label->linkrelatedstory = "linked Story ";
-$lang->action->label->unlinkrelatedstory = "hủy liên kết Story ";
-$lang->action->label->subdividestory = "decomposed Story ";
-$lang->action->label->unlinkchildstory = "hủy liên kết Story ";
-$lang->action->label->started = 'started ';
-$lang->action->label->restarted = 'continued ';
-$lang->action->label->recordestimate = 'recorded ';
-$lang->action->label->editestimate = 'edited ';
-$lang->action->label->canceled = 'cancelled ';
-$lang->action->label->finished = 'finished ';
-$lang->action->label->paused = 'paused ';
-$lang->action->label->verified = 'verified ';
-$lang->action->label->delayed = 'delayed ';
-$lang->action->label->suspended = 'suspended ';
-$lang->action->label->login = 'login';
-$lang->action->label->logout = "logout";
-$lang->action->label->notified = "Notified";
-$lang->action->label->deleteestimate = "deleted ";
-$lang->action->label->linked2build = "linked ";
-$lang->action->label->linked2bug = "linked ";
-$lang->action->label->linked2testtask = "linked";
-$lang->action->label->unlinkedfromtesttask = "unlinked";
-$lang->action->label->linkchildtask = "linked a child task";
-$lang->action->label->unlinkchildrentask = "hủy liên kết a child task";
-$lang->action->label->linkparenttask = "linked a nhiệm vụ cha";
-$lang->action->label->unlinkparenttask = "unlink from nhiệm vụ cha";
-$lang->action->label->batchcreate = "batch created tasks";
-$lang->action->label->createchildren = "create child tasks";
-$lang->action->label->managed = "managed";
-$lang->action->label->managedteam = "managed";
-$lang->action->label->managedwhitelist = "managed";
-$lang->action->label->deletechildrentask = "delete children task";
-$lang->action->label->createchildrenstory = "create child stories";
-$lang->action->label->linkchildstory = "linked a child story";
-$lang->action->label->unlinkchildrenstory = "hủy liên kết a child story";
-$lang->action->label->linkparentstory = "linked a parent story";
-$lang->action->label->unlinkparentstory = "unlink from parent story";
-$lang->action->label->deletechildrenstory = "delete children story";
-$lang->action->label->tracked = 'tracked';
-$lang->action->label->hangup = 'hangup';
-$lang->action->label->run = 'run';
-$lang->action->label->estimated = 'estimated';
-$lang->action->label->reviewpassed = 'Pass';
-$lang->action->label->reviewrejected = 'Reject';
-$lang->action->label->reviewclarified = 'Clarify';
-$lang->action->label->commitsummary = 'Commit Summary';
-$lang->action->label->updatetrainee = 'Update Trainee';
-$lang->action->label->syncprogram = 'start';
-$lang->action->label->syncproject = 'start';
-$lang->action->label->syncexecution = 'start';
-$lang->action->label->startProgram = '(The start of the project sets the status of the program as Ongoing)';
-$lang->action->label->submitreview = 'submitted';
-$lang->action->label->suspend = 'suspended';
-$lang->action->label->resume = 'resumed';
-$lang->action->label->reboot = 'reboot';
-$lang->action->label->boot = 'boot';
-$lang->action->label->destroy = 'destroyed';
-$lang->action->label->synctwins = 'synchronized changes';
-$lang->action->label->linkedrepo = 'Linked Code Repo';
-$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
+$lang->action->label = new stdclass();
+$lang->action->label->install = 'install ';
+$lang->action->label->uninstall = 'uninstall ';
+$lang->action->label->upgrade = 'upgrade ';
+$lang->action->label->start = 'start ';
+$lang->action->label->stop = 'stop ';
+$lang->action->label->editname = 'edit name ';
+$lang->action->label->backup = 'backup ';
+$lang->action->label->adjustmemory = 'adjust memory ';
+$lang->action->label->enableldap = 'enable LDAP ';
+$lang->action->label->disableldap = 'disable LDAP ';
+$lang->action->label->enablesmtp = 'enable SMTP ';
+$lang->action->label->disablesmtp = 'disable SMTP ';
+$lang->action->label->tosenior = 'upgrade to senior ';
+$lang->action->label->saveautobackupsettings = 'enable auto backup ';
+$lang->action->label->closeautobackupsettings = 'disable auto backup ';
+$lang->action->label->autobackup = 'auto backup by system ';
+$lang->action->label->autorestore = 'auto restore by system ';
+$lang->action->label->deleteexpiredbackup = 'delete expire backup by system ';
+$lang->action->label->revert = 'reverted';
+$lang->action->label->created = 'created ';
+$lang->action->label->opened = 'opened ';
+$lang->action->label->openedbysystem = 'Opened by system ';
+$lang->action->label->closedbysystem = 'Closed by system ';
+$lang->action->label->added = 'added';
+$lang->action->label->changed = 'changed ';
+$lang->action->label->edited = 'edited ';
+$lang->action->label->assigned = 'assigned ';
+$lang->action->label->closed = 'closed ';
+$lang->action->label->deleted = 'deleted ';
+$lang->action->label->deletedfile = 'deleted ';
+$lang->action->label->editfile = 'edited ';
+$lang->action->label->erased = 'erased ';
+$lang->action->label->undeleted = 'restored ';
+$lang->action->label->hidden = 'hid ';
+$lang->action->label->commented = 'commented ';
+$lang->action->label->communicated = 'communicated';
+$lang->action->label->activated = 'activated ';
+$lang->action->label->blocked = 'blocked ';
+$lang->action->label->resolved = 'resolved ';
+$lang->action->label->reviewed = 'reviewed ';
+$lang->action->label->recalled = 'recalled';
+$lang->action->label->recalledchange = 'undo changes';
+$lang->action->label->moved = 'moved ';
+$lang->action->label->confirmed = 'confirmed Story ';
+$lang->action->label->bugconfirmed = 'Đã xác nhận';
+$lang->action->label->tostory = 'converted tới Câu chuyện ';
+$lang->action->label->frombug = 'converted từ Bug ';
+$lang->action->label->fromlib = 'imported from Library ';
+$lang->action->label->totask = 'converted to Task ';
+$lang->action->label->svncommited = 'committed SVN ';
+$lang->action->label->gitcommited = 'committed Git ';
+$lang->action->label->linked2plan = 'linked cho kế hoạch ';
+$lang->action->label->unlinkedfromplan = 'unlinked from ';
+$lang->action->label->changestatus = 'changed status';
+$lang->action->label->marked = 'marked';
+$lang->action->label->linked2execution = "đã liên kết tới {$lang->executionCommon}";
+$lang->action->label->unlinkedfromexecution = "hủy liên kết từ {$lang->executionCommon}";
+$lang->action->label->linked2project = "Link Project";
+$lang->action->label->unlinkedfromproject = "Unlink Project";
+$lang->action->label->unlinkedfrombuild = "hủy liên kết Bản dựng ";
+$lang->action->label->linked2release = "liên kết Phát hành ";
+$lang->action->label->unlinkedfromrelease = "hủy liên kết Release ";
+$lang->action->label->linked2revision = "Link Revision";
+$lang->action->label->unlinkedfromrevision = "Unlink Revision";
+$lang->action->label->linkrelatedbug = "linked Bug ";
+$lang->action->label->unlinkrelatedbug = "hủy liên kết Bug ";
+$lang->action->label->linkrelatedcase = "linked Case ";
+$lang->action->label->unlinkrelatedcase = "hủy liên kết Case ";
+$lang->action->label->linkrelatedstory = "linked Story ";
+$lang->action->label->unlinkrelatedstory = "hủy liên kết Story ";
+$lang->action->label->subdividestory = "decomposed Story ";
+$lang->action->label->unlinkchildstory = "hủy liên kết Story ";
+$lang->action->label->started = 'started ';
+$lang->action->label->restarted = 'continued ';
+$lang->action->label->recordestimate = 'recorded ';
+$lang->action->label->editestimate = 'edited ';
+$lang->action->label->canceled = 'cancelled ';
+$lang->action->label->finished = 'finished ';
+$lang->action->label->paused = 'paused ';
+$lang->action->label->verified = 'verified ';
+$lang->action->label->delayed = 'delayed ';
+$lang->action->label->suspended = 'suspended ';
+$lang->action->label->login = 'login';
+$lang->action->label->logout = "logout";
+$lang->action->label->notified = "Notified";
+$lang->action->label->deleteestimate = "deleted ";
+$lang->action->label->linked2build = "linked ";
+$lang->action->label->linked2bug = "linked ";
+$lang->action->label->linked2testtask = "linked";
+$lang->action->label->unlinkedfromtesttask = "unlinked";
+$lang->action->label->linkchildtask = "linked a child task";
+$lang->action->label->unlinkchildrentask = "hủy liên kết a child task";
+$lang->action->label->linkparenttask = "linked a nhiệm vụ cha";
+$lang->action->label->unlinkparenttask = "unlink from nhiệm vụ cha";
+$lang->action->label->batchcreate = "batch created tasks";
+$lang->action->label->createchildren = "create child tasks";
+$lang->action->label->managed = "managed";
+$lang->action->label->managedteam = "managed";
+$lang->action->label->managedwhitelist = "managed";
+$lang->action->label->deletechildrentask = "delete children task";
+$lang->action->label->createchildrenstory = "create child stories";
+$lang->action->label->linkchildstory = "linked a child story";
+$lang->action->label->unlinkchildrenstory = "hủy liên kết a child story";
+$lang->action->label->linkparentstory = "linked a parent story";
+$lang->action->label->unlinkparentstory = "unlink from parent story";
+$lang->action->label->deletechildrenstory = "delete children story";
+$lang->action->label->tracked = 'tracked';
+$lang->action->label->hangup = 'hangup';
+$lang->action->label->run = 'run';
+$lang->action->label->estimated = 'estimated';
+$lang->action->label->reviewpassed = 'Pass';
+$lang->action->label->reviewrejected = 'Reject';
+$lang->action->label->reviewclarified = 'Clarify';
+$lang->action->label->commitsummary = 'Commit Summary';
+$lang->action->label->updatetrainee = 'Update Trainee';
+$lang->action->label->syncprogram = 'start';
+$lang->action->label->syncproject = 'start';
+$lang->action->label->syncexecution = 'start';
+$lang->action->label->startProgram = '(The start of the project sets the status of the program as Ongoing)';
+$lang->action->label->submitreview = 'submitted';
+$lang->action->label->suspend = 'suspended';
+$lang->action->label->resume = 'resumed';
+$lang->action->label->reboot = 'reboot';
+$lang->action->label->boot = 'boot';
+$lang->action->label->destroy = 'destroyed';
+$lang->action->label->synctwins = 'synchronized changes';
+$lang->action->label->linkedrepo = 'Linked Code Repo';
+$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
+$lang->action->label->online = 'online';
+$lang->action->label->offline = 'offline';
+$lang->action->label->linkhost = 'link hosts to';
/* Dynamic information is grouped by object. */
$lang->action->dynamicAction = new stdclass;
@@ -586,6 +637,9 @@ $lang->action->label->risk = 'Risk|risk|view|riskID%s';
$lang->action->label->issue = 'Issue|issue|view|issueID=%s';
$lang->action->label->design = 'Design|design|view|designID=%s';
$lang->action->label->stakeholder = 'Stakeholder|stakeholder|view|userID=%s';
+$lang->action->label->serverroom = 'IDC|serverroom|browse|';
+$lang->action->label->host = 'Host|host|view|id=%s';
+$lang->action->label->account = "Account|account|view|id=%s";
/* Object type. */
$lang->action->search = new stdclass();
diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php
index a6b5bfc46d..4c00b65184 100755
--- a/module/action/lang/zh-cn.php
+++ b/module/action/lang/zh-cn.php
@@ -248,6 +248,9 @@ $lang->action->desc->createdsnapshot = '$date, $actor 创
$lang->action->desc->restoredsnapshot = '$date, $actor 还原了快照 $extra。' . "\n";
$lang->action->desc->editsnapshot = '$date, $actor 编辑了快照 $extra。' . "\n";
$lang->action->desc->deletesnapshot = '$date, $actor 删除了快照 $extra。' . "\n";
+$lang->action->desc->online = '$date, 由 $actor 上架。' . "\n";
+$lang->action->desc->offline = '$date, 由 $actor 下架。' . "\n";
+$lang->action->desc->linkhost = '$date, 由 $actor 关联主机。' . "\n";
/* 用来描述和父子任务相关的操作历史记录。*/
$lang->action->desc->createchildren = '$date, 由 $actor 创建子任务 $extra。' . "\n";
@@ -283,170 +286,212 @@ $lang->action->desc->releaseddoc = '$date, 由 $actor 发布 action->desc->collected = '$date, 由 $actor 收藏 $extra。' . "\n";
$lang->action->desc->uncollected = '$date, 由 $actor 取消收藏 $extra。' . "\n";
+/* 用来描述应用的历史操作记录。*/
+$lang->action->desc->install = '$date, 由 $actor 安装。' . "\n";
+$lang->action->desc->uninstall = '$date, 由 $actor 删除。' . "\n";
+$lang->action->desc->start = '$date, 由 $actor 启动。' . "\n";
+$lang->action->desc->stop = '$date, 由 $actor 关闭。' . "\n";
+$lang->action->desc->editname = '$date, 由 $actor 修改了名称,从 $oldName 修改为 $newName 。' . "\n";
+$lang->action->desc->upgrade = '$date, 由 $actor 升级,从 $oldVersion 升级为 $newVersion 。' . "\n";
+$lang->action->desc->backup = '$date, 由 $actor 备份。' . "\n";
+$lang->action->desc->adjustmemory = '$date, 由 $actor 调整内存到 $newMemory 。' . "\n";
+$lang->action->desc->enableldap = '$date, 由 $actor 启用了LDAP。' . "\n";
+$lang->action->desc->disableldap = '$date, 由 $actor 禁用了LDAP。' . "\n";
+$lang->action->desc->enablesmtp = '$date, 由 $actor 启用了SMTP。' . "\n";
+$lang->action->desc->disablesmtp = '$date, 由 $actor 禁用了SMTP。' . "\n";
+$lang->action->desc->updatecustom = '$date, 由 $actor 修改了自定义配置。' . "\n";
+$lang->action->desc->tosenior = '$date, 由 $actor 升级服务到高级版,从 $oldAppName 升级到 $newAppName 。' . "\n";
+$lang->action->desc->saveautobackupsettings = '$date, 由 $actor 修改了自动备份设置:开启自动备份。' . "\n";
+$lang->action->desc->closeautobackupsettings = '$date, 由 $actor 修改了自动备份设置:自动备份已关闭。' . "\n";
+$lang->action->desc->saveautorestoresettings = '$date, 由 $actor 修改了自动还原设置。' . "\n";
+$lang->action->desc->autobackup = '$date, 系统执行了自动备份。' . "\n";
+$lang->action->desc->autorestore = '$date, 系统执行了自动还原。' . "\n";
+$lang->action->desc->deleteexpiredbackup = '$date, 系统删除了过期的自动备份。' . "\n";
+
/* 用来显示动态信息。*/
-$lang->action->label = new stdclass();
-$lang->action->label->install = '安装了';
-$lang->action->label->revert = '还原了';
-$lang->action->label->created = '创建了';
-$lang->action->label->opened = '创建了';
-$lang->action->label->openedbysystem = '系统创建了';
-$lang->action->label->closedbysystem = '系统关闭了';
-$lang->action->label->added = '添加了';
-$lang->action->label->changed = '变更了';
-$lang->action->label->edited = '编辑了';
-$lang->action->label->assigned = '指派了';
-$lang->action->label->closed = '关闭了';
-$lang->action->label->deleted = '删除了';
-$lang->action->label->deletedfile = '删除了附件';
-$lang->action->label->editfile = '编辑了附件';
-$lang->action->label->erased = '删除了';
-$lang->action->label->undeleted = '还原了';
-$lang->action->label->hidden = '隐藏了';
-$lang->action->label->commented = '评论了';
-$lang->action->label->communicated = '沟通了';
-$lang->action->label->activated = '激活了';
-$lang->action->label->blocked = '阻塞了';
-$lang->action->label->resolved = '解决了';
-$lang->action->label->reviewed = '评审了';
-$lang->action->label->recalled = '撤销了评审';
-$lang->action->label->recalledchange = '撤销了变更';
-$lang->action->label->moved = '移动了';
-$lang->action->label->confirmed = "确认了{$lang->SRCommon}";
-$lang->action->label->bugconfirmed = '确认了';
-$lang->action->label->tostory = "转了{$lang->SRCommon}";
-$lang->action->label->frombug = "转了{$lang->SRCommon}";
-$lang->action->label->fromlib = '从用例库导入';
-$lang->action->label->totask = '转了任务';
-$lang->action->label->converttotask = '转了任务';
-$lang->action->label->svncommited = '提交了代码';
-$lang->action->label->gitcommited = '提交了代码';
-$lang->action->label->linked2plan = "关联了计划";
-$lang->action->label->unlinkedfromplan = "移除了计划";
-$lang->action->label->changestatus = '修改了状态';
-$lang->action->label->marked = '编辑了';
-$lang->action->label->linked2execution = "关联了{$lang->executionCommon}";
-$lang->action->label->unlinkedfromexecution = "移除了{$lang->executionCommon}";
-$lang->action->label->linked2kanban = '关联了看板';
-$lang->action->label->linked2project = "关联了{$lang->projectCommon}";
-$lang->action->label->unlinkedfromproject = "移除了{$lang->projectCommon}";
-$lang->action->label->unlinkedfrombuild = "移除了版本";
-$lang->action->label->linked2release = "关联了发布";
-$lang->action->label->unlinkedfromrelease = "移除了发布";
-$lang->action->label->linked2revision = "关联了代码提交";
-$lang->action->label->unlinkedfromrevision = "取消关联了代码提交";
-$lang->action->label->linkrelatedbug = "关联了相关Bug";
-$lang->action->label->unlinkrelatedbug = "移除了相关Bug";
-$lang->action->label->linkrelatedcase = "关联了相关用例";
-$lang->action->label->unlinkrelatedcase = "移除了相关用例";
-$lang->action->label->linkrelatedstory = "关联了相关{$lang->SRCommon}";
-$lang->action->label->unlinkrelatedstory = "移除了相关{$lang->SRCommon}";
-$lang->action->label->subdividestory = "细分了{$lang->SRCommon}";
-$lang->action->label->unlinkchildstory = "移除了细分{$lang->SRCommon}";
-$lang->action->label->started = '开始了';
-$lang->action->label->restarted = '继续了';
-$lang->action->label->recordestimate = '记录了工时';
-$lang->action->label->editestimate = '编辑了工时';
-$lang->action->label->canceled = '取消了';
-$lang->action->label->finished = '完成了';
-$lang->action->label->paused = '暂停了';
-$lang->action->label->verified = '验收了';
-$lang->action->label->delayed = '延期了';
-$lang->action->label->suspended = '挂起了';
-$lang->action->label->login = '登录系统';
-$lang->action->label->logout = "退出登录";
-$lang->action->label->notified = "通知了";
-$lang->action->label->deleteestimate = "删除了工时";
-$lang->action->label->linked2build = "关联了";
-$lang->action->label->linked2bug = "关联了";
-$lang->action->label->linked2testtask = "关联了";
-$lang->action->label->unlinkedfromtesttask = "移除了";
-$lang->action->label->linkchildtask = "关联了子任务";
-$lang->action->label->unlinkchildrentask = "取消关联了子任务";
-$lang->action->label->linkparenttask = "关联到了父任务";
-$lang->action->label->unlinkparenttask = "从父任务取消关联了";
-$lang->action->label->batchcreate = "批量创建了任务";
-$lang->action->label->createchildren = "创建了子任务";
-$lang->action->label->managed = "维护了";
-$lang->action->label->managedteam = "维护了";
-$lang->action->label->managedwhitelist = "维护了";
-$lang->action->label->deletechildrentask = "删除了子任务";
-$lang->action->label->createchildrenstory = "创建了子需求";
-$lang->action->label->linkchildstory = "关联了子需求";
-$lang->action->label->unlinkchildrenstory = "取消关联了子需求";
-$lang->action->label->linkparentstory = "关联到了父需求";
-$lang->action->label->unlinkparentstory = "从父需求取消关联了";
-$lang->action->label->deletechildrenstory = "删除了子需求";
-$lang->action->label->tracked = '跟踪了';
-$lang->action->label->hangup = '挂起了';
-$lang->action->label->run = '执行了';
-$lang->action->label->estimated = '估算了';
-$lang->action->label->reviewpassed = '确认通过';
-$lang->action->label->reviewrejected = '拒绝了';
-$lang->action->label->reviewclarified = '有待明确';
-$lang->action->label->reviewreverted = '撤销变更';
-$lang->action->label->commitsummary = '提交了培训总结';
-$lang->action->label->updatetrainee = '更新了培训人员';
-$lang->action->label->setdefaultbranch = '设置了默认分支';
-$lang->action->label->syncprogram = '开始了';
-$lang->action->label->syncproject = '开始了';
-$lang->action->label->syncexecution = '开始了';
-$lang->action->label->syncexecutionbychild = '开始了';
-$lang->action->label->startProgram = "(因{$lang->projectCommon}开始而启动项目集)";
-$lang->action->label->createmr = '合并请求关联了';
-$lang->action->label->deletemr = '合并请求取消了';
-$lang->action->label->mergedmr = '合并请求合并了';
-$lang->action->label->compilepass = '构建成功';
-$lang->action->label->compilefail = '构建失败';
-$lang->action->label->reopen = '重新打开了';
-$lang->action->label->approve = '通过了';
-$lang->action->label->reject = '拒绝了';
-$lang->action->label->importfromgitlab = '从Gitlab关联创建了';
-$lang->action->label->archived = '归档了';
-$lang->action->label->restore = '还原了';
-$lang->action->label->mergedbranch = '合并了分支';
-$lang->action->label->startedbychild = '开始了';
-$lang->action->label->finishedbychild = '完成了';
-$lang->action->label->closedbychild = '关闭了';
-$lang->action->label->activatedbychild = '激活了';
-$lang->action->label->createchild = '激活了';
-$lang->action->label->executed = '执行了';
-$lang->action->label->importedcard = '导入了';
-$lang->action->label->importedproductplan = '导入了';
-$lang->action->label->importedrelease = '导入了';
-$lang->action->label->importedexecution = '导入了';
-$lang->action->label->importedbuild = '导入了';
-$lang->action->label->importedticket = '导入了';
-$lang->action->label->fromsonarqube = '由SonarQube问题创建了';
-$lang->action->label->bind = '绑定了';
-$lang->action->label->unbind = '取消绑定了';
-$lang->action->label->linkstory = '关联需求到了';
-$lang->action->label->linkbug = '关联BUG到了';
-$lang->action->label->unlinkstory = '移除了需求从';
-$lang->action->label->unlinkbug = '移除了BUG从';
-$lang->action->label->tolib = '导入了';
-$lang->action->label->updatetolib = '更新了';
-$lang->action->label->ganttmove = '排序了';
-$lang->action->label->submitreview = '提交了评审';
-$lang->action->label->suspend = '休眠了';
-$lang->action->label->resume = '恢复了';
-$lang->action->label->reboot = '重启了';
-$lang->action->label->boot = '启动了';
-$lang->action->label->destroy = '关闭了';
-$lang->action->label->getvnc = '远程操控了';
-$lang->action->label->synctwins = '同步修改了';
-$lang->action->label->relieved = '解除了';
-$lang->action->label->switchtolight = '从全生命周期管理模式切换为轻量管理模式';
-$lang->action->label->linkedrepo = '关联代码库到';
-$lang->action->label->unlinkedrepo = "取消了{$lang->projectCommon}与代码库的关联";
-$lang->action->label->unlinkproduct = "取消了与{$lang->productCommon}的关联";
-$lang->action->label->createdsnapshot = '创建了快照';
-$lang->action->label->restoredsnapshot = '还原了快照';
-$lang->action->label->editsnapshot = '编辑了快照';
-$lang->action->label->deletesnapshot = '编辑了快照';
-$lang->action->label->saveddraft = '存为草稿';
-$lang->action->label->releaseddoc = '发布了';
-$lang->action->label->collected = '收藏了';
-$lang->action->label->uncollected = '取消收藏了';
+$lang->action->label = new stdclass();
+$lang->action->label->install = '安装了';
+$lang->action->label->uninstall = '删除了';
+$lang->action->label->upgrade = '升级了';
+$lang->action->label->start = '启动了';
+$lang->action->label->stop = '关闭了';
+$lang->action->label->editname = '修改了名称';
+$lang->action->label->backup = '备份了';
+$lang->action->label->adjustmemory = '调整了内存';
+$lang->action->label->enableldap = '启用了LDAP';
+$lang->action->label->disableldap = '禁用了LDAP';
+$lang->action->label->enablesmtp = '启用了SMTP';
+$lang->action->label->disablesmtp = '禁用了SMTP';
+$lang->action->label->tosenior = '升级了高级版';
+$lang->action->label->saveautobackupsettings = '开启了自动备份';
+$lang->action->label->closeautobackupsettings = '关闭了自动备份';
+$lang->action->label->autobackup = '系统执行了自动备份';
+$lang->action->label->autorestore = '系统执行了自动还原';
+$lang->action->label->deleteexpiredbackup = '系统删除了过期的自动备份';
+$lang->action->label->revert = '还原了';
+$lang->action->label->created = '创建了';
+$lang->action->label->opened = '创建了';
+$lang->action->label->openedbysystem = '系统创建了';
+$lang->action->label->closedbysystem = '系统关闭了';
+$lang->action->label->added = '添加了';
+$lang->action->label->changed = '变更了';
+$lang->action->label->edited = '编辑了';
+$lang->action->label->assigned = '指派了';
+$lang->action->label->closed = '关闭了';
+$lang->action->label->deleted = '删除了';
+$lang->action->label->deletedfile = '删除了附件';
+$lang->action->label->editfile = '编辑了附件';
+$lang->action->label->erased = '删除了';
+$lang->action->label->undeleted = '还原了';
+$lang->action->label->hidden = '隐藏了';
+$lang->action->label->commented = '评论了';
+$lang->action->label->communicated = '沟通了';
+$lang->action->label->activated = '激活了';
+$lang->action->label->blocked = '阻塞了';
+$lang->action->label->resolved = '解决了';
+$lang->action->label->reviewed = '评审了';
+$lang->action->label->recalled = '撤销了评审';
+$lang->action->label->recalledchange = '撤销了变更';
+$lang->action->label->moved = '移动了';
+$lang->action->label->confirmed = "确认了{$lang->SRCommon}";
+$lang->action->label->bugconfirmed = '确认了';
+$lang->action->label->tostory = "转了{$lang->SRCommon}";
+$lang->action->label->frombug = "转了{$lang->SRCommon}";
+$lang->action->label->fromlib = '从用例库导入';
+$lang->action->label->totask = '转了任务';
+$lang->action->label->converttotask = '转了任务';
+$lang->action->label->svncommited = '提交了代码';
+$lang->action->label->gitcommited = '提交了代码';
+$lang->action->label->linked2plan = "关联了计划";
+$lang->action->label->unlinkedfromplan = "移除了计划";
+$lang->action->label->changestatus = '修改了状态';
+$lang->action->label->marked = '编辑了';
+$lang->action->label->linked2execution = "关联了{$lang->executionCommon}";
+$lang->action->label->unlinkedfromexecution = "移除了{$lang->executionCommon}";
+$lang->action->label->linked2kanban = '关联了看板';
+$lang->action->label->linked2project = "关联了{$lang->projectCommon}";
+$lang->action->label->unlinkedfromproject = "移除了{$lang->projectCommon}";
+$lang->action->label->unlinkedfrombuild = "移除了版本";
+$lang->action->label->linked2release = "关联了发布";
+$lang->action->label->unlinkedfromrelease = "移除了发布";
+$lang->action->label->linked2revision = "关联了代码提交";
+$lang->action->label->unlinkedfromrevision = "取消关联了代码提交";
+$lang->action->label->linkrelatedbug = "关联了相关Bug";
+$lang->action->label->unlinkrelatedbug = "移除了相关Bug";
+$lang->action->label->linkrelatedcase = "关联了相关用例";
+$lang->action->label->unlinkrelatedcase = "移除了相关用例";
+$lang->action->label->linkrelatedstory = "关联了相关{$lang->SRCommon}";
+$lang->action->label->unlinkrelatedstory = "移除了相关{$lang->SRCommon}";
+$lang->action->label->subdividestory = "细分了{$lang->SRCommon}";
+$lang->action->label->unlinkchildstory = "移除了细分{$lang->SRCommon}";
+$lang->action->label->started = '开始了';
+$lang->action->label->restarted = '继续了';
+$lang->action->label->recordestimate = '记录了工时';
+$lang->action->label->editestimate = '编辑了工时';
+$lang->action->label->canceled = '取消了';
+$lang->action->label->finished = '完成了';
+$lang->action->label->paused = '暂停了';
+$lang->action->label->verified = '验收了';
+$lang->action->label->delayed = '延期了';
+$lang->action->label->suspended = '挂起了';
+$lang->action->label->login = '登录系统';
+$lang->action->label->logout = "退出登录";
+$lang->action->label->notified = "通知了";
+$lang->action->label->deleteestimate = "删除了工时";
+$lang->action->label->linked2build = "关联了";
+$lang->action->label->linked2bug = "关联了";
+$lang->action->label->linked2testtask = "关联了";
+$lang->action->label->unlinkedfromtesttask = "移除了";
+$lang->action->label->linkchildtask = "关联了子任务";
+$lang->action->label->unlinkchildrentask = "取消关联了子任务";
+$lang->action->label->linkparenttask = "关联到了父任务";
+$lang->action->label->unlinkparenttask = "从父任务取消关联了";
+$lang->action->label->batchcreate = "批量创建了任务";
+$lang->action->label->createchildren = "创建了子任务";
+$lang->action->label->managed = "维护了";
+$lang->action->label->managedteam = "维护了";
+$lang->action->label->managedwhitelist = "维护了";
+$lang->action->label->deletechildrentask = "删除了子任务";
+$lang->action->label->createchildrenstory = "创建了子需求";
+$lang->action->label->linkchildstory = "关联了子需求";
+$lang->action->label->unlinkchildrenstory = "取消关联了子需求";
+$lang->action->label->linkparentstory = "关联到了父需求";
+$lang->action->label->unlinkparentstory = "从父需求取消关联了";
+$lang->action->label->deletechildrenstory = "删除了子需求";
+$lang->action->label->tracked = '跟踪了';
+$lang->action->label->hangup = '挂起了';
+$lang->action->label->run = '执行了';
+$lang->action->label->estimated = '估算了';
+$lang->action->label->reviewpassed = '确认通过';
+$lang->action->label->reviewrejected = '拒绝了';
+$lang->action->label->reviewclarified = '有待明确';
+$lang->action->label->reviewreverted = '撤销变更';
+$lang->action->label->commitsummary = '提交了培训总结';
+$lang->action->label->updatetrainee = '更新了培训人员';
+$lang->action->label->setdefaultbranch = '设置了默认分支';
+$lang->action->label->syncprogram = '开始了';
+$lang->action->label->syncproject = '开始了';
+$lang->action->label->syncexecution = '开始了';
+$lang->action->label->syncexecutionbychild = '开始了';
+$lang->action->label->startProgram = "(因{$lang->projectCommon}开始而启动项目集)";
+$lang->action->label->createmr = '合并请求关联了';
+$lang->action->label->deletemr = '合并请求取消了';
+$lang->action->label->mergedmr = '合并请求合并了';
+$lang->action->label->compilepass = '构建成功';
+$lang->action->label->compilefail = '构建失败';
+$lang->action->label->reopen = '重新打开了';
+$lang->action->label->approve = '通过了';
+$lang->action->label->reject = '拒绝了';
+$lang->action->label->importfromgitlab = '从Gitlab关联创建了';
+$lang->action->label->archived = '归档了';
+$lang->action->label->restore = '还原了';
+$lang->action->label->mergedbranch = '合并了分支';
+$lang->action->label->startedbychild = '开始了';
+$lang->action->label->finishedbychild = '完成了';
+$lang->action->label->closedbychild = '关闭了';
+$lang->action->label->activatedbychild = '激活了';
+$lang->action->label->createchild = '激活了';
+$lang->action->label->executed = '执行了';
+$lang->action->label->importedcard = '导入了';
+$lang->action->label->importedproductplan = '导入了';
+$lang->action->label->importedrelease = '导入了';
+$lang->action->label->importedexecution = '导入了';
+$lang->action->label->importedbuild = '导入了';
+$lang->action->label->importedticket = '导入了';
+$lang->action->label->fromsonarqube = '由SonarQube问题创建了';
+$lang->action->label->bind = '绑定了';
+$lang->action->label->unbind = '取消绑定了';
+$lang->action->label->linkstory = '关联需求到了';
+$lang->action->label->linkbug = '关联BUG到了';
+$lang->action->label->unlinkstory = '移除了需求从';
+$lang->action->label->unlinkbug = '移除了BUG从';
+$lang->action->label->tolib = '导入了';
+$lang->action->label->updatetolib = '更新了';
+$lang->action->label->ganttmove = '排序了';
+$lang->action->label->submitreview = '提交了评审';
+$lang->action->label->suspend = '休眠了';
+$lang->action->label->resume = '恢复了';
+$lang->action->label->reboot = '重启了';
+$lang->action->label->boot = '启动了';
+$lang->action->label->destroy = '关闭了';
+$lang->action->label->getvnc = '远程操控了';
+$lang->action->label->synctwins = '同步修改了';
+$lang->action->label->relieved = '解除了';
+$lang->action->label->switchtolight = '从全生命周期管理模式切换为轻量管理模式';
+$lang->action->label->linkedrepo = '关联代码库到';
+$lang->action->label->unlinkedrepo = "取消了{$lang->projectCommon}与代码库的关联";
+$lang->action->label->unlinkproduct = "取消了与{$lang->productCommon}的关联";
+$lang->action->label->createdsnapshot = '创建了快照';
+$lang->action->label->restoredsnapshot = '还原了快照';
+$lang->action->label->editsnapshot = '编辑了快照';
+$lang->action->label->deletesnapshot = '编辑了快照';
+$lang->action->label->saveddraft = '存为草稿';
+$lang->action->label->releaseddoc = '发布了';
+$lang->action->label->collected = '收藏了';
+$lang->action->label->uncollected = '取消收藏了';
+$lang->action->label->online = '上架了';
+$lang->action->label->offline = '下架了';
+$lang->action->label->linkhost = '主机关联到';
/* 动态信息按照对象分组 */
$lang->action->dynamicAction = new stdclass();
@@ -785,6 +830,10 @@ $lang->action->label->stage = '瀑布模型的阶段|stage|browse|';
$lang->action->label->module = '模块|tree|browse|productid=%s&type=story¤tModuleID=0&branch=all';
$lang->action->label->ticket = '工单|ticket|view|id=%s';
$lang->action->label->chartgroup = '分组';
+$lang->action->label->serverroom = '机房|serverroom|browse|';
+$lang->action->label->host = '主机|host|view|id=%s';
+$lang->action->label->account = "账号|account|view|id=%s";
+$lang->action->label->instance = '应用|instance|view|id=%s';
/* Object type. */
$lang->action->search = new stdclass();
diff --git a/module/action/lang/zh-tw.php b/module/action/lang/zh-tw.php
index 717dc3fd9e..e65b5abbd2 100755
--- a/module/action/lang/zh-tw.php
+++ b/module/action/lang/zh-tw.php
@@ -216,121 +216,168 @@ $lang->action->desc->deletechildrenstory = '$date, 由 $actor
/* 關聯用例和移除用例時的歷史操作記錄。*/
$lang->action->desc->linkrelatedcase = '$date, 由 $actor 關聯相關用例 $extra。' . "\n";
$lang->action->desc->unlinkrelatedcase = '$date, 由 $actor 移除相關用例 $extra。' . "\n";
+$lang->action->desc->online = '$date, 由 $actor 上架。' . "\n";
+$lang->action->desc->offline = '$date, 由 $actor 下架。' . "\n";
+$lang->action->desc->linkhost = '$date, 由 $actor 关联主机。' . "\n";
+
+/* 用来描述应用的历史操作记录。*/
+$lang->action->desc->install = '$date, 由 $actor 安装。' . "\n";
+$lang->action->desc->uninstall = '$date, 由 $actor 删除。' . "\n";
+$lang->action->desc->start = '$date, 由 $actor 启动。' . "\n";
+$lang->action->desc->stop = '$date, 由 $actor 关闭。' . "\n";
+$lang->action->desc->editname = '$date, 由 $actor 修改了名称,从 $oldName 修改为 $newName 。' . "\n";
+$lang->action->desc->upgrade = '$date, 由 $actor 升级,从 $oldVersion 升级为 $newVersion 。' . "\n";
+$lang->action->desc->backup = '$date, 由 $actor 备份。' . "\n";
+$lang->action->desc->adjustmemory = '$date, 由 $actor 调整内存到 $newMemory 。' . "\n";
+$lang->action->desc->enableldap = '$date, 由 $actor 启用了LDAP。' . "\n";
+$lang->action->desc->disableldap = '$date, 由 $actor 禁用了LDAP。' . "\n";
+$lang->action->desc->enablesmtp = '$date, 由 $actor 启用了SMTP。' . "\n";
+$lang->action->desc->disablesmtp = '$date, 由 $actor 禁用了SMTP。' . "\n";
+$lang->action->desc->updatecustom = '$date, 由 $actor 修改了自定义配置。' . "\n";
+$lang->action->desc->tosenior = '$date, 由 $actor 升级服务到高级版,从 $oldAppName 升级到 $newAppName 。' . "\n";
+$lang->action->desc->saveautobackupsettings = '$date, 由 $actor 修改了自动备份设置:开启自动备份。' . "\n";
+$lang->action->desc->closeautobackupsettings = '$date, 由 $actor 修改了自动备份设置:自动备份已关闭。' . "\n";
+$lang->action->desc->saveautorestoresettings = '$date, 由 $actor 修改了自动还原设置。' . "\n";
+$lang->action->desc->autobackup = '$date, 系统执行了自动备份。' . "\n";
+$lang->action->desc->autorestore = '$date, 系统执行了自动还原。' . "\n";
+$lang->action->desc->deleteexpiredbackup = '$date, 系统删除了过期的自动备份。' . "\n";
/* 用來顯示動態信息。*/
-$lang->action->label = new stdclass();
-$lang->action->label->created = '創建';
-$lang->action->label->opened = '創建';
-$lang->action->label->openedbysystem = '系統創建';
-$lang->action->label->closedbysystem = '系統關閉';
-$lang->action->label->added = '添加';
-$lang->action->label->changed = '變更了';
-$lang->action->label->edited = '編輯了';
-$lang->action->label->assigned = '指派了';
-$lang->action->label->closed = '關閉了';
-$lang->action->label->deleted = '刪除了';
-$lang->action->label->deletedfile = '刪除附件';
-$lang->action->label->editfile = '編輯附件';
-$lang->action->label->erased = '刪除了';
-$lang->action->label->undeleted = '還原了';
-$lang->action->label->hidden = '隱藏了';
-$lang->action->label->commented = '評論了';
-$lang->action->label->communicated = '溝通了';
-$lang->action->label->activated = '激活了';
-$lang->action->label->blocked = '阻塞了';
-$lang->action->label->resolved = '解決了';
-$lang->action->label->reviewed = '評審了';
-$lang->action->label->recalled = '撤銷評審';
-$lang->action->label->moved = '移動了';
-$lang->action->label->confirmed = "確認了{$lang->SRCommon}";
-$lang->action->label->bugconfirmed = '確認了';
-$lang->action->label->tostory = "轉{$lang->SRCommon}";
-$lang->action->label->frombug = "轉{$lang->SRCommon}";
-$lang->action->label->fromlib = '從用例庫導入';
-$lang->action->label->totask = '轉任務';
-$lang->action->label->svncommited = '提交代碼';
-$lang->action->label->gitcommited = '提交代碼';
-$lang->action->label->linked2plan = "關聯計劃";
-$lang->action->label->unlinkedfromplan = "移除計劃";
-$lang->action->label->changestatus = '修改狀態';
-$lang->action->label->marked = '編輯了';
-$lang->action->label->linked2execution = "關聯{$lang->executionCommon}";
-$lang->action->label->unlinkedfromexecution = "移除{$lang->executionCommon}";
-$lang->action->label->linked2project = "關聯項目";
-$lang->action->label->unlinkedfromproject = "移除項目";
-$lang->action->label->unlinkedfrombuild = "移除版本";
-$lang->action->label->linked2release = "關聯發佈";
-$lang->action->label->unlinkedfromrelease = "移除發佈";
-$lang->action->label->linkrelatedbug = "關聯了相關Bug";
-$lang->action->label->unlinkrelatedbug = "移除了相關Bug";
-$lang->action->label->linkrelatedcase = "關聯了相關用例";
-$lang->action->label->unlinkrelatedcase = "移除了相關用例";
-$lang->action->label->linkrelatedstory = "關聯了相關{$lang->SRCommon}";
-$lang->action->label->unlinkrelatedstory = "移除了相關{$lang->SRCommon}";
-$lang->action->label->subdividestory = "細分了{$lang->SRCommon}";
-$lang->action->label->unlinkchildstory = "移除了細分{$lang->SRCommon}";
-$lang->action->label->started = '開始了';
-$lang->action->label->restarted = '繼續了';
-$lang->action->label->recordestimate = '記錄了工時';
-$lang->action->label->editestimate = '編輯了工時';
-$lang->action->label->canceled = '取消了';
-$lang->action->label->finished = '完成了';
-$lang->action->label->paused = '暫停了';
-$lang->action->label->verified = '驗收了';
-$lang->action->label->delayed = '延期';
-$lang->action->label->suspended = '掛起';
-$lang->action->label->login = '登錄系統';
-$lang->action->label->logout = "退出登錄";
-$lang->action->label->notified = "通知了";
-$lang->action->label->deleteestimate = "刪除了工時";
-$lang->action->label->linked2build = "關聯了";
-$lang->action->label->linked2bug = "關聯了";
-$lang->action->label->linked2testtask = "關聯了";
-$lang->action->label->unlinkedfromtesttask = "移除了";
-$lang->action->label->linkchildtask = "關聯子任務";
-$lang->action->label->unlinkchildrentask = "取消關聯子任務";
-$lang->action->label->linkparenttask = "關聯到父任務";
-$lang->action->label->unlinkparenttask = "從父任務取消關聯";
-$lang->action->label->batchcreate = "批量創建任務";
-$lang->action->label->createchildren = "創建子任務";
-$lang->action->label->managed = "維護";
-$lang->action->label->managedteam = "維護了";
-$lang->action->label->managedwhitelist = "維護了";
-$lang->action->label->deletechildrentask = "刪除子任務";
-$lang->action->label->createchildrenstory = "創建子需求";
-$lang->action->label->linkchildstory = "關聯子需求";
-$lang->action->label->unlinkchildrenstory = "取消關聯子需求";
-$lang->action->label->linkparentstory = "關聯到父需求";
-$lang->action->label->unlinkparentstory = "從父需求取消關聯";
-$lang->action->label->deletechildrenstory = "刪除子需求";
-$lang->action->label->tracked = '跟蹤了';
-$lang->action->label->hangup = '掛起了';
-$lang->action->label->run = '執行了';
-$lang->action->label->estimated = '估算了';
-$lang->action->label->reviewpassed = '確認通過';
-$lang->action->label->reviewrejected = '拒絶';
-$lang->action->label->reviewclarified = '有待明確';
-$lang->action->label->commitsummary = '提交培訓總結';
-$lang->action->label->updatetrainee = '更新培訓人員';
-$lang->action->label->setdefaultbranch = '設置了預設分支';
-$lang->action->label->syncprogram = '開始了';
-$lang->action->label->syncproject = '開始了';
-$lang->action->label->syncexecution = '開始了';
-$lang->action->label->startProgram = '(因項目開始而啟動項目集)';
-$lang->action->label->createmr = '合併請求關聯了';
-$lang->action->label->deletemr = '合併請求取消了';
-$lang->action->label->mergedmr = '合併請求合併了';
-$lang->action->label->compilepass = '構建成功';
-$lang->action->label->compilefail = '構建失敗';
-$lang->action->label->reopen = '重新打開';
-$lang->action->label->approve = '通過了';
-$lang->action->label->reject = '拒絶了';
-$lang->action->label->importfromgitlab = '從Gitlab關聯創建了';
-$lang->action->label->archived = '歸檔了';
-$lang->action->label->restore = '還原了';
-$lang->action->label->mergedbranch = '合併分支';
-$lang->action->label->linkedrepo = '關聯代碼庫到';
-$lang->action->label->unlinkedrepo = '取消了項目与代碼庫的關聯';
+$lang->action->label = new stdclass();
+$lang->action->label->install = '安装了';
+$lang->action->label->uninstall = '删除了';
+$lang->action->label->upgrade = '升级了';
+$lang->action->label->start = '启动了';
+$lang->action->label->stop = '关闭了';
+$lang->action->label->editname = '修改了名称';
+$lang->action->label->backup = '备份了';
+$lang->action->label->adjustmemory = '调整了内存';
+$lang->action->label->enableldap = '启用了LDAP';
+$lang->action->label->disableldap = '禁用了LDAP';
+$lang->action->label->enablesmtp = '启用了SMTP';
+$lang->action->label->disablesmtp = '禁用了SMTP';
+$lang->action->label->tosenior = '升级了高级版';
+$lang->action->label->saveautobackupsettings = '开启了自动备份';
+$lang->action->label->closeautobackupsettings = '关闭了自动备份';
+$lang->action->label->autobackup = '系统执行了自动备份';
+$lang->action->label->autorestore = '系统执行了自动还原';
+$lang->action->label->deleteexpiredbackup = '系统删除了过期的自动备份';
+$lang->action->label->revert = '还原了';
+$lang->action->label->created = '創建';
+$lang->action->label->opened = '創建';
+$lang->action->label->openedbysystem = '系統創建';
+$lang->action->label->closedbysystem = '系統關閉';
+$lang->action->label->added = '添加';
+$lang->action->label->changed = '變更了';
+$lang->action->label->edited = '編輯了';
+$lang->action->label->assigned = '指派了';
+$lang->action->label->closed = '關閉了';
+$lang->action->label->deleted = '刪除了';
+$lang->action->label->deletedfile = '刪除附件';
+$lang->action->label->editfile = '編輯附件';
+$lang->action->label->erased = '刪除了';
+$lang->action->label->undeleted = '還原了';
+$lang->action->label->hidden = '隱藏了';
+$lang->action->label->commented = '評論了';
+$lang->action->label->communicated = '溝通了';
+$lang->action->label->activated = '激活了';
+$lang->action->label->blocked = '阻塞了';
+$lang->action->label->resolved = '解決了';
+$lang->action->label->reviewed = '評審了';
+$lang->action->label->recalled = '撤銷評審';
+$lang->action->label->moved = '移動了';
+$lang->action->label->confirmed = "確認了{$lang->SRCommon}";
+$lang->action->label->bugconfirmed = '確認了';
+$lang->action->label->tostory = "轉{$lang->SRCommon}";
+$lang->action->label->frombug = "轉{$lang->SRCommon}";
+$lang->action->label->fromlib = '從用例庫導入';
+$lang->action->label->totask = '轉任務';
+$lang->action->label->svncommited = '提交代碼';
+$lang->action->label->gitcommited = '提交代碼';
+$lang->action->label->linked2plan = "關聯計劃";
+$lang->action->label->unlinkedfromplan = "移除計劃";
+$lang->action->label->changestatus = '修改狀態';
+$lang->action->label->marked = '編輯了';
+$lang->action->label->linked2execution = "關聯{$lang->executionCommon}";
+$lang->action->label->unlinkedfromexecution = "移除{$lang->executionCommon}";
+$lang->action->label->linked2project = "關聯項目";
+$lang->action->label->unlinkedfromproject = "移除項目";
+$lang->action->label->unlinkedfrombuild = "移除版本";
+$lang->action->label->linked2release = "關聯發佈";
+$lang->action->label->unlinkedfromrelease = "移除發佈";
+$lang->action->label->linkrelatedbug = "關聯了相關Bug";
+$lang->action->label->unlinkrelatedbug = "移除了相關Bug";
+$lang->action->label->linkrelatedcase = "關聯了相關用例";
+$lang->action->label->unlinkrelatedcase = "移除了相關用例";
+$lang->action->label->linkrelatedstory = "關聯了相關{$lang->SRCommon}";
+$lang->action->label->unlinkrelatedstory = "移除了相關{$lang->SRCommon}";
+$lang->action->label->subdividestory = "細分了{$lang->SRCommon}";
+$lang->action->label->unlinkchildstory = "移除了細分{$lang->SRCommon}";
+$lang->action->label->started = '開始了';
+$lang->action->label->restarted = '繼續了';
+$lang->action->label->recordestimate = '記錄了工時';
+$lang->action->label->editestimate = '編輯了工時';
+$lang->action->label->canceled = '取消了';
+$lang->action->label->finished = '完成了';
+$lang->action->label->paused = '暫停了';
+$lang->action->label->verified = '驗收了';
+$lang->action->label->delayed = '延期';
+$lang->action->label->suspended = '掛起';
+$lang->action->label->login = '登錄系統';
+$lang->action->label->logout = "退出登錄";
+$lang->action->label->notified = "通知了";
+$lang->action->label->deleteestimate = "刪除了工時";
+$lang->action->label->linked2build = "關聯了";
+$lang->action->label->linked2bug = "關聯了";
+$lang->action->label->linked2testtask = "關聯了";
+$lang->action->label->unlinkedfromtesttask = "移除了";
+$lang->action->label->linkchildtask = "關聯子任務";
+$lang->action->label->unlinkchildrentask = "取消關聯子任務";
+$lang->action->label->linkparenttask = "關聯到父任務";
+$lang->action->label->unlinkparenttask = "從父任務取消關聯";
+$lang->action->label->batchcreate = "批量創建任務";
+$lang->action->label->createchildren = "創建子任務";
+$lang->action->label->managed = "維護";
+$lang->action->label->managedteam = "維護了";
+$lang->action->label->managedwhitelist = "維護了";
+$lang->action->label->deletechildrentask = "刪除子任務";
+$lang->action->label->createchildrenstory = "創建子需求";
+$lang->action->label->linkchildstory = "關聯子需求";
+$lang->action->label->unlinkchildrenstory = "取消關聯子需求";
+$lang->action->label->linkparentstory = "關聯到父需求";
+$lang->action->label->unlinkparentstory = "從父需求取消關聯";
+$lang->action->label->deletechildrenstory = "刪除子需求";
+$lang->action->label->tracked = '跟蹤了';
+$lang->action->label->hangup = '掛起了';
+$lang->action->label->run = '執行了';
+$lang->action->label->estimated = '估算了';
+$lang->action->label->reviewpassed = '確認通過';
+$lang->action->label->reviewrejected = '拒絶';
+$lang->action->label->reviewclarified = '有待明確';
+$lang->action->label->commitsummary = '提交培訓總結';
+$lang->action->label->updatetrainee = '更新培訓人員';
+$lang->action->label->setdefaultbranch = '設置了預設分支';
+$lang->action->label->syncprogram = '開始了';
+$lang->action->label->syncproject = '開始了';
+$lang->action->label->syncexecution = '開始了';
+$lang->action->label->startProgram = '(因項目開始而啟動項目集)';
+$lang->action->label->createmr = '合併請求關聯了';
+$lang->action->label->deletemr = '合併請求取消了';
+$lang->action->label->mergedmr = '合併請求合併了';
+$lang->action->label->compilepass = '構建成功';
+$lang->action->label->compilefail = '構建失敗';
+$lang->action->label->reopen = '重新打開';
+$lang->action->label->approve = '通過了';
+$lang->action->label->reject = '拒絶了';
+$lang->action->label->importfromgitlab = '從Gitlab關聯創建了';
+$lang->action->label->archived = '歸檔了';
+$lang->action->label->restore = '還原了';
+$lang->action->label->mergedbranch = '合併分支';
+$lang->action->label->linkedrepo = '關聯代碼庫到';
+$lang->action->label->unlinkedrepo = '取消了項目与代碼庫的關聯';
+$lang->action->label->online = '上架了';
+$lang->action->label->offline = '下架了';
+$lang->action->label->linkhost = '主机关联到';
/* 動態信息按照對象分組 */
$lang->action->dynamicAction = new stdclass();
@@ -601,6 +648,9 @@ $lang->action->label->kanbancolumn = '看板列|execution|kanban|execution=%s';
$lang->action->label->kanbanlane = '看板泳道|execution|kanban|execution=%s&type=all';
$lang->action->label->kanbancard = '看板卡片|kanban|view|kanbanID=%s';
$lang->action->label->mr = '合併請求|mr|view|id=%s';
+$lang->action->label->serverroom = '机房|serverroom|browse|';
+$lang->action->label->host = '主机|host|view|id=%s';
+$lang->action->label->account = "账号|account|view|id=%s";
/* Object type. */
$lang->action->search = new stdclass();
diff --git a/module/gitlab/model.php b/module/gitlab/model.php
index 9005fb7141..2f3176766c 100644
--- a/module/gitlab/model.php
+++ b/module/gitlab/model.php
@@ -405,6 +405,9 @@ class gitlabModel extends model
$scm = $this->app->loadClass('scm');
$scm->setEngine($repo);
$comments = $scm->engine->getCommitsByPath($entry, '', '', isset($pager->recPerPage) ? $pager->recPerPage : 10, isset($pager->pageID) ? $pager->pageID : 1);
+ if(empty($comments)) $comments = array();
+
+ if(isset($pager->recTotal)) $pager->recTotal = count($comments) < $pager->recPerPage ? $pager->recPerPage * $pager->pageID : $pager->recPerPage * ($pager->pageID + 1);
$designNames = $this->dao->select("commit, name")->from(TABLE_DESIGN)->where('deleted')->eq(0)->fetchPairs();
$designIds = $this->dao->select("commit, id")->from(TABLE_DESIGN)->where('deleted')->eq(0)->fetchPairs();
@@ -426,17 +429,6 @@ class gitlabModel extends model
return $comments;
}
- /**
- * Create a gitlab.
- *
- * @access public
- * @return bool
- */
- public function create()
- {
- return $this->loadModel('pipeline')->create('gitlab');
- }
-
/**
* Update a gitlab.
*
@@ -502,7 +494,7 @@ class gitlabModel extends model
$gitlab = $this->loadModel('gitlab')->getByID($gitlabID);
if(!$gitlab) return '';
$url = rtrim($gitlab->url, '/') . "/api/v4/todos?project_id=$projectID&type=MergeRequest&state=pending&private_token={$gitlab->token}&sudo={$sudo}";
- return json_decode(commonModel::http($url, $data = null, $options = array(), $headers = array(), $dataType = 'data', $method = 'POST', $timeout = 30, $httpCode = false, $log = false));
+ return json_decode(commonModel::http($url, $data = null, $optionsi = array(), $headers = array(), $dataType = 'data', $method = 'POST', $timeout = 30, $httpCode = false, $log = false));
}
/**
@@ -545,7 +537,7 @@ class gitlabModel extends model
{
/* Also use `per_page=20` to fetch users in API. Fetch active users only. */
$url = sprintf($apiRoot, "/users") . "&order_by={$order}&sort={$sort}&page={$page}&per_page={$perPage}&active=true";
- $httpData = commonModel::httpWithHeader($url);
+ $httpData = commonModel::http($url, null, array(), array(), 'data', 'GET', 30, true, false);
$result = json_decode($httpData['body']);
if(!empty($result))
{
@@ -715,7 +707,7 @@ class gitlabModel extends model
$order = explode('_', $orderBy);
$keyword = urlencode($keyword);
- $result = commonModel::httpWithHeader($url . "&per_page={$pager->recPerPage}&order_by={$order[0]}&sort={$order[1]}&page={$pager->pageID}&search={$keyword}&search_namespaces=true");
+ $result = commonModel::http($url . "&per_page={$pager->recPerPage}&order_by={$order[0]}&sort={$order[1]}&page={$pager->pageID}&search={$keyword}&search_namespaces=true", null, array(), array(), 'data', 'GET', 30, true, false);
$header = $result['header'];
$recTotal = $header['X-Total'];
@@ -749,7 +741,7 @@ class gitlabModel extends model
$allResults = array();
for($page = 1; true; $page++)
{
- $results = json_decode(commonModel::http($url . "&simple={$simple}&page={$page}&per_page=100", $data = null, $options = array(), $headers = array(), $dataType = 'data', $method = 'POST', $timeout = 30, $httpCode = false, $log = false));
+ $results = json_decode(commonModel::http($url . "&simple={$simple}&page={$page}&per_page=100", $data = null, $optionsi = array(), $headers = array(), $dataType = 'data', $method = 'POST', $timeout = 30, $httpCode = false, $log = false));
if(!is_array($results)) break;
if(!empty($results)) $allResults = array_merge($allResults, $results);
if(count($results) < 100) break;
@@ -1031,7 +1023,7 @@ class gitlabModel extends model
if(isset($this->projects[$gitlabID][$projectID])) return $this->projects[$gitlabID][$projectID];
$url = sprintf($this->getApiRoot($gitlabID, $useUser), "/projects/$projectID");
- $this->projects[$gitlabID][$projectID] = json_decode(commonModel::http($url, $data = null, $options = array(), $headers = array(), $dataType = 'data', $method = 'POST', $timeout = 30, $httpCode = false, $log = false));
+ $this->projects[$gitlabID][$projectID] = json_decode(commonModel::http($url, $data = null, $optionsi = array(), $headers = array(), $dataType = 'data', $method = 'POST', $timeout = 30, $httpCode = false, $log = false));
return $this->projects[$gitlabID][$projectID];
}
@@ -1050,10 +1042,10 @@ class gitlabModel extends model
$requests[$id]['url'] = sprintf($this->getApiRoot($repo->serviceHost, false), "/projects/{$repo->serviceProject}");
}
$this->app->loadClass('requests', true);
- $results = requests::request_multiple($requests);
+ $results = requests::request_multiple($requests, array('timeout' => 2));
foreach($results as $id => $result)
{
- if(!empty($result->body) and substr($result->body, 0, 1) == '{') $this->projects[$repos[$id]->serviceHost][$repos[$id]->serviceProject] = json_decode($result->body);
+ $this->projects[$repos[$id]->serviceHost][$repos[$id]->serviceProject] = (!empty($result->body) and substr($result->body, 0, 1) == '{') ? json_decode($result->body) : '';
}
}
@@ -1288,6 +1280,7 @@ class gitlabModel extends model
$hookList = $this->apiGetHooks($repo->gitService, $repo->project);
foreach($hookList as $hook)
{
+ if(empty($hook->url)) continue;
if($hook->url == $url) return true;
}
return false;
@@ -1639,7 +1632,7 @@ class gitlabModel extends model
{
$apiRoot .= "&per_page={$pager->recPerPage}&page={$pager->pageID}";
$url = sprintf($apiRoot, "/projects/{$projectID}/repository/tags");
- $result = commonModel::httpWithHeader($url);
+ $result = commonModel::http($url, null, array(), array(), 'data', 'GET', 30, true, false);
$header = $result['header'];
$pager->setRecTotal($header['X-Total']);
@@ -2899,8 +2892,8 @@ class gitlabModel extends model
{
$apiRoot = rtrim($url, '/') . '/api/v4%s' . "?private_token={$token}";
$url = sprintf($apiRoot, "/users") . "&per_page=5&active=true";
- $httpData = commonModel::httpWithHeader($url);
- $users = json_decode($httpData['body']);
+ $response = commonModel::http($url);
+ $users = json_decode($response);
if(empty($users)) return false;
if(isset($users->message) or isset($users->error)) return null;
@@ -2962,4 +2955,25 @@ class gitlabModel extends model
$url = sprintf($apiRoot, "/projects/$projectID/pipelines") . "&ref=$branch";
return json_decode(commonModel::http($url));
}
+
+ /**
+ * 更新版本库的代码地址。
+ * Update repo code path.
+ *
+ * @param int $gitlabID
+ * @param int $projectID
+ * @param int $repoID
+ * @access public
+ * @return bool
+ */
+ public function updateCodePath(int $gitlabID, int $projectID, int $repoID): bool
+ {
+ $project = $this->apiGetSingleProject($gitlabID, $projectID);
+ if(is_object($project) and !empty($project->web_url))
+ {
+ return $this->dao->update(TABLE_REPO)->set('path')->eq($project->web_url)->where('id')->eq($repoID)->exec();
+ }
+
+ return false;
+ }
}
diff --git a/module/repo/model.php b/module/repo/model.php
index 1de9352b21..ad1319e317 100644
--- a/module/repo/model.php
+++ b/module/repo/model.php
@@ -2465,6 +2465,7 @@ class repoModel extends model
$paths = array();
$files = $scm->engine->tree($path, 0);
+ if(empty($files)) $files = array();
foreach($files as $file)
{
$paths[] = $file->path;
diff --git a/module/repo/ui/create.html.php b/module/repo/ui/create.html.php
index e3317f14a0..af07939ae5 100644
--- a/module/repo/ui/create.html.php
+++ b/module/repo/ui/create.html.php
@@ -83,6 +83,7 @@ formPanel
set::name("serviceProject"),
set::label($lang->repo->serviceProject),
set::required(true),
+ set::items(array()),
set::control("picker"),
),
),
diff --git a/module/user/lang/de.php b/module/user/lang/de.php
index f27713ce8e..d5dfc33567 100644
--- a/module/user/lang/de.php
+++ b/module/user/lang/de.php
@@ -82,6 +82,9 @@ $lang->user->submit = 'Submit';
$lang->user->resetPWD = 'Reset Password';
$lang->user->resetTitle = 'Admin reset the password';
+$lang->user->abbr = new stdclass();
+$lang->user->abbr->id = 'ID';
+
$lang->user->legendBasic = 'Basic Information';
$lang->user->legendContribution = 'Contribution';
diff --git a/module/user/lang/en.php b/module/user/lang/en.php
index 4715fc972f..1482db8357 100644
--- a/module/user/lang/en.php
+++ b/module/user/lang/en.php
@@ -82,6 +82,9 @@ $lang->user->submit = 'Submit';
$lang->user->resetPWD = 'Reset Password';
$lang->user->resetTitle = 'Admin reset the password';
+$lang->user->abbr = new stdclass();
+$lang->user->abbr->id = 'ID';
+
$lang->user->legendBasic = 'Basic Information';
$lang->user->legendContribution = 'Contribution';
diff --git a/module/user/lang/fr.php b/module/user/lang/fr.php
index 606d9d3426..a77e650095 100644
--- a/module/user/lang/fr.php
+++ b/module/user/lang/fr.php
@@ -82,6 +82,9 @@ $lang->user->submit = 'Submit';
$lang->user->resetPWD = 'Reset Password';
$lang->user->resetTitle = 'Admin reset the password';
+$lang->user->abbr = new stdclass();
+$lang->user->abbr->id = 'ID';
+
$lang->user->legendBasic = 'Informations de Base';
$lang->user->legendContribution = 'Contribution';
diff --git a/module/user/lang/vi.php b/module/user/lang/vi.php
index 81531a3b69..406bdf20cf 100644
--- a/module/user/lang/vi.php
+++ b/module/user/lang/vi.php
@@ -60,6 +60,9 @@ $lang->user->cropAvatar = 'Crop Avatar';
$lang->user->cropAvatarTip = 'Drag and drop the box to select the image clipping range.';
$lang->user->cropImageTip = 'The image used is too small, the recommended image size is at least 48x48, the current image size is %s';
+$lang->user->abbr = new stdclass();
+$lang->user->abbr->id = 'ID';
+
$lang->user->legendBasic = 'Thông tin cơ bản';
$lang->user->legendContribution = 'Đóng góp';
diff --git a/module/user/lang/zh-cn.php b/module/user/lang/zh-cn.php
index 6fd1d4d8d0..6f0fea362f 100644
--- a/module/user/lang/zh-cn.php
+++ b/module/user/lang/zh-cn.php
@@ -82,6 +82,9 @@ $lang->user->submit = '提交';
$lang->user->resetPWD = '重置密码';
$lang->user->resetTitle = '系统管理员重置密码';
+$lang->user->abbr = new stdclass();
+$lang->user->abbr->id = '序号';
+
$lang->user->legendBasic = '基本资料';
$lang->user->legendContribution = '个人贡献';
diff --git a/module/user/lang/zh-tw.php b/module/user/lang/zh-tw.php
index 7f8b54474f..73f2305f35 100644
--- a/module/user/lang/zh-tw.php
+++ b/module/user/lang/zh-tw.php
@@ -73,6 +73,9 @@ $lang->user->projects = '項目';
$lang->user->sprints = $lang->execution->common;
$lang->user->identity = '身份';
+$lang->user->abbr = new stdclass();
+$lang->user->abbr->id = '序号';
+
$lang->user->legendBasic = '基本資料';
$lang->user->legendContribution = '個人貢獻';