mirror of
https://github.com/Combodo/iTop.git
synced 2026-08-18 03:38:20 +02:00
Compare commits
11 Commits
3.3.0-beta
...
issue/9937
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a6378b85c | ||
|
|
23e4ce7263 | ||
|
|
f657308137 | ||
|
|
64394099f7 | ||
|
|
c7570d62c1 | ||
|
|
fa66a09104 | ||
|
|
476ec75a2e | ||
|
|
42007ffd95 | ||
|
|
d88687527e | ||
|
|
73ede13443 | ||
|
|
5715e0484f |
@@ -106,6 +106,9 @@ gitGraph
|
||||
commit id: "2025-09-25" tag: "2.7.13"
|
||||
checkout support/3.2
|
||||
commit id: "2026-04-27 " tag: "3.2.3"
|
||||
checkout support/3.2.3
|
||||
commit id: "2026-05-25 " tag: "3.2.3-1"
|
||||
commit id: "2026-07-17 " tag: "3.2.3-2"
|
||||
```
|
||||
|
||||
To learn more, check the [iTop community versions history on the official wiki](https://www.itophub.io/wiki/page?id=latest:release:start).
|
||||
|
||||
@@ -897,6 +897,60 @@ abstract class AttributeDefinition
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the size of $value, expressed in the same unit as {@see static::GetMaxSize()} for this attribute class.
|
||||
*
|
||||
* Default unit is a number of **characters**, matching MySQL VARCHAR(M) semantics for VARCHAR-based attributes.
|
||||
* Byte-based attributes (e.g. {@see AttributeText}, stored as MySQL TEXT which is limited to 65535 **bytes**,
|
||||
* not characters) MUST override both this method and {@see TrimValue()} consistently.
|
||||
*
|
||||
* @param string|null $sValue
|
||||
*
|
||||
* @return int Size of $value in the unit of GetMaxSize() (characters by default)
|
||||
* @since 3.2.3-2 3.2.4 3.3.0 N°9759
|
||||
*/
|
||||
public function GetSize(?string $sValue)
|
||||
{
|
||||
// If the value is null, we return 0
|
||||
if ($sValue === null) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return mb_strlen($sValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to set a value that fits the attribute max size
|
||||
*
|
||||
* Truncation is performed in the same unit as GetMaxSize() / {@see GetSize()}: a number of **characters**
|
||||
* by default (VARCHAR-based attributes). When truncated, a " -truncated (N chars)" suffix is appended and
|
||||
* the returned value (suffix included) still fits within GetMaxSize().
|
||||
*
|
||||
* Default behavior is what DBObject::SetTrim used to do, now delegated to AttributeDefinition
|
||||
*
|
||||
* @param string|null $sValue
|
||||
*
|
||||
* @return string $sValue truncated so that it fits within {@see GetMaxSize()}.
|
||||
* @since 3.2.3-2 3.2.4 3.3.0 N°9759
|
||||
*/
|
||||
public function TrimValue(?string $sValue)
|
||||
{
|
||||
// If the value is null, we return an empty string
|
||||
if ($sValue === null) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$iMaxSize = $this->GetMaxSize();
|
||||
$iLength = mb_strlen($sValue);
|
||||
if ($iMaxSize && ($iLength > $iMaxSize)) {
|
||||
$sMessage = " -truncated ($iLength chars)";
|
||||
|
||||
return mb_substr($sValue, 0, $iMaxSize - mb_strlen($sMessage)).$sMessage;
|
||||
}
|
||||
|
||||
return $sValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed|null
|
||||
* @deprecated never used
|
||||
@@ -4219,6 +4273,51 @@ class AttributeText extends AttributeString
|
||||
return "TEXT".CMDBSource::GetSqlStringColumnDefinition();
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*
|
||||
* Unlike the default implementation, the size is expressed in **bytes**: MySQL TEXT columns are limited
|
||||
* in bytes (65535), not in characters, and {@see static::GetMaxSize()} for this class returns a number of bytes.
|
||||
*/
|
||||
public function GetSize(?string $sValue)
|
||||
{
|
||||
// If the value is null, we return 0
|
||||
if ($sValue === null) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return strlen($sValue);
|
||||
}
|
||||
/**
|
||||
* @inheritDoc
|
||||
*
|
||||
* Truncation is performed on a **byte** budget (MySQL TEXT limit) without ever cutting through a multibyte
|
||||
* UTF-8 sequence: the returned value is always valid UTF-8 and never exceeds GetMaxSize() bytes,
|
||||
* truncation suffix included.
|
||||
*/
|
||||
public function TrimValue(?string $sValue)
|
||||
{
|
||||
// If the value is null, we return an empty string
|
||||
if ($sValue === null) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$iMaxSize = $this->GetMaxSize();
|
||||
$iLength = strlen($sValue);
|
||||
$iLengthChar = mb_strlen($sValue);
|
||||
if ($iMaxSize && ($iLength > $iMaxSize)) {
|
||||
$sMessage = " -truncated ($iLengthChar chars)";
|
||||
$iTruncatedValueMaxSize = $iMaxSize - strlen($sMessage);
|
||||
// mb_strcut cuts on a byte budget but moves the cut point back to a character boundary,
|
||||
// so it never returns a broken multibyte sequence at the end of the value
|
||||
$sTruncatedValue = mb_strcut($sValue, 0, $iTruncatedValueMaxSize, 'UTF-8');
|
||||
|
||||
return $sTruncatedValue.$sMessage;
|
||||
}
|
||||
|
||||
return $sValue;
|
||||
}
|
||||
|
||||
public function GetSQLColumns($bFullSpec = false)
|
||||
{
|
||||
$aColumns = [];
|
||||
|
||||
@@ -732,13 +732,8 @@ abstract class DBObject implements iDisplay
|
||||
public function SetTrim($sAttCode, $sValue)
|
||||
{
|
||||
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
|
||||
$iMaxSize = $oAttDef->GetMaxSize();
|
||||
$sLength = mb_strlen($sValue);
|
||||
if ($iMaxSize && ($sLength > $iMaxSize)) {
|
||||
$sMessage = " -truncated ($sLength chars)";
|
||||
$sValue = mb_substr($sValue, 0, $iMaxSize - mb_strlen($sMessage)).$sMessage;
|
||||
}
|
||||
$this->Set($sAttCode, $sValue);
|
||||
|
||||
$this->Set($sAttCode, $oAttDef->TrimValue($sValue));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2040,7 +2035,7 @@ abstract class DBObject implements iDisplay
|
||||
}
|
||||
}
|
||||
if (!is_null($iMaxSize = $oAtt->GetMaxSize())) {
|
||||
$iLen = mb_strlen($toCheck);
|
||||
$iLen = $oAtt->GetSize($toCheck);
|
||||
if ($iLen > $iMaxSize) {
|
||||
return "String too long (found $iLen, limited to $iMaxSize)";
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
$ibo-user-rights--padding-x: $ibo-spacing-400 !default;
|
||||
$ibo-user-rights--padding-y: $ibo-spacing-200 !default;
|
||||
$ibo-user-rights--padding-y: $ibo-spacing-100 !default;
|
||||
$ibo-user-rights--border-radius: $ibo-border-radius-400 !default;
|
||||
|
||||
$ibo-user-rights--is-success--background-color: $ibo-color-success-100 !default;
|
||||
@@ -18,6 +18,8 @@ $ibo-user-rights--is-failure--border-color: $ibo-color-danger-500 !default;
|
||||
$ibo-user-rights--is-failure--border: 1px solid $ibo-user-rights--is-failure--border-color !default;
|
||||
|
||||
.ibo-user-rights {
|
||||
display: inline-flex;
|
||||
align-items: baseline;
|
||||
padding: $ibo-user-rights--padding-y $ibo-user-rights--padding-x;
|
||||
border-radius: $ibo-user-rights--border-radius;
|
||||
&.ibo-is-success {
|
||||
|
||||
@@ -70,7 +70,7 @@ $ibo-vendors-ckeditor--ck-mentions--item--padding-y: $ibo-spacing-200 !default;
|
||||
}
|
||||
}
|
||||
|
||||
.ck-editor__editable_inline:not(.ck-comment__input *) {
|
||||
.ck-editor__editable_inline:not(.ck-comment__input *), .ck-source-editing-area {
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
@@ -84,11 +84,6 @@ $ibo-vendors-ckeditor--ck-mentions--item--padding-y: $ibo-spacing-200 !default;
|
||||
}
|
||||
}
|
||||
|
||||
// N°7552 Allow source editing area to be scrollable in full screen
|
||||
.ck-maximize_editor_main .ck-source-editing-area textarea{
|
||||
overflow: auto !important;
|
||||
}
|
||||
|
||||
/* Mentions */
|
||||
.ck-mentions {
|
||||
.ck-button {
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -6,8 +6,9 @@
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'CAS:Error:UserNotAllowed' => '用户被禁止登录',
|
||||
'CAS:Login:SignIn' => '使用CAS登录',
|
||||
'CAS:Login:SignInTooltip' => '点击这里使用CAS服务器认证',
|
||||
'CAS:Login:SignIn' => '使用 CAS 登录',
|
||||
'CAS:Login:SignInTooltip' => '点击这里使用 CAS 服务器认证',
|
||||
]);
|
||||
|
||||
@@ -5,10 +5,8 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @author Robert Deng <denglx@gmail.com>
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
@@ -23,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -32,9 +31,11 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: UserExternal
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserExternal' => '外部用户',
|
||||
'Class:UserExternal+' => '用户在'.ITOP_APPLICATION_SHORT.'外部验证身份',
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
* @author Robert Deng <denglx@gmail.com>
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
@@ -22,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -31,13 +31,15 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: UserLDAP
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserLDAP' => 'LDAP用户',
|
||||
'Class:UserLDAP+' => '用户身份由LDAP认证',
|
||||
'UserLDAP:server' => 'LDAP详情',
|
||||
'Class:UserLDAP' => 'LDAP 用户',
|
||||
'Class:UserLDAP+' => '用户身份由 LDAP 认证',
|
||||
'UserLDAP:server' => 'LDAP 详情',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -45,6 +47,6 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
|
||||
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
|
||||
'Class:UserLDAP/Attribute:ldap_server' => 'LDAP 服务器',
|
||||
'Class:UserLDAP/Attribute:ldap_server+' => '',
|
||||
]);
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
* @author Robert Deng <denglx@gmail.com>
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
@@ -22,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -31,16 +31,19 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: UserLocal
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserLocal' => ITOP_APPLICATION_SHORT.' 用户',
|
||||
'Class:UserLocal+' => '用户由'.ITOP_APPLICATION_SHORT.'验证身份',
|
||||
'Class:UserLocal/Attribute:password' => '密码',
|
||||
'Class:UserLocal/Attribute:password+' => '用于验证用户身份的字符串',
|
||||
'Class:UserLocal/Attribute:expiration' => '密码过期',
|
||||
'Class:UserLocal/Attribute:expiration+' => '密码过期状态 (需要一个扩展才能生效)',
|
||||
|
||||
'Class:UserLocal/Attribute:expiration' => '密码过期时间',
|
||||
'Class:UserLocal/Attribute:expiration+' => '密码过期状态 (需要扩展才能生效)',
|
||||
'Class:UserLocal/Attribute:expiration/Value:can_expire' => '允许过期',
|
||||
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
|
||||
'Class:UserLocal/Attribute:expiration/Value:never_expire' => '永不过期',
|
||||
@@ -49,8 +52,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => '一次性密码',
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '用户不允许修改密码.',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => '密码更新',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => '密码更新时间',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => '上次修改密码的时间',
|
||||
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => '密码必须至少12个字符, 包含大小写, 数字和特殊字符.',
|
||||
'UserLocal:password:expiration' => '下面的区域需要插件扩展',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => '不允许用户为自己设置 "一次性密码" 的失效期限',
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'theme:darkmoon' => '暗月',
|
||||
'theme:darkmoon' => 'Dark moon',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -23,5 +23,5 @@
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'theme:fullmoon-high-contrast' => 'Fullmoon (High contrast)~~',
|
||||
'theme:fullmoon-high-contrast' => 'Fullmoon (高对比度)',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -23,5 +23,5 @@
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'theme:fullmoon-protanopia-deuteranopia' => 'Fullmoon (Protanopia & Deuteranopia)~~',
|
||||
'theme:fullmoon-protanopia-deuteranopia' => 'Fullmoon (红绿色盲 & 绿色色盲)',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -23,5 +23,5 @@
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'theme:fullmoon-tritanopia' => 'Fullmoon (Tritanopia)~~',
|
||||
'theme:fullmoon-tritanopia' => 'Fullmoon (黄蓝色盲)',
|
||||
]);
|
||||
|
||||
@@ -1,15 +1,23 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
* Copyright (C) 2013-2024 Combodo SAS
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Attachments:TabTitle_Count' => '附件 (%1$d)',
|
||||
'Attachments:EmptyTabTitle' => '附件',
|
||||
@@ -23,7 +31,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Attachment:Max_Mo' => '(最大文件尺寸: %1$s MB)',
|
||||
'Attachment:Max_Ko' => '(最大文件尺寸: %1$s KB)',
|
||||
'Attachments:NoAttachment' => '没有附件. ',
|
||||
'Attachments:PreviewNotAvailable' => '此附件类型不支持预览.',
|
||||
'Attachments:PreviewNotAvailable' => '此类型的附件不支持预览.',
|
||||
'Attachments:Error:FileTooLarge' => '上传的文件过大. %1$s',
|
||||
'Attachments:Error:UploadedFileEmpty' => '收到的文件为空, 无法添加.
|
||||
可能是因为您发送的是空文件,
|
||||
@@ -42,9 +50,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Attachment+' => '',
|
||||
'Class:Attachment/Attribute:expire' => '过期',
|
||||
'Class:Attachment/Attribute:expire+' => '',
|
||||
'Class:Attachment/Attribute:temp_id' => '临时编号',
|
||||
'Class:Attachment/Attribute:temp_id' => '临时id',
|
||||
'Class:Attachment/Attribute:temp_id+' => '',
|
||||
'Class:Attachment/Attribute:item_class' => '项目类型',
|
||||
'Class:Attachment/Attribute:item_class' => '项目类别',
|
||||
'Class:Attachment/Attribute:item_class+' => '',
|
||||
'Class:Attachment/Attribute:item_id' => '项目',
|
||||
'Class:Attachment/Attribute:item_id+' => '',
|
||||
@@ -69,11 +77,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Attachment/Attribute:creation_date' => '创建日期',
|
||||
'Class:Attachment/Attribute:creation_date+' => '~~',
|
||||
'Class:Attachment/Attribute:user_id' => '用户编号',
|
||||
'Class:Attachment/Attribute:user_id+' => '~~',
|
||||
'Class:Attachment/Attribute:contact_id' => '联系人编号',
|
||||
'Class:Attachment/Attribute:contact_id+' => '~~',
|
||||
'Class:Attachment/Attribute:creation_date+' => '',
|
||||
'Class:Attachment/Attribute:user_id' => '用户id',
|
||||
'Class:Attachment/Attribute:user_id+' => '',
|
||||
'Class:Attachment/Attribute:contact_id' => '联系人id',
|
||||
'Class:Attachment/Attribute:contact_id+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -81,6 +89,6 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:TriggerOnAttachmentDownload' => '触发器 (于对象附件下载时)',
|
||||
'Class:TriggerOnAttachmentDownload+' => '触发器于指定类型 [子类型] 对象附件下载时',
|
||||
'Class:TriggerOnAttachmentDownload' => '触发器 (对象附件被下载时)',
|
||||
'Class:TriggerOnAttachmentDownload+' => '触发器于指定类别(含子类)对象附件被下载时',
|
||||
]);
|
||||
|
||||
@@ -21,25 +21,28 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
'bkp-backup-running' => '备份正在进行, 请稍候...',
|
||||
'bkp-restore-running' => '还原正在进行, 请稍等...',
|
||||
'bkp-restore-running' => '还原正在进行, 请稍候...',
|
||||
|
||||
'Menu:BackupStatus' => '定时备份',
|
||||
'bkp-status-title' => '定时备份',
|
||||
'bkp-status-checks' => '设置与检查',
|
||||
'bkp-mysqldump-ok' => '已找到 mysqldump : %1$s',
|
||||
'bkp-mysqldump-notfound' => 'mysqldump找不到: %1$s - 请确认它安装在正确的路径, 或者调整'.ITOP_APPLICATION_SHORT.'配置文件的参数mysql_bindir.',
|
||||
'bkp-mysqldump-issue' => 'mysqldump无法运行 (retcode=%1$d): 请确认它安装在正确的路径, 或者调整'.ITOP_APPLICATION_SHORT.'配置文件的参数mysql_bindir',
|
||||
'bkp-mysqldump-ok' => 'mysqldump 已存在: %1$s',
|
||||
'bkp-mysqldump-notfound' => 'mysqldump 找不到: %1$s - 请确认它安装在正确的路径, 或者调整配置文件参数 mysql_bindir.',
|
||||
'bkp-mysqldump-issue' => 'mysqldump 无法运行 (retcode=%1$d): 请确认它安装在正确的路径, 或者调整配置文件参数 mysql_bindir',
|
||||
'bkp-missing-dir' => '目标目录<code>%1$s</code>找不到',
|
||||
'bkp-free-disk-space' => '<b>%1$s可用空间</b>位于<code>%2$s</code>',
|
||||
'bkp-dir-not-writeable' => '%1$s没有写入权限',
|
||||
'bkp-free-disk-space' => '<b>%1$s 可用空间 </b> 位于 <code>%2$s</code>',
|
||||
'bkp-dir-not-writeable' => '%1$s 没有写入权限',
|
||||
'bkp-wrong-format-spec' => '当前文件名格式错误 (%1$s). 默认格式应该是: %2$s',
|
||||
'bkp-name-sample' => '备份文件将以数据库名, 日期和时间进行命名. 例如: %1$s',
|
||||
'bkp-week-days' => '在每个<b>%1$s的%2$s</b>进行备份',
|
||||
'bkp-retention' => '最多<b>%1$d份备份文件</b>在目标目录.',
|
||||
'bkp-next-to-delete' => '当下一次备份时将被删除 (参阅设置 "retention_count")',
|
||||
'bkp-week-days' => '在每个 <b>%1$s 的 %2$s </b>进行备份',
|
||||
'bkp-retention' => '最多保留 <b>%1$d 个备份</b>.',
|
||||
'bkp-next-to-delete' => '当下一次备份时将被删除 (见设置 "保留个数")',
|
||||
'bkp-table-file' => '文件',
|
||||
'bkp-table-file+' => '只有扩展名是.zip的文件才被认为是备份文件',
|
||||
'bkp-table-file+' => '只有扩展名是.zip 的文件才被认为是备份文件',
|
||||
'bkp-table-size' => '大小',
|
||||
'bkp-table-size+' => '',
|
||||
'bkp-table-actions' => '操作',
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
use Combodo\iTop\Application\UI\Base\Component\Alert\AlertUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Button\ButtonUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\FieldSet\FieldSet;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Spinner\SpinnerUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Title\TitleUIBlockFactory;
|
||||
@@ -410,8 +409,11 @@ JS
|
||||
|
||||
$sEnvironment = addslashes(utils::GetCurrentEnvironment());
|
||||
|
||||
$oModalSpinner = SpinnerUIBlockFactory::MakeMedium(null, $sPleaseWaitBackup);
|
||||
$sModalSpinnerHtml = BlockRenderer::RenderBlockTemplates($oModalSpinner);
|
||||
$oBackupModalSpinner = SpinnerUIBlockFactory::MakeMedium(null, $sPleaseWaitBackup);
|
||||
$sBackupModalSpinnerHtml = BlockRenderer::RenderBlockTemplates($oBackupModalSpinner);
|
||||
|
||||
$oRestoreModalSpinner = SpinnerUIBlockFactory::MakeMedium(null, $sPleaseWaitRestore);
|
||||
$sRestoreModalSpinnerHtml = BlockRenderer::RenderBlockTemplates($oRestoreModalSpinner);
|
||||
|
||||
$oP->add_script(
|
||||
<<<JS
|
||||
@@ -424,7 +426,7 @@ function LaunchBackupNow()
|
||||
{
|
||||
const oModal = CombodoModal.OpenModal({
|
||||
title: '$sBackUpNow',
|
||||
content: `$sModalSpinnerHtml`
|
||||
content: `$sBackupModalSpinnerHtml`
|
||||
});
|
||||
|
||||
var oParams = {};
|
||||
@@ -450,10 +452,10 @@ function LaunchRestoreNow(sBackupFile, sConfirmationMessage)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const oModal = CombodoModal.OpenModal({
|
||||
title: '$sRestore',
|
||||
content: '<i class="ajax-spin fas fa-sync-alt fa-spin"></i> $sPleaseWaitRestore'
|
||||
content: `$sRestoreModalSpinnerHtml`
|
||||
});
|
||||
|
||||
$('#backup_success').addClass('ibo-is-hidden');
|
||||
|
||||
@@ -17,10 +17,11 @@
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
* @author Benjamin Planque <benjamin.planque@combodo.com>
|
||||
* @author Benjamin Planque <benjamin.planque@combodo.com>
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Note: The classes have been grouped by categories: bizmodel
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
@@ -31,8 +32,9 @@
|
||||
//
|
||||
// Class: lnkFunctionalCIToProviderContract
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkFunctionalCIToProviderContract' => '关联功能配置项/供应商合同',
|
||||
'Class:lnkFunctionalCIToProviderContract' => '链接 功能配置项/供应商合同',
|
||||
'Class:lnkFunctionalCIToProviderContract+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Name' => '%1$s / %2$s',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => '供应商合同',
|
||||
@@ -50,9 +52,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkFunctionalCIToService' => '关联 功能配置项/服务',
|
||||
'Class:lnkFunctionalCIToService' => '链接 功能配置项/服务',
|
||||
'Class:lnkFunctionalCIToService+' => '',
|
||||
'Class:lnkFunctionalCIToService/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkFunctionalCIToService/Name' => '%1$s / %2$s',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_id' => '服务',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_id+' => '',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_name' => '服务名称',
|
||||
@@ -80,7 +82,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Document/Attribute:contracts_list' => '合同',
|
||||
'Class:Document/Attribute:contracts_list+' => '此文档关联的所有合同',
|
||||
'Class:Document/Attribute:contracts_list+' => '此文档相关的所有合同',
|
||||
'Class:Document/Attribute:services_list' => '服务',
|
||||
'Class:Document/Attribute:services_list+' => '此文档关联的所有服务',
|
||||
'Class:Document/Attribute:services_list+' => '此文档相关的所有服务',
|
||||
]);
|
||||
|
||||
@@ -17,10 +17,11 @@
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
* @author Benjamin Planque <benjamin.planque@combodo.com>
|
||||
*/
|
||||
* @author Benjamin Planque <benjamin.planque@combodo.com>
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Note: The classes have been grouped by categories: bizmodel
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
@@ -28,11 +29,13 @@
|
||||
// Classes in 'bizmodel'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
//
|
||||
// Class: lnkFunctionalCIToTicket
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkFunctionalCIToTicket' => '关联 功能配置项/工单',
|
||||
'Class:lnkFunctionalCIToTicket' => '链接 功能配置项/工单',
|
||||
'Class:lnkFunctionalCIToTicket+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Name' => '%1$s / %2$s',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id' => '工单',
|
||||
@@ -40,7 +43,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref' => '工单编号',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_title' => '工单标题',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_title+' => '~~',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_title+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_id' => '配置项',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_id+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_name' => '配置项名称',
|
||||
@@ -50,7 +53,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:impact_code' => '影响',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:manual' => '手动添加',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:computed' => '自动添加',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:not_impacted' => '不通知',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:not_impacted' => '不受影响',
|
||||
]);
|
||||
|
||||
//
|
||||
|
||||
@@ -21,25 +21,26 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ChangeManagement' => '变更管理',
|
||||
'Menu:Change:Overview' => '概况',
|
||||
'Menu:Change:Overview+' => '',
|
||||
'Menu:NewChange' => '新建变更',
|
||||
'Menu:NewChange+' => '新建变更',
|
||||
'Menu:NewChange+' => '新建变更工单',
|
||||
'Menu:SearchChanges' => '搜索变更',
|
||||
'Menu:SearchChanges+' => '搜索变更',
|
||||
'Menu:SearchChanges+' => '搜索变更工单',
|
||||
'Menu:Change:Shortcuts' => '快捷方式',
|
||||
'Menu:Change:Shortcuts+' => '',
|
||||
'Menu:WaitingAcceptance' => '等待审核的变更',
|
||||
'Menu:WaitingAcceptance' => '等待核准的变更',
|
||||
'Menu:WaitingAcceptance+' => '',
|
||||
'Menu:WaitingApproval' => '等待批准的变更',
|
||||
'Menu:WaitingApproval' => '等待审批的变更',
|
||||
'Menu:WaitingApproval+' => '',
|
||||
'Menu:Changes' => '所有打开的变更',
|
||||
'Menu:Changes+' => '所有打开的变更',
|
||||
'Menu:Changes' => '所有待处理的变更',
|
||||
'Menu:Changes+' => '所有待处理的变更',
|
||||
'Menu:MyChanges' => '分配给我的变更',
|
||||
'Menu:MyChanges+' => '分配给我的变更 (作为办理人)',
|
||||
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => '最近一周的变更 (按类型)',
|
||||
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => '最近一周的变更 (按种类)',
|
||||
'UI-ChangeManagementOverview-Last-7-days' => '最近一周的变更 (按数量)',
|
||||
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => '最近一周的变更 (按范围)',
|
||||
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => '最近一周的变更 (按状态)',
|
||||
@@ -76,9 +77,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Change/Attribute:status/Value:assigned+' => '',
|
||||
'Class:Change/Attribute:status/Value:plannedscheduled' => '已计划和安排',
|
||||
'Class:Change/Attribute:status/Value:plannedscheduled+' => '',
|
||||
'Class:Change/Attribute:status/Value:approved' => '已批准',
|
||||
'Class:Change/Attribute:status/Value:approved' => '已审批',
|
||||
'Class:Change/Attribute:status/Value:approved+' => '',
|
||||
'Class:Change/Attribute:status/Value:notapproved' => '未批准',
|
||||
'Class:Change/Attribute:status/Value:notapproved' => '已驳回',
|
||||
'Class:Change/Attribute:status/Value:notapproved+' => '',
|
||||
'Class:Change/Attribute:status/Value:implemented' => '已实施',
|
||||
'Class:Change/Attribute:status/Value:implemented+' => '',
|
||||
@@ -125,7 +126,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Change/Attribute:parent_name' => '变更编号',
|
||||
'Class:Change/Attribute:parent_name+' => '',
|
||||
'Class:Change/Attribute:related_request_list' => '相关需求',
|
||||
'Class:Change/Attribute:related_request_list+' => '此变更相关的所有用户需求',
|
||||
'Class:Change/Attribute:related_request_list+' => '此变更相关的所有需求',
|
||||
'Class:Change/Attribute:related_problems_list' => '相关问题',
|
||||
'Class:Change/Attribute:related_problems_list+' => '此变更相关的所有问题',
|
||||
'Class:Change/Attribute:related_incident_list' => '相关事件',
|
||||
@@ -150,7 +151,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Change/Stimulus:ev_approve+' => '',
|
||||
'Class:Change/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:Change/Stimulus:ev_replan+' => '',
|
||||
'Class:Change/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:Change/Stimulus:ev_notapprove' => '驳回审批',
|
||||
'Class:Change/Stimulus:ev_notapprove+' => '',
|
||||
'Class:Change/Stimulus:ev_implement' => '实施',
|
||||
'Class:Change/Stimulus:ev_implement+' => '',
|
||||
@@ -181,7 +182,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:RoutineChange/Stimulus:ev_approve+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:RoutineChange/Stimulus:ev_replan+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:RoutineChange/Stimulus:ev_notapprove' => '驳回审批',
|
||||
'Class:RoutineChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_implement' => '实施',
|
||||
'Class:RoutineChange/Stimulus:ev_implement+' => '',
|
||||
@@ -196,11 +197,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ApprovedChange' => '已批准的变更',
|
||||
'Class:ApprovedChange' => '已审批的变更',
|
||||
'Class:ApprovedChange+' => '',
|
||||
'Class:ApprovedChange/Attribute:approval_date' => '批准日期',
|
||||
'Class:ApprovedChange/Attribute:approval_date' => '审批日期',
|
||||
'Class:ApprovedChange/Attribute:approval_date+' => '',
|
||||
'Class:ApprovedChange/Attribute:approval_comment' => '批准说明',
|
||||
'Class:ApprovedChange/Attribute:approval_comment' => '审批说明',
|
||||
'Class:ApprovedChange/Attribute:approval_comment+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_validate' => '同意',
|
||||
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
|
||||
@@ -216,7 +217,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ApprovedChange/Stimulus:ev_approve+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:ApprovedChange/Stimulus:ev_replan+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:ApprovedChange/Stimulus:ev_notapprove' => '驳回审批',
|
||||
'Class:ApprovedChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_implement' => '实施',
|
||||
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
|
||||
@@ -251,7 +252,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:NormalChange/Stimulus:ev_approve+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:NormalChange/Stimulus:ev_replan+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:NormalChange/Stimulus:ev_notapprove' => '驳回审批',
|
||||
'Class:NormalChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_implement' => '实施',
|
||||
'Class:NormalChange/Stimulus:ev_implement+' => '',
|
||||
@@ -282,7 +283,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:EmergencyChange/Stimulus:ev_approve+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:EmergencyChange/Stimulus:ev_replan+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:EmergencyChange/Stimulus:ev_notapprove' => '驳回审批',
|
||||
'Class:EmergencyChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_implement' => '实施',
|
||||
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
|
||||
|
||||
@@ -21,25 +21,26 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ChangeManagement' => '变更管理',
|
||||
'Menu:Change:Overview' => '概况',
|
||||
'Menu:Change:Overview+' => '',
|
||||
'Menu:NewChange' => '新建变更',
|
||||
'Menu:NewChange+' => '新建变更',
|
||||
'Menu:NewChange+' => '新建变更工单',
|
||||
'Menu:SearchChanges' => '搜索变更',
|
||||
'Menu:SearchChanges+' => '搜索变更',
|
||||
'Menu:SearchChanges+' => '搜索变更工单',
|
||||
'Menu:Change:Shortcuts' => '快捷方式',
|
||||
'Menu:Change:Shortcuts+' => '',
|
||||
'Menu:WaitingAcceptance' => '等待审核的变更',
|
||||
'Menu:WaitingAcceptance' => '等待核准的变更',
|
||||
'Menu:WaitingAcceptance+' => '',
|
||||
'Menu:WaitingApproval' => '等待批准的变更',
|
||||
'Menu:WaitingApproval' => '等待审批的变更',
|
||||
'Menu:WaitingApproval+' => '',
|
||||
'Menu:Changes' => '所有打开的变更',
|
||||
'Menu:Changes+' => '所有打开的变更',
|
||||
'Menu:MyChanges' => '分配给我的变更',
|
||||
'Menu:MyChanges+' => '分配给我的变更 (作为办理人)',
|
||||
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => '最近一周的变更 (按类型)',
|
||||
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => '最近一周的变更 (按种类)',
|
||||
'UI-ChangeManagementOverview-Last-7-days' => '最近一周的变更 (按数量)',
|
||||
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => '最近一周的变更 (按范围)',
|
||||
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => '最近一周的变更 (按状态)',
|
||||
@@ -74,11 +75,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Change/Attribute:status/Value:planned+' => '',
|
||||
'Class:Change/Attribute:status/Value:rejected' => '已驳回',
|
||||
'Class:Change/Attribute:status/Value:rejected+' => '',
|
||||
'Class:Change/Attribute:status/Value:approved' => '已批准',
|
||||
'Class:Change/Attribute:status/Value:approved' => '已审批',
|
||||
'Class:Change/Attribute:status/Value:approved+' => '',
|
||||
'Class:Change/Attribute:status/Value:closed' => '已关闭',
|
||||
'Class:Change/Attribute:status/Value:closed+' => '',
|
||||
'Class:Change/Attribute:category' => '类型',
|
||||
'Class:Change/Attribute:category' => '种类',
|
||||
'Class:Change/Attribute:category+' => '',
|
||||
'Class:Change/Attribute:category/Value:application' => '应用',
|
||||
'Class:Change/Attribute:category/Value:application+' => '应用',
|
||||
@@ -109,7 +110,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Change/Attribute:fallback_plan' => '回滚计划',
|
||||
'Class:Change/Attribute:fallback_plan+' => '',
|
||||
'Class:Change/Attribute:related_request_list' => '相关需求',
|
||||
'Class:Change/Attribute:related_request_list+' => '此变更相关的所有用户需求',
|
||||
'Class:Change/Attribute:related_request_list+' => '此变更相关的所有需求',
|
||||
'Class:Change/Attribute:related_incident_list' => '相关事件',
|
||||
'Class:Change/Attribute:related_incident_list+' => '此变更相关的所有事件',
|
||||
'Class:Change/Attribute:related_problems_list' => '相关问题',
|
||||
|
||||
@@ -21,23 +21,25 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Relations
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Relation:impacts/Description' => '被影响的元素',
|
||||
'Relation:impacts/DownStream' => '影响...',
|
||||
'Relation:impacts/DownStream+' => '被影响的元素',
|
||||
'Relation:impacts/UpStream' => '依赖于...',
|
||||
'Relation:impacts/UpStream+' => '此元素依赖的元素...',
|
||||
'Relation:impacts/Description' => '受影响的元素',
|
||||
'Relation:impacts/DownStream' => '影响...',
|
||||
'Relation:impacts/DownStream+' => '受影响的元素',
|
||||
'Relation:impacts/UpStream' => '依赖于...',
|
||||
'Relation:impacts/UpStream+' => '被影响的元素...',
|
||||
// Legacy entries
|
||||
'Relation:depends on/Description' => '此元素依赖的元素...',
|
||||
'Relation:depends on/DownStream' => '依赖于...',
|
||||
'Relation:depends on/UpStream' => '影响...',
|
||||
'Relation:impacts/LoadData' => '加载数据',
|
||||
'Relation:impacts/NoFilteredData' => 'please select objects and load data~~',
|
||||
'Relation:impacts/FilteredData' => 'Filtered data~~',
|
||||
'Relation:depends on/Description' => '被影响的元素...',
|
||||
'Relation:depends on/DownStream' => '依赖于...',
|
||||
'Relation:depends on/UpStream' => '影响...',
|
||||
'Relation:impacts/LoadData' => '加载数据',
|
||||
'Relation:impacts/NoFilteredData' => '请选择对象并加载数据',
|
||||
'Relation:impacts/FilteredData' => '已筛选的数据',
|
||||
]);
|
||||
|
||||
// Dictionnay conventions
|
||||
@@ -82,7 +84,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContactToFunctionalCI' => '关联联系人/功能项',
|
||||
'Class:lnkContactToFunctionalCI' => '链接 联系人/功能项',
|
||||
'Class:lnkContactToFunctionalCI+' => '',
|
||||
'Class:lnkContactToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkContactToFunctionalCI/Attribute:functionalci_id' => '功能项',
|
||||
@@ -123,12 +125,12 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:FunctionalCI/Attribute:contacts_list' => '联系人',
|
||||
'Class:FunctionalCI/Attribute:contacts_list+' => '此配置项的所有联系人',
|
||||
'Class:FunctionalCI/Attribute:documents_list' => '文档',
|
||||
'Class:FunctionalCI/Attribute:documents_list+' => '此配置项关联的所有文档',
|
||||
'Class:FunctionalCI/Attribute:documents_list+' => '此配置项相关的所有文档',
|
||||
'Class:FunctionalCI/Attribute:applicationsolution_list' => '应用方案',
|
||||
'Class:FunctionalCI/Attribute:applicationsolution_list+' => '此配置项依赖的所有应用方案',
|
||||
'Class:FunctionalCI/Attribute:softwares_list' => '软件',
|
||||
'Class:FunctionalCI/Attribute:softwares_list+' => '此配置项上已安装的所有软件',
|
||||
'Class:FunctionalCI/Attribute:finalclass' => '类型',
|
||||
'Class:FunctionalCI/Attribute:finalclass' => '配置项子类',
|
||||
'Class:FunctionalCI/Attribute:finalclass+' => '根本属性的名称',
|
||||
'Class:FunctionalCI/Tab:OpenedTickets' => '活跃的工单',
|
||||
'Class:FunctionalCI/Tab:OpenedTickets+' => '影响当前功能配置项的活跃工单',
|
||||
@@ -144,7 +146,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:PhysicalDevice/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:PhysicalDevice/Attribute:serialnumber' => '序列号',
|
||||
'Class:PhysicalDevice/Attribute:serialnumber+' => '',
|
||||
'Class:PhysicalDevice/Attribute:location_id' => '地点',
|
||||
'Class:PhysicalDevice/Attribute:location_id' => '位置',
|
||||
'Class:PhysicalDevice/Attribute:location_id+' => '',
|
||||
'Class:PhysicalDevice/Attribute:location_name' => '名称',
|
||||
'Class:PhysicalDevice/Attribute:location_name+' => '',
|
||||
@@ -219,7 +221,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:MobilePhone+' => '',
|
||||
'Class:MobilePhone/Attribute:imei' => 'IMEI',
|
||||
'Class:MobilePhone/Attribute:imei+' => '',
|
||||
'Class:MobilePhone/Attribute:hw_pin' => '硬件 PIN 码',
|
||||
'Class:MobilePhone/Attribute:hw_pin' => '硬件PIN 码',
|
||||
'Class:MobilePhone/Attribute:hw_pin+' => '',
|
||||
]);
|
||||
|
||||
@@ -250,7 +252,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ConnectableCI+' => '物理配置项',
|
||||
'Class:ConnectableCI/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:ConnectableCI/Attribute:networkdevice_list' => '网络设备',
|
||||
'Class:ConnectableCI/Attribute:networkdevice_list+' => '所有连接到这台设备的网络设备',
|
||||
'Class:ConnectableCI/Attribute:networkdevice_list+' => '所有连接到此设备的网络设备',
|
||||
'Class:ConnectableCI/Attribute:physicalinterface_list' => '网卡',
|
||||
'Class:ConnectableCI/Attribute:physicalinterface_list+' => '所有物理网卡',
|
||||
]);
|
||||
@@ -275,20 +277,20 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:DatacenterDevice/Attribute:nb_u+' => '',
|
||||
'Class:DatacenterDevice/Attribute:managementip' => '管理IP',
|
||||
'Class:DatacenterDevice/Attribute:managementip+' => '',
|
||||
'Class:DatacenterDevice/Attribute:powerA_id' => '主电源',
|
||||
'Class:DatacenterDevice/Attribute:powerA_id' => '电源A',
|
||||
'Class:DatacenterDevice/Attribute:powerA_id+' => '',
|
||||
'Class:DatacenterDevice/Attribute:powerA_name' => '主电源名称',
|
||||
'Class:DatacenterDevice/Attribute:powerA_name' => '电源A名称',
|
||||
'Class:DatacenterDevice/Attribute:powerA_name+' => '',
|
||||
'Class:DatacenterDevice/Attribute:powerB_id' => '备电源',
|
||||
'Class:DatacenterDevice/Attribute:powerB_id' => '电源B',
|
||||
'Class:DatacenterDevice/Attribute:powerB_id+' => '',
|
||||
'Class:DatacenterDevice/Attribute:powerB_name' => '备电源名称',
|
||||
'Class:DatacenterDevice/Attribute:powerB_name' => '电源B名称',
|
||||
'Class:DatacenterDevice/Attribute:powerB_name+' => '',
|
||||
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list' => '光纤接口',
|
||||
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list' => '光口',
|
||||
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list+' => '此设备的所有光纤接口',
|
||||
'Class:DatacenterDevice/Attribute:san_list' => 'SAN',
|
||||
'Class:DatacenterDevice/Attribute:san_list+' => '所有连接到这台设备的SAN交换机',
|
||||
'Class:DatacenterDevice/Attribute:san_list' => '光纤交换机',
|
||||
'Class:DatacenterDevice/Attribute:san_list+' => '连接到此设备的所有光纤交换机',
|
||||
'Class:DatacenterDevice/Attribute:redundancy' => '冗余',
|
||||
'Class:DatacenterDevice/Attribute:redundancy/count' => '此设备运行正常至少需要一路电源 (主或备)',
|
||||
'Class:DatacenterDevice/Attribute:redundancy/count' => '此设备运行正常至少需要一路电源 (A或B)',
|
||||
// Unused yet
|
||||
'Class:DatacenterDevice/Attribute:redundancy/disabled' => '所有电源正常, 此设备才正常',
|
||||
'Class:DatacenterDevice/Attribute:redundancy/percent' => '至少%1$s %%路电源正常, 设备才正常',
|
||||
@@ -308,9 +310,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:NetworkDevice/Attribute:networkdevicetype_name+' => '',
|
||||
'Class:NetworkDevice/Attribute:connectablecis_list' => '设备',
|
||||
'Class:NetworkDevice/Attribute:connectablecis_list+' => '连接到此网络设备的所有设备',
|
||||
'Class:NetworkDevice/Attribute:iosversion_id' => 'IOS版本',
|
||||
'Class:NetworkDevice/Attribute:iosversion_id' => 'IOS 版本',
|
||||
'Class:NetworkDevice/Attribute:iosversion_id+' => '',
|
||||
'Class:NetworkDevice/Attribute:iosversion_name' => 'IOS版本名称',
|
||||
'Class:NetworkDevice/Attribute:iosversion_name' => 'IOS 版本名称',
|
||||
'Class:NetworkDevice/Attribute:iosversion_name+' => '',
|
||||
'Class:NetworkDevice/Attribute:ram' => '内存',
|
||||
'Class:NetworkDevice/Attribute:ram+' => '',
|
||||
@@ -321,27 +323,27 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Server' => '服务器',
|
||||
'Class:Server' => '物理机',
|
||||
'Class:Server+' => '',
|
||||
'Class:Server/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:Server/Attribute:osfamily_id' => '操作系统家族',
|
||||
'Class:Server/Attribute:osfamily_id' => 'OS 家族',
|
||||
'Class:Server/Attribute:osfamily_id+' => '',
|
||||
'Class:Server/Attribute:osfamily_name' => '操作系统家族名称',
|
||||
'Class:Server/Attribute:osfamily_name' => 'OS 家族名称',
|
||||
'Class:Server/Attribute:osfamily_name+' => '',
|
||||
'Class:Server/Attribute:osversion_id' => '操作系统版本',
|
||||
'Class:Server/Attribute:osversion_id' => 'OS 版本',
|
||||
'Class:Server/Attribute:osversion_id+' => '',
|
||||
'Class:Server/Attribute:osversion_name' => '操作系统版本名称',
|
||||
'Class:Server/Attribute:osversion_name' => 'OS 版本名称',
|
||||
'Class:Server/Attribute:osversion_name+' => '',
|
||||
'Class:Server/Attribute:oslicence_id' => '操作系统许可证',
|
||||
'Class:Server/Attribute:oslicence_id' => 'OS 许可证',
|
||||
'Class:Server/Attribute:oslicence_id+' => '',
|
||||
'Class:Server/Attribute:oslicence_name' => '操作系统许可证名称',
|
||||
'Class:Server/Attribute:oslicence_name' => 'OS 许可证名称',
|
||||
'Class:Server/Attribute:oslicence_name+' => '',
|
||||
'Class:Server/Attribute:cpu' => 'CPU',
|
||||
'Class:Server/Attribute:cpu+' => '',
|
||||
'Class:Server/Attribute:ram' => '内存',
|
||||
'Class:Server/Attribute:ram+' => '',
|
||||
'Class:Server/Attribute:logicalvolumes_list' => '逻辑卷',
|
||||
'Class:Server/Attribute:logicalvolumes_list+' => '连接到此服务器的所有逻辑卷',
|
||||
'Class:Server/Attribute:logicalvolumes_list+' => '连接到此物理机的所有逻辑卷',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -361,11 +363,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:SANSwitch' => 'SAN交换机',
|
||||
'Class:SANSwitch' => '光纤交换机',
|
||||
'Class:SANSwitch+' => '',
|
||||
'Class:SANSwitch/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:SANSwitch/Attribute:datacenterdevice_list' => '设备',
|
||||
'Class:SANSwitch/Attribute:datacenterdevice_list+' => '连接到此SAN交换机的所有设备',
|
||||
'Class:SANSwitch/Attribute:datacenterdevice_list+' => '连接到此光纤交换机的所有设备',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -400,13 +402,13 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:PC' => 'PC',
|
||||
'Class:PC+' => '',
|
||||
'Class:PC/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:PC/Attribute:osfamily_id' => '操作系统家族',
|
||||
'Class:PC/Attribute:osfamily_id' => 'OS 家族',
|
||||
'Class:PC/Attribute:osfamily_id+' => '',
|
||||
'Class:PC/Attribute:osfamily_name' => '操作系统家族名称',
|
||||
'Class:PC/Attribute:osfamily_name' => 'OS 家族名称',
|
||||
'Class:PC/Attribute:osfamily_name+' => '',
|
||||
'Class:PC/Attribute:osversion_id' => '操作系统版本',
|
||||
'Class:PC/Attribute:osversion_id' => 'OS 版本',
|
||||
'Class:PC/Attribute:osversion_id+' => '',
|
||||
'Class:PC/Attribute:osversion_name' => '操作系统版本名称',
|
||||
'Class:PC/Attribute:osversion_name' => 'OS 版本名称',
|
||||
'Class:PC/Attribute:osversion_name+' => '',
|
||||
'Class:PC/Attribute:cpu' => 'CPU',
|
||||
'Class:PC/Attribute:cpu+' => '',
|
||||
@@ -445,11 +447,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:PowerSource' => '电源',
|
||||
'Class:PowerSource' => '动力电源',
|
||||
'Class:PowerSource+' => '',
|
||||
'Class:PowerSource/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:PowerSource/Attribute:pdus_list' => 'PDU',
|
||||
'Class:PowerSource/Attribute:pdus_list+' => '使用此电源的所有 PDU',
|
||||
'Class:PowerSource/Attribute:pdus_list+' => '使用此动力电源的所有 PDU',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -464,9 +466,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:PDU/Attribute:rack_id+' => '',
|
||||
'Class:PDU/Attribute:rack_name' => '机架名称',
|
||||
'Class:PDU/Attribute:rack_name+' => '',
|
||||
'Class:PDU/Attribute:powerstart_id' => '上级电源',
|
||||
'Class:PDU/Attribute:powerstart_id' => '上游电源',
|
||||
'Class:PDU/Attribute:powerstart_id+' => '',
|
||||
'Class:PDU/Attribute:powerstart_name' => '上级电源名称',
|
||||
'Class:PDU/Attribute:powerstart_name' => '上游电源名称',
|
||||
'Class:PDU/Attribute:powerstart_name+' => '',
|
||||
]);
|
||||
|
||||
@@ -508,7 +510,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ApplicationSolution/Attribute:functionalcis_list' => '配置项',
|
||||
'Class:ApplicationSolution/Attribute:functionalcis_list+' => '此应用方案包含的所有配置项',
|
||||
'Class:ApplicationSolution/Attribute:businessprocess_list' => '业务流程',
|
||||
'Class:ApplicationSolution/Attribute:businessprocess_list+' => '所有依赖此应用方案的业务流程',
|
||||
'Class:ApplicationSolution/Attribute:businessprocess_list+' => '依赖此应用方案的所有业务流程',
|
||||
'Class:ApplicationSolution/Attribute:status' => '状态',
|
||||
'Class:ApplicationSolution/Attribute:status+' => '',
|
||||
'Class:ApplicationSolution/Attribute:status/Value:active' => '启用',
|
||||
@@ -529,7 +531,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:BusinessProcess' => '业务流程',
|
||||
'Class:BusinessProcess+' => '',
|
||||
'Class:BusinessProcess/Attribute:applicationsolutions_list' => '应用方案',
|
||||
'Class:BusinessProcess/Attribute:applicationsolutions_list+' => '所有影响此业务流程的应用方案',
|
||||
'Class:BusinessProcess/Attribute:applicationsolutions_list+' => '影响此业务流程的所有应用方案',
|
||||
'Class:BusinessProcess/Attribute:status' => '状态',
|
||||
'Class:BusinessProcess/Attribute:status+' => '',
|
||||
'Class:BusinessProcess/Attribute:status/Value:active' => '启用',
|
||||
@@ -585,8 +587,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:DBServer' => '数据库服务器',
|
||||
'Class:DBServer+' => '',
|
||||
'Class:DBServer/Attribute:dbschema_list' => '数据库',
|
||||
'Class:DBServer/Attribute:dbschema_list+' => '此数据库服务器上的所有数据库架构',
|
||||
'Class:DBServer/Attribute:dbschema_list' => '数据库模式',
|
||||
'Class:DBServer/Attribute:dbschema_list+' => '此数据库服务器上的所有逻辑数据库',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -594,10 +596,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:WebServer' => 'Web服务器',
|
||||
'Class:WebServer' => 'Web 服务器',
|
||||
'Class:WebServer+' => '',
|
||||
'Class:WebServer/Attribute:webapp_list' => 'Web应用',
|
||||
'Class:WebServer/Attribute:webapp_list+' => '此web服务器上的所有web应用',
|
||||
'Class:WebServer/Attribute:webapp_list' => 'Web 应用',
|
||||
'Class:WebServer/Attribute:webapp_list+' => '此 web 服务器上的所有 web 应用',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -628,7 +630,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:MiddlewareInstance/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:MiddlewareInstance/Attribute:middleware_id' => '中间件',
|
||||
'Class:MiddlewareInstance/Attribute:middleware_id+' => '',
|
||||
'Class:MiddlewareInstance/Attribute:middleware_name' => '名称',
|
||||
'Class:MiddlewareInstance/Attribute:middleware_name' => '中间件名称',
|
||||
'Class:MiddlewareInstance/Attribute:middleware_name+' => '',
|
||||
]);
|
||||
|
||||
@@ -637,12 +639,12 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:DatabaseSchema' => '数据库',
|
||||
'Class:DatabaseSchema+' => '',
|
||||
'Class:DatabaseSchema' => '数据库模式',
|
||||
'Class:DatabaseSchema+' => '运行在数据库服务器上的逻辑数据库',
|
||||
'Class:DatabaseSchema/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:DatabaseSchema/Attribute:dbserver_id' => '数据库服务器',
|
||||
'Class:DatabaseSchema/Attribute:dbserver_id+' => '',
|
||||
'Class:DatabaseSchema/Attribute:dbserver_name' => '名称',
|
||||
'Class:DatabaseSchema/Attribute:dbserver_name' => '数据库服务器名称',
|
||||
'Class:DatabaseSchema/Attribute:dbserver_name+' => '',
|
||||
]);
|
||||
|
||||
@@ -654,9 +656,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:WebApplication' => 'Web 应用',
|
||||
'Class:WebApplication+' => '',
|
||||
'Class:WebApplication/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:WebApplication/Attribute:webserver_id' => 'Web服务器',
|
||||
'Class:WebApplication/Attribute:webserver_id' => 'Web 服务器',
|
||||
'Class:WebApplication/Attribute:webserver_id+' => '',
|
||||
'Class:WebApplication/Attribute:webserver_name' => '名称',
|
||||
'Class:WebApplication/Attribute:webserver_name' => 'Web 服务器名称',
|
||||
'Class:WebApplication/Attribute:webserver_name+' => '',
|
||||
'Class:WebApplication/Attribute:url' => 'URL',
|
||||
'Class:WebApplication/Attribute:url+' => '',
|
||||
@@ -688,10 +690,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:VirtualHost' => '宿主机',
|
||||
'Class:VirtualHost' => '虚拟化主机',
|
||||
'Class:VirtualHost+' => '',
|
||||
'Class:VirtualHost/Attribute:virtualmachine_list' => '虚拟机',
|
||||
'Class:VirtualHost/Attribute:virtualmachine_list+' => '此宿主机托管的所有虚拟机',
|
||||
'Class:VirtualHost/Attribute:virtualmachine_list+' => '此虚拟化主机托管的所有虚拟机',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -703,11 +705,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Hypervisor+' => '',
|
||||
'Class:Hypervisor/Attribute:farm_id' => '集群',
|
||||
'Class:Hypervisor/Attribute:farm_id+' => '',
|
||||
'Class:Hypervisor/Attribute:farm_name' => '名称',
|
||||
'Class:Hypervisor/Attribute:farm_name' => '集群名称',
|
||||
'Class:Hypervisor/Attribute:farm_name+' => '',
|
||||
'Class:Hypervisor/Attribute:server_id' => '物理机',
|
||||
'Class:Hypervisor/Attribute:server_id+' => '',
|
||||
'Class:Hypervisor/Attribute:server_name' => '名称',
|
||||
'Class:Hypervisor/Attribute:server_name' => '物理机名称',
|
||||
'Class:Hypervisor/Attribute:server_name+' => '',
|
||||
]);
|
||||
|
||||
@@ -734,21 +736,21 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:VirtualMachine' => '虚拟机',
|
||||
'Class:VirtualMachine+' => '',
|
||||
'Class:VirtualMachine/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_id' => '宿主机',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_id' => '虚拟化主机',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_id+' => '',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_name' => '名称',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_name+' => '',
|
||||
'Class:VirtualMachine/Attribute:osfamily_id' => '操作系统家族',
|
||||
'Class:VirtualMachine/Attribute:osfamily_id' => 'OS 家族',
|
||||
'Class:VirtualMachine/Attribute:osfamily_id+' => '',
|
||||
'Class:VirtualMachine/Attribute:osfamily_name' => '名称',
|
||||
'Class:VirtualMachine/Attribute:osfamily_name' => 'OS 家族名称',
|
||||
'Class:VirtualMachine/Attribute:osfamily_name+' => '',
|
||||
'Class:VirtualMachine/Attribute:osversion_id' => '操作系统版本',
|
||||
'Class:VirtualMachine/Attribute:osversion_id' => 'OS 版本',
|
||||
'Class:VirtualMachine/Attribute:osversion_id+' => '',
|
||||
'Class:VirtualMachine/Attribute:osversion_name' => '名称',
|
||||
'Class:VirtualMachine/Attribute:osversion_name' => 'OS 版本名称',
|
||||
'Class:VirtualMachine/Attribute:osversion_name+' => '',
|
||||
'Class:VirtualMachine/Attribute:oslicence_id' => '操作系统许可证',
|
||||
'Class:VirtualMachine/Attribute:oslicence_id' => 'OS 许可证',
|
||||
'Class:VirtualMachine/Attribute:oslicence_id+' => '',
|
||||
'Class:VirtualMachine/Attribute:oslicence_name' => '名称',
|
||||
'Class:VirtualMachine/Attribute:oslicence_name' => 'OS 许可证名称',
|
||||
'Class:VirtualMachine/Attribute:oslicence_name+' => '',
|
||||
'Class:VirtualMachine/Attribute:cpu' => 'CPU',
|
||||
'Class:VirtualMachine/Attribute:cpu+' => '',
|
||||
@@ -779,10 +781,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:LogicalVolume/Attribute:size+' => '',
|
||||
'Class:LogicalVolume/Attribute:storagesystem_id' => '存储系统',
|
||||
'Class:LogicalVolume/Attribute:storagesystem_id+' => '',
|
||||
'Class:LogicalVolume/Attribute:storagesystem_name' => '名称',
|
||||
'Class:LogicalVolume/Attribute:storagesystem_name' => '存储系统名称',
|
||||
'Class:LogicalVolume/Attribute:storagesystem_name+' => '',
|
||||
'Class:LogicalVolume/Attribute:servers_list' => '服务器',
|
||||
'Class:LogicalVolume/Attribute:servers_list+' => '使用此逻辑卷的服务器',
|
||||
'Class:LogicalVolume/Attribute:servers_list' => '物理机',
|
||||
'Class:LogicalVolume/Attribute:servers_list+' => '使用此逻辑卷的物理机',
|
||||
'Class:LogicalVolume/Attribute:virtualdevices_list' => '虚拟设备',
|
||||
'Class:LogicalVolume/Attribute:virtualdevices_list+' => '使用此逻辑卷的所有虚拟设备',
|
||||
]);
|
||||
@@ -792,16 +794,16 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkServerToVolume' => '关联服务器/逻辑卷',
|
||||
'Class:lnkServerToVolume' => '链接 物理机/逻辑卷',
|
||||
'Class:lnkServerToVolume+' => '',
|
||||
'Class:lnkServerToVolume/Name' => '%1$s / %2$s',
|
||||
'Class:lnkServerToVolume/Attribute:volume_id' => '逻辑卷',
|
||||
'Class:lnkServerToVolume/Attribute:volume_id+' => '',
|
||||
'Class:lnkServerToVolume/Attribute:volume_name' => '逻辑卷名称',
|
||||
'Class:lnkServerToVolume/Attribute:volume_name+' => '',
|
||||
'Class:lnkServerToVolume/Attribute:server_id' => '服务器',
|
||||
'Class:lnkServerToVolume/Attribute:server_id' => '物理机',
|
||||
'Class:lnkServerToVolume/Attribute:server_id+' => '',
|
||||
'Class:lnkServerToVolume/Attribute:server_name' => '服务器名称',
|
||||
'Class:lnkServerToVolume/Attribute:server_name' => '物理机名称',
|
||||
'Class:lnkServerToVolume/Attribute:server_name+' => '',
|
||||
'Class:lnkServerToVolume/Attribute:size_used' => '已用容量',
|
||||
'Class:lnkServerToVolume/Attribute:size_used+' => '',
|
||||
@@ -812,16 +814,16 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkVirtualDeviceToVolume' => '关联虚拟设备/逻辑卷',
|
||||
'Class:lnkVirtualDeviceToVolume' => '链接 虚拟设备/逻辑卷',
|
||||
'Class:lnkVirtualDeviceToVolume+' => '',
|
||||
'Class:lnkVirtualDeviceToVolume/Name' => '%1$s / %2$s',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_id' => '逻辑卷',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_id+' => '',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_name' => '名称',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_name' => '逻辑卷名称',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_name+' => '',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:virtualdevice_id' => '虚拟设备',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:virtualdevice_id+' => '',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:virtualdevice_name' => '名称',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:virtualdevice_name' => '虚拟设备名称',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:virtualdevice_name+' => '',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:size_used' => '已用容量',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:size_used+' => '',
|
||||
@@ -832,18 +834,18 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkSanToDatacenterDevice' => '关联 SAN/数据中心设备',
|
||||
'Class:lnkSanToDatacenterDevice' => '链接 光纤交换机/数据中心设备',
|
||||
'Class:lnkSanToDatacenterDevice+' => '',
|
||||
'Class:lnkSanToDatacenterDevice/Name' => '%1$s / %2$s',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_id' => 'SAN 交换机',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_id' => '光纤交换机',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_id+' => '',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_name' => '名称',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_name' => '光纤交换机名称',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_name+' => '',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_id' => '设备',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_id+' => '',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_name' => '名称',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_name' => '设备名称',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_name+' => '',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_port' => 'SAN 光口',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_port' => '交换机光口',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_port+' => '',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_port' => '设备光口',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_port+' => '',
|
||||
@@ -864,7 +866,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Tape/Attribute:size+' => '',
|
||||
'Class:Tape/Attribute:tapelibrary_id' => '磁带库',
|
||||
'Class:Tape/Attribute:tapelibrary_id+' => '',
|
||||
'Class:Tape/Attribute:tapelibrary_name' => '名称',
|
||||
'Class:Tape/Attribute:tapelibrary_name' => '磁带库名称',
|
||||
'Class:Tape/Attribute:tapelibrary_name+' => '',
|
||||
]);
|
||||
|
||||
@@ -913,10 +915,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Software/Attribute:type/Value:Middleware+' => '中间件',
|
||||
'Class:Software/Attribute:type/Value:OtherSoftware' => '其它软件',
|
||||
'Class:Software/Attribute:type/Value:OtherSoftware+' => '其它软件',
|
||||
'Class:Software/Attribute:type/Value:PCSoftware' => 'PC软件',
|
||||
'Class:Software/Attribute:type/Value:PCSoftware+' => 'PC软件',
|
||||
'Class:Software/Attribute:type/Value:WebServer' => 'Web服务器',
|
||||
'Class:Software/Attribute:type/Value:WebServer+' => 'Web服务器',
|
||||
'Class:Software/Attribute:type/Value:PCSoftware' => 'PC 软件',
|
||||
'Class:Software/Attribute:type/Value:PCSoftware+' => 'PC 软件',
|
||||
'Class:Software/Attribute:type/Value:WebServer' => 'Web 服务器',
|
||||
'Class:Software/Attribute:type/Value:WebServer+' => 'Web 服务器',
|
||||
'Class:Software/Attribute:softwareinstance_list' => '软件实例',
|
||||
'Class:Software/Attribute:softwareinstance_list+' => '此软件的所有实例',
|
||||
'Class:Software/Attribute:softwarepatch_list' => '软件补丁',
|
||||
@@ -935,10 +937,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Patch/Attribute:name' => '名称',
|
||||
'Class:Patch/Attribute:name+' => '',
|
||||
'Class:Patch/Attribute:documents_list' => '文档',
|
||||
'Class:Patch/Attribute:documents_list+' => '此补丁关联的所有文档',
|
||||
'Class:Patch/Attribute:documents_list+' => '此补丁相关的所有文档',
|
||||
'Class:Patch/Attribute:description' => '描述',
|
||||
'Class:Patch/Attribute:description+' => '',
|
||||
'Class:Patch/Attribute:finalclass' => '补丁类型',
|
||||
'Class:Patch/Attribute:finalclass' => '补丁子类',
|
||||
'Class:Patch/Attribute:finalclass+' => '根本属性的名称',
|
||||
]);
|
||||
|
||||
@@ -947,11 +949,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:OSPatch' => '操作系统补丁',
|
||||
'Class:OSPatch' => 'OS 补丁',
|
||||
'Class:OSPatch+' => '',
|
||||
'Class:OSPatch/Attribute:functionalcis_list' => '设备',
|
||||
'Class:OSPatch/Attribute:functionalcis_list+' => '已安装此补丁的所有系统',
|
||||
'Class:OSPatch/Attribute:osversion_id' => '操作系统版本',
|
||||
'Class:OSPatch/Attribute:osversion_id' => 'OS 版本',
|
||||
'Class:OSPatch/Attribute:osversion_id+' => '',
|
||||
'Class:OSPatch/Attribute:osversion_name' => '名称',
|
||||
'Class:OSPatch/Attribute:osversion_name+' => '',
|
||||
@@ -966,7 +968,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:SoftwarePatch+' => '',
|
||||
'Class:SoftwarePatch/Attribute:software_id' => '软件',
|
||||
'Class:SoftwarePatch/Attribute:software_id+' => '',
|
||||
'Class:SoftwarePatch/Attribute:software_name' => '名称',
|
||||
'Class:SoftwarePatch/Attribute:software_name' => '软件名称',
|
||||
'Class:SoftwarePatch/Attribute:software_name+' => '',
|
||||
'Class:SoftwarePatch/Attribute:softwareinstances_list' => '软件实例',
|
||||
'Class:SoftwarePatch/Attribute:softwareinstances_list+' => '已安装此软件补丁的所有系统',
|
||||
@@ -979,10 +981,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Licence' => '许可证',
|
||||
'Class:Licence+' => '',
|
||||
|
||||
'Class:Licence/Attribute:name' => '名称',
|
||||
'Class:Licence/Attribute:name+' => '',
|
||||
'Class:Licence/Attribute:documents_list' => '文档',
|
||||
'Class:Licence/Attribute:documents_list+' => '此许可证关联的所有文档',
|
||||
'Class:Licence/Attribute:documents_list+' => '此许可证相关的所有文档',
|
||||
'Class:Licence/Attribute:org_id' => '组织',
|
||||
'Class:Licence/Attribute:org_id+' => '',
|
||||
'Class:Licence/Attribute:organization_name' => '组织名称',
|
||||
@@ -1003,7 +1006,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Licence/Attribute:perpetual/Value:no+' => '否',
|
||||
'Class:Licence/Attribute:perpetual/Value:yes' => '是',
|
||||
'Class:Licence/Attribute:perpetual/Value:yes+' => '是',
|
||||
'Class:Licence/Attribute:finalclass' => '许可证类型',
|
||||
'Class:Licence/Attribute:finalclass' => '许可证子类',
|
||||
'Class:Licence/Attribute:finalclass+' => '根本属性的名称',
|
||||
]);
|
||||
|
||||
@@ -1012,17 +1015,17 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:OSLicence' => '操作系统许可证',
|
||||
'Class:OSLicence' => 'OS 许可证',
|
||||
'Class:OSLicence+' => '',
|
||||
'Class:OSLicence/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:OSLicence/Attribute:osversion_id' => '操作系统版本',
|
||||
'Class:OSLicence/Attribute:osversion_id' => 'OS 版本',
|
||||
'Class:OSLicence/Attribute:osversion_id+' => '',
|
||||
'Class:OSLicence/Attribute:osversion_name' => '名称',
|
||||
'Class:OSLicence/Attribute:osversion_name' => 'OS 版本名称',
|
||||
'Class:OSLicence/Attribute:osversion_name+' => '',
|
||||
'Class:OSLicence/Attribute:virtualmachines_list' => '虚拟机',
|
||||
'Class:OSLicence/Attribute:virtualmachines_list+' => '使用此许可证的所有虚拟机',
|
||||
'Class:OSLicence/Attribute:servers_list' => '服务器',
|
||||
'Class:OSLicence/Attribute:servers_list+' => '使用此许可证的所有服务器',
|
||||
'Class:OSLicence/Attribute:servers_list' => '物理机',
|
||||
'Class:OSLicence/Attribute:servers_list+' => '使用此许可证的所有物理机',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -1035,7 +1038,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:SoftwareLicence/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:SoftwareLicence/Attribute:software_id' => '软件',
|
||||
'Class:SoftwareLicence/Attribute:software_id+' => '',
|
||||
'Class:SoftwareLicence/Attribute:software_name' => '名称',
|
||||
'Class:SoftwareLicence/Attribute:software_name' => '软件名称',
|
||||
'Class:SoftwareLicence/Attribute:software_name+' => '',
|
||||
'Class:SoftwareLicence/Attribute:softwareinstance_list' => '软件实例',
|
||||
'Class:SoftwareLicence/Attribute:softwareinstance_list+' => '使用此许可证的所有系统',
|
||||
@@ -1046,12 +1049,12 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToLicence' => '关联文档/许可证',
|
||||
'Class:lnkDocumentToLicence' => '链接 文档/许可证',
|
||||
'Class:lnkDocumentToLicence+' => '',
|
||||
'Class:lnkDocumentToLicence/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToLicence/Attribute:licence_id' => '许可证',
|
||||
'Class:lnkDocumentToLicence/Attribute:licence_id+' => '',
|
||||
'Class:lnkDocumentToLicence/Attribute:licence_name' => '名称',
|
||||
'Class:lnkDocumentToLicence/Attribute:licence_name' => '许可证名称',
|
||||
'Class:lnkDocumentToLicence/Attribute:licence_name+' => '',
|
||||
'Class:lnkDocumentToLicence/Attribute:document_id' => '文档',
|
||||
'Class:lnkDocumentToLicence/Attribute:document_id+' => '',
|
||||
@@ -1064,11 +1067,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:OSVersion' => '操作系统版本',
|
||||
'Class:OSVersion' => 'OS 版本',
|
||||
'Class:OSVersion+' => '',
|
||||
'Class:OSVersion/Attribute:osfamily_id' => '操作系统家族',
|
||||
'Class:OSVersion/Attribute:osfamily_id' => 'OS 家族',
|
||||
'Class:OSVersion/Attribute:osfamily_id+' => '',
|
||||
'Class:OSVersion/Attribute:osfamily_name' => '名称',
|
||||
'Class:OSVersion/Attribute:osfamily_name' => 'OS 家族名称',
|
||||
'Class:OSVersion/Attribute:osfamily_name+' => '',
|
||||
]);
|
||||
|
||||
@@ -1077,7 +1080,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:OSFamily' => '操作系统家族',
|
||||
'Class:OSFamily' => 'OS 家族',
|
||||
'Class:OSFamily+' => '',
|
||||
]);
|
||||
|
||||
@@ -1112,14 +1115,14 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Model/Attribute:picture+' => '',
|
||||
'Class:Model/Attribute:type' => '设备类型',
|
||||
'Class:Model/Attribute:type+' => '',
|
||||
'Class:Model/Attribute:type/Value:PowerSource' => '电源',
|
||||
'Class:Model/Attribute:type/Value:PowerSource+' => '电源',
|
||||
'Class:Model/Attribute:type/Value:PowerSource' => '动力电源',
|
||||
'Class:Model/Attribute:type/Value:PowerSource+' => '动力电源',
|
||||
'Class:Model/Attribute:type/Value:DiskArray' => '磁盘阵列',
|
||||
'Class:Model/Attribute:type/Value:DiskArray+' => '磁盘阵列',
|
||||
'Class:Model/Attribute:type/Value:Enclosure' => '机柜',
|
||||
'Class:Model/Attribute:type/Value:Enclosure+' => '机柜',
|
||||
'Class:Model/Attribute:type/Value:IPPhone' => 'IP电话',
|
||||
'Class:Model/Attribute:type/Value:IPPhone+' => 'IP电话',
|
||||
'Class:Model/Attribute:type/Value:IPPhone' => 'IP 电话',
|
||||
'Class:Model/Attribute:type/Value:IPPhone+' => 'IP 电话',
|
||||
'Class:Model/Attribute:type/Value:MobilePhone' => '手机',
|
||||
'Class:Model/Attribute:type/Value:MobilePhone+' => '手机',
|
||||
'Class:Model/Attribute:type/Value:NAS' => 'NAS',
|
||||
@@ -1136,10 +1139,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Model/Attribute:type/Value:Printer+' => '打印机',
|
||||
'Class:Model/Attribute:type/Value:Rack' => '机架',
|
||||
'Class:Model/Attribute:type/Value:Rack+' => '机架',
|
||||
'Class:Model/Attribute:type/Value:SANSwitch' => 'SAN交换机',
|
||||
'Class:Model/Attribute:type/Value:SANSwitch+' => 'SAN交换机',
|
||||
'Class:Model/Attribute:type/Value:Server' => '服务器',
|
||||
'Class:Model/Attribute:type/Value:Server+' => '服务器',
|
||||
'Class:Model/Attribute:type/Value:SANSwitch' => '光纤交换机',
|
||||
'Class:Model/Attribute:type/Value:SANSwitch+' => '光纤交换机',
|
||||
'Class:Model/Attribute:type/Value:Server' => '物理机',
|
||||
'Class:Model/Attribute:type/Value:Server+' => '物理机',
|
||||
'Class:Model/Attribute:type/Value:StorageSystem' => '存储系统',
|
||||
'Class:Model/Attribute:type/Value:StorageSystem+' => '存储系统',
|
||||
'Class:Model/Attribute:type/Value:Tablet' => '平板',
|
||||
@@ -1174,7 +1177,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:IOSVersion+' => '',
|
||||
'Class:IOSVersion/Attribute:brand_id' => '品牌',
|
||||
'Class:IOSVersion/Attribute:brand_id+' => '',
|
||||
'Class:IOSVersion/Attribute:brand_name' => '名称',
|
||||
'Class:IOSVersion/Attribute:brand_name' => '品牌名称',
|
||||
'Class:IOSVersion/Attribute:brand_name+' => '',
|
||||
]);
|
||||
|
||||
@@ -1183,7 +1186,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToPatch' => '关联文档/补丁',
|
||||
'Class:lnkDocumentToPatch' => '链接 文档/补丁',
|
||||
'Class:lnkDocumentToPatch+' => '',
|
||||
'Class:lnkDocumentToPatch/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToPatch/Attribute:patch_id' => '补丁',
|
||||
@@ -1201,7 +1204,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch' => ' 关联软件实例/软件补丁',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch' => '链接 软件实例/软件补丁',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch+' => '',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Name' => '%1$s / %2$s',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_id' => '软件补丁',
|
||||
@@ -1219,12 +1222,12 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkFunctionalCIToOSPatch' => '关联功能项/操作系统补丁',
|
||||
'Class:lnkFunctionalCIToOSPatch' => '链接 功能项/OS 补丁',
|
||||
'Class:lnkFunctionalCIToOSPatch+' => '',
|
||||
'Class:lnkFunctionalCIToOSPatch/Name' => '%1$s / %2$s',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_id' => '操作系统补丁',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_id' => 'OS 补丁',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_id+' => '',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_name' => '操作系统补丁名称',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_name' => 'OS 补丁名称',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_name+' => '',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:functionalci_id' => '功能项',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:functionalci_id+' => '',
|
||||
@@ -1237,7 +1240,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToSoftware' => '关联文档/软件',
|
||||
'Class:lnkDocumentToSoftware' => '链接 文档/软件',
|
||||
'Class:lnkDocumentToSoftware+' => '',
|
||||
'Class:lnkDocumentToSoftware/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToSoftware/Attribute:software_id' => '软件',
|
||||
@@ -1265,8 +1268,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Subnet/Attribute:subnet_name+' => '',
|
||||
'Class:Subnet/Attribute:org_id' => '所属组织',
|
||||
'Class:Subnet/Attribute:org_id+' => '',
|
||||
'Class:Subnet/Attribute:org_name' => '名称',
|
||||
'Class:Subnet/Attribute:org_name+' => '名称',
|
||||
'Class:Subnet/Attribute:org_name' => '组织名称',
|
||||
'Class:Subnet/Attribute:org_name+' => '',
|
||||
'Class:Subnet/Attribute:ip' => 'IP',
|
||||
'Class:Subnet/Attribute:ip+' => '',
|
||||
'Class:Subnet/Attribute:ip_mask' => '掩码',
|
||||
@@ -1282,7 +1285,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:VLAN' => 'VLAN',
|
||||
'Class:VLAN+' => '',
|
||||
'Class:VLAN/Attribute:vlan_tag' => 'VLAN 标记',
|
||||
'Class:VLAN/Attribute:vlan_tag' => 'VLAN 标签',
|
||||
'Class:VLAN/Attribute:vlan_tag+' => '',
|
||||
'Class:VLAN/Attribute:description' => '描述',
|
||||
'Class:VLAN/Attribute:description+' => '',
|
||||
@@ -1301,7 +1304,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkSubnetToVLAN' => '关联子网/VLAN',
|
||||
'Class:lnkSubnetToVLAN' => '链接 子网/VLAN',
|
||||
'Class:lnkSubnetToVLAN+' => '',
|
||||
'Class:lnkSubnetToVLAN/Name' => '%1$s / %2$s',
|
||||
'Class:lnkSubnetToVLAN/Attribute:subnet_id' => '子网',
|
||||
@@ -1312,7 +1315,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkSubnetToVLAN/Attribute:subnet_name+' => '',
|
||||
'Class:lnkSubnetToVLAN/Attribute:vlan_id' => 'VLAN',
|
||||
'Class:lnkSubnetToVLAN/Attribute:vlan_id+' => '',
|
||||
'Class:lnkSubnetToVLAN/Attribute:vlan_tag' => 'VLAN 标记',
|
||||
'Class:lnkSubnetToVLAN/Attribute:vlan_tag' => 'VLAN 标签',
|
||||
'Class:lnkSubnetToVLAN/Attribute:vlan_tag+' => '',
|
||||
]);
|
||||
|
||||
@@ -1338,7 +1341,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:IPInterface+' => '',
|
||||
'Class:IPInterface/Attribute:ipaddress' => 'IP 地址',
|
||||
'Class:IPInterface/Attribute:ipaddress+' => '',
|
||||
'Class:IPInterface/Attribute:macaddress' => 'MAC地址',
|
||||
|
||||
'Class:IPInterface/Attribute:macaddress' => 'MAC 地址',
|
||||
'Class:IPInterface/Attribute:macaddress+' => '',
|
||||
'Class:IPInterface/Attribute:comment' => '备注',
|
||||
'Class:IPInterface/Attribute:coment+' => '',
|
||||
@@ -1371,7 +1375,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkPhysicalInterfaceToVLAN' => '关联物理网卡/VLAN',
|
||||
'Class:lnkPhysicalInterfaceToVLAN' => '链接 物理网卡/VLAN',
|
||||
'Class:lnkPhysicalInterfaceToVLAN+' => '',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Name' => '%1$s %2$s / %3$s',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_id' => '物理网卡',
|
||||
@@ -1384,7 +1388,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_device_name+' => '',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_id' => 'VLAN',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_id+' => '',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_tag' => 'VLAN 标记',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_tag' => 'VLAN 标签',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_tag+' => '',
|
||||
]);
|
||||
|
||||
@@ -1406,7 +1410,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:FiberChannelInterface' => '光纤接口',
|
||||
'Class:FiberChannelInterface' => '光口',
|
||||
'Class:FiberChannelInterface+' => '',
|
||||
'Class:FiberChannelInterface/Attribute:speed' => '速率',
|
||||
'Class:FiberChannelInterface/Attribute:speed+' => '',
|
||||
@@ -1425,7 +1429,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkConnectableCIToNetworkDevice' => '关联可连接项/网络设备',
|
||||
'Class:lnkConnectableCIToNetworkDevice' => '链接 可连接项/网络设备',
|
||||
'Class:lnkConnectableCIToNetworkDevice+' => '',
|
||||
'Class:lnkConnectableCIToNetworkDevice/Name' => '%1$s / %2$s',
|
||||
'Class:lnkConnectableCIToNetworkDevice/Attribute:networkdevice_id' => '网络设备',
|
||||
@@ -1453,7 +1457,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkApplicationSolutionToFunctionalCI' => '关联应用方案/功能项',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI' => '链接 应用方案/功能项',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI+' => '',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_id' => '应用方案',
|
||||
@@ -1471,7 +1475,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkApplicationSolutionToBusinessProcess' => '关联应用方案/业务流程',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess' => '链接 应用方案/业务流程',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess+' => '',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess/Name' => '%1$s / %2$s',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess/Attribute:businessprocess_id' => '业务流程',
|
||||
@@ -1504,19 +1508,20 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Group/Attribute:status/Value:production+' => '生产',
|
||||
'Class:Group/Attribute:org_id' => '组织',
|
||||
'Class:Group/Attribute:org_id+' => '',
|
||||
'Class:Group/Attribute:owner_name' => '名称',
|
||||
'Class:Group/Attribute:owner_name' => '属主名称',
|
||||
'Class:Group/Attribute:owner_name+' => '通用名称',
|
||||
'Class:Group/Attribute:description' => '描述',
|
||||
'Class:Group/Attribute:description+' => '',
|
||||
'Class:Group/Attribute:type' => '类型',
|
||||
'Class:Group/Attribute:type+' => '',
|
||||
'Class:Group/Attribute:parent_id' => '上级组',
|
||||
'Class:Group/Attribute:parent_id' => '父级配置组',
|
||||
|
||||
'Class:Group/Attribute:parent_id+' => '',
|
||||
'Class:Group/Attribute:parent_name' => '名称',
|
||||
'Class:Group/Attribute:parent_name+' => '',
|
||||
'Class:Group/Attribute:ci_list' => '关联的配置项',
|
||||
'Class:Group/Attribute:ci_list+' => '此组关联的所有配置项',
|
||||
'Class:Group/Attribute:parent_id_friendlyname' => '上级配置组',
|
||||
'Class:Group/Attribute:ci_list' => '相关的配置项',
|
||||
'Class:Group/Attribute:ci_list+' => '此配置组相关的所有配置项',
|
||||
'Class:Group/Attribute:parent_id_friendlyname' => '父级配置组',
|
||||
'Class:Group/Attribute:parent_id_friendlyname+' => '',
|
||||
]);
|
||||
|
||||
@@ -1525,16 +1530,16 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkGroupToCI' => '关联配置组/配置项',
|
||||
'Class:lnkGroupToCI' => '链接 配置组/配置项',
|
||||
'Class:lnkGroupToCI+' => '',
|
||||
'Class:lnkGroupToCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkGroupToCI/Attribute:group_id' => '组',
|
||||
'Class:lnkGroupToCI/Attribute:group_id+' => '',
|
||||
'Class:lnkGroupToCI/Attribute:group_name' => '名称',
|
||||
'Class:lnkGroupToCI/Attribute:group_name' => '配置组名称',
|
||||
'Class:lnkGroupToCI/Attribute:group_name+' => '',
|
||||
'Class:lnkGroupToCI/Attribute:ci_id' => '配置项',
|
||||
'Class:lnkGroupToCI/Attribute:ci_id+' => '',
|
||||
'Class:lnkGroupToCI/Attribute:ci_name' => '名称',
|
||||
'Class:lnkGroupToCI/Attribute:ci_name' => '配置项名称',
|
||||
'Class:lnkGroupToCI/Attribute:ci_name+' => '',
|
||||
'Class:lnkGroupToCI/Attribute:reason' => '原因',
|
||||
'Class:lnkGroupToCI/Attribute:reason+' => '',
|
||||
@@ -1562,7 +1567,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToFunctionalCI' => '关联文档/功能项',
|
||||
'Class:lnkDocumentToFunctionalCI' => '链接 文档/功能项',
|
||||
'Class:lnkDocumentToFunctionalCI+' => '',
|
||||
'Class:lnkDocumentToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_id' => '功能项',
|
||||
@@ -1600,8 +1605,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:Subnet+' => '所有子网',
|
||||
'Menu:NetworkDevice' => '网络设备',
|
||||
'Menu:NetworkDevice+' => '所有网络设备',
|
||||
'Menu:Server' => '服务器',
|
||||
'Menu:Server+' => '所有服务器',
|
||||
'Menu:Server' => '物理机',
|
||||
'Menu:Server+' => '所有物理机',
|
||||
'Menu:Printer' => '打印机',
|
||||
'Menu:Printer+' => '所有打印机',
|
||||
'Menu:MobilePhone' => '手机',
|
||||
@@ -1631,8 +1636,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:PhysicalInterface/Attribute:org_id' => 'Org id~~',
|
||||
'Class:PhysicalInterface/Attribute:org_id+' => '~~',
|
||||
'Class:PhysicalInterface/Attribute:location_id' => 'Location id~~',
|
||||
'Class:PhysicalInterface/Attribute:location_id+' => '~~',
|
||||
'Class:PhysicalInterface/Attribute:org_id' => '组织id',
|
||||
'Class:PhysicalInterface/Attribute:org_id+' => '',
|
||||
'Class:PhysicalInterface/Attribute:location_id' => '位置id',
|
||||
'Class:PhysicalInterface/Attribute:location_id+' => '',
|
||||
]);
|
||||
|
||||
@@ -21,9 +21,10 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ConfigFileEditor' => 'Plain text editor~~',
|
||||
'Menu:ConfigEditor' => '编辑配置文件',
|
||||
|
||||
'Menu:ConfigFileEditor' => '纯文本编辑器',
|
||||
'config-edit-title' => '配置文件编辑器',
|
||||
'config-edit-intro' => '编辑配置文件时请务必格外小心.',
|
||||
'config-apply' => '应用',
|
||||
@@ -36,7 +37,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'config-parse-error' => '第%2$d行: %1$s.<br/>配置文件尚未更新.',
|
||||
'config-current-line' => '正在编辑第%1$s行',
|
||||
'config-saved-warning-db-password' => '保存成功, 但因为数据库密码中包含不支持的字符, 配置文件备份不会成功.',
|
||||
'config-error-transaction' => '错误: 无效的事务编号. 配置<b>没有</b>被更新.',
|
||||
'config-error-transaction' => '错误: 无效的事务id. 配置<b>没有</b>被更新.',
|
||||
'config-error-file-changed' => '错误: 配置文件在您打开以后已被更改, 无法保存. 请刷新并再次保存.',
|
||||
'config-not-allowed-in-demo' => '抱歉, '.ITOP_APPLICATION_SHORT.'处于<b>演示模式</b>: 不能编辑配置文件.',
|
||||
'config-interactive-not-allowed' => ITOP_APPLICATION_SHORT.'交互式配置编辑器已禁用. 请在配置文件中查看 <code>\'config_editor\' => \'disabled\'</code>.',
|
||||
|
||||
@@ -28,10 +28,12 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'itop-core-update:UI:UpdateCoreFiles' => '应用升级',
|
||||
'iTopUpdate:UI:MaintenanceModeActive' => '此应用当前维护中, 不允许任何用户访问. 必须运行安装或恢复归档来使其处于正常模式.',
|
||||
'itop-core-update:UI:UpdateDone' => '应用升级',
|
||||
|
||||
'itop-core-update/Operation:SelectUpdateFile/Title' => '应用升级',
|
||||
'itop-core-update/Operation:ConfirmUpdate/Title' => '请确认升级应用',
|
||||
'itop-core-update/Operation:UpdateCoreFiles/Title' => '应用正在升级',
|
||||
'itop-core-update/Operation:UpdateDone/Title' => '应用升级完毕',
|
||||
|
||||
'iTopUpdate:UI:SelectUpdateFile' => '请选择要上传的升级文件',
|
||||
'iTopUpdate:UI:CheckUpdate' => '校验升级文件',
|
||||
'iTopUpdate:UI:ConfirmInstallFile' => '即将安装 %1$s',
|
||||
@@ -50,19 +52,24 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'iTopUpdate:UI:UploadArchive' => '请选择要上传的软件包',
|
||||
'iTopUpdate:UI:ServerFile' => '服务器上的软件包路径已存在',
|
||||
'iTopUpdate:UI:WarningReadOnlyDuringUpdate' => '升级期间, 应用会变成只读状态.',
|
||||
|
||||
'iTopUpdate:UI:Status' => '状态',
|
||||
'iTopUpdate:UI:Action' => '升级',
|
||||
'iTopUpdate:UI:Setup' => ITOP_APPLICATION_SHORT.'安装',
|
||||
'iTopUpdate:UI:History' => '版本历史',
|
||||
'iTopUpdate:UI:Progress' => '升级进度',
|
||||
|
||||
'iTopUpdate:UI:DoBackup:Label' => '备份文件和数据库',
|
||||
'iTopUpdate:UI:DoBackup:Warning' => '由于磁盘空间不足, 不建议备份',
|
||||
'iTopUpdate:UI:DiskFreeSpace' => '磁盘剩余空间',
|
||||
|
||||
'iTopUpdate:UI:DiskFreeSpace' => '剩余磁盘空间',
|
||||
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.'的磁盘空间',
|
||||
'iTopUpdate:UI:DBDiskSpace' => '数据库的磁盘空间',
|
||||
'iTopUpdate:UI:FileUploadMaxSize' => '文件上传大小上限',
|
||||
'iTopUpdate:UI:PostMaxSize' => 'PHP ini值post_max_size: %1$s',
|
||||
|
||||
'iTopUpdate:UI:PostMaxSize' => 'PHP ini 值 post_max_size: %1$s',
|
||||
'iTopUpdate:UI:UploadMaxFileSize' => 'PHP ini 值 upload_max_filesize: %1$s',
|
||||
|
||||
'iTopUpdate:UI:CanCoreUpdate:Loading' => '正在检查文件',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Error' => '文件检查失败 (%1$s)',
|
||||
'iTopUpdate:UI:CanCoreUpdate:ErrorFileNotExist' => '文件检查失败 (%1$s 文件不存在)',
|
||||
@@ -70,11 +77,12 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'iTopUpdate:UI:CanCoreUpdate:Yes' => '应用可以升级',
|
||||
'iTopUpdate:UI:CanCoreUpdate:No' => '应用无法升级: %1$s',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Warning' => '警告: 应用升级可能失败: %1$s',
|
||||
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>检测到一些文件被修改</b>, 无法进行局部升级.</br>请按照<a target="_blank" href="%2$s">指南</a>一步步操作以手动升级系统. 您必须使用<a href="%1$s">安装</a>已升级应用.',
|
||||
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>检测到一些文件被篡改</b>, 无法进行局部升级.</br>请按照<a target="_blank" href="%2$s">流程</a>一步步操作来手动升级系统. 您必须使用<a href="%1$s">安装向导</a>来升级应用.',
|
||||
'iTopUpdate:UI:CheckInProgress' => '完整性检查中, 请稍候',
|
||||
|
||||
'iTopUpdate:UI:SetupLaunch' => '启动'.ITOP_APPLICATION_SHORT.'安装',
|
||||
'iTopUpdate:UI:SetupLaunchConfirm' => '将启动'.ITOP_APPLICATION_SHORT.'安装, 确定吗?',
|
||||
'iTopUpdate:UI:FastSetupLaunch' => 'Fast Setup~~',
|
||||
'iTopUpdate:UI:FastSetupLaunch' => '快速安装',
|
||||
|
||||
// Setup Messages
|
||||
'iTopUpdate:UI:SetupMessage:Ready' => '准备开始',
|
||||
@@ -101,6 +109,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'iTopUpdate:Error:InvalidToken' => '无效的 token',
|
||||
'iTopUpdate:Error:UpdateFailed' => '升级失败',
|
||||
'iTopUpdate:Error:FileUploadMaxSizeTooSmall' => '上传上限太小. 请调整 PHP 配置.',
|
||||
|
||||
'iTopUpdate:UI:RestoreArchive' => '您可以从归档文件 \'%1$s\' 还原应用程序',
|
||||
'iTopUpdate:UI:RestoreBackup' => '您可以从 \'%1$s\' 还原数据库',
|
||||
'iTopUpdate:UI:UpdateDone' => '升级成功',
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -30,10 +31,12 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Classes in 'bizmodel'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -43,15 +46,17 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: FAQ
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:FAQ' => 'FAQ',
|
||||
'Class:FAQ+' => '常见问题',
|
||||
'Class:FAQ/Attribute:title' => '标题',
|
||||
'Class:FAQ/Attribute:title+' => '',
|
||||
'Class:FAQ/Attribute:summary' => '概要',
|
||||
'Class:FAQ/Attribute:summary' => '摘要',
|
||||
'Class:FAQ/Attribute:summary+' => '',
|
||||
'Class:FAQ/Attribute:description' => '描述',
|
||||
'Class:FAQ/Attribute:description+' => '',
|
||||
@@ -63,7 +68,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:FAQ/Attribute:error_code+' => '',
|
||||
'Class:FAQ/Attribute:key_words' => '关键字',
|
||||
'Class:FAQ/Attribute:key_words+' => '',
|
||||
'Class:FAQ/Attribute:domains' => '范围',
|
||||
'Class:FAQ/Attribute:domains' => '领域',
|
||||
]);
|
||||
|
||||
//
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
// Errors
|
||||
'FilesInformation:Error:MissingFile' => '文件丢失: %1$s',
|
||||
|
||||
@@ -21,24 +21,26 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
// Dictionary entries go here
|
||||
'Menu:iTopHub' => 'iTop Hub',
|
||||
'Menu:iTopHub:Register' => '进入iTop Hub',
|
||||
'Menu:iTopHub:Register+' => '进入iTop Hub 更新您的组件',
|
||||
'Menu:iTopHub:Register:Description' => '<p>进入iTop Hub社区平台!</br>寻找您想要的内容和信息, 管理本机扩展或安装新的扩展.</br><br/>通过这个页面连接到iTop Hub, 本机的信息也会被推送到iTop Hub上.</p>',
|
||||
'Menu:iTopHub:Register' => '进入 iTop Hub',
|
||||
'Menu:iTopHub:Register+' => '进入 iTop Hub 更新您的组件',
|
||||
'Menu:iTopHub:Register:Description' => '<p>进入 iTop Hub 社区平台!</br>寻找您想要的内容和信息, 管理本机扩展或安装新的扩展.</br><br/>通过这个页面连接到 iTop Hub, 本机的信息也会被推送到 iTop Hub上.</p>',
|
||||
'Menu:iTopHub:MyExtensions' => '已安装的扩展',
|
||||
'Menu:iTopHub:MyExtensions+' => '查看本机已安装的扩展',
|
||||
'Menu:iTopHub:BrowseExtensions' => '从iTop Hub获取扩展',
|
||||
'Menu:iTopHub:BrowseExtensions+' => '去iTop Hub浏览更多的扩展',
|
||||
'Menu:iTopHub:BrowseExtensions:Description' => '<p>进入iTop Hub商店, 一站式查找各种iTop扩展的地方 !</br>寻找符合您要求的扩展.</br><br/>通过这个页面连接到iTop Hub, 本机的信息也会被推送到iTop Hub上.</p>',
|
||||
'Menu:iTopHub:BrowseExtensions' => '从 iTop Hub 获取扩展',
|
||||
'Menu:iTopHub:BrowseExtensions+' => '去 iTop Hub 浏览更多的扩展',
|
||||
'Menu:iTopHub:BrowseExtensions:Description' => '<p>进入iTop Hub商店, 一站式查找各种iTop扩展的地方 !</br>寻找符合您要求的扩展.</br><br/>通过这个页面连接到iTop Hub, 本机的信息也会被推送到 iTop Hub上.</p>',
|
||||
'iTopHub:GoBtn' => '进入 iTop Hub',
|
||||
'iTopHub:CloseBtn' => '关闭',
|
||||
'iTopHub:GoBtn:Tooltip' => '跳到 www.itophub.io',
|
||||
'iTopHub:OpenInNewWindow' => '从新窗口打开iTop Hub',
|
||||
'iTopHub:AutoSubmit' => '不再询问. 下次自动进入iTop Hub.',
|
||||
'iTopHub:OpenInNewWindow' => '从新窗口打开 iTop Hub',
|
||||
'iTopHub:AutoSubmit' => '不再询问. 下次自动进入 iTop Hub.',
|
||||
'UI:About:RemoteExtensionSource' => 'iTop Hub',
|
||||
'iTopHub:Explanation' => '点击这个按钮您将被引导至iTop Hub.',
|
||||
'iTopHub:Explanation' => '点击这个按钮您将被引导至 iTop Hub.',
|
||||
|
||||
'iTopHub:BackupFreeDiskSpaceIn' => '%1$s 可用磁盘空间位于 %2$s.',
|
||||
'iTopHub:FailedToCheckFreeDiskSpace' => '检查可用磁盘空间失败.',
|
||||
'iTopHub:BackupOk' => '备份成功.',
|
||||
@@ -48,32 +50,36 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'iTopHub:CompiledOK' => '编译成功.',
|
||||
'iTopHub:ConfigurationSafelyReverted' => '安装时发生错误!<br/>系统配置将不会改变.',
|
||||
'iTopHub:FailAuthent' => '认证失败.',
|
||||
|
||||
'iTopHub:InstalledExtensions' => '本机已安装的扩展',
|
||||
'iTopHub:ExtensionCategory:Manual' => '手动安装的扩展',
|
||||
'iTopHub:ExtensionCategory:Manual+' => '下列已安装的扩展是手动将文件放置到 %1$s 目录的:',
|
||||
'iTopHub:ExtensionCategory:Remote' => '从 iTop Hub 安装的扩展',
|
||||
'iTopHub:ExtensionCategory:Remote+' => '下列已安装的扩展是来自 iTop Hub:',
|
||||
'iTopHub:NoExtensionInThisCategory' => '尚未安装扩展',
|
||||
'iTopHub:NoExtensionInThisCategory+' => '浏览 iTop Hub, 去寻找符合您喜欢的扩展吧.',
|
||||
'iTopHub:NoExtensionInThisCategory+' => '浏览 iTop Hub, 去寻找符合您要求的扩展吧.',
|
||||
'iTopHub:ExtensionNotInstalled' => '未安装',
|
||||
'iTopHub:GetMoreExtensions' => '从 iTop Hub 获取扩展...',
|
||||
|
||||
'iTopHub:LandingWelcome' => '恭喜! 下列来自 iTop Hub 的扩展已被下载并安装到本机.',
|
||||
'iTopHub:GoBackToITopBtn' => '返回'.ITOP_APPLICATION_SHORT,
|
||||
'iTopHub:GoBackToITopBtn' => '返回 '.ITOP_APPLICATION_SHORT,
|
||||
'iTopHub:Uncompressing' => '扩展解压中...',
|
||||
'iTopHub:InstallationWelcome' => '安装来自 iTop Hub 的扩展',
|
||||
'iTopHub:DBBackupLabel' => '本机备份',
|
||||
'iTopHub:DBBackupSentence' => '在升级之前,备份数据库和'.ITOP_APPLICATION_SHORT.'配置文件',
|
||||
'iTopHub:DBBackupSentence' => '在升级之前,备份数据库和 '.ITOP_APPLICATION_SHORT.' 配置文件',
|
||||
'iTopHub:DeployBtn' => '安装!',
|
||||
'iTopHub:DatabaseBackupProgress' => '实例备份...',
|
||||
|
||||
'iTopHub:InstallationEffect:Install' => '版本: %1$s 将被安装.',
|
||||
'iTopHub:InstallationEffect:NoChange' => '版本: %1$s 已安装. 保持不变.',
|
||||
'iTopHub:InstallationEffect:Upgrade' => '将从版本 %1$s <b>升级</b>到版本 %2$s.',
|
||||
'iTopHub:InstallationEffect:Downgrade' => '将从版本 %1$s <b>降级</b>到版本 %2$s.',
|
||||
'iTopHub:InstallationProgress:DatabaseBackup' => ITOP_APPLICATION_SHORT.'实例备份...',
|
||||
'iTopHub:InstallationProgress:DatabaseBackup' => ITOP_APPLICATION_SHORT.' 实例备份...',
|
||||
'iTopHub:InstallationProgress:ExtensionsInstallation' => '安装扩展',
|
||||
'iTopHub:InstallationEffect:MissingDependencies' => '扩展无法安装, 因为未知的依赖.',
|
||||
'iTopHub:InstallationEffect:MissingDependencies_Details' => '此扩展依赖模块: %1$s',
|
||||
'iTopHub:InstallationProgress:InstallationSuccessful' => '安装成功!',
|
||||
|
||||
'iTopHub:InstallationStatus:Installed_Version' => '%1$s 版本: %2$s.',
|
||||
'iTopHub:InstallationStatus:Installed' => '已安装',
|
||||
'iTopHub:InstallationStatus:Version_NotInstalled' => '版本 %1$s <b>未被</b> 安装.',
|
||||
|
||||
@@ -21,23 +21,24 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:IncidentManagement' => '事件管理',
|
||||
'Menu:IncidentManagement+' => '事件管理',
|
||||
'Menu:IncidentManagement+' => '',
|
||||
'Menu:Incident:Overview' => '概况',
|
||||
'Menu:Incident:Overview+' => '概况',
|
||||
'Menu:Incident:Overview+' => '',
|
||||
'Menu:NewIncident' => '新建事件',
|
||||
'Menu:NewIncident+' => '新建事件工单',
|
||||
'Menu:SearchIncidents' => '搜索事件',
|
||||
'Menu:SearchIncidents+' => '搜索事件',
|
||||
'Menu:SearchIncidents+' => '搜索事件工单',
|
||||
'Menu:Incident:Shortcuts' => '快捷方式',
|
||||
'Menu:Incident:Shortcuts+' => '',
|
||||
'Menu:Incident:MyIncidents' => '分配给我的事件',
|
||||
'Menu:Incident:MyIncidents+' => '分配给我的事件',
|
||||
'Menu:Incident:MyIncidents+' => '分配给我的事件(作为代办人)',
|
||||
'Menu:Incident:EscalatedIncidents' => '已升级的事件',
|
||||
'Menu:Incident:EscalatedIncidents+' => '已升级的事件',
|
||||
'Menu:Incident:EscalatedIncidents+' => '',
|
||||
'Menu:Incident:OpenIncidents' => '所有打开的事件',
|
||||
'Menu:Incident:OpenIncidents+' => '所有打开的事件',
|
||||
'Menu:Incident:OpenIncidents+' => '',
|
||||
'UI-IncidentManagementOverview-IncidentByPriority-last-14-days' => '最近两周的事件 (按优先级)',
|
||||
'UI-IncidentManagementOverview-Last-14-days' => '最近两周的事件 (按数量)',
|
||||
'UI-IncidentManagementOverview-OpenIncidentByStatus' => '打开的事件 (按状态)',
|
||||
@@ -72,7 +73,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Incident/Attribute:status/Value:assigned+' => '',
|
||||
'Class:Incident/Attribute:status/Value:escalated_ttr' => '已升级TTR',
|
||||
'Class:Incident/Attribute:status/Value:escalated_ttr+' => '',
|
||||
'Class:Incident/Attribute:status/Value:waiting_for_approval' => '等待批准',
|
||||
'Class:Incident/Attribute:status/Value:waiting_for_approval' => '等待审批',
|
||||
'Class:Incident/Attribute:status/Value:waiting_for_approval+' => '',
|
||||
'Class:Incident/Attribute:status/Value:pending' => '待定',
|
||||
'Class:Incident/Attribute:status/Value:pending+' => '',
|
||||
@@ -81,7 +82,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Incident/Attribute:status/Value:closed' => '已关闭',
|
||||
'Class:Incident/Attribute:status/Value:closed+' => '',
|
||||
'Class:Incident/Attribute:impact' => '影响范围',
|
||||
'Class:Incident/Attribute:impact+' => '事件的影响范围,多少用户受影响',
|
||||
'Class:Incident/Attribute:impact+' => '事件的严重程度, 多少用户受影响',
|
||||
'Class:Incident/Attribute:impact/Value:1' => '部门',
|
||||
'Class:Incident/Attribute:impact/Value:1+' => '',
|
||||
'Class:Incident/Attribute:impact/Value:2' => '服务',
|
||||
@@ -89,39 +90,39 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Incident/Attribute:impact/Value:3' => '个体',
|
||||
'Class:Incident/Attribute:impact/Value:3+' => '',
|
||||
'Class:Incident/Attribute:priority' => '优先级',
|
||||
'Class:Incident/Attribute:priority+' => '哪个工单应该优先处理',
|
||||
'Class:Incident/Attribute:priority/Value:1' => '紧急',
|
||||
'Class:Incident/Attribute:priority/Value:1+' => '紧急',
|
||||
'Class:Incident/Attribute:priority+' => '工单的处理顺序',
|
||||
'Class:Incident/Attribute:priority/Value:1' => '严重',
|
||||
'Class:Incident/Attribute:priority/Value:1+' => '',
|
||||
'Class:Incident/Attribute:priority/Value:2' => '高',
|
||||
'Class:Incident/Attribute:priority/Value:2+' => '高',
|
||||
'Class:Incident/Attribute:priority/Value:2+' => '',
|
||||
'Class:Incident/Attribute:priority/Value:3' => '中',
|
||||
'Class:Incident/Attribute:priority/Value:3+' => '中',
|
||||
'Class:Incident/Attribute:priority/Value:3+' => '',
|
||||
'Class:Incident/Attribute:priority/Value:4' => '低',
|
||||
'Class:Incident/Attribute:priority/Value:4+' => '低',
|
||||
'Class:Incident/Attribute:priority/Value:4+' => '',
|
||||
'Class:Incident/Attribute:urgency' => '紧急度',
|
||||
'Class:Incident/Attribute:urgency+' => '问题应该多快解决',
|
||||
'Class:Incident/Attribute:urgency/Value:1' => '紧急',
|
||||
'Class:Incident/Attribute:urgency/Value:1+' => '紧急',
|
||||
'Class:Incident/Attribute:urgency/Value:1' => '严重',
|
||||
'Class:Incident/Attribute:urgency/Value:1+' => '',
|
||||
'Class:Incident/Attribute:urgency/Value:2' => '高',
|
||||
'Class:Incident/Attribute:urgency/Value:2+' => '高',
|
||||
'Class:Incident/Attribute:urgency/Value:2+' => '',
|
||||
'Class:Incident/Attribute:urgency/Value:3' => '中',
|
||||
'Class:Incident/Attribute:urgency/Value:3+' => '中',
|
||||
'Class:Incident/Attribute:urgency/Value:3+' => '',
|
||||
'Class:Incident/Attribute:urgency/Value:4' => '低',
|
||||
'Class:Incident/Attribute:urgency/Value:4+' => '低',
|
||||
'Class:Incident/Attribute:urgency/Value:4+' => '',
|
||||
'Class:Incident/Attribute:origin' => '来源',
|
||||
'Class:Incident/Attribute:origin+' => '事件工单由谁发起或触发的',
|
||||
'Class:Incident/Attribute:origin+' => '事件工单由什么触发',
|
||||
'Class:Incident/Attribute:origin/Value:in_person' => '当面',
|
||||
'Class:Incident/Attribute:origin/Value:in_person+' => '创建于当面沟通后的事件',
|
||||
'Class:Incident/Attribute:origin/Value:in_person+' => '事件工单由面对面沟通后触发',
|
||||
'Class:Incident/Attribute:origin/Value:chat' => '聊天工具',
|
||||
'Class:Incident/Attribute:origin/Value:chat+' => '创建于聊天工具沟通后的事件',
|
||||
'Class:Incident/Attribute:origin/Value:chat+' => '事件工单由聊天工具沟通后触发',
|
||||
'Class:Incident/Attribute:origin/Value:mail' => '邮件',
|
||||
'Class:Incident/Attribute:origin/Value:mail+' => '邮件',
|
||||
'Class:Incident/Attribute:origin/Value:mail+' => '事件工单由邮件触发',
|
||||
'Class:Incident/Attribute:origin/Value:monitoring' => '监控',
|
||||
'Class:Incident/Attribute:origin/Value:monitoring+' => '监控',
|
||||
'Class:Incident/Attribute:origin/Value:monitoring+' => '事件工单由监控告警触发',
|
||||
'Class:Incident/Attribute:origin/Value:phone' => '电话',
|
||||
'Class:Incident/Attribute:origin/Value:phone+' => '电话',
|
||||
'Class:Incident/Attribute:origin/Value:phone+' => '事件工单由电话触发',
|
||||
'Class:Incident/Attribute:origin/Value:portal' => '门户',
|
||||
'Class:Incident/Attribute:origin/Value:portal+' => '门户',
|
||||
'Class:Incident/Attribute:origin/Value:portal+' => '事件工单由用户门户触发',
|
||||
'Class:Incident/Attribute:service_id' => '服务',
|
||||
'Class:Incident/Attribute:service_id+' => '',
|
||||
'Class:Incident/Attribute:service_name' => '服务名称',
|
||||
@@ -130,7 +131,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Incident/Attribute:servicesubcategory_id+' => '',
|
||||
'Class:Incident/Attribute:servicesubcategory_name' => '子服务名称',
|
||||
'Class:Incident/Attribute:servicesubcategory_name+' => '',
|
||||
'Class:Incident/Attribute:escalation_flag' => '是否升级',
|
||||
'Class:Incident/Attribute:escalation_flag' => '热门标识',
|
||||
'Class:Incident/Attribute:escalation_flag+' => '',
|
||||
'Class:Incident/Attribute:escalation_flag/Value:no' => '否',
|
||||
'Class:Incident/Attribute:escalation_flag/Value:no+' => '否',
|
||||
@@ -166,41 +167,41 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Incident/Attribute:time_spent+' => '',
|
||||
'Class:Incident/Attribute:resolution_code' => '解决方式',
|
||||
'Class:Incident/Attribute:resolution_code+' => '',
|
||||
'Class:Incident/Attribute:resolution_code/Value:assistance' => '外部支持',
|
||||
'Class:Incident/Attribute:resolution_code/Value:assistance+' => '外部支持',
|
||||
'Class:Incident/Attribute:resolution_code/Value:bug fixed' => '缺陷修复',
|
||||
'Class:Incident/Attribute:resolution_code/Value:bug fixed+' => '缺陷修复',
|
||||
'Class:Incident/Attribute:resolution_code/Value:assistance' => '技术支持',
|
||||
'Class:Incident/Attribute:resolution_code/Value:assistance+' => '',
|
||||
'Class:Incident/Attribute:resolution_code/Value:bug fixed' => 'bug 修复',
|
||||
'Class:Incident/Attribute:resolution_code/Value:bug fixed+' => '',
|
||||
'Class:Incident/Attribute:resolution_code/Value:hardware repair' => '硬件维修',
|
||||
'Class:Incident/Attribute:resolution_code/Value:hardware repair+' => '硬件维修',
|
||||
'Class:Incident/Attribute:resolution_code/Value:hardware repair+' => '',
|
||||
'Class:Incident/Attribute:resolution_code/Value:other' => '其它',
|
||||
'Class:Incident/Attribute:resolution_code/Value:other+' => '其它',
|
||||
'Class:Incident/Attribute:resolution_code/Value:other+' => '',
|
||||
'Class:Incident/Attribute:resolution_code/Value:software patch' => '软件补丁',
|
||||
'Class:Incident/Attribute:resolution_code/Value:software patch+' => '软件补丁',
|
||||
'Class:Incident/Attribute:resolution_code/Value:software patch+' => '',
|
||||
'Class:Incident/Attribute:resolution_code/Value:system update' => '系统更新',
|
||||
'Class:Incident/Attribute:resolution_code/Value:system update+' => '系统更新',
|
||||
'Class:Incident/Attribute:resolution_code/Value:system update+' => '',
|
||||
'Class:Incident/Attribute:resolution_code/Value:training' => '培训',
|
||||
'Class:Incident/Attribute:resolution_code/Value:training+' => '培训',
|
||||
'Class:Incident/Attribute:resolution_code/Value:training+' => '',
|
||||
'Class:Incident/Attribute:solution' => '解决方案',
|
||||
'Class:Incident/Attribute:solution+' => '',
|
||||
'Class:Incident/Attribute:pending_reason' => '待定原因',
|
||||
'Class:Incident/Attribute:pending_reason+' => '',
|
||||
'Class:Incident/Attribute:parent_incident_id' => '父级事件',
|
||||
'Class:Incident/Attribute:parent_incident_id+' => '',
|
||||
'Class:Incident/Attribute:parent_incident_ref' => '事件编号',
|
||||
'Class:Incident/Attribute:parent_incident_ref' => '父级事件编号',
|
||||
'Class:Incident/Attribute:parent_incident_ref+' => '',
|
||||
'Class:Incident/Attribute:parent_change_id' => '父级变更',
|
||||
'Class:Incident/Attribute:parent_change_id+' => '',
|
||||
'Class:Incident/Attribute:parent_change_ref' => '变更编号',
|
||||
'Class:Incident/Attribute:parent_change_ref' => '父级变更编号',
|
||||
'Class:Incident/Attribute:parent_change_ref+' => '',
|
||||
'Class:Incident/Attribute:parent_problem_id' => '父级问题',
|
||||
'Class:Incident/Attribute:parent_problem_id+' => '~~',
|
||||
'Class:Incident/Attribute:parent_problem_id+' => '',
|
||||
'Class:Incident/Attribute:parent_problem_ref' => '父级问题编号',
|
||||
'Class:Incident/Attribute:parent_problem_ref+' => '~~',
|
||||
'Class:Incident/Attribute:parent_problem_ref+' => '',
|
||||
'Class:Incident/Attribute:related_request_list' => '相关需求',
|
||||
'Class:Incident/Attribute:related_request_list+' => '此事件相关的所有需求',
|
||||
'Class:Incident/Attribute:child_incidents_list' => '子事件',
|
||||
'Class:Incident/Attribute:child_incidents_list+' => '此事件相关的所有衍生事件',
|
||||
'Class:Incident/Attribute:public_log' => '评论',
|
||||
'Class:Incident/Attribute:child_incidents_list+' => '此事件相关的所有子事件',
|
||||
'Class:Incident/Attribute:public_log' => '公共日志',
|
||||
'Class:Incident/Attribute:public_log+' => '',
|
||||
'Class:Incident/Attribute:user_satisfaction' => '用户满意度',
|
||||
'Class:Incident/Attribute:user_satisfaction+' => '',
|
||||
@@ -214,7 +215,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Incident/Attribute:user_satisfaction/Value:4+' => '非常不满意',
|
||||
'Class:Incident/Attribute:user_comment' => '用户评论',
|
||||
'Class:Incident/Attribute:user_comment+' => '',
|
||||
'Class:Incident/Attribute:parent_incident_id_friendlyname' => '父级事件名称',
|
||||
'Class:Incident/Attribute:parent_incident_id_friendlyname' => '父级事件昵称',
|
||||
'Class:Incident/Attribute:parent_incident_id_friendlyname+' => '',
|
||||
'Class:Incident/Stimulus:ev_assign' => '分配',
|
||||
'Class:Incident/Stimulus:ev_assign+' => '',
|
||||
@@ -235,7 +236,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Incident/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:Incident/Stimulus:ev_reopen+' => '',
|
||||
'Class:Incident/Error:CannotAssignParentIncidentIdToSelf' => '无法分配父级事件给自己',
|
||||
|
||||
'Class:Incident/Method:ResolveChildTickets' => '解决子工单',
|
||||
'Class:Incident/Method:ResolveChildTickets+' => '递归解决子工单 (自动解决), 并调整相关字段与父级工单保持一致: 服务, 团队, 办理人, 解决方案',
|
||||
'Tickets:Related:OpenIncidents' => '打开的事件',
|
||||
'Tickets:Related:OpenIncidents' => '待处理的事件',
|
||||
]);
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -30,10 +31,12 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Classes in 'bizmodel'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -43,9 +46,11 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: KnownError
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:KnownError' => '已知错误',
|
||||
'Class:KnownError+' => '记录一个已知错误',
|
||||
@@ -69,7 +74,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:KnownError/Attribute:solution+' => '',
|
||||
'Class:KnownError/Attribute:error_code' => '错误编码',
|
||||
'Class:KnownError/Attribute:error_code+' => '',
|
||||
'Class:KnownError/Attribute:domain' => '类型',
|
||||
'Class:KnownError/Attribute:domain' => '领域',
|
||||
'Class:KnownError/Attribute:domain+' => '',
|
||||
'Class:KnownError/Attribute:domain/Value:Application' => '应用',
|
||||
'Class:KnownError/Attribute:domain/Value:Application+' => '应用',
|
||||
@@ -77,8 +82,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:KnownError/Attribute:domain/Value:Desktop+' => '桌面',
|
||||
'Class:KnownError/Attribute:domain/Value:Network' => '网络',
|
||||
'Class:KnownError/Attribute:domain/Value:Network+' => '网络',
|
||||
'Class:KnownError/Attribute:domain/Value:Server' => '服务器',
|
||||
'Class:KnownError/Attribute:domain/Value:Server+' => '服务器',
|
||||
'Class:KnownError/Attribute:domain/Value:Server' => '物理机',
|
||||
'Class:KnownError/Attribute:domain/Value:Server+' => '物理机',
|
||||
'Class:KnownError/Attribute:vendor' => '厂商',
|
||||
'Class:KnownError/Attribute:vendor+' => '',
|
||||
'Class:KnownError/Attribute:model' => '型号',
|
||||
@@ -96,8 +101,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkErrorToFunctionalCI' => '关联已知问题/功能配置项',
|
||||
'Class:lnkErrorToFunctionalCI+' => '已知问题和功能配置项之间的关联',
|
||||
'Class:lnkErrorToFunctionalCI' => '链接 已知问题/功能配置项',
|
||||
'Class:lnkErrorToFunctionalCI+' => '已知问题和功能配置项之间的链接',
|
||||
'Class:lnkErrorToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id' => '配置项',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id+' => '',
|
||||
@@ -116,8 +121,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToError' => '关联文档/已知问题',
|
||||
'Class:lnkDocumentToError+' => '文档和已知问题之间的关联',
|
||||
'Class:lnkDocumentToError' => '链接 文档/已知问题',
|
||||
'Class:lnkDocumentToError+' => '文档和已知问题之间的链接',
|
||||
'Class:lnkDocumentToError/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToError/Attribute:document_id' => '文档',
|
||||
'Class:lnkDocumentToError/Attribute:document_id+' => '',
|
||||
@@ -127,7 +132,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToError/Attribute:error_id+' => '',
|
||||
'Class:lnkDocumentToError/Attribute:error_name' => '已知问题名称',
|
||||
'Class:lnkDocumentToError/Attribute:error_name+' => '',
|
||||
'Class:lnkDocumentToError/Attribute:link_type' => '关联类型',
|
||||
'Class:lnkDocumentToError/Attribute:link_type' => '链接类型',
|
||||
'Class:lnkDocumentToError/Attribute:link_type+' => '',
|
||||
]);
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
@@ -18,6 +17,7 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
// Portal
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Page:DefaultTitle' => '%1$s 用户门户',
|
||||
@@ -38,18 +38,18 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Error:HTTP:400' => '请求错误',
|
||||
'Error:HTTP:401' => '认证错误',
|
||||
'Error:HTTP:404' => '页面找不到',
|
||||
'Error:HTTP:500' => '啊! 发生了错误.',
|
||||
'Error:HTTP:500' => '哦哦! 发生了报错.',
|
||||
'Error:HTTP:GetHelp' => '如果问题仍然存在,请联系管理员.',
|
||||
'Error:XHR:Fail' => '无法加载数据, 请联系管理员',
|
||||
'Portal:ErrorUserLoggedOut' => '您已退出,请重新登录.',
|
||||
'Portal:Datatables:Language:Processing' => '请稍候...',
|
||||
'Portal:Datatables:Language:Search' => '筛选器:',
|
||||
'Portal:Datatables:Language:LengthMenu' => '每页显示 _MENU_ 项',
|
||||
'Portal:Datatables:Language:ZeroRecords' => '没有结果',
|
||||
'Portal:Datatables:Language:ZeroRecords' => '没有可显示的结果',
|
||||
'Portal:Datatables:Language:Info' => '第 _PAGE_ 页,共 _PAGES_ 页',
|
||||
'Portal:Datatables:Language:InfoEmpty' => '没有信息',
|
||||
'Portal:Datatables:Language:InfoFiltered' => '最多筛选 _MAX_ 项',
|
||||
'Portal:Datatables:Language:EmptyTable' => '表格中没有数据',
|
||||
'Portal:Datatables:Language:EmptyTable' => '暂无数据',
|
||||
'Portal:Datatables:Language:DisplayLength:All' => '全部',
|
||||
'Portal:Datatables:Language:Paginate:First' => '首页',
|
||||
'Portal:Datatables:Language:Paginate:Previous' => '上一页',
|
||||
@@ -57,7 +57,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Portal:Datatables:Language:Paginate:Last' => '尾页',
|
||||
'Portal:Datatables:Language:Sort:Ascending' => '升序',
|
||||
'Portal:Datatables:Language:Sort:Descending' => '降序',
|
||||
'Portal:Autocomplete:NoResult' => '没有数据',
|
||||
'Portal:Autocomplete:NoResult' => '没有可显示的数据',
|
||||
'Portal:Attachments:DropZone:Message' => '把文件添加为附件',
|
||||
'Portal:File:None' => '没有文件',
|
||||
'Portal:File:DisplayInfo' => '<a href="%2$s" class="file_download_link">%1$s</a>',
|
||||
@@ -71,7 +71,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Portal:Form:Close:Warning' => '确定要离开表单吗? 已输入数据会丢失',
|
||||
'Portal:Error:ObjectCannotBeCreated' => '错误: 无法创建对象. 请在再次提交表单前检查相关对象和附件.',
|
||||
'Portal:Error:ObjectCannotBeUpdated' => '错误: 无法更新对象. 请在再次提交表单前检查相关对象和附件.',
|
||||
'Portal:Error:CheckToWriteFailed' => 'Error during validation of field \'%1$s\': %2$s~~',
|
||||
'Portal:Error:CheckToWriteFailed' => '字段 \'%1$s\' 校验时发生错误: %2$s',
|
||||
]);
|
||||
|
||||
// UserProfile brick
|
||||
@@ -84,7 +84,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Brick:Portal:UserProfile:Password:ConfirmPassword' => '确认密码',
|
||||
'Brick:Portal:UserProfile:Password:CantChangeContactAdministrator' => '要修改密码, 请联系管理员',
|
||||
'Brick:Portal:UserProfile:Password:CantChangeForUnknownReason' => '无法修改密码, 请联系管理员',
|
||||
'Brick:Portal:UserProfile:PersonalInformations:Title' => '人员信息',
|
||||
'Brick:Portal:UserProfile:PersonalInformations:Title' => '个体信息',
|
||||
'Brick:Portal:UserProfile:Photo:Title' => '头像',
|
||||
]);
|
||||
|
||||
@@ -106,18 +106,18 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Brick:Portal:Browse:Action:CreateObjectFromThis' => '新建 %1$s',
|
||||
'Brick:Portal:Browse:Tree:ExpandAll' => '全部展开',
|
||||
'Brick:Portal:Browse:Tree:CollapseAll' => '全部收起',
|
||||
'Brick:Portal:Browse:Filter:NoData' => '没有项目',
|
||||
'Brick:Portal:Browse:Filter:NoData' => '暂无数据',
|
||||
]);
|
||||
|
||||
// ManageBrick brick
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Brick:Portal:Manage:Name' => '管理项目',
|
||||
'Brick:Portal:Manage:Table:NoData' => '没有项目.',
|
||||
'Brick:Portal:Manage:Table:NoData' => '暂无数据.',
|
||||
'Brick:Portal:Manage:Table:ItemActions' => '操作',
|
||||
'Brick:Portal:Manage:DisplayMode:list' => '列表',
|
||||
'Brick:Portal:Manage:DisplayMode:pie-chart' => '饼图',
|
||||
'Brick:Portal:Manage:DisplayMode:pie-chart' => '饼状图',
|
||||
'Brick:Portal:Manage:DisplayMode:bar-chart' => '条形图',
|
||||
'Brick:Portal:Manage:Others' => 'Others',
|
||||
'Brick:Portal:Manage:Others' => '其它',
|
||||
'Brick:Portal:Manage:All' => '全部',
|
||||
'Brick:Portal:Manage:Group' => '分组',
|
||||
'Brick:Portal:Manage:fct:count' => '个数',
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1148,6 +1148,14 @@ table .group-actions .item-action-wrapper .panel-body > p:last-child{
|
||||
@extend .ck-content;
|
||||
}
|
||||
|
||||
.ck-source-editing-area {
|
||||
height: 180px;
|
||||
textarea {
|
||||
// Unset bootstrap inherit on textarea element
|
||||
font: unset;
|
||||
}
|
||||
}
|
||||
|
||||
.form_field_label > .control-label[data-tooltip-instantiated="true"] {
|
||||
&::after {
|
||||
content: "?";
|
||||
|
||||
@@ -17,10 +17,11 @@
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
* @author Benjamin Planque <benjamin.planque@combodo.com>
|
||||
* @author Benjamin Planque <benjamin.planque@combodo.com>
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Note: The classes have been grouped by categories: bizmodel
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
@@ -28,20 +29,21 @@
|
||||
// Classes in 'bizmodel'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'portal:itop-portal' => '标准门户', // This is the portal name that will be displayed in portal dispatcher (eg. URL in menus)
|
||||
'Page:DefaultTitle' => '%1$s - 用户门户',
|
||||
'Brick:Portal:UserProfile:Title' => '我的设置',
|
||||
'Brick:Portal:UserProfile:Title' => '我的资料',
|
||||
'Brick:Portal:NewRequest:Title' => '新建工单',
|
||||
'Brick:Portal:NewRequest:Title+' => '<p>需要帮助?</p><p>选择子服务, 然后提交工单给我们的支持团队.</p>',
|
||||
'Brick:Portal:NewRequest:Title+' => '<p>需要帮助?</p><p>请选择服务目录并提交工单给我们的支持团队.</p>',
|
||||
'Brick:Portal:OngoingRequests:Title' => '正在处理的工单',
|
||||
'Brick:Portal:OngoingRequests:Title+' => '<p>跟踪正在处理的工单.</p><p>查询进度, 添加评论, 添加附件, 确认解决方案.</p>',
|
||||
'Brick:Portal:OngoingRequests:Tab:OnGoing' => '正在处理',
|
||||
'Brick:Portal:OngoingRequests:Tab:Resolved' => '已解决',
|
||||
'Brick:Portal:ClosedRequests:Title' => '已关闭的工单',
|
||||
'Brick:Portal:ListAllRequests:Title' => 'All requests~~',
|
||||
'Brick:Portal:ListAllRequests:Title+' => '<p>View all requests regardless of their status.</p>~~',
|
||||
'Brick:Portal:ListAllRequests:Tab' => 'On-going and closed~~',
|
||||
'Brick:Portal:SearchInAllRequests:Title' => 'Search in all requests~~',
|
||||
'Brick:Portal:SearchInAllRequests:Title+' => '<p>Regardless of their status.</p>~~',
|
||||
'Brick:Portal:ListAllRequests:Title' => '所有工单',
|
||||
'Brick:Portal:ListAllRequests:Title+' => '<p>查看所有工单,不论状态如何.</p>',
|
||||
'Brick:Portal:ListAllRequests:Tab' => '正在处理和已关闭',
|
||||
'Brick:Portal:SearchInAllRequests:Title' => '搜索所有工单',
|
||||
'Brick:Portal:SearchInAllRequests:Title+' => '<p>不论状态如何.</p>',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -30,10 +31,12 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Classes in 'bizmodel'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -43,6 +46,7 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ProblemManagement' => '问题管理',
|
||||
'Menu:ProblemManagement+' => '问题管理',
|
||||
@@ -53,8 +57,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:SearchProblems' => '搜索问题',
|
||||
'Menu:SearchProblems+' => '搜索问题',
|
||||
'Menu:Problem:Shortcuts' => '快捷方式',
|
||||
'Menu:Problem:MyProblems' => '我的问题',
|
||||
'Menu:Problem:MyProblems+' => '我的问题',
|
||||
'Menu:Problem:MyProblems' => '分配给我的问题',
|
||||
'Menu:Problem:MyProblems+' => '分配给我的问题',
|
||||
'Menu:Problem:OpenProblems' => '所有打开的问题',
|
||||
'Menu:Problem:OpenProblems+' => '所有打开的问题',
|
||||
'UI-ProblemManagementOverview-ProblemByService' => '按服务划分的问题',
|
||||
@@ -103,25 +107,25 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Problem/Attribute:impact/Value:3' => '个体',
|
||||
'Class:Problem/Attribute:impact/Value:3+' => '',
|
||||
'Class:Problem/Attribute:urgency' => '紧急度',
|
||||
'Class:Problem/Attribute:urgency+' => '问题得多快解决',
|
||||
'Class:Problem/Attribute:urgency/Value:1' => '紧急',
|
||||
'Class:Problem/Attribute:urgency/Value:1+' => '紧急',
|
||||
'Class:Problem/Attribute:urgency+' => '问题应该多快解决',
|
||||
'Class:Problem/Attribute:urgency/Value:1' => '严重',
|
||||
'Class:Problem/Attribute:urgency/Value:1+' => '',
|
||||
'Class:Problem/Attribute:urgency/Value:2' => '高',
|
||||
'Class:Problem/Attribute:urgency/Value:2+' => '高',
|
||||
'Class:Problem/Attribute:urgency/Value:2+' => '',
|
||||
'Class:Problem/Attribute:urgency/Value:3' => '中',
|
||||
'Class:Problem/Attribute:urgency/Value:3+' => '中',
|
||||
'Class:Problem/Attribute:urgency/Value:3+' => '',
|
||||
'Class:Problem/Attribute:urgency/Value:4' => '低',
|
||||
'Class:Problem/Attribute:urgency/Value:4+' => '低',
|
||||
'Class:Problem/Attribute:urgency/Value:4+' => '',
|
||||
'Class:Problem/Attribute:priority' => '优先级',
|
||||
'Class:Problem/Attribute:priority+' => '优先处理哪个问题',
|
||||
'Class:Problem/Attribute:priority/Value:1' => '紧急',
|
||||
'Class:Problem/Attribute:priority/Value:1+' => '紧急',
|
||||
'Class:Problem/Attribute:priority/Value:1' => '严重',
|
||||
'Class:Problem/Attribute:priority/Value:1+' => '',
|
||||
'Class:Problem/Attribute:priority/Value:2' => '高',
|
||||
'Class:Problem/Attribute:priority/Value:2+' => '高',
|
||||
'Class:Problem/Attribute:priority/Value:2+' => '',
|
||||
'Class:Problem/Attribute:priority/Value:3' => '中',
|
||||
'Class:Problem/Attribute:priority/Value:3+' => '中',
|
||||
'Class:Problem/Attribute:priority/Value:3+' => '',
|
||||
'Class:Problem/Attribute:priority/Value:4' => '低',
|
||||
'Class:Problem/Attribute:priority/Value:4+' => '低',
|
||||
'Class:Problem/Attribute:priority/Value:4+' => '',
|
||||
'Class:Problem/Attribute:related_change_id' => '相关变更',
|
||||
'Class:Problem/Attribute:related_change_id+' => '',
|
||||
'Class:Problem/Attribute:related_change_ref' => '变更编号',
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:RequestManagement' => '服务台',
|
||||
'Menu:RequestManagement+' => '',
|
||||
@@ -13,10 +14,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:UserRequest:Provider+' => '',
|
||||
'Menu:UserRequest:Overview' => '概况',
|
||||
'Menu:UserRequest:Overview+' => '',
|
||||
'Menu:NewUserRequest' => '新建用户需求',
|
||||
'Menu:NewUserRequest+' => '新建用户需求工单',
|
||||
'Menu:SearchUserRequests' => '搜索用户需求',
|
||||
'Menu:SearchUserRequests+' => '搜索用户需求',
|
||||
'Menu:NewUserRequest' => '新建需求',
|
||||
'Menu:NewUserRequest+' => '新建需求工单',
|
||||
'Menu:SearchUserRequests' => '搜索需求',
|
||||
'Menu:SearchUserRequests+' => '搜索需求',
|
||||
'Menu:UserRequest:Shortcuts' => '快捷方式',
|
||||
'Menu:UserRequest:Shortcuts+' => '',
|
||||
'Menu:UserRequest:MyRequests' => '分配给我的需求',
|
||||
@@ -35,7 +36,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI-RequestManagementOverview-OpenRequestByType' => '打开的需求 (按类型)',
|
||||
'UI-RequestManagementOverview-OpenRequestByCustomer' => '打开的需求 (按客户)',
|
||||
'Class:UserRequest:KnownErrorList' => '已知错误',
|
||||
'Class:UserRequest:KnownErrorList+' => '和当前工单关联的功能配置项相关的已知错误',
|
||||
'Class:UserRequest:KnownErrorList+' => '链接到当前工单相关的功能配置项的已知错误',
|
||||
]);
|
||||
|
||||
// Dictionnay conventions
|
||||
@@ -53,7 +54,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest' => '用户需求',
|
||||
'Class:UserRequest' => '需求',
|
||||
'Class:UserRequest+' => '',
|
||||
'Class:UserRequest/Attribute:status' => '状态',
|
||||
'Class:UserRequest/Attribute:status+' => '',
|
||||
@@ -65,9 +66,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Attribute:status/Value:assigned+' => '',
|
||||
'Class:UserRequest/Attribute:status/Value:escalated_ttr' => '已升级TTR',
|
||||
'Class:UserRequest/Attribute:status/Value:escalated_ttr+' => '',
|
||||
'Class:UserRequest/Attribute:status/Value:waiting_for_approval' => '等待批准',
|
||||
'Class:UserRequest/Attribute:status/Value:waiting_for_approval' => '等待审批',
|
||||
'Class:UserRequest/Attribute:status/Value:waiting_for_approval+' => '',
|
||||
'Class:UserRequest/Attribute:status/Value:approved' => '已批准',
|
||||
'Class:UserRequest/Attribute:status/Value:approved' => '已审批',
|
||||
'Class:UserRequest/Attribute:status/Value:approved+' => '',
|
||||
'Class:UserRequest/Attribute:status/Value:rejected' => '已驳回',
|
||||
'Class:UserRequest/Attribute:status/Value:rejected+' => '',
|
||||
@@ -91,24 +92,24 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Attribute:impact/Value:3+' => '',
|
||||
'Class:UserRequest/Attribute:priority' => '优先级',
|
||||
'Class:UserRequest/Attribute:priority+' => '',
|
||||
'Class:UserRequest/Attribute:priority/Value:1' => '紧急',
|
||||
'Class:UserRequest/Attribute:priority/Value:1+' => '紧急',
|
||||
'Class:UserRequest/Attribute:priority/Value:1' => '严重',
|
||||
'Class:UserRequest/Attribute:priority/Value:1+' => '最高优先级',
|
||||
'Class:UserRequest/Attribute:priority/Value:2' => '高',
|
||||
'Class:UserRequest/Attribute:priority/Value:2+' => '高',
|
||||
'Class:UserRequest/Attribute:priority/Value:2+' => '',
|
||||
'Class:UserRequest/Attribute:priority/Value:3' => '中',
|
||||
'Class:UserRequest/Attribute:priority/Value:3+' => '中',
|
||||
'Class:UserRequest/Attribute:priority/Value:3+' => '',
|
||||
'Class:UserRequest/Attribute:priority/Value:4' => '低',
|
||||
'Class:UserRequest/Attribute:priority/Value:4+' => '低',
|
||||
'Class:UserRequest/Attribute:priority/Value:4+' => '最低优先级',
|
||||
'Class:UserRequest/Attribute:urgency' => '紧急度',
|
||||
'Class:UserRequest/Attribute:urgency+' => '',
|
||||
'Class:UserRequest/Attribute:urgency/Value:1' => '紧急',
|
||||
'Class:UserRequest/Attribute:urgency/Value:1+' => '紧急',
|
||||
'Class:UserRequest/Attribute:urgency/Value:1' => '严重',
|
||||
'Class:UserRequest/Attribute:urgency/Value:1+' => '最高紧急性',
|
||||
'Class:UserRequest/Attribute:urgency/Value:2' => '高',
|
||||
'Class:UserRequest/Attribute:urgency/Value:2+' => '高',
|
||||
'Class:UserRequest/Attribute:urgency/Value:2+' => '',
|
||||
'Class:UserRequest/Attribute:urgency/Value:3' => '中',
|
||||
'Class:UserRequest/Attribute:urgency/Value:3+' => '中',
|
||||
'Class:UserRequest/Attribute:urgency/Value:3+' => '',
|
||||
'Class:UserRequest/Attribute:urgency/Value:4' => '低',
|
||||
'Class:UserRequest/Attribute:urgency/Value:4+' => '低',
|
||||
'Class:UserRequest/Attribute:urgency/Value:4+' => '最低紧急性',
|
||||
'Class:UserRequest/Attribute:origin' => '来自',
|
||||
'Class:UserRequest/Attribute:origin+' => '',
|
||||
'Class:UserRequest/Attribute:origin/Value:in_person' => '当面',
|
||||
@@ -123,7 +124,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Attribute:origin/Value:phone+' => '通过电话收到的需求',
|
||||
'Class:UserRequest/Attribute:origin/Value:portal' => '门户',
|
||||
'Class:UserRequest/Attribute:origin/Value:portal+' => '通过门户收到的需求',
|
||||
'Class:UserRequest/Attribute:approver_id' => '批准人',
|
||||
'Class:UserRequest/Attribute:approver_id' => '审批人',
|
||||
'Class:UserRequest/Attribute:approver_id+' => '',
|
||||
'Class:UserRequest/Attribute:approver_email' => '邮箱',
|
||||
'Class:UserRequest/Attribute:approver_email+' => '',
|
||||
@@ -135,7 +136,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Attribute:servicesubcategory_id+' => '',
|
||||
'Class:UserRequest/Attribute:servicesubcategory_name' => '子服务名称',
|
||||
'Class:UserRequest/Attribute:servicesubcategory_name+' => '',
|
||||
'Class:UserRequest/Attribute:escalation_flag' => '升级标签',
|
||||
'Class:UserRequest/Attribute:escalation_flag' => '热门标识',
|
||||
'Class:UserRequest/Attribute:escalation_flag+' => '',
|
||||
'Class:UserRequest/Attribute:escalation_flag/Value:no' => '否',
|
||||
'Class:UserRequest/Attribute:escalation_flag/Value:no+' => '否',
|
||||
@@ -204,10 +205,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Attribute:parent_change_ref' => '变更编号',
|
||||
'Class:UserRequest/Attribute:parent_change_ref+' => '',
|
||||
'Class:UserRequest/Attribute:parent_incident_ref' => '父级事件编号',
|
||||
'Class:UserRequest/Attribute:parent_incident_ref+' => '~~',
|
||||
'Class:UserRequest/Attribute:parent_incident_ref+' => '',
|
||||
'Class:UserRequest/Attribute:related_request_list' => '子需求',
|
||||
'Class:UserRequest/Attribute:related_request_list+' => '此父级需求相关的所有衍生需求',
|
||||
'Class:UserRequest/Attribute:public_log' => '评论',
|
||||
'Class:UserRequest/Attribute:related_request_list+' => '所有链接到此需求的需求',
|
||||
'Class:UserRequest/Attribute:public_log' => '公共日志',
|
||||
'Class:UserRequest/Attribute:public_log+' => '',
|
||||
'Class:UserRequest/Attribute:user_satisfaction' => '用户满意度',
|
||||
'Class:UserRequest/Attribute:user_satisfaction+' => '',
|
||||
@@ -221,7 +222,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Attribute:user_satisfaction/Value:4+' => '非常不满意',
|
||||
'Class:UserRequest/Attribute:user_comment' => '用户评论',
|
||||
'Class:UserRequest/Attribute:user_comment+' => '',
|
||||
'Class:UserRequest/Attribute:parent_request_id_friendlyname' => 'parent_request_id_friendlyname',
|
||||
'Class:UserRequest/Attribute:parent_request_id_friendlyname' => '父级需求昵称',
|
||||
'Class:UserRequest/Attribute:parent_request_id_friendlyname+' => '',
|
||||
'Class:UserRequest/Stimulus:ev_assign' => '分配',
|
||||
'Class:UserRequest/Stimulus:ev_assign+' => '',
|
||||
@@ -245,15 +246,16 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Stimulus:ev_close+' => '',
|
||||
'Class:UserRequest/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:UserRequest/Stimulus:ev_reopen+' => '',
|
||||
'Class:UserRequest/Stimulus:ev_wait_for_approval' => '等待批准',
|
||||
'Class:UserRequest/Stimulus:ev_wait_for_approval' => '等待审批',
|
||||
'Class:UserRequest/Stimulus:ev_wait_for_approval+' => '',
|
||||
'Class:UserRequest/Error:CannotAssignParentRequestIdToSelf' => '无法分配父级需求给自己',
|
||||
|
||||
'Class:UserRequest/Method:ResolveChildTickets' => '解决子工单',
|
||||
'Class:UserRequest/Method:ResolveChildTickets+' => '递归解决子工单 (自动解决), 并调整相关字段与父级工单保持一致: 服务, 团队, 办理人, 解决方案信息',
|
||||
]);
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Organization:Overview:UserRequests' => '此组织的所有用户需求',
|
||||
'Organization:Overview:MyUserRequests' => '我在此组织发起的需求',
|
||||
'Organization:Overview:Tickets' => '此组织内的所有工单',
|
||||
'Organization:Overview:UserRequests' => '来自此组织的需求',
|
||||
'Organization:Overview:MyUserRequests' => '我在此组织的需求',
|
||||
'Organization:Overview:Tickets' => '来自此组织内的工单',
|
||||
]);
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:RequestManagement' => '服务台',
|
||||
'Menu:RequestManagement+' => '',
|
||||
@@ -13,10 +14,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:UserRequest:Provider+' => '',
|
||||
'Menu:UserRequest:Overview' => '概况',
|
||||
'Menu:UserRequest:Overview+' => '',
|
||||
'Menu:NewUserRequest' => '新建用户需求',
|
||||
'Menu:NewUserRequest+' => '新建用户需求工单',
|
||||
'Menu:SearchUserRequests' => '搜索用户需求',
|
||||
'Menu:SearchUserRequests+' => '搜索用户需求',
|
||||
'Menu:NewUserRequest' => '新建需求',
|
||||
'Menu:NewUserRequest+' => '新建需求工单',
|
||||
'Menu:SearchUserRequests' => '搜索需求',
|
||||
'Menu:SearchUserRequests+' => '搜索需求',
|
||||
'Menu:UserRequest:Shortcuts' => '快捷方式',
|
||||
'Menu:UserRequest:Shortcuts+' => '',
|
||||
'Menu:UserRequest:MyRequests' => '分配给我的需求',
|
||||
@@ -35,7 +36,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI-RequestManagementOverview-OpenRequestByType' => '打开的需求 (按类型)',
|
||||
'UI-RequestManagementOverview-OpenRequestByCustomer' => '打开的需求 (按客户)',
|
||||
'Class:UserRequest:KnownErrorList' => '已知错误',
|
||||
'Class:UserRequest:KnownErrorList+' => '和当前工单关联的功能配置项相关的已知错误',
|
||||
'Class:UserRequest:KnownErrorList+' => '链接到当前工单相关功能配置项的已知错误',
|
||||
'Menu:UserRequest:MyWorkOrders' => '分配给我的工作任务',
|
||||
'Menu:UserRequest:MyWorkOrders+' => '分配给我的所有工单',
|
||||
'Class:Problem:KnownProblemList' => '已知问题',
|
||||
@@ -57,7 +58,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest' => '用户需求',
|
||||
'Class:UserRequest' => '需求',
|
||||
'Class:UserRequest+' => '',
|
||||
'Class:UserRequest/Attribute:status' => '状态',
|
||||
'Class:UserRequest/Attribute:status+' => '',
|
||||
@@ -69,9 +70,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Attribute:status/Value:assigned+' => '',
|
||||
'Class:UserRequest/Attribute:status/Value:escalated_ttr' => '已升级TTR',
|
||||
'Class:UserRequest/Attribute:status/Value:escalated_ttr+' => '',
|
||||
'Class:UserRequest/Attribute:status/Value:waiting_for_approval' => '等待批准',
|
||||
'Class:UserRequest/Attribute:status/Value:waiting_for_approval' => '等待审批',
|
||||
'Class:UserRequest/Attribute:status/Value:waiting_for_approval+' => '',
|
||||
'Class:UserRequest/Attribute:status/Value:approved' => '已批准',
|
||||
'Class:UserRequest/Attribute:status/Value:approved' => '已审批',
|
||||
'Class:UserRequest/Attribute:status/Value:approved+' => '',
|
||||
'Class:UserRequest/Attribute:status/Value:rejected' => '已驳回',
|
||||
'Class:UserRequest/Attribute:status/Value:rejected+' => '',
|
||||
@@ -97,24 +98,24 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Attribute:impact/Value:3+' => '',
|
||||
'Class:UserRequest/Attribute:priority' => '优先级',
|
||||
'Class:UserRequest/Attribute:priority+' => '',
|
||||
'Class:UserRequest/Attribute:priority/Value:1' => '紧急',
|
||||
'Class:UserRequest/Attribute:priority/Value:1+' => '紧急',
|
||||
'Class:UserRequest/Attribute:priority/Value:1' => '严重',
|
||||
'Class:UserRequest/Attribute:priority/Value:1+' => '最高优先级',
|
||||
'Class:UserRequest/Attribute:priority/Value:2' => '高',
|
||||
'Class:UserRequest/Attribute:priority/Value:2+' => '高',
|
||||
'Class:UserRequest/Attribute:priority/Value:2+' => '',
|
||||
'Class:UserRequest/Attribute:priority/Value:3' => '中',
|
||||
'Class:UserRequest/Attribute:priority/Value:3+' => '中',
|
||||
'Class:UserRequest/Attribute:priority/Value:3+' => '',
|
||||
'Class:UserRequest/Attribute:priority/Value:4' => '低',
|
||||
'Class:UserRequest/Attribute:priority/Value:4+' => '低',
|
||||
'Class:UserRequest/Attribute:priority/Value:4+' => '最低优先级',
|
||||
'Class:UserRequest/Attribute:urgency' => '紧急度',
|
||||
'Class:UserRequest/Attribute:urgency+' => '',
|
||||
'Class:UserRequest/Attribute:urgency/Value:1' => '紧急',
|
||||
'Class:UserRequest/Attribute:urgency/Value:1+' => '紧急',
|
||||
'Class:UserRequest/Attribute:urgency+' => '问题应该多快解决',
|
||||
'Class:UserRequest/Attribute:urgency/Value:1' => '严重',
|
||||
'Class:UserRequest/Attribute:urgency/Value:1+' => '最高紧急性',
|
||||
'Class:UserRequest/Attribute:urgency/Value:2' => '高',
|
||||
'Class:UserRequest/Attribute:urgency/Value:2+' => '高',
|
||||
'Class:UserRequest/Attribute:urgency/Value:2+' => '',
|
||||
'Class:UserRequest/Attribute:urgency/Value:3' => '中',
|
||||
'Class:UserRequest/Attribute:urgency/Value:3+' => '中',
|
||||
'Class:UserRequest/Attribute:urgency/Value:3+' => '',
|
||||
'Class:UserRequest/Attribute:urgency/Value:4' => '低',
|
||||
'Class:UserRequest/Attribute:urgency/Value:4+' => '低',
|
||||
'Class:UserRequest/Attribute:urgency/Value:4+' => '最低紧急性',
|
||||
'Class:UserRequest/Attribute:origin' => '来源',
|
||||
'Class:UserRequest/Attribute:origin+' => '工单创建由什么触发',
|
||||
'Class:UserRequest/Attribute:origin/Value:in_person' => '当面',
|
||||
@@ -128,7 +129,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Attribute:origin/Value:phone' => '电话',
|
||||
'Class:UserRequest/Attribute:origin/Value:phone+' => '电话',
|
||||
'Class:UserRequest/Attribute:origin/Value:portal' => '门户',
|
||||
'Class:UserRequest/Attribute:origin/Value:portal+' => 'Request created on the user portal~~',
|
||||
'Class:UserRequest/Attribute:origin/Value:portal+' => '在用户门户创建的需求',
|
||||
'Class:UserRequest/Attribute:approver_id' => '审核人',
|
||||
'Class:UserRequest/Attribute:approver_id+' => '',
|
||||
'Class:UserRequest/Attribute:approver_email' => '邮箱',
|
||||
@@ -141,7 +142,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Attribute:servicesubcategory_id+' => '',
|
||||
'Class:UserRequest/Attribute:servicesubcategory_name' => '子服务名称',
|
||||
'Class:UserRequest/Attribute:servicesubcategory_name+' => '',
|
||||
'Class:UserRequest/Attribute:escalation_flag' => '是否升级',
|
||||
'Class:UserRequest/Attribute:escalation_flag' => '热门标识',
|
||||
'Class:UserRequest/Attribute:escalation_flag+' => '',
|
||||
'Class:UserRequest/Attribute:escalation_flag/Value:no' => '否',
|
||||
'Class:UserRequest/Attribute:escalation_flag/Value:no+' => '否',
|
||||
@@ -207,9 +208,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Attribute:parent_change_id+' => '',
|
||||
'Class:UserRequest/Attribute:parent_change_ref' => '变更编号',
|
||||
'Class:UserRequest/Attribute:parent_change_ref+' => '',
|
||||
'Class:UserRequest/Attribute:related_request_list' => '衍生事件',
|
||||
'Class:UserRequest/Attribute:related_request_list+' => '此事件相关的所有子事件',
|
||||
'Class:UserRequest/Attribute:public_log' => '评论',
|
||||
'Class:UserRequest/Attribute:related_request_list' => '子需求',
|
||||
'Class:UserRequest/Attribute:related_request_list+' => '所有链接到此需求的需求',
|
||||
'Class:UserRequest/Attribute:public_log' => '公共日志',
|
||||
'Class:UserRequest/Attribute:public_log+' => '',
|
||||
'Class:UserRequest/Attribute:user_satisfaction' => '用户满意度',
|
||||
'Class:UserRequest/Attribute:user_satisfaction+' => '',
|
||||
@@ -223,7 +224,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserRequest/Attribute:user_satisfaction/Value:4+' => '',
|
||||
'Class:UserRequest/Attribute:user_comment' => '用户留言',
|
||||
'Class:UserRequest/Attribute:user_comment+' => '',
|
||||
'Class:UserRequest/Attribute:parent_request_id_friendlyname' => 'parent_request_id_friendlyname',
|
||||
'Class:UserRequest/Attribute:parent_request_id_friendlyname' => '父级需求昵称',
|
||||
'Class:UserRequest/Attribute:parent_request_id_friendlyname+' => '',
|
||||
'Class:UserRequest/Stimulus:ev_assign' => '分配',
|
||||
'Class:UserRequest/Stimulus:ev_assign+' => '',
|
||||
@@ -258,7 +259,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Portal:ButtonClose' => '关闭',
|
||||
'Portal:ButtonReopen' => '重新打开',
|
||||
'Portal:ShowServices' => '显示所有服务',
|
||||
'Portal:SelectRequestType' => '选择一种类型的需求',
|
||||
'Portal:SelectRequestType' => '请选择一种类型的需求',
|
||||
'Portal:SelectServiceElementFrom_Service' => '为 %1$s 选择服务元素',
|
||||
'Portal:ListServices' => '服务列表',
|
||||
'Portal:TitleDetailsFor_Service' => '服务详情',
|
||||
@@ -274,13 +275,14 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Portal:NoOpenProblem' => '没有打开的问题',
|
||||
'Portal:SelectLanguage' => '更改您的语言',
|
||||
'Portal:LanguageChangedTo_Lang' => '语言更改为',
|
||||
'Portal:ChooseYourFavoriteLanguage' => '选择您喜欢的语言',
|
||||
'Portal:ChooseYourFavoriteLanguage' => '请选择您偏好的语言',
|
||||
|
||||
'Class:UserRequest/Method:ResolveChildTickets' => '解决子工单',
|
||||
'Class:UserRequest/Method:ResolveChildTickets+' => '递归解决子工单 (自动解决), 并调整相关字段与父级工单保持一致: 服务, 团队, 办理人, 解决方案',
|
||||
]);
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Organization:Overview:UserRequests' => '来自此组织的用户需求',
|
||||
'Organization:Overview:MyUserRequests' => '我在此组织的用户需求',
|
||||
'Organization:Overview:UserRequests' => '来自此组织的需求',
|
||||
'Organization:Overview:MyUserRequests' => '我在此组织的需求',
|
||||
'Organization:Overview:Tickets' => '来自此组织的工单',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -30,6 +31,7 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Menu, fieldsets, UI, messages translations
|
||||
//
|
||||
@@ -38,9 +40,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ServiceManagement+' => '服务管理概况',
|
||||
'Menu:Service:Overview' => '概况',
|
||||
'Menu:Service:Overview+' => '',
|
||||
'UI-ServiceManagementMenu-ContractsBySrvLevel' => '合同 (按服务等级)',
|
||||
'UI-ServiceManagementMenu-ContractsBySrvLevel' => '合同 (按服务级别)',
|
||||
'UI-ServiceManagementMenu-ContractsByStatus' => '合同 (按状态)',
|
||||
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => '近30天内截止的合同',
|
||||
|
||||
'Menu:ProviderContract' => '供应商合同',
|
||||
'Menu:ProviderContract+' => '供应商合同',
|
||||
'Menu:CustomerContract' => '客户合同',
|
||||
@@ -52,14 +55,15 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ServiceElement' => '服务元素',
|
||||
'Menu:ServiceElement+' => '服务元素',
|
||||
'Menu:SLA' => 'SLA',
|
||||
'Menu:SLA+' => '服务等级协议',
|
||||
'Menu:SLA+' => '服务级别协议',
|
||||
'Menu:SLT' => 'SLT',
|
||||
'Menu:SLT+' => '服务等级目标',
|
||||
'Menu:SLT+' => '服务级别目标',
|
||||
'Menu:DeliveryModel' => '交付模式',
|
||||
'Menu:DeliveryModel+' => '交付模式',
|
||||
'Menu:ServiceFamily' => '服务系列',
|
||||
'Menu:ServiceFamily+' => '服务系列',
|
||||
'Contract:baseinfo' => '常规信息',
|
||||
'Menu:ServiceFamily' => '服务家族',
|
||||
'Menu:ServiceFamily+' => '服务家族',
|
||||
|
||||
'Contract:baseinfo' => '基本信息',
|
||||
'Contract:moreinfo' => '合同信息',
|
||||
'Contract:cost' => '费用信息',
|
||||
]);
|
||||
@@ -138,14 +142,14 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Contract/Attribute:provider_name+' => '',
|
||||
'Class:Contract/Attribute:status' => '状态',
|
||||
'Class:Contract/Attribute:status+' => '',
|
||||
'Class:Contract/Attribute:status/Value:implementation' => '启用',
|
||||
'Class:Contract/Attribute:status/Value:implementation+' => '启用',
|
||||
'Class:Contract/Attribute:status/Value:implementation' => '生效',
|
||||
'Class:Contract/Attribute:status/Value:implementation+' => '生效',
|
||||
'Class:Contract/Attribute:status/Value:obsolete' => '废弃',
|
||||
'Class:Contract/Attribute:status/Value:obsolete+' => '废弃',
|
||||
'Class:Contract/Attribute:status/Value:production' => '正式',
|
||||
'Class:Contract/Attribute:status/Value:production+' => '正式',
|
||||
'Class:Contract/Attribute:finalclass' => '合同类型',
|
||||
'Class:Contract/Attribute:finalclass+' => '',
|
||||
'Class:Contract/Attribute:status/Value:production' => '生产',
|
||||
'Class:Contract/Attribute:status/Value:production+' => '生产',
|
||||
'Class:Contract/Attribute:finalclass' => '合同子类',
|
||||
'Class:Contract/Attribute:finalclass+' => '根本属性的名称',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -173,7 +177,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ProviderContract/Attribute:functionalcis_list' => '配置项',
|
||||
'Class:ProviderContract/Attribute:functionalcis_list+' => '此合同包含的所有配置项',
|
||||
'Class:ProviderContract/Attribute:sla' => 'SLA',
|
||||
'Class:ProviderContract/Attribute:sla+' => '服务等级协议',
|
||||
'Class:ProviderContract/Attribute:sla+' => '服务级别协议',
|
||||
'Class:ProviderContract/Attribute:coverage' => '服务时间',
|
||||
'Class:ProviderContract/Attribute:coverage+' => '',
|
||||
]);
|
||||
@@ -183,7 +187,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContactToContract' => '关联联系人/合同',
|
||||
'Class:lnkContactToContract' => '链接 联系人/合同',
|
||||
'Class:lnkContactToContract+' => '',
|
||||
'Class:lnkContactToContract/Name' => '%1$s / %2$s',
|
||||
'Class:lnkContactToContract/Attribute:contract_id' => '合同',
|
||||
@@ -201,7 +205,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContractToDocument' => '关联合同/文档',
|
||||
'Class:lnkContractToDocument' => '链接 合同/文档',
|
||||
'Class:lnkContractToDocument+' => '',
|
||||
'Class:lnkContractToDocument/Name' => '%1$s / %2$s',
|
||||
'Class:lnkContractToDocument/Attribute:contract_id' => '合同',
|
||||
@@ -219,7 +223,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkFunctionalCIToProviderContract' => '关联功能配置项/供应商合同',
|
||||
'Class:lnkFunctionalCIToProviderContract' => '链接 功能配置项/供应商合同',
|
||||
'Class:lnkFunctionalCIToProviderContract+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Name' => '%1$s / %2$s',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => '供应商合同',
|
||||
@@ -237,7 +241,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ServiceFamily' => '服务系列',
|
||||
'Class:ServiceFamily' => '服务家族',
|
||||
'Class:ServiceFamily+' => '',
|
||||
'Class:ServiceFamily/Attribute:name' => '名称',
|
||||
'Class:ServiceFamily/Attribute:name+' => '',
|
||||
@@ -263,9 +267,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Service/Attribute:organization_name+' => '',
|
||||
'Class:Service/Attribute:description' => '描述',
|
||||
'Class:Service/Attribute:description+' => '',
|
||||
'Class:Service/Attribute:servicefamily_id' => '服务系列',
|
||||
'Class:Service/Attribute:servicefamily_id' => '服务家族',
|
||||
'Class:Service/Attribute:servicefamily_id+' => '',
|
||||
'Class:Service/Attribute:servicefamily_name' => '服务系列名称',
|
||||
'Class:Service/Attribute:servicefamily_name' => '服务家族名称',
|
||||
'Class:Service/Attribute:servicefamily_name+' => '',
|
||||
'Class:Service/Attribute:documents_list' => '文档',
|
||||
'Class:Service/Attribute:documents_list+' => '此服务相关的所有文档',
|
||||
@@ -273,8 +277,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Service/Attribute:contacts_list+' => '此服务相关的所有联系人',
|
||||
'Class:Service/Attribute:status' => '状态',
|
||||
'Class:Service/Attribute:status+' => '',
|
||||
'Class:Service/Attribute:status/Value:implementation' => '启用',
|
||||
'Class:Service/Attribute:status/Value:implementation+' => '启用',
|
||||
'Class:Service/Attribute:status/Value:implementation' => '生效',
|
||||
'Class:Service/Attribute:status/Value:implementation+' => '生效',
|
||||
'Class:Service/Attribute:status/Value:obsolete' => '废弃',
|
||||
'Class:Service/Attribute:status/Value:obsolete+' => '',
|
||||
'Class:Service/Attribute:status/Value:production' => '生产',
|
||||
@@ -292,7 +296,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToService' => '关联文档/服务',
|
||||
'Class:lnkDocumentToService' => '链接 文档/服务',
|
||||
'Class:lnkDocumentToService+' => '',
|
||||
'Class:lnkDocumentToService/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToService/Attribute:service_id' => '服务',
|
||||
@@ -310,7 +314,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContactToService' => '关联联系人/服务',
|
||||
'Class:lnkContactToService' => '链接 联系人/服务',
|
||||
'Class:lnkContactToService+' => '',
|
||||
'Class:lnkContactToService/Name' => '%1$s / %2$s',
|
||||
'Class:lnkContactToService/Attribute:service_id' => '服务',
|
||||
@@ -341,8 +345,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ServiceSubcategory/Attribute:service_name+' => '',
|
||||
'Class:ServiceSubcategory/Attribute:status' => '状态',
|
||||
'Class:ServiceSubcategory/Attribute:status+' => '',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:implementation' => '启用',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:implementation+' => '启用',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:implementation' => '生效',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:implementation+' => '生效',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:obsolete' => '废弃',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:obsolete+' => '废弃',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:production' => '生产',
|
||||
@@ -373,10 +377,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:SLA/Attribute:organization_name' => '组织名称',
|
||||
'Class:SLA/Attribute:organization_name+' => '',
|
||||
'Class:SLA/Attribute:slts_list' => 'SLT',
|
||||
'Class:SLA/Attribute:slts_list+' => '此 SLA 包含的所有服务等级目标',
|
||||
'Class:SLA/Attribute:slts_list+' => '此 SLA 包含的所有服务级别目标',
|
||||
'Class:SLA/Attribute:customercontracts_list' => '客户合同',
|
||||
'Class:SLA/Attribute:customercontracts_list+' => '使用此 SLA 的所有客户合同',
|
||||
'Class:SLA/Error:UniqueLnkCustomerContractToService' => '不能保存客户合同 %1$s 于服务 %2$s 的关联: SLA 已存在',
|
||||
'Class:SLA/Error:UniqueLnkCustomerContractToService' => '无法保存客户合同 %1$s 与服务 %2$s 之间的链接: SLA 已存在',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -390,8 +394,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:SLT/Attribute:name+' => '',
|
||||
'Class:SLT/Attribute:priority' => '优先级',
|
||||
'Class:SLT/Attribute:priority+' => '',
|
||||
'Class:SLT/Attribute:priority/Value:1' => '紧急',
|
||||
'Class:SLT/Attribute:priority/Value:1+' => '紧急',
|
||||
'Class:SLT/Attribute:priority/Value:1' => '严重',
|
||||
'Class:SLT/Attribute:priority/Value:1+' => '严重',
|
||||
'Class:SLT/Attribute:priority/Value:2' => '高',
|
||||
'Class:SLT/Attribute:priority/Value:2+' => '高',
|
||||
'Class:SLT/Attribute:priority/Value:3' => '中',
|
||||
@@ -404,7 +408,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:SLT/Attribute:request_type/Value:incident+' => '事件',
|
||||
'Class:SLT/Attribute:request_type/Value:service_request' => '服务需求',
|
||||
'Class:SLT/Attribute:request_type/Value:service_request+' => '服务需求',
|
||||
'Class:SLT/Attribute:metric' => '衡量指标',
|
||||
'Class:SLT/Attribute:metric' => '指标',
|
||||
'Class:SLT/Attribute:metric+' => '',
|
||||
'Class:SLT/Attribute:metric/Value:tto' => 'TTO',
|
||||
'Class:SLT/Attribute:metric/Value:tto+' => '响应时间',
|
||||
@@ -412,7 +416,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:SLT/Attribute:metric/Value:ttr+' => '解决时限',
|
||||
'Class:SLT/Attribute:value' => '值',
|
||||
'Class:SLT/Attribute:value+' => '',
|
||||
'Class:SLT/Attribute:unit' => '度量单位',
|
||||
'Class:SLT/Attribute:unit' => '计量单位',
|
||||
'Class:SLT/Attribute:unit+' => '',
|
||||
'Class:SLT/Attribute:unit/Value:hours' => '小时',
|
||||
'Class:SLT/Attribute:unit/Value:hours+' => '小时',
|
||||
@@ -425,7 +429,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkSLAToSLT' => '关联 SLA / SLT',
|
||||
'Class:lnkSLAToSLT' => '链接 SLA / SLT',
|
||||
'Class:lnkSLAToSLT+' => '',
|
||||
'Class:lnkSLAToSLT/Name' => '%1$s / %2$s',
|
||||
'Class:lnkSLAToSLT/Attribute:sla_id' => 'SLA',
|
||||
@@ -437,15 +441,15 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkSLAToSLT/Attribute:slt_name' => 'SLT 名称',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_name+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_metric' => 'SLT 指标',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_metric+' => '~~',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_request_type' => 'SLT 类别',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_request_type+' => '~~',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_metric+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_request_type' => 'SLT 类型',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_request_type+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_ticket_priority' => 'SLT 工单优先级',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_ticket_priority+' => '~~',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_ticket_priority+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_value' => 'SLT 值',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_value+' => '~~',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_value+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_value_unit' => 'SLT 单位',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_value_unit+' => '~~',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_value_unit+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -453,7 +457,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkCustomerContractToService' => '关联客户合同/服务',
|
||||
'Class:lnkCustomerContractToService' => '链接 客户合同/服务',
|
||||
'Class:lnkCustomerContractToService+' => '',
|
||||
'Class:lnkCustomerContractToService/Name' => '%1$s / %2$s',
|
||||
'Class:lnkCustomerContractToService/Attribute:customercontract_id' => '客户合同',
|
||||
@@ -466,7 +470,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkCustomerContractToService/Attribute:service_name+' => '',
|
||||
'Class:lnkCustomerContractToService/Attribute:sla_id' => 'SLA',
|
||||
'Class:lnkCustomerContractToService/Attribute:sla_id+' => '',
|
||||
'Class:lnkCustomerContractToService/Attribute:sla_name' => 'SLA名称',
|
||||
'Class:lnkCustomerContractToService/Attribute:sla_name' => 'SLA 名称',
|
||||
'Class:lnkCustomerContractToService/Attribute:sla_name+' => '',
|
||||
]);
|
||||
|
||||
@@ -475,7 +479,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkCustomerContractToProviderContract' => '关联 客户合同/供应商合同',
|
||||
'Class:lnkCustomerContractToProviderContract' => '链接 客户合同/供应商合同',
|
||||
'Class:lnkCustomerContractToProviderContract+' => '',
|
||||
'Class:lnkCustomerContractToProviderContract/Name' => '%1$s / %2$s',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_id' => '客户合同',
|
||||
@@ -493,7 +497,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkCustomerContractToFunctionalCI' => '关联客户合同/功能配置项',
|
||||
'Class:lnkCustomerContractToFunctionalCI' => '链接 客户合同/功能配置项',
|
||||
'Class:lnkCustomerContractToFunctionalCI+' => '',
|
||||
'Class:lnkCustomerContractToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_id' => '客户合同',
|
||||
@@ -522,9 +526,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:DeliveryModel/Attribute:description' => '描述',
|
||||
'Class:DeliveryModel/Attribute:description+' => '',
|
||||
'Class:DeliveryModel/Attribute:contacts_list' => '联系人',
|
||||
'Class:DeliveryModel/Attribute:contacts_list+' => '此交付模式的所有联系人 (包括团队和人员)',
|
||||
'Class:DeliveryModel/Attribute:contacts_list+' => '此交付模式相关的所有联系人 (包括团队和个体)',
|
||||
'Class:DeliveryModel/Attribute:customers_list' => '客户',
|
||||
'Class:DeliveryModel/Attribute:customers_list+' => '使用此交付模式的所有客户',
|
||||
'Class:DeliveryModel/Attribute:customers_list+' => '所有使用此交付模式的客户',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -532,7 +536,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDeliveryModelToContact' => '关联 交付模式/联系人',
|
||||
'Class:lnkDeliveryModelToContact' => '链接 交付模式/联系人',
|
||||
'Class:lnkDeliveryModelToContact+' => '',
|
||||
'Class:lnkDeliveryModelToContact/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id' => '交付模式',
|
||||
@@ -554,10 +558,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContactToContract/Attribute:customer_id' => 'Customer id~~',
|
||||
'Class:lnkContactToContract/Attribute:customer_id+' => '~~',
|
||||
'Class:lnkContactToContract/Attribute:provider_id' => 'Provider id~~',
|
||||
'Class:lnkContactToContract/Attribute:provider_id+' => '~~',
|
||||
'Class:lnkContactToContract/Attribute:customer_id' => '客户id',
|
||||
'Class:lnkContactToContract/Attribute:customer_id+' => '',
|
||||
'Class:lnkContactToContract/Attribute:provider_id' => '供应商id',
|
||||
'Class:lnkContactToContract/Attribute:provider_id+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -565,10 +569,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContractToDocument/Attribute:customer_id' => 'Customer id~~',
|
||||
'Class:lnkContractToDocument/Attribute:customer_id+' => '~~',
|
||||
'Class:lnkContractToDocument/Attribute:provider_id' => 'Provider id~~',
|
||||
'Class:lnkContractToDocument/Attribute:provider_id+' => '~~',
|
||||
'Class:lnkContractToDocument/Attribute:customer_id' => '客户id',
|
||||
'Class:lnkContractToDocument/Attribute:customer_id+' => '',
|
||||
'Class:lnkContractToDocument/Attribute:provider_id' => '供应商id',
|
||||
'Class:lnkContractToDocument/Attribute:provider_id+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -576,6 +580,6 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkCustomerContractToService/Attribute:provider_id' => 'Provider id~~',
|
||||
'Class:lnkCustomerContractToService/Attribute:provider_id+' => '~~',
|
||||
'Class:lnkCustomerContractToService/Attribute:provider_id' => '供应商id',
|
||||
'Class:lnkCustomerContractToService/Attribute:provider_id+' => '',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -30,13 +31,15 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
// Menu, fieldsets, UI, messages translations
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ServiceManagement' => '服务管理',
|
||||
'Menu:ServiceManagement+' => '服务管理概况',
|
||||
'Menu:Service:Overview' => '概况',
|
||||
'Menu:Service:Overview+' => '',
|
||||
'UI-ServiceManagementMenu-ContractsBySrvLevel' => '合同 (按服务等级)',
|
||||
'UI-ServiceManagementMenu-ContractsBySrvLevel' => '合同 (按服务级别)',
|
||||
'UI-ServiceManagementMenu-ContractsByStatus' => '合同 (按状态)',
|
||||
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => '未来30天内截止的合同',
|
||||
'Menu:ProviderContract' => '供应商合同',
|
||||
@@ -50,16 +53,17 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ServiceElement' => '服务元素',
|
||||
'Menu:ServiceElement+' => '服务元素',
|
||||
'Menu:SLA' => 'SLA',
|
||||
'Menu:SLA+' => '服务等级协议',
|
||||
'Menu:SLA+' => '服务级别协议',
|
||||
'Menu:SLT' => 'SLT',
|
||||
'Menu:SLT+' => '服务等级目标',
|
||||
'Menu:SLT+' => '服务级别目标',
|
||||
'Menu:DeliveryModel' => '交付模式',
|
||||
'Menu:DeliveryModel+' => '交付模式',
|
||||
'Menu:ServiceFamily' => '服务系列',
|
||||
'Menu:ServiceFamily+' => '服务系列',
|
||||
'Menu:ServiceFamily' => '服务家族',
|
||||
'Menu:ServiceFamily+' => '服务家族',
|
||||
'Menu:Procedure' => '流程清单',
|
||||
'Menu:Procedure+' => '所有流程清单',
|
||||
'Contract:baseinfo' => '常规信息',
|
||||
|
||||
'Contract:baseinfo' => '基本信息',
|
||||
'Contract:moreinfo' => '合同信息',
|
||||
'Contract:cost' => '费用信息',
|
||||
]);
|
||||
@@ -70,8 +74,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Organization/Attribute:deliverymodel_id' => '交付模式',
|
||||
'Class:Organization/Attribute:deliverymodel_id+' => 'This is required for Tickets handling.
|
||||
The delivery model specifies the teams to which tickets can be assigned.~~',
|
||||
'Class:Organization/Attribute:deliverymodel_id+' => '工单处理必备.
|
||||
交付模式指定了可以处理工单的团队.',
|
||||
'Class:Organization/Attribute:deliverymodel_name' => '交付模式名称',
|
||||
]);
|
||||
|
||||
@@ -129,14 +133,14 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Contract/Attribute:provider_name+' => '通用名称',
|
||||
'Class:Contract/Attribute:status' => '状态',
|
||||
'Class:Contract/Attribute:status+' => '',
|
||||
'Class:Contract/Attribute:status/Value:implementation' => '启用',
|
||||
'Class:Contract/Attribute:status/Value:implementation+' => '启用',
|
||||
'Class:Contract/Attribute:status/Value:implementation' => '生效',
|
||||
'Class:Contract/Attribute:status/Value:implementation+' => '生效',
|
||||
'Class:Contract/Attribute:status/Value:obsolete' => '废弃',
|
||||
'Class:Contract/Attribute:status/Value:obsolete+' => '废弃',
|
||||
'Class:Contract/Attribute:status/Value:production' => '生产',
|
||||
'Class:Contract/Attribute:status/Value:production+' => '生产',
|
||||
'Class:Contract/Attribute:finalclass' => '类型',
|
||||
'Class:Contract/Attribute:finalclass+' => '',
|
||||
'Class:Contract/Attribute:finalclass' => '合同子类',
|
||||
'Class:Contract/Attribute:finalclass+' => '根本属性的名称',
|
||||
]);
|
||||
//
|
||||
// Class: CustomerContract
|
||||
@@ -159,7 +163,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ProviderContract/Attribute:functionalcis_list' => '配置项',
|
||||
'Class:ProviderContract/Attribute:functionalcis_list+' => '此供应商合同包含的所有配置项',
|
||||
'Class:ProviderContract/Attribute:sla' => 'SLA',
|
||||
'Class:ProviderContract/Attribute:sla+' => '服务等级协议',
|
||||
'Class:ProviderContract/Attribute:sla+' => '服务级别协议',
|
||||
'Class:ProviderContract/Attribute:coverage' => '服务时间',
|
||||
'Class:ProviderContract/Attribute:coverage+' => '',
|
||||
'Class:ProviderContract/Attribute:contracttype_id' => '合同类型',
|
||||
@@ -167,7 +171,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ProviderContract/Attribute:contracttype_name' => '合同类型名称',
|
||||
'Class:ProviderContract/Attribute:contracttype_name+' => '',
|
||||
'Class:ProviderContract/Attribute:services_list' => '服务',
|
||||
'Class:ProviderContract/Attribute:services_list+' => 'All the services purchased with this contract~~',
|
||||
'Class:ProviderContract/Attribute:services_list+' => '此合同购买的所有服务',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -175,7 +179,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContactToContract' => '关联 联系人/合同',
|
||||
'Class:lnkContactToContract' => '链接 联系人/合同',
|
||||
'Class:lnkContactToContract+' => '',
|
||||
'Class:lnkContactToContract/Name' => '%1$s / %2$s',
|
||||
'Class:lnkContactToContract/Attribute:contract_id' => '合同',
|
||||
@@ -193,7 +197,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContractToDocument' => '关联合同/文档',
|
||||
'Class:lnkContractToDocument' => '链接 合同/文档',
|
||||
'Class:lnkContractToDocument+' => '',
|
||||
'Class:lnkContractToDocument/Name' => '%1$s / %2$s',
|
||||
'Class:lnkContractToDocument/Attribute:contract_id' => '合同',
|
||||
@@ -211,7 +215,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ServiceFamily' => '服务系列',
|
||||
'Class:ServiceFamily' => '服务家族',
|
||||
'Class:ServiceFamily+' => '',
|
||||
'Class:ServiceFamily/Attribute:name' => '名称',
|
||||
'Class:ServiceFamily/Attribute:name+' => '',
|
||||
@@ -235,9 +239,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Service/Attribute:org_id+' => '',
|
||||
'Class:Service/Attribute:organization_name' => '供应商名称',
|
||||
'Class:Service/Attribute:organization_name+' => '',
|
||||
'Class:Service/Attribute:servicefamily_id' => '服务系列',
|
||||
'Class:Service/Attribute:servicefamily_id' => '服务家族',
|
||||
'Class:Service/Attribute:servicefamily_id+' => '',
|
||||
'Class:Service/Attribute:servicefamily_name' => '服务系列名称',
|
||||
'Class:Service/Attribute:servicefamily_name' => '服务家族名称',
|
||||
'Class:Service/Attribute:servicefamily_name+' => '',
|
||||
'Class:Service/Attribute:description' => '描述',
|
||||
'Class:Service/Attribute:description+' => '',
|
||||
@@ -247,8 +251,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Service/Attribute:contacts_list+' => '此服务相关的所有联系人',
|
||||
'Class:Service/Attribute:status' => '状态',
|
||||
'Class:Service/Attribute:status+' => '',
|
||||
'Class:Service/Attribute:status/Value:implementation' => '启用',
|
||||
'Class:Service/Attribute:status/Value:implementation+' => '启用',
|
||||
'Class:Service/Attribute:status/Value:implementation' => '生效',
|
||||
'Class:Service/Attribute:status/Value:implementation+' => '生效',
|
||||
'Class:Service/Attribute:status/Value:obsolete' => '废弃',
|
||||
'Class:Service/Attribute:status/Value:obsolete+' => '',
|
||||
'Class:Service/Attribute:status/Value:production' => '生产',
|
||||
@@ -270,7 +274,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToService' => '关联文档/服务',
|
||||
'Class:lnkDocumentToService' => '链接 文档/服务',
|
||||
'Class:lnkDocumentToService+' => '',
|
||||
'Class:lnkDocumentToService/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToService/Attribute:service_id' => '服务',
|
||||
@@ -288,7 +292,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContactToService' => '关联联系人/服务',
|
||||
'Class:lnkContactToService' => '链接 联系人/服务',
|
||||
'Class:lnkContactToService+' => '',
|
||||
'Class:lnkContactToService/Name' => '%1$s / %2$s',
|
||||
'Class:lnkContactToService/Attribute:service_id' => '服务',
|
||||
@@ -325,8 +329,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ServiceSubcategory/Attribute:request_type/Value:service_request+' => '服务需求',
|
||||
'Class:ServiceSubcategory/Attribute:status' => '状态',
|
||||
'Class:ServiceSubcategory/Attribute:status+' => '',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:implementation' => '启用',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:implementation+' => '启用',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:implementation' => '生效',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:implementation+' => '生效',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:obsolete' => '废弃',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:obsolete+' => '废弃',
|
||||
'Class:ServiceSubcategory/Attribute:status/Value:production' => '生产',
|
||||
@@ -349,10 +353,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:SLA/Attribute:organization_name' => '供应商名称',
|
||||
'Class:SLA/Attribute:organization_name+' => '通用名称',
|
||||
'Class:SLA/Attribute:slts_list' => 'SLT',
|
||||
'Class:SLA/Attribute:slts_list+' => '此SLA包含的所有服务等级目标',
|
||||
'Class:SLA/Attribute:slts_list+' => '此 SLA 包含的所有服务级别目标',
|
||||
'Class:SLA/Attribute:customercontracts_list' => '客户合同',
|
||||
'Class:SLA/Attribute:customercontracts_list+' => '使用此SLA的所有客户合同',
|
||||
'Class:SLA/Error:UniqueLnkCustomerContractToService' => '不能保存客户合同%1$s与服务%2$s的关联: SLA已存在',
|
||||
'Class:SLA/Attribute:customercontracts_list+' => '使用此 SLA 的所有客户合同',
|
||||
'Class:SLA/Error:UniqueLnkCustomerContractToService' => '无法保存客户合同 %1$s 与服务 %2$s 之间的链接: SLA 已存在',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -366,8 +370,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:SLT/Attribute:name+' => '',
|
||||
'Class:SLT/Attribute:priority' => '优先级',
|
||||
'Class:SLT/Attribute:priority+' => '',
|
||||
'Class:SLT/Attribute:priority/Value:1' => '紧急',
|
||||
'Class:SLT/Attribute:priority/Value:1+' => '紧急',
|
||||
'Class:SLT/Attribute:priority/Value:1' => '严重',
|
||||
'Class:SLT/Attribute:priority/Value:1+' => '严重',
|
||||
'Class:SLT/Attribute:priority/Value:2' => '高',
|
||||
'Class:SLT/Attribute:priority/Value:2+' => '高',
|
||||
'Class:SLT/Attribute:priority/Value:3' => '中',
|
||||
@@ -388,7 +392,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:SLT/Attribute:metric/Value:ttr+' => '解决时限',
|
||||
'Class:SLT/Attribute:value' => '值',
|
||||
'Class:SLT/Attribute:value+' => '',
|
||||
'Class:SLT/Attribute:unit' => '度量单位',
|
||||
'Class:SLT/Attribute:unit' => '计量单位',
|
||||
'Class:SLT/Attribute:unit+' => '',
|
||||
'Class:SLT/Attribute:unit/Value:hours' => '小时',
|
||||
'Class:SLT/Attribute:unit/Value:hours+' => '小时',
|
||||
@@ -403,26 +407,26 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkSLAToSLT' => '关联SLA/SLT',
|
||||
'Class:lnkSLAToSLT' => '链接 SLA/SLT',
|
||||
'Class:lnkSLAToSLT+' => '',
|
||||
'Class:lnkSLAToSLT/Name' => '%1$s / %2$s',
|
||||
'Class:lnkSLAToSLT/Attribute:sla_id' => 'SLA',
|
||||
'Class:lnkSLAToSLT/Attribute:sla_id+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:sla_name' => 'SLA名称',
|
||||
'Class:lnkSLAToSLT/Attribute:sla_name' => 'SLA 名称',
|
||||
'Class:lnkSLAToSLT/Attribute:sla_name+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_id' => 'SLT',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_id+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_name' => 'SLT名称',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_name' => 'SLT 名称',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_name+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_metric' => 'SLT指标',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_metric+' => '~~',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_request_type' => 'SLT类别',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_request_type+' => '~~',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_ticket_priority' => 'SLT工单优先级',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_ticket_priority+' => '~~',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_metric' => 'SLT 指标',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_metric+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_request_type' => 'SLT 类型',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_request_type+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_ticket_priority' => 'SLT 工单优先级',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_ticket_priority+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_value' => 'SLT 值',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_value+' => '',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_value_unit' => 'SLT 单位',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_value_unit' => 'SLT 值的计量单位',
|
||||
'Class:lnkSLAToSLT/Attribute:slt_value_unit+' => '',
|
||||
]);
|
||||
|
||||
@@ -431,7 +435,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkCustomerContractToService' => '关联客户合同/服务',
|
||||
'Class:lnkCustomerContractToService' => '链接 客户合同/服务',
|
||||
'Class:lnkCustomerContractToService+' => '',
|
||||
'Class:lnkCustomerContractToService/Name' => '%1$s / %2$s',
|
||||
'Class:lnkCustomerContractToService/Attribute:customercontract_id' => '客户合同',
|
||||
@@ -453,7 +457,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkProviderContractToService' => '关联供应商合同/服务',
|
||||
'Class:lnkProviderContractToService' => '链接 供应商合同/服务',
|
||||
'Class:lnkProviderContractToService+' => '',
|
||||
'Class:lnkProviderContractToService/Name' => '%1$s / %2$s',
|
||||
'Class:lnkProviderContractToService/Attribute:service_id' => '服务',
|
||||
@@ -474,15 +478,15 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:DeliveryModel' => '交付模式',
|
||||
'Class:DeliveryModel+' => '',
|
||||
'Class:DeliveryModel/Attribute:name' => '名称',
|
||||
'Class:DeliveryModel/Attribute:name+' => 'Don\'t forget to add teams to this delivery model~~',
|
||||
'Class:DeliveryModel/Attribute:name+' => '别忘了给交付模式添加团队',
|
||||
'Class:DeliveryModel/Attribute:org_id' => '组织',
|
||||
'Class:DeliveryModel/Attribute:org_id+' => 'Usually the organization that provides the services~~',
|
||||
'Class:DeliveryModel/Attribute:org_id+' => '通常是提供服务的那个组织',
|
||||
'Class:DeliveryModel/Attribute:organization_name' => '组织名称',
|
||||
'Class:DeliveryModel/Attribute:organization_name+' => '通用名称',
|
||||
'Class:DeliveryModel/Attribute:description' => '描述',
|
||||
'Class:DeliveryModel/Attribute:description+' => '',
|
||||
'Class:DeliveryModel/Attribute:contacts_list' => '联系人',
|
||||
'Class:DeliveryModel/Attribute:contacts_list+' => '此交付模式相关的所有联系人 (包括团队和人员)',
|
||||
'Class:DeliveryModel/Attribute:contacts_list+' => '此交付模式相关的所有联系人 (包括团队和个体)',
|
||||
'Class:DeliveryModel/Attribute:customers_list' => '客户',
|
||||
'Class:DeliveryModel/Attribute:customers_list+' => '所有使用此交付模式的客户',
|
||||
]);
|
||||
@@ -492,7 +496,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDeliveryModelToContact' => '关联交付模式/联系人',
|
||||
'Class:lnkDeliveryModelToContact' => '链接 交付模式/联系人',
|
||||
'Class:lnkDeliveryModelToContact+' => '',
|
||||
'Class:lnkDeliveryModelToContact/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id' => '交付模式',
|
||||
@@ -514,10 +518,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContactToContract/Attribute:customer_id' => 'Customer id~~',
|
||||
'Class:lnkContactToContract/Attribute:customer_id+' => '~~',
|
||||
'Class:lnkContactToContract/Attribute:provider_id' => 'Provider id~~',
|
||||
'Class:lnkContactToContract/Attribute:provider_id+' => '~~',
|
||||
'Class:lnkContactToContract/Attribute:customer_id' => '客户id',
|
||||
'Class:lnkContactToContract/Attribute:customer_id+' => '',
|
||||
'Class:lnkContactToContract/Attribute:provider_id' => '供应商id',
|
||||
'Class:lnkContactToContract/Attribute:provider_id+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -525,10 +529,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContractToDocument/Attribute:customer_id' => 'Customer id~~',
|
||||
'Class:lnkContractToDocument/Attribute:customer_id+' => '~~',
|
||||
'Class:lnkContractToDocument/Attribute:provider_id' => 'Provider id~~',
|
||||
'Class:lnkContractToDocument/Attribute:provider_id+' => '~~',
|
||||
'Class:lnkContractToDocument/Attribute:customer_id' => '客户id',
|
||||
'Class:lnkContractToDocument/Attribute:customer_id+' => '',
|
||||
'Class:lnkContractToDocument/Attribute:provider_id' => '供应商id',
|
||||
'Class:lnkContractToDocument/Attribute:provider_id+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -536,8 +540,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkCustomerContractToService/Attribute:provider_id' => 'Provider id~~',
|
||||
'Class:lnkCustomerContractToService/Attribute:provider_id+' => '~~',
|
||||
'Class:lnkCustomerContractToService/Attribute:provider_id' => '供应商id',
|
||||
'Class:lnkCustomerContractToService/Attribute:provider_id+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -545,6 +549,6 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkProviderContractToService/Attribute:provider_id' => 'Provider id~~',
|
||||
'Class:lnkProviderContractToService/Attribute:provider_id+' => '~~',
|
||||
'Class:lnkProviderContractToService/Attribute:provider_id' => '供应商id',
|
||||
'Class:lnkProviderContractToService/Attribute:provider_id+' => '',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
// Dictionary entries go here
|
||||
]);
|
||||
@@ -30,12 +31,12 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:NASFileSystem/Attribute:org_id' => 'Org id~~',
|
||||
'Class:NASFileSystem/Attribute:org_id+' => '~~',
|
||||
'Class:NASFileSystem/Attribute:location_id' => 'Location id~~',
|
||||
'Class:NASFileSystem/Attribute:location_id+' => '~~',
|
||||
'Class:NASFileSystem/Attribute:location_name' => 'Location name~~',
|
||||
'Class:NASFileSystem/Attribute:location_name+' => '~~',
|
||||
'Class:NASFileSystem/Attribute:org_id' => '组织id',
|
||||
'Class:NASFileSystem/Attribute:org_id+' => '',
|
||||
'Class:NASFileSystem/Attribute:location_id' => '位置id',
|
||||
'Class:NASFileSystem/Attribute:location_id+' => '',
|
||||
'Class:NASFileSystem/Attribute:location_name' => '位置名称',
|
||||
'Class:NASFileSystem/Attribute:location_name+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -43,10 +44,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:FiberChannelInterface/Attribute:org_id' => 'Org id~~',
|
||||
'Class:FiberChannelInterface/Attribute:org_id+' => '~~',
|
||||
'Class:FiberChannelInterface/Attribute:location_id' => 'Location id~~',
|
||||
'Class:FiberChannelInterface/Attribute:location_id+' => '~~',
|
||||
'Class:FiberChannelInterface/Attribute:org_id' => '组织id',
|
||||
'Class:FiberChannelInterface/Attribute:org_id+' => '',
|
||||
'Class:FiberChannelInterface/Attribute:location_id' => '位置id',
|
||||
'Class:FiberChannelInterface/Attribute:location_id+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -54,10 +55,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:LogicalVolume/Attribute:org_id' => 'Org id~~',
|
||||
'Class:LogicalVolume/Attribute:org_id+' => '~~',
|
||||
'Class:LogicalVolume/Attribute:location_id' => 'Location id~~',
|
||||
'Class:LogicalVolume/Attribute:location_id+' => '~~',
|
||||
'Class:LogicalVolume/Attribute:location_name' => 'Location name~~',
|
||||
'Class:LogicalVolume/Attribute:location_name+' => '~~',
|
||||
'Class:LogicalVolume/Attribute:org_id' => '组织id',
|
||||
'Class:LogicalVolume/Attribute:org_id+' => '',
|
||||
'Class:LogicalVolume/Attribute:location_id' => '位置id',
|
||||
'Class:LogicalVolume/Attribute:location_id+' => '',
|
||||
'Class:LogicalVolume/Attribute:location_name' => '位置名称',
|
||||
'Class:LogicalVolume/Attribute:location_name+' => '',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnary conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -32,6 +33,7 @@
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
// Class:<class_name>/UniquenessRule:<rule_code>
|
||||
// Class:<class_name>/UniquenessRule:<rule_code>+
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Note: The classes have been grouped by categories: bizmodel
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
@@ -39,14 +41,16 @@
|
||||
// Classes in 'bizmodel'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
//
|
||||
// Class: Organization
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Organization' => '组织',
|
||||
'Class:Organization+' => '',
|
||||
'Class:Organization/Attribute:name' => '名称',
|
||||
'Class:Organization/Attribute:name+' => '常用名称',
|
||||
'Class:Organization/Attribute:name+' => '通用名称',
|
||||
'Class:Organization/Attribute:code' => '编码',
|
||||
'Class:Organization/Attribute:code+' => '组织编码 (Siret, DUNS,...)',
|
||||
'Class:Organization/Attribute:status' => '状态',
|
||||
@@ -63,9 +67,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Organization/Attribute:deliverymodel_id+' => '',
|
||||
'Class:Organization/Attribute:deliverymodel_name' => '交付模式名称',
|
||||
'Class:Organization/Attribute:deliverymodel_name+' => '',
|
||||
'Class:Organization/Attribute:parent_id_friendlyname' => '上级组织',
|
||||
'Class:Organization/Attribute:parent_id_friendlyname+' => '上级组织',
|
||||
'Class:Organization/Attribute:overview' => '概览',
|
||||
'Class:Organization/Attribute:parent_id_friendlyname' => '父级组织昵称',
|
||||
'Class:Organization/Attribute:parent_id_friendlyname+' => '',
|
||||
'Class:Organization/Attribute:overview' => '概况',
|
||||
'Organization:Overview:FunctionalCIs' => '此组织的所有配置项',
|
||||
'Organization:Overview:FunctionalCIs:subtitle' => '按类型',
|
||||
'Organization:Overview:Users' => '此组织里所有的'.ITOP_APPLICATION_SHORT.'用户',
|
||||
@@ -76,8 +80,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Location' => '地点',
|
||||
'Class:Location+' => '任何类型的地点: 区域, 国家, 城市, 位置, 建筑, 楼层, 房间, 机架,...',
|
||||
'Class:Location' => '位置',
|
||||
'Class:Location+' => '任何类型的位置: 区域, 国家, 城市, 位置, 建筑, 楼层, 房间, 机架,...',
|
||||
'Class:Location/Attribute:name' => '名称',
|
||||
'Class:Location/Attribute:name+' => '',
|
||||
'Class:Location/Attribute:status' => '状态',
|
||||
@@ -134,10 +138,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Contact/Attribute:notify/Value:no+' => '否',
|
||||
'Class:Contact/Attribute:notify/Value:yes' => '是',
|
||||
'Class:Contact/Attribute:notify/Value:yes+' => '是',
|
||||
'Class:Contact/Attribute:function' => '职责',
|
||||
'Class:Contact/Attribute:function' => '职务',
|
||||
'Class:Contact/Attribute:function+' => '',
|
||||
'Class:Contact/Attribute:cis_list' => '配置项',
|
||||
'Class:Contact/Attribute:cis_list+' => '此联系人关联的所有配置项',
|
||||
'Class:Contact/Attribute:cis_list+' => '此联系人相关的所有配置项',
|
||||
'Class:Contact/Attribute:finalclass' => '联系人类型',
|
||||
'Class:Contact/Attribute:finalclass+' => '根本属性的名称',
|
||||
]);
|
||||
@@ -147,9 +151,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Person' => '人员',
|
||||
'Class:Person' => '个体',
|
||||
'Class:Person+' => '',
|
||||
'Class:Person/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:Person/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:Person/Attribute:name' => '姓',
|
||||
'Class:Person/Attribute:name+' => '',
|
||||
'Class:Person/Attribute:first_name' => '名',
|
||||
@@ -158,21 +162,21 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Person/Attribute:employee_number+' => '',
|
||||
'Class:Person/Attribute:mobile_phone' => '手机',
|
||||
'Class:Person/Attribute:mobile_phone+' => '',
|
||||
'Class:Person/Attribute:location_id' => '地点',
|
||||
'Class:Person/Attribute:location_id' => '位置',
|
||||
'Class:Person/Attribute:location_id+' => '',
|
||||
'Class:Person/Attribute:location_name' => '名称',
|
||||
'Class:Person/Attribute:location_name+' => '',
|
||||
'Class:Person/Attribute:manager_id' => '直属上级',
|
||||
'Class:Person/Attribute:manager_id' => '经理',
|
||||
'Class:Person/Attribute:manager_id+' => '',
|
||||
'Class:Person/Attribute:manager_name' => '名称',
|
||||
'Class:Person/Attribute:manager_name' => '经理姓名',
|
||||
'Class:Person/Attribute:manager_name+' => '',
|
||||
'Class:Person/Attribute:team_list' => '团队',
|
||||
'Class:Person/Attribute:team_list+' => '这人员归属的所有团队',
|
||||
'Class:Person/Attribute:team_list+' => '此人所属的团队',
|
||||
'Class:Person/Attribute:tickets_list' => '工单',
|
||||
'Class:Person/Attribute:tickets_list+' => '此人发起的所有工单',
|
||||
'Class:Person/Attribute:tickets_list+' => '此人发起的工单',
|
||||
'Class:Person/Attribute:user_list' => '用户',
|
||||
'Class:Person/Attribute:user_list+' => '所有关联到此人员的用户',
|
||||
'Class:Person/Attribute:manager_id_friendlyname' => '直属上级姓名',
|
||||
'Class:Person/Attribute:user_list+' => '此人相关的所有用户',
|
||||
'Class:Person/Attribute:manager_id_friendlyname' => '经理昵称',
|
||||
'Class:Person/Attribute:manager_id_friendlyname+' => '',
|
||||
'Class:Person/Attribute:picture' => '头像',
|
||||
'Class:Person/Attribute:picture+' => '',
|
||||
@@ -180,7 +184,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Person/UniquenessRule:employee_number' => '\'$this->org_name$\' 内已经有人占用了这个员工号',
|
||||
'Class:Person/UniquenessRule:name+' => '同一组织内的员工姓名必须唯一',
|
||||
'Class:Person/UniquenessRule:name' => '\'$this->org_name$\' 内已经有人叫这个名字',
|
||||
'Class:Person/Error:ChangingOrgDenied' => '无法移动此人员到组织 \'%1$s\' 因为这将终端其用户门户的访问, 其关联的用户没有被授权访问此组织',
|
||||
'Class:Person/Error:ChangingOrgDenied' => '无法移动此人到组织 \'%1$s\' 因为这将终端其用户门户的访问, 其关联的用户没有被授权访问此组织',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -228,7 +232,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Document/Attribute:status/Value:published' => '正式',
|
||||
'Class:Document/Attribute:status/Value:published+' => '',
|
||||
'Class:Document/Attribute:cis_list' => '配置项',
|
||||
'Class:Document/Attribute:cis_list+' => '此文档关联的所有配置项',
|
||||
'Class:Document/Attribute:cis_list+' => '此文档相关的所有配置项',
|
||||
'Class:Document/Attribute:finalclass' => '文档类型',
|
||||
'Class:Document/Attribute:finalclass+' => '根本属性的名称',
|
||||
]);
|
||||
@@ -302,16 +306,16 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkPersonToTeam' => '关联 人员/团队',
|
||||
'Class:lnkPersonToTeam' => '链接 个体/团队',
|
||||
'Class:lnkPersonToTeam+' => '',
|
||||
'Class:lnkPersonToTeam/Name' => '%1$s / %2$s',
|
||||
'Class:lnkPersonToTeam/Name+' => '',
|
||||
'Class:lnkPersonToTeam/Attribute:team_id' => '团队',
|
||||
'Class:lnkPersonToTeam/Attribute:team_id+' => '',
|
||||
'Class:lnkPersonToTeam/Attribute:team_id+' => '个体所属的团队',
|
||||
'Class:lnkPersonToTeam/Attribute:team_name' => '团队名称',
|
||||
'Class:lnkPersonToTeam/Attribute:team_name+' => '',
|
||||
'Class:lnkPersonToTeam/Attribute:person_id' => '人员',
|
||||
'Class:lnkPersonToTeam/Attribute:person_id+' => '',
|
||||
'Class:lnkPersonToTeam/Attribute:person_id' => '个体',
|
||||
'Class:lnkPersonToTeam/Attribute:person_id+' => '团队中的成员',
|
||||
'Class:lnkPersonToTeam/Attribute:person_name' => '姓名',
|
||||
'Class:lnkPersonToTeam/Attribute:person_name+' => '',
|
||||
'Class:lnkPersonToTeam/Attribute:role_id' => '角色',
|
||||
@@ -327,11 +331,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:DataAdministration' => '数据管理',
|
||||
'Menu:DataAdministration+' => '数据管理',
|
||||
'Menu:Catalogs' => '类别',
|
||||
'Menu:Catalogs' => '类型',
|
||||
'Menu:Catalogs+' => '数据类型',
|
||||
'Menu:Audit' => '审计',
|
||||
'Menu:Audit+' => '审计',
|
||||
'Menu:CSVImport' => 'CSV导入',
|
||||
'Menu:CSVImport' => 'CSV 导入',
|
||||
'Menu:CSVImport+' => '批量创建或更新',
|
||||
'Menu:Organization' => '组织',
|
||||
'Menu:Organization+' => '所有组织',
|
||||
@@ -339,18 +343,18 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ConfigManagement+' => '配置管理',
|
||||
'Menu:ConfigManagementCI' => '配置项',
|
||||
'Menu:ConfigManagementCI+' => '配置项',
|
||||
'Menu:ConfigManagementOverview' => '概览',
|
||||
'Menu:ConfigManagementOverview+' => '概览',
|
||||
'Menu:ConfigManagementOverview' => '概况',
|
||||
'Menu:ConfigManagementOverview+' => '概况',
|
||||
'Menu:Contact' => '联系人',
|
||||
'Menu:Contact+' => '联系人',
|
||||
'Menu:Contact:Count' => '%1$d 个联系人',
|
||||
'Menu:Person' => '人员',
|
||||
'Menu:Person+' => '所有人员',
|
||||
'Menu:Person' => '个体',
|
||||
'Menu:Person+' => '所有个体',
|
||||
'Menu:Team' => '团队',
|
||||
'Menu:Team+' => '所有团队',
|
||||
'Menu:Document' => '文档',
|
||||
'Menu:Document+' => '所有文档',
|
||||
'Menu:Location' => '地点',
|
||||
'Menu:Location' => '位置',
|
||||
'Menu:Location+' => '所有位置',
|
||||
'Menu:NewContact' => '新建联系人',
|
||||
'Menu:NewContact+' => '新建联系人',
|
||||
@@ -358,10 +362,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:SearchContacts+' => '搜索联系人',
|
||||
'Menu:ConfigManagement:Shortcuts' => '快捷方式',
|
||||
'Menu:ConfigManagement:AllContacts' => '所有联系人: %1$d',
|
||||
'Menu:Typology' => '类型配置',
|
||||
'Menu:Typology+' => '类型配置',
|
||||
'Menu:Typology' => '拓扑配置',
|
||||
'Menu:Typology+' => '拓扑配置',
|
||||
'UI_WelcomeMenu_AllConfigItems' => '摘要',
|
||||
'Menu:ConfigManagement:Typology' => '类型配置',
|
||||
'Menu:ConfigManagement:Typology' => '拓扑配置',
|
||||
]);
|
||||
|
||||
// Add translation for Fieldsets
|
||||
@@ -376,6 +380,6 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
// Themes
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'theme:fullmoon' => '满月',
|
||||
'theme:test-red' => '测试 (红色)',
|
||||
'theme:fullmoon' => 'Full moon',
|
||||
'theme:test-red' => '测试实例 (红色)',
|
||||
]);
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'theme:light-grey' => '淡灰 (废弃)',
|
||||
'theme:light-grey' => 'Light Grey (已废弃)',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -30,9 +31,11 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: Ticket
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Ticket' => '工单',
|
||||
'Class:Ticket+' => '',
|
||||
@@ -66,7 +69,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Ticket/Attribute:last_update+' => '',
|
||||
'Class:Ticket/Attribute:close_date' => '关闭日期',
|
||||
'Class:Ticket/Attribute:close_date+' => '',
|
||||
'Class:Ticket/Attribute:private_log' => '私信',
|
||||
'Class:Ticket/Attribute:private_log' => '私有日志',
|
||||
'Class:Ticket/Attribute:private_log+' => '',
|
||||
'Class:Ticket/Attribute:contacts_list' => '联系人',
|
||||
'Class:Ticket/Attribute:contacts_list+' => '此工单相关的所有联系人',
|
||||
@@ -74,8 +77,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Ticket/Attribute:functionalcis_list+' => '此工单相关的所有配置项.',
|
||||
'Class:Ticket/Attribute:workorders_list' => '工作任务',
|
||||
'Class:Ticket/Attribute:workorders_list+' => '此工单相关的所有工作任务',
|
||||
'Class:Ticket/Attribute:finalclass' => '类型',
|
||||
'Class:Ticket/Attribute:finalclass+' => '',
|
||||
'Class:Ticket/Attribute:finalclass' => '工单子类',
|
||||
'Class:Ticket/Attribute:finalclass+' => '根本属性的名称',
|
||||
'Class:Ticket/Attribute:operational_status' => '操作状态',
|
||||
'Class:Ticket/Attribute:operational_status+' => '按具体状态',
|
||||
'Class:Ticket/Attribute:operational_status/Value:ongoing' => '进行中',
|
||||
@@ -92,7 +95,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContactToTicket' => '关联联系人/工单',
|
||||
'Class:lnkContactToTicket' => '链接 联系人/工单',
|
||||
'Class:lnkContactToTicket+' => '',
|
||||
'Class:lnkContactToTicket/Name' => '%1$s / %2$s',
|
||||
'Class:lnkContactToTicket/Attribute:ticket_id' => '工单',
|
||||
@@ -102,7 +105,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkContactToTicket/Attribute:contact_id' => '联系人',
|
||||
'Class:lnkContactToTicket/Attribute:contact_id+' => '',
|
||||
'Class:lnkContactToTicket/Attribute:contact_name' => '联系人姓名',
|
||||
'Class:lnkContactToTicket/Attribute:contact_name+' => '~~',
|
||||
'Class:lnkContactToTicket/Attribute:contact_name+' => '',
|
||||
'Class:lnkContactToTicket/Attribute:contact_email' => '邮箱',
|
||||
'Class:lnkContactToTicket/Attribute:contact_email+' => '',
|
||||
'Class:lnkContactToTicket/Attribute:role' => '角色 (文本)',
|
||||
@@ -154,95 +157,95 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
// Fieldset translation
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Ticket:baseinfo' => '基本信息',
|
||||
'Ticket:date' => '日期信息',
|
||||
'Ticket:contact' => '联系人',
|
||||
'Ticket:moreinfo' => '更多信息',
|
||||
'Ticket:relation' => '相关信息',
|
||||
'Ticket:log' => '日志',
|
||||
'Ticket:Type' => '风险评估',
|
||||
'Ticket:support' => '支持信息',
|
||||
'Ticket:resolution' => '解决方案',
|
||||
'Ticket:SLA' => 'SLA 报告',
|
||||
'WorkOrder:Details' => '详情',
|
||||
'WorkOrder:Moreinfo' => '更多信息',
|
||||
'Tickets:ResolvedFrom' => '由%1$s自动解决',
|
||||
'Class:cmdbAbstractObject/Method:Set' => '设置',
|
||||
'Class:cmdbAbstractObject/Method:Set+' => '填写固定值',
|
||||
'Class:cmdbAbstractObject/Method:Set/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:Set/Param:1+' => '填写当前对象',
|
||||
'Class:cmdbAbstractObject/Method:Set/Param:2' => '值',
|
||||
'Class:cmdbAbstractObject/Method:Set/Param:2+' => '要设置的值',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDate' => '设置为当前日期',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDate+' => '填写当前日期和时间',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDate/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDate/Param:1+' => '填写当前对象',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull' => '为空则设置为当前日期',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull+' => '设置空字段为当前日期和时间',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull/Param:1' => '目标字段',
|
||||
'Ticket:baseinfo' => '基本信息',
|
||||
'Ticket:date' => '日期信息',
|
||||
'Ticket:contact' => '联系人',
|
||||
'Ticket:moreinfo' => '更多信息',
|
||||
'Ticket:relation' => '相关信息',
|
||||
'Ticket:log' => '日志',
|
||||
'Ticket:Type' => '风险评估',
|
||||
'Ticket:support' => '支持信息',
|
||||
'Ticket:resolution' => '解决方案',
|
||||
'Ticket:SLA' => 'SLA 报告',
|
||||
'WorkOrder:Details' => '详情',
|
||||
'WorkOrder:Moreinfo' => '更多信息',
|
||||
'Tickets:ResolvedFrom' => '由 %1$s 自动解决',
|
||||
'Class:cmdbAbstractObject/Method:Set' => '设置',
|
||||
'Class:cmdbAbstractObject/Method:Set+' => '填写固定值',
|
||||
'Class:cmdbAbstractObject/Method:Set/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:Set/Param:1+' => '填写当前对象',
|
||||
'Class:cmdbAbstractObject/Method:Set/Param:2' => '值',
|
||||
'Class:cmdbAbstractObject/Method:Set/Param:2+' => '要设置的值',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDate' => '设置为当前日期',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDate+' => '填写当前日期和时间',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDate/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDate/Param:1+' => '填写当前对象',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull' => '为空则设置为当前日期',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull+' => '设置空字段为当前日期和时间',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull/Param:1+' => '当前对象中要设置的字段',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentUser' => '设置为当前用户',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentUser+' => '填写当前登录用户',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1+' => '当前对象中要设置的字段. 如果此字段为字符串则使用显示名称, 否则将使用标识符. 显示名称为关联到用户的人员的姓名, 如果没有关联人员则为登录名.',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentPerson' => '设置为当前人员',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentPerson+' => '设置字段为当前登录的人员 (此 "人员" 关联到当前登录的 "用户").',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1+' => '填写当前对象, 如果填写字符串则是昵称.',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime' => '设置已过时间',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime+' => '设置字段为当前时间针对另一个字段设置的日期所用时长 (秒)',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:1+' => '当前对象中要设置的字段',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2' => '参考字段',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2+' => '此字段来自获取相关日期的字段',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3' => '工作时间',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3+' => '若留空则取决于标准工作时间场景, 或者设置为 "DefaultWorkingTimeComputer" 来强制要求24x7场景',
|
||||
'Class:cmdbAbstractObject/Method:SetIfNull' => '为空时设置',
|
||||
'Class:cmdbAbstractObject/Method:SetIfNull+' => '仅当字段为空时设置, 使用此固定值',
|
||||
'Class:cmdbAbstractObject/Method:SetIfNull/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetIfNull/Param:1+' => '当前对象里要设置的字段',
|
||||
'Class:cmdbAbstractObject/Method:SetIfNull/Param:2' => '值',
|
||||
'Class:cmdbAbstractObject/Method:SetIfNull/Param:2+' => '要设置的值',
|
||||
'Class:cmdbAbstractObject/Method:AddValue' => '加上值',
|
||||
'Class:cmdbAbstractObject/Method:AddValue+' => '给字段加上一个固定值',
|
||||
'Class:cmdbAbstractObject/Method:AddValue/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:AddValue/Param:1+' => '当前对象里要修改的字段',
|
||||
'Class:cmdbAbstractObject/Method:AddValue/Param:2' => '值',
|
||||
'Class:cmdbAbstractObject/Method:AddValue/Param:2+' => '要加上的数值, 可以为负',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate' => '设置计算的日期',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate+' => '设置字段为按规则根据另一个字段计算的日期',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:1+' => '当前对象里要设置的字段',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:2' => '修饰符',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:2+' => '要修改源日期的文本修饰符, 例如 "+3 days"',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:3' => '源字段',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:3+' => '作为源值应用修饰符逻辑的字段',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull' => '若空则设置计算的日期',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull+' => '为空时设置字段为按规则根据另一个字段计算的日期',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentUser' => '设置为当前用户',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentUser+' => '填写当前登录用户',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1+' => '当前对象中要设置的字段. 如果此字段为字符串则使用显示名称, 否则将使用标识符. 显示名称为关联到用户的个体的姓名, 如果没有关联个体则为登录名.',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentPerson' => '设置为当前个体',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentPerson+' => '设置字段为当前登录的个体 (此 "个体" 关联到当前登录的 "用户").',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1+' => '填写当前对象, 如果填写字符串则是昵称.',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime' => '设置已过时间',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime+' => '设置字段为当前时间针对另一个字段设置的日期所用时长 (秒)',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:1+' => '当前对象中要设置的字段',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2' => '参考字段',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2+' => '此字段来自获取相关日期的字段',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3' => '工作时间',
|
||||
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3+' => '若留空则取决于标准工作时间场景, 或者设置为 "DefaultWorkingTimeComputer" 来强制要求24x7场景',
|
||||
'Class:cmdbAbstractObject/Method:SetIfNull' => 'SetIfNull',
|
||||
'Class:cmdbAbstractObject/Method:SetIfNull+' => '仅当字段为空时设置, 使用此固定值',
|
||||
'Class:cmdbAbstractObject/Method:SetIfNull/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetIfNull/Param:1+' => '当前对象里要设置的字段',
|
||||
'Class:cmdbAbstractObject/Method:SetIfNull/Param:2' => '值',
|
||||
'Class:cmdbAbstractObject/Method:SetIfNull/Param:2+' => '要设置的值',
|
||||
'Class:cmdbAbstractObject/Method:AddValue' => 'AddValue',
|
||||
'Class:cmdbAbstractObject/Method:AddValue+' => '给字段加上一个固定值',
|
||||
'Class:cmdbAbstractObject/Method:AddValue/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:AddValue/Param:1+' => '当前对象里要修改的字段',
|
||||
'Class:cmdbAbstractObject/Method:AddValue/Param:2' => '值',
|
||||
'Class:cmdbAbstractObject/Method:AddValue/Param:2+' => '要加上的数值, 可以为负',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate' => 'SetComputedDate',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate+' => '设置字段为按规则根据另一个字段计算的日期',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:1+' => '当前对象里要设置的字段',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:2' => '修改器',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:2+' => '修改源日期的文本信息, 例如 "+3 days"',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:3' => '源字段',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:3+' => '应用修改器逻辑的源字段',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull' => '若空则设置计算的日期',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull+' => '为空时设置字段为按规则根据另一个字段计算的日期',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:1+' => '当前对象中要设置的字段',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:2' => '修饰符',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:2+' => '要修改源日期的文本修饰符, 例如 "+3 days"',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:3' => '源字段',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:3+' => '作为源值应用修饰符逻辑的字段',
|
||||
'Class:cmdbAbstractObject/Method:Reset' => '重置',
|
||||
'Class:cmdbAbstractObject/Method:Reset+' => '重置为默认值',
|
||||
'Class:cmdbAbstractObject/Method:Reset/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:Reset/Param:1+' => '填写当前对象',
|
||||
'Class:cmdbAbstractObject/Method:Copy' => '复制',
|
||||
'Class:cmdbAbstractObject/Method:Copy+' => '复制当前值到另外一个地方',
|
||||
'Class:cmdbAbstractObject/Method:Copy/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:Copy/Param:1+' => '填写当前对象',
|
||||
'Class:cmdbAbstractObject/Method:Copy/Param:2' => '源字段',
|
||||
'Class:cmdbAbstractObject/Method:Copy/Param:2+' => '此字段从当前对象获取值',
|
||||
'Class:cmdbAbstractObject/Method:ApplyStimulus' => '使用调整',
|
||||
'Class:cmdbAbstractObject/Method:ApplyStimulus+' => '当前对象中要应用的特定调整',
|
||||
'Class:cmdbAbstractObject/Method:ApplyStimulus/Param:1' => '调整编码',
|
||||
'Class:cmdbAbstractObject/Method:ApplyStimulus/Param:1+' => '当前对象的有效调整编码',
|
||||
'Class:ResponseTicketTTO/Interface:iMetricComputer' => 'TTO',
|
||||
'Class:ResponseTicketTTO/Interface:iMetricComputer+' => '响应时限',
|
||||
'Class:ResponseTicketTTR/Interface:iMetricComputer' => 'TTR',
|
||||
'Class:ResponseTicketTTR/Interface:iMetricComputer+' => '解决时限',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:2' => '修改器',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:2+' => '要修改源日期的文本信息, 例如 "+3 days"',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:3' => '源字段',
|
||||
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:3+' => '应用修改器逻辑的源字段',
|
||||
'Class:cmdbAbstractObject/Method:Reset' => '重置',
|
||||
'Class:cmdbAbstractObject/Method:Reset+' => '重置为默认值',
|
||||
'Class:cmdbAbstractObject/Method:Reset/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:Reset/Param:1+' => '填写当前对象',
|
||||
'Class:cmdbAbstractObject/Method:Copy' => '复制',
|
||||
'Class:cmdbAbstractObject/Method:Copy+' => '复制当前值到另外一个地方',
|
||||
'Class:cmdbAbstractObject/Method:Copy/Param:1' => '目标字段',
|
||||
'Class:cmdbAbstractObject/Method:Copy/Param:1+' => '填写当前对象',
|
||||
'Class:cmdbAbstractObject/Method:Copy/Param:2' => '源字段',
|
||||
'Class:cmdbAbstractObject/Method:Copy/Param:2+' => '此字段从当前对象获取值',
|
||||
'Class:cmdbAbstractObject/Method:ApplyStimulus' => '使用调整',
|
||||
'Class:cmdbAbstractObject/Method:ApplyStimulus+' => '当前对象中要应用的特定调整',
|
||||
'Class:cmdbAbstractObject/Method:ApplyStimulus/Param:1' => '调整编码',
|
||||
'Class:cmdbAbstractObject/Method:ApplyStimulus/Param:1+' => '当前对象的有效调整编码',
|
||||
'Class:ResponseTicketTTO/Interface:iMetricComputer' => 'TTO',
|
||||
'Class:ResponseTicketTTO/Interface:iMetricComputer+' => '响应时间',
|
||||
'Class:ResponseTicketTTR/Interface:iMetricComputer' => 'TTR',
|
||||
'Class:ResponseTicketTTR/Interface:iMetricComputer+' => '解决时限',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -250,6 +253,6 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Ticket/Attribute:team_email' => 'Team email~~',
|
||||
'Class:Ticket/Attribute:team_email+' => '~~',
|
||||
'Class:Ticket/Attribute:team_email' => '团队邮件',
|
||||
'Class:Ticket/Attribute:team_email+' => '',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
// Dictionary entries go here
|
||||
]);
|
||||
@@ -30,6 +31,6 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:LogicalInterface/Attribute:org_id' => 'Org id~~',
|
||||
'Class:LogicalInterface/Attribute:org_id+' => '~~',
|
||||
'Class:LogicalInterface/Attribute:org_id' => '组织id',
|
||||
'Class:LogicalInterface/Attribute:org_id+' => '',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -21,7 +21,8 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Core:ormValue:ormDocument:DownloadsCount' => '%1s~~',
|
||||
'Core:ormValue:ormDocument:DownloadsCount+' => '已下载%1$s次',
|
||||
'Core:ormValue:ormDocument:DownloadsCount' => '%1s',
|
||||
'Core:ormValue:ormDocument:DownloadsCount+' => '已下载 %1$s 次',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:cmdbAbstractObject/UniquenessRule:no_duplicate' => '%1$s: %2$s 已关联至 %3$s: %4$s, 不允许重复关联.',
|
||||
'Class:cmdbAbstractObject/UniquenessRule:no_duplicate' => '%1$s: %2$s 已链接至 %3$s: %4$s, 不允许重复链接.',
|
||||
]);
|
||||
|
||||
@@ -17,14 +17,15 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
// Bulk modify
|
||||
'UI:Bulk:modify:IncompatibleAttribute' => '此属性无法在批量操作中编辑',
|
||||
'UI:Bulk:Export:MaliciousInjection:Alert:Title' => 'Excel 安全警告',
|
||||
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => '在 Microsoft Excel 中打开不信任的文件可能导致公式注入. 请确保 Excel 设置能够安全的处理该文件. <a href="%1$s" target="_blank">进入我们的文档了解更多.</a>',
|
||||
'UI:Bulk:Export:MaliciousInjection:Sanitization:Alert:Message' => 'Some values have been sanitized to prevent potential security issues in Microsoft Excel. <a href="%1$s" target="_blank">Learn more in our documentation.</a>~~',
|
||||
'UI:Bulk:Export:MaliciousInjection:Input:Label' => 'Sanitize potentially dangerous values~~',
|
||||
'UI:Bulk:Export:MaliciousInjection:Input:Tooltip' => 'When enabled, potentially dangerous values will be sanitized during export. This will prevent Microsoft Excel from interpreting them as formulas. Note that this may alter the original data by prefixing it with a single quote (\') to ensure it is treated as text.~~',
|
||||
'Core:BulkExport:Security' => 'Security~~',
|
||||
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => '在 MS Excel 中打开不信任的文件可能会导致公式注入. 请确保 Excel 的设置能够安全的处理该文件. <a href="%1$s">可以在我们的文档中了解更多.</a>',
|
||||
'UI:Bulk:Export:MaliciousInjection:Sanitization:Alert:Message' => '部分数值已被脱敏处理, 以以规避 MS Excel 中可能出现的安全隐患. <a href="%1$s" target="_blank">可以在我们的文档中了解更多.</a>',
|
||||
'UI:Bulk:Export:MaliciousInjection:Input:Label' => '数据脱敏',
|
||||
'UI:Bulk:Export:MaliciousInjection:Input:Tooltip' => '启用该功能后, 导出过程中将对存在安全隐患的数据值进行脱敏处理. 这能避免 MS Excel 将其识别为公式. 请注意,该操作可能会在原始数据前添加一个单引号(\')作为前缀, 以保证数据被正确识别为文本格式.',
|
||||
'Core:BulkExport:Security' => '安全',
|
||||
]);
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:DisplayBlock:List:AddEntry:Tooltip' => '向列表添加条目',
|
||||
'UI:DisplayBlock:List:AddEntry:Tooltip' => '向表格中添加条目',
|
||||
]);
|
||||
|
||||
@@ -17,58 +17,60 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
// Placeholders
|
||||
// $%1s : host object class name
|
||||
// $%2s : host object friendlyname
|
||||
// $%3s : current tab name
|
||||
// $%4s : remote object class name
|
||||
// $%5s : remote object friendlyname
|
||||
'UI:Links:Object:New:Modal:Title' => '创建对象',
|
||||
// $%1s : host object class name
|
||||
// $%2s : host object friendlyname
|
||||
// $%3s : current tab name
|
||||
// $%4s : remote object class name
|
||||
// $%5s : remote object friendlyname
|
||||
|
||||
'UI:Links:Object:New:Modal:Title' => '创建对象',
|
||||
|
||||
// Create
|
||||
'UI:Links:Create:Button' => '创建',
|
||||
'UI:Links:Create:Button+' => '创建一个 %4$s',
|
||||
'UI:Links:Create:Modal:Title' => '创建一个 %4$s 至 %2$s',
|
||||
'UI:Links:Create:Button' => '创建',
|
||||
'UI:Links:Create:Button+' => '创建 %4$s',
|
||||
'UI:Links:Create:Modal:Title' => '在 %2$s 中创建 %4$s',
|
||||
|
||||
// Add
|
||||
'UI:Links:Add:Button' => '添加',
|
||||
'UI:Links:Add:Button+' => '添加一个 %4$s',
|
||||
'UI:Links:Add:Modal:Title' => '添加一个 %4$s 至 %2$s',
|
||||
'UI:Links:Add:Button' => '添加',
|
||||
'UI:Links:Add:Button+' => '添加 %4$s',
|
||||
'UI:Links:Add:Modal:Title' => '添加 %4$s 到 %2$s',
|
||||
|
||||
// Modify link
|
||||
'UI:Links:ModifyLink:Button' => '修改',
|
||||
'UI:Links:ModifyLink:Button+' => '修改此关联',
|
||||
'UI:Links:ModifyLink:Modal:Title' => '修改 %2$s 和 %5$s 的关联',
|
||||
'UI:Links:ModifyLink:Button' => '修改',
|
||||
'UI:Links:ModifyLink:Button+' => '修改此链接',
|
||||
'UI:Links:ModifyLink:Modal:Title' => '修改 %2$s 和 %5$s 之间的链接',
|
||||
|
||||
// Modify object
|
||||
'UI:Links:ModifyObject:Button' => '修改',
|
||||
'UI:Links:ModifyObject:Button+' => '修改此对象',
|
||||
'UI:Links:ModifyObject:Modal:Title' => '%5$s',
|
||||
'UI:Links:ModifyObject:Button' => '修改',
|
||||
'UI:Links:ModifyObject:Button+' => '修改此对象',
|
||||
'UI:Links:ModifyObject:Modal:Title' => '%5$s',
|
||||
|
||||
// Remove
|
||||
'UI:Links:Remove:Button' => '移除',
|
||||
'UI:Links:Remove:Button+' => '移除此 %4$s',
|
||||
'UI:Links:Remove:Modal:Title' => '从%1$s 移除 %4$s',
|
||||
'UI:Links:Remove:Modal:Message' => '请确认从 %2$s 移除 %5$s ?',
|
||||
'UI:Links:Remove:Button' => '移除',
|
||||
'UI:Links:Remove:Button+' => '移除此 %4$s',
|
||||
'UI:Links:Remove:Modal:Title' => '从%1$s 移除 %4$s',
|
||||
'UI:Links:Remove:Modal:Message' => '请确认从 %2$s 移除 %5$s ?',
|
||||
|
||||
// Delete
|
||||
'UI:Links:Delete:Button' => '删除',
|
||||
'UI:Links:Delete:Button+' => '删除此 %4$s',
|
||||
'UI:Links:Delete:Modal:Title' => '删除 %4$s',
|
||||
'UI:Links:Delete:Modal:Message' => '请确认删除 %5$s?',
|
||||
'UI:Links:Delete:Button' => '删除',
|
||||
'UI:Links:Delete:Button+' => '删除此 %4$s',
|
||||
'UI:Links:Delete:Modal:Title' => '删除 %4$s',
|
||||
'UI:Links:Delete:Modal:Message' => '请确认删除 %5$s?',
|
||||
|
||||
// Bulk
|
||||
'UI:Links:Bulk:LinkWillBeCreatedForAllObjects' => '添加至所有对象',
|
||||
'UI:Links:Bulk:LinkWillBeCreatedForAllObjects' => '添加至所有对象',
|
||||
'UI:Links:Bulk:LinkWillBeDeletedFromAllObjects' => '从所有对象删除',
|
||||
'UI:Links:Bulk:LinkWillBeCreatedFor1Object' => '添加至一个对象',
|
||||
'UI:Links:Bulk:LinkWillBeDeletedFrom1Object' => '从一个对象移除',
|
||||
'UI:Links:Bulk:LinkWillBeCreatedForXObjects' => '添加 {count} 个对象',
|
||||
'UI:Links:Bulk:LinkWillBeDeletedFromXObjects' => '移除 {count} 个对象',
|
||||
'UI:Links:Bulk:LinkExistForAllObjects' => '已关联所有对象',
|
||||
'UI:Links:Bulk:LinkExistForOneObject' => '已关联一个对象',
|
||||
'UI:Links:Bulk:LinkExistForXObjects' => '已关联 {count} 个对象',
|
||||
'UI:Links:Bulk:LinkWillBeCreatedFor1Object' => '添加至一个对象',
|
||||
'UI:Links:Bulk:LinkWillBeDeletedFrom1Object' => '从一个对象移除',
|
||||
'UI:Links:Bulk:LinkWillBeCreatedForXObjects' => '添加 {count} 个对象',
|
||||
'UI:Links:Bulk:LinkWillBeDeletedFromXObjects' => '移除 {count} 个对象',
|
||||
'UI:Links:Bulk:LinkExistForAllObjects' => '已链接所有对象',
|
||||
'UI:Links:Bulk:LinkExistForOneObject' => '已链接一个对象',
|
||||
'UI:Links:Bulk:LinkExistForXObjects' => '已链接 {count} 个对象',
|
||||
|
||||
// New item
|
||||
'UI:Links:NewItem' => '新建条目',
|
||||
|
||||
@@ -17,25 +17,27 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Newsroom:iTopNotification:Label' => ITOP_APPLICATION_SHORT,
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Title' => 'Your '.ITOP_APPLICATION_SHORT.' news~~',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:SubTitle' => 'Manage your news, flag them as read or unread, delete them, etc.~~',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Title' => '您的 '.ITOP_APPLICATION_SHORT.' 消息',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:SubTitle' => '管理您的消息, 标记为已读或未读, 或者删除它们.',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Read:Label' => '已读',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Unread:Label' => '未读',
|
||||
'UI:Newsroom:iTopNotification:SelectMode:Label' => 'Select mode~~',
|
||||
'UI:Newsroom:iTopNotification:SelectMode:Label' => '请选择模式',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:MarkAllAsRead:Label' => '全部标记为已读',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:MarkAllAsUnread:Label' => '全部标记为未读',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:DeleteAll:Label' => '全部删除',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:DeleteAll:Success:Message' => '全部 %1$s 条消息已被删除',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:DeleteAll:Confirmation:Title' => '删除全部消息',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:DeleteAll:Confirmation:Message' => 'Are you sure you want to delete all news?~~',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:DeleteAll:Confirmation:Message' => '请确认是否删除所有消息?',
|
||||
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Empty:Title' => '没有消息, 已是最新!',
|
||||
|
||||
// Actions
|
||||
// - Unitary buttons
|
||||
// - Unitary buttons
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:Delete:Label' => '删除这条消息',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:ViewObject:Label' => 'Go to the news url~~',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:ViewObject:Label' => '查看消息',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:MarkAsRead:Label' => '标记为已读',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:MarkAsUnread:Label' => '标记为未读',
|
||||
// - Bulk buttons
|
||||
@@ -43,7 +45,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:MarkSelectedAsUnread:Label' => '标记已选为未读',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:DeleteSelected:Label' => '删除已选择',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:DeleteSelected:Confirmation:Title' => '删除已选的消息',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:DeleteSelected:Confirmation:Message' => 'Are you sure you want to delete selected news?~~',
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:DeleteSelected:Confirmation:Message' => '请确认是否删除所选消息?',
|
||||
|
||||
// Feedback messages
|
||||
'UI:Newsroom:iTopNotification:ViewAllPage:Action:InvalidAction:Message' => '无效操作: "%1$s"',
|
||||
|
||||
@@ -2,11 +2,12 @@
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
// UI elements
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:WelcomePopup:Button:RemindLater' => '以后再提醒我',
|
||||
'UI:WelcomePopup:Button:RemindLater' => '稍后再提醒我',
|
||||
'UI:WelcomePopup:Button:AcknowledgeAndNext' => '下一步',
|
||||
'UI:WelcomePopup:Button:AcknowledgeAndClose' => '关闭',
|
||||
]);
|
||||
@@ -14,42 +15,42 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
// Message
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:WelcomePopup:Message:320_01_Welcome:Title' => '欢迎使用 '.ITOP_APPLICATION_SHORT.' 3.2',
|
||||
'UI:WelcomePopup:Message:320_01_Welcome:Description' => '<div>Congratulations, you landed on '.ITOP_APPLICATION.' '.ITOP_VERSION_NAME.'!</div>
|
||||
'UI:WelcomePopup:Message:320_01_Welcome:Description' => '<div>恭喜, 您已成功登录到 '.ITOP_APPLICATION.' '.ITOP_VERSION_NAME.'!</div>
|
||||
<br>
|
||||
<div>We\'re excited to announce this new release. </div>
|
||||
<div>In addition to introducing new features such as Newsroom, '.ITOP_APPLICATION_SHORT.' 3.2 includes critical security patches, enhanced accessibility and other significant improvements focused on providing you with stability and security.</div>
|
||||
<div>很高兴向您宣布这个新版本. </div>
|
||||
<div>新增了新闻室等新功能, '.ITOP_APPLICATION_SHORT.' 3.2 还包含了关键的安全补丁、增强的亲和性以及其它重要改进,旨在为您提供更好的稳定性和安全性.</div>
|
||||
<br>
|
||||
<div>Discover all of '.ITOP_APPLICATION_SHORT.'\'s exciting new features and stay up-to-date with important notifications with our new welcome pop-up!</div>
|
||||
<div>We hope you\'ll enjoy this version as much as we enjoyed imagining and creating it.</div>
|
||||
<div>发现 '.ITOP_APPLICATION_SHORT.' 所有令人兴奋的新功能,并通过我们的新欢迎弹窗保持与重要通知的同步!</div>
|
||||
<div>希望您会像我们一样, 从构思到创造, 全程享受这个版本.</div>
|
||||
<br>
|
||||
<div>Customize your '.ITOP_APPLICATION_SHORT.' preferences for a personalized experience.</div>~~',
|
||||
'UI:WelcomePopup:Message:320_02_Newsroom:Title' => 'Say "Hello" to the newsroom~~',
|
||||
'UI:WelcomePopup:Message:320_02_Newsroom:Description' => '<div>Say goodbye to cluttered inboxes and hello to personalized alerts with <a href="%1$s" target="_blank">'.ITOP_APPLICATION_SHORT.'\'s Newsroom</a>!</div>
|
||||
<div>Newsroom allows you to easily manage notifications within the platform, so you can stay on top of important updates without constantly checking your email. With the ability to mark messages as read or unread, and automatically delete old notifications, you have complete control over your notifications. </div>
|
||||
<div>定制您的 '.ITOP_APPLICATION_SHORT.' 偏好设置,可以获得个性化的体验.</div>',
|
||||
'UI:WelcomePopup:Message:320_02_Newsroom:Title' => '向新闻室说"Hello"',
|
||||
'UI:WelcomePopup:Message:320_02_Newsroom:Description' => '<div>告别杂乱的收件箱,用 <a href="%1$s" target="_blank">'.ITOP_APPLICATION_SHORT.' 新闻室</a>迎接个性化的告警!</div>
|
||||
<div>新闻室允许您轻松管理平台内的通知,因此您可以掌握重要更新而无需频繁查收电子邮件.通过将消息标记为已读或未读,并自动删除旧通知,您可以完全控制您的通知.</div>
|
||||
<br>
|
||||
<div>Try it out today and streamline your '.ITOP_APPLICATION_SHORT.'\'s communication experience!</div>~~',
|
||||
'UI:WelcomePopup:Message:320_03_NotificationsCenter:Title' => 'Notifications center~~',
|
||||
'UI:WelcomePopup:Message:320_03_NotificationsCenter:Description' => '<div>As we know your information intake is already at its max, you can now easily choose how you receive your notifications - via email, chat, or even the Newsroom feature</div>
|
||||
<div>You don\'t want to receive a certain type of alerts? Nothing easier with these advanced customization capabilities giving you the flexibility to tailor your experience to your needs. </div>
|
||||
<div>今天就试试,简化您的 '.ITOP_APPLICATION_SHORT.' 沟通体验!</div>',
|
||||
'UI:WelcomePopup:Message:320_03_NotificationsCenter:Title' => '通知中心',
|
||||
'UI:WelcomePopup:Message:320_03_NotificationsCenter:Description' => '<div>由于我们知道您的信息摄入量已经达到最大限度,现在您可以轻松选择如何接收通知 - 通过电子邮件、聊天,甚至新闻室功能</div>
|
||||
<div>您不想接收某种类型的警报?使用这些高级自定义功能,您可以根据需要轻松定制体验.</div>
|
||||
<br>
|
||||
<div>Access your <a href="%1$s" target="_blank">notifications center</a> through the newsroom or through your preferences and avoid information overload on all your communication channels!</div>~~',
|
||||
'UI:WelcomePopup:Message:320_05_A11yThemes:Title' => 'Accessibility for '.ITOP_APPLICATION_SHORT.'\'s UI~~',
|
||||
'UI:WelcomePopup:Message:320_05_A11yThemes:Description' => '<div>To ensure '.ITOP_APPLICATION_SHORT.'\'s accessibility, our team has been working on <a href="%1$s" target="_blank">new back-office themes</a>. WCAG compliants, those UI focus on making it easier for users with visual impairments to use the solution:
|
||||
<div>通过新闻室或您的偏好设置访问您的<a href="%1$s" target="_blank">通知中心</a>,避免所有通信渠道的信息过载!</div>',
|
||||
'UI:WelcomePopup:Message:320_05_A11yThemes:Title' => ITOP_APPLICATION_SHORT.' UI 的亲和性',
|
||||
'UI:WelcomePopup:Message:320_05_A11yThemes:Description' => '<div>为了确保 '.ITOP_APPLICATION_SHORT.' 的亲和性,我们的团队一直在开发<a href="%1$s" target="_blank">新的后台主题</a>.符合 WCAG 标准,这些 UI 主题可以帮助视力障碍用户更容易的使用:
|
||||
<ul>
|
||||
<li><b>Color-blind theme:</b> Designed to help users with colorblindness, this theme actually breaks down in two sub-themes to adapt to specific cases: </li>
|
||||
<li><b>色盲主题:</b> 设计用于帮助色盲用户,此主题实际上分为两个子主题以适应特定情况:</li>
|
||||
<ul>
|
||||
<li>One adapted to protanopia and deuteranopia</li>
|
||||
<li>And another one for tritanopia</li>
|
||||
<li>一个适用于红绿色盲和绿色色盲</li>
|
||||
<li>另一个适用于黄蓝色盲</li>
|
||||
</ul>
|
||||
<br>
|
||||
<li><b>High-contrast theme:</b> Increased contrast to allow users an easier distinction between different elements on screen and avoid to rely on color schema to convey information. It can be helpful for users with different pathology from colorblindness to low vision issues.</li>
|
||||
<li><b>高对比度主题:</b> 增加对比度以允许用户更容易区分屏幕上的不同元素,并避免依赖颜色方案传递信息.它可以帮助从色盲到弱视等不同病理的用户.</li>
|
||||
</ul>
|
||||
</div>~~',
|
||||
'UI:WelcomePopup:Message:320_04_PowerfulNotifications_AdminOnly:Title' => 'Powerful notifications~~',
|
||||
'UI:WelcomePopup:Message:320_04_PowerfulNotifications_AdminOnly:Description' => '<div>'.ITOP_APPLICATION_SHORT.'\'s Newsroom gives you a new way to <a href="%1$s" target="_blank"><b>automate</b> your alerts based on events</a> with recurrence, so you can easily set up rules that work for you. </div>
|
||||
<div>Our <b>priority-based notifications sorting</b> ensures that important messages are displayed first, while our URL customization options allow you to direct recipients to the right place. </div>
|
||||
</div>',
|
||||
'UI:WelcomePopup:Message:320_04_PowerfulNotifications_AdminOnly:Title' => '强大的通知',
|
||||
'UI:WelcomePopup:Message:320_04_PowerfulNotifications_AdminOnly:Description' => '<div>'.ITOP_APPLICATION_SHORT.' 的新闻室为您提供了一种新的方法,可以 <a href="%1$s" target="_blank"><b>自动化</b> 基于事件的告警</a> 并支持重复设置, 因此您可以轻松设置适合您的规则. </div>
|
||||
<div>我们的<b>基于优先级的通知排序</b>确保重要消息优先展示,同时,我们的 URL 自定义选项允许您将收件人引导到正确的位置.</div>
|
||||
<br>
|
||||
<div>With support for <b>multiple languages</b>, you have now complete control over your notifications display.</div>
|
||||
<div>支持<b>多语言</b>,您现在可以完全控制通知显示.</div>
|
||||
<br>
|
||||
<div>Configure it today and see how much more efficient your alerts process can be!</div>~~',
|
||||
<div>现在就配置它,看看您的警报流程可以变得多么高效!</div>',
|
||||
]);
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
// Global search
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Component:Breadcrumbs:PreviousItemsListToggler:Label' => '上一页',
|
||||
]);
|
||||
|
||||
@@ -17,20 +17,21 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
// Display DataTable
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Datatables:Language:Processing' => '请稍候...',
|
||||
'UI:Datatables:Language:LengthMenu' => '每页 _MENU_ 项',
|
||||
'UI:Datatables:Language:ZeroRecords' => '未找到相关结果',
|
||||
'UI:Datatables:Language:Info' => '共 _TOTAL_ 项',
|
||||
'UI:Datatables:Language:InfoEmpty' => '未找到相关信息',
|
||||
'UI:Datatables:Language:EmptyTable' => '当前列表没有数据',
|
||||
'UI:Datatables:Language:Error' => '运行查询时出错',
|
||||
'UI:Datatables:Language:DisplayLength:All' => '全部',
|
||||
'UI:Datatables:Language:Sort:Ascending' => '升序',
|
||||
'UI:Datatables:Language:Sort:Descending' => '降序',
|
||||
'UI:Datatables:Column:RowActions:Label' => '标签',
|
||||
'UI:Datatables:Column:RowActions:Description' => '备注',
|
||||
'UI:Datatables:RowActions:ConfirmationDialog' => '操作确认',
|
||||
'UI:Datatables:RowActions:ConfirmationMessage' => '确认操作?',
|
||||
'UI:Datatables:Language:Processing' => '请稍候...',
|
||||
'UI:Datatables:Language:LengthMenu' => '每页 _MENU_ 项',
|
||||
'UI:Datatables:Language:ZeroRecords' => '未找到相关结果',
|
||||
'UI:Datatables:Language:Info' => '共 _TOTAL_ 项',
|
||||
'UI:Datatables:Language:InfoEmpty' => '未找到相关信息',
|
||||
'UI:Datatables:Language:EmptyTable' => '暂无数据',
|
||||
'UI:Datatables:Language:Error' => '运行查询时出错',
|
||||
'UI:Datatables:Language:DisplayLength:All' => '全部',
|
||||
'UI:Datatables:Language:Sort:Ascending' => '升序',
|
||||
'UI:Datatables:Language:Sort:Descending' => '降序',
|
||||
'UI:Datatables:Column:RowActions:Label' => '标签',
|
||||
'UI:Datatables:Column:RowActions:Description' => '描述',
|
||||
'UI:Datatables:RowActions:ConfirmationDialog' => '操作确认',
|
||||
'UI:Datatables:RowActions:ConfirmationMessage' => '确认操作?',
|
||||
]);
|
||||
|
||||
@@ -17,9 +17,10 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
// Input
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Component:Input:ChangeNotAllowed' => 'This change is not allowed~~',
|
||||
'UI:Component:Input:ChangeNotAllowed' => '不允许修改',
|
||||
'UI:Component:Input:Password:DoesNotMatch' => '密码不匹配',
|
||||
'UI:Component:Input:Set:MinimumItems' => 'Minimum %1$s item(s) required~~',
|
||||
'UI:Component:Input:Set:MinimumItems' => '至少需要 %1$s 项',
|
||||
]);
|
||||
|
||||
@@ -1,21 +1,30 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
// Quick create
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Component:QuickCreate:Tooltip' => '快速创建任意类型的对象',
|
||||
'UI:Component:QuickCreate:Input:Placeholder' => '请选择对象类型...',
|
||||
'UI:Component:QuickCreate:Recents:Title' => '最近',
|
||||
'UI:Component:QuickCreate:LastClasses:NoClass:Placeholder' => '您尚未创建任何对象',
|
||||
'UI:Component:QuickCreate:MostPopular:Title' => '最常用',
|
||||
'UI:Component:QuickCreate:HistoryDisabled' => '历史记录已禁用',
|
||||
'UI:Component:QuickCreate:KeyboardShortcut:OpenDrawer' => '打开快速创建',
|
||||
]);
|
||||
|
||||
@@ -17,28 +17,29 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
// Activity panel
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Layout:ActivityPanel:SizeToggler:Expand:Tooltip' => '展开',
|
||||
'UI:Layout:ActivityPanel:SizeToggler:Reduce:Tooltip' => '减少',
|
||||
'UI:Layout:ActivityPanel:SizeToggler:Reduce:Tooltip' => '还原',
|
||||
'UI:Layout:ActivityPanel:DisplayToggler:Close:Tooltip' => '关闭',
|
||||
'UI:Layout:ActivityPanel:LoadMoreEntries:Tooltip' => '加载更多',
|
||||
'UI:Layout:ActivityPanel:LoadAllEntries:Tooltip' => '全部加载',
|
||||
'UI:Layout:ActivityPanel:LoadAllEntries:Tooltip' => '加载所有之前的条目',
|
||||
|
||||
// Tabs
|
||||
'UI:Layout:ActivityPanel:Tab:Activity:Title' => '活动',
|
||||
'UI:Layout:ActivityPanel:Tab:Log:DraftIndicator:Tooltip' => '草稿',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Logs:Title' => '日志',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Logs:Tooltip' => '显示/隐藏日志',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Logs:Tooltip' => '显示/隐藏 日志',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Logs:Menu:Hint' => '请选择要显示的日志',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Transitions:Title' => '状态变化',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Transitions:Tooltip' => '显示/隐藏状态变化',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Transitions:Tooltip' => '显示/隐藏 状态变化',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Edits:Title' => '编辑',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Edits:Tooltip' => '显示/隐藏字段编辑',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Edits:Tooltip' => '显示/隐藏 被编辑过的字段',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Action:OpenAll:Tooltip' => '全部打开',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Action:CloseAll:Tooltip' => '全部关闭',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Info:AuthorsCount:Tooltip' => '正在查看此条目的人数',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Info:MessagesCount:Tooltip' => '此日志的消息数',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Info:AuthorsCount:Tooltip' => '正在交互的人数',
|
||||
'UI:Layout:ActivityPanel:Tab:Toolbar:Info:MessagesCount:Tooltip' => '消息数量',
|
||||
|
||||
// Compose button
|
||||
'UI:Layout:ActivityPanel:ComposeButton:Tooltip' => '撰写新的条目',
|
||||
@@ -51,9 +52,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Layout:ActivityPanel:NotificationEntry:MessageLink:Tooltip' => '点击打开通知栏以获得更多信息',
|
||||
|
||||
// Placeholder
|
||||
'UI:Layout:ActivityPanel:NoEntry:Placeholder:Hint' => '暂无任何活动',
|
||||
'UI:Layout:ActivityPanel:NoEntry:Placeholder:Hint' => '暂无活动',
|
||||
|
||||
// Closed cover
|
||||
'UI:Layout:ActivityPanel:ClosedCover:Title' => '活动面板',
|
||||
'UI:Layout:ActivityPanel:ClosedCover:Tooltip' => '点击打开活动面板',
|
||||
'UI:Layout:ActivityPanel:ClosedCover:Title' => '活动侧板',
|
||||
'UI:Layout:ActivityPanel:ClosedCover:Tooltip' => '点击打开活动侧板',
|
||||
]);
|
||||
|
||||
@@ -17,9 +17,10 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
// Navigation menu
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => '公司标志',
|
||||
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => '公司Logo',
|
||||
'UI:Layout:NavigationMenu:Silo:Label' => '请选择要筛选的组织',
|
||||
'UI:Layout:NavigationMenu:Toggler:Tooltip' => '展开/折叠',
|
||||
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => '展开/折叠 (筛选%1$s)',
|
||||
|
||||
@@ -2,13 +2,14 @@
|
||||
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Layout:ObjectDetails:KeyboardShortcut:EditObject' => '编辑当前对象',
|
||||
'UI:Layout:ObjectDetails:KeyboardShortcut:DeleteObject' => '删除当前对象',
|
||||
'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => '创建新对象 (与当前对象相同)',
|
||||
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => '保存当前对象',
|
||||
'UI:Layout:ObjectDetails:New:Modal:Title' => '创建对象',
|
||||
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
|
||||
'UI:Layout:ObjectDetails:New:Modal:Title' => '对象创建',
|
||||
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => '定义数据模型',
|
||||
]);
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UIBlock:Error:CannotGetBlocks' => '无法由内容区域 "%1$s" 获取块, 因为其在页面内容 "%2$s" 中不存在',
|
||||
'UIBlock:Error:CannotGetBlocks' => '无法从内容字段 "%1$s" 获取块, 因为它似乎在页面内容 "%2$s" 中不存在',
|
||||
]);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Layout:TabContainer:ExtraTabsListToggler:Label' => '其它标签页',
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UIBlock:Error:AddBlockForbidden' => '无法添加至 %1$s',
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Login:Title' => ITOP_APPLICATION_SHORT.'登录',
|
||||
'UI:Login:Logo:AltText' => ITOP_APPLICATION_SHORT.' logo~~',
|
||||
'UI:Login:Logo:AltText' => ITOP_APPLICATION_SHORT.' Logo',
|
||||
'UI:Login:Welcome' => '欢迎使用'.ITOP_APPLICATION_SHORT.'!',
|
||||
'UI:Login:IncorrectLoginPassword' => '用户名或密码错误, 请重试.',
|
||||
'UI:Login:IdentifyYourself' => '请完成身份认证',
|
||||
|
||||
@@ -19,15 +19,15 @@
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:NotificationsCenter:Page:Title' => 'Notifications center~~',
|
||||
'UI:NotificationsCenter:Panel:Title' => 'Notifications center~~',
|
||||
'UI:NotificationsCenter:Panel:SubTitle' => 'Manage Notifications that you have received : unsubscribe or limit them to a single channel~~',
|
||||
'UI:NotificationsCenter:Panel:Toolbar:ViewAllNews:Title' => 'View all my news~~',
|
||||
'UI:NotificationsCenter:Panel:Table:Channels' => 'Channels~~',
|
||||
'UI:NotificationsCenter:Unsubscribe:Success' => 'You have been successfully unsubscribed from the selected notifications.~~',
|
||||
'UI:NotificationsCenter:Unsubscribe:Error' => 'An error occurred while unsubscribing from the selected notifications.~~',
|
||||
'UI:NotificationsCenter:Subscribe:Success' => 'You have been successfully subscribed to the selected notifications.~~',
|
||||
'UI:NotificationsCenter:Subscribe:Error' => 'An error occurred while subscribing to the selected notifications.~~',
|
||||
'UI:NotificationsCenter:Channel:OutOf:Text' => '%1$s out of %2$s~~',
|
||||
'UI:NotificationsCenter:Advanced:Input:Label' => '%1$s: %2$s~~',
|
||||
'UI:NotificationsCenter:Page:Title' => '通知中心',
|
||||
'UI:NotificationsCenter:Panel:Title' => '通知中心',
|
||||
'UI:NotificationsCenter:Panel:SubTitle' => '管理收到的消息 : 取消订阅或限制它们的数量',
|
||||
'UI:NotificationsCenter:Panel:Toolbar:ViewAllNews:Title' => '查看所有消息',
|
||||
'UI:NotificationsCenter:Panel:Table:Channels' => '频道',
|
||||
'UI:NotificationsCenter:Unsubscribe:Success' => '您已成功取消订阅所选的通知.',
|
||||
'UI:NotificationsCenter:Unsubscribe:Error' => '取消订阅时发生错误.',
|
||||
'UI:NotificationsCenter:Subscribe:Success' => '您已成功订阅所选的通知.',
|
||||
'UI:NotificationsCenter:Subscribe:Error' => '订阅时发生错误.',
|
||||
'UI:NotificationsCenter:Channel:OutOf:Text' => '%2$s 中的 %1$s',
|
||||
'UI:NotificationsCenter:Advanced:Input:Label' => '%1$s: %2$s',
|
||||
]);
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
// Navigation menu
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'core/Operation:Landing/Title' => 'OAuth令牌创建',
|
||||
'core/Operation:Landing/Title' => 'OAuth token 创建',
|
||||
]);
|
||||
|
||||
@@ -17,42 +17,43 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
// Navigation menu
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Preferences:Title' => '首选项',
|
||||
'UI:Preferences:UserInterface:Title' => '用户界面',
|
||||
'UI:Preferences:General:Title' => '概况',
|
||||
'UI:Preferences:General:Theme' => '主题',
|
||||
'UI:Preferences:General:Theme:DefaultThemeLabel' => '%1$s (默认)',
|
||||
'UI:Favorites:General:ShowSummaryCards' => '显示汇总卡片',
|
||||
'UI:Favorites:General:ShowSummaryCards+' => '当鼠标移动到对象链接时, 显示此对象的简要汇总信息, 如果该类型支持',
|
||||
'UI:Preferences:Lists:Title' => '列表',
|
||||
'UI:Preferences:RichText:Title' => '富文本编辑器',
|
||||
'UI:Preferences:RichText:ToolbarState' => '工具栏默认状态',
|
||||
'UI:Preferences:RichText:ToolbarState:Expanded' => '展开',
|
||||
'UI:Preferences:RichText:ToolbarState:Collapsed' => '折叠',
|
||||
'UI:Preferences:ActivityPanel:Title' => '活动面板',
|
||||
'UI:Preferences:ActivityPanel:EntryFormOpened' => '默认打开录入表单',
|
||||
'UI:Preferences:ActivityPanel:EntryFormOpened+' => '在显示对象时是否打开录入表单. 如果不选择, 仍可以点击新建按钮打开录入表单',
|
||||
'UI:Preferences:PersonalizeKeyboardShortcuts:Title' => '键盘快捷键',
|
||||
'UI:Preferences:PersonalizeKeyboardShortcuts:Input:Hint' => '请输入键盘快捷键',
|
||||
'UI:Preferences:PersonalizeKeyboardShortcuts:Button:Tooltip' => '录制键盘快捷键',
|
||||
'UI:Preferences:PersonalizeKeyboardShortcuts:Button:Reset' => '重置',
|
||||
'UI:Preferences:PersonalizeKeyboardShortcuts:Button:Reset:Tooltip' => '还原到默认的键盘快捷键',
|
||||
'UI:Preferences:Tabs:Title' => '标签栏',
|
||||
'UI:Preferences:Tabs:Layout:Label' => '布局',
|
||||
'UI:Preferences:Tabs:Layout:Horizontal' => '水平',
|
||||
'UI:Preferences:Tabs:Layout:Vertical' => '垂直',
|
||||
'UI:Preferences:Tabs:Scrollable:Label' => '导航',
|
||||
'UI:Preferences:Tabs:Scrollable:Classic' => '经典',
|
||||
'UI:Preferences:Tabs:Scrollable:Scrollable' => '可滚动',
|
||||
'UI:Preferences:General:Toasts' => 'Toast notifications position~~',
|
||||
'UI:Preferences:General:Toasts:Bottom' => 'Bottom~~',
|
||||
'UI:Preferences:General:Toasts:Top' => 'Top~~',
|
||||
'UI:Preferences:ChooseAPlaceholder' => '用户的默认头像',
|
||||
'UI:Preferences:ChooseAPlaceholder+' => '选择一个占位图片, 将在用户联系人没有设定头像图片时显示',
|
||||
'UI:Preferences:ChooseAPlaceholder:Success:Message' => 'Your placeholder image has been successfully updated~~',
|
||||
'UI:Preferences:Notifications' => 'Notifications~~',
|
||||
'UI:Preferences:Notifications+' => 'Configure the notifications you want to receive <a href="%1$s">on this page</a>.~~',
|
||||
'UI:Preferences:Title' => '偏好设置',
|
||||
'UI:Preferences:UserInterface:Title' => '用户界面',
|
||||
'UI:Preferences:General:Title' => '概况',
|
||||
'UI:Preferences:General:Theme' => '主题',
|
||||
'UI:Preferences:General:Theme:DefaultThemeLabel' => '%1$s (默认)',
|
||||
'UI:Favorites:General:ShowSummaryCards' => '显示摘要卡片',
|
||||
'UI:Favorites:General:ShowSummaryCards+' => '当鼠标悬停在某个对象的超链接上时, 如果该对象支持摘要信息显示, 则会显示此对象的摘要信息',
|
||||
'UI:Preferences:Lists:Title' => '列表',
|
||||
'UI:Preferences:RichText:Title' => '富文本编辑器',
|
||||
'UI:Preferences:RichText:ToolbarState' => '工具栏默认状态',
|
||||
'UI:Preferences:RichText:ToolbarState:Expanded' => '展开',
|
||||
'UI:Preferences:RichText:ToolbarState:Collapsed' => '折叠',
|
||||
'UI:Preferences:ActivityPanel:Title' => '活动侧板',
|
||||
'UI:Preferences:ActivityPanel:EntryFormOpened' => '默认展开活动侧板',
|
||||
'UI:Preferences:ActivityPanel:EntryFormOpened+' => '在显示对象时是否默认打开活动侧板. 如未勾选, 您仍可通过点击按钮打开它',
|
||||
'UI:Preferences:PersonalizeKeyboardShortcuts:Title' => '键盘快捷键',
|
||||
'UI:Preferences:PersonalizeKeyboardShortcuts:Input:Hint' => '请输入键盘快捷键',
|
||||
'UI:Preferences:PersonalizeKeyboardShortcuts:Button:Tooltip' => '录制键盘快捷键',
|
||||
'UI:Preferences:PersonalizeKeyboardShortcuts:Button:Reset' => '重置',
|
||||
'UI:Preferences:PersonalizeKeyboardShortcuts:Button:Reset:Tooltip' => '还原到默认的键盘快捷键',
|
||||
'UI:Preferences:Tabs:Title' => '标签栏',
|
||||
'UI:Preferences:Tabs:Layout:Label' => '布局',
|
||||
'UI:Preferences:Tabs:Layout:Horizontal' => '水平',
|
||||
'UI:Preferences:Tabs:Layout:Vertical' => '垂直',
|
||||
'UI:Preferences:Tabs:Scrollable:Label' => '导航',
|
||||
'UI:Preferences:Tabs:Scrollable:Classic' => '经典',
|
||||
'UI:Preferences:Tabs:Scrollable:Scrollable' => '可滚动',
|
||||
'UI:Preferences:General:Toasts' => '通知提醒位置',
|
||||
'UI:Preferences:General:Toasts:Bottom' => '底部',
|
||||
'UI:Preferences:General:Toasts:Top' => '顶部',
|
||||
'UI:Preferences:ChooseAPlaceholder' => '用户的占位头像',
|
||||
'UI:Preferences:ChooseAPlaceholder+' => '请选择默认占位头像, 将在联系人没有设置头像时显示',
|
||||
'UI:Preferences:ChooseAPlaceholder:Success:Message' => '占位头像已成功更新',
|
||||
'UI:Preferences:Notifications' => '通知',
|
||||
'UI:Preferences:Notifications+' => '在 <a href="%1$s">这里</a>配置您想要收到的通知.',
|
||||
|
||||
]);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1
node_modules/.bin/tmpl.js
generated
vendored
Symbolic link
1
node_modules/.bin/tmpl.js
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../blueimp-tmpl/js/compile.js
|
||||
2
node_modules/.package-lock.json
generated
vendored
2
node_modules/.package-lock.json
generated
vendored
@@ -71,7 +71,7 @@
|
||||
},
|
||||
"node_modules/ckeditor5-itop-build": {
|
||||
"version": "3.3.0",
|
||||
"resolved": "git+ssh://git@github.com/Combodo/ckeditor5-itop-build.git#21b6edc3348d3f1804e3ae8aab1567ac888a2f30",
|
||||
"resolved": "git+ssh://git@github.com/Combodo/ckeditor5-itop-build.git#0443561b0816d860e31603e0264ebd478f00f0df",
|
||||
"license": "SEE LICENSE IN LICENSE.md"
|
||||
},
|
||||
"node_modules/clipboard": {
|
||||
|
||||
84
node_modules/blueimp-canvas-to-blob/README.md
generated
vendored
Normal file
84
node_modules/blueimp-canvas-to-blob/README.md
generated
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
# JavaScript Canvas to Blob
|
||||
|
||||
## Description
|
||||
Canvas to Blob is a polyfill for the standard JavaScript
|
||||
[canvas.toBlob](http://www.w3.org/TR/html5/scripting-1.html#dom-canvas-toblob)
|
||||
method.
|
||||
|
||||
It can be used to create
|
||||
[Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob)
|
||||
objects from an HTML
|
||||
[canvas](https://developer.mozilla.org/en-US/docs/HTML/Canvas) element.
|
||||
|
||||
## Usage
|
||||
Include the (minified) JavaScript Canvas to Blob script in your HTML markup:
|
||||
|
||||
```html
|
||||
<script src="js/canvas-to-blob.min.js"></script>
|
||||
```
|
||||
|
||||
Then use the *canvas.toBlob()* method in the same way as the native
|
||||
implementation:
|
||||
|
||||
```js
|
||||
var canvas = document.createElement('canvas');
|
||||
/* ... your canvas manipulations ... */
|
||||
if (canvas.toBlob) {
|
||||
canvas.toBlob(
|
||||
function (blob) {
|
||||
// Do something with the blob object,
|
||||
// e.g. creating a multipart form for file uploads:
|
||||
var formData = new FormData();
|
||||
formData.append('file', blob, fileName);
|
||||
/* ... */
|
||||
},
|
||||
'image/jpeg'
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Requirements
|
||||
The JavaScript Canvas to Blob function has zero dependencies.
|
||||
|
||||
However, Canvas to Blob is a very suitable complement to the
|
||||
[JavaScript Load Image](https://github.com/blueimp/JavaScript-Load-Image)
|
||||
function.
|
||||
|
||||
## API
|
||||
In addition to the **canvas.toBlob** polyfill, the JavaScript Canvas to Blob
|
||||
script provides one additional function called **dataURLtoBlob**, which is added
|
||||
to the global window object, unless the library is loaded via a module loader
|
||||
like RequireJS, Browserify or webpack:
|
||||
|
||||
```js
|
||||
// 80x60px GIF image (color black, base64 data):
|
||||
var b64Data = 'R0lGODdhUAA8AIABAAAAAP///ywAAAAAUAA8AAACS4SPqcvtD6' +
|
||||
'OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofE' +
|
||||
'ovGITCqXzKbzCY1Kp9Sq9YrNarfcrvcLDovH5PKsAAA7',
|
||||
imageUrl = 'data:image/gif;base64,' + b64Data,
|
||||
blob = window.dataURLtoBlob && window.dataURLtoBlob(imageUrl);
|
||||
```
|
||||
|
||||
## Browsers
|
||||
The following browsers support either the native or the polyfill
|
||||
*canvas.toBlob()* method:
|
||||
|
||||
### Desktop browsers
|
||||
|
||||
* Google Chrome (see [Chromium issue #67587](https://code.google.com/p/chromium/issues/detail?id=67587))
|
||||
* Apple Safari 6.0+ (see [Mozilla issue #648610](https://bugzilla.mozilla.org/show_bug.cgi?id=648610))
|
||||
* Mozilla Firefox 4.0+
|
||||
* Microsoft Internet Explorer 10.0+
|
||||
|
||||
### Mobile browsers
|
||||
|
||||
* Apple Safari Mobile on iOS 6.0+
|
||||
* Google Chrome on iOS 6.0+
|
||||
* Google Chrome on Android 4.0+
|
||||
|
||||
## Test
|
||||
[JavaScript Canvas to Blob Test](https://blueimp.github.io/JavaScript-Canvas-to-Blob/test/)
|
||||
|
||||
## License
|
||||
The JavaScript Canvas to Blob script is released under the
|
||||
[MIT license](http://www.opensource.org/licenses/MIT).
|
||||
111
node_modules/blueimp-canvas-to-blob/js/canvas-to-blob.js
generated
vendored
Normal file
111
node_modules/blueimp-canvas-to-blob/js/canvas-to-blob.js
generated
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* JavaScript Canvas to Blob
|
||||
* https://github.com/blueimp/JavaScript-Canvas-to-Blob
|
||||
*
|
||||
* Copyright 2012, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* http://www.opensource.org/licenses/MIT
|
||||
*
|
||||
* Based on stackoverflow user Stoive's code snippet:
|
||||
* http://stackoverflow.com/q/4998908
|
||||
*/
|
||||
|
||||
/* global atob, Blob, define */
|
||||
|
||||
;(function (window) {
|
||||
'use strict'
|
||||
|
||||
var CanvasPrototype = window.HTMLCanvasElement &&
|
||||
window.HTMLCanvasElement.prototype
|
||||
var hasBlobConstructor = window.Blob && (function () {
|
||||
try {
|
||||
return Boolean(new Blob())
|
||||
} catch (e) {
|
||||
return false
|
||||
}
|
||||
}())
|
||||
var hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array &&
|
||||
(function () {
|
||||
try {
|
||||
return new Blob([new Uint8Array(100)]).size === 100
|
||||
} catch (e) {
|
||||
return false
|
||||
}
|
||||
}())
|
||||
var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder ||
|
||||
window.MozBlobBuilder || window.MSBlobBuilder
|
||||
var dataURIPattern = /^data:((.*?)(;charset=.*?)?)(;base64)?,/
|
||||
var dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob &&
|
||||
window.ArrayBuffer && window.Uint8Array &&
|
||||
function (dataURI) {
|
||||
var matches,
|
||||
mediaType,
|
||||
isBase64,
|
||||
dataString,
|
||||
byteString,
|
||||
arrayBuffer,
|
||||
intArray,
|
||||
i,
|
||||
bb
|
||||
// Parse the dataURI components as per RFC 2397
|
||||
matches = dataURI.match(dataURIPattern)
|
||||
if (!matches) {
|
||||
throw new Error('invalid data URI')
|
||||
}
|
||||
// Default to text/plain;charset=US-ASCII
|
||||
mediaType = matches[2]
|
||||
? matches[1]
|
||||
: 'text/plain' + (matches[3] || ';charset=US-ASCII')
|
||||
isBase64 = !!matches[4]
|
||||
dataString = dataURI.slice(matches[0].length)
|
||||
if (isBase64) {
|
||||
// Convert base64 to raw binary data held in a string:
|
||||
byteString = atob(dataString)
|
||||
} else {
|
||||
// Convert base64/URLEncoded data component to raw binary:
|
||||
byteString = decodeURIComponent(dataString)
|
||||
}
|
||||
// Write the bytes of the string to an ArrayBuffer:
|
||||
arrayBuffer = new ArrayBuffer(byteString.length)
|
||||
intArray = new Uint8Array(arrayBuffer)
|
||||
for (i = 0; i < byteString.length; i += 1) {
|
||||
intArray[i] = byteString.charCodeAt(i)
|
||||
}
|
||||
// Write the ArrayBuffer (or ArrayBufferView) to a blob:
|
||||
if (hasBlobConstructor) {
|
||||
return new Blob(
|
||||
[hasArrayBufferViewSupport ? intArray : arrayBuffer],
|
||||
{type: mediaType}
|
||||
)
|
||||
}
|
||||
bb = new BlobBuilder()
|
||||
bb.append(arrayBuffer)
|
||||
return bb.getBlob(mediaType)
|
||||
}
|
||||
if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) {
|
||||
if (CanvasPrototype.mozGetAsFile) {
|
||||
CanvasPrototype.toBlob = function (callback, type, quality) {
|
||||
if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) {
|
||||
callback(dataURLtoBlob(this.toDataURL(type, quality)))
|
||||
} else {
|
||||
callback(this.mozGetAsFile('blob', type))
|
||||
}
|
||||
}
|
||||
} else if (CanvasPrototype.toDataURL && dataURLtoBlob) {
|
||||
CanvasPrototype.toBlob = function (callback, type, quality) {
|
||||
callback(dataURLtoBlob(this.toDataURL(type, quality)))
|
||||
}
|
||||
}
|
||||
}
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(function () {
|
||||
return dataURLtoBlob
|
||||
})
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
module.exports = dataURLtoBlob
|
||||
} else {
|
||||
window.dataURLtoBlob = dataURLtoBlob
|
||||
}
|
||||
}(window))
|
||||
39
node_modules/blueimp-canvas-to-blob/package.json
generated
vendored
Normal file
39
node_modules/blueimp-canvas-to-blob/package.json
generated
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"name": "blueimp-canvas-to-blob",
|
||||
"version": "3.5.0",
|
||||
"title": "JavaScript Canvas to Blob",
|
||||
"description": "Canvas to Blob is a polyfill for the standard JavaScript canvas.toBlob method. It can be used to create Blob objects from an HTML canvas element.",
|
||||
"keywords": [
|
||||
"javascript",
|
||||
"canvas",
|
||||
"blob",
|
||||
"convert",
|
||||
"conversion"
|
||||
],
|
||||
"homepage": "https://github.com/blueimp/JavaScript-Canvas-to-Blob",
|
||||
"author": {
|
||||
"name": "Sebastian Tschan",
|
||||
"url": "https://blueimp.net"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/blueimp/JavaScript-Canvas-to-Blob.git"
|
||||
},
|
||||
"license": "MIT",
|
||||
"main": "./js/canvas-to-blob.js",
|
||||
"devDependencies": {
|
||||
"phantomjs-prebuilt": "2.1.13",
|
||||
"mocha-phantomjs-core": "1.3.1",
|
||||
"standard": "8.3.0",
|
||||
"uglify-js": "2.7.3"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "standard js/*.js test/*.js",
|
||||
"unit": "phantomjs node_modules/mocha-phantomjs-core/mocha-phantomjs-core.js test/index.html",
|
||||
"test": "npm run lint && npm run unit",
|
||||
"build": "cd js && uglifyjs canvas-to-blob.js -c -m -o canvas-to-blob.min.js --source-map canvas-to-blob.min.js.map",
|
||||
"preversion": "npm test",
|
||||
"version": "npm run build && git add -A js",
|
||||
"postversion": "git push --tags origin master master:gh-pages && npm publish"
|
||||
}
|
||||
}
|
||||
20
node_modules/blueimp-load-image/LICENSE.txt
generated
vendored
Normal file
20
node_modules/blueimp-load-image/LICENSE.txt
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
MIT License
|
||||
|
||||
Copyright © 2011 Sebastian Tschan, https://blueimp.net
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
1070
node_modules/blueimp-load-image/README.md
generated
vendored
Normal file
1070
node_modules/blueimp-load-image/README.md
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
12
node_modules/blueimp-load-image/js/index.js
generated
vendored
Normal file
12
node_modules/blueimp-load-image/js/index.js
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
/* global module, require */
|
||||
|
||||
module.exports = require('./load-image')
|
||||
|
||||
require('./load-image-scale')
|
||||
require('./load-image-meta')
|
||||
require('./load-image-fetch')
|
||||
require('./load-image-exif')
|
||||
require('./load-image-exif-map')
|
||||
require('./load-image-iptc')
|
||||
require('./load-image-iptc-map')
|
||||
require('./load-image-orientation')
|
||||
424
node_modules/blueimp-load-image/js/load-image-exif-map.js
generated
vendored
Normal file
424
node_modules/blueimp-load-image/js/load-image-exif-map.js
generated
vendored
Normal file
@@ -0,0 +1,424 @@
|
||||
/*
|
||||
* JavaScript Load Image Exif Map
|
||||
* https://github.com/blueimp/JavaScript-Load-Image
|
||||
*
|
||||
* Copyright 2013, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Exif tags mapping based on
|
||||
* https://github.com/jseidelin/exif-js
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/* global define, module, require */
|
||||
|
||||
;(function (factory) {
|
||||
'use strict'
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// Register as an anonymous AMD module:
|
||||
define(['./load-image', './load-image-exif'], factory)
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
factory(require('./load-image'), require('./load-image-exif'))
|
||||
} else {
|
||||
// Browser globals:
|
||||
factory(window.loadImage)
|
||||
}
|
||||
})(function (loadImage) {
|
||||
'use strict'
|
||||
|
||||
var ExifMapProto = loadImage.ExifMap.prototype
|
||||
|
||||
ExifMapProto.tags = {
|
||||
// =================
|
||||
// TIFF tags (IFD0):
|
||||
// =================
|
||||
0x0100: 'ImageWidth',
|
||||
0x0101: 'ImageHeight',
|
||||
0x0102: 'BitsPerSample',
|
||||
0x0103: 'Compression',
|
||||
0x0106: 'PhotometricInterpretation',
|
||||
0x0112: 'Orientation',
|
||||
0x0115: 'SamplesPerPixel',
|
||||
0x011c: 'PlanarConfiguration',
|
||||
0x0212: 'YCbCrSubSampling',
|
||||
0x0213: 'YCbCrPositioning',
|
||||
0x011a: 'XResolution',
|
||||
0x011b: 'YResolution',
|
||||
0x0128: 'ResolutionUnit',
|
||||
0x0111: 'StripOffsets',
|
||||
0x0116: 'RowsPerStrip',
|
||||
0x0117: 'StripByteCounts',
|
||||
0x0201: 'JPEGInterchangeFormat',
|
||||
0x0202: 'JPEGInterchangeFormatLength',
|
||||
0x012d: 'TransferFunction',
|
||||
0x013e: 'WhitePoint',
|
||||
0x013f: 'PrimaryChromaticities',
|
||||
0x0211: 'YCbCrCoefficients',
|
||||
0x0214: 'ReferenceBlackWhite',
|
||||
0x0132: 'DateTime',
|
||||
0x010e: 'ImageDescription',
|
||||
0x010f: 'Make',
|
||||
0x0110: 'Model',
|
||||
0x0131: 'Software',
|
||||
0x013b: 'Artist',
|
||||
0x8298: 'Copyright',
|
||||
0x8769: {
|
||||
// ExifIFDPointer
|
||||
0x9000: 'ExifVersion', // EXIF version
|
||||
0xa000: 'FlashpixVersion', // Flashpix format version
|
||||
0xa001: 'ColorSpace', // Color space information tag
|
||||
0xa002: 'PixelXDimension', // Valid width of meaningful image
|
||||
0xa003: 'PixelYDimension', // Valid height of meaningful image
|
||||
0xa500: 'Gamma',
|
||||
0x9101: 'ComponentsConfiguration', // Information about channels
|
||||
0x9102: 'CompressedBitsPerPixel', // Compressed bits per pixel
|
||||
0x927c: 'MakerNote', // Any desired information written by the manufacturer
|
||||
0x9286: 'UserComment', // Comments by user
|
||||
0xa004: 'RelatedSoundFile', // Name of related sound file
|
||||
0x9003: 'DateTimeOriginal', // Date and time when the original image was generated
|
||||
0x9004: 'DateTimeDigitized', // Date and time when the image was stored digitally
|
||||
0x9010: 'OffsetTime', // Time zone when the image file was last changed
|
||||
0x9011: 'OffsetTimeOriginal', // Time zone when the image was stored digitally
|
||||
0x9012: 'OffsetTimeDigitized', // Time zone when the image was stored digitally
|
||||
0x9290: 'SubSecTime', // Fractions of seconds for DateTime
|
||||
0x9291: 'SubSecTimeOriginal', // Fractions of seconds for DateTimeOriginal
|
||||
0x9292: 'SubSecTimeDigitized', // Fractions of seconds for DateTimeDigitized
|
||||
0x829a: 'ExposureTime', // Exposure time (in seconds)
|
||||
0x829d: 'FNumber',
|
||||
0x8822: 'ExposureProgram', // Exposure program
|
||||
0x8824: 'SpectralSensitivity', // Spectral sensitivity
|
||||
0x8827: 'PhotographicSensitivity', // EXIF 2.3, ISOSpeedRatings in EXIF 2.2
|
||||
0x8828: 'OECF', // Optoelectric conversion factor
|
||||
0x8830: 'SensitivityType',
|
||||
0x8831: 'StandardOutputSensitivity',
|
||||
0x8832: 'RecommendedExposureIndex',
|
||||
0x8833: 'ISOSpeed',
|
||||
0x8834: 'ISOSpeedLatitudeyyy',
|
||||
0x8835: 'ISOSpeedLatitudezzz',
|
||||
0x9201: 'ShutterSpeedValue', // Shutter speed
|
||||
0x9202: 'ApertureValue', // Lens aperture
|
||||
0x9203: 'BrightnessValue', // Value of brightness
|
||||
0x9204: 'ExposureBias', // Exposure bias
|
||||
0x9205: 'MaxApertureValue', // Smallest F number of lens
|
||||
0x9206: 'SubjectDistance', // Distance to subject in meters
|
||||
0x9207: 'MeteringMode', // Metering mode
|
||||
0x9208: 'LightSource', // Kind of light source
|
||||
0x9209: 'Flash', // Flash status
|
||||
0x9214: 'SubjectArea', // Location and area of main subject
|
||||
0x920a: 'FocalLength', // Focal length of the lens in mm
|
||||
0xa20b: 'FlashEnergy', // Strobe energy in BCPS
|
||||
0xa20c: 'SpatialFrequencyResponse',
|
||||
0xa20e: 'FocalPlaneXResolution', // Number of pixels in width direction per FPRUnit
|
||||
0xa20f: 'FocalPlaneYResolution', // Number of pixels in height direction per FPRUnit
|
||||
0xa210: 'FocalPlaneResolutionUnit', // Unit for measuring the focal plane resolution
|
||||
0xa214: 'SubjectLocation', // Location of subject in image
|
||||
0xa215: 'ExposureIndex', // Exposure index selected on camera
|
||||
0xa217: 'SensingMethod', // Image sensor type
|
||||
0xa300: 'FileSource', // Image source (3 == DSC)
|
||||
0xa301: 'SceneType', // Scene type (1 == directly photographed)
|
||||
0xa302: 'CFAPattern', // Color filter array geometric pattern
|
||||
0xa401: 'CustomRendered', // Special processing
|
||||
0xa402: 'ExposureMode', // Exposure mode
|
||||
0xa403: 'WhiteBalance', // 1 = auto white balance, 2 = manual
|
||||
0xa404: 'DigitalZoomRatio', // Digital zoom ratio
|
||||
0xa405: 'FocalLengthIn35mmFilm',
|
||||
0xa406: 'SceneCaptureType', // Type of scene
|
||||
0xa407: 'GainControl', // Degree of overall image gain adjustment
|
||||
0xa408: 'Contrast', // Direction of contrast processing applied by camera
|
||||
0xa409: 'Saturation', // Direction of saturation processing applied by camera
|
||||
0xa40a: 'Sharpness', // Direction of sharpness processing applied by camera
|
||||
0xa40b: 'DeviceSettingDescription',
|
||||
0xa40c: 'SubjectDistanceRange', // Distance to subject
|
||||
0xa420: 'ImageUniqueID', // Identifier assigned uniquely to each image
|
||||
0xa430: 'CameraOwnerName',
|
||||
0xa431: 'BodySerialNumber',
|
||||
0xa432: 'LensSpecification',
|
||||
0xa433: 'LensMake',
|
||||
0xa434: 'LensModel',
|
||||
0xa435: 'LensSerialNumber'
|
||||
},
|
||||
0x8825: {
|
||||
// GPSInfoIFDPointer
|
||||
0x0000: 'GPSVersionID',
|
||||
0x0001: 'GPSLatitudeRef',
|
||||
0x0002: 'GPSLatitude',
|
||||
0x0003: 'GPSLongitudeRef',
|
||||
0x0004: 'GPSLongitude',
|
||||
0x0005: 'GPSAltitudeRef',
|
||||
0x0006: 'GPSAltitude',
|
||||
0x0007: 'GPSTimeStamp',
|
||||
0x0008: 'GPSSatellites',
|
||||
0x0009: 'GPSStatus',
|
||||
0x000a: 'GPSMeasureMode',
|
||||
0x000b: 'GPSDOP',
|
||||
0x000c: 'GPSSpeedRef',
|
||||
0x000d: 'GPSSpeed',
|
||||
0x000e: 'GPSTrackRef',
|
||||
0x000f: 'GPSTrack',
|
||||
0x0010: 'GPSImgDirectionRef',
|
||||
0x0011: 'GPSImgDirection',
|
||||
0x0012: 'GPSMapDatum',
|
||||
0x0013: 'GPSDestLatitudeRef',
|
||||
0x0014: 'GPSDestLatitude',
|
||||
0x0015: 'GPSDestLongitudeRef',
|
||||
0x0016: 'GPSDestLongitude',
|
||||
0x0017: 'GPSDestBearingRef',
|
||||
0x0018: 'GPSDestBearing',
|
||||
0x0019: 'GPSDestDistanceRef',
|
||||
0x001a: 'GPSDestDistance',
|
||||
0x001b: 'GPSProcessingMethod',
|
||||
0x001c: 'GPSAreaInformation',
|
||||
0x001d: 'GPSDateStamp',
|
||||
0x001e: 'GPSDifferential',
|
||||
0x001f: 'GPSHPositioningError'
|
||||
},
|
||||
0xa005: {
|
||||
// InteroperabilityIFDPointer
|
||||
0x0001: 'InteroperabilityIndex'
|
||||
}
|
||||
}
|
||||
|
||||
// IFD1 directory can contain any IFD0 tags:
|
||||
ExifMapProto.tags.ifd1 = ExifMapProto.tags
|
||||
|
||||
ExifMapProto.stringValues = {
|
||||
ExposureProgram: {
|
||||
0: 'Undefined',
|
||||
1: 'Manual',
|
||||
2: 'Normal program',
|
||||
3: 'Aperture priority',
|
||||
4: 'Shutter priority',
|
||||
5: 'Creative program',
|
||||
6: 'Action program',
|
||||
7: 'Portrait mode',
|
||||
8: 'Landscape mode'
|
||||
},
|
||||
MeteringMode: {
|
||||
0: 'Unknown',
|
||||
1: 'Average',
|
||||
2: 'CenterWeightedAverage',
|
||||
3: 'Spot',
|
||||
4: 'MultiSpot',
|
||||
5: 'Pattern',
|
||||
6: 'Partial',
|
||||
255: 'Other'
|
||||
},
|
||||
LightSource: {
|
||||
0: 'Unknown',
|
||||
1: 'Daylight',
|
||||
2: 'Fluorescent',
|
||||
3: 'Tungsten (incandescent light)',
|
||||
4: 'Flash',
|
||||
9: 'Fine weather',
|
||||
10: 'Cloudy weather',
|
||||
11: 'Shade',
|
||||
12: 'Daylight fluorescent (D 5700 - 7100K)',
|
||||
13: 'Day white fluorescent (N 4600 - 5400K)',
|
||||
14: 'Cool white fluorescent (W 3900 - 4500K)',
|
||||
15: 'White fluorescent (WW 3200 - 3700K)',
|
||||
17: 'Standard light A',
|
||||
18: 'Standard light B',
|
||||
19: 'Standard light C',
|
||||
20: 'D55',
|
||||
21: 'D65',
|
||||
22: 'D75',
|
||||
23: 'D50',
|
||||
24: 'ISO studio tungsten',
|
||||
255: 'Other'
|
||||
},
|
||||
Flash: {
|
||||
0x0000: 'Flash did not fire',
|
||||
0x0001: 'Flash fired',
|
||||
0x0005: 'Strobe return light not detected',
|
||||
0x0007: 'Strobe return light detected',
|
||||
0x0009: 'Flash fired, compulsory flash mode',
|
||||
0x000d: 'Flash fired, compulsory flash mode, return light not detected',
|
||||
0x000f: 'Flash fired, compulsory flash mode, return light detected',
|
||||
0x0010: 'Flash did not fire, compulsory flash mode',
|
||||
0x0018: 'Flash did not fire, auto mode',
|
||||
0x0019: 'Flash fired, auto mode',
|
||||
0x001d: 'Flash fired, auto mode, return light not detected',
|
||||
0x001f: 'Flash fired, auto mode, return light detected',
|
||||
0x0020: 'No flash function',
|
||||
0x0041: 'Flash fired, red-eye reduction mode',
|
||||
0x0045: 'Flash fired, red-eye reduction mode, return light not detected',
|
||||
0x0047: 'Flash fired, red-eye reduction mode, return light detected',
|
||||
0x0049: 'Flash fired, compulsory flash mode, red-eye reduction mode',
|
||||
0x004d:
|
||||
'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected',
|
||||
0x004f:
|
||||
'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected',
|
||||
0x0059: 'Flash fired, auto mode, red-eye reduction mode',
|
||||
0x005d:
|
||||
'Flash fired, auto mode, return light not detected, red-eye reduction mode',
|
||||
0x005f:
|
||||
'Flash fired, auto mode, return light detected, red-eye reduction mode'
|
||||
},
|
||||
SensingMethod: {
|
||||
1: 'Undefined',
|
||||
2: 'One-chip color area sensor',
|
||||
3: 'Two-chip color area sensor',
|
||||
4: 'Three-chip color area sensor',
|
||||
5: 'Color sequential area sensor',
|
||||
7: 'Trilinear sensor',
|
||||
8: 'Color sequential linear sensor'
|
||||
},
|
||||
SceneCaptureType: {
|
||||
0: 'Standard',
|
||||
1: 'Landscape',
|
||||
2: 'Portrait',
|
||||
3: 'Night scene'
|
||||
},
|
||||
SceneType: {
|
||||
1: 'Directly photographed'
|
||||
},
|
||||
CustomRendered: {
|
||||
0: 'Normal process',
|
||||
1: 'Custom process'
|
||||
},
|
||||
WhiteBalance: {
|
||||
0: 'Auto white balance',
|
||||
1: 'Manual white balance'
|
||||
},
|
||||
GainControl: {
|
||||
0: 'None',
|
||||
1: 'Low gain up',
|
||||
2: 'High gain up',
|
||||
3: 'Low gain down',
|
||||
4: 'High gain down'
|
||||
},
|
||||
Contrast: {
|
||||
0: 'Normal',
|
||||
1: 'Soft',
|
||||
2: 'Hard'
|
||||
},
|
||||
Saturation: {
|
||||
0: 'Normal',
|
||||
1: 'Low saturation',
|
||||
2: 'High saturation'
|
||||
},
|
||||
Sharpness: {
|
||||
0: 'Normal',
|
||||
1: 'Soft',
|
||||
2: 'Hard'
|
||||
},
|
||||
SubjectDistanceRange: {
|
||||
0: 'Unknown',
|
||||
1: 'Macro',
|
||||
2: 'Close view',
|
||||
3: 'Distant view'
|
||||
},
|
||||
FileSource: {
|
||||
3: 'DSC'
|
||||
},
|
||||
ComponentsConfiguration: {
|
||||
0: '',
|
||||
1: 'Y',
|
||||
2: 'Cb',
|
||||
3: 'Cr',
|
||||
4: 'R',
|
||||
5: 'G',
|
||||
6: 'B'
|
||||
},
|
||||
Orientation: {
|
||||
1: 'Original',
|
||||
2: 'Horizontal flip',
|
||||
3: 'Rotate 180° CCW',
|
||||
4: 'Vertical flip',
|
||||
5: 'Vertical flip + Rotate 90° CW',
|
||||
6: 'Rotate 90° CW',
|
||||
7: 'Horizontal flip + Rotate 90° CW',
|
||||
8: 'Rotate 90° CCW'
|
||||
}
|
||||
}
|
||||
|
||||
ExifMapProto.getText = function (name) {
|
||||
var value = this.get(name)
|
||||
switch (name) {
|
||||
case 'LightSource':
|
||||
case 'Flash':
|
||||
case 'MeteringMode':
|
||||
case 'ExposureProgram':
|
||||
case 'SensingMethod':
|
||||
case 'SceneCaptureType':
|
||||
case 'SceneType':
|
||||
case 'CustomRendered':
|
||||
case 'WhiteBalance':
|
||||
case 'GainControl':
|
||||
case 'Contrast':
|
||||
case 'Saturation':
|
||||
case 'Sharpness':
|
||||
case 'SubjectDistanceRange':
|
||||
case 'FileSource':
|
||||
case 'Orientation':
|
||||
return this.stringValues[name][value]
|
||||
case 'ExifVersion':
|
||||
case 'FlashpixVersion':
|
||||
if (!value) return
|
||||
return String.fromCharCode(value[0], value[1], value[2], value[3])
|
||||
case 'ComponentsConfiguration':
|
||||
if (!value) return
|
||||
return (
|
||||
this.stringValues[name][value[0]] +
|
||||
this.stringValues[name][value[1]] +
|
||||
this.stringValues[name][value[2]] +
|
||||
this.stringValues[name][value[3]]
|
||||
)
|
||||
case 'GPSVersionID':
|
||||
if (!value) return
|
||||
return value[0] + '.' + value[1] + '.' + value[2] + '.' + value[3]
|
||||
}
|
||||
return String(value)
|
||||
}
|
||||
|
||||
ExifMapProto.getAll = function () {
|
||||
var map = {}
|
||||
var prop
|
||||
var obj
|
||||
var name
|
||||
for (prop in this) {
|
||||
if (Object.prototype.hasOwnProperty.call(this, prop)) {
|
||||
obj = this[prop]
|
||||
if (obj && obj.getAll) {
|
||||
map[this.ifds[prop].name] = obj.getAll()
|
||||
} else {
|
||||
name = this.tags[prop]
|
||||
if (name) map[name] = this.getText(name)
|
||||
}
|
||||
}
|
||||
}
|
||||
return map
|
||||
}
|
||||
|
||||
ExifMapProto.getName = function (tagCode) {
|
||||
var name = this.tags[tagCode]
|
||||
if (typeof name === 'object') return this.ifds[tagCode].name
|
||||
return name
|
||||
}
|
||||
|
||||
// Extend the map of tag names to tag codes:
|
||||
;(function () {
|
||||
var tags = ExifMapProto.tags
|
||||
var prop
|
||||
var ifd
|
||||
var subTags
|
||||
// Map the tag names to tags:
|
||||
for (prop in tags) {
|
||||
if (Object.prototype.hasOwnProperty.call(tags, prop)) {
|
||||
ifd = ExifMapProto.ifds[prop]
|
||||
if (ifd) {
|
||||
subTags = tags[prop]
|
||||
for (prop in subTags) {
|
||||
if (Object.prototype.hasOwnProperty.call(subTags, prop)) {
|
||||
ifd.map[subTags[prop]] = Number(prop)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ExifMapProto.map[tags[prop]] = Number(prop)
|
||||
}
|
||||
}
|
||||
}
|
||||
})()
|
||||
})
|
||||
460
node_modules/blueimp-load-image/js/load-image-exif.js
generated
vendored
Normal file
460
node_modules/blueimp-load-image/js/load-image-exif.js
generated
vendored
Normal file
@@ -0,0 +1,460 @@
|
||||
/*
|
||||
* JavaScript Load Image Exif Parser
|
||||
* https://github.com/blueimp/JavaScript-Load-Image
|
||||
*
|
||||
* Copyright 2013, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/* global define, module, require, DataView */
|
||||
|
||||
/* eslint-disable no-console */
|
||||
|
||||
;(function (factory) {
|
||||
'use strict'
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// Register as an anonymous AMD module:
|
||||
define(['./load-image', './load-image-meta'], factory)
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
factory(require('./load-image'), require('./load-image-meta'))
|
||||
} else {
|
||||
// Browser globals:
|
||||
factory(window.loadImage)
|
||||
}
|
||||
})(function (loadImage) {
|
||||
'use strict'
|
||||
|
||||
/**
|
||||
* Exif tag map
|
||||
*
|
||||
* @name ExifMap
|
||||
* @class
|
||||
* @param {number|string} tagCode IFD tag code
|
||||
*/
|
||||
function ExifMap(tagCode) {
|
||||
if (tagCode) {
|
||||
Object.defineProperty(this, 'map', {
|
||||
value: this.ifds[tagCode].map
|
||||
})
|
||||
Object.defineProperty(this, 'tags', {
|
||||
value: (this.tags && this.tags[tagCode]) || {}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
ExifMap.prototype.map = {
|
||||
Orientation: 0x0112,
|
||||
Thumbnail: 'ifd1',
|
||||
Blob: 0x0201, // Alias for JPEGInterchangeFormat
|
||||
Exif: 0x8769,
|
||||
GPSInfo: 0x8825,
|
||||
Interoperability: 0xa005
|
||||
}
|
||||
|
||||
ExifMap.prototype.ifds = {
|
||||
ifd1: { name: 'Thumbnail', map: ExifMap.prototype.map },
|
||||
0x8769: { name: 'Exif', map: {} },
|
||||
0x8825: { name: 'GPSInfo', map: {} },
|
||||
0xa005: { name: 'Interoperability', map: {} }
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves exif tag value
|
||||
*
|
||||
* @param {number|string} id Exif tag code or name
|
||||
* @returns {object} Exif tag value
|
||||
*/
|
||||
ExifMap.prototype.get = function (id) {
|
||||
return this[id] || this[this.map[id]]
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Exif Thumbnail data as Blob.
|
||||
*
|
||||
* @param {DataView} dataView Data view interface
|
||||
* @param {number} offset Thumbnail data offset
|
||||
* @param {number} length Thumbnail data length
|
||||
* @returns {undefined|Blob} Returns the Thumbnail Blob or undefined
|
||||
*/
|
||||
function getExifThumbnail(dataView, offset, length) {
|
||||
if (!length) return
|
||||
if (offset + length > dataView.byteLength) {
|
||||
console.log('Invalid Exif data: Invalid thumbnail data.')
|
||||
return
|
||||
}
|
||||
return new Blob(
|
||||
[loadImage.bufferSlice.call(dataView.buffer, offset, offset + length)],
|
||||
{
|
||||
type: 'image/jpeg'
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
var ExifTagTypes = {
|
||||
// byte, 8-bit unsigned int:
|
||||
1: {
|
||||
getValue: function (dataView, dataOffset) {
|
||||
return dataView.getUint8(dataOffset)
|
||||
},
|
||||
size: 1
|
||||
},
|
||||
// ascii, 8-bit byte:
|
||||
2: {
|
||||
getValue: function (dataView, dataOffset) {
|
||||
return String.fromCharCode(dataView.getUint8(dataOffset))
|
||||
},
|
||||
size: 1,
|
||||
ascii: true
|
||||
},
|
||||
// short, 16 bit int:
|
||||
3: {
|
||||
getValue: function (dataView, dataOffset, littleEndian) {
|
||||
return dataView.getUint16(dataOffset, littleEndian)
|
||||
},
|
||||
size: 2
|
||||
},
|
||||
// long, 32 bit int:
|
||||
4: {
|
||||
getValue: function (dataView, dataOffset, littleEndian) {
|
||||
return dataView.getUint32(dataOffset, littleEndian)
|
||||
},
|
||||
size: 4
|
||||
},
|
||||
// rational = two long values, first is numerator, second is denominator:
|
||||
5: {
|
||||
getValue: function (dataView, dataOffset, littleEndian) {
|
||||
return (
|
||||
dataView.getUint32(dataOffset, littleEndian) /
|
||||
dataView.getUint32(dataOffset + 4, littleEndian)
|
||||
)
|
||||
},
|
||||
size: 8
|
||||
},
|
||||
// slong, 32 bit signed int:
|
||||
9: {
|
||||
getValue: function (dataView, dataOffset, littleEndian) {
|
||||
return dataView.getInt32(dataOffset, littleEndian)
|
||||
},
|
||||
size: 4
|
||||
},
|
||||
// srational, two slongs, first is numerator, second is denominator:
|
||||
10: {
|
||||
getValue: function (dataView, dataOffset, littleEndian) {
|
||||
return (
|
||||
dataView.getInt32(dataOffset, littleEndian) /
|
||||
dataView.getInt32(dataOffset + 4, littleEndian)
|
||||
)
|
||||
},
|
||||
size: 8
|
||||
}
|
||||
}
|
||||
// undefined, 8-bit byte, value depending on field:
|
||||
ExifTagTypes[7] = ExifTagTypes[1]
|
||||
|
||||
/**
|
||||
* Returns Exif tag value.
|
||||
*
|
||||
* @param {DataView} dataView Data view interface
|
||||
* @param {number} tiffOffset TIFF offset
|
||||
* @param {number} offset Tag offset
|
||||
* @param {number} type Tag type
|
||||
* @param {number} length Tag length
|
||||
* @param {boolean} littleEndian Little endian encoding
|
||||
* @returns {object} Tag value
|
||||
*/
|
||||
function getExifValue(
|
||||
dataView,
|
||||
tiffOffset,
|
||||
offset,
|
||||
type,
|
||||
length,
|
||||
littleEndian
|
||||
) {
|
||||
var tagType = ExifTagTypes[type]
|
||||
var tagSize
|
||||
var dataOffset
|
||||
var values
|
||||
var i
|
||||
var str
|
||||
var c
|
||||
if (!tagType) {
|
||||
console.log('Invalid Exif data: Invalid tag type.')
|
||||
return
|
||||
}
|
||||
tagSize = tagType.size * length
|
||||
// Determine if the value is contained in the dataOffset bytes,
|
||||
// or if the value at the dataOffset is a pointer to the actual data:
|
||||
dataOffset =
|
||||
tagSize > 4
|
||||
? tiffOffset + dataView.getUint32(offset + 8, littleEndian)
|
||||
: offset + 8
|
||||
if (dataOffset + tagSize > dataView.byteLength) {
|
||||
console.log('Invalid Exif data: Invalid data offset.')
|
||||
return
|
||||
}
|
||||
if (length === 1) {
|
||||
return tagType.getValue(dataView, dataOffset, littleEndian)
|
||||
}
|
||||
values = []
|
||||
for (i = 0; i < length; i += 1) {
|
||||
values[i] = tagType.getValue(
|
||||
dataView,
|
||||
dataOffset + i * tagType.size,
|
||||
littleEndian
|
||||
)
|
||||
}
|
||||
if (tagType.ascii) {
|
||||
str = ''
|
||||
// Concatenate the chars:
|
||||
for (i = 0; i < values.length; i += 1) {
|
||||
c = values[i]
|
||||
// Ignore the terminating NULL byte(s):
|
||||
if (c === '\u0000') {
|
||||
break
|
||||
}
|
||||
str += c
|
||||
}
|
||||
return str
|
||||
}
|
||||
return values
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the given tag should be included.
|
||||
*
|
||||
* @param {object} includeTags Map of tags to include
|
||||
* @param {object} excludeTags Map of tags to exclude
|
||||
* @param {number|string} tagCode Tag code to check
|
||||
* @returns {boolean} True if the tag should be included
|
||||
*/
|
||||
function shouldIncludeTag(includeTags, excludeTags, tagCode) {
|
||||
return (
|
||||
(!includeTags || includeTags[tagCode]) &&
|
||||
(!excludeTags || excludeTags[tagCode] !== true)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses Exif tags.
|
||||
*
|
||||
* @param {DataView} dataView Data view interface
|
||||
* @param {number} tiffOffset TIFF offset
|
||||
* @param {number} dirOffset Directory offset
|
||||
* @param {boolean} littleEndian Little endian encoding
|
||||
* @param {ExifMap} tags Map to store parsed exif tags
|
||||
* @param {ExifMap} tagOffsets Map to store parsed exif tag offsets
|
||||
* @param {object} includeTags Map of tags to include
|
||||
* @param {object} excludeTags Map of tags to exclude
|
||||
* @returns {number} Next directory offset
|
||||
*/
|
||||
function parseExifTags(
|
||||
dataView,
|
||||
tiffOffset,
|
||||
dirOffset,
|
||||
littleEndian,
|
||||
tags,
|
||||
tagOffsets,
|
||||
includeTags,
|
||||
excludeTags
|
||||
) {
|
||||
var tagsNumber, dirEndOffset, i, tagOffset, tagNumber, tagValue
|
||||
if (dirOffset + 6 > dataView.byteLength) {
|
||||
console.log('Invalid Exif data: Invalid directory offset.')
|
||||
return
|
||||
}
|
||||
tagsNumber = dataView.getUint16(dirOffset, littleEndian)
|
||||
dirEndOffset = dirOffset + 2 + 12 * tagsNumber
|
||||
if (dirEndOffset + 4 > dataView.byteLength) {
|
||||
console.log('Invalid Exif data: Invalid directory size.')
|
||||
return
|
||||
}
|
||||
for (i = 0; i < tagsNumber; i += 1) {
|
||||
tagOffset = dirOffset + 2 + 12 * i
|
||||
tagNumber = dataView.getUint16(tagOffset, littleEndian)
|
||||
if (!shouldIncludeTag(includeTags, excludeTags, tagNumber)) continue
|
||||
tagValue = getExifValue(
|
||||
dataView,
|
||||
tiffOffset,
|
||||
tagOffset,
|
||||
dataView.getUint16(tagOffset + 2, littleEndian), // tag type
|
||||
dataView.getUint32(tagOffset + 4, littleEndian), // tag length
|
||||
littleEndian
|
||||
)
|
||||
tags[tagNumber] = tagValue
|
||||
if (tagOffsets) {
|
||||
tagOffsets[tagNumber] = tagOffset
|
||||
}
|
||||
}
|
||||
// Return the offset to the next directory:
|
||||
return dataView.getUint32(dirEndOffset, littleEndian)
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses tags in a given IFD (Image File Directory).
|
||||
*
|
||||
* @param {object} data Data object to store exif tags and offsets
|
||||
* @param {number|string} tagCode IFD tag code
|
||||
* @param {DataView} dataView Data view interface
|
||||
* @param {number} tiffOffset TIFF offset
|
||||
* @param {boolean} littleEndian Little endian encoding
|
||||
* @param {object} includeTags Map of tags to include
|
||||
* @param {object} excludeTags Map of tags to exclude
|
||||
*/
|
||||
function parseExifIFD(
|
||||
data,
|
||||
tagCode,
|
||||
dataView,
|
||||
tiffOffset,
|
||||
littleEndian,
|
||||
includeTags,
|
||||
excludeTags
|
||||
) {
|
||||
var dirOffset = data.exif[tagCode]
|
||||
if (dirOffset) {
|
||||
data.exif[tagCode] = new ExifMap(tagCode)
|
||||
if (data.exifOffsets) {
|
||||
data.exifOffsets[tagCode] = new ExifMap(tagCode)
|
||||
}
|
||||
parseExifTags(
|
||||
dataView,
|
||||
tiffOffset,
|
||||
tiffOffset + dirOffset,
|
||||
littleEndian,
|
||||
data.exif[tagCode],
|
||||
data.exifOffsets && data.exifOffsets[tagCode],
|
||||
includeTags && includeTags[tagCode],
|
||||
excludeTags && excludeTags[tagCode]
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
loadImage.parseExifData = function (dataView, offset, length, data, options) {
|
||||
if (options.disableExif) {
|
||||
return
|
||||
}
|
||||
var includeTags = options.includeExifTags
|
||||
var excludeTags = options.excludeExifTags || {
|
||||
0x8769: {
|
||||
// ExifIFDPointer
|
||||
0x927c: true // MakerNote
|
||||
}
|
||||
}
|
||||
var tiffOffset = offset + 10
|
||||
var littleEndian
|
||||
var dirOffset
|
||||
var thumbnailIFD
|
||||
// Check for the ASCII code for "Exif" (0x45786966):
|
||||
if (dataView.getUint32(offset + 4) !== 0x45786966) {
|
||||
// No Exif data, might be XMP data instead
|
||||
return
|
||||
}
|
||||
if (tiffOffset + 8 > dataView.byteLength) {
|
||||
console.log('Invalid Exif data: Invalid segment size.')
|
||||
return
|
||||
}
|
||||
// Check for the two null bytes:
|
||||
if (dataView.getUint16(offset + 8) !== 0x0000) {
|
||||
console.log('Invalid Exif data: Missing byte alignment offset.')
|
||||
return
|
||||
}
|
||||
// Check the byte alignment:
|
||||
switch (dataView.getUint16(tiffOffset)) {
|
||||
case 0x4949:
|
||||
littleEndian = true
|
||||
break
|
||||
case 0x4d4d:
|
||||
littleEndian = false
|
||||
break
|
||||
default:
|
||||
console.log('Invalid Exif data: Invalid byte alignment marker.')
|
||||
return
|
||||
}
|
||||
// Check for the TIFF tag marker (0x002A):
|
||||
if (dataView.getUint16(tiffOffset + 2, littleEndian) !== 0x002a) {
|
||||
console.log('Invalid Exif data: Missing TIFF marker.')
|
||||
return
|
||||
}
|
||||
// Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
|
||||
dirOffset = dataView.getUint32(tiffOffset + 4, littleEndian)
|
||||
// Create the exif object to store the tags:
|
||||
data.exif = new ExifMap()
|
||||
if (!options.disableExifOffsets) {
|
||||
data.exifOffsets = new ExifMap()
|
||||
data.exifTiffOffset = tiffOffset
|
||||
data.exifLittleEndian = littleEndian
|
||||
}
|
||||
// Parse the tags of the main image directory (IFD0) and retrieve the
|
||||
// offset to the next directory (IFD1), usually the thumbnail directory:
|
||||
dirOffset = parseExifTags(
|
||||
dataView,
|
||||
tiffOffset,
|
||||
tiffOffset + dirOffset,
|
||||
littleEndian,
|
||||
data.exif,
|
||||
data.exifOffsets,
|
||||
includeTags,
|
||||
excludeTags
|
||||
)
|
||||
if (dirOffset && shouldIncludeTag(includeTags, excludeTags, 'ifd1')) {
|
||||
data.exif.ifd1 = dirOffset
|
||||
if (data.exifOffsets) {
|
||||
data.exifOffsets.ifd1 = tiffOffset + dirOffset
|
||||
}
|
||||
}
|
||||
Object.keys(data.exif.ifds).forEach(function (tagCode) {
|
||||
parseExifIFD(
|
||||
data,
|
||||
tagCode,
|
||||
dataView,
|
||||
tiffOffset,
|
||||
littleEndian,
|
||||
includeTags,
|
||||
excludeTags
|
||||
)
|
||||
})
|
||||
thumbnailIFD = data.exif.ifd1
|
||||
// Check for JPEG Thumbnail offset and data length:
|
||||
if (thumbnailIFD && thumbnailIFD[0x0201]) {
|
||||
thumbnailIFD[0x0201] = getExifThumbnail(
|
||||
dataView,
|
||||
tiffOffset + thumbnailIFD[0x0201],
|
||||
thumbnailIFD[0x0202] // Thumbnail data length
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// Registers the Exif parser for the APP1 JPEG metadata segment:
|
||||
loadImage.metaDataParsers.jpeg[0xffe1].push(loadImage.parseExifData)
|
||||
|
||||
loadImage.exifWriters = {
|
||||
// Orientation writer:
|
||||
0x0112: function (buffer, data, value) {
|
||||
var orientationOffset = data.exifOffsets[0x0112]
|
||||
if (!orientationOffset) return buffer
|
||||
var view = new DataView(buffer, orientationOffset + 8, 2)
|
||||
view.setUint16(0, value, data.exifLittleEndian)
|
||||
return buffer
|
||||
}
|
||||
}
|
||||
|
||||
loadImage.writeExifData = function (buffer, data, id, value) {
|
||||
return loadImage.exifWriters[data.exif.map[id]](buffer, data, value)
|
||||
}
|
||||
|
||||
loadImage.ExifMap = ExifMap
|
||||
|
||||
// Adds the following properties to the parseMetaData callback data:
|
||||
// - exif: The parsed Exif tags
|
||||
// - exifOffsets: The parsed Exif tag offsets
|
||||
// - exifTiffOffset: TIFF header offset (used for offset pointers)
|
||||
// - exifLittleEndian: little endian order if true, big endian if false
|
||||
|
||||
// Adds the following options to the parseMetaData method:
|
||||
// - disableExif: Disables Exif parsing when true.
|
||||
// - disableExifOffsets: Disables storing Exif tag offsets when true.
|
||||
// - includeExifTags: A map of Exif tags to include for parsing.
|
||||
// - excludeExifTags: A map of Exif tags to exclude from parsing.
|
||||
})
|
||||
106
node_modules/blueimp-load-image/js/load-image-fetch.js
generated
vendored
Normal file
106
node_modules/blueimp-load-image/js/load-image-fetch.js
generated
vendored
Normal file
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* JavaScript Load Image Fetch
|
||||
* https://github.com/blueimp/JavaScript-Load-Image
|
||||
*
|
||||
* Copyright 2017, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/* global define, module, require, Promise */
|
||||
|
||||
;(function (factory) {
|
||||
'use strict'
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// Register as an anonymous AMD module:
|
||||
define(['./load-image'], factory)
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
factory(require('./load-image'))
|
||||
} else {
|
||||
// Browser globals:
|
||||
factory(window.loadImage)
|
||||
}
|
||||
})(function (loadImage) {
|
||||
'use strict'
|
||||
|
||||
var global = loadImage.global
|
||||
|
||||
if (
|
||||
global.fetch &&
|
||||
global.Request &&
|
||||
global.Response &&
|
||||
global.Response.prototype.blob
|
||||
) {
|
||||
loadImage.fetchBlob = function (url, callback, options) {
|
||||
/**
|
||||
* Fetch response handler.
|
||||
*
|
||||
* @param {Response} response Fetch response
|
||||
* @returns {Blob} Fetched Blob.
|
||||
*/
|
||||
function responseHandler(response) {
|
||||
return response.blob()
|
||||
}
|
||||
if (global.Promise && typeof callback !== 'function') {
|
||||
return fetch(new Request(url, callback)).then(responseHandler)
|
||||
}
|
||||
fetch(new Request(url, options))
|
||||
.then(responseHandler)
|
||||
.then(callback)
|
||||
[
|
||||
// Avoid parsing error in IE<9, where catch is a reserved word.
|
||||
// eslint-disable-next-line dot-notation
|
||||
'catch'
|
||||
](function (err) {
|
||||
callback(null, err)
|
||||
})
|
||||
}
|
||||
} else if (
|
||||
global.XMLHttpRequest &&
|
||||
// https://xhr.spec.whatwg.org/#the-responsetype-attribute
|
||||
new XMLHttpRequest().responseType === ''
|
||||
) {
|
||||
loadImage.fetchBlob = function (url, callback, options) {
|
||||
/**
|
||||
* Promise executor
|
||||
*
|
||||
* @param {Function} resolve Resolution function
|
||||
* @param {Function} reject Rejection function
|
||||
*/
|
||||
function executor(resolve, reject) {
|
||||
options = options || {} // eslint-disable-line no-param-reassign
|
||||
var req = new XMLHttpRequest()
|
||||
req.open(options.method || 'GET', url)
|
||||
if (options.headers) {
|
||||
Object.keys(options.headers).forEach(function (key) {
|
||||
req.setRequestHeader(key, options.headers[key])
|
||||
})
|
||||
}
|
||||
req.withCredentials = options.credentials === 'include'
|
||||
req.responseType = 'blob'
|
||||
req.onload = function () {
|
||||
resolve(req.response)
|
||||
}
|
||||
req.onerror =
|
||||
req.onabort =
|
||||
req.ontimeout =
|
||||
function (err) {
|
||||
if (resolve === reject) {
|
||||
// Not using Promises
|
||||
reject(null, err)
|
||||
} else {
|
||||
reject(err)
|
||||
}
|
||||
}
|
||||
req.send(options.body)
|
||||
}
|
||||
if (global.Promise && typeof callback !== 'function') {
|
||||
options = callback // eslint-disable-line no-param-reassign
|
||||
return new Promise(executor)
|
||||
}
|
||||
return executor(callback, callback)
|
||||
}
|
||||
}
|
||||
})
|
||||
169
node_modules/blueimp-load-image/js/load-image-iptc-map.js
generated
vendored
Normal file
169
node_modules/blueimp-load-image/js/load-image-iptc-map.js
generated
vendored
Normal file
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* JavaScript Load Image IPTC Map
|
||||
* https://github.com/blueimp/JavaScript-Load-Image
|
||||
*
|
||||
* Copyright 2013, Sebastian Tschan
|
||||
* Copyright 2018, Dave Bevan
|
||||
*
|
||||
* IPTC tags mapping based on
|
||||
* https://iptc.org/standards/photo-metadata
|
||||
* https://exiftool.org/TagNames/IPTC.html
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/* global define, module, require */
|
||||
|
||||
;(function (factory) {
|
||||
'use strict'
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// Register as an anonymous AMD module:
|
||||
define(['./load-image', './load-image-iptc'], factory)
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
factory(require('./load-image'), require('./load-image-iptc'))
|
||||
} else {
|
||||
// Browser globals:
|
||||
factory(window.loadImage)
|
||||
}
|
||||
})(function (loadImage) {
|
||||
'use strict'
|
||||
|
||||
var IptcMapProto = loadImage.IptcMap.prototype
|
||||
|
||||
IptcMapProto.tags = {
|
||||
0: 'ApplicationRecordVersion',
|
||||
3: 'ObjectTypeReference',
|
||||
4: 'ObjectAttributeReference',
|
||||
5: 'ObjectName',
|
||||
7: 'EditStatus',
|
||||
8: 'EditorialUpdate',
|
||||
10: 'Urgency',
|
||||
12: 'SubjectReference',
|
||||
15: 'Category',
|
||||
20: 'SupplementalCategories',
|
||||
22: 'FixtureIdentifier',
|
||||
25: 'Keywords',
|
||||
26: 'ContentLocationCode',
|
||||
27: 'ContentLocationName',
|
||||
30: 'ReleaseDate',
|
||||
35: 'ReleaseTime',
|
||||
37: 'ExpirationDate',
|
||||
38: 'ExpirationTime',
|
||||
40: 'SpecialInstructions',
|
||||
42: 'ActionAdvised',
|
||||
45: 'ReferenceService',
|
||||
47: 'ReferenceDate',
|
||||
50: 'ReferenceNumber',
|
||||
55: 'DateCreated',
|
||||
60: 'TimeCreated',
|
||||
62: 'DigitalCreationDate',
|
||||
63: 'DigitalCreationTime',
|
||||
65: 'OriginatingProgram',
|
||||
70: 'ProgramVersion',
|
||||
75: 'ObjectCycle',
|
||||
80: 'Byline',
|
||||
85: 'BylineTitle',
|
||||
90: 'City',
|
||||
92: 'Sublocation',
|
||||
95: 'State',
|
||||
100: 'CountryCode',
|
||||
101: 'Country',
|
||||
103: 'OriginalTransmissionReference',
|
||||
105: 'Headline',
|
||||
110: 'Credit',
|
||||
115: 'Source',
|
||||
116: 'CopyrightNotice',
|
||||
118: 'Contact',
|
||||
120: 'Caption',
|
||||
121: 'LocalCaption',
|
||||
122: 'Writer',
|
||||
125: 'RasterizedCaption',
|
||||
130: 'ImageType',
|
||||
131: 'ImageOrientation',
|
||||
135: 'LanguageIdentifier',
|
||||
150: 'AudioType',
|
||||
151: 'AudioSamplingRate',
|
||||
152: 'AudioSamplingResolution',
|
||||
153: 'AudioDuration',
|
||||
154: 'AudioOutcue',
|
||||
184: 'JobID',
|
||||
185: 'MasterDocumentID',
|
||||
186: 'ShortDocumentID',
|
||||
187: 'UniqueDocumentID',
|
||||
188: 'OwnerID',
|
||||
200: 'ObjectPreviewFileFormat',
|
||||
201: 'ObjectPreviewFileVersion',
|
||||
202: 'ObjectPreviewData',
|
||||
221: 'Prefs',
|
||||
225: 'ClassifyState',
|
||||
228: 'SimilarityIndex',
|
||||
230: 'DocumentNotes',
|
||||
231: 'DocumentHistory',
|
||||
232: 'ExifCameraInfo',
|
||||
255: 'CatalogSets'
|
||||
}
|
||||
|
||||
IptcMapProto.stringValues = {
|
||||
10: {
|
||||
0: '0 (reserved)',
|
||||
1: '1 (most urgent)',
|
||||
2: '2',
|
||||
3: '3',
|
||||
4: '4',
|
||||
5: '5 (normal urgency)',
|
||||
6: '6',
|
||||
7: '7',
|
||||
8: '8 (least urgent)',
|
||||
9: '9 (user-defined priority)'
|
||||
},
|
||||
75: {
|
||||
a: 'Morning',
|
||||
b: 'Both Morning and Evening',
|
||||
p: 'Evening'
|
||||
},
|
||||
131: {
|
||||
L: 'Landscape',
|
||||
P: 'Portrait',
|
||||
S: 'Square'
|
||||
}
|
||||
}
|
||||
|
||||
IptcMapProto.getText = function (id) {
|
||||
var value = this.get(id)
|
||||
var tagCode = this.map[id]
|
||||
var stringValue = this.stringValues[tagCode]
|
||||
if (stringValue) return stringValue[value]
|
||||
return String(value)
|
||||
}
|
||||
|
||||
IptcMapProto.getAll = function () {
|
||||
var map = {}
|
||||
var prop
|
||||
var name
|
||||
for (prop in this) {
|
||||
if (Object.prototype.hasOwnProperty.call(this, prop)) {
|
||||
name = this.tags[prop]
|
||||
if (name) map[name] = this.getText(name)
|
||||
}
|
||||
}
|
||||
return map
|
||||
}
|
||||
|
||||
IptcMapProto.getName = function (tagCode) {
|
||||
return this.tags[tagCode]
|
||||
}
|
||||
|
||||
// Extend the map of tag names to tag codes:
|
||||
;(function () {
|
||||
var tags = IptcMapProto.tags
|
||||
var map = IptcMapProto.map || {}
|
||||
var prop
|
||||
// Map the tag names to tags:
|
||||
for (prop in tags) {
|
||||
if (Object.prototype.hasOwnProperty.call(tags, prop)) {
|
||||
map[tags[prop]] = Number(prop)
|
||||
}
|
||||
}
|
||||
})()
|
||||
})
|
||||
239
node_modules/blueimp-load-image/js/load-image-iptc.js
generated
vendored
Normal file
239
node_modules/blueimp-load-image/js/load-image-iptc.js
generated
vendored
Normal file
@@ -0,0 +1,239 @@
|
||||
/*
|
||||
* JavaScript Load Image IPTC Parser
|
||||
* https://github.com/blueimp/JavaScript-Load-Image
|
||||
*
|
||||
* Copyright 2013, Sebastian Tschan
|
||||
* Copyright 2018, Dave Bevan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/* global define, module, require, DataView */
|
||||
|
||||
;(function (factory) {
|
||||
'use strict'
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// Register as an anonymous AMD module:
|
||||
define(['./load-image', './load-image-meta'], factory)
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
factory(require('./load-image'), require('./load-image-meta'))
|
||||
} else {
|
||||
// Browser globals:
|
||||
factory(window.loadImage)
|
||||
}
|
||||
})(function (loadImage) {
|
||||
'use strict'
|
||||
|
||||
/**
|
||||
* IPTC tag map
|
||||
*
|
||||
* @name IptcMap
|
||||
* @class
|
||||
*/
|
||||
function IptcMap() {}
|
||||
|
||||
IptcMap.prototype.map = {
|
||||
ObjectName: 5
|
||||
}
|
||||
|
||||
IptcMap.prototype.types = {
|
||||
0: 'Uint16', // ApplicationRecordVersion
|
||||
200: 'Uint16', // ObjectPreviewFileFormat
|
||||
201: 'Uint16', // ObjectPreviewFileVersion
|
||||
202: 'binary' // ObjectPreviewData
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves IPTC tag value
|
||||
*
|
||||
* @param {number|string} id IPTC tag code or name
|
||||
* @returns {object} IPTC tag value
|
||||
*/
|
||||
IptcMap.prototype.get = function (id) {
|
||||
return this[id] || this[this.map[id]]
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves string for the given DataView and range
|
||||
*
|
||||
* @param {DataView} dataView Data view interface
|
||||
* @param {number} offset Offset start
|
||||
* @param {number} length Offset length
|
||||
* @returns {string} String value
|
||||
*/
|
||||
function getStringValue(dataView, offset, length) {
|
||||
var outstr = ''
|
||||
var end = offset + length
|
||||
for (var n = offset; n < end; n += 1) {
|
||||
outstr += String.fromCharCode(dataView.getUint8(n))
|
||||
}
|
||||
return outstr
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves tag value for the given DataView and range
|
||||
*
|
||||
* @param {number} tagCode tag code
|
||||
* @param {IptcMap} map IPTC tag map
|
||||
* @param {DataView} dataView Data view interface
|
||||
* @param {number} offset Range start
|
||||
* @param {number} length Range length
|
||||
* @returns {object} Tag value
|
||||
*/
|
||||
function getTagValue(tagCode, map, dataView, offset, length) {
|
||||
if (map.types[tagCode] === 'binary') {
|
||||
return new Blob([dataView.buffer.slice(offset, offset + length)])
|
||||
}
|
||||
if (map.types[tagCode] === 'Uint16') {
|
||||
return dataView.getUint16(offset)
|
||||
}
|
||||
return getStringValue(dataView, offset, length)
|
||||
}
|
||||
|
||||
/**
|
||||
* Combines IPTC value with existing ones.
|
||||
*
|
||||
* @param {object} value Existing IPTC field value
|
||||
* @param {object} newValue New IPTC field value
|
||||
* @returns {object} Resulting IPTC field value
|
||||
*/
|
||||
function combineTagValues(value, newValue) {
|
||||
if (value === undefined) return newValue
|
||||
if (value instanceof Array) {
|
||||
value.push(newValue)
|
||||
return value
|
||||
}
|
||||
return [value, newValue]
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses IPTC tags.
|
||||
*
|
||||
* @param {DataView} dataView Data view interface
|
||||
* @param {number} segmentOffset Segment offset
|
||||
* @param {number} segmentLength Segment length
|
||||
* @param {object} data Data export object
|
||||
* @param {object} includeTags Map of tags to include
|
||||
* @param {object} excludeTags Map of tags to exclude
|
||||
*/
|
||||
function parseIptcTags(
|
||||
dataView,
|
||||
segmentOffset,
|
||||
segmentLength,
|
||||
data,
|
||||
includeTags,
|
||||
excludeTags
|
||||
) {
|
||||
var value, tagSize, tagCode
|
||||
var segmentEnd = segmentOffset + segmentLength
|
||||
var offset = segmentOffset
|
||||
while (offset < segmentEnd) {
|
||||
if (
|
||||
dataView.getUint8(offset) === 0x1c && // tag marker
|
||||
dataView.getUint8(offset + 1) === 0x02 // record number, only handles v2
|
||||
) {
|
||||
tagCode = dataView.getUint8(offset + 2)
|
||||
if (
|
||||
(!includeTags || includeTags[tagCode]) &&
|
||||
(!excludeTags || !excludeTags[tagCode])
|
||||
) {
|
||||
tagSize = dataView.getInt16(offset + 3)
|
||||
value = getTagValue(tagCode, data.iptc, dataView, offset + 5, tagSize)
|
||||
data.iptc[tagCode] = combineTagValues(data.iptc[tagCode], value)
|
||||
if (data.iptcOffsets) {
|
||||
data.iptcOffsets[tagCode] = offset
|
||||
}
|
||||
}
|
||||
}
|
||||
offset += 1
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if field segment starts at offset.
|
||||
*
|
||||
* @param {DataView} dataView Data view interface
|
||||
* @param {number} offset Segment offset
|
||||
* @returns {boolean} True if '8BIM<EOT><EOT>' exists at offset
|
||||
*/
|
||||
function isSegmentStart(dataView, offset) {
|
||||
return (
|
||||
dataView.getUint32(offset) === 0x3842494d && // Photoshop segment start
|
||||
dataView.getUint16(offset + 4) === 0x0404 // IPTC segment start
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns header length.
|
||||
*
|
||||
* @param {DataView} dataView Data view interface
|
||||
* @param {number} offset Segment offset
|
||||
* @returns {number} Header length
|
||||
*/
|
||||
function getHeaderLength(dataView, offset) {
|
||||
var length = dataView.getUint8(offset + 7)
|
||||
if (length % 2 !== 0) length += 1
|
||||
// Check for pre photoshop 6 format
|
||||
if (length === 0) {
|
||||
// Always 4
|
||||
length = 4
|
||||
}
|
||||
return length
|
||||
}
|
||||
|
||||
loadImage.parseIptcData = function (dataView, offset, length, data, options) {
|
||||
if (options.disableIptc) {
|
||||
return
|
||||
}
|
||||
var markerLength = offset + length
|
||||
while (offset + 8 < markerLength) {
|
||||
if (isSegmentStart(dataView, offset)) {
|
||||
var headerLength = getHeaderLength(dataView, offset)
|
||||
var segmentOffset = offset + 8 + headerLength
|
||||
if (segmentOffset > markerLength) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('Invalid IPTC data: Invalid segment offset.')
|
||||
break
|
||||
}
|
||||
var segmentLength = dataView.getUint16(offset + 6 + headerLength)
|
||||
if (offset + segmentLength > markerLength) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('Invalid IPTC data: Invalid segment size.')
|
||||
break
|
||||
}
|
||||
// Create the iptc object to store the tags:
|
||||
data.iptc = new IptcMap()
|
||||
if (!options.disableIptcOffsets) {
|
||||
data.iptcOffsets = new IptcMap()
|
||||
}
|
||||
parseIptcTags(
|
||||
dataView,
|
||||
segmentOffset,
|
||||
segmentLength,
|
||||
data,
|
||||
options.includeIptcTags,
|
||||
options.excludeIptcTags || { 202: true } // ObjectPreviewData
|
||||
)
|
||||
return
|
||||
}
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
offset += 1
|
||||
}
|
||||
}
|
||||
|
||||
// Registers this IPTC parser for the APP13 JPEG metadata segment:
|
||||
loadImage.metaDataParsers.jpeg[0xffed].push(loadImage.parseIptcData)
|
||||
|
||||
loadImage.IptcMap = IptcMap
|
||||
|
||||
// Adds the following properties to the parseMetaData callback data:
|
||||
// - iptc: The iptc tags, parsed by the parseIptcData method
|
||||
|
||||
// Adds the following options to the parseMetaData method:
|
||||
// - disableIptc: Disables IPTC parsing when true.
|
||||
// - disableIptcOffsets: Disables storing IPTC tag offsets when true.
|
||||
// - includeIptcTags: A map of IPTC tags to include for parsing.
|
||||
// - excludeIptcTags: A map of IPTC tags to exclude from parsing.
|
||||
})
|
||||
259
node_modules/blueimp-load-image/js/load-image-meta.js
generated
vendored
Normal file
259
node_modules/blueimp-load-image/js/load-image-meta.js
generated
vendored
Normal file
@@ -0,0 +1,259 @@
|
||||
/*
|
||||
* JavaScript Load Image Meta
|
||||
* https://github.com/blueimp/JavaScript-Load-Image
|
||||
*
|
||||
* Copyright 2013, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Image metadata handling implementation
|
||||
* based on the help and contribution of
|
||||
* Achim Stöhr.
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/* global define, module, require, Promise, DataView, Uint8Array, ArrayBuffer */
|
||||
|
||||
;(function (factory) {
|
||||
'use strict'
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// Register as an anonymous AMD module:
|
||||
define(['./load-image'], factory)
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
factory(require('./load-image'))
|
||||
} else {
|
||||
// Browser globals:
|
||||
factory(window.loadImage)
|
||||
}
|
||||
})(function (loadImage) {
|
||||
'use strict'
|
||||
|
||||
var global = loadImage.global
|
||||
var originalTransform = loadImage.transform
|
||||
|
||||
var blobSlice =
|
||||
global.Blob &&
|
||||
(Blob.prototype.slice ||
|
||||
Blob.prototype.webkitSlice ||
|
||||
Blob.prototype.mozSlice)
|
||||
|
||||
var bufferSlice =
|
||||
(global.ArrayBuffer && ArrayBuffer.prototype.slice) ||
|
||||
function (begin, end) {
|
||||
// Polyfill for IE10, which does not support ArrayBuffer.slice
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
end = end || this.byteLength - begin
|
||||
var arr1 = new Uint8Array(this, begin, end)
|
||||
var arr2 = new Uint8Array(end)
|
||||
arr2.set(arr1)
|
||||
return arr2.buffer
|
||||
}
|
||||
|
||||
var metaDataParsers = {
|
||||
jpeg: {
|
||||
0xffe1: [], // APP1 marker
|
||||
0xffed: [] // APP13 marker
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses image metadata and calls the callback with an object argument
|
||||
* with the following property:
|
||||
* - imageHead: The complete image head as ArrayBuffer
|
||||
* The options argument accepts an object and supports the following
|
||||
* properties:
|
||||
* - maxMetaDataSize: Defines the maximum number of bytes to parse.
|
||||
* - disableImageHead: Disables creating the imageHead property.
|
||||
*
|
||||
* @param {Blob} file Blob object
|
||||
* @param {Function} [callback] Callback function
|
||||
* @param {object} [options] Parsing options
|
||||
* @param {object} [data] Result data object
|
||||
* @returns {Promise<object>|undefined} Returns Promise if no callback given.
|
||||
*/
|
||||
function parseMetaData(file, callback, options, data) {
|
||||
var that = this
|
||||
/**
|
||||
* Promise executor
|
||||
*
|
||||
* @param {Function} resolve Resolution function
|
||||
* @param {Function} reject Rejection function
|
||||
* @returns {undefined} Undefined
|
||||
*/
|
||||
function executor(resolve, reject) {
|
||||
if (
|
||||
!(
|
||||
global.DataView &&
|
||||
blobSlice &&
|
||||
file &&
|
||||
file.size >= 12 &&
|
||||
file.type === 'image/jpeg'
|
||||
)
|
||||
) {
|
||||
// Nothing to parse
|
||||
return resolve(data)
|
||||
}
|
||||
// 256 KiB should contain all EXIF/ICC/IPTC segments:
|
||||
var maxMetaDataSize = options.maxMetaDataSize || 262144
|
||||
if (
|
||||
!loadImage.readFile(
|
||||
blobSlice.call(file, 0, maxMetaDataSize),
|
||||
function (buffer) {
|
||||
// Note on endianness:
|
||||
// Since the marker and length bytes in JPEG files are always
|
||||
// stored in big endian order, we can leave the endian parameter
|
||||
// of the DataView methods undefined, defaulting to big endian.
|
||||
var dataView = new DataView(buffer)
|
||||
// Check for the JPEG marker (0xffd8):
|
||||
if (dataView.getUint16(0) !== 0xffd8) {
|
||||
return reject(
|
||||
new Error('Invalid JPEG file: Missing JPEG marker.')
|
||||
)
|
||||
}
|
||||
var offset = 2
|
||||
var maxOffset = dataView.byteLength - 4
|
||||
var headLength = offset
|
||||
var markerBytes
|
||||
var markerLength
|
||||
var parsers
|
||||
var i
|
||||
while (offset < maxOffset) {
|
||||
markerBytes = dataView.getUint16(offset)
|
||||
// Search for APPn (0xffeN) and COM (0xfffe) markers,
|
||||
// which contain application-specific metadata like
|
||||
// Exif, ICC and IPTC data and text comments:
|
||||
if (
|
||||
(markerBytes >= 0xffe0 && markerBytes <= 0xffef) ||
|
||||
markerBytes === 0xfffe
|
||||
) {
|
||||
// The marker bytes (2) are always followed by
|
||||
// the length bytes (2), indicating the length of the
|
||||
// marker segment, which includes the length bytes,
|
||||
// but not the marker bytes, so we add 2:
|
||||
markerLength = dataView.getUint16(offset + 2) + 2
|
||||
if (offset + markerLength > dataView.byteLength) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('Invalid JPEG metadata: Invalid segment size.')
|
||||
break
|
||||
}
|
||||
parsers = metaDataParsers.jpeg[markerBytes]
|
||||
if (parsers && !options.disableMetaDataParsers) {
|
||||
for (i = 0; i < parsers.length; i += 1) {
|
||||
parsers[i].call(
|
||||
that,
|
||||
dataView,
|
||||
offset,
|
||||
markerLength,
|
||||
data,
|
||||
options
|
||||
)
|
||||
}
|
||||
}
|
||||
offset += markerLength
|
||||
headLength = offset
|
||||
} else {
|
||||
// Not an APPn or COM marker, probably safe to
|
||||
// assume that this is the end of the metadata
|
||||
break
|
||||
}
|
||||
}
|
||||
// Meta length must be longer than JPEG marker (2)
|
||||
// plus APPn marker (2), followed by length bytes (2):
|
||||
if (!options.disableImageHead && headLength > 6) {
|
||||
data.imageHead = bufferSlice.call(buffer, 0, headLength)
|
||||
}
|
||||
resolve(data)
|
||||
},
|
||||
reject,
|
||||
'readAsArrayBuffer'
|
||||
)
|
||||
) {
|
||||
// No support for the FileReader interface, nothing to parse
|
||||
resolve(data)
|
||||
}
|
||||
}
|
||||
options = options || {} // eslint-disable-line no-param-reassign
|
||||
if (global.Promise && typeof callback !== 'function') {
|
||||
options = callback || {} // eslint-disable-line no-param-reassign
|
||||
data = options // eslint-disable-line no-param-reassign
|
||||
return new Promise(executor)
|
||||
}
|
||||
data = data || {} // eslint-disable-line no-param-reassign
|
||||
return executor(callback, callback)
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the head of a JPEG Blob
|
||||
*
|
||||
* @param {Blob} blob Blob object
|
||||
* @param {ArrayBuffer} oldHead Old JPEG head
|
||||
* @param {ArrayBuffer} newHead New JPEG head
|
||||
* @returns {Blob} Combined Blob
|
||||
*/
|
||||
function replaceJPEGHead(blob, oldHead, newHead) {
|
||||
if (!blob || !oldHead || !newHead) return null
|
||||
return new Blob([newHead, blobSlice.call(blob, oldHead.byteLength)], {
|
||||
type: 'image/jpeg'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the image head of a JPEG blob with the given one.
|
||||
* Returns a Promise or calls the callback with the new Blob.
|
||||
*
|
||||
* @param {Blob} blob Blob object
|
||||
* @param {ArrayBuffer} head New JPEG head
|
||||
* @param {Function} [callback] Callback function
|
||||
* @returns {Promise<Blob|null>|undefined} Combined Blob
|
||||
*/
|
||||
function replaceHead(blob, head, callback) {
|
||||
var options = { maxMetaDataSize: 1024, disableMetaDataParsers: true }
|
||||
if (!callback && global.Promise) {
|
||||
return parseMetaData(blob, options).then(function (data) {
|
||||
return replaceJPEGHead(blob, data.imageHead, head)
|
||||
})
|
||||
}
|
||||
parseMetaData(
|
||||
blob,
|
||||
function (data) {
|
||||
callback(replaceJPEGHead(blob, data.imageHead, head))
|
||||
},
|
||||
options
|
||||
)
|
||||
}
|
||||
|
||||
loadImage.transform = function (img, options, callback, file, data) {
|
||||
if (loadImage.requiresMetaData(options)) {
|
||||
data = data || {} // eslint-disable-line no-param-reassign
|
||||
parseMetaData(
|
||||
file,
|
||||
function (result) {
|
||||
if (result !== data) {
|
||||
// eslint-disable-next-line no-console
|
||||
if (global.console) console.log(result)
|
||||
result = data // eslint-disable-line no-param-reassign
|
||||
}
|
||||
originalTransform.call(
|
||||
loadImage,
|
||||
img,
|
||||
options,
|
||||
callback,
|
||||
file,
|
||||
result
|
||||
)
|
||||
},
|
||||
options,
|
||||
data
|
||||
)
|
||||
} else {
|
||||
originalTransform.apply(loadImage, arguments)
|
||||
}
|
||||
}
|
||||
|
||||
loadImage.blobSlice = blobSlice
|
||||
loadImage.bufferSlice = bufferSlice
|
||||
loadImage.replaceHead = replaceHead
|
||||
loadImage.parseMetaData = parseMetaData
|
||||
loadImage.metaDataParsers = metaDataParsers
|
||||
})
|
||||
481
node_modules/blueimp-load-image/js/load-image-orientation.js
generated
vendored
Normal file
481
node_modules/blueimp-load-image/js/load-image-orientation.js
generated
vendored
Normal file
@@ -0,0 +1,481 @@
|
||||
/*
|
||||
* JavaScript Load Image Orientation
|
||||
* https://github.com/blueimp/JavaScript-Load-Image
|
||||
*
|
||||
* Copyright 2013, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/*
|
||||
Exif orientation values to correctly display the letter F:
|
||||
|
||||
1 2
|
||||
██████ ██████
|
||||
██ ██
|
||||
████ ████
|
||||
██ ██
|
||||
██ ██
|
||||
|
||||
3 4
|
||||
██ ██
|
||||
██ ██
|
||||
████ ████
|
||||
██ ██
|
||||
██████ ██████
|
||||
|
||||
5 6
|
||||
██████████ ██
|
||||
██ ██ ██ ██
|
||||
██ ██████████
|
||||
|
||||
7 8
|
||||
██ ██████████
|
||||
██ ██ ██ ██
|
||||
██████████ ██
|
||||
|
||||
*/
|
||||
|
||||
/* global define, module, require */
|
||||
|
||||
;(function (factory) {
|
||||
'use strict'
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// Register as an anonymous AMD module:
|
||||
define(['./load-image', './load-image-scale', './load-image-meta'], factory)
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
factory(
|
||||
require('./load-image'),
|
||||
require('./load-image-scale'),
|
||||
require('./load-image-meta')
|
||||
)
|
||||
} else {
|
||||
// Browser globals:
|
||||
factory(window.loadImage)
|
||||
}
|
||||
})(function (loadImage) {
|
||||
'use strict'
|
||||
|
||||
var originalTransform = loadImage.transform
|
||||
var originalRequiresCanvas = loadImage.requiresCanvas
|
||||
var originalRequiresMetaData = loadImage.requiresMetaData
|
||||
var originalTransformCoordinates = loadImage.transformCoordinates
|
||||
var originalGetTransformedOptions = loadImage.getTransformedOptions
|
||||
|
||||
;(function ($) {
|
||||
// Guard for non-browser environments (e.g. server-side rendering):
|
||||
if (!$.global.document) return
|
||||
// black+white 3x2 JPEG, with the following meta information set:
|
||||
// - EXIF Orientation: 6 (Rotated 90° CCW)
|
||||
// Image data layout (B=black, F=white):
|
||||
// BFF
|
||||
// BBB
|
||||
var testImageURL =
|
||||
'data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAA' +
|
||||
'AAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA' +
|
||||
'QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE' +
|
||||
'BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAIAAwMBEQACEQEDEQH/x' +
|
||||
'ABRAAEAAAAAAAAAAAAAAAAAAAAKEAEBAQADAQEAAAAAAAAAAAAGBQQDCAkCBwEBAAAAAAA' +
|
||||
'AAAAAAAAAAAAAABEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AG8T9NfSMEVMhQ' +
|
||||
'voP3fFiRZ+MTHDifa/95OFSZU5OzRzxkyejv8ciEfhSceSXGjS8eSdLnZc2HDm4M3BxcXw' +
|
||||
'H/9k='
|
||||
var img = document.createElement('img')
|
||||
img.onload = function () {
|
||||
// Check if the browser supports automatic image orientation:
|
||||
$.orientation = img.width === 2 && img.height === 3
|
||||
if ($.orientation) {
|
||||
var canvas = $.createCanvas(1, 1, true)
|
||||
var ctx = canvas.getContext('2d')
|
||||
ctx.drawImage(img, 1, 1, 1, 1, 0, 0, 1, 1)
|
||||
// Check if the source image coordinates (sX, sY, sWidth, sHeight) are
|
||||
// correctly applied to the auto-orientated image, which should result
|
||||
// in a white opaque pixel (e.g. in Safari).
|
||||
// Browsers that show a transparent pixel (e.g. Chromium) fail to crop
|
||||
// auto-oriented images correctly and require a workaround, e.g.
|
||||
// drawing the complete source image to an intermediate canvas first.
|
||||
// See https://bugs.chromium.org/p/chromium/issues/detail?id=1074354
|
||||
$.orientationCropBug =
|
||||
ctx.getImageData(0, 0, 1, 1).data.toString() !== '255,255,255,255'
|
||||
}
|
||||
}
|
||||
img.src = testImageURL
|
||||
})(loadImage)
|
||||
|
||||
/**
|
||||
* Determines if the orientation requires a canvas element.
|
||||
*
|
||||
* @param {object} [options] Options object
|
||||
* @param {boolean} [withMetaData] Is metadata required for orientation
|
||||
* @returns {boolean} Returns true if orientation requires canvas/meta
|
||||
*/
|
||||
function requiresCanvasOrientation(options, withMetaData) {
|
||||
var orientation = options && options.orientation
|
||||
return (
|
||||
// Exif orientation for browsers without automatic image orientation:
|
||||
(orientation === true && !loadImage.orientation) ||
|
||||
// Orientation reset for browsers with automatic image orientation:
|
||||
(orientation === 1 && loadImage.orientation) ||
|
||||
// Orientation to defined value, requires meta for orientation reset only:
|
||||
((!withMetaData || loadImage.orientation) &&
|
||||
orientation > 1 &&
|
||||
orientation < 9)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the image requires an orientation change.
|
||||
*
|
||||
* @param {number} [orientation] Defined orientation value
|
||||
* @param {number} [autoOrientation] Auto-orientation based on Exif data
|
||||
* @returns {boolean} Returns true if an orientation change is required
|
||||
*/
|
||||
function requiresOrientationChange(orientation, autoOrientation) {
|
||||
return (
|
||||
orientation !== autoOrientation &&
|
||||
((orientation === 1 && autoOrientation > 1 && autoOrientation < 9) ||
|
||||
(orientation > 1 && orientation < 9))
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines orientation combinations that require a rotation by 180°.
|
||||
*
|
||||
* The following is a list of combinations that return true:
|
||||
*
|
||||
* 2 (flip) => 5 (rot90,flip), 7 (rot90,flip), 6 (rot90), 8 (rot90)
|
||||
* 4 (flip) => 5 (rot90,flip), 7 (rot90,flip), 6 (rot90), 8 (rot90)
|
||||
*
|
||||
* 5 (rot90,flip) => 2 (flip), 4 (flip), 6 (rot90), 8 (rot90)
|
||||
* 7 (rot90,flip) => 2 (flip), 4 (flip), 6 (rot90), 8 (rot90)
|
||||
*
|
||||
* 6 (rot90) => 2 (flip), 4 (flip), 5 (rot90,flip), 7 (rot90,flip)
|
||||
* 8 (rot90) => 2 (flip), 4 (flip), 5 (rot90,flip), 7 (rot90,flip)
|
||||
*
|
||||
* @param {number} [orientation] Defined orientation value
|
||||
* @param {number} [autoOrientation] Auto-orientation based on Exif data
|
||||
* @returns {boolean} Returns true if rotation by 180° is required
|
||||
*/
|
||||
function requiresRot180(orientation, autoOrientation) {
|
||||
if (autoOrientation > 1 && autoOrientation < 9) {
|
||||
switch (orientation) {
|
||||
case 2:
|
||||
case 4:
|
||||
return autoOrientation > 4
|
||||
case 5:
|
||||
case 7:
|
||||
return autoOrientation % 2 === 0
|
||||
case 6:
|
||||
case 8:
|
||||
return (
|
||||
autoOrientation === 2 ||
|
||||
autoOrientation === 4 ||
|
||||
autoOrientation === 5 ||
|
||||
autoOrientation === 7
|
||||
)
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Determines if the target image should be a canvas element:
|
||||
loadImage.requiresCanvas = function (options) {
|
||||
return (
|
||||
requiresCanvasOrientation(options) ||
|
||||
originalRequiresCanvas.call(loadImage, options)
|
||||
)
|
||||
}
|
||||
|
||||
// Determines if metadata should be loaded automatically:
|
||||
loadImage.requiresMetaData = function (options) {
|
||||
return (
|
||||
requiresCanvasOrientation(options, true) ||
|
||||
originalRequiresMetaData.call(loadImage, options)
|
||||
)
|
||||
}
|
||||
|
||||
loadImage.transform = function (img, options, callback, file, data) {
|
||||
originalTransform.call(
|
||||
loadImage,
|
||||
img,
|
||||
options,
|
||||
function (img, data) {
|
||||
if (data) {
|
||||
var autoOrientation =
|
||||
loadImage.orientation && data.exif && data.exif.get('Orientation')
|
||||
if (autoOrientation > 4 && autoOrientation < 9) {
|
||||
// Automatic image orientation switched image dimensions
|
||||
var originalWidth = data.originalWidth
|
||||
var originalHeight = data.originalHeight
|
||||
data.originalWidth = originalHeight
|
||||
data.originalHeight = originalWidth
|
||||
}
|
||||
}
|
||||
callback(img, data)
|
||||
},
|
||||
file,
|
||||
data
|
||||
)
|
||||
}
|
||||
|
||||
// Transforms coordinate and dimension options
|
||||
// based on the given orientation option:
|
||||
loadImage.getTransformedOptions = function (img, opts, data) {
|
||||
var options = originalGetTransformedOptions.call(loadImage, img, opts)
|
||||
var exifOrientation = data.exif && data.exif.get('Orientation')
|
||||
var orientation = options.orientation
|
||||
var autoOrientation = loadImage.orientation && exifOrientation
|
||||
if (orientation === true) orientation = exifOrientation
|
||||
if (!requiresOrientationChange(orientation, autoOrientation)) {
|
||||
return options
|
||||
}
|
||||
var top = options.top
|
||||
var right = options.right
|
||||
var bottom = options.bottom
|
||||
var left = options.left
|
||||
var newOptions = {}
|
||||
for (var i in options) {
|
||||
if (Object.prototype.hasOwnProperty.call(options, i)) {
|
||||
newOptions[i] = options[i]
|
||||
}
|
||||
}
|
||||
newOptions.orientation = orientation
|
||||
if (
|
||||
(orientation > 4 && !(autoOrientation > 4)) ||
|
||||
(orientation < 5 && autoOrientation > 4)
|
||||
) {
|
||||
// Image dimensions and target dimensions are switched
|
||||
newOptions.maxWidth = options.maxHeight
|
||||
newOptions.maxHeight = options.maxWidth
|
||||
newOptions.minWidth = options.minHeight
|
||||
newOptions.minHeight = options.minWidth
|
||||
newOptions.sourceWidth = options.sourceHeight
|
||||
newOptions.sourceHeight = options.sourceWidth
|
||||
}
|
||||
if (autoOrientation > 1) {
|
||||
// Browsers which correctly apply source image coordinates to
|
||||
// auto-oriented images
|
||||
switch (autoOrientation) {
|
||||
case 2:
|
||||
// Horizontal flip
|
||||
right = options.left
|
||||
left = options.right
|
||||
break
|
||||
case 3:
|
||||
// 180° Rotate CCW
|
||||
top = options.bottom
|
||||
right = options.left
|
||||
bottom = options.top
|
||||
left = options.right
|
||||
break
|
||||
case 4:
|
||||
// Vertical flip
|
||||
top = options.bottom
|
||||
bottom = options.top
|
||||
break
|
||||
case 5:
|
||||
// Horizontal flip + 90° Rotate CCW
|
||||
top = options.left
|
||||
right = options.bottom
|
||||
bottom = options.right
|
||||
left = options.top
|
||||
break
|
||||
case 6:
|
||||
// 90° Rotate CCW
|
||||
top = options.left
|
||||
right = options.top
|
||||
bottom = options.right
|
||||
left = options.bottom
|
||||
break
|
||||
case 7:
|
||||
// Vertical flip + 90° Rotate CCW
|
||||
top = options.right
|
||||
right = options.top
|
||||
bottom = options.left
|
||||
left = options.bottom
|
||||
break
|
||||
case 8:
|
||||
// 90° Rotate CW
|
||||
top = options.right
|
||||
right = options.bottom
|
||||
bottom = options.left
|
||||
left = options.top
|
||||
break
|
||||
}
|
||||
// Some orientation combinations require additional rotation by 180°:
|
||||
if (requiresRot180(orientation, autoOrientation)) {
|
||||
var tmpTop = top
|
||||
var tmpRight = right
|
||||
top = bottom
|
||||
right = left
|
||||
bottom = tmpTop
|
||||
left = tmpRight
|
||||
}
|
||||
}
|
||||
newOptions.top = top
|
||||
newOptions.right = right
|
||||
newOptions.bottom = bottom
|
||||
newOptions.left = left
|
||||
// Account for defined browser orientation:
|
||||
switch (orientation) {
|
||||
case 2:
|
||||
// Horizontal flip
|
||||
newOptions.right = left
|
||||
newOptions.left = right
|
||||
break
|
||||
case 3:
|
||||
// 180° Rotate CCW
|
||||
newOptions.top = bottom
|
||||
newOptions.right = left
|
||||
newOptions.bottom = top
|
||||
newOptions.left = right
|
||||
break
|
||||
case 4:
|
||||
// Vertical flip
|
||||
newOptions.top = bottom
|
||||
newOptions.bottom = top
|
||||
break
|
||||
case 5:
|
||||
// Vertical flip + 90° Rotate CW
|
||||
newOptions.top = left
|
||||
newOptions.right = bottom
|
||||
newOptions.bottom = right
|
||||
newOptions.left = top
|
||||
break
|
||||
case 6:
|
||||
// 90° Rotate CW
|
||||
newOptions.top = right
|
||||
newOptions.right = bottom
|
||||
newOptions.bottom = left
|
||||
newOptions.left = top
|
||||
break
|
||||
case 7:
|
||||
// Horizontal flip + 90° Rotate CW
|
||||
newOptions.top = right
|
||||
newOptions.right = top
|
||||
newOptions.bottom = left
|
||||
newOptions.left = bottom
|
||||
break
|
||||
case 8:
|
||||
// 90° Rotate CCW
|
||||
newOptions.top = left
|
||||
newOptions.right = top
|
||||
newOptions.bottom = right
|
||||
newOptions.left = bottom
|
||||
break
|
||||
}
|
||||
return newOptions
|
||||
}
|
||||
|
||||
// Transform image orientation based on the given EXIF orientation option:
|
||||
loadImage.transformCoordinates = function (canvas, options, data) {
|
||||
originalTransformCoordinates.call(loadImage, canvas, options, data)
|
||||
var orientation = options.orientation
|
||||
var autoOrientation =
|
||||
loadImage.orientation && data.exif && data.exif.get('Orientation')
|
||||
if (!requiresOrientationChange(orientation, autoOrientation)) {
|
||||
return
|
||||
}
|
||||
var ctx = canvas.getContext('2d')
|
||||
var width = canvas.width
|
||||
var height = canvas.height
|
||||
var sourceWidth = width
|
||||
var sourceHeight = height
|
||||
if (
|
||||
(orientation > 4 && !(autoOrientation > 4)) ||
|
||||
(orientation < 5 && autoOrientation > 4)
|
||||
) {
|
||||
// Image dimensions and target dimensions are switched
|
||||
canvas.width = height
|
||||
canvas.height = width
|
||||
}
|
||||
if (orientation > 4) {
|
||||
// Destination and source dimensions are switched
|
||||
sourceWidth = height
|
||||
sourceHeight = width
|
||||
}
|
||||
// Reset automatic browser orientation:
|
||||
switch (autoOrientation) {
|
||||
case 2:
|
||||
// Horizontal flip
|
||||
ctx.translate(sourceWidth, 0)
|
||||
ctx.scale(-1, 1)
|
||||
break
|
||||
case 3:
|
||||
// 180° Rotate CCW
|
||||
ctx.translate(sourceWidth, sourceHeight)
|
||||
ctx.rotate(Math.PI)
|
||||
break
|
||||
case 4:
|
||||
// Vertical flip
|
||||
ctx.translate(0, sourceHeight)
|
||||
ctx.scale(1, -1)
|
||||
break
|
||||
case 5:
|
||||
// Horizontal flip + 90° Rotate CCW
|
||||
ctx.rotate(-0.5 * Math.PI)
|
||||
ctx.scale(-1, 1)
|
||||
break
|
||||
case 6:
|
||||
// 90° Rotate CCW
|
||||
ctx.rotate(-0.5 * Math.PI)
|
||||
ctx.translate(-sourceWidth, 0)
|
||||
break
|
||||
case 7:
|
||||
// Vertical flip + 90° Rotate CCW
|
||||
ctx.rotate(-0.5 * Math.PI)
|
||||
ctx.translate(-sourceWidth, sourceHeight)
|
||||
ctx.scale(1, -1)
|
||||
break
|
||||
case 8:
|
||||
// 90° Rotate CW
|
||||
ctx.rotate(0.5 * Math.PI)
|
||||
ctx.translate(0, -sourceHeight)
|
||||
break
|
||||
}
|
||||
// Some orientation combinations require additional rotation by 180°:
|
||||
if (requiresRot180(orientation, autoOrientation)) {
|
||||
ctx.translate(sourceWidth, sourceHeight)
|
||||
ctx.rotate(Math.PI)
|
||||
}
|
||||
switch (orientation) {
|
||||
case 2:
|
||||
// Horizontal flip
|
||||
ctx.translate(width, 0)
|
||||
ctx.scale(-1, 1)
|
||||
break
|
||||
case 3:
|
||||
// 180° Rotate CCW
|
||||
ctx.translate(width, height)
|
||||
ctx.rotate(Math.PI)
|
||||
break
|
||||
case 4:
|
||||
// Vertical flip
|
||||
ctx.translate(0, height)
|
||||
ctx.scale(1, -1)
|
||||
break
|
||||
case 5:
|
||||
// Vertical flip + 90° Rotate CW
|
||||
ctx.rotate(0.5 * Math.PI)
|
||||
ctx.scale(1, -1)
|
||||
break
|
||||
case 6:
|
||||
// 90° Rotate CW
|
||||
ctx.rotate(0.5 * Math.PI)
|
||||
ctx.translate(0, -height)
|
||||
break
|
||||
case 7:
|
||||
// Horizontal flip + 90° Rotate CW
|
||||
ctx.rotate(0.5 * Math.PI)
|
||||
ctx.translate(width, -height)
|
||||
ctx.scale(-1, 1)
|
||||
break
|
||||
case 8:
|
||||
// 90° Rotate CCW
|
||||
ctx.rotate(-0.5 * Math.PI)
|
||||
ctx.translate(-width, 0)
|
||||
break
|
||||
}
|
||||
}
|
||||
})
|
||||
327
node_modules/blueimp-load-image/js/load-image-scale.js
generated
vendored
Normal file
327
node_modules/blueimp-load-image/js/load-image-scale.js
generated
vendored
Normal file
@@ -0,0 +1,327 @@
|
||||
/*
|
||||
* JavaScript Load Image Scaling
|
||||
* https://github.com/blueimp/JavaScript-Load-Image
|
||||
*
|
||||
* Copyright 2011, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/* global define, module, require */
|
||||
|
||||
;(function (factory) {
|
||||
'use strict'
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// Register as an anonymous AMD module:
|
||||
define(['./load-image'], factory)
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
factory(require('./load-image'))
|
||||
} else {
|
||||
// Browser globals:
|
||||
factory(window.loadImage)
|
||||
}
|
||||
})(function (loadImage) {
|
||||
'use strict'
|
||||
|
||||
var originalTransform = loadImage.transform
|
||||
|
||||
loadImage.createCanvas = function (width, height, offscreen) {
|
||||
if (offscreen && loadImage.global.OffscreenCanvas) {
|
||||
return new OffscreenCanvas(width, height)
|
||||
}
|
||||
var canvas = document.createElement('canvas')
|
||||
canvas.width = width
|
||||
canvas.height = height
|
||||
return canvas
|
||||
}
|
||||
|
||||
loadImage.transform = function (img, options, callback, file, data) {
|
||||
originalTransform.call(
|
||||
loadImage,
|
||||
loadImage.scale(img, options, data),
|
||||
options,
|
||||
callback,
|
||||
file,
|
||||
data
|
||||
)
|
||||
}
|
||||
|
||||
// Transform image coordinates, allows to override e.g.
|
||||
// the canvas orientation based on the orientation option,
|
||||
// gets canvas, options and data passed as arguments:
|
||||
loadImage.transformCoordinates = function () {}
|
||||
|
||||
// Returns transformed options, allows to override e.g.
|
||||
// maxWidth, maxHeight and crop options based on the aspectRatio.
|
||||
// gets img, options, data passed as arguments:
|
||||
loadImage.getTransformedOptions = function (img, options) {
|
||||
var aspectRatio = options.aspectRatio
|
||||
var newOptions
|
||||
var i
|
||||
var width
|
||||
var height
|
||||
if (!aspectRatio) {
|
||||
return options
|
||||
}
|
||||
newOptions = {}
|
||||
for (i in options) {
|
||||
if (Object.prototype.hasOwnProperty.call(options, i)) {
|
||||
newOptions[i] = options[i]
|
||||
}
|
||||
}
|
||||
newOptions.crop = true
|
||||
width = img.naturalWidth || img.width
|
||||
height = img.naturalHeight || img.height
|
||||
if (width / height > aspectRatio) {
|
||||
newOptions.maxWidth = height * aspectRatio
|
||||
newOptions.maxHeight = height
|
||||
} else {
|
||||
newOptions.maxWidth = width
|
||||
newOptions.maxHeight = width / aspectRatio
|
||||
}
|
||||
return newOptions
|
||||
}
|
||||
|
||||
// Canvas render method, allows to implement a different rendering algorithm:
|
||||
loadImage.drawImage = function (
|
||||
img,
|
||||
canvas,
|
||||
sourceX,
|
||||
sourceY,
|
||||
sourceWidth,
|
||||
sourceHeight,
|
||||
destWidth,
|
||||
destHeight,
|
||||
options
|
||||
) {
|
||||
var ctx = canvas.getContext('2d')
|
||||
if (options.imageSmoothingEnabled === false) {
|
||||
ctx.msImageSmoothingEnabled = false
|
||||
ctx.imageSmoothingEnabled = false
|
||||
} else if (options.imageSmoothingQuality) {
|
||||
ctx.imageSmoothingQuality = options.imageSmoothingQuality
|
||||
}
|
||||
ctx.drawImage(
|
||||
img,
|
||||
sourceX,
|
||||
sourceY,
|
||||
sourceWidth,
|
||||
sourceHeight,
|
||||
0,
|
||||
0,
|
||||
destWidth,
|
||||
destHeight
|
||||
)
|
||||
return ctx
|
||||
}
|
||||
|
||||
// Determines if the target image should be a canvas element:
|
||||
loadImage.requiresCanvas = function (options) {
|
||||
return options.canvas || options.crop || !!options.aspectRatio
|
||||
}
|
||||
|
||||
// Scales and/or crops the given image (img or canvas HTML element)
|
||||
// using the given options:
|
||||
loadImage.scale = function (img, options, data) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
options = options || {}
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
data = data || {}
|
||||
var useCanvas =
|
||||
img.getContext ||
|
||||
(loadImage.requiresCanvas(options) &&
|
||||
!!loadImage.global.HTMLCanvasElement)
|
||||
var width = img.naturalWidth || img.width
|
||||
var height = img.naturalHeight || img.height
|
||||
var destWidth = width
|
||||
var destHeight = height
|
||||
var maxWidth
|
||||
var maxHeight
|
||||
var minWidth
|
||||
var minHeight
|
||||
var sourceWidth
|
||||
var sourceHeight
|
||||
var sourceX
|
||||
var sourceY
|
||||
var pixelRatio
|
||||
var downsamplingRatio
|
||||
var tmp
|
||||
var canvas
|
||||
/**
|
||||
* Scales up image dimensions
|
||||
*/
|
||||
function scaleUp() {
|
||||
var scale = Math.max(
|
||||
(minWidth || destWidth) / destWidth,
|
||||
(minHeight || destHeight) / destHeight
|
||||
)
|
||||
if (scale > 1) {
|
||||
destWidth *= scale
|
||||
destHeight *= scale
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Scales down image dimensions
|
||||
*/
|
||||
function scaleDown() {
|
||||
var scale = Math.min(
|
||||
(maxWidth || destWidth) / destWidth,
|
||||
(maxHeight || destHeight) / destHeight
|
||||
)
|
||||
if (scale < 1) {
|
||||
destWidth *= scale
|
||||
destHeight *= scale
|
||||
}
|
||||
}
|
||||
if (useCanvas) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
options = loadImage.getTransformedOptions(img, options, data)
|
||||
sourceX = options.left || 0
|
||||
sourceY = options.top || 0
|
||||
if (options.sourceWidth) {
|
||||
sourceWidth = options.sourceWidth
|
||||
if (options.right !== undefined && options.left === undefined) {
|
||||
sourceX = width - sourceWidth - options.right
|
||||
}
|
||||
} else {
|
||||
sourceWidth = width - sourceX - (options.right || 0)
|
||||
}
|
||||
if (options.sourceHeight) {
|
||||
sourceHeight = options.sourceHeight
|
||||
if (options.bottom !== undefined && options.top === undefined) {
|
||||
sourceY = height - sourceHeight - options.bottom
|
||||
}
|
||||
} else {
|
||||
sourceHeight = height - sourceY - (options.bottom || 0)
|
||||
}
|
||||
destWidth = sourceWidth
|
||||
destHeight = sourceHeight
|
||||
}
|
||||
maxWidth = options.maxWidth
|
||||
maxHeight = options.maxHeight
|
||||
minWidth = options.minWidth
|
||||
minHeight = options.minHeight
|
||||
if (useCanvas && maxWidth && maxHeight && options.crop) {
|
||||
destWidth = maxWidth
|
||||
destHeight = maxHeight
|
||||
tmp = sourceWidth / sourceHeight - maxWidth / maxHeight
|
||||
if (tmp < 0) {
|
||||
sourceHeight = (maxHeight * sourceWidth) / maxWidth
|
||||
if (options.top === undefined && options.bottom === undefined) {
|
||||
sourceY = (height - sourceHeight) / 2
|
||||
}
|
||||
} else if (tmp > 0) {
|
||||
sourceWidth = (maxWidth * sourceHeight) / maxHeight
|
||||
if (options.left === undefined && options.right === undefined) {
|
||||
sourceX = (width - sourceWidth) / 2
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (options.contain || options.cover) {
|
||||
minWidth = maxWidth = maxWidth || minWidth
|
||||
minHeight = maxHeight = maxHeight || minHeight
|
||||
}
|
||||
if (options.cover) {
|
||||
scaleDown()
|
||||
scaleUp()
|
||||
} else {
|
||||
scaleUp()
|
||||
scaleDown()
|
||||
}
|
||||
}
|
||||
if (useCanvas) {
|
||||
pixelRatio = options.pixelRatio
|
||||
if (
|
||||
pixelRatio > 1 &&
|
||||
// Check if the image has not yet had the device pixel ratio applied:
|
||||
!(
|
||||
img.style.width &&
|
||||
Math.floor(parseFloat(img.style.width, 10)) ===
|
||||
Math.floor(width / pixelRatio)
|
||||
)
|
||||
) {
|
||||
destWidth *= pixelRatio
|
||||
destHeight *= pixelRatio
|
||||
}
|
||||
// Check if workaround for Chromium orientation crop bug is required:
|
||||
// https://bugs.chromium.org/p/chromium/issues/detail?id=1074354
|
||||
if (
|
||||
loadImage.orientationCropBug &&
|
||||
!img.getContext &&
|
||||
(sourceX || sourceY || sourceWidth !== width || sourceHeight !== height)
|
||||
) {
|
||||
// Write the complete source image to an intermediate canvas first:
|
||||
tmp = img
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
img = loadImage.createCanvas(width, height, true)
|
||||
loadImage.drawImage(
|
||||
tmp,
|
||||
img,
|
||||
0,
|
||||
0,
|
||||
width,
|
||||
height,
|
||||
width,
|
||||
height,
|
||||
options
|
||||
)
|
||||
}
|
||||
downsamplingRatio = options.downsamplingRatio
|
||||
if (
|
||||
downsamplingRatio > 0 &&
|
||||
downsamplingRatio < 1 &&
|
||||
destWidth < sourceWidth &&
|
||||
destHeight < sourceHeight
|
||||
) {
|
||||
while (sourceWidth * downsamplingRatio > destWidth) {
|
||||
canvas = loadImage.createCanvas(
|
||||
sourceWidth * downsamplingRatio,
|
||||
sourceHeight * downsamplingRatio,
|
||||
true
|
||||
)
|
||||
loadImage.drawImage(
|
||||
img,
|
||||
canvas,
|
||||
sourceX,
|
||||
sourceY,
|
||||
sourceWidth,
|
||||
sourceHeight,
|
||||
canvas.width,
|
||||
canvas.height,
|
||||
options
|
||||
)
|
||||
sourceX = 0
|
||||
sourceY = 0
|
||||
sourceWidth = canvas.width
|
||||
sourceHeight = canvas.height
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
img = canvas
|
||||
}
|
||||
}
|
||||
canvas = loadImage.createCanvas(destWidth, destHeight)
|
||||
loadImage.transformCoordinates(canvas, options, data)
|
||||
if (pixelRatio > 1) {
|
||||
canvas.style.width = canvas.width / pixelRatio + 'px'
|
||||
}
|
||||
loadImage
|
||||
.drawImage(
|
||||
img,
|
||||
canvas,
|
||||
sourceX,
|
||||
sourceY,
|
||||
sourceWidth,
|
||||
sourceHeight,
|
||||
destWidth,
|
||||
destHeight,
|
||||
options
|
||||
)
|
||||
.setTransform(1, 0, 0, 1, 0, 0) // reset to the identity matrix
|
||||
return canvas
|
||||
}
|
||||
img.width = destWidth
|
||||
img.height = destHeight
|
||||
return img
|
||||
}
|
||||
})
|
||||
2
node_modules/blueimp-load-image/js/load-image.all.min.js
generated
vendored
Normal file
2
node_modules/blueimp-load-image/js/load-image.all.min.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
node_modules/blueimp-load-image/js/load-image.all.min.js.map
generated
vendored
Normal file
1
node_modules/blueimp-load-image/js/load-image.all.min.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
229
node_modules/blueimp-load-image/js/load-image.js
generated
vendored
Normal file
229
node_modules/blueimp-load-image/js/load-image.js
generated
vendored
Normal file
@@ -0,0 +1,229 @@
|
||||
/*
|
||||
* JavaScript Load Image
|
||||
* https://github.com/blueimp/JavaScript-Load-Image
|
||||
*
|
||||
* Copyright 2011, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/* global define, module, Promise */
|
||||
|
||||
;(function ($) {
|
||||
'use strict'
|
||||
|
||||
var urlAPI = $.URL || $.webkitURL
|
||||
|
||||
/**
|
||||
* Creates an object URL for a given File object.
|
||||
*
|
||||
* @param {Blob} blob Blob object
|
||||
* @returns {string|boolean} Returns object URL if API exists, else false.
|
||||
*/
|
||||
function createObjectURL(blob) {
|
||||
return urlAPI ? urlAPI.createObjectURL(blob) : false
|
||||
}
|
||||
|
||||
/**
|
||||
* Revokes a given object URL.
|
||||
*
|
||||
* @param {string} url Blob object URL
|
||||
* @returns {undefined|boolean} Returns undefined if API exists, else false.
|
||||
*/
|
||||
function revokeObjectURL(url) {
|
||||
return urlAPI ? urlAPI.revokeObjectURL(url) : false
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to revoke an object URL
|
||||
*
|
||||
* @param {string} url Blob Object URL
|
||||
* @param {object} [options] Options object
|
||||
*/
|
||||
function revokeHelper(url, options) {
|
||||
if (url && url.slice(0, 5) === 'blob:' && !(options && options.noRevoke)) {
|
||||
revokeObjectURL(url)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a given File object via FileReader interface.
|
||||
*
|
||||
* @param {Blob} file Blob object
|
||||
* @param {Function} onload Load event callback
|
||||
* @param {Function} [onerror] Error/Abort event callback
|
||||
* @param {string} [method=readAsDataURL] FileReader method
|
||||
* @returns {FileReader|boolean} Returns FileReader if API exists, else false.
|
||||
*/
|
||||
function readFile(file, onload, onerror, method) {
|
||||
if (!$.FileReader) return false
|
||||
var reader = new FileReader()
|
||||
reader.onload = function () {
|
||||
onload.call(reader, this.result)
|
||||
}
|
||||
if (onerror) {
|
||||
reader.onabort = reader.onerror = function () {
|
||||
onerror.call(reader, this.error)
|
||||
}
|
||||
}
|
||||
var readerMethod = reader[method || 'readAsDataURL']
|
||||
if (readerMethod) {
|
||||
readerMethod.call(reader, file)
|
||||
return reader
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cross-frame instanceof check.
|
||||
*
|
||||
* @param {string} type Instance type
|
||||
* @param {object} obj Object instance
|
||||
* @returns {boolean} Returns true if the object is of the given instance.
|
||||
*/
|
||||
function isInstanceOf(type, obj) {
|
||||
// Cross-frame instanceof check
|
||||
return Object.prototype.toString.call(obj) === '[object ' + type + ']'
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef { HTMLImageElement|HTMLCanvasElement } Result
|
||||
*/
|
||||
|
||||
/**
|
||||
* Loads an image for a given File object.
|
||||
*
|
||||
* @param {Blob|string} file Blob object or image URL
|
||||
* @param {Function|object} [callback] Image load event callback or options
|
||||
* @param {object} [options] Options object
|
||||
* @returns {HTMLImageElement|FileReader|Promise<Result>} Object
|
||||
*/
|
||||
function loadImage(file, callback, options) {
|
||||
/**
|
||||
* Promise executor
|
||||
*
|
||||
* @param {Function} resolve Resolution function
|
||||
* @param {Function} reject Rejection function
|
||||
* @returns {HTMLImageElement|FileReader} Object
|
||||
*/
|
||||
function executor(resolve, reject) {
|
||||
var img = document.createElement('img')
|
||||
var url
|
||||
/**
|
||||
* Callback for the fetchBlob call.
|
||||
*
|
||||
* @param {HTMLImageElement|HTMLCanvasElement} img Error object
|
||||
* @param {object} data Data object
|
||||
* @returns {undefined} Undefined
|
||||
*/
|
||||
function resolveWrapper(img, data) {
|
||||
if (resolve === reject) {
|
||||
// Not using Promises
|
||||
if (resolve) resolve(img, data)
|
||||
return
|
||||
} else if (img instanceof Error) {
|
||||
reject(img)
|
||||
return
|
||||
}
|
||||
data = data || {} // eslint-disable-line no-param-reassign
|
||||
data.image = img
|
||||
resolve(data)
|
||||
}
|
||||
/**
|
||||
* Callback for the fetchBlob call.
|
||||
*
|
||||
* @param {Blob} blob Blob object
|
||||
* @param {Error} err Error object
|
||||
*/
|
||||
function fetchBlobCallback(blob, err) {
|
||||
if (err && $.console) console.log(err) // eslint-disable-line no-console
|
||||
if (blob && isInstanceOf('Blob', blob)) {
|
||||
file = blob // eslint-disable-line no-param-reassign
|
||||
url = createObjectURL(file)
|
||||
} else {
|
||||
url = file
|
||||
if (options && options.crossOrigin) {
|
||||
img.crossOrigin = options.crossOrigin
|
||||
}
|
||||
}
|
||||
img.src = url
|
||||
}
|
||||
img.onerror = function (event) {
|
||||
revokeHelper(url, options)
|
||||
if (reject) reject.call(img, event)
|
||||
}
|
||||
img.onload = function () {
|
||||
revokeHelper(url, options)
|
||||
var data = {
|
||||
originalWidth: img.naturalWidth || img.width,
|
||||
originalHeight: img.naturalHeight || img.height
|
||||
}
|
||||
try {
|
||||
loadImage.transform(img, options, resolveWrapper, file, data)
|
||||
} catch (error) {
|
||||
if (reject) reject(error)
|
||||
}
|
||||
}
|
||||
if (typeof file === 'string') {
|
||||
if (loadImage.requiresMetaData(options)) {
|
||||
loadImage.fetchBlob(file, fetchBlobCallback, options)
|
||||
} else {
|
||||
fetchBlobCallback()
|
||||
}
|
||||
return img
|
||||
} else if (isInstanceOf('Blob', file) || isInstanceOf('File', file)) {
|
||||
url = createObjectURL(file)
|
||||
if (url) {
|
||||
img.src = url
|
||||
return img
|
||||
}
|
||||
return readFile(
|
||||
file,
|
||||
function (url) {
|
||||
img.src = url
|
||||
},
|
||||
reject
|
||||
)
|
||||
}
|
||||
}
|
||||
if ($.Promise && typeof callback !== 'function') {
|
||||
options = callback // eslint-disable-line no-param-reassign
|
||||
return new Promise(executor)
|
||||
}
|
||||
return executor(callback, callback)
|
||||
}
|
||||
|
||||
// Determines if metadata should be loaded automatically.
|
||||
// Requires the load image meta extension to load metadata.
|
||||
loadImage.requiresMetaData = function (options) {
|
||||
return options && options.meta
|
||||
}
|
||||
|
||||
// If the callback given to this function returns a blob, it is used as image
|
||||
// source instead of the original url and overrides the file argument used in
|
||||
// the onload and onerror event callbacks:
|
||||
loadImage.fetchBlob = function (url, callback) {
|
||||
callback()
|
||||
}
|
||||
|
||||
loadImage.transform = function (img, options, callback, file, data) {
|
||||
callback(img, data)
|
||||
}
|
||||
|
||||
loadImage.global = $
|
||||
loadImage.readFile = readFile
|
||||
loadImage.isInstanceOf = isInstanceOf
|
||||
loadImage.createObjectURL = createObjectURL
|
||||
loadImage.revokeObjectURL = revokeObjectURL
|
||||
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(function () {
|
||||
return loadImage
|
||||
})
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
module.exports = loadImage
|
||||
} else {
|
||||
$.loadImage = loadImage
|
||||
}
|
||||
})((typeof window !== 'undefined' && window) || this)
|
||||
87
node_modules/blueimp-load-image/package.json
generated
vendored
Normal file
87
node_modules/blueimp-load-image/package.json
generated
vendored
Normal file
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"name": "blueimp-load-image",
|
||||
"version": "5.16.0",
|
||||
"title": "JavaScript Load Image",
|
||||
"description": "JavaScript Load Image is a library to load images provided as File or Blob objects or via URL. It returns an optionally scaled, cropped or rotated HTML img or canvas element. It also provides methods to parse image metadata to extract IPTC and Exif tags as well as embedded thumbnail images, to overwrite the Exif Orientation value and to restore the complete image header after resizing.",
|
||||
"keywords": [
|
||||
"javascript",
|
||||
"load",
|
||||
"loading",
|
||||
"image",
|
||||
"file",
|
||||
"blob",
|
||||
"url",
|
||||
"scale",
|
||||
"crop",
|
||||
"rotate",
|
||||
"img",
|
||||
"canvas",
|
||||
"meta",
|
||||
"exif",
|
||||
"orientation",
|
||||
"thumbnail",
|
||||
"iptc"
|
||||
],
|
||||
"homepage": "https://github.com/blueimp/JavaScript-Load-Image",
|
||||
"author": {
|
||||
"name": "Sebastian Tschan",
|
||||
"url": "https://blueimp.net"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/blueimp/JavaScript-Load-Image.git"
|
||||
},
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"blueimp-canvas-to-blob": "3",
|
||||
"chai": "4",
|
||||
"eslint": "7",
|
||||
"eslint-config-blueimp": "2",
|
||||
"eslint-config-prettier": "8",
|
||||
"eslint-plugin-jsdoc": "36",
|
||||
"eslint-plugin-prettier": "4",
|
||||
"jquery": "1",
|
||||
"mocha": "9",
|
||||
"prettier": "2",
|
||||
"promise-polyfill": "8",
|
||||
"uglify-js": "3"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"blueimp",
|
||||
"plugin:jsdoc/recommended",
|
||||
"plugin:prettier/recommended"
|
||||
],
|
||||
"env": {
|
||||
"browser": true
|
||||
}
|
||||
},
|
||||
"eslintIgnore": [
|
||||
"js/*.min.js",
|
||||
"js/vendor",
|
||||
"test/vendor"
|
||||
],
|
||||
"prettier": {
|
||||
"arrowParens": "avoid",
|
||||
"proseWrap": "always",
|
||||
"semi": false,
|
||||
"singleQuote": true,
|
||||
"trailingComma": "none"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "eslint .",
|
||||
"preunit": "bin/sync-vendor-libs.sh",
|
||||
"unit": "docker-compose run --rm mocha",
|
||||
"test": "npm run lint && npm run unit",
|
||||
"posttest": "docker-compose down -v",
|
||||
"build": "cd js && uglifyjs load-image.js load-image-scale.js load-image-meta.js load-image-fetch.js load-image-orientation.js load-image-exif.js load-image-exif-map.js load-image-iptc.js load-image-iptc-map.js --ie8 -c -m -o load-image.all.min.js --source-map url=load-image.all.min.js.map",
|
||||
"preversion": "npm test",
|
||||
"version": "npm run build && git add -A js",
|
||||
"postversion": "git push --tags origin master master:gh-pages && npm publish"
|
||||
},
|
||||
"files": [
|
||||
"js/*.js",
|
||||
"js/*.js.map"
|
||||
],
|
||||
"main": "js/index.js"
|
||||
}
|
||||
400
node_modules/blueimp-tmpl/README.md
generated
vendored
Normal file
400
node_modules/blueimp-tmpl/README.md
generated
vendored
Normal file
@@ -0,0 +1,400 @@
|
||||
# JavaScript Templates
|
||||
|
||||
## Demo
|
||||
[JavaScript Templates Demo](https://blueimp.github.io/JavaScript-Templates/)
|
||||
|
||||
## Description
|
||||
1KB lightweight, fast & powerful JavaScript templating engine with zero
|
||||
dependencies. Compatible with server-side environments like Node.js, module
|
||||
loaders like RequireJS, Browserify or webpack and all web browsers.
|
||||
|
||||
## Usage
|
||||
|
||||
### Client-side
|
||||
Include the (minified) JavaScript Templates script in your HTML markup:
|
||||
|
||||
```html
|
||||
<script src="js/tmpl.min.js"></script>
|
||||
```
|
||||
|
||||
Add a script section with type **"text/x-tmpl"**, a unique **id** property and
|
||||
your template definition as content:
|
||||
|
||||
```html
|
||||
<script type="text/x-tmpl" id="tmpl-demo">
|
||||
<h3>{%=o.title%}</h3>
|
||||
<p>Released under the
|
||||
<a href="{%=o.license.url%}">{%=o.license.name%}</a>.</p>
|
||||
<h4>Features</h4>
|
||||
<ul>
|
||||
{% for (var i=0; i<o.features.length; i++) { %}
|
||||
<li>{%=o.features[i]%}</li>
|
||||
{% } %}
|
||||
</ul>
|
||||
</script>
|
||||
```
|
||||
|
||||
**"o"** (the lowercase letter) is a reference to the data parameter of the
|
||||
template function (see the API section on how to modify this identifier).
|
||||
|
||||
In your application code, create a JavaScript object to use as data for the
|
||||
template:
|
||||
|
||||
```js
|
||||
var data = {
|
||||
"title": "JavaScript Templates",
|
||||
"license": {
|
||||
"name": "MIT license",
|
||||
"url": "http://www.opensource.org/licenses/MIT"
|
||||
},
|
||||
"features": [
|
||||
"lightweight & fast",
|
||||
"powerful",
|
||||
"zero dependencies"
|
||||
]
|
||||
};
|
||||
```
|
||||
|
||||
In a real application, this data could be the result of retrieving a
|
||||
[JSON](http://json.org/) resource.
|
||||
|
||||
Render the result by calling the **tmpl()** method with the id of the template
|
||||
and the data object as arguments:
|
||||
|
||||
```js
|
||||
document.getElementById("result").innerHTML = tmpl("tmpl-demo", data);
|
||||
```
|
||||
|
||||
### Server-side
|
||||
|
||||
The following is an example how to use the JavaScript Templates engine on the
|
||||
server-side with [node.js](http://nodejs.org/).
|
||||
|
||||
Create a new directory and add the **tmpl.js** file. Or alternatively, install
|
||||
the **blueimp-tmpl** package with [npm](https://www.npmjs.org/):
|
||||
|
||||
```sh
|
||||
npm install blueimp-tmpl
|
||||
```
|
||||
|
||||
Add a file **template.html** with the following content:
|
||||
|
||||
```html
|
||||
<!DOCTYPE HTML>
|
||||
<title>{%=o.title%}</title>
|
||||
<h3><a href="{%=o.url%}">{%=o.title%}</a></h3>
|
||||
<h4>Features</h4>
|
||||
<ul>
|
||||
{% for (var i=0; i<o.features.length; i++) { %}
|
||||
<li>{%=o.features[i]%}</li>
|
||||
{% } %}
|
||||
</ul>
|
||||
```
|
||||
|
||||
Add a file **server.js** with the following content:
|
||||
|
||||
```js
|
||||
require("http").createServer(function (req, res) {
|
||||
var fs = require("fs"),
|
||||
// The tmpl module exports the tmpl() function:
|
||||
tmpl = require("./tmpl"),
|
||||
// Use the following version if you installed the package with npm:
|
||||
// tmpl = require("blueimp-tmpl"),
|
||||
// Sample data:
|
||||
data = {
|
||||
"title": "JavaScript Templates",
|
||||
"url": "https://github.com/blueimp/JavaScript-Templates",
|
||||
"features": [
|
||||
"lightweight & fast",
|
||||
"powerful",
|
||||
"zero dependencies"
|
||||
]
|
||||
};
|
||||
// Override the template loading method:
|
||||
tmpl.load = function (id) {
|
||||
var filename = id + ".html";
|
||||
console.log("Loading " + filename);
|
||||
return fs.readFileSync(filename, "utf8");
|
||||
};
|
||||
res.writeHead(200, {"Content-Type": "text/x-tmpl"});
|
||||
// Render the content:
|
||||
res.end(tmpl("template", data));
|
||||
}).listen(8080, "localhost");
|
||||
console.log("Server running at http://localhost:8080/");
|
||||
```
|
||||
|
||||
Run the application with the following command:
|
||||
|
||||
```sh
|
||||
node server.js
|
||||
```
|
||||
|
||||
## Requirements
|
||||
The JavaScript Templates script has zero dependencies.
|
||||
|
||||
## API
|
||||
|
||||
### tmpl() function
|
||||
The **tmpl()** function is added to the global **window** object and can be
|
||||
called as global function:
|
||||
|
||||
```js
|
||||
var result = tmpl("tmpl-demo", data);
|
||||
```
|
||||
|
||||
The **tmpl()** function can be called with the id of a template, or with a
|
||||
template string:
|
||||
|
||||
```js
|
||||
var result = tmpl("<h3>{%=o.title%}</h3>", data);
|
||||
```
|
||||
|
||||
If called without second argument, **tmpl()** returns a reusable template
|
||||
function:
|
||||
|
||||
```js
|
||||
var func = tmpl("<h3>{%=o.title%}</h3>");
|
||||
document.getElementById("result").innerHTML = func(data);
|
||||
```
|
||||
|
||||
### Templates cache
|
||||
Templates loaded by id are cached in the map **tmpl.cache**:
|
||||
|
||||
```js
|
||||
var func = tmpl("tmpl-demo"), // Loads and parses the template
|
||||
cached = typeof tmpl.cache["tmpl-demo"] === "function", // true
|
||||
result = tmpl("tmpl-demo", data); // Uses cached template function
|
||||
|
||||
tmpl.cache["tmpl-demo"] = null;
|
||||
result = tmpl("tmpl-demo", data); // Loads and parses the template again
|
||||
```
|
||||
|
||||
### Output encoding
|
||||
The method **tmpl.encode** is used to escape HTML special characters in the
|
||||
template output:
|
||||
|
||||
```js
|
||||
var output = tmpl.encode("<>&\"'\x00"); // Renders "<>&"'"
|
||||
```
|
||||
|
||||
**tmpl.encode** makes use of the regular expression **tmpl.encReg** and the
|
||||
encoding map **tmpl.encMap** to match and replace special characters, which can
|
||||
be modified to change the behavior of the output encoding.
|
||||
Strings matched by the regular expression, but not found in the encoding map are
|
||||
removed from the output. This allows for example to automatically trim input
|
||||
values (removing whitespace from the start and end of the string):
|
||||
|
||||
```js
|
||||
tmpl.encReg = /(^\s+)|(\s+$)|[<>&"'\x00]/g;
|
||||
var output = tmpl.encode(" Banana! "); // Renders "Banana" (without whitespace)
|
||||
```
|
||||
|
||||
### Local helper variables
|
||||
The local variables available inside the templates are the following:
|
||||
|
||||
* **o**: The data object given as parameter to the template function
|
||||
(see the next section on how to modify the parameter name).
|
||||
* **tmpl**: A reference to the **tmpl** function object.
|
||||
* **_s**: The string for the rendered result content.
|
||||
* **_e**: A reference to the **tmpl.encode** method.
|
||||
* **print**: Helper function to add content to the rendered result string.
|
||||
* **include**: Helper function to include the return value of a different
|
||||
template in the result.
|
||||
|
||||
To introduce additional local helper variables, the string **tmpl.helper** can
|
||||
be extended. The following adds a convenience function for *console.log* and a
|
||||
streaming function, that streams the template rendering result back to the
|
||||
callback argument
|
||||
(note the comma at the beginning of each variable declaration):
|
||||
|
||||
```js
|
||||
tmpl.helper += ",log=function(){console.log.apply(console, arguments)}" +
|
||||
",st='',stream=function(cb){var l=st.length;st=_s;cb( _s.slice(l));}";
|
||||
```
|
||||
|
||||
Those new helper functions could be used to stream the template contents to the
|
||||
console output:
|
||||
|
||||
```html
|
||||
<script type="text/x-tmpl" id="tmpl-demo">
|
||||
<h3>{%=o.title%}</h3>
|
||||
{% stream(log); %}
|
||||
<p>Released under the
|
||||
<a href="{%=o.license.url%}">{%=o.license.name%}</a>.</p>
|
||||
{% stream(log); %}
|
||||
<h4>Features</h4>
|
||||
<ul>
|
||||
{% stream(log); %}
|
||||
{% for (var i=0; i<o.features.length; i++) { %}
|
||||
<li>{%=o.features[i]%}</li>
|
||||
{% stream(log); %}
|
||||
{% } %}
|
||||
</ul>
|
||||
{% stream(log); %}
|
||||
</script>
|
||||
```
|
||||
|
||||
### Template function argument
|
||||
The generated template functions accept one argument, which is the data object
|
||||
given to the **tmpl(id, data)** function. This argument is available inside the
|
||||
template definitions as parameter **o** (the lowercase letter).
|
||||
|
||||
The argument name can be modified by overriding **tmpl.arg**:
|
||||
|
||||
```js
|
||||
tmpl.arg = "p";
|
||||
|
||||
// Renders "<h3>JavaScript Templates</h3>":
|
||||
var result = tmpl("<h3>{%=p.title%}</h3>", {title: "JavaScript Templates"});
|
||||
```
|
||||
|
||||
### Template parsing
|
||||
The template contents are matched and replaced using the regular expression
|
||||
**tmpl.regexp** and the replacement function **tmpl.func**.
|
||||
The replacement function operates based on the
|
||||
[parenthesized submatch strings](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_function_as_a_parameter).
|
||||
|
||||
To use different tags for the template syntax, override **tmpl.regexp** with a
|
||||
modified regular expression, by exchanging all occurrences of "{%" and "%}",
|
||||
e.g. with "[%" and "%]":
|
||||
|
||||
```js
|
||||
tmpl.regexp = /([\s'\\])(?!(?:[^[]|\[(?!%))*%\])|(?:\[%(=|#)([\s\S]+?)%\])|(\[%)|(%\])/g;
|
||||
```
|
||||
|
||||
By default, the plugin preserves whitespace
|
||||
(newlines, carriage returns, tabs and spaces).
|
||||
To strip unnecessary whitespace, you can override the **tmpl.func** function,
|
||||
e.g. with the following code:
|
||||
|
||||
```js
|
||||
var originalFunc = tmpl.func;
|
||||
tmpl.func = function (s, p1, p2, p3, p4, p5, offset, str) {
|
||||
if (p1 && /\s/.test(p1)) {
|
||||
if (!offset || /\s/.test(str.charAt(offset - 1)) ||
|
||||
/^\s+$/g.test(str.slice(offset))) {
|
||||
return '';
|
||||
}
|
||||
return ' ';
|
||||
}
|
||||
return originalFunc.apply(tmpl, arguments);
|
||||
};
|
||||
```
|
||||
|
||||
## Templates syntax
|
||||
|
||||
### Interpolation
|
||||
Print variable with HTML special characters escaped:
|
||||
|
||||
```html
|
||||
<h3>{%=o.title%}</h3>
|
||||
```
|
||||
|
||||
Print variable without escaping:
|
||||
|
||||
```html
|
||||
<h3>{%#o.user_id%}</h3>
|
||||
```
|
||||
|
||||
Print output of function calls:
|
||||
|
||||
```html
|
||||
<a href="{%=encodeURI(o.url)%}">Website</a>
|
||||
```
|
||||
|
||||
Use dot notation to print nested properties:
|
||||
|
||||
```html
|
||||
<strong>{%=o.author.name%}</strong>
|
||||
```
|
||||
|
||||
### Evaluation
|
||||
Use **print(str)** to add escaped content to the output:
|
||||
|
||||
```html
|
||||
<span>Year: {% var d=new Date(); print(d.getFullYear()); %}</span>
|
||||
```
|
||||
|
||||
Use **print(str, true)** to add unescaped content to the output:
|
||||
|
||||
```html
|
||||
<span>{% print("Fast & powerful", true); %}</span>
|
||||
```
|
||||
|
||||
Use **include(str, obj)** to include content from a different template:
|
||||
|
||||
```html
|
||||
<div>
|
||||
{% include('tmpl-link', {name: "Website", url: "https://example.org"}); %}
|
||||
</div>
|
||||
```
|
||||
|
||||
**If else condition**:
|
||||
|
||||
```html
|
||||
{% if (o.author.url) { %}
|
||||
<a href="{%=encodeURI(o.author.url)%}">{%=o.author.name%}</a>
|
||||
{% } else { %}
|
||||
<em>No author url.</em>
|
||||
{% } %}
|
||||
```
|
||||
|
||||
**For loop**:
|
||||
|
||||
```html
|
||||
<ul>
|
||||
{% for (var i=0; i<o.features.length; i++) { %}
|
||||
<li>{%=o.features[i]%}</li>
|
||||
{% } %}
|
||||
</ul>
|
||||
```
|
||||
|
||||
## Compiled templates
|
||||
The JavaScript Templates project comes with a compilation script, that allows
|
||||
you to compile your templates into JavaScript code and combine them with a
|
||||
minimal Templates runtime into one combined JavaScript file.
|
||||
|
||||
The compilation script is built for [node.js](http://nodejs.org/).
|
||||
To use it, first install the JavaScript Templates project via
|
||||
[npm](https://www.npmjs.org/):
|
||||
|
||||
```sh
|
||||
npm install blueimp-tmpl
|
||||
```
|
||||
|
||||
This will put the executable **tmpl.js** into the folder **node_modules/.bin**.
|
||||
It will also make it available on your PATH if you install the package globally
|
||||
(by adding the **-g** flag to the install command).
|
||||
|
||||
The **tmpl.js** executable accepts the paths to one or multiple template files
|
||||
as command line arguments and prints the generated JavaScript code to the
|
||||
console output. The following command line shows you how to store the generated
|
||||
code in a new JavaScript file that can be included in your project:
|
||||
|
||||
```sh
|
||||
tmpl.js index.html > tmpl.js
|
||||
```
|
||||
|
||||
The files given as command line arguments to **tmpl.js** can either be pure
|
||||
template files or HTML documents with embedded template script sections.
|
||||
For the pure template files, the file names (without extension) serve as
|
||||
template ids.
|
||||
The generated file can be included in your project as a replacement for the
|
||||
original **tmpl.js** runtime. It provides you with the same API and provides a
|
||||
**tmpl(id, data)** function that accepts the id of one of your templates as
|
||||
first and a data object as optional second parameter.
|
||||
|
||||
## Tests
|
||||
The JavaScript Templates project comes with
|
||||
[Unit Tests](https://en.wikipedia.org/wiki/Unit_testing).
|
||||
There are two different ways to run the tests:
|
||||
|
||||
* Open test/index.html in your browser or
|
||||
* run `npm test` in the Terminal in the root path of the repository package.
|
||||
|
||||
The first one tests the browser integration,
|
||||
the second one the [node.js](http://nodejs.org/) integration.
|
||||
|
||||
## License
|
||||
The JavaScript Templates script is released under the
|
||||
[MIT license](http://www.opensource.org/licenses/MIT).
|
||||
80
node_modules/blueimp-tmpl/js/compile.js
generated
vendored
Executable file
80
node_modules/blueimp-tmpl/js/compile.js
generated
vendored
Executable file
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env node
|
||||
/*
|
||||
* JavaScript Templates Compiler
|
||||
* https://github.com/blueimp/JavaScript-Templates
|
||||
*
|
||||
* Copyright 2011, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
;(function () {
|
||||
'use strict'
|
||||
var path = require('path')
|
||||
var tmpl = require(path.join(__dirname, 'tmpl.js'))
|
||||
var fs = require('fs')
|
||||
// Retrieve the content of the minimal runtime:
|
||||
var runtime = fs.readFileSync(path.join(__dirname, 'runtime.js'), 'utf8')
|
||||
// A regular expression to parse templates from script tags in a HTML page:
|
||||
var regexp = /<script( id="([\w\-]+)")? type="text\/x-tmpl"( id="([\w\-]+)")?>([\s\S]+?)<\/script>/gi
|
||||
// A regular expression to match the helper function names:
|
||||
var helperRegexp = new RegExp(
|
||||
tmpl.helper.match(/\w+(?=\s*=\s*function\s*\()/g).join('\\s*\\(|') + '\\s*\\('
|
||||
)
|
||||
// A list to store the function bodies:
|
||||
var list = []
|
||||
var code
|
||||
// Extend the Templating engine with a print method for the generated functions:
|
||||
tmpl.print = function (str) {
|
||||
// Only add helper functions if they are used inside of the template:
|
||||
var helper = helperRegexp.test(str) ? tmpl.helper : ''
|
||||
var body = str.replace(tmpl.regexp, tmpl.func)
|
||||
if (helper || (/_e\s*\(/.test(body))) {
|
||||
helper = '_e=tmpl.encode' + helper + ','
|
||||
}
|
||||
return 'function(' + tmpl.arg + ',tmpl){' +
|
||||
('var ' + helper + "_s='" + body + "';return _s;")
|
||||
.split("_s+='';").join('') + '}'
|
||||
}
|
||||
// Loop through the command line arguments:
|
||||
process.argv.forEach(function (file, index) {
|
||||
var listLength = list.length
|
||||
var stats
|
||||
var content
|
||||
var result
|
||||
var id
|
||||
// Skip the first two arguments, which are "node" and the script:
|
||||
if (index > 1) {
|
||||
stats = fs.statSync(file)
|
||||
if (!stats.isFile()) {
|
||||
console.error(file + ' is not a file.')
|
||||
return
|
||||
}
|
||||
content = fs.readFileSync(file, 'utf8')
|
||||
while (true) {
|
||||
// Find templates in script tags:
|
||||
result = regexp.exec(content)
|
||||
if (!result) {
|
||||
break
|
||||
}
|
||||
id = result[2] || result[4]
|
||||
list.push("'" + id + "':" + tmpl.print(result[5]))
|
||||
}
|
||||
if (listLength === list.length) {
|
||||
// No template script tags found, use the complete content:
|
||||
id = path.basename(file, path.extname(file))
|
||||
list.push("'" + id + "':" + tmpl.print(content))
|
||||
}
|
||||
}
|
||||
})
|
||||
if (!list.length) {
|
||||
console.error('Missing input file.')
|
||||
return
|
||||
}
|
||||
// Combine the generated functions as cache of the minimal runtime:
|
||||
code = runtime.replace('{}', '{' + list.join(',') + '}')
|
||||
// Print the resulting code to the console output:
|
||||
console.log(code)
|
||||
}())
|
||||
48
node_modules/blueimp-tmpl/js/runtime.js
generated
vendored
Normal file
48
node_modules/blueimp-tmpl/js/runtime.js
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* JavaScript Templates Runtime
|
||||
* https://github.com/blueimp/JavaScript-Templates
|
||||
*
|
||||
* Copyright 2011, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/* global define */
|
||||
|
||||
;(function ($) {
|
||||
'use strict'
|
||||
var tmpl = function (id, data) {
|
||||
var f = tmpl.cache[id]
|
||||
return data ? f(data, tmpl) : function (data) {
|
||||
return f(data, tmpl)
|
||||
}
|
||||
}
|
||||
tmpl.cache = {}
|
||||
tmpl.encReg = /[<>&"'\x00]/g // eslint-disable-line no-control-regex
|
||||
tmpl.encMap = {
|
||||
'<': '<',
|
||||
'>': '>',
|
||||
'&': '&',
|
||||
'"': '"',
|
||||
"'": '''
|
||||
}
|
||||
tmpl.encode = function (s) {
|
||||
return (s == null ? '' : '' + s).replace(
|
||||
tmpl.encReg,
|
||||
function (c) {
|
||||
return tmpl.encMap[c] || ''
|
||||
}
|
||||
)
|
||||
}
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(function () {
|
||||
return tmpl
|
||||
})
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
module.exports = tmpl
|
||||
} else {
|
||||
$.tmpl = tmpl
|
||||
}
|
||||
}(this))
|
||||
86
node_modules/blueimp-tmpl/js/tmpl.js
generated
vendored
Normal file
86
node_modules/blueimp-tmpl/js/tmpl.js
generated
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* JavaScript Templates
|
||||
* https://github.com/blueimp/JavaScript-Templates
|
||||
*
|
||||
* Copyright 2011, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* http://www.opensource.org/licenses/MIT
|
||||
*
|
||||
* Inspired by John Resig's JavaScript Micro-Templating:
|
||||
* http://ejohn.org/blog/javascript-micro-templating/
|
||||
*/
|
||||
|
||||
/* global define */
|
||||
|
||||
;(function ($) {
|
||||
'use strict'
|
||||
var tmpl = function (str, data) {
|
||||
var f = !/[^\w\-\.:]/.test(str)
|
||||
? tmpl.cache[str] = tmpl.cache[str] || tmpl(tmpl.load(str))
|
||||
: new Function(// eslint-disable-line no-new-func
|
||||
tmpl.arg + ',tmpl',
|
||||
'var _e=tmpl.encode' + tmpl.helper + ",_s='" +
|
||||
str.replace(tmpl.regexp, tmpl.func) + "';return _s;"
|
||||
)
|
||||
return data ? f(data, tmpl) : function (data) {
|
||||
return f(data, tmpl)
|
||||
}
|
||||
}
|
||||
tmpl.cache = {}
|
||||
tmpl.load = function (id) {
|
||||
return document.getElementById(id).innerHTML
|
||||
}
|
||||
tmpl.regexp = /([\s'\\])(?!(?:[^{]|\{(?!%))*%\})|(?:\{%(=|#)([\s\S]+?)%\})|(\{%)|(%\})/g
|
||||
tmpl.func = function (s, p1, p2, p3, p4, p5) {
|
||||
if (p1) { // whitespace, quote and backspace in HTML context
|
||||
return {
|
||||
'\n': '\\n',
|
||||
'\r': '\\r',
|
||||
'\t': '\\t',
|
||||
' ': ' '
|
||||
}[p1] || '\\' + p1
|
||||
}
|
||||
if (p2) { // interpolation: {%=prop%}, or unescaped: {%#prop%}
|
||||
if (p2 === '=') {
|
||||
return "'+_e(" + p3 + ")+'"
|
||||
}
|
||||
return "'+(" + p3 + "==null?'':" + p3 + ")+'"
|
||||
}
|
||||
if (p4) { // evaluation start tag: {%
|
||||
return "';"
|
||||
}
|
||||
if (p5) { // evaluation end tag: %}
|
||||
return "_s+='"
|
||||
}
|
||||
}
|
||||
tmpl.encReg = /[<>&"'\x00]/g // eslint-disable-line no-control-regex
|
||||
tmpl.encMap = {
|
||||
'<': '<',
|
||||
'>': '>',
|
||||
'&': '&',
|
||||
'"': '"',
|
||||
"'": '''
|
||||
}
|
||||
tmpl.encode = function (s) {
|
||||
return (s == null ? '' : '' + s).replace(
|
||||
tmpl.encReg,
|
||||
function (c) {
|
||||
return tmpl.encMap[c] || ''
|
||||
}
|
||||
)
|
||||
}
|
||||
tmpl.arg = 'o'
|
||||
tmpl.helper = ",print=function(s,e){_s+=e?(s==null?'':s):_e(s);}" +
|
||||
',include=function(s,d){_s+=tmpl(s,d);}'
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(function () {
|
||||
return tmpl
|
||||
})
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
module.exports = tmpl
|
||||
} else {
|
||||
$.tmpl = tmpl
|
||||
}
|
||||
}(this))
|
||||
40
node_modules/blueimp-tmpl/package.json
generated
vendored
Normal file
40
node_modules/blueimp-tmpl/package.json
generated
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "blueimp-tmpl",
|
||||
"version": "3.6.0",
|
||||
"title": "JavaScript Templates",
|
||||
"description": "1KB lightweight, fast & powerful JavaScript templating engine with zero dependencies. Compatible with server-side environments like Node.js, module loaders like RequireJS, Browserify or webpack and all web browsers.",
|
||||
"keywords": [
|
||||
"javascript",
|
||||
"templates",
|
||||
"templating"
|
||||
],
|
||||
"homepage": "https://github.com/blueimp/JavaScript-Templates",
|
||||
"author": {
|
||||
"name": "Sebastian Tschan",
|
||||
"url": "https://blueimp.net"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/blueimp/JavaScript-Templates.git"
|
||||
},
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"chai": "3.5.0",
|
||||
"mocha": "3.1.0",
|
||||
"standard": "8.3.0",
|
||||
"uglify-js": "2.7.3"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "standard js/*.js test/*.js",
|
||||
"unit": "mocha",
|
||||
"test": "npm run lint && npm run unit",
|
||||
"build": "cd js && uglifyjs tmpl.js -c -m -o tmpl.min.js --source-map tmpl.min.js.map",
|
||||
"preversion": "npm test",
|
||||
"version": "npm run build && git add -A js",
|
||||
"postversion": "git push --tags origin master master:gh-pages && npm publish"
|
||||
},
|
||||
"bin": {
|
||||
"tmpl.js": "js/compile.js"
|
||||
},
|
||||
"main": "js/tmpl.js"
|
||||
}
|
||||
12
node_modules/ckeditor5-itop-build/build/styles/compiled-theme.scss
generated
vendored
12
node_modules/ckeditor5-itop-build/build/styles/compiled-theme.scss
generated
vendored
@@ -7525,9 +7525,19 @@ div.ck.ck-balloon-panel.ck-mention-balloon {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.ck-fullscreen__main-wrapper .ck-fullscreen__editable .ck.ck-editor__editable:not(.ck-editor__nested-editable) {
|
||||
.ck-fullscreen__main-wrapper .ck-fullscreen__editable .ck.ck-editor__editable:not(.ck-editor__nested-editable),
|
||||
.ck-fullscreen__main-wrapper .ck-fullscreen__editable .ck-source-editing-area{
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
min-height: unset;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.ck-fullscreen__main-wrapper .ck-fullscreen__editable .ck.ck-editor__editable:not(.ck-editor__nested-editable) {
|
||||
padding: 0 var(--ck-spacing-standard);
|
||||
}
|
||||
|
||||
.ck-source-editing-area textarea {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
30
node_modules/web.config
generated
vendored
30
node_modules/web.config
generated
vendored
@@ -1,30 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!-- Allow only static resources files -->
|
||||
<!-- - HTML not allowed as there could be some test pages calling server scripts or executing JS scripts -->
|
||||
<!-- - PHP not allowed as they should not be publicly accessible -->
|
||||
<configuration>
|
||||
<system.webServer>
|
||||
<security>
|
||||
<requestFiltering>
|
||||
<fileExtensions applyToWebDAV="false" allowUnlisted="false" >
|
||||
<add fileExtension=".css" allowed="true" />
|
||||
<add fileExtension=".scss" allowed="true" />
|
||||
<add fileExtension=".js" allowed="true" />
|
||||
<add fileExtension=".map" allowed="true" />
|
||||
<add fileExtension=".png" allowed="true" />
|
||||
<add fileExtension=".bmp" allowed="true" />
|
||||
<add fileExtension=".gif" allowed="true" />
|
||||
<add fileExtension=".jpeg" allowed="true" />
|
||||
<add fileExtension=".jpg" allowed="true" />
|
||||
<add fileExtension=".svg" allowed="true" />
|
||||
<add fileExtension=".tiff" allowed="true" />
|
||||
|
||||
<add fileExtension=".woff" allowed="true" />
|
||||
<add fileExtension=".woff2" allowed="true" />
|
||||
<add fileExtension=".ttf" allowed="true" />
|
||||
<add fileExtension=".eot" allowed="true" />
|
||||
</fileExtensions>
|
||||
</requestFiltering>
|
||||
</security>
|
||||
</system.webServer>
|
||||
</configuration>
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -104,7 +104,7 @@
|
||||
},
|
||||
"node_modules/ckeditor5-itop-build": {
|
||||
"version": "3.3.0",
|
||||
"resolved": "git+ssh://git@github.com/Combodo/ckeditor5-itop-build.git#21b6edc3348d3f1804e3ae8aab1567ac888a2f30",
|
||||
"resolved": "git+ssh://git@github.com/Combodo/ckeditor5-itop-build.git#0443561b0816d860e31603e0264ebd478f00f0df",
|
||||
"license": "SEE LICENSE IN LICENSE.md"
|
||||
},
|
||||
"node_modules/clipboard": {
|
||||
@@ -357,7 +357,7 @@
|
||||
}
|
||||
},
|
||||
"ckeditor5-itop-build": {
|
||||
"version": "git+ssh://git@github.com/Combodo/ckeditor5-itop-build.git#21b6edc3348d3f1804e3ae8aab1567ac888a2f30",
|
||||
"version": "git+ssh://git@github.com/Combodo/ckeditor5-itop-build.git#0443561b0816d860e31603e0264ebd478f00f0df",
|
||||
"from": "ckeditor5-itop-build@github:Combodo/ckeditor5-itop-build"
|
||||
},
|
||||
"clipboard": {
|
||||
|
||||
@@ -2793,8 +2793,6 @@ class SynchroExecution
|
||||
* </ul>
|
||||
*/
|
||||
protected $m_oLastFullLoadStartDate = null;
|
||||
/** @var bool true if the caller script gave the datetime before import phase was launched */
|
||||
protected $m_bIsImportPhaseDateKnown;
|
||||
|
||||
/** @var \CMDBChange */
|
||||
protected $m_oChange = null;
|
||||
@@ -2819,10 +2817,7 @@ class SynchroExecution
|
||||
public function __construct($oDataSource, $oImportPhaseStartDate = null)
|
||||
{
|
||||
$this->m_oDataSource = $oDataSource;
|
||||
|
||||
$this->m_bIsImportPhaseDateKnown = ($oImportPhaseStartDate != null);
|
||||
$this->m_oImportPhaseStartDate = $oImportPhaseStartDate;
|
||||
|
||||
$this->m_oCtx = new ContextTag(ContextTag::TAG_SYNCHRO);
|
||||
$this->m_oCtx1 = new ContextTag('Synchro:'.$oDataSource->GetRawName()); // More precise context information
|
||||
}
|
||||
@@ -2899,7 +2894,7 @@ class SynchroExecution
|
||||
$this->m_oStatLog->Set('stats_nb_replica_total', $this->m_iCountAllReplicas);
|
||||
|
||||
$this->m_oStatLog->DBInsert();
|
||||
$sLastFullLoad = ($this->m_bIsImportPhaseDateKnown) ? $this->m_oImportPhaseStartDate->format('Y-m-d H:i:s') : 'not specified';
|
||||
$sLastFullLoad = (is_null($this->m_oImportPhaseStartDate)) ? 'not specified' : $this->m_oImportPhaseStartDate->format('Y-m-d H:i:s');
|
||||
$this->m_oStatLog->AddTrace("###### STARTING SYNCHRONIZATION ##### Total: {$this->m_iCountAllReplicas} replica(s). Last full load: '$sLastFullLoad' ");
|
||||
$sSql = 'SELECT NOW();';
|
||||
$sDBNow = CMDBSource::QueryToScalar($sSql);
|
||||
@@ -3003,21 +2998,18 @@ class SynchroExecution
|
||||
// Compute and keep track of the limit date taken into account for obsoleting replicas
|
||||
//
|
||||
$iFullLoadInterval = $this->m_oDataSource->Get('full_load_periodicity'); // Duration in seconds
|
||||
if ($this->m_bIsImportPhaseDateKnown) {
|
||||
$oLimitDate = clone $this->m_oImportPhaseStartDate;
|
||||
$sInterval = "-$iFullLoadInterval seconds";
|
||||
$oLimitDate->Modify($sInterval);
|
||||
} else {
|
||||
if (is_null($this->m_oImportPhaseStartDate)) {
|
||||
if ($iFullLoadInterval <= 0) {
|
||||
// we are doing exec phase alone, and the full load interval is set to 0 => we should not update/delete replicas !!
|
||||
// This will prevent actions in DoJob1() method
|
||||
$oLimitDate = new DateTime('1970-01-01');
|
||||
} else {
|
||||
$oLimitDate = self::GetDataBaseCurrentDateTime();
|
||||
$sInterval = "-$iFullLoadInterval seconds";
|
||||
$oLimitDate->Modify($sInterval);
|
||||
}
|
||||
} else {
|
||||
$oLimitDate = clone $this->m_oImportPhaseStartDate;
|
||||
}
|
||||
$this->ExactlySubtractSeconds($oLimitDate, $iFullLoadInterval);
|
||||
$this->m_oLastFullLoadStartDate = $oLimitDate;
|
||||
if ($bFirstPass) {
|
||||
$this->m_oStatLog->AddTrace('Limit Date: '.$this->m_oLastFullLoadStartDate->Format('Y-m-d H:i:s'));
|
||||
@@ -3137,10 +3129,10 @@ class SynchroExecution
|
||||
$aArguments['log'] = $this->m_oStatLog->GetKey();
|
||||
$aArguments['change'] = $this->m_oChange->GetKey();
|
||||
$aArguments['chunk'] = $iMaxChunkSize;
|
||||
if ($this->m_bIsImportPhaseDateKnown) {
|
||||
$aArguments['last_full_load'] = $this->m_oImportPhaseStartDate->Format('Y-m-d H:i:s');
|
||||
} else {
|
||||
if (is_null($this->m_oImportPhaseStartDate)) {
|
||||
$aArguments['last_full_load'] = '';
|
||||
} else {
|
||||
$aArguments['last_full_load'] = $this->m_oImportPhaseStartDate->Format('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
$this->m_oStatLog->DBUpdate();
|
||||
@@ -3492,13 +3484,11 @@ class SynchroExecution
|
||||
|
||||
// Get all the replicas that are to be deleted
|
||||
//
|
||||
$oDeletionDate = $this->m_oLastFullLoadStartDate;
|
||||
$oDeletionDate = clone $this->m_oLastFullLoadStartDate;
|
||||
$iDeleteRetention = $this->m_oDataSource->Get('delete_policy_retention'); // Duration in seconds
|
||||
if ($iDeleteRetention > 0) {
|
||||
$sInterval = "-$iDeleteRetention seconds";
|
||||
$oDeletionDate->Modify($sInterval);
|
||||
}
|
||||
$this->ExactlySubtractSeconds($oDeletionDate, $iDeleteRetention);
|
||||
$sDeletionDate = $oDeletionDate->Format('Y-m-d H:i:s');
|
||||
|
||||
if ($bFirstPass) {
|
||||
$this->m_oStatLog->AddTrace("Deletion date: $sDeletionDate");
|
||||
}
|
||||
@@ -3548,4 +3538,21 @@ class SynchroExecution
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Take into account timechange to apply date difference operation
|
||||
* @param \DateTime $oDate
|
||||
* @param $iDurationInSeconds
|
||||
* @return void
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function ExactlySubtractSeconds(DateTime $oDate, $iDurationInSeconds): void
|
||||
{
|
||||
if ($iDurationInSeconds > 0) {
|
||||
$oDate->setTimezone(new DateTimeZone('UTC'));
|
||||
$sInterval = "-$iDurationInSeconds seconds";
|
||||
$oDate->Modify($sInterval);
|
||||
$sTimezone = MetaModel::GetConfig()->Get('timezone');
|
||||
$oDate->setTimezone(new DateTimeZone($sTimezone));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user