Compare commits

..

43 Commits

Author SHA1 Message Date
Pierre Goiffon
5b46644786 N°2033 backup : tar generation simplify buffer size computation 2019-02-21 17:10:16 +01:00
Pierre Goiffon
3356856a5f N°2033 backup : fix corrupted archive for files which size is a multiple of 1024 bytes 2019-02-20 17:25:34 +01:00
purplegrape
554e9aa205 Create zh_cn.dict.itop-hub-connector.php 2019-02-13 10:16:02 +01:00
Molkobain
d5c0202094 (Cherry pick from 875b902) N°1917 Setup: Fix warnings when upgrading an extension with an extension.xml file 2018-12-31 14:50:41 +01:00
Purple Grape
cbd866e988 🌐 update chinese translation for 2.4 branch (#46)
1、update chinese translation for 2.4 branch
2、fix some missing tab key just for goodlooking
* rename zh.dict*.php to zh_cn*.php
2018-12-26 16:04:04 +01:00
Denis Flaven
b19b9e7b27 N°1912: 🐛 text written in white in the PDF export of the impact analysis. 2018-12-26 15:36:18 +01:00
Eric
50dc4aec1e Fix Setup hardening 2018-12-19 17:15:45 +01:00
Denis Flaven
513d813566 Setup hardening. 2018-12-13 17:45:49 +01:00
Eric
f4a546a9ec Perf autocomplete (remove multiple requests) 2018-12-11 16:14:22 +01:00
Eric
14a498a374 💄 white background 2018-12-07 15:54:33 +01:00
Eric
af4729ac6a 💄 block the RETURN key when no response yet from ajax 2018-12-07 15:54:05 +01:00
Eric
f3f01f5cc8 Perf Autocomplete wizard helper don't read the links 2018-12-07 15:52:58 +01:00
Eric
c29d7f9a07 Fix Export PDF in PHP7.1 2018-12-06 09:27:28 +01:00
Molkobain
ab6cf18445 Update readme.txt for iTop 2.4.3 2018-10-10 14:39:52 +02:00
Guillaume Lajarige
a0171ac9cf (Cherry pick from develop ab1715e) N°1576 Portal: Security hardening. 2018-10-04 15:05:48 +02:00
Guillaume Lajarige
4b4bb6aa0b (Cherry pick from develop 526d4c4d) N°1575 Portal: Security hardening. 2018-10-04 12:22:40 +02:00
Molkobain
ff8397edf6 Add .gitignore to branch support/2.4 2018-10-04 11:27:52 +02:00
Eric
d46dc519e1 N°1626 - Error 500 when returning from a move to test 2018-09-17 11:14:34 +02:00
Pierre Goiffon
fe7eb22d32 N°931 wooops new MySQL requirement is for iTop 2.6 and not 2.5
SVN:2.4[5979]
2018-07-25 08:00:33 +00:00
Pierre Goiffon
bafb6ab212 N°931 change iTop 2.5 MySQL requirements from 5.5.3 to 5.6 (to have fulltext on InnoDB)
SVN:2.4[5975]
2018-07-25 07:54:44 +00:00
Pierre Goiffon
6c0e986563 N°1572 Add composer.json for PHP language level
SVN:2.4[5966]
2018-07-24 12:18:15 +00:00
Eric Espié
cf06f3e0d5 Retrofit from trunk
N°1561 - Fix auto-complete error when the friendlyname depends on other classes
[from revision 5948]

SVN:2.4[5949]
2018-07-18 12:38:16 +00:00
Romain Quetiez
fe887f01c0 Reelasing 2.4.2
SVN:2.4[5867]
2018-06-14 09:33:29 +00:00
Eric Espié
9109138127 N°1420 - Fix index generation
SVN:2.4[5866]
2018-06-14 09:03:39 +00:00
Eric Espié
51b19c03b1 N°1420 - Fix index generation
SVN:2.4[5865]
2018-06-14 08:56:12 +00:00
Eric Espié
8cb584abdd N°1420 - Fix index generation
SVN:2.4[5842]
2018-06-08 13:01:45 +00:00
Eric Espié
3480d478b0 N°1420 - Limit count
SVN:2.4[5839]
2018-06-08 09:30:10 +00:00
Eric Espié
3a34417a7d N°1420 - Limit count
SVN:2.4[5838]
2018-06-08 09:24:25 +00:00
Eric Espié
6ca3ca108b N°1420 - Fix index generation
SVN:2.4[5837]
2018-06-08 09:23:30 +00:00
Eric Espié
037036ce6a N°1420 - don't launch the search automatically for n:n and n:1 links for huge tables
SVN:2.4[5832]
2018-06-07 12:20:22 +00:00
Eric Espié
9d2dab5eba N°1420 - Performance for auto-complete widgets
SVN:2.4[5829]
2018-06-06 07:51:07 +00:00
Eric Espié
3169b39952 N°1488 - restore failed on production-modules
SVN:2.4[5827]
2018-06-05 13:48:56 +00:00
Eric Espié
ba33b01d84 SVN:2.4[5820] 2018-05-30 10:24:07 +00:00
Eric Espié
7db69ed158 N°1420 - Autocomplete
Directory 'branch-2.4' created by PhpStorm

SVN:2.4[5819]
2018-05-30 10:20:10 +00:00
Guillaume Lajarige
a6f6d536e0 N°1472 Portal: OQL optimization in ManageBrick when several UNIONs are used.
SVN:2.4[5813]
2018-05-23 15:03:33 +00:00
Stephen Abello
880faf2021 (Retrofit from trunk) N°1444 : fixed regression introduced in [r5725] & [r5774]
SVN:2.4[5810]
2018-05-23 11:29:56 +00:00
Eric Espié
f96902c03e N°1330 - Fix broken sql requests due to the use of class instead of alias
SVN:2.4[5783]
2018-05-15 12:11:22 +00:00
Pierre Goiffon
6e810322f7 (Retrofit from trunk) N°1418 fix audit with valid_flag=true that were always failing (r5773)
SVN:2.4[5774]
2018-05-04 15:12:55 +00:00
Guillaume Lajarige
dd9984be7f (Retrofit from trunk) N°1425 Fix regression introduced in 2.4. Creation of an object in a specific state could result in a fatal error due to bad ormlinkSet initialization.
SVN:2.4[5756]
2018-04-27 14:20:44 +00:00
Stephen Abello
98f3f88ea2 N°1424 : (Retrofit from trunk r5339 & r5751) Sharing base compatibility fix
SVN:2.4[5752]
2018-04-27 12:32:28 +00:00
Pierre Goiffon
8be0c36859 (Retrofit from trunk) N°1418 Audits Perf optimization for AuditRule with valid_flag=true and lots of negative records
Use a new helper method that don't parse values anymore on SELECT IN / NOT IN queries (r5724)

SVN:2.4[5725]
2018-04-23 14:54:19 +00:00
Pierre Goiffon
8c5a65d836 (Retrofit from trunk) N°1328 Fix CSV import : check if user has rights on imported class (r5597)
SVN:2.4[5598]
2018-04-03 13:40:47 +00:00
Pierre Goiffon
db47973063 (Retrofit from trunk) N°1330 Header with statistics dashlet perf improvements
Now uses one count + group by query instead of one count query per grouping value (r5576)

SVN:2.4[5577]
2018-03-29 15:50:04 +00:00
83 changed files with 10231 additions and 7323 deletions

122
.gitignore vendored Normal file
View File

@@ -0,0 +1,122 @@
/toolkit/
/conf/*
/env-*/*
# composer reserver directory, from sources, populate/update using "composer install"
vendor/*
test/vendor/*
# all datas but listing prevention
data/*
!data/.htaccess
!data/index.php
!data/web.config
# iTop extensions
extensions/*
!extensions/readme.txt
# all logs but listing prevention
log/*
!log/.htaccess
!log/index.php
!log/web.config
# Jetbrains
.idea/**
!.idea/encodings.xml
!.idea/codeStyles
!.idea/codeStyles/*
!.idea/inspectionProfiles
!.idea/inspectionProfiles/*
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
### Eclipse template
.metadata
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
.recommenders
.project
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# PyDev specific (Python IDE for Eclipse)
*.pydevproject
# CDT-specific (C/C++ Development Tooling)
.cproject
# CDT- autotools
.autotools
# Java annotation processor (APT)
.factorypath
# PDT-specific (PHP Development Tools)
.buildpath
# sbteclipse plugin
.target
# Tern plugin
.tern-project
# TeXlipse plugin
.texlipse
# STS (Spring Tool Suite)
.springBeans
# Code Recommenders
.recommenders/
# Annotation Processing
.apt_generated/
# Scala IDE specific (Scala & Java development for Eclipse)
.cache-main
.scala_dependencies
.worksheet

View File

@@ -214,62 +214,69 @@ PrepareWidgets();
EOF
);
}
$sHtml = '';
$s_captured_output = $this->ob_get_clean_safe();
if (($this->sContentType == 'text/html') && ($this->sContentDisposition == 'inline'))
{
// inline content != attachment && html => filter all scripts for malicious XSS scripts
echo self::FilterXSS($this->s_content);
$sHtml .= self::FilterXSS($this->s_content);
}
else
{
echo $this->s_content;
$sHtml .= $this->s_content;
}
if (!empty($this->m_sMenu))
{
$uid = time();
echo "<div id=\"accordion_temp_$uid\">\n";
echo "<div id=\"accordion\">\n";
echo "<!-- Beginning of the accordion menu -->\n";
echo self::FilterXSS($this->m_sMenu);
echo "<!-- End of the accordion menu-->\n";
echo "</div>\n";
echo "</div>\n";
$sHtml .= "<div id=\"accordion_temp_$uid\">\n";
$sHtml .= "<div id=\"accordion\">\n";
$sHtml .= "<!-- Beginning of the accordion menu -->\n";
$sHtml .= self::FilterXSS($this->m_sMenu);
$sHtml .= "<!-- End of the accordion menu-->\n";
$sHtml .= "</div>\n";
$sHtml .= "</div>\n";
echo "<script type=\"text/javascript\">\n";
echo "$('#inner_menu').html($('#accordion_temp_$uid').html());\n";
echo "$('#accordion_temp_$uid').remove();\n";
echo "\n</script>\n";
$sHtml .= "<script type=\"text/javascript\">\n";
$sHtml .= "$('#inner_menu').html($('#accordion_temp_$uid').html());\n";
$sHtml .= "$('#accordion_temp_$uid').remove();\n";
$sHtml .= "\n</script>\n";
}
//echo $this->s_deferred_content;
//$sHtml .= $this->s_deferred_content;
if (count($this->a_scripts) > 0)
{
echo "<script type=\"text/javascript\">\n";
echo implode("\n", $this->a_scripts);
echo "\n</script>\n";
$sHtml .= "<script type=\"text/javascript\">\n";
$sHtml .= implode("\n", $this->a_scripts);
$sHtml .= "\n</script>\n";
}
if (!empty($this->s_deferred_content))
{
echo "<script type=\"text/javascript\">\n";
echo "\$('body').append('".addslashes(str_replace("\n", '', $this->s_deferred_content))."');\n";
echo "\n</script>\n";
$sHtml .= "<script type=\"text/javascript\">\n";
$sHtml .= "\$('body').append('".addslashes(str_replace("\n", '', $this->s_deferred_content))."');\n";
$sHtml .= "\n</script>\n";
}
if (!empty($this->m_sReadyScript))
{
echo "<script type=\"text/javascript\">\n";
echo $this->m_sReadyScript; // Ready Scripts are output as simple scripts
echo "\n</script>\n";
$sHtml .= "<script type=\"text/javascript\">\n";
$sHtml .= $this->m_sReadyScript; // Ready Scripts are output as simple scripts
$sHtml .= "\n</script>\n";
}
if (trim($s_captured_output) != "")
{
echo self::FilterXSS($s_captured_output);
$sHtml .= self::FilterXSS($s_captured_output);
}
$oKPI = new ExecutionKPI();
echo $sHtml;
$oKPI->ComputeAndReport('Echoing ('.round(strlen($sHtml) / 1024).' Kb)');
if (class_exists('DBSearch'))
{
DBSearch::RecordQueryTrace();
}
ExecutionKPI::ReportStats();
}
/**

View File

@@ -118,8 +118,7 @@ class ApplicationContext
$oSearchFilter = new DBObjectSearch('Organization');
$oSearchFilter->SetModifierProperty('UserRightsGetSelectFilter', 'bSearchMode', true);
$oSet = new CMDBObjectSet($oSearchFilter);
$iCount = $oSet->Count();
if ($iCount == 1)
if ($oSet->Count(2) == 1)
{
// Only one possible value for org_id, set it in the context
$oOrg = $oSet->Fetch();

View File

@@ -2568,7 +2568,7 @@ EOF
if ($oAttDef->IsExternalKey())
{
$oAllowedValues = MetaModel::GetAllowedValuesAsObjectSet($sClass, $sAttCode, $aArgs);
if ($oAllowedValues->Count() == 1)
if ($oAllowedValues->Count(2) == 1)
{
$oRemoteObj = $oAllowedValues->Fetch();
$oObj->Set($sAttCode, $oRemoteObj->GetKey());
@@ -2687,7 +2687,7 @@ EOF
if ($oAttDef->IsExternalKey())
{
$oAllowedValues = MetaModel::GetAllowedValuesAsObjectSet($sClass, $sAttCode, $aArgs, '', $this->Get($sAttCode));
if ($oAllowedValues->Count() == 1)
if ($oAllowedValues->Count(2) == 1)
{
$oRemoteObj = $oAllowedValues->Fetch();
$this->Set($sAttCode, $oRemoteObj->GetKey());

View File

@@ -661,7 +661,7 @@ class DisplayBlock
case 'links':
//$bDashboardMode = isset($aExtraParams['dashboard']) ? ($aExtraParams['dashboard'] == 'true') : false;
//$bSelectMode = isset($aExtraParams['select']) ? ($aExtraParams['select'] == 'true') : false;
if ( ($this->m_oSet->Count()> 0) && (UserRights::IsActionAllowed($this->m_oSet->GetClass(), UR_ACTION_READ, $this->m_oSet) == UR_ALLOWED_YES) )
if ( ($this->m_oSet->Count(1)> 0) && (UserRights::IsActionAllowed($this->m_oSet->GetClass(), UR_ACTION_READ, $this->m_oSet) == UR_ALLOWED_YES) )
{
//$sLinkage = isset($aExtraParams['linkage']) ? $aExtraParams['linkage'] : '';
$sHtml .= cmdbAbstractObject::GetDisplaySet($oPage, $this->m_oSet, $aExtraParams);
@@ -774,21 +774,38 @@ class DisplayBlock
{
$aStates = explode(',', $sStatesList);
$oAttDef = MetaModel::GetAttributeDef($sClass, $sStateAttrCode);
// Generate one count + group by query [#1330]
$sClassAlias = $this->m_oFilter->GetClassAlias();
$oGroupByExpr = Expression::FromOQL($sClassAlias.'.'.$sStateAttrCode);
$aGroupBy = array('group1' => $oGroupByExpr);
$sCountGroupByQuery = $this->m_oFilter->MakeGroupByQuery(array(), $aGroupBy, false);
$aCountGroupByResults = CMDBSource::QueryToArray($sCountGroupByQuery);
$aCountsQueryResults = array();
foreach ($aCountGroupByResults as $aCountGroupBySingleResult)
{
$aCountsQueryResults[$aCountGroupBySingleResult[0]] = $aCountGroupBySingleResult[1];
}
foreach($aStates as $sStateValue)
{
$oFilter = $this->m_oFilter->DeepClone();
$oFilter->AddCondition($sStateAttrCode, $sStateValue, '=');
$oSet = new DBObjectSet($oFilter);
$oSet->SetShowObsoleteData($this->m_bShowObsoleteData);
$aCounts[$sStateValue] = $oSet->Count();
$aStateLabels[$sStateValue] = htmlentities($oAttDef->GetValueLabel($sStateValue), ENT_QUOTES, 'UTF-8');
$aCounts[$sStateValue] = (array_key_exists($sStateValue, $aCountsQueryResults))
? $aCountsQueryResults[$sStateValue]
: 0;
if ($aCounts[$sStateValue] == 0)
{
$aCounts[$sStateValue] = '-';
}
else
{
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.urlencode($oFilter->serialize());
$oSingleGroupByValueFilter = $this->m_oFilter->DeepClone();
$oSingleGroupByValueFilter->AddCondition($sStateAttrCode, $sStateValue, '=');
$sHyperlink = utils::GetAbsoluteUrlAppRoot()
.'pages/UI.php?operation=search&'.$oAppContext->GetForLink()
.'&filter='.urlencode($oSingleGroupByValueFilter->serialize());
$aCounts[$sStateValue] = "<a href=\"$sHyperlink\">{$aCounts[$sStateValue]}</a>";
}
}
@@ -1567,7 +1584,7 @@ class MenuBlock extends DisplayBlock
// Do not perform time consuming computations if there are too may objects in the list
$iLimit = MetaModel::GetConfig()->Get('complex_actions_limit');
if ((count($aStates) > 0) && (($iLimit == 0) || ($oSet->Count() < $iLimit)))
if ((count($aStates) > 0) && (($iLimit == 0) || ($oSet->Count($iLimit + 1) < $iLimit)))
{
// Life cycle actions may be available... if all objects are in the same state
//

View File

@@ -1,49 +1,62 @@
<?php
// Copyright (C) 2010-2016 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* File to include to initialize the datamodel in memory
*
* @copyright Copyright (C) 2010-2016 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
require_once(APPROOT.'/core/cmdbobject.class.inc.php');
require_once(APPROOT.'/application/utils.inc.php');
require_once(APPROOT.'/core/contexttag.class.inc.php');
session_name('itop-'.md5(APPROOT));
session_start();
$sSwitchEnv = utils::ReadParam('switch_env', null);
if (($sSwitchEnv != null) && (file_exists(APPCONF.$sSwitchEnv.'/'.ITOP_CONFIG_FILE)))
{
$_SESSION['itop_env'] = $sSwitchEnv;
$sEnv = $sSwitchEnv;
// TODO: reset the credentials as well ??
}
else if (isset($_SESSION['itop_env']))
{
$sEnv = $_SESSION['itop_env'];
}
else
{
$sEnv = ITOP_DEFAULT_ENV;
$_SESSION['itop_env'] = ITOP_DEFAULT_ENV;
}
$sConfigFile = APPCONF.$sEnv.'/'.ITOP_CONFIG_FILE;
MetaModel::Startup($sConfigFile, false /* $bModelOnly */, true /* $bAllowCache */, false /* $bTraceSourceFiles */, $sEnv);
<?php
// Copyright (C) 2010-2016 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* File to include to initialize the datamodel in memory
*
* @copyright Copyright (C) 2010-2016 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
require_once(APPROOT.'/core/cmdbobject.class.inc.php');
require_once(APPROOT.'/application/utils.inc.php');
require_once(APPROOT.'/core/contexttag.class.inc.php');
session_name('itop-'.md5(APPROOT));
session_start();
$sSwitchEnv = utils::ReadParam('switch_env', null);
$bAllowCache = true;
if (($sSwitchEnv != null) && (file_exists(APPCONF.$sSwitchEnv.'/'.ITOP_CONFIG_FILE)) && isset($_SESSION['itop_env']) && ($_SESSION['itop_env'] !== $sSwitchEnv))
{
$_SESSION['itop_env'] = $sSwitchEnv;
$sEnv = $sSwitchEnv;
$bAllowCache = false;
// Reset the opcache since otherwise the PHP "model" files may still be cached !!
if (function_exists('opcache_reset'))
{
// Zend opcode cache
opcache_reset();
}
if (function_exists('apc_clear_cache'))
{
// APC(u) cache
apc_clear_cache();
}
// TODO: reset the credentials as well ??
}
else if (isset($_SESSION['itop_env']))
{
$sEnv = $_SESSION['itop_env'];
}
else
{
$sEnv = ITOP_DEFAULT_ENV;
$_SESSION['itop_env'] = ITOP_DEFAULT_ENV;
}
$sConfigFile = APPCONF.$sEnv.'/'.ITOP_CONFIG_FILE;
MetaModel::Startup($sConfigFile, false /* $bModelOnly */, $bAllowCache, false /* $bTraceSourceFiles */, $sEnv);

View File

@@ -142,7 +142,12 @@ class UIExtKeyWidget
throw new Exception('Implementation: null value for allowed values definition');
}
$oAllowedValues->SetShowObsoleteData(utils::ShowObsoleteData());
if ($oAllowedValues->Count() < $iMaxComboLength)
// Don't automatically launch the search if the table is huge
$bDoSearch = !utils::IsHighCardinality($this->sTargetClass);
$sJSDoSearch = $bDoSearch ? 'true' : 'false';
// We just need to compare the number of entries with MaxComboLength, so no need to get the real count.
if ($oAllowedValues->Count($iMaxComboLength * 2) < $iMaxComboLength)
{
// Discrete list of values, use a SELECT or RADIO buttons depending on the config
switch($sDisplayStyle)
@@ -226,7 +231,7 @@ class UIExtKeyWidget
}
$oPage->add_ready_script(
<<<EOF
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', true, $sWizHelper, '{$this->sAttCode}', $sJSSearchMode);
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', true, $sWizHelper, '{$this->sAttCode}', $sJSSearchMode, $sJSDoSearch);
oACWidget_{$this->iId}.emptyHtml = "<div style=\"background: #fff; border:0; text-align:center; vertical-align:middle;\"><p>$sMessage</p></div>";
$('#$this->iId').bind('update', function() { oACWidget_{$this->iId}.Update(); } );
$('#$this->iId').bind('change', function() { $(this).trigger('extkeychange') } );
@@ -261,7 +266,7 @@ EOF
$iFieldSize = isset($aArgs['iFieldSize']) ? $aArgs['iFieldSize'] : 20; //@@@ $this->oAttDef->GetMaxSize();
// the input for the auto-complete
$sHTMLValue .= "<input class=\"field_autocomplete\" count=\"".$oAllowedValues->Count()."\" type=\"text\" id=\"label_$this->iId\" value=\"$sDisplayValue\"/>";
$sHTMLValue .= "<input class=\"field_autocomplete\" type=\"text\" id=\"label_$this->iId\" value=\"$sDisplayValue\"/>";
$sHTMLValue .= "<span class=\"field_input_btn\"><img id=\"mini_search_{$this->iId}\" style=\"border:0;vertical-align:middle;cursor:pointer;\" src=\"../images/mini_search.gif?itopversion=".ITOP_VERSION."\" onClick=\"oACWidget_{$this->iId}.Search();\"/></span>";
// another hidden input to store & pass the object's Id
@@ -271,7 +276,7 @@ EOF
// Scripts to start the autocomplete and bind some events to it
$oPage->add_ready_script(
<<<EOF
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', false, $sWizHelper, '{$this->sAttCode}', $sJSSearchMode);
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', false, $sWizHelper, '{$this->sAttCode}', $sJSSearchMode, $sJSDoSearch);
oACWidget_{$this->iId}.emptyHtml = "<div style=\"background: #fff; border:0; text-align:center; vertical-align:middle;\"><p>$sMessage</p></div>";
$('#label_$this->iId').autocomplete(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', { scroll:true, minChars:{$iMinChars}, autoFill:false, matchContains:true, mustMatch: true, keyHolder:'#{$this->iId}', extraParams:{operation:'ac_extkey', sTargetClass:'{$this->sTargetClass}',sFilter:'$sFilter',bSearchMode:$JSSearchMode, json: function() { return $sWizHelperJSON; } }});
$('#label_$this->iId').keyup(function() { if ($(this).val() == '') { $('#$this->iId').val(''); } } ); // Useful for search forms: empty value in the "label", means no value, immediatly !
@@ -338,7 +343,7 @@ EOF
$aParams = array();
$oFilter = new DBObjectSearch($this->sTargetClass);
}
$bOpen = MetaModel::GetConfig()->Get('legacy_search_drawer_open');
$bOpen = MetaModel::GetConfig()->Get('legacy_search_drawer_open') || utils::IsHighCardinality($this->sTargetClass);
$oFilter->SetModifierProperty('UserRightsGetSelectFilter', 'bSearchMode', $this->bSearchMode);
$oBlock = new DisplayBlock($oFilter, 'search', false, $aParams);
$sHTML .= $oBlock->GetDisplay($oPage, $this->iId, array('open' => $bOpen, 'currentId' => $this->iId));
@@ -408,14 +413,22 @@ EOF
$iCurrentExtKeyId = (is_null($oObj) || $this->sAttCode === '') ? 0 : $oObj->Get($this->sAttCode);
$oValuesSet = new ValueSetObjects($sFilter, 'friendlyname'); // Bypass GetName() to avoid the encoding by htmlentities
$iMax = 150;
$oValuesSet->SetLimit($iMax);
$oValuesSet->SetSort(false);
$oValuesSet->SetModifierProperty('UserRightsGetSelectFilter', 'bSearchMode', $this->bSearchMode);
$aValues = $oValuesSet->GetValues(array('this' => $oObj, 'current_extkey_id' => $iCurrentExtKeyId), $sContains);
foreach($aValues as $sKey => $sFriendlyName)
$aValuesContains = $oValuesSet->GetValues(array('this' => $oObj, 'current_extkey_id' => $iCurrentExtKeyId), $sContains, 'contains');
asort($aValuesContains);
foreach($aValuesContains as $sKey => $sFriendlyName)
{
$oP->add(trim($sFriendlyName)."\t".$sKey."\n");
if (!isset($aValuesEquals[$sKey]))
{
$oP->add(trim($sFriendlyName)."\t".$sKey."\n");
}
}
}
/**
* Get the display name of the selected object, to fill back the autocomplete
*/

View File

@@ -30,7 +30,14 @@ class UILinksWidgetDirect
protected $sInputid;
protected $sNameSuffix;
protected $sLinkedClass;
/**
* UILinksWidgetDirect constructor.
* @param string $sClass
* @param string $sAttCode
* @param string $sInputId
* @param string $sNameSuffix
*/
public function __construct($sClass, $sAttCode, $sInputId, $sNameSuffix = '')
{
$this->sClass = $sClass;
@@ -74,12 +81,12 @@ class UILinksWidgetDirect
/**
* @param WebPage $oPage
* @param DBObjectSet $oValue
* @param DBObjectSet|ormLinkSet $oValue
* @param array $aArgs
* @param $sFormPrefix
* @param $oCurrentObj
* @param string $sFormPrefix
* @param DBObject $oCurrentObj
*/
public function Display(WebPage $oPage, DBObjectSet $oValue, $aArgs = array(), $sFormPrefix, $oCurrentObj)
public function Display(WebPage $oPage, $oValue, $aArgs = array(), $sFormPrefix, $oCurrentObj)
{
$oLinksetDef = MetaModel::GetAttributeDef($this->sClass, $this->sAttCode);
switch($oLinksetDef->GetEditMode())
@@ -127,11 +134,11 @@ class UILinksWidgetDirect
* @param WebPage $oPage
* @param DBObjectSet $oValue
* @param array $aArgs
* @param $sFormPrefix
* @param $oCurrentObj
* @param $bDisplayMenu
* @param string $sFormPrefix
* @param DBObject $oCurrentObj
* @param bool $bDisplayMenu
*/
protected function DisplayAsBlock(WebPage $oPage, DBObjectSet $oValue, $aArgs = array(), $sFormPrefix, $oCurrentObj, $bDisplayMenu)
protected function DisplayAsBlock(WebPage $oPage, $oValue, $aArgs = array(), $sFormPrefix, $oCurrentObj, $bDisplayMenu)
{
$oLinksetDef = MetaModel::GetAttributeDef($this->sClass, $this->sAttCode);
$sTargetClass = $oLinksetDef->GetLinkedClass();
@@ -170,50 +177,8 @@ class UILinksWidgetDirect
/**
* @param WebPage $oPage
* @param DBObjectSet $oValue
* @param array $aArgs
* @param $sFormPrefix
* @param $oCurrentObj
* @param array $aButtons
* @param string $sProposedRealClass
*/
protected function DisplayEditInPlace(WebPage $oPage, DBObjectSet $oValue, $aArgs = array(), $sFormPrefix, $oCurrentObj, $aButtons = array('create', 'delete'))
{
$aAttribs = $this->GetTableConfig();
$oValue->Rewind();
$oPage->add('<table class="listContainer" id="'.$this->sInputid.'"><tr><td>');
$aData = array();
while($oLinkObj = $oValue->Fetch())
{
$aRow = array();
$aRow['form::select'] = '<input type="checkbox" class="selectList'.$this->sInputid.'" value="'.$oLinkObj->GetKey().'"/>';
foreach($this->aZlist as $sLinkedAttCode)
{
$aRow[$sLinkedAttCode] = $oLinkObj->GetAsHTML($sLinkedAttCode);
}
$aData[] = $aRow;
}
$oPage->table($aAttribs, $aData);
$oPage->add('</td></tr></table>'); //listcontainer
$sInputName = $sFormPrefix.'attr_'.$this->sAttCode;
$aLabels = array(
'delete' => Dict::S('UI:Button:Delete'),
// 'modify' => 'Modify...' ,
'creation_title' => Dict::Format('UI:CreationTitle_Class', MetaModel::GetName($this->sLinkedClass)),
'create' => Dict::Format('UI:ClickToCreateNew', MetaModel::GetName($this->sLinkedClass)),
'remove' => Dict::S('UI:Button:Remove'),
'add' => Dict::Format('UI:AddAnExisting_Class', MetaModel::GetName($this->sLinkedClass)),
'selection_title' => Dict::Format('UI:SelectionOf_Class', MetaModel::GetName($this->sLinkedClass)),
);
$oContext = new ApplicationContext();
$sSubmitUrl = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php?'.$oContext->GetForLink();
$sJSONLabels = json_encode($aLabels);
$sJSONButtons = json_encode($aButtons);
$sWizHelper = 'oWizardHelper'.$sFormPrefix;
$oPage->add_ready_script("$('#{$this->sInputid}').directlinks({class_name: '$this->sClass', att_code: '$this->sAttCode', input_name:'$sInputName', labels: $sJSONLabels, submit_to: '$sSubmitUrl', buttons: $sJSONButtons, oWizardHelper: $sWizHelper });");
}
public function GetObjectCreationDlg(WebPage $oPage, $sProposedRealClass = '')
{
// For security reasons: check that the "proposed" class is actually a subclass of the linked class
@@ -239,14 +204,14 @@ class UILinksWidgetDirect
$aKeys = array_keys($aPossibleClasses);
$sRealClass = $aKeys[0];
}
if ($sRealClass != '')
{
$oPage->add("<h1>".MetaModel::GetClassIcon($sRealClass)."&nbsp;".Dict::Format('UI:CreationTitle_Class', MetaModel::GetName($sRealClass))."</h1>\n");
$oLinksetDef = MetaModel::GetAttributeDef($this->sClass, $this->sAttCode);
$sExtKeyToMe = $oLinksetDef->GetExtKeyToMe();
$aFieldFlags = array( $sExtKeyToMe => OPT_ATT_HIDDEN);
cmdbAbstractObject::DisplayCreationForm($oPage, $sRealClass, null, array(), array('formPrefix' => $this->sInputid, 'noRelations' => true, 'fieldsFlags' => $aFieldFlags));
cmdbAbstractObject::DisplayCreationForm($oPage, $sRealClass, null, array(), array('formPrefix' => $this->sInputid, 'noRelations' => true, 'fieldsFlags' => $aFieldFlags));
}
else
{
@@ -263,7 +228,61 @@ class UILinksWidgetDirect
}
$oPage->add('</div></div>');
}
/**
* @param WebPage $oPage
* @param DBObjectSet $oValue
* @param array $aArgs
* @param string $sFormPrefix
* @param DBObject $oCurrentObj
* @param array $aButtons
*/
protected function DisplayEditInPlace(WebPage $oPage, $oValue, $aArgs = array(), $sFormPrefix, $oCurrentObj, $aButtons = array('create', 'delete'))
{
$aAttribs = $this->GetTableConfig();
$oValue->Rewind();
$oPage->add('<table class="listContainer" id="'.$this->sInputid.'"><tr><td>');
$aData = array();
while($oLinkObj = $oValue->Fetch())
{
$aRow = array();
$aRow['form::select'] = '<input type="checkbox" class="selectList'.$this->sInputid.'" value="'.$oLinkObj->GetKey().'"/>';
foreach($this->aZlist as $sLinkedAttCode)
{
$aRow[$sLinkedAttCode] = $oLinkObj->GetAsHTML($sLinkedAttCode);
}
$aData[] = $aRow;
}
$oPage->table($aAttribs, $aData);
$oPage->add('</td></tr></table>'); //listcontainer
$sInputName = $sFormPrefix.'attr_'.$this->sAttCode;
$aLabels = array(
'delete' => Dict::S('UI:Button:Delete'),
// 'modify' => 'Modify...' ,
'creation_title' => Dict::Format('UI:CreationTitle_Class', MetaModel::GetName($this->sLinkedClass)),
'create' => Dict::Format('UI:ClickToCreateNew', MetaModel::GetName($this->sLinkedClass)),
'remove' => Dict::S('UI:Button:Remove'),
'add' => Dict::Format('UI:AddAnExisting_Class', MetaModel::GetName($this->sLinkedClass)),
'selection_title' => Dict::Format('UI:SelectionOf_Class', MetaModel::GetName($this->sLinkedClass)),
);
$oContext = new ApplicationContext();
$sSubmitUrl = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php?'.$oContext->GetForLink();
$sJSONLabels = json_encode($aLabels);
$sJSONButtons = json_encode($aButtons);
$sWizHelper = 'oWizardHelper'.$sFormPrefix;
// Don't automatically launch the search if the table is huge
$bDoSearch = !utils::IsHighCardinality($this->sLinkedClass);
$sJSDoSearch = $bDoSearch ? 'true' : 'false';
$oPage->add_ready_script("$('#{$this->sInputid}').directlinks({class_name: '$this->sClass', att_code: '$this->sAttCode', input_name:'$sInputName', labels: $sJSONLabels, submit_to: '$sSubmitUrl', buttons: $sJSONButtons, oWizardHelper: $sWizHelper, do_search: $sJSDoSearch});");
}
/**
* @param WebPage $oPage
* @param DBObject $oCurrentObj
* @throws Exception
*/
public function GetObjectsSelectionDlg($oPage, $oCurrentObj)
{
$sHtml = "<div class=\"wizContainer\" style=\"vertical-align:top;\">\n";
@@ -286,7 +305,7 @@ class UILinksWidgetDirect
{
$this->SetSearchDefaultFromContext($oCurrentObj, $oFilter);
}
$bOpen = MetaModel::GetConfig()->Get('legacy_search_drawer_open');
$bOpen = MetaModel::GetConfig()->Get('legacy_search_drawer_open') || utils::IsHighCardinality($this->sLinkedClass);
$oBlock = new DisplayBlock($oFilter, 'search', false);
$sHtml .= $oBlock->GetDisplay($oPage, "SearchFormToAdd_{$this->sInputid}", array('open' => $bOpen));
$sHtml .= "<form id=\"ObjectsAddForm_{$this->sInputid}\">\n";
@@ -299,13 +318,14 @@ class UILinksWidgetDirect
$sHtml .= "</form>\n";
$oPage->add($sHtml);
}
/**
* Search for objects to be linked to the current object (i.e "remote" objects)
* @param WebPage $oP The page used for the output (usually an AjaxWebPage)
* @param string $sRemoteClass Name of the "remote" class to perform the search on, must be a derived class of $this->sLinkedClass
* @param array $aAlreadyLinked Array of indentifiers of objects which are already linke to the current object (or about to be linked)
* @param DBObject $oCurrentObj The object currently being edited... if known...
* @throws Exception
*/
public function SearchObjectsToAdd(WebPage $oP, $sRemoteClass = '', $aAlreadyLinked = array(), $oCurrentObj = null)
{
@@ -350,6 +370,10 @@ class UILinksWidgetDirect
$oBlock->Display($oP, "ResultsToAdd_{$this->sInputid}", array('menu' => false, 'cssCount'=> '#count_'.$this->sInputid , 'selection_mode' => true, 'table_id' => 'add_'.$this->sInputid)); // Don't display the 'Actions' menu on the results
}
/**
* @param WebPage $oP
* @param $oFullSetFilter
*/
public function DoAddObjects(WebPage $oP, $oFullSetFilter)
{
$aLinkedObjectIds = utils::ReadMultipleSelection($oFullSetFilter);
@@ -377,7 +401,14 @@ class UILinksWidgetDirect
}
return $aAttribs;
}
/**
* @param WebPage $oPage
* @param string $sRealClass
* @param array $aValues
* @param int $iTempId
* @return mixed
*/
public function GetRow($oPage, $sRealClass, $aValues, $iTempId)
{
if ($sRealClass == '')
@@ -389,7 +420,13 @@ class UILinksWidgetDirect
return $this->GetObjectRow($oPage, $oLinkObj, $iTempId);
}
/**
* @param WebPage $oPage
* @param $oLinkObj
* @param int $iTempId
* @return mixed
*/
protected function GetObjectRow($oPage, $oLinkObj, $iTempId)
{
$aAttribs = $this->GetTableConfig();
@@ -405,7 +442,7 @@ class UILinksWidgetDirect
/**
* Initializes the default search parameters based on 1) a 'current' object and 2) the silos defined by the context
* @param DBObject $oSourceObj
* @param DBSearch $oSearch
* @param DBSearch|DBObjectSearch $oSearch
*/
protected function SetSearchDefaultFromContext($oSourceObj, &$oSearch)
{
@@ -424,7 +461,6 @@ class UILinksWidgetDirect
if (MetaModel::IsValidAttCode($sSrcClass, $sAttCode))
{
$oAttDef = MetaModel::GetAttributeDef($sSrcClass, $sAttCode);
$defaultValue = $oSourceObj->Get($sAttCode);
// Find the attcode for the same 'context' parameter in the destination class

View File

@@ -39,7 +39,15 @@ class UILinksWidget
protected $m_sLinkedClass;
protected $m_sRemoteClass;
protected $m_bDuplicatesAllowed;
/**
* UILinksWidget constructor.
* @param string $sClass
* @param string $sAttCode
* @param int $iInputId
* @param string $sNameSuffix
* @param bool $bDuplicatesAllowed
*/
public function __construct($sClass, $sAttCode, $iInputId, $sNameSuffix = '', $bDuplicatesAllowed = false)
{
$this->m_sClass = $sClass;
@@ -98,11 +106,11 @@ class UILinksWidget
* @param WebPage $oP Web page used for the ouput
* @param DBObject $oLinkedObj Remote object
* @param mixed $linkObjOrId Either the object linked or a unique number for new link records to add
* @param array|Hash $aArgs Extra context arguments
* @param $oCurrentObj The object to which all the elements of the linked set refer to
* @param $iUniqueId A unique identifier of new links
* @param boolean $bReadOnly Display link as editable or read-only. Default is false (editable)
* @return string The HTML fragment of the one-row form
* @param array $aArgs Extra context arguments
* @param DBObject $oCurrentObj The object to which all the elements of the linked set refer to
* @param int $iUniqueId A unique identifier of new links
* @param boolean $bReadOnly Display link as editable or read-only. Default is false (editable)
* @return array The HTML fragment of the one-row form
*/
protected function GetFormRow(WebPage $oP, DBObject $oLinkedObj, $linkObjOrId, $aArgs, $oCurrentObj, $iUniqueId, $bReadOnly = false)
{
@@ -229,7 +237,11 @@ EOF
/**
* Display one row of the whole form
* @return none
* @param WebPage $oP
* @param array $aConfig
* @param array $aRow
* @param int $iRowId
* @return string
*/
protected function DisplayFormRow(WebPage $oP, $aConfig, $aRow, $iRowId)
{
@@ -247,8 +259,8 @@ EOF
/**
* Display the table with the form for editing all the links at once
* @param WebPage $oP The web page used for the output
* @param Hash $aConfig The table's header configuration
* @param Hash $aData The tabular data to be displayed
* @param array $aConfig The table's header configuration
* @param array $aData The tabular data to be displayed
* @return string Html fragment representing the form table
*/
protected function DisplayFormTable(WebPage $oP, $aConfig, $aData)
@@ -285,21 +297,20 @@ EOF
return $sHtml;
}
/**
* Get the HTML fragment corresponding to the linkset editing widget
* @param WebPage $oP The web page used for all the output
* @param DBObjectSet The initial value of the linked set
* @param Hash $aArgs Extra context arguments
* @param WebPage $oPage
* @param DBObject|ormLinkSet $oValue
* @param array $aArgs Extra context arguments
* @param string $sFormPrefix prefix of the fields in the current form
* @param DBObject $oCurrentObj the current object to which the linkset is related
* @return string The HTML fragment to be inserted into the page
*/
public function Display(WebPage $oPage, DBObjectSet $oValue, $aArgs = array(), $sFormPrefix, $oCurrentObj)
public function Display(WebPage $oPage, $oValue, $aArgs = array(), $sFormPrefix, $oCurrentObj)
{
$sHtmlValue = '';
$sTargetClass = self::GetTargetClass($this->m_sClass, $this->m_sAttCode);
$sHtmlValue .= "<div id=\"linkedset_{$this->m_sAttCode}{$this->m_sNameSuffix}\">\n";
$sHtmlValue .= "<input type=\"hidden\" id=\"{$sFormPrefix}{$this->m_iInputId}\">\n";
$oValue->Rewind();
@@ -333,9 +344,12 @@ EOF
}
$sHtmlValue .= $this->DisplayFormTable($oPage, $this->m_aTableConfig, $aForm);
$sDuplicates = ($this->m_bDuplicatesAllowed) ? 'true' : 'false';
// Don't automatically launch the search if the table is huge
$bDoSearch = !utils::IsHighCardinality($this->m_sRemoteClass);
$sJSDoSearch = $bDoSearch ? 'true' : 'false';
$sWizHelper = 'oWizardHelper'.$sFormPrefix;
$oPage->add_ready_script(<<<EOF
oWidget{$this->m_iInputId} = new LinksWidget('{$this->m_sAttCode}{$this->m_sNameSuffix}', '{$this->m_sClass}', '{$this->m_sAttCode}', '{$this->m_iInputId}', '{$this->m_sNameSuffix}', $sDuplicates, $sWizHelper, '{$this->m_sExtKeyToRemote}');
oWidget{$this->m_iInputId} = new LinksWidget('{$this->m_sAttCode}{$this->m_sNameSuffix}', '{$this->m_sClass}', '{$this->m_sAttCode}', '{$this->m_iInputId}', '{$this->m_sNameSuffix}', $sDuplicates, $sWizHelper, '{$this->m_sExtKeyToRemote}', $sJSDoSearch);
oWidget{$this->m_iInputId}.Init();
EOF
);
@@ -346,11 +360,17 @@ EOF
$oPage->add_at_the_end("<div id=\"dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}\"></div>"); // To prevent adding forms inside the main form
return $sHtmlValue;
}
/**
* @param string $sClass
* @param string $sAttCode
* @return string
*/
protected static function GetTargetClass($sClass, $sAttCode)
{
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
$sLinkedClass = $oAttDef->GetLinkedClass();
$sTargetClass = '';
switch(get_class($oAttDef))
{
case 'AttributeLinkedSetIndirect':
@@ -365,10 +385,14 @@ EOF
return $sTargetClass;
}
/**
* @param WebPage $oPage
* @param DBObject $oCurrentObj
*/
public function GetObjectPickerDialog($oPage, $oCurrentObj)
{
$bOpen = MetaModel::GetConfig()->Get('legacy_search_drawer_open');
$bOpen = MetaModel::GetConfig()->Get('legacy_search_drawer_open') || utils::IsHighCardinality($this->m_sRemoteClass);
$sHtml = "<div class=\"wizContainer\" style=\"vertical-align:top;\">\n";
$oFilter = new DBObjectSearch($this->m_sRemoteClass);
$this->SetSearchDefaultFromContext($oCurrentObj, $oFilter);
@@ -414,7 +438,13 @@ EOF
$oBlock = new DisplayBlock($oFilter, 'list', false);
$oBlock->Display($oP, "ResultsToAdd_{$this->m_sAttCode}", array('menu' => false, 'cssCount'=> '#count_'.$this->m_sAttCode.$this->m_sNameSuffix , 'selection_mode' => true, 'table_id' => 'add_'.$this->m_sAttCode)); // Don't display the 'Actions' menu on the results
}
/**
* @param WebPage $oP
* @param int $iMaxAddedId
* @param $oFullSetFilter
* @param DBObject $oCurrentObj
*/
public function DoAddObjects(WebPage $oP, $iMaxAddedId, $oFullSetFilter, $oCurrentObj)
{
$aLinkedObjectIds = utils::ReadMultipleSelection($oFullSetFilter);
@@ -439,7 +469,7 @@ EOF
/**
* Initializes the default search parameters based on 1) a 'current' object and 2) the silos defined by the context
* @param DBObject $oSourceObj
* @param DBSearch $oSearch
* @param DBSearch|DBObjectSearch $oSearch
*/
protected function SetSearchDefaultFromContext($oSourceObj, &$oSearch)
{
@@ -458,7 +488,6 @@ EOF
if (MetaModel::IsValidAttCode($sSrcClass, $sAttCode))
{
$oAttDef = MetaModel::GetAttributeDef($sSrcClass, $sAttCode);
$defaultValue = $oSourceObj->Get($sAttCode);
// Find the attcode for the same 'context' parameter in the destination class

View File

@@ -1840,4 +1840,17 @@ class utils
}
return $aCleanHeaders;
}
/**
* Check if the given class if configured as a high cardinality class.
*
* @param $sClass
*
* @return bool
*/
public static function IsHighCardinality($sClass)
{
$aHugeClasses = MetaModel::GetConfig()->Get('high_cardinality_classes');
return in_array($sClass, $aHugeClasses);
}
}

View File

@@ -55,59 +55,11 @@ class WizardHelper
if ( ($sAttCode !='id') && ($value !== '$$NULL$$'))
{
$oAttDef = MetaModel::GetAttributeDef($this->m_aData['m_sClass'], $sAttCode);
if (($oAttDef->IsLinkSet()) && ($value != '') )
if ($oAttDef->IsLinkSet())
{
// special handling for lists
// assumes this is handled as an array of objects
// thus encoded in json like: [ { name:'link1', 'id': 123}, { name:'link2', 'id': 124}...]
$aData = json_decode($value, true); // true means decode as a hash array (not an object)
// Check what are the meaningful attributes
$aFields = $this->GetLinkedWizardStructure($oAttDef);
$sLinkedClass = $oAttDef->GetLinkedClass();
$aLinkedObjectsArray = array();
if (!is_array($aData))
{
echo ("aData: '$aData' (value: '$value')\n");
}
foreach($aData as $aLinkedObject)
{
$oLinkedObj = MetaModel::NewObject($sLinkedClass);
foreach($aFields as $sLinkedAttCode)
{
if ( isset($aLinkedObject[$sLinkedAttCode]) && ($aLinkedObject[$sLinkedAttCode] !== null) )
{
$sLinkedAttDef = MetaModel::GetAttributeDef($sLinkedClass, $sLinkedAttCode);
if (($sLinkedAttDef->IsExternalKey()) && ($aLinkedObject[$sLinkedAttCode] != '') && ($aLinkedObject[$sLinkedAttCode] > 0) )
{
// For external keys: load the target object so that external fields
// get filled too
$oTargetObj = MetaModel::GetObject($sLinkedAttDef->GetTargetClass(), $aLinkedObject[$sLinkedAttCode]);
$oLinkedObj->Set($sLinkedAttCode, $oTargetObj);
}
elseif($sLinkedAttDef instanceof AttributeDateTime)
{
$sDate = $aLinkedObject[$sLinkedAttCode];
if($sDate !== null && $sDate !== '')
{
$oDateTimeFormat = AttributeDateTime::GetFormat();
$oDate = $oDateTimeFormat->Parse($sDate);
$sDate = $oDate->format('Y-m-d H:i:s');
}
$oLinkedObj->Set($sLinkedAttCode, $sDate);
}
else
{
$oLinkedObj->Set($sLinkedAttCode, $aLinkedObject[$sLinkedAttCode]);
}
}
}
$aLinkedObjectsArray[] = $oLinkedObj;
}
$oSet = DBObjectSet::FromArray($sLinkedClass, $aLinkedObjectsArray);
$oObj->Set($sAttCode, $oSet);
}
else if ( $oAttDef->GetEditClass() == 'Document' )
continue;
}
else if ($oAttDef->GetEditClass() == 'Document' )
{
if ($bReadUploadedFiles)
{

10
composer.json Normal file
View File

@@ -0,0 +1,10 @@
{
"require": {
"php": ">=5.3.6 <7.2.0"
},
"config": {
"platform": {
"php": "5.3.6"
}
}
}

View File

@@ -1342,6 +1342,29 @@ class AttributeLinkedSet extends AttributeDefinition
return $oSet;
}
/**
* @param $proposedValue
* @param $oHostObj
*
* @return mixed
*/
public function MakeRealValue($proposedValue, $oHostObj){
if($proposedValue === null)
{
$sLinkedClass = $this->GetLinkedClass();
$aLinkedObjectsArray = array();
$oSet = DBObjectSet::FromArray($sLinkedClass, $aLinkedObjectsArray);
return new ormLinkSet(
get_class($oHostObj),
$this->GetCode(),
$oSet
);
}
return $proposedValue;
}
/**
* @param ormLinkSet $val1
* @param ormLinkSet $val2

View File

@@ -970,6 +970,22 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'optimize_requests_for_join_count' => array(
'type' => 'bool',
'description' => 'Optimize request joins to minimize the count (default is true, try to set it to false in case of performance issues)',
'default' => true,
'value' => true,
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'high_cardinality_classes' => array(
'type' => 'array',
'description' => 'List of classes with high cardinality (force auto-complete mode)',
'default' => array(),
'value' => array(),
'source_of_value' => '',
'show_in_conf_sample' => true,
),
);
public function IsProperty($sPropCode)

View File

@@ -2930,7 +2930,7 @@ abstract class DBObject implements iDisplay
$oSearch->AllowAllData();
}
$oSet = new CMDBObjectSet($oSearch);
if ($oSet->Count() > 0)
if ($oSet->Count(1) > 0)
{
$aDependentObjects[$sRemoteClass][$sExtKeyAttCode] = array(
'attribute' => $oExtKeyAttDef,

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (c) 2010-2017 Combodo SARL
// Copyright (c) 2010-2018 Combodo SARL
//
// This file is part of iTop.
//
@@ -357,10 +357,19 @@ class DBObjectSearch extends DBSearch
$this->AddConditionExpression($oNewCondition);
}
public function AddCondition($sFilterCode, $value, $sOpCode = null, $bParseSeachString = false)
/**
* @param string $sFilterCode
* @param mixed $value
* @param string $sOpCode operator to use : 'IN', 'NOT IN', 'Contains',' Begins with', 'Finishes with', ...
* @param bool $bParseSearchString
*
* @throws \CoreException
*
* @see AddConditionForInOperatorUsingParam for IN/NOT IN queries with lots of params
*/
public function AddCondition($sFilterCode, $value, $sOpCode = null, $bParseSearchString = false)
{
MyHelpers::CheckKeyInArray('filter code in class: '.$this->GetClass(), $sFilterCode, MetaModel::GetClassFilterDefs($this->GetClass()));
$oFilterDef = MetaModel::GetClassFilterDef($this->GetClass(), $sFilterCode);
$oField = new FieldExpression($sFilterCode, $this->GetClassAlias());
if (empty($sOpCode))
@@ -372,13 +381,13 @@ class DBObjectSearch extends DBSearch
else
{
$oAttDef = MetaModel::GetAttributeDef($this->GetClass(), $sFilterCode);
$oNewCondition = $oAttDef->GetSmartConditionExpression($value, $oField, $this->m_aParams, $bParseSeachString);
$oNewCondition = $oAttDef->GetSmartConditionExpression($value, $oField, $this->m_aParams, $bParseSearchString);
$this->AddConditionExpression($oNewCondition);
return;
}
}
// Parse search strings if needed and if the filter code corresponds to a valid attcode
if($bParseSeachString && MetaModel::IsValidAttCode($this->GetClass(), $sFilterCode))
if($bParseSearchString && MetaModel::IsValidAttCode($this->GetClass(), $sFilterCode))
{
$oAttDef = MetaModel::GetAttributeDef($this->GetClass(), $sFilterCode);
$value = $oAttDef->ParseSearchString($value);
@@ -398,14 +407,14 @@ class DBObjectSearch extends DBSearch
throw new CoreException('Deprecated operator, please consider using OQL (SQL) expressions like "(TO_DAYS(NOW()) - TO_DAYS(x)) AS AgeDays"', array('operator' => $sOpCode));
break;
case "IN":
case 'IN':
if (!is_array($value)) $value = array($value);
if (count($value) === 0) throw new Exception('AddCondition '.$sOpCode.': Value cannot be an empty array.');
$sListExpr = '('.implode(', ', CMDBSource::Quote($value)).')';
$sOQLCondition = $oField->Render()." IN $sListExpr";
break;
case "NOTIN":
case 'NOTIN':
if (!is_array($value)) $value = array($value);
if (count($value) === 0) throw new Exception('AddCondition '.$sOpCode.': Value cannot be an empty array.');
$sListExpr = '('.implode(', ', CMDBSource::Quote($value)).')';
@@ -459,6 +468,8 @@ class DBObjectSearch extends DBSearch
break;
case "IN":
case "NOTIN":
// this will parse all of the values... Can take forever if there are lots of them !
// In this case using a parameter is far better : WHERE ... IN (:my_param)
$oNewCondition = Expression::FromOQL($sOQLCondition);
break;
@@ -473,6 +484,44 @@ class DBObjectSearch extends DBSearch
$this->AddConditionExpression($oNewCondition);
}
/**
* @param string $sFilterCode attribute code to use
* @param array $aValues
* @param bool $bPositiveMatch if true will add a IN filter, else a NOT IN
*
* @throws \CoreException
*/
public function AddConditionForInOperatorUsingParam($sFilterCode, $aValues, $bPositiveMatch = true)
{
$oFieldExpression = new FieldExpression($sFilterCode, $this->GetClassAlias());
$sOperator = $bPositiveMatch ? 'IN' : 'NOT IN';
$sInParamName = $this->GenerateUniqueParamName();
$oParamExpression = new VariableExpression($sInParamName);
$this->SetInternalParams(array($sInParamName => $aValues));
$oListExpression = new ListExpression(array($oParamExpression));
$oInCondition = new BinaryExpression($oFieldExpression, $sOperator, $oListExpression);
$this->AddConditionExpression($oInCondition);
}
/**
* @return string a unique param name
*/
private function GenerateUniqueParamName() {
$iExistingParamsNb = count($this->m_aParams);
$iCurrentArrayParamNb = $iExistingParamsNb + 1;
$sParamName = 'param'.$iCurrentArrayParamNb;
if (isset($this->m_aParams[$sParamName])) {
$sParamName .= '_'.microtime(true) . '_' .rand(0,100);
}
return $sParamName;
}
/**
* Specify a condition on external keys or link sets
* @param sAttSpec Can be either an attribute code or extkey->[sAttSpec] or linkset->[sAttSpec] and so on, recursively
@@ -1822,46 +1871,86 @@ class DBObjectSearch extends DBSearch
}
}
// First query built from the root, adding all tables including the leaf
// Before N.1065 we were joining from the leaf first, but this wasn't a good choice :
// most of the time (obsolescence, friendlyname, ...) we want to get a root attribute !
//
$oSelectBase = null;
$aClassHierarchy = MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL, true);
$bIsClassStandaloneClass = (count($aClassHierarchy) == 1);
foreach($aClassHierarchy as $sSomeClass)
$bRootFirst = MetaModel::GetConfig()->Get('optimize_requests_for_join_count');
if ($bRootFirst)
{
if (!MetaModel::HasTable($sSomeClass))
// First query built from the root, adding all tables including the leaf
// Before N.1065 we were joining from the leaf first, but this wasn't a good choice :
// most of the time (obsolescence, friendlyname, ...) we want to get a root attribute !
//
$oSelectBase = null;
$aClassHierarchy = MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL, true);
$bIsClassStandaloneClass = (count($aClassHierarchy) == 1);
foreach($aClassHierarchy as $sSomeClass)
{
continue;
}
self::DbgTrace("Adding join from root to leaf: $sSomeClass... let's call MakeSQLObjectQuerySingleTable()");
$oSelectParentTable = $this->MakeSQLObjectQuerySingleTable($oBuild, $aAttToLoad, $sSomeClass, $aExtKeys, $aValues);
if (is_null($oSelectBase))
{
$oSelectBase = $oSelectParentTable;
if (!$bIsClassStandaloneClass && (MetaModel::IsRootClass($sSomeClass)))
if (!MetaModel::HasTable($sSomeClass))
{
// As we're linking to root class first, we're adding a where clause on the finalClass attribute :
// COALESCE($sRootClassFinalClass IN ('$sExpectedClasses'), 1)
// If we don't, the child classes can be removed in the query optimisation phase, including the leaf that was queried
// So we still need to filter records to only those corresponding to the child classes !
// The coalesce is mandatory if we have a polymorphic query (left join)
$oClassListExpr = ListExpression::FromScalars(MetaModel::EnumChildClasses($sClass, ENUM_CHILD_CLASSES_ALL));
$sFinalClassSqlColumnName = MetaModel::DBGetClassField($sSomeClass);
$oClassExpr = new FieldExpression($sFinalClassSqlColumnName, $oSelectBase->GetTableAlias());
$oInExpression = new BinaryExpression($oClassExpr, 'IN', $oClassListExpr);
$oTrueExpression = new TrueExpression();
$aCoalesceAttr = array($oInExpression, $oTrueExpression);
$oFinalClassRestriction = new FunctionExpression("COALESCE", $aCoalesceAttr);
$oBuild->m_oQBExpressions->AddCondition($oFinalClassRestriction);
continue;
}
self::DbgTrace("Adding join from root to leaf: $sSomeClass... let's call MakeSQLObjectQuerySingleTable()");
$oSelectParentTable = $this->MakeSQLObjectQuerySingleTable($oBuild, $aAttToLoad, $sSomeClass, $aExtKeys, $aValues);
if (is_null($oSelectBase))
{
$oSelectBase = $oSelectParentTable;
if (!$bIsClassStandaloneClass && (MetaModel::IsRootClass($sSomeClass)))
{
// As we're linking to root class first, we're adding a where clause on the finalClass attribute :
// COALESCE($sRootClassFinalClass IN ('$sExpectedClasses'), 1)
// If we don't, the child classes can be removed in the query optimisation phase, including the leaf that was queried
// So we still need to filter records to only those corresponding to the child classes !
// The coalesce is mandatory if we have a polymorphic query (left join)
$oClassListExpr = ListExpression::FromScalars(MetaModel::EnumChildClasses($sClass, ENUM_CHILD_CLASSES_ALL));
$sFinalClassSqlColumnName = MetaModel::DBGetClassField($sSomeClass);
$oClassExpr = new FieldExpression($sFinalClassSqlColumnName, $oSelectBase->GetTableAlias());
$oInExpression = new BinaryExpression($oClassExpr, 'IN', $oClassListExpr);
$oTrueExpression = new TrueExpression();
$aCoalesceAttr = array($oInExpression, $oTrueExpression);
$oFinalClassRestriction = new FunctionExpression("COALESCE", $aCoalesceAttr);
$oBuild->m_oQBExpressions->AddCondition($oFinalClassRestriction);
}
}
else
{
$oSelectBase->AddInnerJoin($oSelectParentTable, $sKeyField, MetaModel::DBGetKey($sSomeClass));
}
}
}
else
{
// First query built upon on the leaf (ie current) class
//
self::DbgTrace("Main (=leaf) class, call MakeSQLObjectQuerySingleTable()");
if (MetaModel::HasTable($sClass))
{
$oSelectBase = $this->MakeSQLObjectQuerySingleTable($oBuild, $aAttToLoad, $sClass, $aExtKeys, $aValues);
}
else
{
$oSelectBase->AddInnerJoin($oSelectParentTable, $sKeyField, MetaModel::DBGetKey($sSomeClass));
$oSelectBase = null;
// As the join will not filter on the expected classes, we have to specify it explicitely
$sExpectedClasses = implode("', '", MetaModel::EnumChildClasses($sClass, ENUM_CHILD_CLASSES_ALL));
$oFinalClassRestriction = Expression::FromOQL("`$sClassAlias`.finalclass IN ('$sExpectedClasses')");
$oBuild->m_oQBExpressions->AddCondition($oFinalClassRestriction);
}
// Then we join the queries of the eventual parent classes (compound model)
foreach(MetaModel::EnumParentClasses($sClass) as $sParentClass)
{
if (!MetaModel::HasTable($sParentClass)) continue;
self::DbgTrace("Parent class: $sParentClass... let's call MakeSQLObjectQuerySingleTable()");
$oSelectParentTable = $this->MakeSQLObjectQuerySingleTable($oBuild, $aAttToLoad, $sParentClass, $aExtKeys, $aValues);
if (is_null($oSelectBase))
{
$oSelectBase = $oSelectParentTable;
}
else
{
$oSelectBase->AddInnerJoin($oSelectParentTable, $sKeyField, MetaModel::DBGetKey($sParentClass));
}
}
}

View File

@@ -77,18 +77,20 @@ class DBObjectSet implements iDBObjectSetIterator
* @var mysqli_result
*/
protected $m_oSQLResult;
protected $m_bSort;
/**
* Create a new set based on a Search definition.
*
*
* @param DBSearch $oFilter The search filter defining the objects which are part of the set (multiple columns/objects per row are supported)
* @param hash $aOrderBy Array of '[<classalias>.]attcode' => bAscending
* @param hash $aArgs Values to substitute for the search/query parameters (if any). Format: param_name => value
* @param array $aOrderBy Array of '[<classalias>.]attcode' => bAscending
* @param array $aArgs Values to substitute for the search/query parameters (if any). Format: param_name => value
* @param hash $aExtendedDataSpec
* @param int $iLimitCount Maximum number of rows to load (i.e. equivalent to MySQL's LIMIT start, count)
* @param int $iLimitStart Index of the first row to load (i.e. equivalent to MySQL's LIMIT start, count)
* @param bool $bSort if false no order by is done
*/
public function __construct(DBSearch $oFilter, $aOrderBy = array(), $aArgs = array(), $aExtendedDataSpec = null, $iLimitCount = 0, $iLimitStart = 0)
public function __construct(DBSearch $oFilter, $aOrderBy = array(), $aArgs = array(), $aExtendedDataSpec = null, $iLimitCount = 0, $iLimitStart = 0, $bSort = true)
{
$this->m_oFilter = $oFilter->DeepClone();
$this->m_aAddedIds = array();
@@ -98,6 +100,7 @@ class DBObjectSet implements iDBObjectSetIterator
$this->m_aExtendedDataSpec = $aExtendedDataSpec;
$this->m_iLimitCount = $iLimitCount;
$this->m_iLimitStart = $iLimitStart;
$this->m_bSort = $bSort;
$this->m_iNumTotalDBRows = null;
$this->m_iNumLoadedDBRows = 0;
@@ -601,10 +604,15 @@ class DBObjectSet implements iDBObjectSetIterator
*
* Limitation: the sort order has no effect on objects added in-memory
*
* @return hash Format: field_code => boolean (true = ascending, false = descending)
* @return array Format: field_code => boolean (true = ascending, false = descending)
*/
public function GetRealSortOrder()
{
if (!$this->m_bSort)
{
// No order by
return array();
}
// Get the class default sort order if not specified with the API
//
if (empty($this->m_aOrderBy))
@@ -702,13 +710,19 @@ class DBObjectSet implements iDBObjectSetIterator
* May actually perform the SQL query SELECT COUNT... if the set was not previously loaded, or loaded with a
* SetLimit
*
* @param int $iLimit used for autocomplete: the count is only used to know if the number of entries exceed
* a certain amount or not
*
* @return int The total number of rows for this set.
* @throws \CoreException
* @throws \MissingQueryArgument
* @throws \MySQLException
*/
public function Count()
public function Count($iLimit = 0)
{
if (is_null($this->m_iNumTotalDBRows))
{
$sSQL = $this->m_oFilter->MakeSelectQuery(array(), $this->m_aArgs, null, null, 0, 0, true);
$sSQL = $this->m_oFilter->MakeSelectQuery(array(), $this->m_aArgs, null, null, $iLimit, 0, true);
$resQuery = CMDBSource::Query($sSQL);
if (!$resQuery) return 0;

View File

@@ -1270,6 +1270,7 @@ class DisplayableGraph extends SimpleGraph
$oPdf->SetAutoPageBreak(true, $fBreakMargin);
$oPdf->SetAlpha(1);
$oPdf->SetTextColor(0, 0, 0);
}
/**

View File

@@ -422,13 +422,13 @@ abstract class MetaModel
}
/**
* Returns the friendly name IIF it is equivalent to a single attribute
*/
* Returns the friendly name IIF it is equivalent to a single attribute
*/
final static public function GetFriendlyNameAttributeCode($sClass)
{
$aNameSpec = self::GetNameSpec($sClass);
$sFormat = trim($aNameSpec[0]);
$aAttributes = $aNameSpec[1];
$aAttributes = $aNameSpec[1];
if (($sFormat != '') && ($sFormat != '%1$s'))
{
return null;
@@ -440,6 +440,20 @@ abstract class MetaModel
return reset($aAttributes);
}
/**
* Returns the list of attributes composing the friendlyname
*
* @param $sClass
*
* @return array
*/
final static public function GetFriendlyNameAttributeCodeList($sClass)
{
$aNameSpec = self::GetNameSpec($sClass);
$aAttributes = $aNameSpec[1];
return $aAttributes;
}
final static public function GetStateAttributeCode($sClass)
{
self::_check_subclass($sClass);
@@ -3806,6 +3820,7 @@ abstract class MetaModel
//
$aTableInfo = CMDBSource::GetTableInfo($sTable);
$aTableInfo['Fields'][$sKeyField]['used'] = true;
$aFriendlynameAttcodes = self::GetFriendlyNameAttributeCodeList($sClass);
foreach(self::ListAttributeDefs($sClass) as $sAttCode=>$oAttDef)
{
if (!$oAttDef->CopyOnAllTables())
@@ -3819,6 +3834,14 @@ abstract class MetaModel
$aTableInfo['Fields'][$sField]['used'] = true;
$bIndexNeeded = $oAttDef->RequiresIndex();
if (!$bIndexNeeded)
{
// Add an index on the columns of the friendlyname
if (in_array($sField, $aFriendlynameAttcodes))
{
$bIndexNeeded = true;
}
}
$sFieldDefinition = "`$sField` $sDBFieldSpec";
if (!CMDBSource::IsField($sTable, $sField))
@@ -3827,6 +3850,7 @@ abstract class MetaModel
$aSugFix[$sClass][$sAttCode][] = "ALTER TABLE `$sTable` ADD $sFieldDefinition";
if ($bIndexNeeded)
{
$aTableInfo['Indexes'][$sField]['used'] = true;
$aSugFix[$sClass][$sAttCode][] = "ALTER TABLE `$sTable` ADD INDEX (`$sField`)";
}
if (array_key_exists($sTable, $aCreateTable))
@@ -3834,6 +3858,7 @@ abstract class MetaModel
$aCreateTableItems[$sTable][$sField] = $sFieldDefinition;
if ($bIndexNeeded)
{
$aTableInfo['Indexes'][$sField]['used'] = true;
$aCreateTableItems[$sTable][] = "INDEX (`$sField`)";
}
}
@@ -3842,6 +3867,7 @@ abstract class MetaModel
$aAlterTableItems[$sTable][$sField] = "ADD $sFieldDefinition";
if ($bIndexNeeded)
{
$aTableInfo['Indexes'][$sField]['used'] = true;
$aAlterTableItems[$sTable][] = "ADD INDEX (`$sField`)";
}
}
@@ -3867,6 +3893,7 @@ abstract class MetaModel
//
if ($bIndexNeeded && !CMDBSource::HasIndex($sTable, $sField, array($sField)))
{
$aTableInfo['Indexes'][$sField]['used'] = true;
$aErrors[$sClass][$sAttCode][] = "Foreign key '$sField' in table '$sTable' should have an index";
if (CMDBSource::HasIndex($sTable, $sField))
{
@@ -3888,7 +3915,10 @@ abstract class MetaModel
foreach (self::DBGetIndexes($sClass) as $aColumns)
{
$sIndexId = implode('_', $aColumns);
if (isset($aTableInfo['Indexes'][$sIndexId]['used']) && $aTableInfo['Indexes'][$sIndexId]['used'])
{
continue;
}
if(!CMDBSource::HasIndex($sTable, $sIndexId, $aColumns))
{
$sColumns = "`".implode("`, `", $aColumns)."`";

View File

@@ -226,6 +226,10 @@ class BinaryExpression extends Expression
{
throw new CoreException('Expecting an Expression object on the right hand', array('found_class' => get_class($oRightExpr)));
}
if ( (($sOperator == "IN") || ($sOperator == "NOT IN")) && !$oRightExpr instanceof ListExpression)
{
throw new CoreException("Expecting a List Expression object on the right hand for operator $sOperator", array('found_class' => get_class($oRightExpr)));
}
$this->m_oLeftExpr = $oLeftExpr;
$this->m_oRightExpr = $oRightExpr;
$this->m_sOperator = $sOperator;

View File

@@ -74,6 +74,14 @@ class ormLinkSet implements iDBObjectSetIterator, Iterator, SeekableIterator
*/
protected $iCursor = 0;
/**
* __toString magical function overload.
*/
public function __toString()
{
return '';
}
/**
* ormLinkSet constructor.
* @param $sHostClass

View File

@@ -47,7 +47,7 @@ class SQLObjectQuery extends SQLQuery
private $m_aValues = array(); // Values to set in case of an update query
private $m_oSelectedIdField = null;
private $m_aJoinSelects = array();
private $m_bBeautifulQuery = false;
protected $m_bBeautifulQuery = false;
// Data set by PrepareRendering()
private $__aFrom;
@@ -312,6 +312,14 @@ class SQLObjectQuery extends SQLQuery
$this->PrepareRendering();
$sFrom = self::ClauseFrom($this->__aFrom, $sIndent);
$sWhere = self::ClauseWhere($this->m_oConditionExpr, $aArgs);
if ($iLimitCount > 0)
{
$sLimit = 'LIMIT '.$iLimitStart.', '.$iLimitCount;
}
else
{
$sLimit = '';
}
if ($bGetCount)
{
if (count($this->__aSelectedIdFields) > 0)
@@ -322,11 +330,13 @@ class SQLObjectQuery extends SQLQuery
$aCountFields[] = "COALESCE($sFieldExpr, 0)"; // Null values are excluded from the count
}
$sCountFields = implode(', ', $aCountFields);
$sSQL = "SELECT$sLineSep COUNT(DISTINCT $sCountFields) AS COUNT$sLineSep FROM $sFrom$sLineSep WHERE $sWhere";
// Count can be limited for performance reason, in this case the total amount is not important,
// we only need to know if the number of entries is greater than a certain amount.
$sSQL = "SELECT COUNT(*) AS COUNT FROM (SELECT$sLineSep DISTINCT $sCountFields $sLineSep FROM $sFrom$sLineSep WHERE $sWhere $sLimit) AS _tatooine_";
}
else
{
$sSQL = "SELECT$sLineSep COUNT(*) AS COUNT$sLineSep FROM $sFrom$sLineSep WHERE $sWhere";
$sSQL = "SELECT COUNT(*) AS COUNT FROM (SELECT$sLineSep 1 $sLineSep FROM $sFrom$sLineSep WHERE $sWhere $sLimit) AS _tatooine_";
}
}
else
@@ -337,14 +347,7 @@ class SQLObjectQuery extends SQLQuery
{
$sOrderBy = "ORDER BY $sOrderBy$sLineSep";
}
if ($iLimitCount > 0)
{
$sLimit = 'LIMIT '.$iLimitStart.', '.$iLimitCount;
}
else
{
$sLimit = '';
}
$sSQL = "SELECT$sLineSep DISTINCT $sSelect$sLineSep FROM $sFrom$sLineSep WHERE $sWhere$sLineSep $sOrderBy $sLimit";
}
return $sSQL;

View File

@@ -39,7 +39,7 @@ require_once('cmdbsource.class.inc.php');
abstract class SQLQuery
{
private $m_SourceOQL = '';
private $m_bBeautifulQuery = false;
protected $m_bBeautifulQuery = false;
public function __construct()
{

View File

@@ -58,7 +58,7 @@ class SQLUnionQuery extends SQLQuery
{
$aQueriesHtml[] = '<p>'.$oSQLQuery->DisplayHtml().'</p>';
}
echo implode('UNION', $aQueries);
echo implode('UNION', $aQueriesHtml);
}
public function AddInnerJoin($oSQLQuery, $sLeftField, $sRightField, $sRightTable = '')
@@ -85,7 +85,6 @@ class SQLUnionQuery extends SQLQuery
{
$this->m_bBeautifulQuery = $bBeautifulQuery;
$sLineSep = $this->m_bBeautifulQuery ? "\n" : '';
$sIndent = $this->m_bBeautifulQuery ? " " : null;
$aSelects = array();
foreach ($this->aQueries as $oSQLQuery)
@@ -93,36 +92,33 @@ class SQLUnionQuery extends SQLQuery
// Render SELECTS without orderby/limit/count
$aSelects[] = $oSQLQuery->RenderSelect(array(), $aArgs, 0, 0, false, $bBeautifulQuery);
}
$sSelects = '('.implode(")$sLineSep UNION$sLineSep(", $aSelects).')';
if ($bGetCount)
if ($iLimitCount > 0)
{
$sFrom = "($sLineSep$sSelects$sLineSep) as __selects__";
$sSQL = "SELECT$sLineSep COUNT(*) AS COUNT$sLineSep FROM $sFrom$sLineSep";
$sLimit = 'LIMIT '.$iLimitStart.', '.$iLimitCount;
}
else
{
$sLimit = '';
}
if ($bGetCount)
{
$sSelects = '('.implode(" $sLimit)$sLineSep UNION$sLineSep(", $aSelects)." $sLimit)";
$sFrom = "($sLineSep$sSelects$sLineSep) as __selects__";
$sSQL = "SELECT COUNT(*) AS COUNT FROM (SELECT$sLineSep 1 $sLineSep FROM $sFrom$sLineSep) AS _union_tatooine_";
}
else
{
$aSelects = array();
foreach ($this->aQueries as $oSQLQuery)
{
// Render SELECT without orderby/limit/count
$aSelects[] = $oSQLQuery->RenderSelect(array(), $aArgs, 0, 0, false, $bBeautifulQuery);
}
$sSelect = $this->aQueries[0]->RenderSelectClause();
$sOrderBy = $this->aQueries[0]->RenderOrderByClause($aOrderBy);
if (!empty($sOrderBy))
{
$sOrderBy = "ORDER BY $sOrderBy$sLineSep";
}
if ($iLimitCount > 0)
{
$sLimit = 'LIMIT '.$iLimitStart.', '.$iLimitCount;
$sOrderBy = "ORDER BY $sOrderBy$sLineSep $sLimit";
$sSQL = '('.implode(")$sLineSep UNION$sLineSep (", $aSelects).')'.$sLineSep.$sOrderBy;
}
else
{
$sLimit = '';
$sSQL = '('.implode(" $sLimit)$sLineSep UNION$sLineSep (", $aSelects)." $sLimit)";
}
$sSQL = $sSelects.$sLineSep.$sOrderBy.' '.$sLimit;
}
return $sSQL;
}

View File

@@ -52,7 +52,7 @@ abstract class ValueSetDefinition
}
public function GetValues($aArgs, $sContains = '')
public function GetValues($aArgs, $sContains = '', $sOperation = 'contains')
{
if (!$this->m_bIsLoaded)
{
@@ -93,12 +93,16 @@ abstract class ValueSetDefinition
class ValueSetObjects extends ValueSetDefinition
{
protected $m_sContains;
protected $m_sOperation;
protected $m_sFilterExpr; // in OQL
protected $m_sValueAttCode;
protected $m_aOrderBy;
protected $m_aExtraConditions;
private $m_bAllowAllData;
private $m_aModifierProperties;
private $m_bSort;
private $m_iLimit;
/**
* @param hash $aOrderBy Array of '[<classalias>.]attcode' => bAscending
@@ -106,12 +110,15 @@ class ValueSetObjects extends ValueSetDefinition
public function __construct($sFilterExp, $sValueAttCode = '', $aOrderBy = array(), $bAllowAllData = false, $aModifierProperties = array())
{
$this->m_sContains = '';
$this->m_sOperation = '';
$this->m_sFilterExpr = $sFilterExp;
$this->m_sValueAttCode = $sValueAttCode;
$this->m_aOrderBy = $aOrderBy;
$this->m_bAllowAllData = $bAllowAllData;
$this->m_aModifierProperties = $aModifierProperties;
$this->m_aExtraConditions = array();
$this->m_bSort = true;
$this->m_iLimit = 0;
}
public function SetModifierProperty($sPluginClass, $sProperty, $value)
@@ -163,11 +170,11 @@ class ValueSetObjects extends ValueSetDefinition
return new DBObjectSet($oFilter, $this->m_aOrderBy, $aArgs);
}
public function GetValues($aArgs, $sContains = '')
public function GetValues($aArgs, $sContains = '', $sOperation = 'contains')
{
if (!$this->m_bIsLoaded || ($sContains != $this->m_sContains))
if (!$this->m_bIsLoaded || ($sContains != $this->m_sContains) || ($sOperation != $this->m_sOperation))
{
$this->LoadValues($aArgs, $sContains);
$this->LoadValues($aArgs, $sContains, $sOperation);
$this->m_bIsLoaded = true;
}
// The results are already filtered and sorted (on friendly name)
@@ -175,9 +182,10 @@ class ValueSetObjects extends ValueSetDefinition
return $aRet;
}
protected function LoadValues($aArgs, $sContains = '')
protected function LoadValues($aArgs, $sContains = '', $sOperation = 'contains')
{
$this->m_sContains = $sContains;
$this->m_sOperation = $sOperation;
$this->m_aValues = array();
@@ -202,12 +210,67 @@ class ValueSetObjects extends ValueSetDefinition
}
}
$oValueExpr = new ScalarExpression('%'.$sContains.'%');
$oNameExpr = new FieldExpression('friendlyname', $oFilter->GetClassAlias());
$oNewCondition = new BinaryExpression($oNameExpr, 'LIKE', $oValueExpr);
$oFilter->AddConditionExpression($oNewCondition);
$oExpression = DBObjectSearch::GetPolymorphicExpression($oFilter->GetClass(), 'friendlyname');
$aFields = $oExpression->ListRequiredFields();
$sClass = $oFilter->GetClass();
foreach($aFields as $sField)
{
$aFieldItems = explode('.', $sField);
if ($aFieldItems[0] != $sClass)
{
$sOperation = 'contains';
break;
}
}
$oObjects = new DBObjectSet($oFilter, $this->m_aOrderBy, $aArgs);
switch ($sOperation)
{
case 'equals_start_with':
$aAttributes = MetaModel::GetFriendlyNameAttributeCodeList($oFilter->GetClass());
$sClassAlias = $oFilter->GetClassAlias();
$aFilters = array();
// Equals first
$oValueExpr = new ScalarExpression($sContains);
foreach($aAttributes as $sAttribute)
{
$oNewFilter = $oFilter->DeepClone();
$oNameExpr = new FieldExpression($sAttribute, $sClassAlias);
$oCondition = new BinaryExpression($oNameExpr, 'LIKE', $oValueExpr);
$oNewFilter->AddConditionExpression($oCondition);
$aFilters[] = $oNewFilter;
}
// start with next
$oValueExpr = new ScalarExpression($sContains.'%');
foreach($aAttributes as $sAttribute)
{
$oNewFilter = $oFilter->DeepClone();
$oNameExpr = new FieldExpression($sAttribute, $sClassAlias);
$oCondition = new BinaryExpression($oNameExpr, 'LIKE', $oValueExpr);
$oNewFilter->AddConditionExpression($oCondition);
$aFilters[] = $oNewFilter;
}
// Unions are much faster than OR conditions
$oFilter = new DBUnionSearch($aFilters);
break;
default:
$oValueExpr = new ScalarExpression('%'.$sContains.'%');
$oNameExpr = new FieldExpression('friendlyname', $oFilter->GetClassAlias());
$oNewCondition = new BinaryExpression($oNameExpr, 'LIKE', $oValueExpr);
$oFilter->AddConditionExpression($oNewCondition);
break;
}
$oObjects = new DBObjectSet($oFilter, $this->m_aOrderBy, $aArgs, null, $this->m_iLimit, 0, $this->m_bSort);
if (empty($this->m_sValueAttCode))
{
$aAttToLoad = array($oFilter->GetClassAlias() => array('friendlyname'));
}
else
{
$aAttToLoad = array($oFilter->GetClassAlias() => array($this->m_sValueAttCode));
}
$oObjects->OptimizeColumnLoad($aAttToLoad);
while ($oObject = $oObjects->Fetch())
{
if (empty($this->m_sValueAttCode))
@@ -231,6 +294,22 @@ class ValueSetObjects extends ValueSetDefinition
{
return $this->m_sFilterExpr;
}
/**
* @param $iLimit
*/
public function SetLimit($iLimit)
{
$this->m_iLimit = $iLimit;
}
/**
* @param $bSort
*/
public function SetSort($bSort)
{
$this->m_bSort = $bSort;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -18,6 +18,7 @@ body {
font-family: Tahoma, Verdana, Arial, Helvetica;
font-size: 10pt;
color: $text-color;
background-color: white;
margin: 0; /* Remove body margin/padding */
padding: 0;
overflow: hidden; /* Remove scroll bars on browser window */

View File

@@ -20,7 +20,6 @@
/**
* Localized data
*
* @author Robert Deng <denglx@gmail.com>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
@@ -41,7 +40,7 @@
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:UserExternal' => '外部用户',
'Class:UserExternal+' => '用户在 iTop 外验证身份',
'Class:UserExternal+' => '用户在iTop 外验证身份',
));

View File

@@ -20,7 +20,6 @@
/**
* Localized data
*
* @author Robert Deng <denglx@gmail.com>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
@@ -41,9 +40,9 @@
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:UserLDAP' => 'LDAP 用户',
'Class:UserLDAP+' => '用户由 LDAP 鉴别身份',
'Class:UserLDAP+' => '用户身份由LDAP 认证',
'Class:UserLDAP/Attribute:password' => '密码',
'Class:UserLDAP/Attribute:password+' => '用户身份验证串',
'Class:UserLDAP/Attribute:password+' => '用于验证用户身份的字符串',
));

View File

@@ -20,7 +20,6 @@
/**
* Localized data
*
* @author Robert Deng <denglx@gmail.com>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
@@ -41,9 +40,9 @@
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:UserLocal' => 'iTop 用户',
'Class:UserLocal+' => '用户由 iTop 验证身份',
'Class:UserLocal+' => '用户身份由iTop 验证',
'Class:UserLocal/Attribute:password' => '密码',
'Class:UserLocal/Attribute:password+' => '用户身份验证串',
'Class:UserLocal/Attribute:password+' => '用户身份验证字符串',
));

View File

@@ -0,0 +1,42 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Attachments:TabTitle_Count' => '附件 (%1$d)',
'Attachments:EmptyTabTitle' => '附件',
'Attachments:FieldsetTitle' => '附件',
'Attachments:DeleteBtn' => '删除',
'Attachments:History_File_Added' => '附件 %1$s 已添加.',
'Attachments:History_File_Removed' => '附件 %1$s 已移除.',
'Attachments:AddAttachment' => '添加附件: ',
'Attachments:UploadNotAllowedOnThisSystem' => '系统不允许文件上传.',
'Attachment:Max_Go' => '(最大文件尺寸: %1$s GB)',
'Attachment:Max_Mo' => '(最大文件尺寸: %1$s MB)',
'Attachment:Max_Ko' => '(最大文件尺寸: %1$s KB)',
'Attachments:NoAttachment' => '没有附件. ',
'Attachments:PreviewNotAvailable' => '该附件类型不支持预览.',
));
?>

View File

@@ -99,8 +99,10 @@ class DBRestore extends DBBackup
}
/**
* @param $sFile A file with the extension .zip or .tar.gz
* @param string $sFile A file with the extension .zip or .tar.gz
* @param string $sEnvironment Target environment
*
* @throws \Exception
*/
public function RestoreFromCompressedBackup($sFile, $sEnvironment = 'production')
{
@@ -111,7 +113,7 @@ class DBRestore extends DBBackup
{
$this->LogInfo('zip file detected');
$oArchive = new ZipArchiveEx();
$res = $oArchive->open($sFile);
$oArchive->open($sFile);
}
elseif (substr($sNormalizedFile, -7) == '.tar.gz')
{
@@ -125,21 +127,22 @@ class DBRestore extends DBBackup
// Load the database
//
$sDataDir = tempnam(SetupUtils::GetTmpDir(), 'itop-');
unlink($sDataDir); // I need a directory, not a file...
$sDataDir = APPROOT.'data/tmp-backup-'.rand(10000, getrandmax());
SetupUtils::builddir($sDataDir); // Here is the directory
$oArchive->extractFileTo($sDataDir, 'itop-dump.sql');
$oArchive->extractTo($sDataDir);
$sDataFile = $sDataDir.'/itop-dump.sql';
$this->LoadDatabase($sDataFile);
SetupUtils::rrmdir($sDataDir);
// Update the code
//
$sDeltaFile = APPROOT.'data/'.$sEnvironment.'.delta.xml';
if ($oArchive->hasFile('delta.xml') !== false)
if (is_file($sDataDir.'/delta.xml'))
{
// Extract and rename delta.xml => <env>.delta.xml;
file_put_contents($sDeltaFile, $oArchive->getFromName('delta.xml'));
rename($sDataDir.'/delta.xml', $sDeltaFile);
}
else
{
@@ -149,16 +152,18 @@ class DBRestore extends DBBackup
{
SetupUtils::rrmdir(APPROOT.'data/production-modules/');
}
if ($oArchive->hasDir('production-modules/') !== false)
if (is_dir($sDataDir.'/production-modules'))
{
$oArchive->extractDirTo(APPROOT.'data/', 'production-modules/');
rename($sDataDir.'/production-modules', APPROOT.'data/production-modules/');
}
$sConfigFile = APPROOT.'conf/'.$sEnvironment.'/config-itop.php';
@chmod($sConfigFile, 0770); // Allow overwriting the file
$oArchive->extractFileTo(APPROOT.'conf/'.$sEnvironment, 'config-itop.php');
rename($sDataDir.'/config-itop.php', $sConfigFile);
@chmod($sConfigFile, 0444); // Read-only
SetupUtils::rrmdir($sDataDir);
$oEnvironment = new RunTimeEnvironment($sEnvironment);
$oEnvironment->CompileFrom($sEnvironment);
}

View File

@@ -0,0 +1,46 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2013 Combodo
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'bkp-backup-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 配置文件的选项mysql_bindir.',
'bkp-mysqldump-issue' => 'mysqldump 无法运行 (retcode=%1$d): 请确认它安装在正确的路径, 或者调整iTop 配置文件的选项mysql_bindir',
'bkp-missing-dir' => '目标目录 %1$s 找不到',
'bkp-free-disk-space' => '<b>%1$s 空闲</b> 在 %2$s',
'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' => '当下一次备份时将被删除 (see the setting "retention_count")',
'bkp-table-file' => 'File',
'bkp-table-file+' => '只有扩展名是.zip的文件才被认为是备份文件',
'bkp-table-size' => '大小',
'bkp-table-size+' => '',
'bkp-table-actions' => '操作',
'bkp-table-actions+' => '',
'bkp-status-backups-auto' => '定时备份',
'bkp-status-backups-manual' => '手动备份',
'bkp-status-backups-none' => '尚未开始备份',
'bkp-next-backup' => '下一次备份将发生在 <b>%1$s</b> (%2$s) 的 %3$s',
'bkp-button-backup-now' => '立即备份!',
'bkp-button-restore-now' => '还原!',
'bkp-confirm-backup' => '请确认是否立即开始备份.',
'bkp-confirm-restore' => '请确认要还原的备份文件是 %1$s.',
'bkp-wait-backup' => '请等待备份完成...',
'bkp-wait-restore' => '请等待还原完成...',
'bkp-success-restore' => '还原成功.',
));
?>

View File

@@ -1,370 +0,0 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @author Robert Deng <denglx@gmail.com>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:ChangeManagement' => '变更管理',
'Menu:Change:Overview' => '概览',
'Menu:Change:Overview+' => '',
'Menu:NewChange' => '新变更',
'Menu:NewChange+' => '创建新变更的单据',
'Menu:SearchChanges' => '搜索变更',
'Menu:SearchChanges+' => '搜索变更单据',
'Menu:Change:Shortcuts' => '快捷方式',
'Menu:Change:Shortcuts+' => '',
'Menu:WaitingAcceptance' => '等待接受的变更',
'Menu:WaitingAcceptance+' => '',
'Menu:WaitingApproval' => '等待批准的变更',
'Menu:WaitingApproval+' => '',
'Menu:Changes' => '待处理的变更',
'Menu:Changes+' => '',
'Menu:MyChanges' => '指派给我的变更',
'Menu:MyChanges+' => '指派给我的变更 (作为办理人)',
));
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: Change
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Change' => '变更',
'Class:Change+' => '',
'Class:Change/Attribute:start_date' => '计划启动',
'Class:Change/Attribute:start_date+' => '',
'Class:Change/Attribute:status' => '状态',
'Class:Change/Attribute:status+' => '',
'Class:Change/Attribute:status/Value:new' => '新',
'Class:Change/Attribute:status/Value:new+' => '',
'Class:Change/Attribute:status/Value:validated' => '已生效',
'Class:Change/Attribute:status/Value:validated+' => '',
'Class:Change/Attribute:status/Value:rejected' => '已拒绝',
'Class:Change/Attribute:status/Value:rejected+' => '',
'Class:Change/Attribute:status/Value:assigned' => '已指派',
'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:notapproved' => '未批准',
'Class:Change/Attribute:status/Value:notapproved+' => '',
'Class:Change/Attribute:status/Value:implemented' => '已实施',
'Class:Change/Attribute:status/Value:implemented+' => '',
'Class:Change/Attribute:status/Value:monitored' => '已监控',
'Class:Change/Attribute:status/Value:monitored+' => '',
'Class:Change/Attribute:status/Value:closed' => '已关闭',
'Class:Change/Attribute:status/Value:closed+' => '',
'Class:Change/Attribute:reason' => '原因',
'Class:Change/Attribute:reason+' => '',
'Class:Change/Attribute:requestor_id' => '申请者',
'Class:Change/Attribute:requestor_id+' => '',
'Class:Change/Attribute:requestor_email' => '申请者',
'Class:Change/Attribute:requestor_email+' => '',
'Class:Change/Attribute:org_id' => '客户',
'Class:Change/Attribute:org_id+' => '',
'Class:Change/Attribute:org_name' => '客户',
'Class:Change/Attribute:org_name+' => '',
'Class:Change/Attribute:workgroup_id' => '工作组',
'Class:Change/Attribute:workgroup_id+' => '',
'Class:Change/Attribute:workgroup_name' => '工作组',
'Class:Change/Attribute:workgroup_name+' => '',
'Class:Change/Attribute:creation_date' => '创建',
'Class:Change/Attribute:creation_date+' => '',
'Class:Change/Attribute:last_update' => '最后更新',
'Class:Change/Attribute:last_update+' => '',
'Class:Change/Attribute:end_date' => '结束',
'Class:Change/Attribute:end_date+' => '',
'Class:Change/Attribute:close_date' => '关闭',
'Class:Change/Attribute:close_date+' => '',
'Class:Change/Attribute:impact' => '影响',
'Class:Change/Attribute:impact+' => '',
'Class:Change/Attribute:agent_id' => '办理人',
'Class:Change/Attribute:agent_id+' => '',
'Class:Change/Attribute:agent_name' => '办理人',
'Class:Change/Attribute:agent_name+' => '',
'Class:Change/Attribute:agent_email' => '办理人',
'Class:Change/Attribute:agent_email+' => '',
'Class:Change/Attribute:supervisor_group_id' => '监督团队',
'Class:Change/Attribute:supervisor_group_id+' => '',
'Class:Change/Attribute:supervisor_group_name' => '监督团队',
'Class:Change/Attribute:supervisor_group_name+' => '',
'Class:Change/Attribute:supervisor_id' => '监督者',
'Class:Change/Attribute:supervisor_id+' => '',
'Class:Change/Attribute:supervisor_email' => '监督者',
'Class:Change/Attribute:supervisor_email+' => '',
'Class:Change/Attribute:manager_group_id' => '管理团队',
'Class:Change/Attribute:manager_group_id+' => '',
'Class:Change/Attribute:manager_group_name' => '管理团队',
'Class:Change/Attribute:manager_group_name+' => '',
'Class:Change/Attribute:manager_id' => '管理人',
'Class:Change/Attribute:manager_id+' => '',
'Class:Change/Attribute:manager_email' => '管理人',
'Class:Change/Attribute:manager_email+' => '',
'Class:Change/Attribute:outage' => '停歇',
'Class:Change/Attribute:outage+' => '',
'Class:Change/Attribute:outage/Value:yes' => '是',
'Class:Change/Attribute:outage/Value:yes+' => '',
'Class:Change/Attribute:outage/Value:no' => '否',
'Class:Change/Attribute:outage/Value:no+' => '',
'Class:Change/Attribute:change_request' => '申请',
'Class:Change/Attribute:change_request+' => '',
'Class:Change/Attribute:fallback' => '回退计划',
'Class:Change/Attribute:fallback+' => '',
'Class:Change/Stimulus:ev_validate' => '生效',
'Class:Change/Stimulus:ev_validate+' => '',
'Class:Change/Stimulus:ev_reject' => '拒绝',
'Class:Change/Stimulus:ev_reject+' => '',
'Class:Change/Stimulus:ev_assign' => '指派',
'Class:Change/Stimulus:ev_assign+' => '',
'Class:Change/Stimulus:ev_reopen' => '重开',
'Class:Change/Stimulus:ev_reopen+' => '',
'Class:Change/Stimulus:ev_plan' => '计划',
'Class:Change/Stimulus:ev_plan+' => '',
'Class:Change/Stimulus:ev_approve' => '批准',
'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_implement' => '实施',
'Class:Change/Stimulus:ev_implement+' => '',
'Class:Change/Stimulus:ev_monitor' => '监控',
'Class:Change/Stimulus:ev_monitor+' => '',
'Class:Change/Stimulus:ev_finish' => '完成',
'Class:Change/Stimulus:ev_finish+' => '',
));
//
// Class: RoutineChange
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:RoutineChange' => '例行变更',
'Class:RoutineChange+' => '',
'Class:RoutineChange/Attribute:status/Value:new' => '新',
'Class:RoutineChange/Attribute:status/Value:new+' => '',
'Class:RoutineChange/Attribute:status/Value:assigned' => '已指派',
'Class:RoutineChange/Attribute:status/Value:assigned+' => '',
'Class:RoutineChange/Attribute:status/Value:plannedscheduled' => '已计划和安排',
'Class:RoutineChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:RoutineChange/Attribute:status/Value:approved' => '已批准',
'Class:RoutineChange/Attribute:status/Value:approved+' => '',
'Class:RoutineChange/Attribute:status/Value:implemented' => '已实施',
'Class:RoutineChange/Attribute:status/Value:implemented+' => '',
'Class:RoutineChange/Attribute:status/Value:monitored' => '已监控',
'Class:RoutineChange/Attribute:status/Value:monitored+' => '',
'Class:RoutineChange/Attribute:status/Value:closed' => '已关闭',
'Class:RoutineChange/Attribute:status/Value:closed+' => '',
'Class:RoutineChange/Stimulus:ev_validate' => '生效',
'Class:RoutineChange/Stimulus:ev_validate+' => '',
'Class:RoutineChange/Stimulus:ev_assign' => '指派',
'Class:RoutineChange/Stimulus:ev_assign+' => '',
'Class:RoutineChange/Stimulus:ev_reopen' => '重开',
'Class:RoutineChange/Stimulus:ev_reopen+' => '',
'Class:RoutineChange/Stimulus:ev_plan' => '计划',
'Class:RoutineChange/Stimulus:ev_plan+' => '',
'Class:RoutineChange/Stimulus:ev_replan' => '重新计划',
'Class:RoutineChange/Stimulus:ev_replan+' => '',
'Class:RoutineChange/Stimulus:ev_implement' => '实施',
'Class:RoutineChange/Stimulus:ev_implement+' => '',
'Class:RoutineChange/Stimulus:ev_monitor' => '监控',
'Class:RoutineChange/Stimulus:ev_monitor+' => '',
'Class:RoutineChange/Stimulus:ev_finish' => '完成',
'Class:RoutineChange/Stimulus:ev_finish+' => '',
));
//
// Class: ApprovedChange
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ApprovedChange' => '批准的变更',
'Class:ApprovedChange+' => '',
'Class:ApprovedChange/Attribute:approval_date' => '批准日期',
'Class:ApprovedChange/Attribute:approval_date+' => '',
'Class:ApprovedChange/Attribute:approval_comment' => '批准说明',
'Class:ApprovedChange/Attribute:approval_comment+' => '',
'Class:ApprovedChange/Stimulus:ev_validate' => '生效',
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
'Class:ApprovedChange/Stimulus:ev_reject' => '拒绝',
'Class:ApprovedChange/Stimulus:ev_reject+' => '',
'Class:ApprovedChange/Stimulus:ev_assign' => '指派',
'Class:ApprovedChange/Stimulus:ev_assign+' => '',
'Class:ApprovedChange/Stimulus:ev_reopen' => '重开',
'Class:ApprovedChange/Stimulus:ev_reopen+' => '',
'Class:ApprovedChange/Stimulus:ev_plan' => '计划',
'Class:ApprovedChange/Stimulus:ev_plan+' => '',
'Class:ApprovedChange/Stimulus:ev_approve' => '批准',
'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_implement' => '实施',
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
'Class:ApprovedChange/Stimulus:ev_monitor' => '监控',
'Class:ApprovedChange/Stimulus:ev_monitor+' => '',
'Class:ApprovedChange/Stimulus:ev_finish' => '完成',
'Class:ApprovedChange/Stimulus:ev_finish+' => '',
));
//
// Class: NormalChange
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:NormalChange' => '正常变更',
'Class:NormalChange+' => '',
'Class:NormalChange/Attribute:status/Value:new' => '新',
'Class:NormalChange/Attribute:status/Value:new+' => '',
'Class:NormalChange/Attribute:status/Value:validated' => '已生效',
'Class:NormalChange/Attribute:status/Value:validated+' => '',
'Class:NormalChange/Attribute:status/Value:rejected' => '已拒绝',
'Class:NormalChange/Attribute:status/Value:rejected+' => '',
'Class:NormalChange/Attribute:status/Value:assigned' => '已指派',
'Class:NormalChange/Attribute:status/Value:assigned+' => '',
'Class:NormalChange/Attribute:status/Value:plannedscheduled' => '已计划和安排',
'Class:NormalChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:NormalChange/Attribute:status/Value:approved' => '已批准',
'Class:NormalChange/Attribute:status/Value:approved+' => '',
'Class:NormalChange/Attribute:status/Value:notapproved' => '不批准',
'Class:NormalChange/Attribute:status/Value:notapproved+' => '',
'Class:NormalChange/Attribute:status/Value:implemented' => '已实施',
'Class:NormalChange/Attribute:status/Value:implemented+' => '',
'Class:NormalChange/Attribute:status/Value:monitored' => '已监控',
'Class:NormalChange/Attribute:status/Value:monitored+' => '',
'Class:NormalChange/Attribute:status/Value:closed' => '已关闭',
'Class:NormalChange/Attribute:status/Value:closed+' => '',
'Class:NormalChange/Attribute:acceptance_date' => '接受日期',
'Class:NormalChange/Attribute:acceptance_date+' => '',
'Class:NormalChange/Attribute:acceptance_comment' => '接受说明',
'Class:NormalChange/Attribute:acceptance_comment+' => '',
'Class:NormalChange/Stimulus:ev_validate' => '生效',
'Class:NormalChange/Stimulus:ev_validate+' => '',
'Class:NormalChange/Stimulus:ev_reject' => '拒绝',
'Class:NormalChange/Stimulus:ev_reject+' => '',
'Class:NormalChange/Stimulus:ev_assign' => '指派',
'Class:NormalChange/Stimulus:ev_assign+' => '',
'Class:NormalChange/Stimulus:ev_reopen' => '重开',
'Class:NormalChange/Stimulus:ev_reopen+' => '',
'Class:NormalChange/Stimulus:ev_plan' => '计划',
'Class:NormalChange/Stimulus:ev_plan+' => '',
'Class:NormalChange/Stimulus:ev_approve' => '批准',
'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_implement' => '实施',
'Class:NormalChange/Stimulus:ev_implement+' => '',
'Class:NormalChange/Stimulus:ev_monitor' => '监控',
'Class:NormalChange/Stimulus:ev_monitor+' => '',
'Class:NormalChange/Stimulus:ev_finish' => '完成',
'Class:NormalChange/Stimulus:ev_finish+' => '',
));
//
// Class: EmergencyChange
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:EmergencyChange' => '紧急变更',
'Class:EmergencyChange+' => '',
'Class:EmergencyChange/Attribute:status/Value:new' => '新',
'Class:EmergencyChange/Attribute:status/Value:new+' => '',
'Class:EmergencyChange/Attribute:status/Value:validated' => '已生效',
'Class:EmergencyChange/Attribute:status/Value:validated+' => '',
'Class:EmergencyChange/Attribute:status/Value:rejected' => '已拒绝',
'Class:EmergencyChange/Attribute:status/Value:rejected+' => '',
'Class:EmergencyChange/Attribute:status/Value:assigned' => '已指派',
'Class:EmergencyChange/Attribute:status/Value:assigned+' => '',
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled' => '已计划和安排',
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:EmergencyChange/Attribute:status/Value:approved' => '已批准',
'Class:EmergencyChange/Attribute:status/Value:approved+' => '',
'Class:EmergencyChange/Attribute:status/Value:notapproved' => '不批准',
'Class:EmergencyChange/Attribute:status/Value:notapproved+' => '',
'Class:EmergencyChange/Attribute:status/Value:implemented' => '已实施',
'Class:EmergencyChange/Attribute:status/Value:implemented+' => '',
'Class:EmergencyChange/Attribute:status/Value:monitored' => '已监控',
'Class:EmergencyChange/Attribute:status/Value:monitored+' => '',
'Class:EmergencyChange/Attribute:status/Value:closed' => '已关闭',
'Class:EmergencyChange/Attribute:status/Value:closed+' => '',
'Class:EmergencyChange/Stimulus:ev_validate' => '生效',
'Class:EmergencyChange/Stimulus:ev_validate+' => '',
'Class:EmergencyChange/Stimulus:ev_reject' => '拒绝',
'Class:EmergencyChange/Stimulus:ev_reject+' => '',
'Class:EmergencyChange/Stimulus:ev_assign' => '指派',
'Class:EmergencyChange/Stimulus:ev_assign+' => '',
'Class:EmergencyChange/Stimulus:ev_reopen' => '重开',
'Class:EmergencyChange/Stimulus:ev_reopen+' => '',
'Class:EmergencyChange/Stimulus:ev_plan' => '计划',
'Class:EmergencyChange/Stimulus:ev_plan+' => '',
'Class:EmergencyChange/Stimulus:ev_approve' => '批准',
'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_implement' => '实施',
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
'Class:EmergencyChange/Stimulus:ev_monitor' => '监控',
'Class:EmergencyChange/Stimulus:ev_monitor+' => '',
'Class:EmergencyChange/Stimulus:ev_finish' => '完成',
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => 'Changes by category for the last 7 days~~',
'UI-ChangeManagementOverview-Last-7-days' => 'Number of changes for the last 7 days~~',
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => 'Changes by domain for the last 7 days~~',
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => 'Changes by status for the last 7 days~~',
'Class:Change/Attribute:parent_id' => 'Parent change~~',
'Class:Change/Attribute:parent_name' => 'Parent change Ref~~',
'Class:Change/Attribute:related_request_list' => 'Related requests~~',
'Class:Change/Attribute:related_request_list+' => 'All the user requests linked to this change~~',
'Class:Change/Attribute:related_problems_list' => 'Related problems~~',
'Class:Change/Attribute:related_problems_list+' => 'All the problems linked to this change~~',
'Class:Change/Attribute:related_incident_list' => 'Related incidents~~',
'Class:Change/Attribute:related_incident_list+' => 'All the incidents linked to this change~~',
'Class:Change/Attribute:child_changes_list' => 'Child changes~~',
'Class:Change/Attribute:child_changes_list+' => 'All the sub changes linked to this change~~',
'Class:Change/Attribute:parent_id_friendlyname' => 'Parent friendly name~~',
'Class:Change/Attribute:parent_id_finalclass_recall' => 'Change type~~',
'Class:RoutineChange/Stimulus:ev_reject' => 'Reject~~',
'Class:RoutineChange/Stimulus:ev_approve' => 'Approve~~',
'Class:RoutineChange/Stimulus:ev_notapprove' => 'Do Not Approve~~',
'Tickets:Related:OpenChanges' => 'Open changes~~',
'Tickets:Related:RecentChanges' => 'Recent changes (72h)~~',
));
?>

View File

@@ -0,0 +1,299 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:ChangeManagement' => '变更管理',
'Menu:Change:Overview' => '概况',
'Menu:Change:Overview+' => '',
'Menu:NewChange' => '新建变更',
'Menu:NewChange+' => '新建变更',
'Menu:SearchChanges' => '搜索变更',
'Menu:SearchChanges+' => '搜索变更',
'Menu:Change:Shortcuts' => '快捷方式',
'Menu:Change:Shortcuts+' => '',
'Menu:WaitingAcceptance' => '等待审核的变更',
'Menu:WaitingAcceptance+' => '',
'Menu:WaitingApproval' => '等待批准的变更',
'Menu:WaitingApproval+' => '',
'Menu:Changes' => '所有打开的变更',
'Menu:Changes+' => '所有打开的变更',
'Menu:MyChanges' => '分配给我的变更',
'Menu:MyChanges+' => '分配给我的变更 (作为办理人)',
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => '最近一周的变更(按类型)',
'UI-ChangeManagementOverview-Last-7-days' => '最近一周的变更(按数量)',
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => '最近一周的变更(按范围)',
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => '最近一周的变更(按状态)',
'Tickets:Related:OpenChanges' => '打开的变更',
'Tickets:Related:RecentChanges' => '最近的变更 (72小时)',
));
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: Change
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Change' => '变更',
'Class:Change+' => '',
'Class:Change/Attribute:status' => '状态',
'Class:Change/Attribute:status+' => '',
'Class:Change/Attribute:status/Value:new' => '新建',
'Class:Change/Attribute:status/Value:new+' => '',
'Class:Change/Attribute:status/Value:validated' => '已确认',
'Class:Change/Attribute:status/Value:validated+' => '',
'Class:Change/Attribute:status/Value:rejected' => '已驳回',
'Class:Change/Attribute:status/Value:rejected+' => '',
'Class:Change/Attribute:status/Value:assigned' => '已分配',
'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:notapproved' => '未批准',
'Class:Change/Attribute:status/Value:notapproved+' => '',
'Class:Change/Attribute:status/Value:implemented' => '已实施',
'Class:Change/Attribute:status/Value:implemented+' => '',
'Class:Change/Attribute:status/Value:monitored' => '已验收',
'Class:Change/Attribute:status/Value:monitored+' => '',
'Class:Change/Attribute:status/Value:closed' => '已关闭',
'Class:Change/Attribute:status/Value:closed+' => '',
'Class:Change/Attribute:reason' => '驳回原因',
'Class:Change/Attribute:reason+' => '',
'Class:Change/Attribute:requestor_id' => '发起人',
'Class:Change/Attribute:requestor_id+' => '',
'Class:Change/Attribute:requestor_email' => '邮箱',
'Class:Change/Attribute:requestor_email+' => '',
'Class:Change/Attribute:creation_date' => '创建时间',
'Class:Change/Attribute:creation_date+' => '',
'Class:Change/Attribute:impact' => '影响',
'Class:Change/Attribute:impact+' => '',
'Class:Change/Attribute:supervisor_group_id' => '监督团队',
'Class:Change/Attribute:supervisor_group_id+' => '',
'Class:Change/Attribute:supervisor_group_name' => '监督团队名称',
'Class:Change/Attribute:supervisor_group_name+' => '',
'Class:Change/Attribute:supervisor_id' => '监督人',
'Class:Change/Attribute:supervisor_id+' => '',
'Class:Change/Attribute:supervisor_email' => '邮箱',
'Class:Change/Attribute:supervisor_email+' => '',
'Class:Change/Attribute:manager_group_id' => '管理团队',
'Class:Change/Attribute:manager_group_id+' => '',
'Class:Change/Attribute:manager_group_name' => '管理团队名称',
'Class:Change/Attribute:manager_group_name+' => '',
'Class:Change/Attribute:manager_id' => '经理',
'Class:Change/Attribute:manager_id+' => '',
'Class:Change/Attribute:manager_email' => '邮箱',
'Class:Change/Attribute:manager_email+' => '',
'Class:Change/Attribute:outage' => '停机',
'Class:Change/Attribute:outage+' => '',
'Class:Change/Attribute:outage/Value:yes' => '是',
'Class:Change/Attribute:outage/Value:yes+' => '',
'Class:Change/Attribute:outage/Value:no' => '否',
'Class:Change/Attribute:outage/Value:no+' => '',
'Class:Change/Attribute:fallback' => '回滚计划',
'Class:Change/Attribute:fallback+' => '',
'Class:Change/Attribute:parent_id' => '父级变更',
'Class:Change/Attribute:parent_id+' => '',
'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_problems_list' => '相关问题',
'Class:Change/Attribute:related_problems_list+' => '该变更相关的所有问题',
'Class:Change/Attribute:related_incident_list' => '相关事件',
'Class:Change/Attribute:related_incident_list+' => '该变更相关的所有事件',
'Class:Change/Attribute:child_changes_list' => '子变更',
'Class:Change/Attribute:child_changes_list+' => '该变更相关的字变更',
'Class:Change/Attribute:parent_id_friendlyname' => '父级变更昵称',
'Class:Change/Attribute:parent_id_friendlyname+' => '',
'Class:Change/Attribute:parent_id_finalclass_recall' => '变更类型',
'Class:Change/Attribute:parent_id_finalclass_recall+' => '',
'Class:Change/Stimulus:ev_validate' => '同意',
'Class:Change/Stimulus:ev_validate+' => '',
'Class:Change/Stimulus:ev_reject' => '驳回',
'Class:Change/Stimulus:ev_reject+' => '',
'Class:Change/Stimulus:ev_assign' => '分配',
'Class:Change/Stimulus:ev_assign+' => '',
'Class:Change/Stimulus:ev_reopen' => '重新打开',
'Class:Change/Stimulus:ev_reopen+' => '',
'Class:Change/Stimulus:ev_plan' => '计划',
'Class:Change/Stimulus:ev_plan+' => '',
'Class:Change/Stimulus:ev_approve' => '批准',
'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_implement' => '实施',
'Class:Change/Stimulus:ev_implement+' => '',
'Class:Change/Stimulus:ev_monitor' => '验收',
'Class:Change/Stimulus:ev_monitor+' => '',
'Class:Change/Stimulus:ev_finish' => '完成',
'Class:Change/Stimulus:ev_finish+' => '',
));
//
// Class: RoutineChange
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:RoutineChange' => '例行变更',
'Class:RoutineChange+' => '',
'Class:RoutineChange/Stimulus:ev_validate' => '同意',
'Class:RoutineChange/Stimulus:ev_validate+' => '',
'Class:RoutineChange/Stimulus:ev_reject' => '驳回',
'Class:RoutineChange/Stimulus:ev_reject+' => '',
'Class:RoutineChange/Stimulus:ev_assign' => '分配',
'Class:RoutineChange/Stimulus:ev_assign+' => '',
'Class:RoutineChange/Stimulus:ev_reopen' => '重新打开',
'Class:RoutineChange/Stimulus:ev_reopen+' => '',
'Class:RoutineChange/Stimulus:ev_plan' => '计划',
'Class:RoutineChange/Stimulus:ev_plan+' => '',
'Class:RoutineChange/Stimulus:ev_approve' => '批准',
'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_implement' => '实施',
'Class:RoutineChange/Stimulus:ev_implement+' => '',
'Class:RoutineChange/Stimulus:ev_monitor' => '验收',
'Class:RoutineChange/Stimulus:ev_monitor+' => '',
'Class:RoutineChange/Stimulus:ev_finish' => '完成',
'Class:RoutineChange/Stimulus:ev_finish+' => '',
));
//
// Class: ApprovedChange
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ApprovedChange' => '已批准的变更',
'Class:ApprovedChange+' => '',
'Class:ApprovedChange/Attribute:approval_date' => '批准日期',
'Class:ApprovedChange/Attribute:approval_date+' => '',
'Class:ApprovedChange/Attribute:approval_comment' => '批准说明',
'Class:ApprovedChange/Attribute:approval_comment+' => '',
'Class:ApprovedChange/Stimulus:ev_validate' => '同意',
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
'Class:ApprovedChange/Stimulus:ev_reject' => '驳回',
'Class:ApprovedChange/Stimulus:ev_reject+' => '',
'Class:ApprovedChange/Stimulus:ev_assign' => '分配',
'Class:ApprovedChange/Stimulus:ev_assign+' => '',
'Class:ApprovedChange/Stimulus:ev_reopen' => '重新打开',
'Class:ApprovedChange/Stimulus:ev_reopen+' => '',
'Class:ApprovedChange/Stimulus:ev_plan' => '计划',
'Class:ApprovedChange/Stimulus:ev_plan+' => '',
'Class:ApprovedChange/Stimulus:ev_approve' => '批准',
'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_implement' => '实施',
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
'Class:ApprovedChange/Stimulus:ev_monitor' => '验收',
'Class:ApprovedChange/Stimulus:ev_monitor+' => '',
'Class:ApprovedChange/Stimulus:ev_finish' => '完成',
'Class:ApprovedChange/Stimulus:ev_finish+' => '',
));
//
// Class: NormalChange
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:NormalChange' => '正常变更',
'Class:NormalChange+' => '',
'Class:NormalChange/Attribute:acceptance_date' => '审核日期',
'Class:NormalChange/Attribute:acceptance_date+' => '',
'Class:NormalChange/Attribute:acceptance_comment' => '审核说明',
'Class:NormalChange/Attribute:acceptance_comment+' => '',
'Class:NormalChange/Stimulus:ev_validate' => '同意',
'Class:NormalChange/Stimulus:ev_validate+' => '',
'Class:NormalChange/Stimulus:ev_reject' => '驳回',
'Class:NormalChange/Stimulus:ev_reject+' => '',
'Class:NormalChange/Stimulus:ev_assign' => '分配',
'Class:NormalChange/Stimulus:ev_assign+' => '',
'Class:NormalChange/Stimulus:ev_reopen' => '重新打开',
'Class:NormalChange/Stimulus:ev_reopen+' => '',
'Class:NormalChange/Stimulus:ev_plan' => '计划',
'Class:NormalChange/Stimulus:ev_plan+' => '',
'Class:NormalChange/Stimulus:ev_approve' => '批准',
'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_implement' => '实施',
'Class:NormalChange/Stimulus:ev_implement+' => '',
'Class:NormalChange/Stimulus:ev_monitor' => '验收',
'Class:NormalChange/Stimulus:ev_monitor+' => '',
'Class:NormalChange/Stimulus:ev_finish' => '完成',
'Class:NormalChange/Stimulus:ev_finish+' => '',
));
//
// Class: EmergencyChange
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:EmergencyChange' => '紧急变更',
'Class:EmergencyChange+' => '',
'Class:EmergencyChange/Stimulus:ev_validate' => '同意',
'Class:EmergencyChange/Stimulus:ev_validate+' => '',
'Class:EmergencyChange/Stimulus:ev_reject' => '驳回',
'Class:EmergencyChange/Stimulus:ev_reject+' => '',
'Class:EmergencyChange/Stimulus:ev_assign' => '分配',
'Class:EmergencyChange/Stimulus:ev_assign+' => '',
'Class:EmergencyChange/Stimulus:ev_reopen' => '重新打开',
'Class:EmergencyChange/Stimulus:ev_reopen+' => '',
'Class:EmergencyChange/Stimulus:ev_plan' => '计划',
'Class:EmergencyChange/Stimulus:ev_plan+' => '',
'Class:EmergencyChange/Stimulus:ev_approve' => '批准',
'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_implement' => '实施',
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
'Class:EmergencyChange/Stimulus:ev_monitor' => '验收',
'Class:EmergencyChange/Stimulus:ev_monitor+' => '',
'Class:EmergencyChange/Stimulus:ev_finish' => '完成',
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
));
?>

View File

@@ -0,0 +1,145 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:ChangeManagement' => '变更管理',
'Menu:Change:Overview' => '概况',
'Menu:Change:Overview+' => '',
'Menu:NewChange' => '新建变更',
'Menu:NewChange+' => '新建变更',
'Menu:SearchChanges' => '搜索变更',
'Menu:SearchChanges+' => '搜索变更',
'Menu:Change:Shortcuts' => '快捷方式',
'Menu:Change:Shortcuts+' => '',
'Menu:WaitingAcceptance' => '等待审核的变更',
'Menu:WaitingAcceptance+' => '',
'Menu:WaitingApproval' => '等待批准的变更',
'Menu:WaitingApproval+' => '',
'Menu:Changes' => '所有打开的变更',
'Menu:Changes+' => '所有打开的变更',
'Menu:MyChanges' => '分配给我的变更',
'Menu:MyChanges+' => '分配给我的变更(作为办理人)',
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => '最近一周的变更(按类型)',
'UI-ChangeManagementOverview-Last-7-days' => '最近一周的变更(按数量)',
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => '最近一周的变更(按范围)',
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => '最近一周的变更(按状态)',
'Tickets:Related:OpenChanges' => '打开的变更',
'Tickets:Related:RecentChanges' => '最近的变更 (72小时)',
));
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: Change
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Change' => '变更',
'Class:Change+' => '',
'Class:Change/Attribute:status' => '状态',
'Class:Change/Attribute:status+' => '',
'Class:Change/Attribute:status/Value:new' => '新建',
'Class:Change/Attribute:status/Value:new+' => '',
'Class:Change/Attribute:status/Value:assigned' => '已分配',
'Class:Change/Attribute:status/Value:assigned+' => '',
'Class:Change/Attribute:status/Value:planned' => '已计划',
'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:closed' => '已关闭',
'Class:Change/Attribute:status/Value:closed+' => '',
'Class:Change/Attribute:category' => '类型',
'Class:Change/Attribute:category+' => '',
'Class:Change/Attribute:category/Value:application' => '应用',
'Class:Change/Attribute:category/Value:application+' => '应用',
'Class:Change/Attribute:category/Value:hardware' => '硬件',
'Class:Change/Attribute:category/Value:hardware+' => '硬件',
'Class:Change/Attribute:category/Value:network' => '网络',
'Class:Change/Attribute:category/Value:network+' => '网络',
'Class:Change/Attribute:category/Value:other' => '其他',
'Class:Change/Attribute:category/Value:other+' => '其他',
'Class:Change/Attribute:category/Value:software' => '软件',
'Class:Change/Attribute:category/Value:software+' => '软件',
'Class:Change/Attribute:category/Value:system' => '系统',
'Class:Change/Attribute:category/Value:system+' => '系统',
'Class:Change/Attribute:reject_reason' => '驳回原因',
'Class:Change/Attribute:reject_reason+' => '',
'Class:Change/Attribute:changemanager_id' => '变更经理',
'Class:Change/Attribute:changemanager_id+' => '',
'Class:Change/Attribute:changemanager_email' => '邮箱',
'Class:Change/Attribute:changemanager_email+' => '',
'Class:Change/Attribute:parent_id' => '父级变更',
'Class:Change/Attribute:parent_id+' => '',
'Class:Change/Attribute:parent_name' => '变更编号',
'Class:Change/Attribute:parent_name+' => '',
'Class:Change/Attribute:creation_date' => '创建日期',
'Class:Change/Attribute:creation_date+' => '',
'Class:Change/Attribute:approval_date' => '审批日期',
'Class:Change/Attribute:approval_date+' => '',
'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_incident_list' => '相关事件',
'Class:Change/Attribute:related_incident_list+' => '该变更相关的所有事件',
'Class:Change/Attribute:related_problems_list' => '相关问题',
'Class:Change/Attribute:related_problems_list+' => '该变更相关的所有问题',
'Class:Change/Attribute:child_changes_list' => '子变更',
'Class:Change/Attribute:child_changes_list+' => '该变更相关的所有子变更',
'Class:Change/Attribute:parent_id_friendlyname' => '父级变更昵称',
'Class:Change/Attribute:parent_id_friendlyname+' => '',
'Class:Change/Stimulus:ev_assign' => '分配',
'Class:Change/Stimulus:ev_assign+' => '',
'Class:Change/Stimulus:ev_plan' => '计划',
'Class:Change/Stimulus:ev_plan+' => '',
'Class:Change/Stimulus:ev_reject' => '驳回',
'Class:Change/Stimulus:ev_reject+' => '',
'Class:Change/Stimulus:ev_reopen' => '重新打开',
'Class:Change/Stimulus:ev_reopen+' => '',
'Class:Change/Stimulus:ev_approve' => '批准',
'Class:Change/Stimulus:ev_approve+' => '',
'Class:Change/Stimulus:ev_finish' => '关闭',
'Class:Change/Stimulus:ev_finish+' => '',
'Class:Change/Attribute:outage' => '停机',
'Class:Change/Attribute:outage+' => '',
'Class:Change/Attribute:outage/Value:no' => '否',
'Class:Change/Attribute:outage/Value:no+' => '',
'Class:Change/Attribute:outage/Value:yes' => '是',
'Class:Change/Attribute:outage/Value:yes+' => '',
));
?>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,21 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2013 Combodo
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:ConfigEditor' => '配置文件编辑器',
'config-edit-title' => '配置文件编辑器',
'config-edit-intro' => '编辑配置文件时一定要非常谨慎. 只有一些上级选项 (比如全局配置和模块配置) 可以修改.',
'config-apply' => '应用',
'config-cancel' => '重置',
'config-confirm-cancel' => '您的修改将被丢弃.',
'config-no-change' => '没有修改: 配置文件将保持不变.',
'config-parse-error' => '第 %2$d 行: %1$s.<br/> 配置文件尚未更新.',
'config-current-line' => '正在编辑第 %1$s 行',
));
?>

View File

@@ -0,0 +1,70 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2013 XXXXX
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
// 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: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>',
'iTopHub:GoBtn' => '进入iTop Hub',
'iTopHub:CloseBtn' => '关闭',
'iTopHub:GoBtn:Tooltip' => '跳到www.itophub.io',
'iTopHub:OpenInNewWindow' => '从新窗口打开iTop Hub',
'iTopHub:AutoSubmit' => '不再询问. 下次自动进入iTop Hub .',
'UI:About:RemoteExtensionSource' => 'iTop Hub',
'iTopHub:Explanation' => '点击这个按钮您将被引导至iTop Hub.',
'iTopHub:BackupFreeDiskSpaceIn' => '%1$s free disk space in %2$s.',
'iTopHub:FailedToCheckFreeDiskSpace' => '检查空闲的磁盘空间失败.',
'iTopHub:BackupOk' => '备份成功.',
'iTopHub:BackupFailed' => '备份失败!',
'iTopHub:Landing:Status' => '安装状态',
'iTopHub:Landing:Install' => '扩展安装进行中...',
'iTopHub:CompiledOK' => 'Compilation successful.',
'iTopHub:ConfigurationSafelyReverted' => '安装时发生错误!<br/>iTop 配置将不会改变.',
'iTopHub:InstalledExtensions' => '本机已安装的扩展',
'iTopHub:ExtensionCategory:Manual' => '手动安装的扩展',
'iTopHub:ExtensionCategory:Manual+' => '下列已安装的扩展是手动将文件放置到 %1$s 目录的:',
'iTopHub:ExtensionCategory:Remote' => '从iTop Hub 安装的扩展',
'iTopHub:ExtensionCategory:Remote+' => '下列已安装的扩展是来自iTop Hub:',
'iTopHub:NoExtensionInThisCategory' => '尚未安装扩展.<br/><br/>浏览iTop Hub ,去寻找符合您要求的扩展.',
'iTopHub:ExtensionNotInstalled' => '未安装',
'iTopHub:GetMoreExtensions' => '从iTop Hub 获取扩展...',
'iTopHub:LandingWelcome' => '恭喜! 下列来自iTop Hub 的扩展已被下载并安装到本机.',
'iTopHub:GoBackToITopBtn' => '返回iTop',
'iTopHub:Uncompressing' => '扩展解压中...',
'iTopHub:InstallationWelcome' => '安装来自iTop Hub 的扩展',
'iTopHub:DBBackupLabel' => '本机备份',
'iTopHub:DBBackupSentence' => '在升级之前,备份数据库和iTop 配置文件',
'iTopHub:DeployBtn' => '安装 !',
'iTopHub:DatabaseBackupProgress' => '本机备份...',
'iTopHub:InstallationEffect:Install' => 'Version: %1$s 将被安装.',
'iTopHub:InstallationEffect:NoChange' => 'Version: %1$s 已安装. 保持不变.',
'iTopHub:InstallationEffect:Upgrade' => '将从 version %1$s <b>升级</b> 到 version %2$s.',
'iTopHub:InstallationEffect:Downgrade' => '将从 version %1$s <b>降级</b> 到 version %2$s.',
'iTopHub:InstallationProgress:DatabaseBackup' => 'iTop 本机备份...',
'iTopHub:InstallationProgress:ExtensionsInstallation' => '安装扩展',
'iTopHub:InstallationEffect:MissingDependencies' => '扩展无法安装,因为未知的依赖.',
'iTopHub:InstallationEffect:MissingDependencies_Details' => '该扩展依赖模块: %1$s',
'iTopHub:InstallationProgress:InstallationSuccessful' => '安装成功!',
'iTopHub:InstallationStatus:Installed_Version' => '%1$s version: %2$s.',
'iTopHub:InstallationStatus:Installed' => '已安装',
'iTopHub:InstallationStatus:Version_NotInstalled' => 'Version %1$s <b>未</b> 安装.',
));

View File

@@ -0,0 +1,240 @@
<?php
// Copyright (C) 2010-2014 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:IncidentManagement' => '事件管理',
'Menu:IncidentManagement+' => '事件管理',
'Menu:Incident:Overview' => '概况',
'Menu:Incident:Overview+' => '概况',
'Menu:NewIncident' => '新建事件',
'Menu:NewIncident+' => '新建事件',
'Menu:SearchIncidents' => '搜索事件',
'Menu:SearchIncidents+' => '搜索事件',
'Menu:Incident:Shortcuts' => '快捷方式',
'Menu:Incident:Shortcuts+' => '',
'Menu:Incident:MyIncidents' => '分配给我的事件',
'Menu:Incident:MyIncidents+' => '分配给我的事件',
'Menu:Incident:EscalatedIncidents' => '已升级的事件',
'Menu:Incident:EscalatedIncidents+' => '已升级的事件',
'Menu:Incident:OpenIncidents' => '所有打开的事件',
'Menu:Incident:OpenIncidents+' => '所有打开的事件',
'UI-IncidentManagementOverview-IncidentByPriority-last-14-days' => '最近两周的事件(按优先级)',
'UI-IncidentManagementOverview-Last-14-days' => '最近两周的事件(按数量)',
'UI-IncidentManagementOverview-OpenIncidentByStatus' => '打开的事件(按状态)',
'UI-IncidentManagementOverview-OpenIncidentByAgent' => '打开的事件(按办理人)',
'UI-IncidentManagementOverview-OpenIncidentByCustomer' => '打开的事件(按客户)',
));
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: Incident
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Incident' => '事件',
'Class:Incident+' => '',
'Class:Incident/Attribute:status' => '状态',
'Class:Incident/Attribute:status+' => '',
'Class:Incident/Attribute:status/Value:new' => '新建',
'Class:Incident/Attribute:status/Value:new+' => '',
'Class:Incident/Attribute:status/Value:escalated_tto' => '已升级响应时间',
'Class:Incident/Attribute:status/Value:escalated_tto+' => '',
'Class:Incident/Attribute:status/Value:assigned' => '已分配',
'Class:Incident/Attribute:status/Value:assigned+' => '',
'Class:Incident/Attribute:status/Value:escalated_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:pending' => '待定',
'Class:Incident/Attribute:status/Value:pending+' => '',
'Class:Incident/Attribute:status/Value:resolved' => '已解决',
'Class:Incident/Attribute:status/Value:resolved+' => '',
'Class:Incident/Attribute:status/Value:closed' => '已关闭',
'Class:Incident/Attribute:status/Value:closed+' => '',
'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' => '服务',
'Class:Incident/Attribute:impact/Value:2+' => '',
'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/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: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:2' => '高',
'Class:Incident/Attribute:urgency/Value:2+' => '高',
'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:origin' => '来源',
'Class:Incident/Attribute:origin+' => '',
'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:phone' => '电话',
'Class:Incident/Attribute:origin/Value:phone+' => '电话',
'Class:Incident/Attribute:origin/Value:portal' => 'portal',
'Class:Incident/Attribute:origin/Value:portal+' => 'portal',
'Class:Incident/Attribute:service_id' => '服务',
'Class:Incident/Attribute:service_id+' => '',
'Class:Incident/Attribute:service_name' => '服务名称',
'Class:Incident/Attribute:service_name+' => '',
'Class:Incident/Attribute:servicesubcategory_id' => '子服务',
'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/Value:no' => '否',
'Class:Incident/Attribute:escalation_flag/Value:no+' => '否',
'Class:Incident/Attribute:escalation_flag/Value:yes' => '是',
'Class:Incident/Attribute:escalation_flag/Value:yes+' => '是',
'Class:Incident/Attribute:escalation_reason' => '热门',
'Class:Incident/Attribute:escalation_reason+' => '',
'Class:Incident/Attribute:assignment_date' => '分配日期',
'Class:Incident/Attribute:assignment_date+' => '',
'Class:Incident/Attribute:resolution_date' => '解决日期',
'Class:Incident/Attribute:resolution_date+' => '',
'Class:Incident/Attribute:last_pending_date' => '最近待定日期',
'Class:Incident/Attribute:last_pending_date+' => '',
'Class:Incident/Attribute:cumulatedpending' => '累计待定',
'Class:Incident/Attribute:cumulatedpending+' => '',
'Class:Incident/Attribute:tto' => '响应时间',
'Class:Incident/Attribute:tto+' => '',
'Class:Incident/Attribute:ttr' => '解决时间',
'Class:Incident/Attribute:ttr+' => '',
'Class:Incident/Attribute:tto_escalation_deadline' => '响应时间截止',
'Class:Incident/Attribute:tto_escalation_deadline+' => '',
'Class:Incident/Attribute:sla_tto_passed' => '超过SLA响应时间',
'Class:Incident/Attribute:sla_tto_passed+' => '',
'Class:Incident/Attribute:sla_tto_over' => 'SLA响应时间结束',
'Class:Incident/Attribute:sla_tto_over+' => '',
'Class:Incident/Attribute:ttr_escalation_deadline' => '解决时间截止',
'Class:Incident/Attribute:ttr_escalation_deadline+' => '',
'Class:Incident/Attribute:sla_ttr_passed' => '超过SLA解决时间',
'Class:Incident/Attribute:sla_ttr_passed+' => '',
'Class:Incident/Attribute:sla_ttr_over' => 'SLA解决时间结束',
'Class:Incident/Attribute:sla_ttr_over+' => '',
'Class:Incident/Attribute:time_spent' => '耗时',
'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' => 'bug 修复',
'Class:Incident/Attribute:resolution_code/Value:bug fixed+' => 'bug 修复',
'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: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: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_change_id' => '父级变更',
'Class:Incident/Attribute:parent_change_id+' => '',
'Class:Incident/Attribute:parent_change_ref' => '变更编号',
'Class:Incident/Attribute:parent_change_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:public_log+' => '',
'Class:Incident/Attribute:user_satisfaction' => '用户满意度',
'Class:Incident/Attribute:user_satisfaction+' => '',
'Class:Incident/Attribute:user_satisfaction/Value:1' => '非常满意',
'Class:Incident/Attribute:user_satisfaction/Value:1+' => '非常满意',
'Class:Incident/Attribute:user_satisfaction/Value:2' => '基本满意',
'Class:Incident/Attribute:user_satisfaction/Value:2+' => '基本满意',
'Class:Incident/Attribute:user_satisfaction/Value:3' => '不满意',
'Class:Incident/Attribute:user_satisfaction/Value:3+' => '不满意',
'Class:Incident/Attribute:user_satisfaction/Value:4' => '非常不满意',
'Class:Incident/Attribute:user_satisfaction/Value:4+' => '非常不满意',
'Class:Incident/Attribute:user_comment' => '用户评论',
'Class:Incident/Attribute:user_comment+' => '',
'Class:Incident/Attribute:parent_incident_id_friendlyname' => '好记的父级事件ID名称',
'Class:Incident/Attribute:parent_incident_id_friendlyname+' => '',
'Class:Incident/Stimulus:ev_assign' => '分配',
'Class:Incident/Stimulus:ev_assign+' => '',
'Class:Incident/Stimulus:ev_reassign' => '重新分配',
'Class:Incident/Stimulus:ev_reassign+' => '',
'Class:Incident/Stimulus:ev_pending' => '待定',
'Class:Incident/Stimulus:ev_pending+' => '',
'Class:Incident/Stimulus:ev_timeout' => '超时',
'Class:Incident/Stimulus:ev_timeout+' => '',
'Class:Incident/Stimulus:ev_autoresolve' => '自动解决',
'Class:Incident/Stimulus:ev_autoresolve+' => '',
'Class:Incident/Stimulus:ev_autoclose' => '自动关闭',
'Class:Incident/Stimulus:ev_autoclose+' => '',
'Class:Incident/Stimulus:ev_resolve' => '标记为已解决',
'Class:Incident/Stimulus:ev_resolve+' => '',
'Class:Incident/Stimulus:ev_close' => '关闭',
'Class:Incident/Stimulus:ev_close+' => '',
'Class:Incident/Stimulus:ev_reopen' => '重新打开',
'Class:Incident/Stimulus:ev_reopen+' => '',
'Class:Incident/Error:CannotAssignParentIncidentIdToSelf' => '不能分配父级事件给自己',
'Class:Incident/Method:ResolveChildTickets' => '解决子Ticket',
'Class:Incident/Method:ResolveChildTickets+' => '级联解决子Ticket(事件自动解决),和调整以下内容保持一至: 服务, 团队, 办理人, 解决方案',
'Tickets:Related:OpenIncidents' => '打开的事件',
));

View File

@@ -1,186 +0,0 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @author Robert Deng <denglx@gmail.com>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// 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>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// 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', '简体中文', array(
'Class:KnownError' => '已知错误',
'Class:KnownError+' => '被归档为已知议题的错误',
'Class:KnownError/Attribute:name' => '名称',
'Class:KnownError/Attribute:name+' => '',
'Class:KnownError/Attribute:org_id' => '客户',
'Class:KnownError/Attribute:org_id+' => '',
'Class:KnownError/Attribute:cust_name' => '客户',
'Class:KnownError/Attribute:cust_name+' => '',
'Class:KnownError/Attribute:problem_id' => '相关的问题',
'Class:KnownError/Attribute:problem_id+' => '',
'Class:KnownError/Attribute:problem_ref' => '参考',
'Class:KnownError/Attribute:problem_ref+' => '',
'Class:KnownError/Attribute:symptom' => '症状',
'Class:KnownError/Attribute:symptom+' => '',
'Class:KnownError/Attribute:root_cause' => '根源原因',
'Class:KnownError/Attribute:root_cause+' => '',
'Class:KnownError/Attribute:workaround' => '工作区',
'Class:KnownError/Attribute:workaround+' => '',
'Class:KnownError/Attribute:solution' => '方案',
'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/Value:Application' => '应用程序',
'Class:KnownError/Attribute:domain/Value:Application+' => '应用程序',
'Class:KnownError/Attribute:domain/Value:Desktop' => '桌面',
'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:vendor' => '卖主',
'Class:KnownError/Attribute:vendor+' => '',
'Class:KnownError/Attribute:model' => '型号',
'Class:KnownError/Attribute:model+' => '',
'Class:KnownError/Attribute:version' => '版本',
'Class:KnownError/Attribute:version+' => '',
'Class:KnownError/Attribute:ci_list' => 'CIs',
'Class:KnownError/Attribute:ci_list+' => '',
'Class:KnownError/Attribute:document_list' => '文档',
'Class:KnownError/Attribute:document_list+' => '',
));
//
// Class: lnkInfraError
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkInfraError' => 'InfraErrorLinks',
'Class:lnkInfraError+' => 'Infra related to a known error',
'Class:lnkInfraError/Attribute:infra_id' => 'CI',
'Class:lnkInfraError/Attribute:infra_id+' => '',
'Class:lnkInfraError/Attribute:infra_name' => 'CI 名称',
'Class:lnkInfraError/Attribute:infra_name+' => '',
'Class:lnkInfraError/Attribute:infra_status' => 'CI 状态',
'Class:lnkInfraError/Attribute:infra_status+' => '',
'Class:lnkInfraError/Attribute:error_id' => '错误',
'Class:lnkInfraError/Attribute:error_id+' => '',
'Class:lnkInfraError/Attribute:error_name' => '错误名称',
'Class:lnkInfraError/Attribute:error_name+' => '',
'Class:lnkInfraError/Attribute:reason' => '原因',
'Class:lnkInfraError/Attribute:reason+' => '',
));
//
// Class: lnkDocumentError
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkDocumentError' => 'DocumentsErrorLinks',
'Class:lnkDocumentError+' => '在文档和已知错误间的链接',
'Class:lnkDocumentError/Attribute:doc_id' => '文档',
'Class:lnkDocumentError/Attribute:doc_id+' => '',
'Class:lnkDocumentError/Attribute:doc_name' => '文档名称',
'Class:lnkDocumentError/Attribute:doc_name+' => '',
'Class:lnkDocumentError/Attribute:error_id' => '错误',
'Class:lnkDocumentError/Attribute:error_id+' => '',
'Class:lnkDocumentError/Attribute:error_name' => '错误名称',
'Class:lnkDocumentError/Attribute:error_name+' => '',
'Class:lnkDocumentError/Attribute:link_type' => '信息',
'Class:lnkDocumentError/Attribute:link_type+' => '',
));
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:ProblemManagement' => '问题管理',
'Menu:ProblemManagement+' => '问题管理',
'Menu:Problem:Shortcuts' => '快捷方式',
'Menu:NewError' => '新的已知错误',
'Menu:NewError+' => '新已知错误的创建',
'Menu:SearchError' => '搜索已知错误',
'Menu:SearchError+' => '搜索已知错误',
'Menu:Problem:KnownErrors' => '所有已知错误',
'Menu:Problem:KnownErrors+' => '所有已知错误',
'Class:lnkErrorToFunctionalCI' => 'Link Error / FunctionalCI~~',
'Class:lnkErrorToFunctionalCI+' => 'Infra related to a known error~~',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id' => 'CI~~',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name' => 'CI name~~',
'Class:lnkErrorToFunctionalCI/Attribute:error_id' => 'Error~~',
'Class:lnkErrorToFunctionalCI/Attribute:error_name' => 'Error name~~',
'Class:lnkErrorToFunctionalCI/Attribute:reason' => 'Reason~~',
'Class:lnkDocumentToError' => 'Link Documents / Errors~~',
'Class:lnkDocumentToError+' => 'A link between a document and a known error~~',
'Class:lnkDocumentToError/Attribute:document_id' => 'Document~~',
'Class:lnkDocumentToError/Attribute:document_name' => 'Document Name~~',
'Class:lnkDocumentToError/Attribute:error_id' => 'Error~~',
'Class:lnkDocumentToError/Attribute:error_name' => 'Error name~~',
'Class:lnkDocumentToError/Attribute:link_type' => 'link_type~~',
'Class:FAQ' => 'FAQ~~',
'Class:FAQ+' => 'Frequently asked questions~~',
'Class:FAQ/Attribute:title' => 'Title~~',
'Class:FAQ/Attribute:summary' => 'Summary~~',
'Class:FAQ/Attribute:description' => 'Description~~',
'Class:FAQ/Attribute:category_id' => 'Category~~',
'Class:FAQ/Attribute:category_name' => 'Category name~~',
'Class:FAQ/Attribute:error_code' => 'Error code~~',
'Class:FAQ/Attribute:key_words' => 'Key words~~',
'Class:FAQCategory' => 'FAQ Category~~',
'Class:FAQCategory+' => 'Category for FAQ~~',
'Class:FAQCategory/Attribute:name' => 'Name~~',
'Class:FAQCategory/Attribute:faq_list' => 'FAQs~~',
'Class:FAQCategory/Attribute:faq_list+' => 'All the frequently asked questions related to this category~~',
'Menu:FAQCategory' => 'FAQ categories~~',
'Menu:FAQCategory+' => 'All FAQ categories~~',
'Menu:FAQ' => 'FAQs~~',
'Menu:FAQ+' => 'All FAQs~~',
));
?>

View File

@@ -0,0 +1,192 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// 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>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// 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', '简体中文', array(
'Class:KnownError' => '已知错误',
'Class:KnownError+' => '记录一个已知错误',
'Class:KnownError/Attribute:name' => '名称',
'Class:KnownError/Attribute:name+' => '',
'Class:KnownError/Attribute:org_id' => '客户',
'Class:KnownError/Attribute:org_id+' => '',
'Class:KnownError/Attribute:cust_name' => '客户名称',
'Class:KnownError/Attribute:cust_name+' => '',
'Class:KnownError/Attribute:problem_id' => '相关问题',
'Class:KnownError/Attribute:problem_id+' => '',
'Class:KnownError/Attribute:problem_ref' => '问题编号',
'Class:KnownError/Attribute:problem_ref+' => '',
'Class:KnownError/Attribute:symptom' => '现象',
'Class:KnownError/Attribute:symptom+' => '',
'Class:KnownError/Attribute:root_cause' => '问题根源',
'Class:KnownError/Attribute:root_cause+' => '',
'Class:KnownError/Attribute:workaround' => '解决过程',
'Class:KnownError/Attribute:workaround+' => '',
'Class:KnownError/Attribute:solution' => '解决方案',
'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/Value:Application' => '应用',
'Class:KnownError/Attribute:domain/Value:Application+' => '应用',
'Class:KnownError/Attribute:domain/Value:Desktop' => '桌面',
'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:vendor' => '厂商',
'Class:KnownError/Attribute:vendor+' => '',
'Class:KnownError/Attribute:model' => '型号',
'Class:KnownError/Attribute:model+' => '',
'Class:KnownError/Attribute:version' => '版本',
'Class:KnownError/Attribute:version+' => '',
'Class:KnownError/Attribute:ci_list' => '配置项',
'Class:KnownError/Attribute:ci_list+' => '该已知错误相关的所有配置项',
'Class:KnownError/Attribute:document_list' => '文档',
'Class:KnownError/Attribute:document_list+' => '该已知错误相关的所有文档',
));
//
// Class: lnkErrorToFunctionalCI
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkErrorToFunctionalCI' => '关联 已知问题/功能配置项',
'Class:lnkErrorToFunctionalCI+' => '已知问题和功能配置项之间的关联',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id' => '配置项',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name' => '配置项名称',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:error_id' => '已知问题',
'Class:lnkErrorToFunctionalCI/Attribute:error_id+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:error_name' => '已知问题名称',
'Class:lnkErrorToFunctionalCI/Attribute:error_name+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:reason' => '原因',
'Class:lnkErrorToFunctionalCI/Attribute:reason+' => '',
));
//
// Class: lnkDocumentToError
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkDocumentToError' => '关联 文档/已知问题',
'Class:lnkDocumentToError+' => '文档和已知问题之间的关联',
'Class:lnkDocumentToError/Attribute:document_id' => '文档',
'Class:lnkDocumentToError/Attribute:document_id+' => '',
'Class:lnkDocumentToError/Attribute:document_name' => '文档名称',
'Class:lnkDocumentToError/Attribute:document_name+' => '',
'Class:lnkDocumentToError/Attribute:error_id' => '已知问题',
'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: FAQ
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:FAQ' => 'FAQ',
'Class:FAQ+' => 'FAQ',
'Class:FAQ/Attribute:title' => '标题',
'Class:FAQ/Attribute:title+' => '',
'Class:FAQ/Attribute:summary' => '概要',
'Class:FAQ/Attribute:summary+' => '',
'Class:FAQ/Attribute:description' => '描述',
'Class:FAQ/Attribute:description+' => '',
'Class:FAQ/Attribute:category_id' => '类别',
'Class:FAQ/Attribute:category_id+' => '',
'Class:FAQ/Attribute:category_name' => '类别名称',
'Class:FAQ/Attribute:category_name+' => '',
'Class:FAQ/Attribute:error_code' => '错误代码',
'Class:FAQ/Attribute:error_code+' => '',
'Class:FAQ/Attribute:key_words' => '关键字',
'Class:FAQ/Attribute:key_words+' => '',
));
//
// Class: FAQCategory
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:FAQCategory' => 'FAQ 类别',
'Class:FAQCategory+' => 'FAQ 类别',
'Class:FAQCategory/Attribute:name' => '名称',
'Class:FAQCategory/Attribute:name+' => '',
'Class:FAQCategory/Attribute:faq_list' => 'FAQ',
'Class:FAQCategory/Attribute:faq_list+' => '该类别FAQ 相关的所有常见问题',
));
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:ProblemManagement' => '问题管理',
'Menu:ProblemManagement+' => '问题管理',
'Menu:Problem:Shortcuts' => '快捷方式',
'Menu:NewError' => '新建已知问题',
'Menu:NewError+' => '新建已知问题',
'Menu:SearchError' => '搜索已知问题',
'Menu:SearchError+' => '搜索已知问题',
'Menu:Problem:KnownErrors' => '所有已知错误',
'Menu:Problem:KnownErrors+' => '所有已知错误',
'Menu:FAQCategory' => 'FAQ 类别',
'Menu:FAQCategory+' => '所有FAQ 类别',
'Menu:FAQ' => 'FAQ',
'Menu:FAQ+' => '所有FAQ',
'Brick:Portal:FAQ:Menu' => 'FAQ',
'Brick:Portal:FAQ:Title' => 'FAQ',
'Brick:Portal:FAQ:Title+' => '<p>需要帮助?</p><p>查阅列表中的常见问题,或许可以立即找到令您满意的答案.</p>',
));

View File

@@ -54,10 +54,10 @@ class BrowseBrickController extends BrickController
// Getting current browse mode (First from router pamater, then default brick value)
$sBrowseMode = (!empty($sBrowseMode)) ? $sBrowseMode : $oBrick->GetDefaultBrowseMode();
// Getting current dataloading mode (First from router parameter, then query parameter, then default brick value)
$sDataLoading = ($sDataLoading !== null) ? $sDataLoading : ( ($oRequest->query->get('sDataLoading') !== null) ? $oRequest->query->get('sDataLoading') : $oBrick->GetDataLoading() );
$sDataLoading = ($sDataLoading !== null) ? $sDataLoading : $oApp['request_manipulator']->ReadParam('sDataLoading', $oBrick->GetDataLoading());
// Getting search value
$sSearchValue = $oRequest->get('sSearchValue', null);
if ($sSearchValue !== null)
$sSearchValue = $oApp['request_manipulator']->ReadParam('sSearchValue', '');
if (!empty($sSearchValue))
{
$sDataLoading = AbstractBrick::ENUM_DATA_LOADING_LAZY;
}
@@ -112,7 +112,7 @@ class BrowseBrickController extends BrickController
// Adding search clause
// Note : For know the search is naive and looks only for the exact match. It doesn't search for words separately
if ($sSearchValue !== null)
if (!empty($sSearchValue))
{
// - Cleaning the search value by exploding and trimming spaces
$aSearchValues = explode(' ', $sSearchValue);
@@ -185,7 +185,7 @@ class BrowseBrickController extends BrickController
{
$aLevelsProperties[$aLevelsPropertiesKeys[$i]]['search']->SetSelectedClasses($aLevelsClasses);
if ($sSearchValue !== null)
if (!empty($sSearchValue))
{
// Note : This could be way more simpler if we had a SetInternalParam($sParam, $value) verb
$aQueryParams = $aLevelsProperties[$aLevelsPropertiesKeys[$i]]['search']->GetInternalParams();
@@ -219,8 +219,8 @@ class BrowseBrickController extends BrickController
{
case BrowseBrick::ENUM_BROWSE_MODE_LIST:
// Retrieving parameters
$iPageNumber = (int) $oRequest->get('iPageNumber', 1);
$iListLength = (int) $oRequest->get('iListLength', BrowseBrick::DEFAULT_LIST_LENGTH);
$iPageNumber = (int) $oApp['request_manipulator']->ReadParam('iPageNumber', 1, FILTER_SANITIZE_NUMBER_INT);
$iListLength = (int) $oApp['request_manipulator']->ReadParam('iListLength', BrowseBrick::DEFAULT_LIST_LENGTH, FILTER_SANITIZE_NUMBER_INT);
// Getting total records number
$oCountSet = new DBObjectSet($oQuery);
@@ -235,8 +235,8 @@ class BrowseBrickController extends BrickController
case BrowseBrick::ENUM_BROWSE_MODE_TREE:
case BrowseBrick::ENUM_BROWSE_MODE_MOSAIC:
// Retrieving parameters
$sLevelAlias = $oRequest->get('sLevelAlias');
$sNodeId = $oRequest->get('sNodeId');
$sLevelAlias = $oApp['request_manipulator']->ReadParam('sLevelAlias', '');
$sNodeId = $oApp['request_manipulator']->ReadParam('sNodeId', '');
// If no values for those parameters, we might be loading page in lazy mode for the first time, therefore the URL doesn't have those informations.
if (empty($sLevelAlias))
@@ -634,8 +634,9 @@ class BrowseBrickController extends BrickController
if ($aLevelsProperties[$key][$sOptionalAttribute] !== null)
{
$sPropertyName = substr($sOptionalAttribute, 0, -4);
$oAttDef = MetaModel::GetAttributeDef(get_class($value), $aLevelsProperties[$key][$sOptionalAttribute]);
$tmpAttValue = $value->Get($aLevelsProperties[$key][$sOptionalAttribute]);
$tmpAttValue = $value->GetAsHTML($aLevelsProperties[$key][$sOptionalAttribute]);
if($sOptionalAttribute === 'image_att')
{
if (is_object($tmpAttValue) && !$tmpAttValue->IsEmpty())
@@ -644,7 +645,7 @@ class BrowseBrickController extends BrickController
}
else
{
$tmpAttValue = MetaModel::GetAttributeDef(get_class($value), $aLevelsProperties[$key][$sOptionalAttribute])->Get('default_image');
$tmpAttValue = $oAttDef->Get('default_image');
}
}
@@ -658,7 +659,7 @@ class BrowseBrickController extends BrickController
foreach ($aLevelsProperties[$key]['fields'] as $aField)
{
$oAttDef = MetaModel::GetAttributeDef(get_class($value), $aField['code']);
$aRow[$key]['fields'][$aField['code']] = $oAttDef->GetValueLabel($value->Get($aField['code']));
$aRow[$key]['fields'][$aField['code']] = $oAttDef->GetAsHTML($value->Get($aField['code']));
}
}
}
@@ -726,8 +727,9 @@ class BrowseBrickController extends BrickController
if ($aLevelsProperties[$aCurrentRowKeys[0]][$sOptionalAttribute] !== null)
{
$sPropertyName = substr($sOptionalAttribute, 0, -4);
$oAttDef = MetaModel::GetAttributeDef(get_class($aCurrentRowValues[0]), $aLevelsProperties[$aCurrentRowKeys[0]][$sOptionalAttribute]);
$tmpAttValue = $aCurrentRowValues[0]->Get($aLevelsProperties[$aCurrentRowKeys[0]][$sOptionalAttribute]);
$tmpAttValue = $aCurrentRowValues[0]->GetAsHTML($aLevelsProperties[$aCurrentRowKeys[0]][$sOptionalAttribute]);
if($sOptionalAttribute === 'image_att')
{
if (is_object($tmpAttValue) && !$tmpAttValue->IsEmpty())
@@ -736,7 +738,7 @@ class BrowseBrickController extends BrickController
}
else
{
$tmpAttValue = MetaModel::GetAttributeDef(get_class($aCurrentRowValues[0]), $aLevelsProperties[$aCurrentRowKeys[0]][$sOptionalAttribute])->Get('default_image');
$tmpAttValue = $oAttDef->Get('default_image');
}
}

View File

@@ -31,6 +31,7 @@ use \AttributeDate;
use \AttributeDateTime;
use \AttributeDuration;
use \AttributeSubItem;
use \AttributeImage;
use \DBSearch;
use \DBObjectSearch;
use \DBObjectSet;
@@ -63,9 +64,9 @@ class ManageBrickController extends BrickController
$aQueries = array();
// Getting current dataloading mode (First from router parameter, then query parameter, then default brick value)
$sDataLoading = ($sDataLoading !== null) ? $sDataLoading : ( ($oRequest->get('sDataLoading') !== null) ? $oRequest->get('sDataLoading') : $oBrick->GetDataLoading() );
$sDataLoading = ($sDataLoading !== null) ? $sDataLoading : $oApp['request_manipulator']->ReadParam('sDataLoading', $oBrick->GetDataLoading());
// Getting search value
$sSearchValue = $oRequest->get('sSearchValue', null);
$sSearchValue = $oApp['request_manipulator']->ReadParam('sSearchValue', '');
// Getting area columns properties
$aColumnsAttrs = $oBrick->GetFields();
@@ -201,7 +202,7 @@ class ManageBrickController extends BrickController
}
}
// - Retrieving the current grouping tab to display and altering the query to do so
if ($sGroupingTab === null)
if (empty($sGroupingTab))
{
if ($oBrick->HasGroupingTabs())
{
@@ -209,7 +210,7 @@ class ManageBrickController extends BrickController
$sGroupingTab = key($aGroupingTabsValues);
if ($aGroupingTabsValues[$sGroupingTab]['condition'] !== null)
{
$oQuery = $oQuery->Intersect($aGroupingTabsValues[$sGroupingTab]['condition']);
$oQuery = $aGroupingTabsValues[$sGroupingTab]['condition']->DeepClone();
}
}
else
@@ -221,7 +222,7 @@ class ManageBrickController extends BrickController
{
if ($aGroupingTabsValues[$sGroupingTab]['condition'] !== null)
{
$oQuery = $oQuery->Intersect($aGroupingTabsValues[$sGroupingTab]['condition']);
$oQuery = $aGroupingTabsValues[$sGroupingTab]['condition']->DeepClone();
}
}
@@ -281,9 +282,9 @@ class ManageBrickController extends BrickController
}
}
// - Retrieving the grouping areas to display
$sGroupingArea = $oRequest->get('sGroupingArea');
$sGroupingArea = $oApp['request_manipulator']->ReadParam('sGroupingArea');
// - If specified or lazy loading, we trunc the $aGroupingAreasValues to keep only this one
if ($sGroupingArea !== null)
if (!empty($sGroupingArea))
{
$aGroupingAreasValues = array($sGroupingArea => $aGroupingAreasValues[$sGroupingArea]);
}
@@ -293,8 +294,7 @@ class ManageBrickController extends BrickController
$oAreaQuery = DBSearch::CloneWithAlias($oQuery, $sParentAlias);
if ($aGroupingAreasValue['condition'] !== null)
{
//$oAreaQuery->AddConditionExpression($aGroupingAreasValue['condition']);
$oAreaQuery = $oAreaQuery->Intersect($aGroupingAreasValue['condition']);
$oAreaQuery = $aGroupingAreasValue['condition']->DeepClone();
}
// Restricting query to allowed scope on each classes
@@ -343,8 +343,8 @@ class ManageBrickController extends BrickController
if ($sDataLoading === AbstractBrick::ENUM_DATA_LOADING_LAZY)
{
// Retrieving parameters
$iPageNumber = (int) $oRequest->get('iPageNumber', 1);
$iListLength = (int) $oRequest->get('iListLength', ManageBrick::DEFAULT_LIST_LENGTH);
$iPageNumber = (int) $oApp['request_manipulator']->ReadParam('iPageNumber', 1);
$iListLength = (int) $oApp['request_manipulator']->ReadParam('iListLength', ManageBrick::DEFAULT_LIST_LENGTH);
// Getting total records number
$oCountSet = new DBObjectSet($oQuery);
@@ -389,7 +389,7 @@ class ManageBrickController extends BrickController
{
// Set properties
$sCurrentClass = $sKey;
// Defining which attribute will open the edition form)
$sMainActionAttrCode = $aColumnsAttrs[0];
@@ -445,36 +445,46 @@ class ManageBrickController extends BrickController
}
}
/** @var AttributeDefinition $oAttDef */
$oAttDef = MetaModel::GetAttributeDef($sCurrentClass, $sItemAttr);
if ($oAttDef->IsExternalKey())
{
$sValue = $oCurrentRow->Get($sItemAttr . '_friendlyname');
// Adding a view action on the external keys
if ($oCurrentRow->Get($sItemAttr) !== $oAttDef->GetNullValue())
/** @var AttributeDefinition $oAttDef */
$oAttDef = MetaModel::GetAttributeDef($sCurrentClass, $sItemAttr);
if ($oAttDef->IsExternalKey())
{
// Checking if we can view the object
if ((SecurityHelper::IsActionAllowed($oApp, UR_ACTION_READ, $oAttDef->GetTargetClass(), $oCurrentRow->Get($sItemAttr))))
$sValue = $oCurrentRow->GetAsHTML($sItemAttr.'_friendlyname');
// Adding a view action on the external keys
if ($oCurrentRow->Get($sItemAttr) !== $oAttDef->GetNullValue())
{
$aActions[] = array(
'type' => ManageBrick::ENUM_ACTION_VIEW,
'class' => $oAttDef->GetTargetClass(),
'id' => $oCurrentRow->Get($sItemAttr),
'opening_target' => $oBrick->GetOpeningTarget(),
);
// Checking if we can view the object
if ((SecurityHelper::IsActionAllowed($oApp, UR_ACTION_READ, $oAttDef->GetTargetClass(),
$oCurrentRow->Get($sItemAttr))))
{
$aActions[] = array(
'type' => ManageBrick::ENUM_ACTION_VIEW,
'class' => $oAttDef->GetTargetClass(),
'id' => $oCurrentRow->Get($sItemAttr),
'opening_target' => $oBrick->GetOpeningTarget(),
);
}
}
}
}
elseif ($oAttDef instanceof AttributeSubItem || $oAttDef instanceof AttributeDuration)
{
$sValue = $oAttDef->GetAsHTML($oCurrentRow->Get($sItemAttr));
}
else
{
$sValue = $oAttDef->GetValueLabel($oCurrentRow->Get($sItemAttr));
}
unset($oAttDef);
elseif ($oAttDef instanceof AttributeImage)
{
$oOrmDoc = $oCurrentRow->Get($sItemAttr);
if (is_object($oOrmDoc) && !$oOrmDoc->IsEmpty())
{
$sUrl = $oApp['url_generator']->generate('p_object_document_display', array('sObjectClass' => get_class($oCurrentRow), 'sObjectId' => $oCurrentRow->GetKey(), 'sObjectField' => $sItemAttr, 'cache' => 86400));
}
else
{
$sUrl = $oAttDef->Get('default_image');
}
$sValue = '<img src="' . $sUrl . '" />';
}
else
{
$sValue = $oAttDef->GetAsHTML($oCurrentRow->Get($sItemAttr));
}
unset($oAttDef);
$aItemAttrs[$sItemAttr] = array(
'att_code' => $sItemAttr,
@@ -502,7 +512,7 @@ class ManageBrickController extends BrickController
}
}
}
// ... And item's properties
$aItems[] = array(
'id' => $oCurrentRow->GetKey(),

View File

@@ -1,6 +1,6 @@
<?php
// Copyright (C) 2010-2017 Combodo SARL
// Copyright (C) 2010-2018 Combodo SARL
//
// This file is part of iTop.
//
@@ -42,6 +42,7 @@ use \ScalarExpression;
use \DBObjectSet;
use \cmdbAbstractObject;
use \AttributeEnum;
use \AttributeImage;
use \AttributeFinalClass;
use \AttributeFriendlyName;
use \UserRights;
@@ -63,6 +64,8 @@ class ObjectController extends AbstractController
const ENUM_MODE_VIEW = 'view';
const ENUM_MODE_EDIT = 'edit';
const ENUM_MODE_CREATE = 'create';
const DEFAULT_PAGE_NUMBER = 1;
const DEFAULT_LIST_LENGTH = 10;
/**
@@ -99,6 +102,8 @@ class ObjectController extends AbstractController
$oApp->abort(404, Dict::S('UI:ObjectDoesNotExist'));
}
$sOperation = $oApp['request_manipulator']->ReadParam('operation', '');
$aData = array('sMode' => 'view');
$aData['form'] = $this->HandleForm($oRequest, $oApp, $aData['sMode'], $sObjectClass, $sObjectId);
$aData['form']['title'] = Dict::Format('Brick:Portal:Object:Form:View:Title', MetaModel::GetName($sObjectClass), $oObject->GetName());
@@ -119,7 +124,7 @@ class ObjectController extends AbstractController
if ($oRequest->isXmlHttpRequest())
{
// We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form.
if ($oRequest->request->get('operation') === null)
if (empty($sOperation))
{
$oResponse = $oApp['twig']->render('itop-portal-base/portal/src/views/bricks/object/modal.html.twig', $aData);
}
@@ -131,8 +136,8 @@ class ObjectController extends AbstractController
else
{
// Adding brick if it was passed
$sBrickId = $oRequest->get('sBrickId');
if ($sBrickId !== null)
$sBrickId = $oApp['request_manipulator']->ReadParam('sBrickId', '');
if (!empty($sBrickId))
{
$oBrick = ApplicationHelper::GetLoadedBrickFromId($oApp, $sBrickId);
if ($oBrick !== null)
@@ -174,6 +179,8 @@ class ObjectController extends AbstractController
$oApp->abort(404, Dict::S('UI:ObjectDoesNotExist'));
}
$sOperation = $oApp['request_manipulator']->ReadParam('operation', '');
$aData = array('sMode' => 'edit');
$aData['form'] = $this->HandleForm($oRequest, $oApp, $aData['sMode'], $sObjectClass, $sObjectId);
$aData['form']['title'] = Dict::Format('Brick:Portal:Object:Form:Edit:Title', MetaModel::GetName($sObjectClass), $aData['form']['object_name']);
@@ -182,7 +189,7 @@ class ObjectController extends AbstractController
if ($oRequest->isXmlHttpRequest())
{
// We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form.
if ($oRequest->request->get('operation') === null)
if (empty($sOperation))
{
$oResponse = $oApp['twig']->render('itop-portal-base/portal/src/views/bricks/object/modal.html.twig', $aData);
}
@@ -194,8 +201,8 @@ class ObjectController extends AbstractController
else
{
// Adding brick if it was passed
$sBrickId = $oRequest->get('sBrickId');
if ($sBrickId !== null)
$sBrickId = $oApp['request_manipulator']->ReadParam('sBrickId', '');
if (!empty($sBrickId))
{
$oBrick = ApplicationHelper::GetLoadedBrickFromId($oApp, $sBrickId);
if ($oBrick !== null)
@@ -227,6 +234,8 @@ class ObjectController extends AbstractController
$oApp->abort(404, Dict::S('UI:ObjectDoesNotExist'));
}
$sOperation = $oApp['request_manipulator']->ReadParam('operation', '');
$aData = array('sMode' => 'create');
$aData['form'] = $this->HandleForm($oRequest, $oApp, $aData['sMode'], $sObjectClass);
$aData['form']['title'] = Dict::Format('Brick:Portal:Object:Form:Create:Title', MetaModel::GetName($sObjectClass));
@@ -235,7 +244,7 @@ class ObjectController extends AbstractController
if ($oRequest->isXmlHttpRequest())
{
// We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form.
if ($oRequest->request->get('operation') === null)
if (empty($sOperation))
{
$oResponse = $oApp['twig']->render('itop-portal-base/portal/src/views/bricks/object/modal.html.twig', $aData);
}
@@ -247,8 +256,8 @@ class ObjectController extends AbstractController
else
{
// Adding brick if it was passed
$sBrickId = $oRequest->get('sBrickId');
if ($sBrickId !== null)
$sBrickId = $oApp['request_manipulator']->ReadParam('sBrickId', '');
if (!empty($sBrickId))
{
$oBrick = ApplicationHelper::GetLoadedBrickFromId($oApp, $sBrickId);
if ($oBrick !== null)
@@ -349,7 +358,7 @@ class ObjectController extends AbstractController
}
// Retrieving request parameters
$sOperation = $oRequest->request->get('operation');
$sOperation = $oApp['request_manipulator']->ReadParam('operation', '');
// Retrieving form properties
$aStimuliForms = ApplicationHelper::GetLoadedFormFromClass($oApp, $sObjectClass, 'apply_stimulus');
@@ -384,7 +393,7 @@ class ObjectController extends AbstractController
// TODO : This is a ugly patch to avoid showing a modal with a readonly form to the user as it would prevent user from finishing the transition.
// Instead, we apply the stimulus directly here and then go to the edited object.
if ($sOperation === null)
if (empty($sOperation))
{
if (isset($aData['form']['editable_fields_count']) && $aData['form']['editable_fields_count'] === 0)
{
@@ -392,7 +401,7 @@ class ObjectController extends AbstractController
$oSubRequest = $oRequest;
$oSubRequest->request->set('operation', 'submit');
$oSubRequest->request->set('stimulus_code', null);
$oSubRequest->request->set('stimulus_code', '');
$aData = array('sMode' => 'apply_stimulus');
$aData['form'] = $this->HandleForm($oSubRequest, $oApp, $aData['sMode'], $sObjectClass, $sObjectId, $aFormProperties);
@@ -407,7 +416,7 @@ class ObjectController extends AbstractController
if ($oRequest->isXmlHttpRequest())
{
// We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form.
if ($sOperation === null)
if (empty($sOperation))
{
$oResponse = $oApp['twig']->render('itop-portal-base/portal/src/views/bricks/object/modal.html.twig', $aData);
}
@@ -431,9 +440,8 @@ class ObjectController extends AbstractController
public static function HandleForm(Request $oRequest, Application $oApp, $sMode, $sObjectClass, $sObjectId = null, $aFormProperties = null)
{
$aFormData = array();
$oRequestParams = $oRequest->request;
$sOperation = $oRequestParams->get('operation');
$bModal = ($oRequest->isXmlHttpRequest() && ($oRequest->request->get('operation') === null) );
$sOperation = $oApp['request_manipulator']->ReadParam('operation', '');
$bModal = ($oRequest->isXmlHttpRequest() && empty($sOperation));
// - Retrieve form properties
if ($aFormProperties === null)
@@ -442,14 +450,14 @@ class ObjectController extends AbstractController
}
// - Create and
if ($sOperation === null)
if (empty($sOperation))
{
// Retrieving action rules
//
// Note : The action rules must be a base64-encoded JSON object, this is just so users are tempted to changes values.
// But it would not be a security issue as it only presets values in the form.
$sActionRulesToken = $oRequest->get('ar_token');
$aActionRules = ($sActionRulesToken !== null) ? ContextManipulatorHelper::DecodeRulesToken($sActionRulesToken) : array();
$sActionRulesToken = $oApp['request_manipulator']->ReadParam('ar_token', '');
$aActionRules = (!empty($sActionRulesToken)) ? ContextManipulatorHelper::DecodeRulesToken($sActionRulesToken) : array();
// Preparing object
if ($sObjectId === null)
@@ -552,9 +560,9 @@ class ObjectController extends AbstractController
else
{
// Update / Submit / Cancel
$sFormManagerClass = $oRequestParams->get('formmanager_class');
$sFormManagerData = $oRequestParams->get('formmanager_data');
if ($sFormManagerClass === null || $sFormManagerData === null)
$sFormManagerClass = $oApp['request_manipulator']->ReadParam('formmanager_class', '', FILTER_UNSAFE_RAW);
$sFormManagerData = $oApp['request_manipulator']->ReadParam('formmanager_data', '', FILTER_UNSAFE_RAW);
if ( empty($sFormManagerClass) || empty($sFormManagerData) )
{
IssueLog::Error(__METHOD__ . ' at line ' . __LINE__ . ' : Parameters formmanager_class and formamanager_data must be defined.');
$oApp->abort(500, 'Parameters formmanager_class and formmanager_data must be defined.');
@@ -576,13 +584,13 @@ class ObjectController extends AbstractController
{
case 'submit':
// Applying modification to object
$aFormData['validation'] = $oFormManager->OnSubmit(array('currentValues' => $oRequestParams->get('current_values'), 'attachmentIds' => $oRequest->get('attachment_ids'), 'formProperties' => $aFormProperties, 'applyStimulus' => $oRequestParams->get('apply_stimulus')));
$aFormData['validation'] = $oFormManager->OnSubmit(array('currentValues' => $oApp['request_manipulator']->ReadParam('current_values', array(), FILTER_UNSAFE_RAW), 'attachmentIds' => $oApp['request_manipulator']->ReadParam('attachment_ids', array(), FILTER_UNSAFE_RAW), 'formProperties' => $aFormProperties, 'applyStimulus' => $oApp['request_manipulator']->ReadParam('apply_stimulus', null)));
if ($aFormData['validation']['valid'] === true)
{
// Note : We don't use $sObjectId there as it can be null if we are creating a new one. Instead we use the id from the created object once it has been seralized
// Check if stimulus has to be applied
$sStimulusCode = ($oRequestParams->get('stimulus_code') !== null && $oRequestParams->get('stimulus_code') !== '') ? $oRequestParams->get('stimulus_code') : null;
if ($sStimulusCode !== null)
$sStimulusCode = $oApp['request_manipulator']->ReadParam('stimulus_code', '');
if (!empty($sStimulusCode))
{
$aFormData['validation']['redirection'] = array(
'url' => $oApp['url_generator']->generate('p_object_apply_stimulus', array('sObjectClass' => $sObjectClass, 'sObjectId' => $oFormManager->GetObject()->GetKey(), 'sStimulusCode' => $sStimulusCode)),
@@ -600,7 +608,7 @@ class ObjectController extends AbstractController
break;
case 'update':
$oFormManager->OnUpdate(array('currentValues' => $oRequestParams->get('current_values'), 'formProperties' => $aFormProperties));
$oFormManager->OnUpdate(array('currentValues' => $oApp['request_manipulator']->ReadParam('current_values', array(), FILTER_UNSAFE_RAW), 'formProperties' => $aFormProperties));
break;
case 'cancel':
@@ -619,11 +627,11 @@ class ObjectController extends AbstractController
// Preparing fields list regarding the operation
if ($sOperation === 'update')
{
$aRequestedFields = $oRequestParams->get('requested_fields');
$sFormPath = $oRequestParams->get('form_path');
$aRequestedFields = $oApp['request_manipulator']->ReadParam('requested_fields', array(), FILTER_UNSAFE_RAW);
$sFormPath = $oApp['request_manipulator']->ReadParam('form_path', '');
// Checking if the update was on a subform, if so we need to make the rendering for that part only
if ($sFormPath !== null && $sFormPath !== $oFormManager->GetForm()->GetId())
if ( !empty($sFormPath) && $sFormPath !== $oFormManager->GetForm()->GetId() )
{
$oSubForm = $oFormManager->GetForm()->FindSubForm($sFormPath);
$oSubFormRenderer = new BsFormRenderer($oSubForm);
@@ -708,8 +716,8 @@ class ObjectController extends AbstractController
//
// Note : The action rules must be a base64-encoded JSON object, this is just so users are tempted to changes values.
// But it would not be a security issue as it only presets values in the form.
$sActionRulesToken = $oRequest->get('ar_token');
$aActionRules = ($sActionRulesToken !== null) ? ContextManipulatorHelper::DecodeRulesToken($sActionRulesToken) : array();
$sActionRulesToken = $oApp['request_manipulator']->ReadParam('ar_token', '');
$aActionRules = (!empty($sActionRulesToken)) ? ContextManipulatorHelper::DecodeRulesToken($sActionRulesToken) : array();
// Preparing object
$oApp['context_manipulator']->PrepareObject($aActionRules, $oHostObject);
}
@@ -717,7 +725,7 @@ class ObjectController extends AbstractController
// Updating host object with form data / values
$sFormManagerClass = $aRequestContent['formmanager_class'];
$sFormManagerData = $aRequestContent['formmanager_data'];
if ($sFormManagerClass !== null && $sFormManagerData !== null)
if (!empty($sFormManagerClass) && !empty($sFormManagerData))
{
$oFormManager = $sFormManagerClass::FromJSON($sFormManagerData);
$oFormManager->SetApplication($oApp);
@@ -829,7 +837,7 @@ class ObjectController extends AbstractController
'sTargetAttCode' => $sTargetAttCode,
'sHostObjectClass' => $sHostObjectClass,
'sHostObjectId' => $sHostObjectId,
'sActionRulesToken' => $oRequest->get('ar_token')
'sActionRulesToken' => $oApp['request_manipulator']->ReadParam('ar_token', ''),
);
// Checking security layers
@@ -852,16 +860,15 @@ class ObjectController extends AbstractController
//
// Note : The action rules must be a base64-encoded JSON object, this is just so users are tempted to changes values.
// But it would not be a security issue as it only presets values in the form.
$aActionRules = ($aData['sActionRulesToken'] !== null) ? ContextManipulatorHelper::DecodeRulesToken($aData['sActionRulesToken']) : array();
$aActionRules = !empty($aData['sActionRulesToken']) ? ContextManipulatorHelper::DecodeRulesToken($aData['sActionRulesToken']) : array();
// Preparing object
$oApp['context_manipulator']->PrepareObject($aActionRules, $oHostObject);
}
// Updating host object with form data / values
$oRequestParams = $oRequest->request;
$sFormManagerClass = $oRequestParams->get('formmanager_class');
$sFormManagerData = $oRequestParams->get('formmanager_data');
if ($sFormManagerClass !== null && $sFormManagerData !== null)
$sFormManagerClass = $oApp['request_manipulator']->ReadParam('formmanager_class', '', FILTER_UNSAFE_RAW);
$sFormManagerData = $oApp['request_manipulator']->ReadParam('formmanager_data', '', FILTER_UNSAFE_RAW);
if ( !empty($sFormManagerClass) && !empty($sFormManagerData) )
{
$oFormManager = $sFormManagerClass::FromJSON($sFormManagerData);
$oFormManager->SetApplication($oApp);
@@ -877,18 +884,18 @@ class ObjectController extends AbstractController
}
// Updating host object
$oFormManager->OnUpdate(array('currentValues' => $oRequestParams->get('current_values')));
$oFormManager->OnUpdate(array('currentValues' => $oApp['request_manipulator']->ReadParam('current_values', array(), FILTER_UNSAFE_RAW)));
$oHostObject = $oFormManager->GetObject();
}
// Retrieving request parameters
$iPageNumber = ($oRequest->get('iPageNumber') !== null) ? $oRequest->get('iPageNumber') : 1;
$iListLength = ($oRequest->get('iListLength') !== null) ? $oRequest->get('iListLength') : static::DEFAULT_LIST_LENGTH;
$bInitalPass = ($oRequest->get('draw') === null) ? true : false;
$sQuery = $oRequest->get('sSearchValue');
$sFormPath = $oRequest->get('sFormPath');
$sFieldId = $oRequest->get('sFieldId');
$aObjectIdsToIgnore = $oRequest->get('aObjectIdsToIgnore');
$iPageNumber = $oApp['request_manipulator']->ReadParam('iPageNumber', static::DEFAULT_PAGE_NUMBER, FILTER_SANITIZE_NUMBER_INT);
$iListLength = $oApp['request_manipulator']->ReadParam('iListLength', static::DEFAULT_LIST_LENGTH, FILTER_SANITIZE_NUMBER_INT);
$bInitalPass = $oApp['request_manipulator']->HasParam('draw') ? false : true;
$sQuery = $oApp['request_manipulator']->ReadParam('sSearchValue', '');
$sFormPath = $oApp['request_manipulator']->ReadParam('sFormPath', '');
$sFieldId = $oApp['request_manipulator']->ReadParam('sFieldId', '');
$aObjectIdsToIgnore = $oApp['request_manipulator']->ReadParam('aObjectIdsToIgnore', null, FILTER_UNSAFE_RAW);
// Building search query
// - Retrieving target object class from attcode
@@ -969,7 +976,7 @@ class ObjectController extends AbstractController
// - Adding query condition
$aInternalParams['this'] = $oHostObject;
if ($sQuery !== null)
if (!empty($sQuery))
{
$oFullExpr = null;
for ($i = 0; $i < count($aAttCodes); $i++)
@@ -1344,9 +1351,9 @@ class ObjectController extends AbstractController
}
// Retrieving ormDocument's host object
$sObjectClass = $oRequest->get('sObjectClass');
$sObjectId = $oRequest->get('sObjectId');
$sObjectField = $oRequest->get('sObjectField');
$sObjectClass = $oApp['request_manipulator']->ReadParam('sObjectClass', '');
$sObjectId = $oApp['request_manipulator']->ReadParam('sObjectId', '');
$sObjectField = $oApp['request_manipulator']->ReadParam('sObjectField', '');
// When reaching to an Attachment, we have to check security on its host object instead of the Attachment itself
if($sObjectClass === 'Attachment')
@@ -1386,8 +1393,7 @@ class ObjectController extends AbstractController
}
else
{
$sCache = $oRequest->get('cache');
$iCacheSec = ($sCache !== null) ? (int) $sCache : 0;
$iCacheSec = $oApp['request_manipulator']->ReadParam('cache', 0, FILTER_SANITIZE_NUMBER_INT);
}
$aHeaders = array();
@@ -1413,7 +1419,7 @@ class ObjectController extends AbstractController
* Handles attachment add/remove on an object
*
* Note: This is inspired from itop-attachment/ajax.attachment.php
*
*
* @param Request $oRequest
* @param Application $oApp
*/
@@ -1428,16 +1434,16 @@ class ObjectController extends AbstractController
// Retrieving sOperation from request only if it wasn't forced (determined by the route)
if ($sOperation === null)
{
$sOperation = $oRequest->get('operation');
$sOperation = $oApp['request_manipulator']->ReadParam('operation', null);
}
switch ($sOperation)
{
case 'add':
$sFieldName = $oRequest->get('field_name');
$sObjectClass = $oRequest->get('object_class');
$sTempId = $oRequest->get('temp_id');
$sFieldName = $oApp['request_manipulator']->ReadParam('field_name', '');
$sObjectClass = $oApp['request_manipulator']->ReadParam('object_class', '');
$sTempId = $oApp['request_manipulator']->ReadParam('temp_id', '');
if (($sObjectClass === null) || ($sTempId === null))
if (empty($sObjectClass) || empty($sTempId))
{
$aData['error'] = Dict::Format('UI:Error:2ParametersMissing', 'object_class', 'temp_id');
}
@@ -1476,7 +1482,7 @@ class ObjectController extends AbstractController
// - Route
$aRouteParams = array(
'sObjectClass' => 'Attachment',
'sObjectId' => $oRequest->get('sAttachmentId'),
'sObjectId' => $oApp['request_manipulator']->ReadParam('sAttachmentId', null),
'sObjectField' => 'contents',
);
$sRedirectRoute = $oApp['url_generator']->generate('p_object_document_download', $aRouteParams);
@@ -1511,10 +1517,10 @@ class ObjectController extends AbstractController
$aData = array();
// Retrieving parameters
$sObjectClass = $oRequest->Get('sObjectClass');
$aObjectIds = $oRequest->Get('aObjectIds');
$aObjectAttCodes = $oRequest->Get('aObjectAttCodes');
if ($sObjectClass === null || $aObjectIds === null || $aObjectAttCodes === null)
$sObjectClass = $oApp['request_manipulator']->ReadParam('sObjectClass', '');
$aObjectIds = $oApp['request_manipulator']->ReadParam('aObjectIds', array(), FILTER_UNSAFE_RAW);
$aObjectAttCodes = $oApp['request_manipulator']->ReadParam('aObjectAttCodes', array(), FILTER_UNSAFE_RAW);
if ( empty($sObjectClass) || empty($aObjectIds) || empty($aObjectAttCodes) )
{
IssueLog::Info(__METHOD__ . ' at line ' . __LINE__ . ' : sObjectClass, sObjectId and aObjectAttCodes expected, "' . $sObjectClass . '", "' . $sObjectId . '" given.');
$oApp->abort(500, 'Invalid request data, some informations are missing');
@@ -1582,7 +1588,7 @@ class ObjectController extends AbstractController
if ($oAttDef->IsExternalKey())
{
$aAttData['value'] = $oObject->Get($oAttDef->GetCode() . '_friendlyname');
$aAttData['value'] = $oObject->GetAsHTML($oAttDef->GetCode() . '_friendlyname');
// Checking if user can access object's external key
if (SecurityHelper::IsActionAllowed($oApp, UR_ACTION_READ, $oAttDef->GetTargetClass()))
@@ -1595,9 +1601,22 @@ class ObjectController extends AbstractController
// We skip it
continue;
}
elseif ($oAttDef instanceof AttributeImage)
{
$oOrmDoc = $oObject->Get($oAttDef->GetCode());
if (is_object($oOrmDoc) && !$oOrmDoc->IsEmpty())
{
$sUrl = $oApp['url_generator']->generate('p_object_document_display', array('sObjectClass' => get_class($oObject), 'sObjectId' => $oObject->GetKey(), 'sObjectField' => $oAttDef->GetCode(), 'cache' => 86400));
}
else
{
$sUrl = $oAttDef->Get('default_image');
}
$aAttData['value'] = '<img src="' . $sUrl . '" />';
}
else
{
$aAttData['value'] = $oAttDef->GetValueLabel($oObject->Get($oAttDef->GetCode()));
$aAttData['value'] = $oAttDef->GetAsHTML($oObject->Get($oAttDef->GetCode()));
if ($oAttDef instanceof AttributeFriendlyName)
{

View File

@@ -71,7 +71,7 @@ class UserProfileBrickController extends BrickController
// If this is ajax call, we are just submiting preferences or password forms
if ($oRequest->isXmlHttpRequest())
{
$aCurrentValues = $oRequest->request->get('current_values');
$aCurrentValues = $oApp['request_manipulator']->ReadParam('current_values', array(), FILTER_UNSAFE_RAW);
$sFormType = $aCurrentValues['form_type'];
if ($sFormType === PreferencesFormManager::FORM_TYPE)
{
@@ -120,10 +120,9 @@ class UserProfileBrickController extends BrickController
public function HandlePreferencesForm(Request $oRequest, Application $oApp, $sFormMode)
{
$aFormData = array();
$oRequestParams = $oRequest->request;
// Handling form
$sOperation = $oRequestParams->get('operation');
$sOperation = $oApp['request_manipulator']->ReadParam('operation', null);
// - Create
if ($sOperation === null)
{
@@ -143,8 +142,8 @@ class UserProfileBrickController extends BrickController
// - Submit
else if ($sOperation === 'submit')
{
$sFormManagerClass = $oRequestParams->get('formmanager_class');
$sFormManagerData = $oRequestParams->get('formmanager_data');
$sFormManagerClass = $oApp['request_manipulator']->ReadParam('formmanager_class', null, FILTER_UNSAFE_RAW);
$sFormManagerData = $oApp['request_manipulator']->ReadParam('formmanager_data', null, FILTER_UNSAFE_RAW);
if ($sFormManagerClass === null || $sFormManagerData === null)
{
IssueLog::Error(__METHOD__ . ' at line ' . __LINE__ . ' : Parameters formmanager_class and formamanager_data must be defined.');
@@ -154,7 +153,7 @@ class UserProfileBrickController extends BrickController
// Rebuilding manager from json
$oFormManager = $sFormManagerClass::FromJSON($sFormManagerData);
// Applying modification to object
$aFormData['validation'] = $oFormManager->OnSubmit(array('currentValues' => $oRequestParams->get('current_values')));
$aFormData['validation'] = $oFormManager->OnSubmit(array('currentValues' => $oApp['request_manipulator']->ReadParam('current_values', array(), FILTER_UNSAFE_RAW)));
// Reloading page only if preferences were changed
if (($aFormData['validation']['valid'] === true) && !empty($aFormData['validation']['messages']['success']))
{
@@ -188,10 +187,9 @@ class UserProfileBrickController extends BrickController
public function HandlePasswordForm(Request $oRequest, Application $oApp)
{
$aFormData = array();
$oRequestParams = $oRequest->request;
// Handling form
$sOperation = $oRequestParams->get('operation');
$sOperation = $oApp['request_manipulator']->ReadParam('operation', null);
// - Create
if ($sOperation === null)
{
@@ -206,8 +204,8 @@ class UserProfileBrickController extends BrickController
// - Submit
else if ($sOperation === 'submit')
{
$sFormManagerClass = $oRequestParams->get('formmanager_class');
$sFormManagerData = $oRequestParams->get('formmanager_data');
$sFormManagerClass = $oApp['request_manipulator']->ReadParam('formmanager_class', null, FILTER_UNSAFE_RAW);
$sFormManagerData = $oApp['request_manipulator']->ReadParam('formmanager_data', null, FILTER_UNSAFE_RAW);
if ($sFormManagerClass === null || $sFormManagerData === null)
{
IssueLog::Error(__METHOD__ . ' at line ' . __LINE__ . ' : Parameters formmanager_class and formamanager_data must be defined.');
@@ -217,7 +215,7 @@ class UserProfileBrickController extends BrickController
// Rebuilding manager from json
$oFormManager = $sFormManagerClass::FromJSON($sFormManagerData);
// Applying modification to object
$aFormData['validation'] = $oFormManager->OnSubmit(array('currentValues' => $oRequestParams->get('current_values')));
$aFormData['validation'] = $oFormManager->OnSubmit(array('currentValues' => $oApp['request_manipulator']->ReadParam('current_values', array(), FILTER_UNSAFE_RAW)));
}
else
{
@@ -244,11 +242,10 @@ class UserProfileBrickController extends BrickController
public function HandlePictureForm(Request $oRequest, Application $oApp, $sFormMode)
{
$aFormData = array();
$oRequestParams = $oRequest->request;
$sPictureAttCode = 'picture';
// Handling form
$sOperation = $oRequestParams->get('operation');
$sOperation = $oApp['request_manipulator']->ReadParam('operation', null);
// - No operation specified
if ($sOperation === null)
{

View File

@@ -0,0 +1,119 @@
<?php
/**
* Copyright (C) 2012-2018 Combodo SARL
*
* 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
* along with iTop. If not, see <http://www.gnu.org/licenses/>
*/
namespace Combodo\iTop\Portal\Helper;
use Symfony\Component\HttpFoundation\RequestStack;
/**
* RequestManipulatorHelper class
*
* Handle basic requests manipulation.
*
* @author Guillaume Lajarige <guillaume.lajarige@combodo.com>
* @since 2.5.1
*/
class RequestManipulatorHelper
{
/** @var \Symfony\Component\HttpFoundation\RequestStack $oRequestStack */
protected $oRequestStack;
/**
* RequestManipulatorHelper constructor.
*
* @param \Symfony\Component\HttpFoundation\RequestStack $oRequestStack
*/
public function __construct(RequestStack &$oRequestStack)
{
$this->oRequestStack = $oRequestStack;
}
/**
* @return \Symfony\Component\HttpFoundation\Request
*/
public function GetCurrentRequest()
{
return $this->oRequestStack->getCurrentRequest();
}
/**
* Returns if the request has a $sKey parameter.
* This looks in the GET arguments first, then PATH and finally the POST data.
*
* @param string $sKey
*
* @return bool
*/
public function HasParam($sKey)
{
if ($this->GetCurrentRequest()->query->has($sKey))
{
return true;
}
if ($this->GetCurrentRequest()->attributes->has($sKey))
{
return true;
}
if ($this->GetCurrentRequest()->request->has($sKey))
{
return true;
}
return false;
}
/**
* Returns the $sKey parameter from the request filtered with $iFilter.
* This looks in the GET arguments first, then the PATH and finally the POST data.
*
* Note: It is inspired by the \Symfony\Component\HttpFoundation\ParameterBag::filter() function and was necessary as we sometimes have parameters that can be either in the GET/PATH/POST arguments and need to be filtered. Silex only offer the possibility to filter parameter from a single ParameterBag, so we created this helper.
*
* @param string $sKey
* @param mixed $default
* @param int $iFilter Default is FILTER_SANITIZE_STRING
*
* @return mixed|null
*
* @since 2.5.1
*/
public function ReadParam($sKey, $default = null, $iFilter = FILTER_SANITIZE_STRING)
{
if ($this->GetCurrentRequest()->query->has($sKey))
{
return $this->GetCurrentRequest()->query->filter($sKey, $default, $iFilter);
}
if ($this->GetCurrentRequest()->attributes->has($sKey))
{
return $this->GetCurrentRequest()->attributes->filter($sKey, $default, $iFilter);
}
if ($this->GetCurrentRequest()->request->has($sKey))
{
return $this->GetCurrentRequest()->request->filter($sKey, $default, $iFilter);
}
return $default;
}
}

View File

@@ -0,0 +1,60 @@
<?php
/**
* Copyright (C) 2012-2018 Combodo SARL
*
* 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
* along with iTop. If not, see <http://www.gnu.org/licenses/>
*/
namespace Combodo\iTop\Portal\Provider;
use Silex\Application;
use Silex\ServiceProviderInterface;
use Combodo\iTop\Portal\Helper\RequestManipulatorHelper;
/**
* RequestManipulatorHelper service provider
*
* @author Guillaume Lajarige <guillaume.lajarige@combodo.com>
* @since 2.4.3
*/
class RequestManipulatorServiceProvider implements ServiceProviderInterface
{
/**
* @param \Silex\Application $oApp
*/
public function register(Application $oApp)
{
$oApp['request_manipulator'] = $oApp->share(function ($oApp)
{
$oApp->flush();
$oRequestManipulatorHelper = new RequestManipulatorHelper($oApp['request_stack']);
return $oRequestManipulatorHelper;
});
}
/**
* @param \Silex\Application $oApp
*/
public function boot(Application $oApp)
{
}
}

View File

@@ -36,6 +36,8 @@ require_once __DIR__ . '/../src/providers/urlgeneratorserviceprovider.class.inc.
require_once __DIR__ . '/../src/helpers/urlgeneratorhelper.class.inc.php';
require_once __DIR__ . '/../src/providers/contextmanipulatorserviceprovider.class.inc.php';
require_once __DIR__ . '/../src/helpers/contextmanipulatorhelper.class.inc.php';
require_once __DIR__ . '/../src/providers/requestmanipulatorserviceprovider.class.inc.php';
require_once __DIR__ . '/../src/helpers/requestmanipulatorhelper.class.inc.php';
require_once __DIR__ . '/../src/providers/scopevalidatorserviceprovider.class.inc.php';
require_once __DIR__ . '/../src/helpers/scopevalidatorhelper.class.inc.php';
require_once __DIR__ . '/../src/providers/lifecyclevalidatorserviceprovider.class.inc.php';
@@ -97,6 +99,9 @@ $oApp->before(function(Symfony\Component\HttpFoundation\Request $oRequest, Silex
$oApp->abort(500, Dict::S('Portal:ErrorNoContactForThisUser'));
}
// Register request manipulator now that the request has been created.
$oApp->register(new Combodo\iTop\Portal\Provider\RequestManipulatorServiceProvider());
// Enable archived data
utils::InitArchiveMode();

View File

@@ -0,0 +1,131 @@
<?php
// Copyright (C) 2010-2015 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
// Portal
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Page:DefaultTitle' => 'iTop 用户门户',
'Page:PleaseWait' => '请稍后...',
'Page:Home' => '主页',
'Page:GoPortalHome' => '主页面',
'Page:GoPreviousPage' => '上一页',
'Page:ReloadPage' => '重新加载',
'Portal:Button:Submit' => '提交',
'Portal:Button:Apply' => '更新',
'Portal:Button:Cancel' => '取消',
'Portal:Button:Close' => '关闭',
'Portal:Button:Add' => '添加',
'Portal:Button:Remove' => '移除',
'Portal:Button:Delete' => '删除',
'Portal:EnvironmentBanner:Title' => '您目前处于 <strong>%1$s</strong> 模式',
'Portal:EnvironmentBanner:GoToProduction' => '回到产品模式',
'Error:HTTP:401' => '认证',
'Error:HTTP:404' => '页面找不到',
'Error:HTTP:500' => 'Oops! 发生了一个错误.',
'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:Info' => '第 _PAGE_ 页,共 _PAGES_ 页',
'Portal:Datatables:Language:InfoEmpty' => '没有信息',
'Portal:Datatables:Language:InfoFiltered' => 'filtered out of _MAX_ items',
'Portal:Datatables:Language:EmptyTable' => '表格中没有数据',
'Portal:Datatables:Language:DisplayLength:All' => '全部',
'Portal:Datatables:Language:Paginate:First' => '首页',
'Portal:Datatables:Language:Paginate:Previous' => '上一页',
'Portal:Datatables:Language:Paginate:Next' => '下一页',
'Portal:Datatables:Language:Paginate:Last' => '尾页',
'Portal:Datatables:Language:Sort:Ascending' => '升序排序',
'Portal:Datatables:Language:Sort:Descending' => '降序排序',
'Portal:Autocomplete:NoResult' => '没有数据',
'Portal:Attachments:DropZone:Message' => '把文件添加为附件',
'Portal:File:None' => '没有文件',
'Portal:File:DisplayInfo' => '<a href="%2$s" class="file_download_link">%1$s</a>',
'Portal:File:DisplayInfo+' => '%1$s (%2$s) <a href="%3$s" class="file_open_link" target="_blank">Open</a> / <a href="%4$s" class="file_download_link">Download</a>',
));
// UserProfile brick
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Brick:Portal:UserProfile:Name' => '用户资料',
'Brick:Portal:UserProfile:Navigation:Dropdown:MyProfil' => '我的资料',
'Brick:Portal:UserProfile:Navigation:Dropdown:Logout' => '注销',
'Brick:Portal:UserProfile:Password:Title' => '密码',
'Brick:Portal:UserProfile:Password:ChoosePassword' => '新密码',
'Brick:Portal:UserProfile:Password:ConfirmPassword' => '确认密码',
'Brick:Portal:UserProfile:Password:CantChangeContactAdministrator' => '要修改密码,请联系管理员',
'Brick:Portal:UserProfile:Password:CantChangeForUnknownReason' => '无法修改密码, 请联系管理员',
'Brick:Portal:UserProfile:PersonalInformations:Title' => '个体信息',
'Brick:Portal:UserProfile:Photo:Title' => '头像',
));
// BrowseBrick brick
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Brick:Portal:Browse:Name' => '浏览项目',
'Brick:Portal:Browse:Mode:List' => '列表',
'Brick:Portal:Browse:Mode:Tree' => '树形',
'Brick:Portal:Browse:Mode:Mosaic' => '嵌套',
'Brick:Portal:Browse:Action:Drilldown' => '明细',
'Brick:Portal:Browse:Action:View' => '详情',
'Brick:Portal:Browse:Action:Edit' => '编辑',
'Brick:Portal:Browse:Action:Create' => '新建',
'Brick:Portal:Browse:Action:CreateObjectFromThis' => '新建 %1$s',
'Brick:Portal:Browse:Tree:ExpandAll' => '全部展开',
'Brick:Portal:Browse:Tree:CollapseAll' => '全部收起',
'Brick:Portal:Browse:Filter:NoData' => '没有项目',
));
// ManageBrick brick
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Brick:Portal:Manage:Name' => '管理项目',
'Brick:Portal:Manage:Table:NoData' => '没有项目.',
'Brick:Portal:Manage:Table:ItemActions' => 'Actions',
));
// ObjectBrick brick
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Brick:Portal:Object:Name' => '对象',
'Brick:Portal:Object:Form:Create:Title' => '新建 %1$s',
'Brick:Portal:Object:Form:Edit:Title' => '正在更新 %2$s (%1$s)',
'Brick:Portal:Object:Form:View:Title' => '%1$s : %2$s',
'Brick:Portal:Object:Form:Stimulus:Title' => 'Please, fill the following informations:',
'Brick:Portal:Object:Form:Message:Saved' => '已保存',
'Brick:Portal:Object:Search:Regular:Title' => '选择 %1$s (%2$s)',
'Brick:Portal:Object:Search:Hierarchy:Title' => '选择 %1$s (%2$s)',
));
// CreateBrick brick
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Brick:Portal:Create:Name' => '快速创建',
'Brick:Portal:Create:ChooseType' => 'Please, choose a type',
));
// Filter brick
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Brick:Portal:Filter:Name' => 'Prefilter a brick',
'Brick:Portal:Filter:SearchInput:Placeholder' => '例如. 连接 wifi',
'Brick:Portal:Filter:SearchInput:Submit' => '搜素',
));

View File

@@ -66,14 +66,14 @@ Dict::Add('EN US', 'English', 'English', array(
'Menu:Problem:MyProblems+' => 'My problems',
'Menu:Problem:OpenProblems' => 'All open problems',
'Menu:Problem:OpenProblems+' => 'All open problems',
'UI-ProblemManagementOverview-ProblemByService' => 'Problems by service',
'UI-ProblemManagementOverview-ProblemByService+' => 'Problems by service',
'UI-ProblemManagementOverview-ProblemByPriority' => 'Problems by priority',
'UI-ProblemManagementOverview-ProblemByPriority+' => 'Problems by priority',
'UI-ProblemManagementOverview-ProblemUnassigned' => 'Unassigned problems',
'UI-ProblemManagementOverview-ProblemUnassigned+' => 'Unassigned problems',
'UI:ProblemMgmtMenuOverview:Title' => 'Dashboard for Problem Management',
'UI:ProblemMgmtMenuOverview:Title+' => 'Dashboard for Problem Management',
'UI-ProblemManagementOverview-ProblemByService' => 'Problems by service',
'UI-ProblemManagementOverview-ProblemByService+' => 'Problems by service',
'UI-ProblemManagementOverview-ProblemByPriority' => 'Problems by priority',
'UI-ProblemManagementOverview-ProblemByPriority+' => 'Problems by priority',
'UI-ProblemManagementOverview-ProblemUnassigned' => 'Unassigned problems',
'UI-ProblemManagementOverview-ProblemUnassigned+' => 'Unassigned problems',
'UI:ProblemMgmtMenuOverview:Title' => 'Dashboard for Problem Management',
'UI:ProblemMgmtMenuOverview:Title+' => 'Dashboard for Problem Management',
));
//

View File

@@ -1,177 +0,0 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @author Robert Deng <denglx@gmail.com>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// 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>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// 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', '简体中文', array(
'Menu:ProblemManagement' => '问题管理',
'Menu:ProblemManagement+' => '问题管理',
'Menu:Problem:Overview' => '概览',
'Menu:Problem:Overview+' => '概览',
'Menu:NewProblem' => '新问题',
'Menu:NewProblem+' => '新问题',
'Menu:SearchProblems' => '搜索问题',
'Menu:SearchProblems+' => '搜索问题',
'Menu:Problem:Shortcuts' => '快捷方式',
'Menu:Problem:MyProblems' => '我的问题',
'Menu:Problem:MyProblems+' => '我的问题',
'Menu:Problem:OpenProblems' => '所有待解决的问题',
'Menu:Problem:OpenProblems+' => '所有待解决的问题',
'UI-ProblemManagementOverview-ProblemByService' => '按服务划分的问题',
'UI-ProblemManagementOverview-ProblemByService+' => '按服务划分的问题',
'UI-ProblemManagementOverview-ProblemByPriority' => '按优先级划分的问题',
'UI-ProblemManagementOverview-ProblemByPriority+' => '按优先级划分的问题',
'UI-ProblemManagementOverview-ProblemUnassigned' => '未指派的问题',
'UI-ProblemManagementOverview-ProblemUnassigned+' => '未指派的问题',
'UI:ProblemMgmtMenuOverview:Title' => '问题管理仪表板',
'UI:ProblemMgmtMenuOverview:Title+' => '问题管理仪表板',
));
//
// Class: Problem
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Problem' => '问题',
'Class:Problem+' => '',
'Class:Problem/Attribute:status' => '状态',
'Class:Problem/Attribute:status+' => '',
'Class:Problem/Attribute:status/Value:new' => '新',
'Class:Problem/Attribute:status/Value:new+' => '',
'Class:Problem/Attribute:status/Value:assigned' => '已指派',
'Class:Problem/Attribute:status/Value:assigned+' => '',
'Class:Problem/Attribute:status/Value:resolved' => '已解决',
'Class:Problem/Attribute:status/Value:resolved+' => '',
'Class:Problem/Attribute:status/Value:closed' => '已关闭',
'Class:Problem/Attribute:status/Value:closed+' => '',
'Class:Problem/Attribute:org_id' => '客户',
'Class:Problem/Attribute:org_id+' => '',
'Class:Problem/Attribute:org_name' => '名称',
'Class:Problem/Attribute:org_name+' => '常用名称',
'Class:Problem/Attribute:service_id' => '服务',
'Class:Problem/Attribute:service_id+' => '',
'Class:Problem/Attribute:service_name' => '名称',
'Class:Problem/Attribute:service_name+' => '',
'Class:Problem/Attribute:servicesubcategory_id' => '服务类目',
'Class:Problem/Attribute:servicesubcategory_id+' => '',
'Class:Problem/Attribute:servicesubcategory_name' => '名称',
'Class:Problem/Attribute:servicesubcategory_name+' => '',
'Class:Problem/Attribute:product' => '生产',
'Class:Problem/Attribute:product+' => '',
'Class:Problem/Attribute:impact' => '影响',
'Class:Problem/Attribute:impact+' => '',
'Class:Problem/Attribute:impact/Value:1' => '个人',
'Class:Problem/Attribute:impact/Value:1+' => '',
'Class:Problem/Attribute:impact/Value:2' => '服务',
'Class:Problem/Attribute:impact/Value:2+' => '',
'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/Value:2' => '中',
'Class:Problem/Attribute:urgency/Value:2+' => '中',
'Class:Problem/Attribute:urgency/Value:3' => '高',
'Class:Problem/Attribute:urgency/Value:3+' => '高',
'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:2' => '中',
'Class:Problem/Attribute:priority/Value:2+' => '',
'Class:Problem/Attribute:priority/Value:3' => '高',
'Class:Problem/Attribute:priority/Value:3+' => '',
'Class:Problem/Attribute:workgroup_id' => '工作组',
'Class:Problem/Attribute:workgroup_id+' => '',
'Class:Problem/Attribute:workgroup_name' => '名称',
'Class:Problem/Attribute:workgroup_name+' => '',
'Class:Problem/Attribute:agent_id' => '办理人',
'Class:Problem/Attribute:agent_id+' => '',
'Class:Problem/Attribute:agent_name' => '办理人名称',
'Class:Problem/Attribute:agent_name+' => '',
'Class:Problem/Attribute:agent_email' => '办理人 Email',
'Class:Problem/Attribute:agent_email+' => '',
'Class:Problem/Attribute:related_change_id' => '关联变更',
'Class:Problem/Attribute:related_change_id+' => '',
'Class:Problem/Attribute:related_change_ref' => '参考',
'Class:Problem/Attribute:related_change_ref+' => '',
'Class:Problem/Attribute:close_date' => '关闭日期',
'Class:Problem/Attribute:close_date+' => '',
'Class:Problem/Attribute:last_update' => '最后的更新',
'Class:Problem/Attribute:last_update+' => '',
'Class:Problem/Attribute:assignment_date' => '指派日期',
'Class:Problem/Attribute:assignment_date+' => '',
'Class:Problem/Attribute:resolution_date' => '解决日期',
'Class:Problem/Attribute:resolution_date+' => '',
'Class:Problem/Attribute:knownerrors_list' => '已知错误',
'Class:Problem/Attribute:knownerrors_list+' => '',
'Class:Problem/Stimulus:ev_assign' => '指派',
'Class:Problem/Stimulus:ev_assign+' => '',
'Class:Problem/Stimulus:ev_reassign' => '重新指派',
'Class:Problem/Stimulus:ev_reassign+' => '',
'Class:Problem/Stimulus:ev_resolve' => '解决',
'Class:Problem/Stimulus:ev_resolve+' => '',
'Class:Problem/Stimulus:ev_close' => '关闭',
'Class:Problem/Stimulus:ev_close+' => '',
'Class:Problem/Attribute:urgency/Value:4' => 'low~~',
'Class:Problem/Attribute:urgency/Value:4+' => 'low~~',
'Class:Problem/Attribute:priority/Value:4' => 'Low~~',
'Class:Problem/Attribute:priority/Value:4+' => 'Low~~',
'Class:Problem/Attribute:related_request_list' => 'Related requests~~',
'Class:Problem/Attribute:related_request_list+' => 'All the requests that are related to this problem~~',
'Class:Problem/Attribute:related_incident_list' => 'Related incidents~~',
'Class:Problem/Attribute:related_incident_list+' => 'All the incidents that are related to this problem~~',
));
?>

View File

@@ -0,0 +1,158 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
* @author Robert Deng <denglx@gmail.com>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// 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>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// 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', '简体中文', array(
'Menu:ProblemManagement' => '问题管理',
'Menu:ProblemManagement+' => '问题管理',
'Menu:Problem:Overview' => '概况',
'Menu:Problem:Overview+' => '概况',
'Menu:NewProblem' => '新建问题',
'Menu:NewProblem+' => '新建问题',
'Menu:SearchProblems' => '搜索问题',
'Menu:SearchProblems+' => '搜索问题',
'Menu:Problem:Shortcuts' => '快捷方式',
'Menu:Problem:MyProblems' => '我的问题',
'Menu:Problem:MyProblems+' => '我的问题',
'Menu:Problem:OpenProblems' => '所有打开的问题',
'Menu:Problem:OpenProblems+' => '所有打开的问题',
'UI-ProblemManagementOverview-ProblemByService' => '按服务划分的问题',
'UI-ProblemManagementOverview-ProblemByService+' => '按服务划分的问题',
'UI-ProblemManagementOverview-ProblemByPriority' => '按优先级划分的问题',
'UI-ProblemManagementOverview-ProblemByPriority+' => '按优先级划分的问题',
'UI-ProblemManagementOverview-ProblemUnassigned' => '未分配的问题',
'UI-ProblemManagementOverview-ProblemUnassigned+' => '未分配的问题',
'UI:ProblemMgmtMenuOverview:Title' => '问题管理仪表盘',
'UI:ProblemMgmtMenuOverview:Title+' => '问题管理仪表盘',
));
//
// Class: Problem
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Problem' => '问题',
'Class:Problem+' => '',
'Class:Problem/Attribute:status' => '状态',
'Class:Problem/Attribute:status+' => '',
'Class:Problem/Attribute:status/Value:new' => '新建',
'Class:Problem/Attribute:status/Value:new+' => '',
'Class:Problem/Attribute:status/Value:assigned' => '已分配',
'Class:Problem/Attribute:status/Value:assigned+' => '',
'Class:Problem/Attribute:status/Value:resolved' => '已解决',
'Class:Problem/Attribute:status/Value:resolved+' => '',
'Class:Problem/Attribute:status/Value:closed' => '已关闭',
'Class:Problem/Attribute:status/Value:closed+' => '',
'Class:Problem/Attribute:service_id' => '服务',
'Class:Problem/Attribute:service_id+' => '',
'Class:Problem/Attribute:service_name' => '服务名称',
'Class:Problem/Attribute:service_name+' => '',
'Class:Problem/Attribute:servicesubcategory_id' => '子服务',
'Class:Problem/Attribute:servicesubcategory_id+' => '',
'Class:Problem/Attribute:servicesubcategory_name' => '子服务名称',
'Class:Problem/Attribute:servicesubcategory_name+' => '',
'Class:Problem/Attribute:product' => '产品',
'Class:Problem/Attribute:product+' => '',
'Class:Problem/Attribute:impact' => '影响范围',
'Class:Problem/Attribute:impact+' => '',
'Class:Problem/Attribute:impact/Value:1' => '部门',
'Class:Problem/Attribute:impact/Value:1+' => '',
'Class:Problem/Attribute:impact/Value:2' => '服务',
'Class:Problem/Attribute:impact/Value:2+' => '',
'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/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: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:2' => '高',
'Class:Problem/Attribute:priority/Value:2+' => '高',
'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:related_change_id' => '相关变更',
'Class:Problem/Attribute:related_change_id+' => '',
'Class:Problem/Attribute:related_change_ref' => '变更编号',
'Class:Problem/Attribute:related_change_ref+' => '',
'Class:Problem/Attribute:assignment_date' => '分配日期',
'Class:Problem/Attribute:assignment_date+' => '',
'Class:Problem/Attribute:resolution_date' => '解决日期',
'Class:Problem/Attribute:resolution_date+' => '',
'Class:Problem/Attribute:knownerrors_list' => '已知问题',
'Class:Problem/Attribute:knownerrors_list+' => '该问题相关的所有已知问题',
'Class:Problem/Attribute:related_request_list' => '相关需求',
'Class:Problem/Attribute:related_request_list+' => '该问题相关的所有需求',
'Class:Problem/Attribute:related_incident_list' => '相关事件',
'Class:Problem/Attribute:related_incident_list+' => '该问题相关的所有事件',
'Class:Problem/Stimulus:ev_assign' => '分配',
'Class:Problem/Stimulus:ev_assign+' => '',
'Class:Problem/Stimulus:ev_reassign' => '重新分配',
'Class:Problem/Stimulus:ev_reassign+' => '',
'Class:Problem/Stimulus:ev_resolve' => '解决',
'Class:Problem/Stimulus:ev_resolve+' => '',
'Class:Problem/Stimulus:ev_close' => '关闭',
'Class:Problem/Stimulus:ev_close+' => '',
));
?>

View File

@@ -0,0 +1,267 @@
<?php
// Copyright (C) 2010-2014 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:RequestManagement' => '服务台',
'Menu:RequestManagement+' => '服务台',
'Menu:RequestManagementProvider' => 'Helpdesk provider',
'Menu:RequestManagementProvider+' => 'Helpdesk provider',
'Menu:UserRequest:Provider' => 'Open request transfered to provider',
'Menu:UserRequest:Provider+' => 'Open request transfered to provider',
'Menu:UserRequest:Overview' => '概况',
'Menu:UserRequest:Overview+' => '概况',
'Menu:NewUserRequest' => '新建用户需求',
'Menu:NewUserRequest+' => '新建用户需求',
'Menu:SearchUserRequests' => '搜索用户需求',
'Menu:SearchUserRequests+' => '搜索用户需求',
'Menu:UserRequest:Shortcuts' => '快捷方式',
'Menu:UserRequest:Shortcuts+' => '',
'Menu:UserRequest:MyRequests' => '分配给我的需求',
'Menu:UserRequest:MyRequests+' => '分配给我的需求 (作为办理人)',
'Menu:UserRequest:MySupportRequests' => '我办理的需求',
'Menu:UserRequest:MySupportRequests+' => '我办理的需求',
'Menu:UserRequest:EscalatedRequests' => '已升级的需求',
'Menu:UserRequest:EscalatedRequests+' => '已升级的需求',
'Menu:UserRequest:OpenRequests' => '所有打开的需求',
'Menu:UserRequest:OpenRequests+' => '所有打开的需求',
'UI:WelcomeMenu:MyAssignedCalls' => '分配给我的需求',
'UI-RequestManagementOverview-RequestByType-last-14-days' => '最近两周的需求(按类型)',
'UI-RequestManagementOverview-Last-14-days' => '最近两周的需求(按数量)',
'UI-RequestManagementOverview-OpenRequestByStatus' => '打开的需求(按状态)',
'UI-RequestManagementOverview-OpenRequestByAgent' => '打开的需求(按办理人)',
'UI-RequestManagementOverview-OpenRequestByType' => '打开的需求(按类型)',
'UI-RequestManagementOverview-OpenRequestByCustomer' => '打开的需求(按客户)',
'Class:UserRequest:KnownErrorList' => '已知错误',
));
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserRequest
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:UserRequest' => '用户需求',
'Class:UserRequest+' => '',
'Class:UserRequest/Attribute:status' => '状态',
'Class:UserRequest/Attribute:status+' => '',
'Class:UserRequest/Attribute:status/Value:new' => '新建',
'Class:UserRequest/Attribute:status/Value:new+' => '',
'Class:UserRequest/Attribute:status/Value:escalated_tto' => '已升级响应时间',
'Class:UserRequest/Attribute:status/Value:escalated_tto+' => '',
'Class:UserRequest/Attribute:status/Value:assigned' => '已分配',
'Class:UserRequest/Attribute:status/Value:assigned+' => '',
'Class:UserRequest/Attribute:status/Value:escalated_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:approved' => '已批准',
'Class:UserRequest/Attribute:status/Value:approved+' => '',
'Class:UserRequest/Attribute:status/Value:rejected' => '已驳回',
'Class:UserRequest/Attribute:status/Value:rejected+' => '',
'Class:UserRequest/Attribute:status/Value:pending' => '待定',
'Class:UserRequest/Attribute:status/Value:pending+' => '',
'Class:UserRequest/Attribute:status/Value:resolved' => '已解决',
'Class:UserRequest/Attribute:status/Value:resolved+' => '',
'Class:UserRequest/Attribute:status/Value:closed' => '已关闭',
'Class:UserRequest/Attribute:status/Value:closed+' => '',
'Class:UserRequest/Attribute:request_type' => '需求类型',
'Class:UserRequest/Attribute:request_type+' => '',
'Class:UserRequest/Attribute:request_type/Value:service_request' => '服务需求',
'Class:UserRequest/Attribute:request_type/Value:service_request+' => '服务需求',
'Class:UserRequest/Attribute:impact' => '影响范围',
'Class:UserRequest/Attribute:impact+' => '',
'Class:UserRequest/Attribute:impact/Value:1' => '部门',
'Class:UserRequest/Attribute:impact/Value:1+' => '',
'Class:UserRequest/Attribute:impact/Value:2' => '服务',
'Class:UserRequest/Attribute:impact/Value:2+' => '',
'Class:UserRequest/Attribute:impact/Value:3' => '个体',
'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:2' => '高',
'Class:UserRequest/Attribute:priority/Value:2+' => '高',
'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:urgency' => '紧急度',
'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:3' => '中',
'Class:UserRequest/Attribute:urgency/Value:3+' => '中',
'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:mail' => '邮件',
'Class:UserRequest/Attribute:origin/Value:mail+' => '邮件',
'Class:UserRequest/Attribute:origin/Value:monitoring' => '监控',
'Class:UserRequest/Attribute:origin/Value:monitoring+' => '监控',
'Class:UserRequest/Attribute:origin/Value:phone' => '电话',
'Class:UserRequest/Attribute:origin/Value:phone+' => '电话',
'Class:UserRequest/Attribute:origin/Value:portal' => 'iTop',
'Class:UserRequest/Attribute:origin/Value:portal+' => 'iTop',
'Class:UserRequest/Attribute:approver_id' => '批准人',
'Class:UserRequest/Attribute:approver_id+' => '',
'Class:UserRequest/Attribute:approver_email' => '邮箱',
'Class:UserRequest/Attribute:approver_email+' => '',
'Class:UserRequest/Attribute:service_id' => '服务',
'Class:UserRequest/Attribute:service_id+' => '',
'Class:UserRequest/Attribute:service_name' => '服务名称',
'Class:UserRequest/Attribute:service_name+' => '',
'Class:UserRequest/Attribute:servicesubcategory_id' => '子服务',
'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/Value:no' => '否',
'Class:UserRequest/Attribute:escalation_flag/Value:no+' => '否',
'Class:UserRequest/Attribute:escalation_flag/Value:yes' => '是',
'Class:UserRequest/Attribute:escalation_flag/Value:yes+' => '是',
'Class:UserRequest/Attribute:escalation_reason' => '升级原因',
'Class:UserRequest/Attribute:escalation_reason+' => '',
'Class:UserRequest/Attribute:assignment_date' => '分配日期',
'Class:UserRequest/Attribute:assignment_date+' => '',
'Class:UserRequest/Attribute:resolution_date' => '解决日期',
'Class:UserRequest/Attribute:resolution_date+' => '',
'Class:UserRequest/Attribute:last_pending_date' => '最后更新',
'Class:UserRequest/Attribute:last_pending_date+' => '',
'Class:UserRequest/Attribute:cumulatedpending' => '累计待定',
'Class:UserRequest/Attribute:cumulatedpending+' => '',
'Class:UserRequest/Attribute:tto' => '响应时间',
'Class:UserRequest/Attribute:tto+' => '',
'Class:UserRequest/Attribute:ttr' => '解决时间',
'Class:UserRequest/Attribute:ttr+' => '',
'Class:UserRequest/Attribute:tto_escalation_deadline' => '响应时间截止',
'Class:UserRequest/Attribute:tto_escalation_deadline+' => '',
'Class:UserRequest/Attribute:sla_tto_passed' => '超过SLA响应时间',
'Class:UserRequest/Attribute:sla_tto_passed+' => '',
'Class:UserRequest/Attribute:sla_tto_over' => 'SLA响应时间超过',
'Class:UserRequest/Attribute:sla_tto_over+' => '',
'Class:UserRequest/Attribute:ttr_escalation_deadline' => '解决时间截止',
'Class:UserRequest/Attribute:ttr_escalation_deadline+' => '',
'Class:UserRequest/Attribute:sla_ttr_passed' => '超过SLA解决时间',
'Class:UserRequest/Attribute:sla_ttr_passed+' => '',
'Class:UserRequest/Attribute:sla_ttr_over' => 'SLA解决时间超过',
'Class:UserRequest/Attribute:sla_ttr_over+' => '',
'Class:UserRequest/Attribute:time_spent' => '耗时',
'Class:UserRequest/Attribute:time_spent+' => '',
'Class:UserRequest/Attribute:resolution_code' => '解决代码',
'Class:UserRequest/Attribute:resolution_code+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:assistance' => '帮助',
'Class:UserRequest/Attribute:resolution_code/Value:assistance+' => '帮助',
'Class:UserRequest/Attribute:resolution_code/Value:bug fixed' => 'bug修复',
'Class:UserRequest/Attribute:resolution_code/Value:bug fixed+' => 'bug修复',
'Class:UserRequest/Attribute:resolution_code/Value:hardware repair' => '硬件维修',
'Class:UserRequest/Attribute:resolution_code/Value:hardware repair+' => '硬件维修',
'Class:UserRequest/Attribute:resolution_code/Value:other' => '其他',
'Class:UserRequest/Attribute:resolution_code/Value:other+' => '其他',
'Class:UserRequest/Attribute:resolution_code/Value:software patch' => '软件补丁',
'Class:UserRequest/Attribute:resolution_code/Value:software patch+' => '软件补丁',
'Class:UserRequest/Attribute:resolution_code/Value:system update' => '系统更新',
'Class:UserRequest/Attribute:resolution_code/Value:system update+' => '系统更新',
'Class:UserRequest/Attribute:resolution_code/Value:training' => '培训',
'Class:UserRequest/Attribute:resolution_code/Value:training+' => '培训',
'Class:UserRequest/Attribute:solution' => '解决方案',
'Class:UserRequest/Attribute:solution+' => '',
'Class:UserRequest/Attribute:pending_reason' => '待定原因',
'Class:UserRequest/Attribute:pending_reason+' => '',
'Class:UserRequest/Attribute:parent_request_id' => '父级需求',
'Class:UserRequest/Attribute:parent_request_id+' => '',
'Class:UserRequest/Attribute:parent_incident_id' => '父级事件',
'Class:UserRequest/Attribute:parent_incident_id+' => '',
'Class:UserRequest/Attribute:parent_request_ref' => '需求编号',
'Class:UserRequest/Attribute:parent_request_ref+' => '',
'Class:UserRequest/Attribute:parent_problem_id' => '父级问题',
'Class:UserRequest/Attribute:parent_problem_id+' => '',
'Class:UserRequest/Attribute:parent_problem_ref' => '问题编号',
'Class:UserRequest/Attribute:parent_problem_ref+' => '',
'Class:UserRequest/Attribute:parent_change_id' => '父级变更',
'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:public_log+' => '',
'Class:UserRequest/Attribute:user_satisfaction' => '用户满意度',
'Class:UserRequest/Attribute:user_satisfaction+' => '',
'Class:UserRequest/Attribute:user_satisfaction/Value:1' => '非常满意',
'Class:UserRequest/Attribute:user_satisfaction/Value:1+' => '非常满意',
'Class:UserRequest/Attribute:user_satisfaction/Value:2' => '基本满意',
'Class:UserRequest/Attribute:user_satisfaction/Value:2+' => '基本满意',
'Class:UserRequest/Attribute:user_satisfaction/Value:3' => '不满意',
'Class:UserRequest/Attribute:user_satisfaction/Value:3+' => '不满意',
'Class:UserRequest/Attribute:user_satisfaction/Value:4' => '非常不满意',
'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/Stimulus:ev_assign' => '分配',
'Class:UserRequest/Stimulus:ev_assign+' => '',
'Class:UserRequest/Stimulus:ev_reassign' => '重新分配',
'Class:UserRequest/Stimulus:ev_reassign+' => '',
'Class:UserRequest/Stimulus:ev_approve' => '批准',
'Class:UserRequest/Stimulus:ev_approve+' => '',
'Class:UserRequest/Stimulus:ev_reject' => '驳回',
'Class:UserRequest/Stimulus:ev_reject+' => '',
'Class:UserRequest/Stimulus:ev_pending' => '待定',
'Class:UserRequest/Stimulus:ev_pending+' => '',
'Class:UserRequest/Stimulus:ev_timeout' => '超时',
'Class:UserRequest/Stimulus:ev_timeout+' => '',
'Class:UserRequest/Stimulus:ev_autoresolve' => '自动解决',
'Class:UserRequest/Stimulus:ev_autoresolve+' => '',
'Class:UserRequest/Stimulus:ev_autoclose' => '自动关闭',
'Class:UserRequest/Stimulus:ev_autoclose+' => '',
'Class:UserRequest/Stimulus:ev_resolve' => '标记为已解决',
'Class:UserRequest/Stimulus:ev_resolve+' => '',
'Class:UserRequest/Stimulus:ev_close' => '关闭',
'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/Error:CannotAssignParentRequestIdToSelf' => 'Cannot assign the Parent request to the request itself',
'Class:UserRequest/Method:ResolveChildTickets' => '解决子级Ticket',
'Class:UserRequest/Method:ResolveChildTickets+' => '将该解决方案直接挪给子需求(自动解决), 包括下列字段: 服务, 团队, 办理人, 解决方案信息',
));

View File

@@ -280,7 +280,7 @@ Dict::Add('EN US', 'English', 'English', array(
'Portal:TitleDetailsFor_Service' => 'Details for Service',
'Portal:Button:CreateRequestFromService' => 'Create a Request for this service',
'Portal:ListOpenRequests' => 'List open requests',
'Portal:UserRequest:MoreInfo' => 'More information',
'Portal:UserRequest:MoreInfo' => 'More information',
'Portal:Details-Service-Element' => 'Service elements',
'Portal:NoClosedTicket' => 'No closed request',
'Portal:NoService' => '',

View File

@@ -0,0 +1,297 @@
<?php
// Copyright (C) 2010-2014 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:RequestManagement' => '服务台',
'Menu:RequestManagement+' => '服务台',
'Menu:RequestManagementProvider' => '服务台供应商',
'Menu:RequestManagementProvider+' => '服务台供应商',
'Menu:UserRequest:Provider' => '传递到供应商的打开的需求',
'Menu:UserRequest:Provider+' => '传递到供应商的打开的需求',
'Menu:UserRequest:Overview' => '概况',
'Menu:UserRequest:Overview+' => '概况',
'Menu:NewUserRequest' => '新建用户需求',
'Menu:NewUserRequest+' => '新建用户需求',
'Menu:SearchUserRequests' => '搜索用户需求',
'Menu:SearchUserRequests+' => '搜索用户需求',
'Menu:UserRequest:Shortcuts' => '快捷方式',
'Menu:UserRequest:Shortcuts+' => '',
'Menu:UserRequest:MyRequests' => '分配给我的需求',
'Menu:UserRequest:MyRequests+' => '分配给我的需求 (作为办理人)',
'Menu:UserRequest:MySupportRequests' => '我办理的需求',
'Menu:UserRequest:MySupportRequests+' => '我办理的需求',
'Menu:UserRequest:EscalatedRequests' => '已升级的需求',
'Menu:UserRequest:EscalatedRequests+' => '已升级的需求',
'Menu:UserRequest:OpenRequests' => '所有打开的需求',
'Menu:UserRequest:OpenRequests+' => '所有打开的需求',
'UI:WelcomeMenu:MyAssignedCalls' => '分配给我的需求',
'UI-RequestManagementOverview-RequestByType-last-14-days' => '最近两周的需求(按类型)',
'UI-RequestManagementOverview-Last-14-days' => '最近两周的需求(按数量)',
'UI-RequestManagementOverview-OpenRequestByStatus' => '打开的需求(按状态)',
'UI-RequestManagementOverview-OpenRequestByAgent' => '打开的需求(按办理人)',
'UI-RequestManagementOverview-OpenRequestByType' => '打开的需求(按类型)',
'UI-RequestManagementOverview-OpenRequestByCustomer' => '打开的需求(按客户)',
'Class:UserRequest:KnownErrorList' => '已知错误',
'Menu:UserRequest:MyWorkOrders' => '分配给我的工作任务',
'Menu:UserRequest:MyWorkOrders+' => '分配给我的所有工单',
'Class:Problem:KnownProblemList' => '已知问题',
'Tickets:Related:OpenIncidents' => '打开的事件',
));
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserRequest
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:UserRequest' => '用户需求',
'Class:UserRequest+' => '',
'Class:UserRequest/Attribute:status' => '状态',
'Class:UserRequest/Attribute:status+' => '',
'Class:UserRequest/Attribute:status/Value:new' => '新建',
'Class:UserRequest/Attribute:status/Value:new+' => '',
'Class:UserRequest/Attribute:status/Value:escalated_tto' => '已升级响应时间',
'Class:UserRequest/Attribute:status/Value:escalated_tto+' => '',
'Class:UserRequest/Attribute:status/Value:assigned' => '已分配',
'Class:UserRequest/Attribute:status/Value:assigned+' => '',
'Class:UserRequest/Attribute:status/Value:escalated_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:approved' => '已批准',
'Class:UserRequest/Attribute:status/Value:approved+' => '',
'Class:UserRequest/Attribute:status/Value:rejected' => '已驳回',
'Class:UserRequest/Attribute:status/Value:rejected+' => '',
'Class:UserRequest/Attribute:status/Value:pending' => '待定',
'Class:UserRequest/Attribute:status/Value:pending+' => '',
'Class:UserRequest/Attribute:status/Value:resolved' => '已解决',
'Class:UserRequest/Attribute:status/Value:resolved+' => '',
'Class:UserRequest/Attribute:status/Value:closed' => '已关闭',
'Class:UserRequest/Attribute:status/Value:closed+' => '',
'Class:UserRequest/Attribute:request_type' => '需求类型',
'Class:UserRequest/Attribute:request_type+' => '',
'Class:UserRequest/Attribute:request_type/Value:incident' => '事件',
'Class:UserRequest/Attribute:request_type/Value:incident+' => '事件',
'Class:UserRequest/Attribute:request_type/Value:service_request' => '服务需求',
'Class:UserRequest/Attribute:request_type/Value:service_request+' => '服务需求',
'Class:UserRequest/Attribute:impact' => '影响范围',
'Class:UserRequest/Attribute:impact+' => '',
'Class:UserRequest/Attribute:impact/Value:1' => '部门',
'Class:UserRequest/Attribute:impact/Value:1+' => '',
'Class:UserRequest/Attribute:impact/Value:2' => '服务',
'Class:UserRequest/Attribute:impact/Value:2+' => '',
'Class:UserRequest/Attribute:impact/Value:3' => '个体',
'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:2' => '高',
'Class:UserRequest/Attribute:priority/Value:2+' => '高',
'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:urgency' => '紧急度',
'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:3' => '中',
'Class:UserRequest/Attribute:urgency/Value:3+' => '中',
'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:mail' => '邮件',
'Class:UserRequest/Attribute:origin/Value:mail+' => '邮件',
'Class:UserRequest/Attribute:origin/Value:monitoring' => '监控',
'Class:UserRequest/Attribute:origin/Value:monitoring+' => '监控',
'Class:UserRequest/Attribute:origin/Value:phone' => '电话',
'Class:UserRequest/Attribute:origin/Value:phone+' => '电话',
'Class:UserRequest/Attribute:origin/Value:portal' => 'iTop',
'Class:UserRequest/Attribute:origin/Value:portal+' => 'iTop',
'Class:UserRequest/Attribute:approver_id' => '审核人',
'Class:UserRequest/Attribute:approver_id+' => '',
'Class:UserRequest/Attribute:approver_email' => '邮箱',
'Class:UserRequest/Attribute:approver_email+' => '',
'Class:UserRequest/Attribute:service_id' => '服务',
'Class:UserRequest/Attribute:service_id+' => '',
'Class:UserRequest/Attribute:service_name' => '服务名称',
'Class:UserRequest/Attribute:service_name+' => '',
'Class:UserRequest/Attribute:servicesubcategory_id' => '子服务',
'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/Value:no' => '否',
'Class:UserRequest/Attribute:escalation_flag/Value:no+' => '否',
'Class:UserRequest/Attribute:escalation_flag/Value:yes' => '是',
'Class:UserRequest/Attribute:escalation_flag/Value:yes+' => '是',
'Class:UserRequest/Attribute:escalation_reason' => '升级原因',
'Class:UserRequest/Attribute:escalation_reason+' => '',
'Class:UserRequest/Attribute:assignment_date' => '分配日期',
'Class:UserRequest/Attribute:assignment_date+' => '',
'Class:UserRequest/Attribute:resolution_date' => '开始时间',
'Class:UserRequest/Attribute:resolution_date+' => '',
'Class:UserRequest/Attribute:last_pending_date' => '最近待定日期',
'Class:UserRequest/Attribute:last_pending_date+' => '',
'Class:UserRequest/Attribute:cumulatedpending' => '累计待定',
'Class:UserRequest/Attribute:cumulatedpending+' => '',
'Class:UserRequest/Attribute:tto' => '响应时间',
'Class:UserRequest/Attribute:tto+' => '',
'Class:UserRequest/Attribute:ttr' => '解决时间',
'Class:UserRequest/Attribute:ttr+' => '',
'Class:UserRequest/Attribute:tto_escalation_deadline' => '响应时间期限',
'Class:UserRequest/Attribute:tto_escalation_deadline+' => '',
'Class:UserRequest/Attribute:sla_tto_passed' => '超过SLA响应时间',
'Class:UserRequest/Attribute:sla_tto_passed+' => '',
'Class:UserRequest/Attribute:sla_tto_over' => 'SLA响应时间结束',
'Class:UserRequest/Attribute:sla_tto_over+' => '',
'Class:UserRequest/Attribute:ttr_escalation_deadline' => '解决时间期限',
'Class:UserRequest/Attribute:ttr_escalation_deadline+' => '',
'Class:UserRequest/Attribute:sla_ttr_passed' => '超过SLA解决时间',
'Class:UserRequest/Attribute:sla_ttr_passed+' => '',
'Class:UserRequest/Attribute:sla_ttr_over' => 'SLA解决时间结束',
'Class:UserRequest/Attribute:sla_ttr_over+' => '',
'Class:UserRequest/Attribute:time_spent' => '耗时',
'Class:UserRequest/Attribute:time_spent+' => '',
'Class:UserRequest/Attribute:resolution_code' => '解决方式',
'Class:UserRequest/Attribute:resolution_code+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:assistance' => '外部支持',
'Class:UserRequest/Attribute:resolution_code/Value:assistance+' => '外部支持',
'Class:UserRequest/Attribute:resolution_code/Value:bug fixed' => 'bug 修复',
'Class:UserRequest/Attribute:resolution_code/Value:bug fixed+' => 'bug 修复',
'Class:UserRequest/Attribute:resolution_code/Value:hardware repair' => '硬件维修',
'Class:UserRequest/Attribute:resolution_code/Value:hardware repair+' => '硬件维修',
'Class:UserRequest/Attribute:resolution_code/Value:other' => '其它',
'Class:UserRequest/Attribute:resolution_code/Value:other+' => '其它',
'Class:UserRequest/Attribute:resolution_code/Value:software patch' => '软件补丁',
'Class:UserRequest/Attribute:resolution_code/Value:software patch+' => '软件补丁',
'Class:UserRequest/Attribute:resolution_code/Value:system update' => '系统更新',
'Class:UserRequest/Attribute:resolution_code/Value:system update+' => '系统更新',
'Class:UserRequest/Attribute:resolution_code/Value:training' => '培训',
'Class:UserRequest/Attribute:resolution_code/Value:training+' => '培训',
'Class:UserRequest/Attribute:solution' => '解决方案',
'Class:UserRequest/Attribute:solution+' => '',
'Class:UserRequest/Attribute:pending_reason' => '待定的原因',
'Class:UserRequest/Attribute:pending_reason+' => '',
'Class:UserRequest/Attribute:parent_request_id' => '父级需求',
'Class:UserRequest/Attribute:parent_request_id+' => '',
'Class:UserRequest/Attribute:parent_request_ref' => '需求编号',
'Class:UserRequest/Attribute:parent_request_ref+' => '',
'Class:UserRequest/Attribute:parent_problem_id' => '父级问题',
'Class:UserRequest/Attribute:parent_problem_id+' => '',
'Class:UserRequest/Attribute:parent_problem_ref' => '问题编号',
'Class:UserRequest/Attribute:parent_problem_ref+' => '',
'Class:UserRequest/Attribute:parent_change_id' => '父级变更',
'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:public_log+' => '',
'Class:UserRequest/Attribute:user_satisfaction' => '用户满意度',
'Class:UserRequest/Attribute:user_satisfaction+' => '',
'Class:UserRequest/Attribute:user_satisfaction/Value:1' => '非常满意',
'Class:UserRequest/Attribute:user_satisfaction/Value:1+' => '非常满意',
'Class:UserRequest/Attribute:user_satisfaction/Value:2' => '基本满意',
'Class:UserRequest/Attribute:user_satisfaction/Value:2+' => '基本满意',
'Class:UserRequest/Attribute:user_satisfaction/Value:3' => '不满意',
'Class:UserRequest/Attribute:user_satisfaction/Value:3+' => '不满意',
'Class:UserRequest/Attribute:user_satisfaction/Value:4' => '非常不满意',
'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/Stimulus:ev_assign' => '分配',
'Class:UserRequest/Stimulus:ev_assign+' => '',
'Class:UserRequest/Stimulus:ev_reassign' => '重新分配',
'Class:UserRequest/Stimulus:ev_reassign+' => '',
'Class:UserRequest/Stimulus:ev_approve' => '批准',
'Class:UserRequest/Stimulus:ev_approve+' => '',
'Class:UserRequest/Stimulus:ev_reject' => '驳回',
'Class:UserRequest/Stimulus:ev_reject+' => '',
'Class:UserRequest/Stimulus:ev_pending' => '待定',
'Class:UserRequest/Stimulus:ev_pending+' => '',
'Class:UserRequest/Stimulus:ev_timeout' => '超时',
'Class:UserRequest/Stimulus:ev_timeout+' => '',
'Class:UserRequest/Stimulus:ev_autoresolve' => '自动解决',
'Class:UserRequest/Stimulus:ev_autoresolve+' => '',
'Class:UserRequest/Stimulus:ev_autoclose' => '自动关闭',
'Class:UserRequest/Stimulus:ev_autoclose+' => '',
'Class:UserRequest/Stimulus:ev_resolve' => '标记为已解决',
'Class:UserRequest/Stimulus:ev_resolve+' => '',
'Class:UserRequest/Stimulus:ev_close' => '关闭',
'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/Error:CannotAssignParentRequestIdToSelf' => '不能分配父级需求给自己',
));
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Portal:TitleDetailsFor_Request' => '对于需求的详细信息',
'Portal:ButtonUpdate' => '更新',
'Portal:ButtonClose' => '关闭',
'Portal:ButtonReopen' => '重新打开',
'Portal:ShowServices' => '显示所有服务',
'Portal:SelectRequestType' => '选择一种类型的需求',
'Portal:SelectServiceElementFrom_Service' => '为%1$s选择服务元素',
'Portal:ListServices' => '服务列表',
'Portal:TitleDetailsFor_Service' => '服务详细信息',
'Portal:Button:CreateRequestFromService' => '新建服务需求',
'Portal:ListOpenRequests' => '列出打开需求',
'Portal:UserRequest:MoreInfo' => '更多详细信息',
'Portal:Details-Service-Element' => '服务元素',
'Portal:NoClosedTicket' => '没有关闭的需求',
'Portal:NoService' => '',
'Portal:ListOpenProblems' => '处理中的问题',
'Portal:ShowProblem' => '问题',
'Portal:ShowFaqs' => 'FAQ',
'Portal:NoOpenProblem' => '没有打开的问题',
'Portal:SelectLanguage' => '更改您的语言',
'Portal:LanguageChangedTo_Lang' => '语言更改为',
'Portal:ChooseYourFavoriteLanguage' => '选择您喜欢的语言',
'Class:UserRequest/Method:ResolveChildTickets' => '解决子Ticket',
'Class:UserRequest/Method:ResolveChildTickets+' => '级联解决子需求(需求自动解决),并使用以下需求的内容:服务,团队,办理人,解决方案',
));

View File

@@ -36,30 +36,30 @@
Dict::Add('EN US', 'English', 'English', array(
'Menu:ServiceManagement' => 'Service Management',
'Menu:ServiceManagement+' => 'Service Management Overview',
'Menu:Service:Overview' => 'Overview',
'Menu:Service:Overview+' => '',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Contracts by service level',
'UI-ServiceManagementMenu-ContractsByStatus' => 'Contracts by status',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Contracts ending in less then 30 days',
'Menu:ServiceManagement' => 'Service Management',
'Menu:ServiceManagement+' => 'Service Management Overview',
'Menu:Service:Overview' => 'Overview',
'Menu:Service:Overview+' => '',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Contracts by service level',
'UI-ServiceManagementMenu-ContractsByStatus' => 'Contracts by status',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Contracts ending in less then 30 days',
'Menu:ProviderContract' => 'Provider contracts',
'Menu:ProviderContract+' => 'Provider contracts',
'Menu:CustomerContract' => 'Customer contracts',
'Menu:CustomerContract+' => 'Customer contracts',
'Menu:ServiceSubcategory' => 'Service subcategories',
'Menu:ServiceSubcategory+' => 'Service subcategories',
'Menu:Service' => 'Services',
'Menu:Service+' => 'Services',
'Menu:ServiceElement' => 'Sevice elements',
'Menu:ServiceElement+' => 'Sevice elements',
'Menu:SLA' => 'SLAs',
'Menu:SLA+' => 'Service Level Agreements',
'Menu:SLT' => 'SLTs',
'Menu:SLT+' => 'Service Level Targets',
'Menu:DeliveryModel' => 'Delivery models',
'Menu:DeliveryModel+' => 'Delivery models',
'Menu:ProviderContract' => 'Provider contracts',
'Menu:ProviderContract+' => 'Provider contracts',
'Menu:CustomerContract' => 'Customer contracts',
'Menu:CustomerContract+' => 'Customer contracts',
'Menu:ServiceSubcategory' => 'Service subcategories',
'Menu:ServiceSubcategory+' => 'Service subcategories',
'Menu:Service' => 'Services',
'Menu:Service+' => 'Services',
'Menu:ServiceElement' => 'Sevice elements',
'Menu:ServiceElement+' => 'Sevice elements',
'Menu:SLA' => 'SLAs',
'Menu:SLA+' => 'Service Level Agreements',
'Menu:SLT' => 'SLTs',
'Menu:SLT+' => 'Service Level Targets',
'Menu:DeliveryModel' => 'Delivery models',
'Menu:DeliveryModel+' => 'Delivery models',
));

View File

@@ -0,0 +1,528 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// 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', '简体中文', array(
'Menu:ServiceManagement' => '服务管理',
'Menu:ServiceManagement+' => '服务管理概况',
'Menu:Service:Overview' => '概况',
'Menu:Service:Overview+' => '',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => '合同 (按服务等级)',
'UI-ServiceManagementMenu-ContractsByStatus' => '合同(按状态)',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => '30天内截止的合同',
'Menu:ProviderContract' => '供应商合同',
'Menu:ProviderContract+' => '供应商合同',
'Menu:CustomerContract' => '客户合同',
'Menu:CustomerContract+' => '客户合同',
'Menu:ServiceSubcategory' => '子服务',
'Menu:ServiceSubcategory+' => '子服务',
'Menu:Service' => '服务',
'Menu:Service+' => '服务',
'Menu:ServiceElement' => '服务元素',
'Menu:ServiceElement+' => '服务元素',
'Menu:SLA' => 'SLA',
'Menu:SLA+' => '服务等级协议',
'Menu:SLT' => 'SLT',
'Menu:SLT+' => '服务等级目标',
'Menu:DeliveryModel' => '交付模式',
'Menu:DeliveryModel+' => '交付模式',
));
/*
'UI:ServiceManagementMenu' => 'Gestion des Services',
'UI:ServiceManagementMenu+' => 'Gestion des Services',
'UI:ServiceManagementMenu:Title' => 'Résumé des services & contrats',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Contrats par niveau de service',
'UI-ServiceManagementMenu-ContractsByStatus' => 'Contrats par état',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Contrats se terminant dans moins de 30 jours',
*/
//
// Class: Organization
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Organization/Attribute:deliverymodel_id' => '交付模式',
'Class:Organization/Attribute:deliverymodel_id+' => '',
'Class:Organization/Attribute:deliverymodel_name' => '交付模式名称',
'Class:Organization/Attribute:deliverymodel_name+' => '',
));
//
// Class: ContractType
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ContractType' => '合同类型',
'Class:ContractType+' => '',
));
//
// Class: Contract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Contract' => '合同',
'Class:Contract+' => '',
'Class:Contract/Attribute:name' => '名称',
'Class:Contract/Attribute:name+' => '',
'Class:Contract/Attribute:org_id' => '组织',
'Class:Contract/Attribute:org_id+' => '',
'Class:Contract/Attribute:organization_name' => '组织名称',
'Class:Contract/Attribute:organization_name+' => '通用名称',
'Class:Contract/Attribute:contacts_list' => '联系人',
'Class:Contract/Attribute:contacts_list+' => '该客户合同相关的所有联系人',
'Class:Contract/Attribute:documents_list' => '文档',
'Class:Contract/Attribute:documents_list+' => '该客户合同相关的所有文档',
'Class:Contract/Attribute:description' => '描述',
'Class:Contract/Attribute:description+' => '',
'Class:Contract/Attribute:start_date' => '开始日期',
'Class:Contract/Attribute:start_date+' => '',
'Class:Contract/Attribute:end_date' => '结束日期',
'Class:Contract/Attribute:end_date+' => '',
'Class:Contract/Attribute:cost' => '计费',
'Class:Contract/Attribute:cost+' => '',
'Class:Contract/Attribute:cost_currency' => '结算货币',
'Class:Contract/Attribute:cost_currency+' => '',
'Class:Contract/Attribute:cost_currency/Value:dollars' => '美元',
'Class:Contract/Attribute:cost_currency/Value:dollars+' => '',
'Class:Contract/Attribute:cost_currency/Value:euros' => '欧元',
'Class:Contract/Attribute:cost_currency/Value:euros+' => '',
'Class:Contract/Attribute:contracttype_id' => '合同类型',
'Class:Contract/Attribute:contracttype_id+' => '',
'Class:Contract/Attribute:contracttype_name' => '合同类型名称',
'Class:Contract/Attribute:contracttype_name+' => '',
'Class:Contract/Attribute:billing_frequency' => '付款周期',
'Class:Contract/Attribute:billing_frequency+' => '',
'Class:Contract/Attribute:cost_unit' => '计费单位',
'Class:Contract/Attribute:cost_unit+' => '',
'Class:Contract/Attribute:provider_id' => '供应商',
'Class:Contract/Attribute:provider_id+' => '',
'Class:Contract/Attribute:provider_name' => '供应商名称',
'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: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: CustomerContract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CustomerContract' => '客户合同',
'Class:CustomerContract+' => '',
'Class:CustomerContract/Attribute:services_list' => '服务',
'Class:CustomerContract/Attribute:services_list+' => '该合同包含的所有服务',
'Class:CustomerContract/Attribute:functionalcis_list' => '配置项',
'Class:CustomerContract/Attribute:functionalcis_list+' => '该合同包含的所有配置项',
'Class:CustomerContract/Attribute:providercontracts_list' => '供应商合同',
'Class:CustomerContract/Attribute:providercontracts_list+' => '所有提供服务的供应商合同(支持合同)',
));
//
// Class: ProviderContract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ProviderContract' => '供应商合同',
'Class:ProviderContract+' => '',
'Class:ProviderContract/Attribute:functionalcis_list' => '配置项',
'Class:ProviderContract/Attribute:functionalcis_list+' => '该合同包含的所有配置项',
'Class:ProviderContract/Attribute:sla' => 'SLA',
'Class:ProviderContract/Attribute:sla+' => '服务等级协议',
'Class:ProviderContract/Attribute:coverage' => '服务时间',
'Class:ProviderContract/Attribute:coverage+' => '',
));
//
// Class: lnkContactToContract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkContactToContract' => '关联 联系人/合同',
'Class:lnkContactToContract+' => '',
'Class:lnkContactToContract/Attribute:contract_id' => '合同',
'Class:lnkContactToContract/Attribute:contract_id+' => '',
'Class:lnkContactToContract/Attribute:contract_name' => '合同名称',
'Class:lnkContactToContract/Attribute:contract_name+' => '',
'Class:lnkContactToContract/Attribute:contact_id' => '联系人',
'Class:lnkContactToContract/Attribute:contact_id+' => '',
'Class:lnkContactToContract/Attribute:contact_name' => '联系人名称',
'Class:lnkContactToContract/Attribute:contact_name+' => '',
));
//
// Class: lnkContractToDocument
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkContractToDocument' => '关联 合同/文档',
'Class:lnkContractToDocument+' => '',
'Class:lnkContractToDocument/Attribute:contract_id' => '合同',
'Class:lnkContractToDocument/Attribute:contract_id+' => '',
'Class:lnkContractToDocument/Attribute:contract_name' => '合同名称',
'Class:lnkContractToDocument/Attribute:contract_name+' => '',
'Class:lnkContractToDocument/Attribute:document_id' => '文档',
'Class:lnkContractToDocument/Attribute:document_id+' => '',
'Class:lnkContractToDocument/Attribute:document_name' => '文档名称',
'Class:lnkContractToDocument/Attribute:document_name+' => '',
));
//
// Class: lnkFunctionalCIToProviderContract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkFunctionalCIToProviderContract' => '关联 功能配置项/供应商合同',
'Class:lnkFunctionalCIToProviderContract+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => '供应商合同',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name' => '供应商合同名称',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id' => '配置项',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name' => '配置项名称',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name+' => '',
));
//
// Class: ServiceFamily
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ServiceFamily' => '服务族',
'Class:ServiceFamily+' => '',
'Class:ServiceFamily/Attribute:name' => '名称',
'Class:ServiceFamily/Attribute:name+' => '',
'Class:ServiceFamily/Attribute:icon' => 'Icon',
'Class:ServiceFamily/Attribute:icon+' => '',
'Class:ServiceFamily/Attribute:services_list' => '服务',
'Class:ServiceFamily/Attribute:services_list+' => '列表中包含的所有服务',
));
//
// Class: Service
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Service' => '服务',
'Class:Service+' => '',
'Class:Service/Attribute:name' => '名称',
'Class:Service/Attribute:name+' => '',
'Class:Service/Attribute:org_id' => '供应商',
'Class:Service/Attribute:org_id+' => '',
'Class:Service/Attribute:organization_name' => '供应商名称',
'Class:Service/Attribute:organization_name+' => '',
'Class:Service/Attribute:description' => '描述',
'Class:Service/Attribute:description+' => '',
'Class:Service/Attribute:documents_list' => '文档',
'Class:Service/Attribute:documents_list+' => '该服务相关的所有文档',
'Class:Service/Attribute:contacts_list' => '联系人',
'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:obsolete' => '废弃',
'Class:Service/Attribute:status/Value:obsolete+' => '',
'Class:Service/Attribute:status/Value:production' => '生产',
'Class:Service/Attribute:status/Value:production+' => '',
'Class:Service/Attribute:icon' => 'Icon',
'Class:Service/Attribute:icon+' => '',
'Class:Service/Attribute:customercontracts_list' => '客户合同',
'Class:Service/Attribute:customercontracts_list+' => '购买该服务的所有客户合同',
'Class:Service/Attribute:servicesubcategories_list' => '子服务',
'Class:Service/Attribute:servicesubcategories_list+' => '该服务的所有子服务',
));
//
// Class: lnkDocumentToService
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkDocumentToService' => '关联 文档/服务',
'Class:lnkDocumentToService+' => '',
'Class:lnkDocumentToService/Attribute:service_id' => '服务',
'Class:lnkDocumentToService/Attribute:service_id+' => '',
'Class:lnkDocumentToService/Attribute:service_name' => '服务名称',
'Class:lnkDocumentToService/Attribute:service_name+' => '',
'Class:lnkDocumentToService/Attribute:document_id' => '文档',
'Class:lnkDocumentToService/Attribute:document_id+' => '',
'Class:lnkDocumentToService/Attribute:document_name' => '文档名称',
'Class:lnkDocumentToService/Attribute:document_name+' => '',
));
//
// Class: lnkContactToService
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkContactToService' => '关联 联系人/服务',
'Class:lnkContactToService+' => '',
'Class:lnkContactToService/Attribute:service_id' => '服务',
'Class:lnkContactToService/Attribute:service_id+' => '',
'Class:lnkContactToService/Attribute:service_name' => '服务名称',
'Class:lnkContactToService/Attribute:service_name+' => '',
'Class:lnkContactToService/Attribute:contact_id' => '联系人',
'Class:lnkContactToService/Attribute:contact_id+' => '',
'Class:lnkContactToService/Attribute:contact_name' => '联系人名称',
'Class:lnkContactToService/Attribute:contact_name+' => '',
));
//
// Class: ServiceSubcategory
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ServiceSubcategory' => '子服务',
'Class:ServiceSubcategory+' => '',
'Class:ServiceSubcategory/Attribute:name' => '名称',
'Class:ServiceSubcategory/Attribute:name+' => '',
'Class:ServiceSubcategory/Attribute:description' => '描述',
'Class:ServiceSubcategory/Attribute:description+' => '',
'Class:ServiceSubcategory/Attribute:service_id' => '服务',
'Class:ServiceSubcategory/Attribute:service_id+' => '',
'Class:ServiceSubcategory/Attribute:service_name' => '服务名称',
'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:obsolete' => '废弃',
'Class:ServiceSubcategory/Attribute:status/Value:obsolete+' => '废弃',
'Class:ServiceSubcategory/Attribute:status/Value:production' => '生产',
'Class:ServiceSubcategory/Attribute:status/Value:production+' => '生产',
'Class:ServiceSubcategory/Attribute:request_type' => '需求类型',
'Class:ServiceSubcategory/Attribute:request_type+' => '',
'Class:ServiceSubcategory/Attribute:request_type/Value:incident' => '事件',
'Class:ServiceSubcategory/Attribute:request_type/Value:incident+' => '事件',
'Class:ServiceSubcategory/Attribute:request_type/Value:service_request' => '服务需求',
'Class:ServiceSubcategory/Attribute:request_type/Value:service_request+' => '服务需求',
'Class:ServiceSubcategory/Attribute:service_provider' => '供应商名称',
'Class:ServiceSubcategory/Attribute:service_org_id' => '供应商',
));
//
// Class: SLA
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:SLA' => 'SLA',
'Class:SLA+' => '',
'Class:SLA/Attribute:name' => '名称',
'Class:SLA/Attribute:name+' => '',
'Class:SLA/Attribute:description' => '描述',
'Class:SLA/Attribute:description+' => '',
'Class:SLA/Attribute:org_id' => '组织',
'Class:SLA/Attribute:org_id+' => '',
'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:customercontracts_list' => '客户合同',
'Class:SLA/Attribute:customercontracts_list+' => '使用该SLA 的所有客户合同',
));
//
// Class: SLT
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:SLT' => 'SLT',
'Class:SLT+' => '',
'Class:SLT/Attribute:name' => '名称',
'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:2' => '高',
'Class:SLT/Attribute:priority/Value:2+' => '高',
'Class:SLT/Attribute:priority/Value:3' => '中',
'Class:SLT/Attribute:priority/Value:3+' => '中',
'Class:SLT/Attribute:priority/Value:4' => '低',
'Class:SLT/Attribute:priority/Value:4+' => '低',
'Class:SLT/Attribute:request_type' => '需求类型',
'Class:SLT/Attribute:request_type+' => '',
'Class:SLT/Attribute:request_type/Value:incident' => '事件',
'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/Value:tto' => '响应时间',
'Class:SLT/Attribute:metric/Value:tto+' => '响应时间',
'Class:SLT/Attribute:metric/Value:ttr' => '解决时间',
'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/Value:hours' => '小时',
'Class:SLT/Attribute:unit/Value:hours+' => '小时',
'Class:SLT/Attribute:unit/Value:minutes' => '分钟',
'Class:SLT/Attribute:unit/Value:minutes+' => '分钟',
));
//
// Class: lnkSLAToSLT
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkSLAToSLT' => '关联 SLA/SLT',
'Class:lnkSLAToSLT+' => '',
'Class:lnkSLAToSLT/Attribute:sla_id' => 'SLA',
'Class:lnkSLAToSLT/Attribute:sla_id+' => '',
'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+' => '',
));
//
// Class: lnkCustomerContractToService
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkCustomerContractToService' => '关联 客户合同/服务',
'Class:lnkCustomerContractToService+' => '',
'Class:lnkCustomerContractToService/Attribute:customercontract_id' => '客户合同',
'Class:lnkCustomerContractToService/Attribute:customercontract_id+' => '',
'Class:lnkCustomerContractToService/Attribute:customercontract_name' => '客户合同名称',
'Class:lnkCustomerContractToService/Attribute:customercontract_name+' => '',
'Class:lnkCustomerContractToService/Attribute:service_id' => '服务',
'Class:lnkCustomerContractToService/Attribute:service_id+' => '',
'Class:lnkCustomerContractToService/Attribute:service_name' => '服务名称',
'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+' => '',
));
//
// Class: lnkCustomerContractToProviderContract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkCustomerContractToProviderContract' => '关联 客户合同/供应商合同',
'Class:lnkCustomerContractToProviderContract+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_id' => '客户合同',
'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_id+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_name' => '客户合同名称',
'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_name+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_id' => '供应商合同',
'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_id+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_name' => '供应商合同名称',
'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_name+' => '',
));
//
// Class: lnkCustomerContractToFunctionalCI
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkCustomerContractToFunctionalCI' => '关联 客户合同/功能配置项',
'Class:lnkCustomerContractToFunctionalCI+' => '',
'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_id' => '客户合同',
'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_id+' => '',
'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_name' => '客户合同名称',
'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_name+' => '',
'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_id' => '配置项',
'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_id+' => '',
'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_name' => '配置项名称',
'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_name+' => '',
));
//
// Class: DeliveryModel
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:DeliveryModel' => '交付模式',
'Class:DeliveryModel+' => '',
'Class:DeliveryModel/Attribute:name' => '名称',
'Class:DeliveryModel/Attribute:name+' => '',
'Class:DeliveryModel/Attribute:org_id' => '组织',
'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:customers_list' => '客户',
'Class:DeliveryModel/Attribute:customers_list+' => '使用该交付模式的所有客户',
));
//
// Class: lnkDeliveryModelToContact
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkDeliveryModelToContact' => '关联 交付模式/联系人',
'Class:lnkDeliveryModelToContact+' => '',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id' => '交付模式',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id+' => '',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name' => '交付模式名称',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name+' => '',
'Class:lnkDeliveryModelToContact/Attribute:contact_id' => '联系人',
'Class:lnkDeliveryModelToContact/Attribute:contact_id+' => '',
'Class:lnkDeliveryModelToContact/Attribute:contact_name' => '联系人名称',
'Class:lnkDeliveryModelToContact/Attribute:contact_name+' => '',
'Class:lnkDeliveryModelToContact/Attribute:role_id' => '角色',
'Class:lnkDeliveryModelToContact/Attribute:role_id+' => '',
'Class:lnkDeliveryModelToContact/Attribute:role_name' => '角色名称',
'Class:lnkDeliveryModelToContact/Attribute:role_name+' => '',
));
?>

View File

@@ -1,621 +0,0 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @author Robert Deng <denglx@gmail.com>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// 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', '简体中文', array(
'Menu:ServiceManagement' => '服务管理',
'Menu:ServiceManagement+' => '服务管理概览',
'Menu:Service:Overview' => '概览',
'Menu:Service:Overview+' => '',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => '按服务层级划分合同',
'UI-ServiceManagementMenu-ContractsByStatus' => '按状态划分合同',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => '合同30天内终止',
'Menu:ProviderContract' => '供应商合同',
'Menu:ProviderContract+' => '供应商合同',
'Menu:CustomerContract' => '客户合同',
'Menu:CustomerContract+' => '客户合同',
'Menu:ServiceSubcategory' => '服务子级类目',
'Menu:ServiceSubcategory+' => '服务子级类目',
'Menu:Service' => '服务',
'Menu:Service+' => '服务',
'Menu:SLA' => 'SLAs',
'Menu:SLA+' => '服务级别协议',
'Menu:SLT' => 'SLTs',
'Menu:SLT+' => '服务级别目标',
));
/*
'UI:ServiceManagementMenu' => 'Gestion des Services',
'UI:ServiceManagementMenu+' => 'Gestion des Services',
'UI:ServiceManagementMenu:Title' => 'Résumé des services & contrats',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Contrats par niveau de service',
'UI-ServiceManagementMenu-ContractsByStatus' => 'Contrats par état',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Contrats se terminant dans moins de 30 jours',
*/
//
// Class: Contract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Contract' => '合同',
'Class:Contract+' => '',
'Class:Contract/Attribute:name' => '名称',
'Class:Contract/Attribute:name+' => '',
'Class:Contract/Attribute:description' => '描述',
'Class:Contract/Attribute:description+' => '',
'Class:Contract/Attribute:start_date' => '启始日期',
'Class:Contract/Attribute:start_date+' => '',
'Class:Contract/Attribute:end_date' => '截止日期',
'Class:Contract/Attribute:end_date+' => '',
'Class:Contract/Attribute:cost' => '费用',
'Class:Contract/Attribute:cost+' => '',
'Class:Contract/Attribute:cost_currency' => '费用货币',
'Class:Contract/Attribute:cost_currency+' => '',
'Class:Contract/Attribute:cost_currency/Value:dollars' => '美元',
'Class:Contract/Attribute:cost_currency/Value:dollars+' => '',
'Class:Contract/Attribute:cost_currency/Value:euros' => '欧元',
'Class:Contract/Attribute:cost_currency/Value:euros+' => '',
'Class:Contract/Attribute:cost_unit' => '费用单位',
'Class:Contract/Attribute:cost_unit+' => '',
'Class:Contract/Attribute:billing_frequency' => '付款周期',
'Class:Contract/Attribute:billing_frequency+' => '',
'Class:Contract/Attribute:contact_list' => '合同',
'Class:Contract/Attribute:contact_list+' => '与该合同相关的合同能够',
'Class:Contract/Attribute:document_list' => '文档',
'Class:Contract/Attribute:document_list+' => '与该合同关联的文档',
'Class:Contract/Attribute:ci_list' => 'CIs',
'Class:Contract/Attribute:ci_list+' => '该合同所支持的 CI',
'Class:Contract/Attribute:finalclass' => '类别',
'Class:Contract/Attribute:finalclass+' => '',
));
//
// Class: ProviderContract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ProviderContract' => '供应商合同',
'Class:ProviderContract+' => '',
'Class:ProviderContract/Attribute:provider_id' => '供应商',
'Class:ProviderContract/Attribute:provider_id+' => '',
'Class:ProviderContract/Attribute:provider_name' => '供应商名称',
'Class:ProviderContract/Attribute:provider_name+' => '',
'Class:ProviderContract/Attribute:sla' => 'SLA',
'Class:ProviderContract/Attribute:sla+' => '服务级别协议',
'Class:ProviderContract/Attribute:coverage' => '服务小时数',
'Class:ProviderContract/Attribute:coverage+' => '',
));
//
// Class: CustomerContract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CustomerContract' => '客户合同',
'Class:CustomerContract+' => '',
'Class:CustomerContract/Attribute:org_id' => '客户',
'Class:CustomerContract/Attribute:org_id+' => '',
'Class:CustomerContract/Attribute:org_name' => '客户名称',
'Class:CustomerContract/Attribute:org_name+' => '',
'Class:CustomerContract/Attribute:provider_id' => '供应商',
'Class:CustomerContract/Attribute:provider_id+' => '',
'Class:CustomerContract/Attribute:provider_name' => '供应商名称',
'Class:CustomerContract/Attribute:provider_name+' => '',
'Class:CustomerContract/Attribute:support_team_id' => '支持团队',
'Class:CustomerContract/Attribute:support_team_id+' => '',
'Class:CustomerContract/Attribute:support_team_name' => '支持团队',
'Class:CustomerContract/Attribute:support_team_name+' => '',
'Class:CustomerContract/Attribute:provider_list' => '供应商',
'Class:CustomerContract/Attribute:provider_list+' => '',
'Class:CustomerContract/Attribute:sla_list' => 'SLAs',
'Class:CustomerContract/Attribute:sla_list+' => '与该合同相关的 SLA 列表',
'Class:CustomerContract/Attribute:provider_list' => '支撑合同',
'Class:CustomerContract/Attribute:sla_list+' => '',
));
//
// Class: lnkCustomerContractToProviderContract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkCustomerContractToProviderContract' => 'lnkCustomerContractToProviderContract',
'Class:lnkCustomerContractToProviderContract+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id' => '客户合同',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name' => '名称',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id' => '供应商合同',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name' => '名称',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla' => '供应商 SLA',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla+' => '服务级别协议',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage' => '服务小时数',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage+' => '',
));
//
// Class: lnkContractToSLA
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkContractToSLA' => '合同/SLA',
'Class:lnkContractToSLA+' => '',
'Class:lnkContractToSLA/Attribute:contract_id' => '合同',
'Class:lnkContractToSLA/Attribute:contract_id+' => '',
'Class:lnkContractToSLA/Attribute:contract_name' => '合同',
'Class:lnkContractToSLA/Attribute:contract_name+' => '',
'Class:lnkContractToSLA/Attribute:sla_id' => 'SLA',
'Class:lnkContractToSLA/Attribute:sla_id+' => '',
'Class:lnkContractToSLA/Attribute:sla_name' => 'SLA',
'Class:lnkContractToSLA/Attribute:sla_name+' => '',
'Class:lnkContractToSLA/Attribute:coverage' => '服务小时数',
'Class:lnkContractToSLA/Attribute:coverage+' => '',
));
//
// Class: lnkContractToDoc
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkContractToDoc' => '合同/文档',
'Class:lnkContractToDoc+' => '',
'Class:lnkContractToDoc/Attribute:contract_id' => '合同',
'Class:lnkContractToDoc/Attribute:contract_id+' => '',
'Class:lnkContractToDoc/Attribute:contract_name' => '合同',
'Class:lnkContractToDoc/Attribute:contract_name+' => '',
'Class:lnkContractToDoc/Attribute:document_id' => '文档',
'Class:lnkContractToDoc/Attribute:document_id+' => '',
'Class:lnkContractToDoc/Attribute:document_name' => '文档',
'Class:lnkContractToDoc/Attribute:document_name+' => '',
'Class:lnkContractToDoc/Attribute:document_type' => '文档类别',
'Class:lnkContractToDoc/Attribute:document_type+' => '',
'Class:lnkContractToDoc/Attribute:document_status' => '文档状态',
'Class:lnkContractToDoc/Attribute:document_status+' => '',
));
//
// Class: lnkContractToContact
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkContractToContact' => '合同/联系人',
'Class:lnkContractToContact+' => '',
'Class:lnkContractToContact/Attribute:contract_id' => '合同',
'Class:lnkContractToContact/Attribute:contract_id+' => '',
'Class:lnkContractToContact/Attribute:contract_name' => '合同',
'Class:lnkContractToContact/Attribute:contract_name+' => '',
'Class:lnkContractToContact/Attribute:contact_id' => '联系人',
'Class:lnkContractToContact/Attribute:contact_id+' => '',
'Class:lnkContractToContact/Attribute:contact_name' => '联系人',
'Class:lnkContractToContact/Attribute:contact_name+' => '',
'Class:lnkContractToContact/Attribute:contact_email' => '联系人 email',
'Class:lnkContractToContact/Attribute:contact_email+' => '',
'Class:lnkContractToContact/Attribute:role' => '角色',
'Class:lnkContractToContact/Attribute:role+' => '',
));
//
// Class: lnkContractToCI
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkContractToCI' => '合同/CI',
'Class:lnkContractToCI+' => '',
'Class:lnkContractToCI/Attribute:contract_id' => '合同',
'Class:lnkContractToCI/Attribute:contract_id+' => '',
'Class:lnkContractToCI/Attribute:contract_name' => '合同',
'Class:lnkContractToCI/Attribute:contract_name+' => '',
'Class:lnkContractToCI/Attribute:ci_id' => 'CI',
'Class:lnkContractToCI/Attribute:ci_id+' => '',
'Class:lnkContractToCI/Attribute:ci_name' => 'CI',
'Class:lnkContractToCI/Attribute:ci_name+' => '',
'Class:lnkContractToCI/Attribute:ci_status' => 'CI 状态',
'Class:lnkContractToCI/Attribute:ci_status+' => '',
));
//
// Class: Service
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Service' => '服务',
'Class:Service+' => '',
'Class:Service/Attribute:org_id' => '供应商',
'Class:Service/Attribute:org_id+' => '',
'Class:Service/Attribute:provider_name' => '供应商',
'Class:Service/Attribute:provider_name+' => '',
'Class:Service/Attribute:name' => '名称',
'Class:Service/Attribute:name+' => '',
'Class:Service/Attribute:description' => '描述',
'Class:Service/Attribute:description+' => '',
'Class:Service/Attribute:type' => '类别',
'Class:Service/Attribute:type+' => '',
'Class:Service/Attribute:type/Value:IncidentManagement' => '事件管理',
'Class:Service/Attribute:type/Value:IncidentManagement+' => '事件管理',
'Class:Service/Attribute:type/Value:RequestManagement' => '请求管理',
'Class:Service/Attribute:type/Value:RequestManagement+' => '请求管理',
'Class:Service/Attribute:status' => '状态',
'Class:Service/Attribute:status+' => '',
'Class:Service/Attribute:status/Value:design' => '设计',
'Class:Service/Attribute:status/Value:design+' => '',
'Class:Service/Attribute:status/Value:obsolete' => '废弃',
'Class:Service/Attribute:status/Value:obsolete+' => '',
'Class:Service/Attribute:status/Value:production' => '生产',
'Class:Service/Attribute:status/Value:production+' => '',
'Class:Service/Attribute:subcategory_list' => '服务子级类目',
'Class:Service/Attribute:subcategory_list+' => '',
'Class:Service/Attribute:sla_list' => 'SLAs',
'Class:Service/Attribute:sla_list+' => '',
'Class:Service/Attribute:document_list' => '文档',
'Class:Service/Attribute:document_list+' => '与此服务相关的文档',
'Class:Service/Attribute:contact_list' => '联系人',
'Class:Service/Attribute:contact_list+' => '在此服务中承担角色的联系人',
'Class:Service/Tab:Related_Contracts' => '相关合同',
'Class:Service/Tab:Related_Contracts+' => '为此服务签订的合同',
));
//
// Class: ServiceSubcategory
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ServiceSubcategory' => '服务子级类目',
'Class:ServiceSubcategory+' => '',
'Class:ServiceSubcategory/Attribute:name' => '名称',
'Class:ServiceSubcategory/Attribute:name+' => '',
'Class:ServiceSubcategory/Attribute:description' => '描述',
'Class:ServiceSubcategory/Attribute:description+' => '',
'Class:ServiceSubcategory/Attribute:service_id' => '服务',
'Class:ServiceSubcategory/Attribute:service_id+' => '',
'Class:ServiceSubcategory/Attribute:service_name' => '服务',
'Class:ServiceSubcategory/Attribute:service_name+' => '',
));
//
// Class: SLA
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:SLA' => 'SLA',
'Class:SLA+' => '',
'Class:SLA/Attribute:name' => '名称',
'Class:SLA/Attribute:name+' => '',
'Class:SLA/Attribute:service_id' => '服务',
'Class:SLA/Attribute:service_id+' => '',
'Class:SLA/Attribute:service_name' => '服务',
'Class:SLA/Attribute:service_name+' => '',
'Class:SLA/Attribute:slt_list' => 'SLTs',
'Class:SLA/Attribute:slt_list+' => 'List Service Level Thresholds',
));
//
// Class: SLT
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:SLT' => 'SLT',
'Class:SLT+' => '',
'Class:SLT/Attribute:name' => '名称',
'Class:SLT/Attribute:name+' => '',
'Class:SLT/Attribute:metric' => 'Metric',
'Class:SLT/Attribute:metric+' => '',
'Class:SLT/Attribute:metric/Value:TTO' => 'TTO',
'Class:SLT/Attribute:metric/Value:TTO+' => 'TTO',
'Class:SLT/Attribute:metric/Value:TTR' => 'TTR',
'Class:SLT/Attribute:metric/Value:TTR+' => 'TTR',
'Class:SLT/Attribute:ticket_priority' => '单据优先级',
'Class:SLT/Attribute:ticket_priority+' => '',
'Class:SLT/Attribute:ticket_priority/Value:1' => '1',
'Class:SLT/Attribute:ticket_priority/Value:1+' => '1',
'Class:SLT/Attribute:ticket_priority/Value:2' => '2',
'Class:SLT/Attribute:ticket_priority/Value:2+' => '2',
'Class:SLT/Attribute:ticket_priority/Value:3' => '3',
'Class:SLT/Attribute:ticket_priority/Value:3+' => '3',
'Class:SLT/Attribute:value' => '值',
'Class:SLT/Attribute:value+' => '',
'Class:SLT/Attribute:value_unit' => '单位',
'Class:SLT/Attribute:value_unit+' => '',
'Class:SLT/Attribute:value_unit/Value:days' => '天',
'Class:SLT/Attribute:value_unit/Value:days+' => '天',
'Class:SLT/Attribute:value_unit/Value:hours' => '小时',
'Class:SLT/Attribute:value_unit/Value:hours+' => '小时',
'Class:SLT/Attribute:value_unit/Value:minutes' => '分钟',
'Class:SLT/Attribute:value_unit/Value:minutes+' => '分钟',
'Class:SLT/Attribute:sla_list' => 'SLAs',
'Class:SLT/Attribute:sla_list+' => '使用此 SLT 的 SLAs',
));
//
// Class: lnkSLTToSLA
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkSLTToSLA' => 'SLT/SLA',
'Class:lnkSLTToSLA+' => '',
'Class:lnkSLTToSLA/Attribute:sla_id' => 'SLA',
'Class:lnkSLTToSLA/Attribute:sla_id+' => '',
'Class:lnkSLTToSLA/Attribute:sla_name' => 'SLA',
'Class:lnkSLTToSLA/Attribute:sla_name+' => '',
'Class:lnkSLTToSLA/Attribute:slt_id' => 'SLT',
'Class:lnkSLTToSLA/Attribute:slt_id+' => '',
'Class:lnkSLTToSLA/Attribute:slt_name' => 'SLT',
'Class:lnkSLTToSLA/Attribute:slt_name+' => '',
'Class:lnkSLTToSLA/Attribute:slt_metric' => 'Metric',
'Class:lnkSLTToSLA/Attribute:slt_metric+' => '',
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority' => '单据优先级',
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority+' => '',
'Class:lnkSLTToSLA/Attribute:slt_value' => '值',
'Class:lnkSLTToSLA/Attribute:slt_value+' => '',
'Class:lnkSLTToSLA/Attribute:slt_value_unit' => '单位',
'Class:lnkSLTToSLA/Attribute:slt_value_unit+' => '',
));
//
// Class: lnkServiceToDoc
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkServiceToDoc' => '服务/文档',
'Class:lnkServiceToDoc+' => '',
'Class:lnkServiceToDoc/Attribute:service_id' => '服务',
'Class:lnkServiceToDoc/Attribute:service_id+' => '',
'Class:lnkServiceToDoc/Attribute:service_name' => '服务',
'Class:lnkServiceToDoc/Attribute:service_name+' => '',
'Class:lnkServiceToDoc/Attribute:document_id' => '文档',
'Class:lnkServiceToDoc/Attribute:document_id+' => '',
'Class:lnkServiceToDoc/Attribute:document_name' => '文档',
'Class:lnkServiceToDoc/Attribute:document_name+' => '',
'Class:lnkServiceToDoc/Attribute:document_type' => '文档类别',
'Class:lnkServiceToDoc/Attribute:document_type+' => '',
'Class:lnkServiceToDoc/Attribute:document_status' => '文档状态',
'Class:lnkServiceToDoc/Attribute:document_status+' => '',
));
//
// Class: lnkServiceToContact
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkServiceToContact' => '服务/联系人',
'Class:lnkServiceToContact+' => '',
'Class:lnkServiceToContact/Attribute:service_id' => '服务',
'Class:lnkServiceToContact/Attribute:service_id+' => '',
'Class:lnkServiceToContact/Attribute:service_name' => '服务',
'Class:lnkServiceToContact/Attribute:service_name+' => '',
'Class:lnkServiceToContact/Attribute:contact_id' => '联系人',
'Class:lnkServiceToContact/Attribute:contact_id+' => '',
'Class:lnkServiceToContact/Attribute:contact_name' => '联系人',
'Class:lnkServiceToContact/Attribute:contact_name+' => '',
'Class:lnkServiceToContact/Attribute:contact_email' => '联系人 email',
'Class:lnkServiceToContact/Attribute:contact_email+' => '',
'Class:lnkServiceToContact/Attribute:role' => '角色',
'Class:lnkServiceToContact/Attribute:role+' => '',
));
//
// Class: lnkServiceToCI
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkServiceToCI' => '服务/CI',
'Class:lnkServiceToCI+' => '',
'Class:lnkServiceToCI/Attribute:service_id' => '服务',
'Class:lnkServiceToCI/Attribute:service_id+' => '',
'Class:lnkServiceToCI/Attribute:service_name' => '服务',
'Class:lnkServiceToCI/Attribute:service_name+' => '',
'Class:lnkServiceToCI/Attribute:ci_id' => 'CI',
'Class:lnkServiceToCI/Attribute:ci_id+' => '',
'Class:lnkServiceToCI/Attribute:ci_name' => 'CI',
'Class:lnkServiceToCI/Attribute:ci_name+' => '',
'Class:lnkServiceToCI/Attribute:ci_status' => 'CI 状态',
'Class:lnkServiceToCI/Attribute:ci_status+' => '',
'Menu:ServiceElement' => 'Sevice elements~~',
'Menu:ServiceElement+' => 'Sevice elements~~',
'Menu:DeliveryModel' => 'Delivery models~~',
'Menu:DeliveryModel+' => 'Delivery models~~',
'Menu:ServiceFamily' => 'Service families~~',
'Menu:ServiceFamily+' => 'Service families~~',
'Menu:Procedure' => 'Procedures catalog~~',
'Menu:Procedure+' => 'All procedures catalog~~',
'Class:Organization/Attribute:deliverymodel_id' => 'Delivery model~~',
'Class:Organization/Attribute:deliverymodel_name' => 'Delivery model name~~',
'Class:ContractType' => 'Contract Type~~',
'Class:Contract/Attribute:org_id' => 'Customer~~',
'Class:Contract/Attribute:organization_name' => 'Customer Name~~',
'Class:Contract/Attribute:organization_name+' => 'Common name~~',
'Class:Contract/Attribute:contacts_list' => 'Contacts~~',
'Class:Contract/Attribute:contacts_list+' => 'All the contacts for this customer contract~~',
'Class:Contract/Attribute:documents_list' => 'Documents~~',
'Class:Contract/Attribute:documents_list+' => 'All the documents for this customer contract~~',
'Class:Contract/Attribute:contracttype_id' => 'Contract type~~',
'Class:Contract/Attribute:contracttype_name' => 'Contract type Name~~',
'Class:Contract/Attribute:provider_id' => 'Provider~~',
'Class:Contract/Attribute:provider_name' => 'Provider Name~~',
'Class:Contract/Attribute:provider_name+' => 'Common name~~',
'Class:Contract/Attribute:status' => 'Status~~',
'Class:Contract/Attribute:status/Value:implementation' => 'implementation~~',
'Class:Contract/Attribute:status/Value:implementation+' => 'implementation~~',
'Class:Contract/Attribute:status/Value:obsolete' => 'obsolete~~',
'Class:Contract/Attribute:status/Value:obsolete+' => 'obsolete~~',
'Class:Contract/Attribute:status/Value:production' => 'production~~',
'Class:Contract/Attribute:status/Value:production+' => 'production~~',
'Class:CustomerContract/Attribute:services_list' => 'Services~~',
'Class:CustomerContract/Attribute:services_list+' => 'All the services purchased for this contract~~',
'Class:ProviderContract/Attribute:functionalcis_list' => 'CIs~~',
'Class:ProviderContract/Attribute:functionalcis_list+' => 'All the configuration items covered by this provider contract~~',
'Class:ProviderContract/Attribute:contracttype_id' => 'Contract type~~',
'Class:ProviderContract/Attribute:contracttype_name' => 'Contract type name~~',
'Class:lnkContactToContract' => 'Link Contact / Contract~~',
'Class:lnkContactToContract/Attribute:contract_id' => 'Contract~~',
'Class:lnkContactToContract/Attribute:contract_name' => 'Contract Name~~',
'Class:lnkContactToContract/Attribute:contact_id' => 'Contact~~',
'Class:lnkContactToContract/Attribute:contact_name' => 'Contact Name~~',
'Class:lnkContractToDocument' => 'Link Contract / Document~~',
'Class:lnkContractToDocument/Attribute:contract_id' => 'Contract~~',
'Class:lnkContractToDocument/Attribute:contract_name' => 'Contract Name~~',
'Class:lnkContractToDocument/Attribute:document_id' => 'Document~~',
'Class:lnkContractToDocument/Attribute:document_name' => 'Document Name~~',
'Class:lnkFunctionalCIToProviderContract' => 'Link FunctionalCI / ProviderContract~~',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => 'Provider contract~~',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name' => 'Provider contract Name~~',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id' => 'CI~~',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name' => 'CI Name~~',
'Class:ServiceFamily' => 'Service Family~~',
'Class:ServiceFamily/Attribute:name' => 'Name~~',
'Class:ServiceFamily/Attribute:icon' => 'Icon~~',
'Class:ServiceFamily/Attribute:services_list' => 'Services~~',
'Class:ServiceFamily/Attribute:services_list+' => 'All the services in this category~~',
'Class:Service/Attribute:organization_name' => 'Provider Name~~',
'Class:Service/Attribute:servicefamily_id' => 'Service Family~~',
'Class:Service/Attribute:servicefamily_name' => 'Service Family Name~~',
'Class:Service/Attribute:documents_list' => 'Documents~~',
'Class:Service/Attribute:documents_list+' => 'All the documents linked to the service~~',
'Class:Service/Attribute:contacts_list' => 'Contacts~~',
'Class:Service/Attribute:contacts_list+' => 'All the contacts for this service~~',
'Class:Service/Attribute:status/Value:implementation' => 'implementation~~',
'Class:Service/Attribute:status/Value:implementation+' => 'implementation~~',
'Class:Service/Attribute:icon' => 'Icon~~',
'Class:Service/Attribute:customercontracts_list' => 'Customer contracts~~',
'Class:Service/Attribute:customercontracts_list+' => 'All the customer contracts that have purchased this service~~',
'Class:Service/Attribute:providercontracts_list' => 'Provider contracts~~',
'Class:Service/Attribute:providercontracts_list+' => 'All the provider contracts to support this service~~',
'Class:Service/Attribute:functionalcis_list' => 'Depends on CIs~~',
'Class:Service/Attribute:functionalcis_list+' => 'All the configuration items that are used to provide this service~~',
'Class:Service/Attribute:servicesubcategories_list' => 'Service sub categories~~',
'Class:Service/Attribute:servicesubcategories_list+' => 'All the sub categories for this service~~',
'Class:lnkDocumentToService' => 'Link Document / Service~~',
'Class:lnkDocumentToService/Attribute:service_id' => 'Service~~',
'Class:lnkDocumentToService/Attribute:service_name' => 'Service Name~~',
'Class:lnkDocumentToService/Attribute:document_id' => 'Document~~',
'Class:lnkDocumentToService/Attribute:document_name' => 'Document Name~~',
'Class:lnkContactToService' => 'Link Contact / Service~~',
'Class:lnkContactToService/Attribute:service_id' => 'Service~~',
'Class:lnkContactToService/Attribute:service_name' => 'Service Name~~',
'Class:lnkContactToService/Attribute:contact_id' => 'Contact~~',
'Class:lnkContactToService/Attribute:contact_name' => 'Contact Name~~',
'Class:ServiceSubcategory/Attribute:request_type' => 'Request type~~',
'Class:ServiceSubcategory/Attribute:request_type/Value:incident' => 'incident~~',
'Class:ServiceSubcategory/Attribute:request_type/Value:incident+' => 'incident~~',
'Class:ServiceSubcategory/Attribute:request_type/Value:service_request' => 'service request~~',
'Class:ServiceSubcategory/Attribute:request_type/Value:service_request+' => 'service request~~',
'Class:ServiceSubcategory/Attribute:status' => 'Status~~',
'Class:ServiceSubcategory/Attribute:status/Value:implementation' => 'implementation~~',
'Class:ServiceSubcategory/Attribute:status/Value:implementation+' => 'implementation~~',
'Class:ServiceSubcategory/Attribute:status/Value:obsolete' => 'obsolete~~',
'Class:ServiceSubcategory/Attribute:status/Value:obsolete+' => 'obsolete~~',
'Class:ServiceSubcategory/Attribute:status/Value:production' => 'production~~',
'Class:ServiceSubcategory/Attribute:status/Value:production+' => 'production~~',
'Class:SLA/Attribute:description' => 'description~~',
'Class:SLA/Attribute:org_id' => 'Provider~~',
'Class:SLA/Attribute:organization_name' => 'Provider Name~~',
'Class:SLA/Attribute:organization_name+' => 'Common name~~',
'Class:SLA/Attribute:slts_list' => 'SLTs~~',
'Class:SLA/Attribute:slts_list+' => 'All the service level targets for this SLA~~',
'Class:SLA/Attribute:customercontracts_list' => 'Customer contracts~~',
'Class:SLA/Attribute:customercontracts_list+' => 'All the customer contracts using this SLA~~',
'Class:SLT/Attribute:priority' => 'Priority~~',
'Class:SLT/Attribute:priority/Value:1' => 'critical~~',
'Class:SLT/Attribute:priority/Value:1+' => 'critical~~',
'Class:SLT/Attribute:priority/Value:2' => 'high~~',
'Class:SLT/Attribute:priority/Value:2+' => 'high~~',
'Class:SLT/Attribute:priority/Value:3' => 'medium~~',
'Class:SLT/Attribute:priority/Value:3+' => 'medium~~',
'Class:SLT/Attribute:priority/Value:4' => 'low~~',
'Class:SLT/Attribute:priority/Value:4+' => 'low~~',
'Class:SLT/Attribute:request_type' => 'Request type~~',
'Class:SLT/Attribute:request_type/Value:incident' => 'incident~~',
'Class:SLT/Attribute:request_type/Value:incident+' => 'incident~~',
'Class:SLT/Attribute:request_type/Value:service_request' => 'service request~~',
'Class:SLT/Attribute:request_type/Value:service_request+' => 'service request~~',
'Class:SLT/Attribute:metric/Value:tto' => 'TTO~~',
'Class:SLT/Attribute:metric/Value:tto+' => 'TTO~~',
'Class:SLT/Attribute:metric/Value:ttr' => 'TTR~~',
'Class:SLT/Attribute:metric/Value:ttr+' => 'TTR~~',
'Class:SLT/Attribute:unit' => 'Unit~~',
'Class:SLT/Attribute:unit/Value:hours' => 'hours~~',
'Class:SLT/Attribute:unit/Value:hours+' => 'hours~~',
'Class:SLT/Attribute:unit/Value:minutes' => 'minutes~~',
'Class:SLT/Attribute:unit/Value:minutes+' => 'minutes~~',
'Class:lnkSLAToSLT' => 'Link SLA / SLT~~',
'Class:lnkSLAToSLT/Attribute:sla_id' => 'SLA~~',
'Class:lnkSLAToSLT/Attribute:sla_name' => 'SLA Name~~',
'Class:lnkSLAToSLT/Attribute:slt_id' => 'SLT~~',
'Class:lnkSLAToSLT/Attribute:slt_name' => 'SLT Name~~',
'Class:lnkCustomerContractToService' => 'Link Customer Contract / Service~~',
'Class:lnkCustomerContractToService/Attribute:customercontract_id' => 'Customer contract~~',
'Class:lnkCustomerContractToService/Attribute:customercontract_name' => 'Customer contract Name~~',
'Class:lnkCustomerContractToService/Attribute:service_id' => 'Service~~',
'Class:lnkCustomerContractToService/Attribute:service_name' => 'Service Name~~',
'Class:lnkCustomerContractToService/Attribute:sla_id' => 'SLA~~',
'Class:lnkCustomerContractToService/Attribute:sla_name' => 'SLA Name~~',
'Class:lnkProviderContractToService' => 'Link Provider Contract / Service~~',
'Class:lnkProviderContractToService/Attribute:service_id' => 'Service~~',
'Class:lnkProviderContractToService/Attribute:service_name' => 'Service Name~~',
'Class:lnkProviderContractToService/Attribute:providercontract_id' => 'Provider contract~~',
'Class:lnkProviderContractToService/Attribute:providercontract_name' => 'Provider contract Name~~',
'Class:lnkFunctionalCIToService' => 'Link FunctionalCI / Service~~',
'Class:lnkFunctionalCIToService/Attribute:service_id' => 'Service~~',
'Class:lnkFunctionalCIToService/Attribute:service_name' => 'Service Name~~',
'Class:lnkFunctionalCIToService/Attribute:functionalci_id' => 'CI~~',
'Class:lnkFunctionalCIToService/Attribute:functionalci_name' => 'CI Name~~',
'Class:DeliveryModel' => 'Delivery Model~~',
'Class:DeliveryModel/Attribute:name' => 'Name~~',
'Class:DeliveryModel/Attribute:org_id' => 'Organization~~',
'Class:DeliveryModel/Attribute:organization_name' => 'Organization Name~~',
'Class:DeliveryModel/Attribute:organization_name+' => 'Common name~~',
'Class:DeliveryModel/Attribute:description' => 'Description~~',
'Class:DeliveryModel/Attribute:contacts_list' => 'Contacts~~',
'Class:DeliveryModel/Attribute:contacts_list+' => 'All the contacts (Teams and Person) for this delivery model~~',
'Class:DeliveryModel/Attribute:customers_list' => 'Customers~~',
'Class:DeliveryModel/Attribute:customers_list+' => 'All the customers having this delivering model~~',
'Class:lnkDeliveryModelToContact' => 'Link Delivery Model / Contact~~',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id' => 'Delivery model~~',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name' => 'Delivery model name~~',
'Class:lnkDeliveryModelToContact/Attribute:contact_id' => 'Contact~~',
'Class:lnkDeliveryModelToContact/Attribute:contact_name' => 'Contact name~~',
'Class:lnkDeliveryModelToContact/Attribute:role_id' => 'Role~~',
'Class:lnkDeliveryModelToContact/Attribute:role_name' => 'Role name~~',
));
?>

View File

@@ -0,0 +1,528 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// 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', '简体中文', array(
'Menu:ServiceManagement' => '服务管理',
'Menu:ServiceManagement+' => '服务管理概况',
'Menu:Service:Overview' => '概况',
'Menu:Service:Overview+' => '',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => '合同(按服务等级)',
'UI-ServiceManagementMenu-ContractsByStatus' => '合同(按状态)',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Contracts ending in less then 30 days',
'Menu:ProviderContract' => '供应商合同',
'Menu:ProviderContract+' => '供应商合同',
'Menu:CustomerContract' => '客户合同',
'Menu:CustomerContract+' => '客户合同',
'Menu:ServiceSubcategory' => '子服务',
'Menu:ServiceSubcategory+' => '子服务',
'Menu:Service' => '服务',
'Menu:Service+' => '服务',
'Menu:ServiceElement' => '服务元素',
'Menu:ServiceElement+' => '服务元素',
'Menu:SLA' => 'SLA',
'Menu:SLA+' => '服务等级协议',
'Menu:SLT' => 'SLT',
'Menu:SLT+' => '服务等级目标',
'Menu:DeliveryModel' => '交付模式',
'Menu:DeliveryModel+' => '交付模式',
'Menu:ServiceFamily' => '服务族',
'Menu:ServiceFamily+' => '服务族',
'Menu:Procedure' => '流程清单',
'Menu:Procedure+' => '所有流程清单',
));
//
// Class: Organization
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Organization/Attribute:deliverymodel_id' => '交付模式',
'Class:Organization/Attribute:deliverymodel_id+' => '',
'Class:Organization/Attribute:deliverymodel_name' => '交付模式名称',
));
//
// Class: ContractType
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ContractType' => '合同类型',
'Class:ContractType+' => '',
));
//
// Class: Contract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Contract' => '合同',
'Class:Contract+' => '',
'Class:Contract/Attribute:name' => '名称',
'Class:Contract/Attribute:name+' => '',
'Class:Contract/Attribute:org_id' => '客户',
'Class:Contract/Attribute:org_id+' => '',
'Class:Contract/Attribute:organization_name' => '客户名称',
'Class:Contract/Attribute:organization_name+' => '通用名称',
'Class:Contract/Attribute:contacts_list' => '联系人',
'Class:Contract/Attribute:contacts_list+' => '该客户合同相关的所有联系人',
'Class:Contract/Attribute:documents_list' => '文档',
'Class:Contract/Attribute:documents_list+' => '该客户合同相关的所有文档',
'Class:Contract/Attribute:description' => '描述',
'Class:Contract/Attribute:description+' => '',
'Class:Contract/Attribute:start_date' => '开始日期',
'Class:Contract/Attribute:start_date+' => '',
'Class:Contract/Attribute:end_date' => '结束日期',
'Class:Contract/Attribute:end_date+' => '',
'Class:Contract/Attribute:cost' => '计费',
'Class:Contract/Attribute:cost+' => '',
'Class:Contract/Attribute:cost_currency' => '结算货币',
'Class:Contract/Attribute:cost_currency+' => '',
'Class:Contract/Attribute:cost_currency/Value:dollars' => '美元',
'Class:Contract/Attribute:cost_currency/Value:dollars+' => '',
'Class:Contract/Attribute:cost_currency/Value:euros' => '欧元',
'Class:Contract/Attribute:cost_currency/Value:euros+' => '',
'Class:Contract/Attribute:contracttype_id' => '合同类型',
'Class:Contract/Attribute:contracttype_id+' => '',
'Class:Contract/Attribute:contracttype_name' => '合同类型名称',
'Class:Contract/Attribute:contracttype_name+' => '',
'Class:Contract/Attribute:billing_frequency' => '付款周期',
'Class:Contract/Attribute:billing_frequency+' => '',
'Class:Contract/Attribute:cost_unit' => '计费单位',
'Class:Contract/Attribute:cost_unit+' => '',
'Class:Contract/Attribute:provider_id' => '供应商',
'Class:Contract/Attribute:provider_id+' => '',
'Class:Contract/Attribute:provider_name' => '供应商名称',
'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: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: CustomerContract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CustomerContract' => '客户合同',
'Class:CustomerContract+' => '',
'Class:CustomerContract/Attribute:services_list' => '服务',
'Class:CustomerContract/Attribute:services_list+' => '该合同包含的所有服务',
));
//
// Class: ProviderContract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ProviderContract' => '供应商合同',
'Class:ProviderContract+' => '',
'Class:ProviderContract/Attribute:functionalcis_list' => '配置项',
'Class:ProviderContract/Attribute:functionalcis_list+' => '该供应商合同包含的所有配置项',
'Class:ProviderContract/Attribute:sla' => 'SLA',
'Class:ProviderContract/Attribute:sla+' => '服务等级协议',
'Class:ProviderContract/Attribute:coverage' => '服务时间',
'Class:ProviderContract/Attribute:coverage+' => '',
'Class:ProviderContract/Attribute:contracttype_id' => '合同类型',
'Class:ProviderContract/Attribute:contracttype_id+' => '',
'Class:ProviderContract/Attribute:contracttype_name' => '合同类型名称',
'Class:ProviderContract/Attribute:contracttype_name+' => '',
));
//
// Class: lnkContactToContract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkContactToContract' => '关联 联系人/合同',
'Class:lnkContactToContract+' => '',
'Class:lnkContactToContract/Attribute:contract_id' => '合同',
'Class:lnkContactToContract/Attribute:contract_id+' => '',
'Class:lnkContactToContract/Attribute:contract_name' => '合同名称',
'Class:lnkContactToContract/Attribute:contract_name+' => '',
'Class:lnkContactToContract/Attribute:contact_id' => '联系人',
'Class:lnkContactToContract/Attribute:contact_id+' => '',
'Class:lnkContactToContract/Attribute:contact_name' => '联系人名称',
'Class:lnkContactToContract/Attribute:contact_name+' => '',
));
//
// Class: lnkContractToDocument
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkContractToDocument' => '关联 合同/文档',
'Class:lnkContractToDocument+' => '',
'Class:lnkContractToDocument/Attribute:contract_id' => '合同',
'Class:lnkContractToDocument/Attribute:contract_id+' => '',
'Class:lnkContractToDocument/Attribute:contract_name' => '合同名称',
'Class:lnkContractToDocument/Attribute:contract_name+' => '',
'Class:lnkContractToDocument/Attribute:document_id' => '文档',
'Class:lnkContractToDocument/Attribute:document_id+' => '',
'Class:lnkContractToDocument/Attribute:document_name' => '文档名称',
'Class:lnkContractToDocument/Attribute:document_name+' => '',
));
//
// Class: lnkFunctionalCIToProviderContract
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkFunctionalCIToProviderContract' => '关联 功能配置项/供应商合同',
'Class:lnkFunctionalCIToProviderContract+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => '供应商合同',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name' => '供应商合同名称',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id' => '配置项',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name' => '配置项名称',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name+' => '',
));
//
// Class: ServiceFamily
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ServiceFamily' => '服务族',
'Class:ServiceFamily+' => '',
'Class:ServiceFamily/Attribute:name' => '名称',
'Class:ServiceFamily/Attribute:name+' => '',
'Class:ServiceFamily/Attribute:services_list' => '服务',
'Class:ServiceFamily/Attribute:icon' => '图标',
'Class:ServiceFamily/Attribute:icon+' => '',
'Class:ServiceFamily/Attribute:services_list+' => '所有的服务',
));
//
// Class: Service
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Service' => '服务',
'Class:Service+' => '',
'Class:Service/Attribute:name' => '名称',
'Class:Service/Attribute:name+' => '',
'Class:Service/Attribute:org_id' => '供应商',
'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_name' => '服务族名称',
'Class:Service/Attribute:servicefamily_name+' => '',
'Class:Service/Attribute:description' => '描述',
'Class:Service/Attribute:description+' => '',
'Class:Service/Attribute:documents_list' => '文档',
'Class:Service/Attribute:documents_list+' => '该服务相关的所有文档',
'Class:Service/Attribute:contacts_list' => '联系人',
'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:obsolete' => '废弃',
'Class:Service/Attribute:status/Value:obsolete+' => '',
'Class:Service/Attribute:status/Value:production' => '生产',
'Class:Service/Attribute:status/Value:production+' => '',
'Class:Service/Attribute:icon' => 'Icon',
'Class:Service/Attribute:icon+' => '',
'Class:Service/Attribute:customercontracts_list' => '客户合同',
'Class:Service/Attribute:customercontracts_list+' => '所有包含该服务的客户合同',
'Class:Service/Attribute:providercontracts_list' => '供应商合同',
'Class:Service/Attribute:providercontracts_list+' => '所有包含该服务的供应商合同',
'Class:Service/Attribute:functionalcis_list' => '配置项',
'Class:Service/Attribute:functionalcis_list+' => '提供该服务所需的所有配置项',
'Class:Service/Attribute:servicesubcategories_list' => '子服务',
'Class:Service/Attribute:servicesubcategories_list+' => '该服务的所有子服务',
));
//
// Class: lnkDocumentToService
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkDocumentToService' => '关联 文档/服务',
'Class:lnkDocumentToService+' => '',
'Class:lnkDocumentToService/Attribute:service_id' => '服务',
'Class:lnkDocumentToService/Attribute:service_id+' => '',
'Class:lnkDocumentToService/Attribute:service_name' => '服务名称',
'Class:lnkDocumentToService/Attribute:service_name+' => '',
'Class:lnkDocumentToService/Attribute:document_id' => '文档',
'Class:lnkDocumentToService/Attribute:document_id+' => '',
'Class:lnkDocumentToService/Attribute:document_name' => '文档名称',
'Class:lnkDocumentToService/Attribute:document_name+' => '',
));
//
// Class: lnkContactToService
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkContactToService' => '关联 联系人/服务',
'Class:lnkContactToService+' => '',
'Class:lnkContactToService/Attribute:service_id' => '服务',
'Class:lnkContactToService/Attribute:service_id+' => '',
'Class:lnkContactToService/Attribute:service_name' => '服务名称',
'Class:lnkContactToService/Attribute:service_name+' => '',
'Class:lnkContactToService/Attribute:contact_id' => '联系人',
'Class:lnkContactToService/Attribute:contact_id+' => '',
'Class:lnkContactToService/Attribute:contact_name' => '联系人名称',
'Class:lnkContactToService/Attribute:contact_name+' => '',
));
//
// Class: ServiceSubcategory
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ServiceSubcategory' => '子服务',
'Class:ServiceSubcategory+' => '',
'Class:ServiceSubcategory/Attribute:name' => '名称',
'Class:ServiceSubcategory/Attribute:name+' => '',
'Class:ServiceSubcategory/Attribute:description' => '描述',
'Class:ServiceSubcategory/Attribute:description+' => '',
'Class:ServiceSubcategory/Attribute:service_id' => '服务',
'Class:ServiceSubcategory/Attribute:service_id+' => '',
'Class:ServiceSubcategory/Attribute:service_name' => '服务名称',
'Class:ServiceSubcategory/Attribute:service_name+' => '',
'Class:ServiceSubcategory/Attribute:request_type' => '需求类型',
'Class:ServiceSubcategory/Attribute:request_type+' => '',
'Class:ServiceSubcategory/Attribute:request_type/Value:incident' => '事件',
'Class:ServiceSubcategory/Attribute:request_type/Value:incident+' => '事件',
'Class:ServiceSubcategory/Attribute:request_type/Value:service_request' => '服务需求',
'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:obsolete' => '废弃',
'Class:ServiceSubcategory/Attribute:status/Value:obsolete+' => '废弃',
'Class:ServiceSubcategory/Attribute:status/Value:production' => '生产',
'Class:ServiceSubcategory/Attribute:status/Value:production+' => '生产',
));
//
// Class: SLA
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:SLA' => 'SLA',
'Class:SLA+' => '',
'Class:SLA/Attribute:name' => '名称',
'Class:SLA/Attribute:name+' => '',
'Class:SLA/Attribute:description' => '描述',
'Class:SLA/Attribute:description+' => '',
'Class:SLA/Attribute:org_id' => '供应商',
'Class:SLA/Attribute:org_id+' => '',
'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:customercontracts_list' => '客户合同',
'Class:SLA/Attribute:customercontracts_list+' => '使用这个SLA 的所有客户合同',
));
//
// Class: SLT
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:SLT' => 'SLT',
'Class:SLT+' => '',
'Class:SLT/Attribute:name' => '名称',
'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:2' => '高',
'Class:SLT/Attribute:priority/Value:2+' => '高',
'Class:SLT/Attribute:priority/Value:3' => '中',
'Class:SLT/Attribute:priority/Value:3+' => '中',
'Class:SLT/Attribute:priority/Value:4' => '低',
'Class:SLT/Attribute:priority/Value:4+' => '低',
'Class:SLT/Attribute:request_type' => '需求类型',
'Class:SLT/Attribute:request_type+' => '',
'Class:SLT/Attribute:request_type/Value:incident' => '事件',
'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/Value:tto' => '响应时间',
'Class:SLT/Attribute:metric/Value:tto+' => '响应时间',
'Class:SLT/Attribute:metric/Value:ttr' => '解决时间',
'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/Value:hours' => '小时',
'Class:SLT/Attribute:unit/Value:hours+' => '小时',
'Class:SLT/Attribute:unit/Value:minutes' => '分钟',
'Class:SLT/Attribute:unit/Value:minutes+' => '分钟',
));
//
// Class: lnkSLAToSLT
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkSLAToSLT' => '关联 SLA/SLT',
'Class:lnkSLAToSLT+' => '',
'Class:lnkSLAToSLT/Attribute:sla_id' => 'SLA',
'Class:lnkSLAToSLT/Attribute:sla_id+' => '',
'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+' => '',
));
//
// Class: lnkCustomerContractToService
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkCustomerContractToService' => '关联 客户合同/服务',
'Class:lnkCustomerContractToService+' => '',
'Class:lnkCustomerContractToService/Attribute:customercontract_id' => '客户合同',
'Class:lnkCustomerContractToService/Attribute:customercontract_id+' => '',
'Class:lnkCustomerContractToService/Attribute:customercontract_name' => '客户合同名称',
'Class:lnkCustomerContractToService/Attribute:customercontract_name+' => '',
'Class:lnkCustomerContractToService/Attribute:service_id' => '服务',
'Class:lnkCustomerContractToService/Attribute:service_id+' => '',
'Class:lnkCustomerContractToService/Attribute:service_name' => '服务名称',
'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+' => '',
));
//
// Class: lnkProviderContractToService
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkProviderContractToService' => '关联 供应商合同/服务',
'Class:lnkProviderContractToService+' => '',
'Class:lnkProviderContractToService/Attribute:service_id' => '服务',
'Class:lnkProviderContractToService/Attribute:service_id+' => '',
'Class:lnkProviderContractToService/Attribute:service_name' => '服务名称',
'Class:lnkProviderContractToService/Attribute:service_name+' => '',
'Class:lnkProviderContractToService/Attribute:providercontract_id' => '供应商合同',
'Class:lnkProviderContractToService/Attribute:providercontract_id+' => '',
'Class:lnkProviderContractToService/Attribute:providercontract_name' => '供应商合同名称',
'Class:lnkProviderContractToService/Attribute:providercontract_name+' => '',
));
//
// Class: lnkFunctionalCIToService
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkFunctionalCIToService' => '关联 功能配置项/服务',
'Class:lnkFunctionalCIToService+' => '',
'Class:lnkFunctionalCIToService/Attribute:service_id' => '服务',
'Class:lnkFunctionalCIToService/Attribute:service_id+' => '',
'Class:lnkFunctionalCIToService/Attribute:service_name' => '服务名称',
'Class:lnkFunctionalCIToService/Attribute:service_name+' => '',
'Class:lnkFunctionalCIToService/Attribute:functionalci_id' => '配置项',
'Class:lnkFunctionalCIToService/Attribute:functionalci_id+' => '',
'Class:lnkFunctionalCIToService/Attribute:functionalci_name' => '配置项名称',
'Class:lnkFunctionalCIToService/Attribute:functionalci_name+' => '',
));
//
// Class: DeliveryModel
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:DeliveryModel' => '交付模式',
'Class:DeliveryModel+' => '',
'Class:DeliveryModel/Attribute:name' => '名称',
'Class:DeliveryModel/Attribute:name+' => '',
'Class:DeliveryModel/Attribute:org_id' => '组织',
'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:customers_list' => '客户',
'Class:DeliveryModel/Attribute:customers_list+' => '所有使用该交付模式的客户',
));
//
// Class: lnkDeliveryModelToContact
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkDeliveryModelToContact' => '关联 交付模式/联系人',
'Class:lnkDeliveryModelToContact+' => '',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id' => '交付模式',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id+' => '',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name' => '交付模式名称',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name+' => '',
'Class:lnkDeliveryModelToContact/Attribute:contact_id' => '联系人',
'Class:lnkDeliveryModelToContact/Attribute:contact_id+' => '',
'Class:lnkDeliveryModelToContact/Attribute:contact_name' => '联系人名称',
'Class:lnkDeliveryModelToContact/Attribute:contact_name+' => '',
'Class:lnkDeliveryModelToContact/Attribute:role_id' => '角色',
'Class:lnkDeliveryModelToContact/Attribute:role_id+' => '',
'Class:lnkDeliveryModelToContact/Attribute:role_name' => '角色名称',
'Class:lnkDeliveryModelToContact/Attribute:role_name+' => '',
));
?>

View File

@@ -1,376 +0,0 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: Ticket
//
//
// Class: Ticket
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Ticket' => '单据',
'Class:Ticket+' => '',
'Class:Ticket/Attribute:ref' => '参照',
'Class:Ticket/Attribute:ref+' => '',
'Class:Ticket/Attribute:title' => '标题',
'Class:Ticket/Attribute:title+' => '',
'Class:Ticket/Attribute:description' => '描述',
'Class:Ticket/Attribute:description+' => '',
'Class:Ticket/Attribute:ticket_log' => '日志',
'Class:Ticket/Attribute:ticket_log+' => '',
'Class:Ticket/Attribute:start_date' => '启始',
'Class:Ticket/Attribute:start_date+' => '',
'Class:Ticket/Attribute:document_list' => '文档',
'Class:Ticket/Attribute:document_list+' => '与该单据相关的文档',
'Class:Ticket/Attribute:ci_list' => 'CIs',
'Class:Ticket/Attribute:ci_list+' => '事件关联的 CIs',
'Class:Ticket/Attribute:contact_list' => '联系人',
'Class:Ticket/Attribute:contact_list+' => '相关的团队及人员',
'Class:Ticket/Attribute:incident_list' => '相关的事件',
'Class:Ticket/Attribute:incident_list+' => '',
'Class:Ticket/Attribute:finalclass' => '类别',
'Class:Ticket/Attribute:finalclass+' => '',
));
//
// Class: lnkTicketToDoc
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkTicketToDoc' => '单据/文档',
'Class:lnkTicketToDoc+' => '',
'Class:lnkTicketToDoc/Attribute:ticket_id' => '单据',
'Class:lnkTicketToDoc/Attribute:ticket_id+' => '',
'Class:lnkTicketToDoc/Attribute:ticket_ref' => '单据 #',
'Class:lnkTicketToDoc/Attribute:ticket_ref+' => '',
'Class:lnkTicketToDoc/Attribute:document_id' => '文档',
'Class:lnkTicketToDoc/Attribute:document_id+' => '',
'Class:lnkTicketToDoc/Attribute:document_name' => '文档',
'Class:lnkTicketToDoc/Attribute:document_name+' => '',
));
//
// Class: lnkTicketToContact
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkTicketToContact' => '单据/联系人',
'Class:lnkTicketToContact+' => '',
'Class:lnkTicketToContact/Attribute:ticket_id' => '单据',
'Class:lnkTicketToContact/Attribute:ticket_id+' => '',
'Class:lnkTicketToContact/Attribute:ticket_ref' => '单据 #',
'Class:lnkTicketToContact/Attribute:ticket_ref+' => '',
'Class:lnkTicketToContact/Attribute:contact_id' => '联系人',
'Class:lnkTicketToContact/Attribute:contact_id+' => '',
'Class:lnkTicketToContact/Attribute:contact_name' => '联系人',
'Class:lnkTicketToContact/Attribute:contact_name+' => '',
'Class:lnkTicketToContact/Attribute:contact_email' => 'Email',
'Class:lnkTicketToContact/Attribute:contact_email+' => '',
'Class:lnkTicketToContact/Attribute:role' => '角色',
'Class:lnkTicketToContact/Attribute:role+' => '',
));
//
// Class: lnkTicketToCI
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkTicketToCI' => '单据/CI',
'Class:lnkTicketToCI+' => '',
'Class:lnkTicketToCI/Attribute:ticket_id' => '单据',
'Class:lnkTicketToCI/Attribute:ticket_id+' => '',
'Class:lnkTicketToCI/Attribute:ticket_ref' => '单据 #',
'Class:lnkTicketToCI/Attribute:ticket_ref+' => '',
'Class:lnkTicketToCI/Attribute:ci_id' => 'CI',
'Class:lnkTicketToCI/Attribute:ci_id+' => '',
'Class:lnkTicketToCI/Attribute:ci_name' => 'CI',
'Class:lnkTicketToCI/Attribute:ci_name+' => '',
'Class:lnkTicketToCI/Attribute:ci_status' => 'CI 状态',
'Class:lnkTicketToCI/Attribute:ci_status+' => '',
'Class:lnkTicketToCI/Attribute:impact' => '影响',
'Class:lnkTicketToCI/Attribute:impact+' => '',
));
//
// Class: ResponseTicket
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ResponseTicket' => '回复单据',
'Class:ResponseTicket+' => '',
'Class:ResponseTicket/Attribute:status' => '状态',
'Class:ResponseTicket/Attribute:status+' => '',
'Class:ResponseTicket/Attribute:status/Value:new' => '新',
'Class:ResponseTicket/Attribute:status/Value:new+' => '新的待处理的',
'Class:ResponseTicket/Attribute:status/Value:escalated_tto' => '升级/TTO',
'Class:ResponseTicket/Attribute:status/Value:escalated_tto+' => '',
'Class:ResponseTicket/Attribute:status/Value:assigned' => '已指派',
'Class:ResponseTicket/Attribute:status/Value:assigned+' => '',
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr' => '升级/TTR',
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr+' => '',
'Class:ResponseTicket/Attribute:status/Value:frozen' => '未决',
'Class:ResponseTicket/Attribute:status/Value:frozen+' => '',
'Class:ResponseTicket/Attribute:status/Value:resolved' => '已解决',
'Class:ResponseTicket/Attribute:status/Value:resolved+' => '',
'Class:ResponseTicket/Attribute:status/Value:closed' => '关闭',
'Class:ResponseTicket/Attribute:status/Value:closed+' => '',
'Class:ResponseTicket/Attribute:caller_id' => '呼叫者',
'Class:ResponseTicket/Attribute:caller_id+' => '',
'Class:ResponseTicket/Attribute:caller_email' => 'Email',
'Class:ResponseTicket/Attribute:caller_email+' => '',
'Class:ResponseTicket/Attribute:org_id' => '客户',
'Class:ResponseTicket/Attribute:org_id+' => '',
'Class:ResponseTicket/Attribute:org_name' => '客户',
'Class:ResponseTicket/Attribute:org_name+' => '',
'Class:ResponseTicket/Attribute:service_id' => '服务',
'Class:ResponseTicket/Attribute:service_id+' => '',
'Class:ResponseTicket/Attribute:service_name' => '名称',
'Class:ResponseTicket/Attribute:service_name+' => '',
'Class:ResponseTicket/Attribute:servicesubcategory_id' => '服务元素',
'Class:ResponseTicket/Attribute:servicesubcategory_id+' => '',
'Class:ResponseTicket/Attribute:servicesubcategory_name' => '名称',
'Class:ResponseTicket/Attribute:servicesubcategory_name+' => '',
'Class:ResponseTicket/Attribute:product' => '生产',
'Class:ResponseTicket/Attribute:product+' => '',
'Class:ResponseTicket/Attribute:impact' => '影响',
'Class:ResponseTicket/Attribute:impact+' => '',
'Class:ResponseTicket/Attribute:impact/Value:1' => '单个部门',
'Class:ResponseTicket/Attribute:impact/Value:1+' => '',
'Class:ResponseTicket/Attribute:impact/Value:2' => '单个服务',
'Class:ResponseTicket/Attribute:impact/Value:2+' => '',
'Class:ResponseTicket/Attribute:impact/Value:3' => '个人',
'Class:ResponseTicket/Attribute:impact/Value:3+' => '',
'Class:ResponseTicket/Attribute:urgency' => '紧急',
'Class:ResponseTicket/Attribute:urgency+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:1' => '高',
'Class:ResponseTicket/Attribute:urgency/Value:1+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:2' => '中',
'Class:ResponseTicket/Attribute:urgency/Value:2+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:3' => '低',
'Class:ResponseTicket/Attribute:urgency/Value:3+' => '',
'Class:ResponseTicket/Attribute:priority' => '优先级',
'Class:ResponseTicket/Attribute:priority+' => '',
'Class:ResponseTicket/Attribute:priority/Value:1' => '高',
'Class:ResponseTicket/Attribute:priority/Value:1+' => '',
'Class:ResponseTicket/Attribute:priority/Value:2' => '中',
'Class:ResponseTicket/Attribute:priority/Value:2+' => '',
'Class:ResponseTicket/Attribute:priority/Value:3' => '低',
'Class:ResponseTicket/Attribute:priority/Value:3+' => '',
'Class:ResponseTicket/Attribute:workgroup_id' => '工作组',
'Class:ResponseTicket/Attribute:workgroup_id+' => '',
'Class:ResponseTicket/Attribute:workgroup_name' => '工作组',
'Class:ResponseTicket/Attribute:workgroup_name+' => '',
'Class:ResponseTicket/Attribute:agent_id' => '办理人',
'Class:ResponseTicket/Attribute:agent_id+' => '',
'Class:ResponseTicket/Attribute:agent_name' => '办理人',
'Class:ResponseTicket/Attribute:agent_name+' => '',
'Class:ResponseTicket/Attribute:agent_email' => '办理人 email',
'Class:ResponseTicket/Attribute:agent_email+' => '',
'Class:ResponseTicket/Attribute:related_problem_id' => '关联问题',
'Class:ResponseTicket/Attribute:related_problem_id+' => '',
'Class:ResponseTicket/Attribute:related_problem_ref' => '参照',
'Class:ResponseTicket/Attribute:related_problem_ref+' => '',
'Class:ResponseTicket/Attribute:related_change_id' => '关联变更',
'Class:ResponseTicket/Attribute:related_change_id+' => '',
'Class:ResponseTicket/Attribute:related_change_ref' => '关联变更',
'Class:ResponseTicket/Attribute:related_change_ref+' => '',
'Class:ResponseTicket/Attribute:close_date' => '关闭',
'Class:ResponseTicket/Attribute:close_date+' => '',
'Class:ResponseTicket/Attribute:last_update' => '最后更新',
'Class:ResponseTicket/Attribute:last_update+' => '',
'Class:ResponseTicket/Attribute:assignment_date' => '指派日期',
'Class:ResponseTicket/Attribute:assignment_date+' => '',
'Class:ResponseTicket/Attribute:resolution_date' => '解决日期',
'Class:ResponseTicket/Attribute:resolution_date+' => '',
'Class:ResponseTicket/Attribute:tto_escalation_deadline' => 'TTO 升级的最后期限',
'Class:ResponseTicket/Attribute:tto_escalation_deadline+' => '',
'Class:ResponseTicket/Attribute:ttr_escalation_deadline' => 'TTR 升级的最后期限',
'Class:ResponseTicket/Attribute:ttr_escalation_deadline+' => '',
'Class:ResponseTicket/Attribute:closure_deadline' => '关闭的最后期限',
'Class:ResponseTicket/Attribute:closure_deadline+' => '',
'Class:ResponseTicket/Attribute:resolution_code' => '解决编码',
'Class:ResponseTicket/Attribute:resolution_code+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce' => '不能重生',
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate' => '复制单据',
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed' => '搞定',
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant' => '无关的',
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant+' => '',
'Class:ResponseTicket/Attribute:solution' => '方案',
'Class:ResponseTicket/Attribute:solution+' => '',
'Class:ResponseTicket/Attribute:user_satisfaction' => '用户满意',
'Class:ResponseTicket/Attribute:user_satisfaction+' => '',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1' => '非常满意',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1+' => '非常满意',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2' => '比较满意',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2+' => '比较满意',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3' => '一般',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3+' => '一般',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4' => '非常不满',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4+' => '非常不满',
'Class:ResponseTicket/Attribute:user_commment' => '用户意见',
'Class:ResponseTicket/Attribute:user_commment+' => '',
'Class:ResponseTicket/Stimulus:ev_assign' => '指派',
'Class:ResponseTicket/Stimulus:ev_assign+' => '',
'Class:ResponseTicket/Stimulus:ev_reassign' => '再指派',
'Class:ResponseTicket/Stimulus:ev_reassign+' => '',
'Class:ResponseTicket/Stimulus:ev_timeout' => '升级',
'Class:ResponseTicket/Stimulus:ev_timeout+' => '',
'Class:ResponseTicket/Stimulus:ev_resolve' => '标记为已解决',
'Class:ResponseTicket/Stimulus:ev_resolve+' => '',
'Class:ResponseTicket/Stimulus:ev_close' => '关闭',
'Class:ResponseTicket/Stimulus:ev_close+' => '',
'Class:Ticket/Attribute:org_id' => 'Organization~~',
'Class:Ticket/Attribute:org_name' => 'Organization Name~~',
'Class:Ticket/Attribute:caller_id' => 'Caller~~',
'Class:Ticket/Attribute:caller_name' => 'Caller Name~~',
'Class:Ticket/Attribute:team_id' => 'Team~~',
'Class:Ticket/Attribute:team_name' => 'Team Name~~',
'Class:Ticket/Attribute:agent_id' => 'Agent~~',
'Class:Ticket/Attribute:agent_name' => 'Agent Name~~',
'Class:Ticket/Attribute:end_date' => 'End date~~',
'Class:Ticket/Attribute:last_update' => 'Last update~~',
'Class:Ticket/Attribute:close_date' => 'Close date~~',
'Class:Ticket/Attribute:private_log' => 'Private log~~',
'Class:Ticket/Attribute:contacts_list' => 'Contacts~~',
'Class:Ticket/Attribute:contacts_list+' => 'All the contacts linked to this ticket~~',
'Class:Ticket/Attribute:functionalcis_list' => 'CIs~~',
'Class:Ticket/Attribute:functionalcis_list+' => 'All the configuration items impacted for this ticket~~',
'Class:Ticket/Attribute:workorders_list' => 'Work orders~~',
'Class:Ticket/Attribute:workorders_list+' => 'All the work orders for this ticket~~',
'Ticket:ImpactAnalysis' => 'Impact Analysis~~',
'Class:lnkContactToTicket' => 'Link Contact / Ticket~~',
'Class:lnkContactToTicket/Attribute:ticket_id' => 'Ticket~~',
'Class:lnkContactToTicket/Attribute:ticket_ref' => 'Ref~~',
'Class:lnkContactToTicket/Attribute:contact_id' => 'Contact~~',
'Class:lnkContactToTicket/Attribute:contact_email' => 'Contact Email~~',
'Class:lnkContactToTicket/Attribute:role' => 'Role (text)~~',
'Class:lnkContactToTicket/Attribute:role_code' => 'Role~~',
'Class:lnkContactToTicket/Attribute:role_code/Value:manual' => 'Added manually~~',
'Class:lnkContactToTicket/Attribute:role_code/Value:computed' => 'Computed~~',
'Class:lnkContactToTicket/Attribute:role_code/Value:do_not_notify' => 'Do not notify~~',
'Class:lnkFunctionalCIToTicket' => 'Link FunctionalCI / Ticket~~',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id' => 'Ticket~~',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref' => 'Ref~~',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_id' => 'CI~~',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_name' => 'CI Name~~',
'Class:lnkFunctionalCIToTicket/Attribute:impact' => 'Impact (text)~~',
'Class:lnkFunctionalCIToTicket/Attribute:impact_code' => 'Impact~~',
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:manual' => 'Added manually~~',
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:computed' => 'Computed~~',
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:not_impacted' => 'Not impacted~~',
'Class:WorkOrder' => 'Work Order~~',
'Class:WorkOrder/Attribute:name' => 'Name~~',
'Class:WorkOrder/Attribute:status' => 'Status~~',
'Class:WorkOrder/Attribute:status/Value:open' => 'open~~',
'Class:WorkOrder/Attribute:status/Value:closed' => 'closed~~',
'Class:WorkOrder/Attribute:description' => 'Description~~',
'Class:WorkOrder/Attribute:ticket_id' => 'Ticket~~',
'Class:WorkOrder/Attribute:ticket_ref' => 'Ticket ref~~',
'Class:WorkOrder/Attribute:team_id' => 'Team~~',
'Class:WorkOrder/Attribute:team_name' => 'Team Name~~',
'Class:WorkOrder/Attribute:agent_id' => 'Agent~~',
'Class:WorkOrder/Attribute:agent_email' => 'Agent email~~',
'Class:WorkOrder/Attribute:start_date' => 'Start date~~',
'Class:WorkOrder/Attribute:end_date' => 'End date~~',
'Class:WorkOrder/Attribute:log' => 'Log~~',
'Class:WorkOrder/Stimulus:ev_close' => 'Close~~',
'Ticket:baseinfo' => 'General Information~~',
'Ticket:date' => 'Dates~~',
'Ticket:contact' => 'Contacts~~',
'Ticket:moreinfo' => 'More Information~~',
'Ticket:relation' => 'Relations~~',
'Ticket:log' => 'Communications~~',
'Ticket:Type' => 'Qualification~~',
'Ticket:support' => 'Support~~',
'Ticket:resolution' => 'Resolution~~',
'Ticket:SLA' => 'SLA report~~',
'WorkOrder:Details' => 'Details~~',
'WorkOrder:Moreinfo' => 'More information~~',
'Tickets:ResolvedFrom' => 'Automatically resolved from %1$s~~',
'Class:cmdbAbstractObject/Method:Set' => 'Set~~',
'Class:cmdbAbstractObject/Method:Set+' => 'Set a field with a static value~~',
'Class:cmdbAbstractObject/Method:Set/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:Set/Param:1+' => 'The field to set, in the current object~~',
'Class:cmdbAbstractObject/Method:Set/Param:2' => 'Value~~',
'Class:cmdbAbstractObject/Method:Set/Param:2+' => 'The value to set~~',
'Class:cmdbAbstractObject/Method:SetCurrentDate' => 'SetCurrentDate~~',
'Class:cmdbAbstractObject/Method:SetCurrentDate+' => 'Set a field with the current date and time~~',
'Class:cmdbAbstractObject/Method:SetCurrentDate/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:SetCurrentDate/Param:1+' => 'The field to set, in the current object~~',
'Class:cmdbAbstractObject/Method:SetCurrentUser' => 'SetCurrentUser~~',
'Class:cmdbAbstractObject/Method:SetCurrentUser+' => 'Set a field with the currently logged in user~~',
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1+' => 'The field to set, in the current object. If the field is a string then the friendly name will be used, otherwise the identifier will be used. That friendly name is the name of the person if any is attached to the user, otherwise it is the login.~~',
'Class:cmdbAbstractObject/Method:SetCurrentPerson' => 'SetCurrentPerson~~',
'Class:cmdbAbstractObject/Method:SetCurrentPerson+' => 'Set a field with the currently logged in person (the \"person\" attached to the logged in \"user\").~~',
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1+' => 'The field to set, in the current object. If the field is a string then the friendly name will be used, otherwise the identifier will be used.~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime' => 'SetElapsedTime~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime+' => 'Set a field with the time (seconds) elapsed since a date given by another field~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:1+' => 'The field to set, in the current object~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2' => 'Reference Field~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2+' => 'The field from which to get the reference date~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3' => 'Working Hours~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3+' => 'Leave empty to rely on the standard working hours scheme, or set to \"DefaultWorkingTimeComputer\" to force a 24x7 scheme~~',
'Class:cmdbAbstractObject/Method:Reset' => 'Reset~~',
'Class:cmdbAbstractObject/Method:Reset+' => 'Reset a field to its default value~~',
'Class:cmdbAbstractObject/Method:Reset/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:Reset/Param:1+' => 'The field to reset, in the current object~~',
'Class:cmdbAbstractObject/Method:Copy' => 'Copy~~',
'Class:cmdbAbstractObject/Method:Copy+' => 'Copy the value of a field to another field~~',
'Class:cmdbAbstractObject/Method:Copy/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:Copy/Param:1+' => 'The field to set, in the current object~~',
'Class:cmdbAbstractObject/Method:Copy/Param:2' => 'Source Field~~',
'Class:cmdbAbstractObject/Method:Copy/Param:2+' => 'The field to get the value from, in the current object~~',
'Class:ResponseTicketTTO/Interface:iMetricComputer' => 'Time To Own~~',
'Class:ResponseTicketTTO/Interface:iMetricComputer+' => 'Goal based on a SLT of type TTO~~',
'Class:ResponseTicketTTR/Interface:iMetricComputer' => 'Time To Resolve~~',
'Class:ResponseTicketTTR/Interface:iMetricComputer+' => 'Goal based on a SLT of type TTR~~',
));
?>

View File

@@ -0,0 +1,256 @@
<?php
// Copyright (C) 2010-2014 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// 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', '简体中文', array(
'Class:Ticket' => '工单',
'Class:Ticket+' => '',
'Class:Ticket/Attribute:ref' => '编号',
'Class:Ticket/Attribute:ref+' => '',
'Class:Ticket/Attribute:org_id' => '组织',
'Class:Ticket/Attribute:org_id+' => '',
'Class:Ticket/Attribute:org_name' => '组织名称',
'Class:Ticket/Attribute:org_name+' => '',
'Class:Ticket/Attribute:caller_id' => '发起人',
'Class:Ticket/Attribute:caller_id+' => '',
'Class:Ticket/Attribute:caller_name' => '发起人名称',
'Class:Ticket/Attribute:caller_name+' => '',
'Class:Ticket/Attribute:team_id' => '执行团队',
'Class:Ticket/Attribute:team_id+' => '',
'Class:Ticket/Attribute:team_name' => '团队名称',
'Class:Ticket/Attribute:team_name+' => '',
'Class:Ticket/Attribute:agent_id' => '办理人',
'Class:Ticket/Attribute:agent_id+' => '',
'Class:Ticket/Attribute:agent_name' => '办理人名称',
'Class:Ticket/Attribute:agent_name+' => '',
'Class:Ticket/Attribute:title' => '标题',
'Class:Ticket/Attribute:title+' => '',
'Class:Ticket/Attribute:description' => '描述',
'Class:Ticket/Attribute:description+' => '',
'Class:Ticket/Attribute:start_date' => '开始日期',
'Class:Ticket/Attribute:start_date+' => '',
'Class:Ticket/Attribute:end_date' => '结束日期',
'Class:Ticket/Attribute:end_date+' => '',
'Class:Ticket/Attribute:last_update' => '最后更新',
'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:contacts_list' => '联系人',
'Class:Ticket/Attribute:contacts_list+' => '该工单相关的所有联系人',
'Class:Ticket/Attribute:functionalcis_list' => '配置项',
'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:operational_status' => '操作状态',
'Class:Ticket/Attribute:operational_status+' => '按具体状态',
'Class:Ticket/Attribute:operational_status/Value:ongoing' => '进行中',
'Class:Ticket/Attribute:operational_status/Value:ongoing+' => '进行中',
'Class:Ticket/Attribute:operational_status/Value:resolved' => '已解决',
'Class:Ticket/Attribute:operational_status/Value:resolved+' => '',
'Class:Ticket/Attribute:operational_status/Value:closed' => '已关闭',
'Class:Ticket/Attribute:operational_status/Value:closed+' => '',
'Ticket:ImpactAnalysis' => '影响分析',
));
//
// Class: lnkContactToTicket
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkContactToTicket' => '关联 联系人/工单',
'Class:lnkContactToTicket+' => '',
'Class:lnkContactToTicket/Attribute:ticket_id' => '工单',
'Class:lnkContactToTicket/Attribute:ticket_id+' => '',
'Class:lnkContactToTicket/Attribute:ticket_ref' => '工单编号',
'Class:lnkContactToTicket/Attribute:ticket_ref+' => '',
'Class:lnkContactToTicket/Attribute:contact_id' => '联系人',
'Class:lnkContactToTicket/Attribute:contact_id+' => '',
'Class:lnkContactToTicket/Attribute:contact_email' => '邮箱',
'Class:lnkContactToTicket/Attribute:contact_email+' => '',
'Class:lnkContactToTicket/Attribute:role' => '角色 (文本)',
'Class:lnkContactToTicket/Attribute:role+' => '',
'Class:lnkContactToTicket/Attribute:role_code' => '角色',
'Class:lnkContactToTicket/Attribute:role_code/Value:manual' => '手动添加',
'Class:lnkContactToTicket/Attribute:role_code/Value:computed' => '自动添加',
'Class:lnkContactToTicket/Attribute:role_code/Value:do_not_notify' => '不通知',
));
//
// Class: lnkFunctionalCIToTicket
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkFunctionalCIToTicket' => '关联 功能配置项/工单',
'Class:lnkFunctionalCIToTicket+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id' => '工单',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref' => '工单编号',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_id' => '配置项',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_id+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_name' => '配置项名称',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_name+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:impact' => '影响 (文本)',
'Class:lnkFunctionalCIToTicket/Attribute:impact+' => '',
'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: WorkOrder
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:WorkOrder' => '工作任务',
'Class:WorkOrder+' => '',
'Class:WorkOrder/Attribute:name' => '名称',
'Class:WorkOrder/Attribute:name+' => '',
'Class:WorkOrder/Attribute:status' => '状态',
'Class:WorkOrder/Attribute:status+' => '',
'Class:WorkOrder/Attribute:status/Value:open' => '打开',
'Class:WorkOrder/Attribute:status/Value:open+' => '',
'Class:WorkOrder/Attribute:status/Value:closed' => '已关闭',
'Class:WorkOrder/Attribute:status/Value:closed+' => '',
'Class:WorkOrder/Attribute:description' => '描述',
'Class:WorkOrder/Attribute:description+' => '',
'Class:WorkOrder/Attribute:ticket_id' => '工单',
'Class:WorkOrder/Attribute:ticket_id+' => '',
'Class:WorkOrder/Attribute:ticket_ref' => '工单编号',
'Class:WorkOrder/Attribute:ticket_ref+' => '',
'Class:WorkOrder/Attribute:team_id' => '执行团队',
'Class:WorkOrder/Attribute:team_id+' => '',
'Class:WorkOrder/Attribute:team_name' => '团队名称',
'Class:WorkOrder/Attribute:team_name+' => '',
'Class:WorkOrder/Attribute:agent_id' => '办理人',
'Class:WorkOrder/Attribute:agent_id+' => '',
'Class:WorkOrder/Attribute:agent_email' => '邮箱',
'Class:WorkOrder/Attribute:agent_email+' => '',
'Class:WorkOrder/Attribute:start_date' => '开始日期',
'Class:WorkOrder/Attribute:start_date+' => '',
'Class:WorkOrder/Attribute:end_date' => '结束日期',
'Class:WorkOrder/Attribute:end_date+' => '',
'Class:WorkOrder/Attribute:log' => '日志',
'Class:WorkOrder/Attribute:log+' => '',
'Class:WorkOrder/Stimulus:ev_close' => '关闭',
'Class:WorkOrder/Stimulus:ev_close+' => '',
));
// Fieldset translation
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'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:SetCurrentUser' => '设置为当前用户',
'Class:cmdbAbstractObject/Method:SetCurrentUser+' => '填写当前登录用户',
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1' => '目标字段',
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1+' => 'The field to set, in the current object. If the field is a string then the friendly name will be used, otherwise the identifier will be used. That friendly name is the name of the person if any is attached to the user, otherwise it is the login.',
'Class:cmdbAbstractObject/Method:SetCurrentPerson' => '设置为当前个体',
'Class:cmdbAbstractObject/Method:SetCurrentPerson+' => 'Set a field with the currently logged in person (the "person" attached to the logged in "user").',
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1' => '目标字段',
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1+' => '填写当前对象,如果填写字符串则是昵称.',
'Class:cmdbAbstractObject/Method:SetElapsedTime' => '设置已过时间',
'Class:cmdbAbstractObject/Method:SetElapsedTime+' => 'Set a field with the time (seconds) elapsed since a date given by another field',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:1' => '目标字段',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:1+' => 'The field to set, in the current object',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2' => '参考字段',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2+' => 'The field from which to get the reference date',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3' => '工作时间',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3+' => 'Leave empty to rely on the standard working hours scheme, or set to "DefaultWorkingTimeComputer" to force a 24x7 scheme',
'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' => 'ApplyStimulus',
'Class:cmdbAbstractObject/Method:ApplyStimulus+' => 'Apply the specified stimulus to the current object',
'Class:cmdbAbstractObject/Method:ApplyStimulus/Param:1' => 'Stimulus code',
'Class:cmdbAbstractObject/Method:ApplyStimulus/Param:1+' => 'A valid stimulus code for the current class',
'Class:ResponseTicketTTO/Interface:iMetricComputer' => '响应时间',
'Class:ResponseTicketTTO/Interface:iMetricComputer+' => 'SLT 的响应时间',
'Class:ResponseTicketTTR/Interface:iMetricComputer' => '解决时间',
'Class:ResponseTicketTTR/Interface:iMetricComputer+' => 'SLT 的解决时间',
'portal:itop-portal' => '标准门户', // This is the portal name that will be displayed in portal dispatcher (eg. URL in menus)
'Page:DefaultTitle' => 'iTop - 用户门户',
'Brick:Portal:UserProfile:Title' => '我的资料',
'Brick:Portal:NewRequest:Title' => '新建工单',
'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' => '已关闭的工单',
));

View File

@@ -22,37 +22,37 @@
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:DataSources' => '同步数据源',
'Menu:DataSources+' => '所有同步数据源',
'Menu:WelcomeMenu' => '欢迎',
'Menu:WelcomeMenu+' => '欢迎来到iTop',
'Menu:WelcomeMenu+' => '欢迎使用iTop',
'Menu:WelcomeMenuPage' => '欢迎',
'Menu:WelcomeMenuPage+' => '欢迎来到iTop',
'Menu:WelcomeMenuPage+' => '欢迎使用iTop',
'Menu:AdminTools' => '管理工具',
'Menu:AdminTools+' => '管理工具',
'Menu:AdminTools?' => '具有系统管理员简档的用户才能获得的工具',
'Menu:AdminTools?' => '具有管理员角色的用户才能使用的工具',
'Menu:DataModelMenu' => '数据模型',
'Menu:DataModelMenu+' => '数据模型概',
'Menu:DataModelMenu+' => '数据模型概',
'Menu:ExportMenu' => '导出',
'Menu:ExportMenu+' => '以HTML, CSV or XML格式导出任何查询的结果',
'Menu:ExportMenu+' => '以HTML, CSV XML 格式导出任何查询的结果',
'Menu:NotificationsMenu' => '通知',
'Menu:NotificationsMenu+' => '通知的配置',
'Menu:AuditCategories' => '审计类',
'Menu:AuditCategories+' => '审计类',
'Menu:Notifications:Title' => '审计类',
'Menu:NotificationsMenu+' => '配置通知',
'Menu:AuditCategories' => '审计类',
'Menu:AuditCategories+' => '审计类',
'Menu:Notifications:Title' => '审计类',
'Menu:RunQueriesMenu' => '运行查询',
'Menu:RunQueriesMenu+' => '运行任何查询',
'Menu:UniversalSearchMenu' => '通用搜索',
'Menu:QueryMenu' => '查询手册',
'Menu:QueryMenu+' => '查询手册',
'Menu:UniversalSearchMenu' => '全局搜索',
'Menu:UniversalSearchMenu+' => '搜索所有...',
'Menu:UserManagementMenu' => '用户管理',
'Menu:UserManagementMenu+' => '用户管理',
'Menu:ProfilesMenu' => '简档',
'Menu:ProfilesMenu+' => '简档',
'Menu:ProfilesMenu:Title' => '简档',
'Menu:ProfilesMenu' => '角色',
'Menu:ProfilesMenu+' => '角色',
'Menu:ProfilesMenu:Title' => '角色',
'Menu:UserAccountsMenu' => '用户帐户',
'Menu:UserAccountsMenu+' => '用户帐户',
'Menu:UserAccountsMenu:Title' => '用户帐户',
'Menu:DataSources' => 'Synchronization Data Sources~~',
'Menu:DataSources+' => 'All Synchronization Data Sources~~',
'Menu:QueryMenu' => 'Query phrasebook~~',
'Menu:QueryMenu+' => 'Query phrasebook~~',
'Menu:MyShortcuts' => 'My Shortcuts~~',
'Menu:MyShortcuts' => '我的快捷方式',
));

View File

@@ -1,802 +0,0 @@
<?php
// Copyright (C) 2010-2017 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @author Robert Deng <denglx@gmail.com>
* @copyright Copyright (C) 2010-2017 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
//////////////////////////////////////////////////////////////////////
// Classes in 'core/cmdb'
//////////////////////////////////////////////////////////////////////
//
//
// Class: CMDBChange
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChange' => '变更',
'Class:CMDBChange+' => '变更跟踪',
'Class:CMDBChange/Attribute:date' => '日期',
'Class:CMDBChange/Attribute:date+' => '变更被记录的日期和时间',
'Class:CMDBChange/Attribute:userinfo' => '杂项. 信息',
'Class:CMDBChange/Attribute:userinfo+' => '呼叫者已定义的信息',
));
//
// Class: CMDBChangeOp
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOp' => '变更操作',
'Class:CMDBChangeOp+' => '变更操作跟踪',
'Class:CMDBChangeOp/Attribute:change' => '变更',
'Class:CMDBChangeOp/Attribute:change+' => '变更',
'Class:CMDBChangeOp/Attribute:date' => '日期',
'Class:CMDBChangeOp/Attribute:date+' => '变更的日期和时间',
'Class:CMDBChangeOp/Attribute:userinfo' => '用户',
'Class:CMDBChangeOp/Attribute:userinfo+' => '变更造成者',
'Class:CMDBChangeOp/Attribute:objclass' => '对象类',
'Class:CMDBChangeOp/Attribute:objclass+' => '对象类',
'Class:CMDBChangeOp/Attribute:objkey' => '对象 id',
'Class:CMDBChangeOp/Attribute:objkey+' => '对象 id',
'Class:CMDBChangeOp/Attribute:finalclass' => '类别',
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
));
//
// Class: CMDBChangeOpCreate
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOpCreate' => '对象创建',
'Class:CMDBChangeOpCreate+' => '对象创建跟踪',
));
//
// Class: CMDBChangeOpDelete
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOpDelete' => '对象删除',
'Class:CMDBChangeOpDelete+' => '对象删除跟踪',
));
//
// Class: CMDBChangeOpSetAttribute
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOpSetAttribute' => '对象变更',
'Class:CMDBChangeOpSetAttribute+' => '对象属性变更跟踪',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => '属性',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => '被修改属性的编码',
));
//
// Class: CMDBChangeOpSetAttributeScalar
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOpSetAttributeScalar' => '属性变更',
'Class:CMDBChangeOpSetAttributeScalar+' => '对象标量属性变更跟踪',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => '原值',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => '属性原值',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => '新值',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => '属性新值',
));
// Used by CMDBChangeOp... & derived classes
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Change:ObjectCreated' => 'Object created',
'Change:ObjectDeleted' => 'Object deleted',
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s set to %2$s (previous value: %3$s)',
'Change:AttName_SetTo' => '%1$s set to %2$s',
'Change:Text_AppendedTo_AttName' => '%1$s appended to %2$s',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s modified, previous value: %2$s',
'Change:AttName_Changed' => '%1$s modified',
));
//
// Class: CMDBChangeOpSetAttributeBlob
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOpSetAttributeBlob' => '数据变更',
'Class:CMDBChangeOpSetAttributeBlob+' => '数据变更跟踪',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => '原数据',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => '属性原来的内容',
));
//
// Class: CMDBChangeOpSetAttributeText
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOpSetAttributeText' => '文本变更',
'Class:CMDBChangeOpSetAttributeText+' => '文本变更跟踪',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => '原数据',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => '属性原来的内容',
));
//
// Class: Event
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Event' => '记录事项',
'Class:Event+' => '应用程序的内部事项',
'Class:Event/Attribute:message' => '消息',
'Class:Event/Attribute:message+' => '事项简述',
'Class:Event/Attribute:date' => '日期',
'Class:Event/Attribute:date+' => '变更被记录的日期和时间',
'Class:Event/Attribute:userinfo' => '用户信息',
'Class:Event/Attribute:userinfo+' => '用户标识, 该用户的活动触发了该事项',
'Class:Event/Attribute:finalclass' => '类别',
'Class:Event/Attribute:finalclass+' => '',
));
//
// Class: EventNotification
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:EventNotification' => '通知事项',
'Class:EventNotification+' => '被发送通知的踪迹',
'Class:EventNotification/Attribute:trigger_id' => '触发器',
'Class:EventNotification/Attribute:trigger_id+' => '用户帐户',
'Class:EventNotification/Attribute:action_id' => '用户',
'Class:EventNotification/Attribute:action_id+' => '用户帐户',
'Class:EventNotification/Attribute:object_id' => '对象 id',
'Class:EventNotification/Attribute:object_id+' => '对象 id (由触发器定义的类 ?)',
));
//
// Class: EventNotificationEmail
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:EventNotificationEmail' => 'Email 发出事项',
'Class:EventNotificationEmail+' => '被发送的Email的踪迹',
'Class:EventNotificationEmail/Attribute:to' => 'TO',
'Class:EventNotificationEmail/Attribute:to+' => 'TO',
'Class:EventNotificationEmail/Attribute:cc' => 'CC',
'Class:EventNotificationEmail/Attribute:cc+' => 'CC',
'Class:EventNotificationEmail/Attribute:bcc' => 'BCC',
'Class:EventNotificationEmail/Attribute:bcc+' => 'BCC',
'Class:EventNotificationEmail/Attribute:from' => 'From',
'Class:EventNotificationEmail/Attribute:from+' => '消息发送者',
'Class:EventNotificationEmail/Attribute:subject' => '主题',
'Class:EventNotificationEmail/Attribute:subject+' => '主题',
'Class:EventNotificationEmail/Attribute:body' => '邮件体',
'Class:EventNotificationEmail/Attribute:body+' => '邮件体',
));
//
// Class: EventIssue
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:EventIssue' => '议题事项',
'Class:EventIssue+' => '议题踪迹 (警告, 错误, 等等.)',
'Class:EventIssue/Attribute:issue' => '议题',
'Class:EventIssue/Attribute:issue+' => '发生了什么',
'Class:EventIssue/Attribute:impact' => '影响',
'Class:EventIssue/Attribute:impact+' => '结果是什么',
'Class:EventIssue/Attribute:page' => '页面',
'Class:EventIssue/Attribute:page+' => 'HTTP 入口',
'Class:EventIssue/Attribute:arguments_post' => 'Posted arguments',
'Class:EventIssue/Attribute:arguments_post+' => 'HTTP POST arguments',
'Class:EventIssue/Attribute:arguments_get' => 'URL arguments',
'Class:EventIssue/Attribute:arguments_get+' => 'HTTP GET arguments',
'Class:EventIssue/Attribute:callstack' => 'Callstack',
'Class:EventIssue/Attribute:callstack+' => 'Call stack',
'Class:EventIssue/Attribute:data' => 'Data',
'Class:EventIssue/Attribute:data+' => 'More information',
));
//
// Classes: EventWebService and EventRestService
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:EventWebService' => 'Web 服务事项',
'Class:EventWebService+' => 'Web 服务调用的踪迹',
'Class:EventWebService/Attribute:verb' => 'Verb',
'Class:EventWebService/Attribute:verb+' => '操作的名称',
'Class:EventWebService/Attribute:result' => '结果',
'Class:EventWebService/Attribute:result+' => '概览 成功/失败',
'Class:EventWebService/Attribute:log_info' => '信息记录',
'Class:EventWebService/Attribute:log_info+' => '结果信息记录',
'Class:EventWebService/Attribute:log_warning' => '警告记录',
'Class:EventWebService/Attribute:log_warning+' => '结果警告记录',
'Class:EventWebService/Attribute:log_error' => '错误记录',
'Class:EventWebService/Attribute:log_error+' => '结果错误记录',
'Class:EventWebService/Attribute:data' => '数据',
'Class:EventWebService/Attribute:data+' => '结果数据',
'Class:EventRestService' => 'REST/JSON call~~',
'Class:EventRestService+' => 'Trace of a REST/JSON service call~~',
'Class:EventRestService/Attribute:operation' => 'Operation~~',
'Class:EventRestService/Attribute:operation+' => 'Argument \'operation\'~~',
'Class:EventRestService/Attribute:version' => 'Version~~',
'Class:EventRestService/Attribute:version+' => 'Argument \'version\'~~',
'Class:EventRestService/Attribute:json_input' => 'Input~~',
'Class:EventRestService/Attribute:json_input+' => 'Argument \'json_data\'~~',
'Class:EventRestService/Attribute:code' => 'Code~~',
'Class:EventRestService/Attribute:code+' => 'Result code~~',
'Class:EventRestService/Attribute:json_output' => 'Response~~',
'Class:EventRestService/Attribute:json_output+' => 'HTTP response (json)~~',
'Class:EventRestService/Attribute:provider' => 'Provider~~',
'Class:EventRestService/Attribute:provider+' => 'PHP class implementing the expected operation~~',
));
//
// Class: Action
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Action' => '客户化动作',
'Class:Action+' => '用户定义的动作',
'Class:Action/Attribute:name' => '名称',
'Class:Action/Attribute:name+' => '',
'Class:Action/Attribute:description' => '描述',
'Class:Action/Attribute:description+' => '',
'Class:Action/Attribute:status' => '状态',
'Class:Action/Attribute:status+' => '生产中 或 ?',
'Class:Action/Attribute:status/Value:test' => '测试中',
'Class:Action/Attribute:status/Value:test+' => '测试中',
'Class:Action/Attribute:status/Value:enabled' => '生产中',
'Class:Action/Attribute:status/Value:enabled+' => '生产中',
'Class:Action/Attribute:status/Value:disabled' => '非活动',
'Class:Action/Attribute:status/Value:disabled+' => '非活动',
'Class:Action/Attribute:trigger_list' => '相关触发器',
'Class:Action/Attribute:trigger_list+' => '关联到该动作的触发器',
'Class:Action/Attribute:finalclass' => '类别',
'Class:Action/Attribute:finalclass+' => '',
));
//
// Class: ActionNotification
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ActionNotification' => '通知',
'Class:ActionNotification+' => '通知 (摘要)',
));
//
// Class: ActionEmail
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ActionEmail' => 'Email 通知',
'Class:ActionEmail+' => '',
'Class:ActionEmail/Attribute:test_recipient' => '测试收件人',
'Class:ActionEmail/Attribute:test_recipient+' => '状态被设置为"测试"时的目的地',
'Class:ActionEmail/Attribute:from' => '来自',
'Class:ActionEmail/Attribute:from+' => '将发送到邮件头',
'Class:ActionEmail/Attribute:reply_to' => '回复到',
'Class:ActionEmail/Attribute:reply_to+' => '将发送到邮件头',
'Class:ActionEmail/Attribute:to' => 'To',
'Class:ActionEmail/Attribute:to+' => '邮件的目的地',
'Class:ActionEmail/Attribute:cc' => 'Cc',
'Class:ActionEmail/Attribute:cc+' => 'Carbon Copy',
'Class:ActionEmail/Attribute:bcc' => 'bcc',
'Class:ActionEmail/Attribute:bcc+' => 'Blind Carbon Copy',
'Class:ActionEmail/Attribute:subject' => '主题',
'Class:ActionEmail/Attribute:subject+' => '邮件标题',
'Class:ActionEmail/Attribute:body' => '邮件体',
'Class:ActionEmail/Attribute:body+' => '邮件内容',
'Class:ActionEmail/Attribute:importance' => '重要',
'Class:ActionEmail/Attribute:importance+' => '重要标志',
'Class:ActionEmail/Attribute:importance/Value:low' => '低',
'Class:ActionEmail/Attribute:importance/Value:low+' => '低',
'Class:ActionEmail/Attribute:importance/Value:normal' => '一般',
'Class:ActionEmail/Attribute:importance/Value:normal+' => '一般',
'Class:ActionEmail/Attribute:importance/Value:high' => '高',
'Class:ActionEmail/Attribute:importance/Value:high+' => '高',
));
//
// Class: Trigger
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Trigger' => '触发器',
'Class:Trigger+' => '客户化事项句柄',
'Class:Trigger/Attribute:description' => '描述',
'Class:Trigger/Attribute:description+' => '单行描述',
'Class:Trigger/Attribute:action_list' => '被触发的动作',
'Class:Trigger/Attribute:action_list+' => '触发器击发时执行的动作',
'Class:Trigger/Attribute:finalclass' => '类别',
'Class:Trigger/Attribute:finalclass+' => '',
));
//
// Class: TriggerOnObject
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:TriggerOnObject' => '触发器 (类依赖的)',
'Class:TriggerOnObject+' => '在一个给定类对象上的触发器',
'Class:TriggerOnObject/Attribute:target_class' => '目标类',
'Class:TriggerOnObject/Attribute:target_class+' => '',
));
//
// Class: TriggerOnStateChange
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:TriggerOnStateChange' => '触发器 (状态变化时)',
'Class:TriggerOnStateChange+' => '对象状态变化时的触发器',
'Class:TriggerOnStateChange/Attribute:state' => '状态',
'Class:TriggerOnStateChange/Attribute:state+' => '',
));
//
// Class: TriggerOnStateEnter
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:TriggerOnStateEnter' => '触发器 (进入一个状态时)',
'Class:TriggerOnStateEnter+' => '对象状态变化时触发器 - 进入时',
));
//
// Class: TriggerOnStateLeave
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:TriggerOnStateLeave' => '触发器 (离开一个状态时)',
'Class:TriggerOnStateLeave+' => '对象状态变化时触发器 - 离开时',
));
//
// Class: TriggerOnObjectCreate
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:TriggerOnObjectCreate' => '触发器 (对象创建时)',
'Class:TriggerOnObjectCreate+' => '一个给定类[子类]对象创建时触发器',
));
//
// Class: lnkTriggerAction
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkTriggerAction' => '动作/触发器',
'Class:lnkTriggerAction+' => '触发器和动作间的链接',
'Class:lnkTriggerAction/Attribute:action_id' => '动作',
'Class:lnkTriggerAction/Attribute:action_id+' => '要执行的动作',
'Class:lnkTriggerAction/Attribute:action_name' => '动作',
'Class:lnkTriggerAction/Attribute:action_name+' => '',
'Class:lnkTriggerAction/Attribute:trigger_id' => '触发器',
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
'Class:lnkTriggerAction/Attribute:trigger_name' => '触发器',
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
'Class:lnkTriggerAction/Attribute:order' => '顺序',
'Class:lnkTriggerAction/Attribute:order+' => '动作执行顺序',
'Core:DeletedObjectLabel' => '%1s (deleted)~~',
'Core:DeletedObjectTip' => 'The object has been deleted on %1$s (%2$s)~~',
'Core:UnknownObjectLabel' => 'Object not found (class: %1$s, id: %2$d)~~',
'Core:UnknownObjectTip' => 'The object could not be found. It may have been deleted some time ago and the log has been purged since.~~',
'Core:AttributeLinkedSet' => 'Array of objects~~',
'Core:AttributeLinkedSet+' => 'Any kind of objects of the same class or subclass~~',
'Core:AttributeLinkedSetIndirect' => 'Array of objects (N-N)~~',
'Core:AttributeLinkedSetIndirect+' => 'Any kind of objects [subclass] of the same class~~',
'Core:AttributeInteger' => 'Integer~~',
'Core:AttributeInteger+' => 'Numeric value (could be negative)~~',
'Core:AttributeDecimal' => 'Decimal~~',
'Core:AttributeDecimal+' => 'Decimal value (could be negative)~~',
'Core:AttributeBoolean' => 'Boolean~~',
'Core:AttributeBoolean+' => 'Boolean~~',
'Core:AttributeBoolean/Value:null' => '',
'Core:AttributeBoolean/Value:yes' => 'Yes~~',
'Core:AttributeBoolean/Value:no' => 'No~~',
'Core:AttributeArchiveFlag' => 'Archive flag~~',
'Core:AttributeArchiveFlag/Value:yes' => 'Yes~~',
'Core:AttributeArchiveFlag/Value:yes+' => 'This object is visible only in archive mode~~',
'Core:AttributeArchiveFlag/Value:no' => 'No~~',
'Core:AttributeArchiveFlag/Label' => 'Archived~~',
'Core:AttributeArchiveFlag/Label+' => '',
'Core:AttributeArchiveDate/Label' => 'Archive date~~',
'Core:AttributeArchiveDate/Label+' => '',
'Core:AttributeObsolescenceFlag' => 'Obsolescence flag~~',
'Core:AttributeObsolescenceFlag/Value:yes' => 'Yes~~',
'Core:AttributeObsolescenceFlag/Value:yes+' => 'This object is excluded from the impact analysis, and hidden from search results~~',
'Core:AttributeObsolescenceFlag/Value:no' => 'No~~',
'Core:AttributeObsolescenceFlag/Label' => 'Obsolete~~',
'Core:AttributeObsolescenceFlag/Label+' => 'Computed dynamically on other attributes~~',
'Core:AttributeObsolescenceDate/Label' => 'Obsolescence date~~',
'Core:AttributeObsolescenceDate/Label+' => 'Approximative date at which the object has been considered obsolete~~',
'Core:AttributeString' => 'String~~',
'Core:AttributeString+' => 'Alphanumeric string~~',
'Core:AttributeClass' => 'Class~~',
'Core:AttributeClass+' => 'Class~~',
'Core:AttributeApplicationLanguage' => 'User language~~',
'Core:AttributeApplicationLanguage+' => 'Language and country (EN US)~~',
'Core:AttributeFinalClass' => 'Class (auto)~~',
'Core:AttributeFinalClass+' => 'Real class of the object (automatically created by the core)~~',
'Core:AttributePassword' => 'Password~~',
'Core:AttributePassword+' => 'Password of an external device~~',
'Core:AttributeEncryptedString' => 'Encrypted string~~',
'Core:AttributeEncryptedString+' => 'String encrypted with a local key~~',
'Core:AttributeText' => 'Text~~',
'Core:AttributeText+' => 'Multiline character string~~',
'Core:AttributeHTML' => 'HTML~~',
'Core:AttributeHTML+' => 'HTML string~~',
'Core:AttributeEmailAddress' => 'Email address~~',
'Core:AttributeEmailAddress+' => 'Email address~~',
'Core:AttributeIPAddress' => 'IP address~~',
'Core:AttributeIPAddress+' => 'IP address~~',
'Core:AttributeOQL' => 'OQL~~',
'Core:AttributeOQL+' => 'Object Query Langage expression~~',
'Core:AttributeEnum' => 'Enum~~',
'Core:AttributeEnum+' => 'List of predefined alphanumeric strings~~',
'Core:AttributeTemplateString' => 'Template string~~',
'Core:AttributeTemplateString+' => 'String containing placeholders~~',
'Core:AttributeTemplateText' => 'Template text~~',
'Core:AttributeTemplateText+' => 'Text containing placeholders~~',
'Core:AttributeTemplateHTML' => 'Template HTML~~',
'Core:AttributeTemplateHTML+' => 'HTML containing placeholders~~',
'Core:AttributeDateTime' => 'Date/time~~',
'Core:AttributeDateTime+' => 'Date and time (year-month-day hh:mm:ss)~~',
'Core:AttributeDateTime?SmartSearch' => '
<p>
Date format:<br/>
<b>%1$s</b><br/>
Example: %2$s
</p>
<p>
Operators:<br/>
<b>&gt;</b><em>date</em><br/>
<b>&lt;</b><em>date</em><br/>
<b>[</b><em>date</em>,<em>date</em><b>]</b>
</p>
<p>
If the time is omitted, it defaults to 00:00:00
</p>~~',
'Core:AttributeDate' => 'Date~~',
'Core:AttributeDate+' => 'Date (year-month-day)~~',
'Core:AttributeDate?SmartSearch' => '
<p>
Date format:<br/>
<b>%1$s</b><br/>
Example: %2$s
</p>
<p>
Operators:<br/>
<b>&gt;</b><em>date</em><br/>
<b>&lt;</b><em>date</em><br/>
<b>[</b><em>date</em>,<em>date</em><b>]</b>
</p>~~',
'Core:AttributeDeadline' => 'Deadline~~',
'Core:AttributeDeadline+' => 'Date, displayed relatively to the current time~~',
'Core:AttributeExternalKey' => 'External key~~',
'Core:AttributeExternalKey+' => 'External (or foreign) key~~',
'Core:AttributeHierarchicalKey' => 'Hierarchical Key~~',
'Core:AttributeHierarchicalKey+' => 'External (or foreign) key to the parent~~',
'Core:AttributeExternalField' => 'External field~~',
'Core:AttributeExternalField+' => 'Field mapped to an external key~~',
'Core:AttributeURL' => 'URL~~',
'Core:AttributeURL+' => 'Absolute or relative URL as a text string~~',
'Core:AttributeBlob' => 'Blob~~',
'Core:AttributeBlob+' => 'Any binary content (document)~~',
'Core:AttributeOneWayPassword' => 'One way password~~',
'Core:AttributeOneWayPassword+' => 'One way encrypted (hashed) password~~',
'Core:AttributeTable' => 'Table~~',
'Core:AttributeTable+' => 'Indexed array having two dimensions~~',
'Core:AttributePropertySet' => 'Properties~~',
'Core:AttributePropertySet+' => 'List of untyped properties (name and value)~~',
'Core:AttributeFriendlyName' => 'Friendly name~~',
'Core:AttributeFriendlyName+' => 'Attribute created automatically ; the friendly name is computed after several attributes~~',
'Core:FriendlyName-Label' => 'Friendly name~~',
'Core:FriendlyName-Description' => 'Friendly name~~',
'Change:ObjectModified' => 'Object modified~~',
'Change:AttName_EntryAdded' => '%1$s modified, new entry added.~~',
'Change:LinkSet:Added' => 'added %1$s~~',
'Change:LinkSet:Removed' => 'removed %1$s~~',
'Change:LinkSet:Modified' => 'modified %1$s~~',
'Class:EventNotificationEmail/Attribute:attachments' => 'Attachments~~',
'Class:EventLoginUsage' => 'Login Usage~~',
'Class:EventLoginUsage+' => 'Connection to the application~~',
'Class:EventLoginUsage/Attribute:user_id' => 'Login~~',
'Class:EventLoginUsage/Attribute:user_id+' => 'Login~~',
'Class:EventLoginUsage/Attribute:contact_name' => 'User Name~~',
'Class:EventLoginUsage/Attribute:contact_name+' => 'User Name~~',
'Class:EventLoginUsage/Attribute:contact_email' => 'User Email~~',
'Class:EventLoginUsage/Attribute:contact_email+' => 'Email Address of the User~~',
'Class:TriggerOnObject/Attribute:filter' => 'Filter~~',
'TriggerOnObject:WrongFilterQuery' => 'Wrong filter query: %1$s~~',
'TriggerOnObject:WrongFilterClass' => 'The filter query must return objects of class \"%1$s\"~~',
'Class:TriggerOnPortalUpdate' => 'Trigger (when updated from the portal)~~',
'Class:TriggerOnPortalUpdate+' => 'Trigger on a end-user\'s update from the portal~~',
'Class:TriggerOnThresholdReached' => 'Trigger (on threshold)~~',
'Class:TriggerOnThresholdReached+' => 'Trigger on Stop-Watch threshold reached~~',
'Class:TriggerOnThresholdReached/Attribute:stop_watch_code' => 'Stop watch~~',
'Class:TriggerOnThresholdReached/Attribute:threshold_index' => 'Threshold~~',
'Class:SynchroDataSource/Attribute:name' => 'Name~~',
'Class:SynchroDataSource/Attribute:name+' => 'Name~~',
'Class:SynchroDataSource/Attribute:description' => 'Description~~',
'Class:SynchroDataSource/Attribute:status' => 'Status~~',
'Class:SynchroDataSource/Attribute:scope_class' => 'Target class~~',
'Class:SynchroDataSource/Attribute:user_id' => 'User~~',
'Class:SynchroDataSource/Attribute:notify_contact_id' => 'Contact to notify~~',
'Class:SynchroDataSource/Attribute:notify_contact_id+' => 'Contact to notify in case of error~~',
'Class:SynchroDataSource/Attribute:url_icon' => 'Icon\'s hyperlink~~',
'Class:SynchroDataSource/Attribute:url_icon+' => 'Hyperlink a (small) image representing the application with which iTop is synchronized~~',
'Class:SynchroDataSource/Attribute:url_application' => 'Application\'s hyperlink~~',
'Class:SynchroDataSource/Attribute:url_application+' => 'Hyperlink to the iTop object in the external application with which iTop is synchronized (if applicable). Possible placeholders: $this->attribute$ and $replica->primary_key$~~',
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Reconciliation policy~~',
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Full load interval~~',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => 'A complete reload of all data must occur at least as often as specified here~~',
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Action on zero~~',
'Class:SynchroDataSource/Attribute:action_on_zero+' => 'Action taken when the search returns no object~~',
'Class:SynchroDataSource/Attribute:action_on_one' => 'Action on one~~',
'Class:SynchroDataSource/Attribute:action_on_one+' => 'Action taken when the search returns exactly one object~~',
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Action on many~~',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => 'Action taken when the search returns more than one object~~',
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'Users allowed~~',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => 'Who is allowed to delete synchronized objects~~',
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Nobody~~',
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Administrators only~~',
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'All allowed users~~',
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Update rules~~',
'Class:SynchroDataSource/Attribute:delete_policy_update+' => 'Syntax: field_name:value; ...~~',
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Retention Duration~~',
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => 'How much time an obsolete object is kept before being deleted~~',
'Class:SynchroDataSource/Attribute:database_table_name' => 'Data table~~',
'Class:SynchroDataSource/Attribute:database_table_name+' => 'Name of the table to store the synchronization data. If left empty, a default name will be computed.~~',
'SynchroDataSource:Description' => 'Description~~',
'SynchroDataSource:Reconciliation' => 'Search &amp; reconciliation~~',
'SynchroDataSource:Deletion' => 'Deletion rules~~',
'SynchroDataSource:Status' => 'Status~~',
'SynchroDataSource:Information' => 'Information~~',
'SynchroDataSource:Definition' => 'Definition~~',
'Core:SynchroAttributes' => 'Attributes~~',
'Core:SynchroStatus' => 'Status~~',
'Core:Synchro:ErrorsLabel' => 'Errors~~',
'Core:Synchro:CreatedLabel' => 'Created~~',
'Core:Synchro:ModifiedLabel' => 'Modified~~',
'Core:Synchro:UnchangedLabel' => 'Unchanged~~',
'Core:Synchro:ReconciledErrorsLabel' => 'Errors~~',
'Core:Synchro:ReconciledLabel' => 'Reconciled~~',
'Core:Synchro:ReconciledNewLabel' => 'Created~~',
'Core:SynchroReconcile:Yes' => 'Yes~~',
'Core:SynchroReconcile:No' => 'No~~',
'Core:SynchroUpdate:Yes' => 'Yes~~',
'Core:SynchroUpdate:No' => 'No~~',
'Core:Synchro:LastestStatus' => 'Latest Status~~',
'Core:Synchro:History' => 'Synchronization History~~',
'Core:Synchro:NeverRun' => 'This synchro was never run. No log yet.~~',
'Core:Synchro:SynchroEndedOn_Date' => 'The latest synchronization ended on %1$s.~~',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'The synchronization started on %1$s is still running...~~',
'Menu:DataSources' => 'Synchronization Data Sources~~',
'Menu:DataSources+' => 'All Synchronization Data Sources~~',
'Core:Synchro:label_repl_ignored' => 'Ignored (%1$s)~~',
'Core:Synchro:label_repl_disappeared' => 'Disappeared (%1$s)~~',
'Core:Synchro:label_repl_existing' => 'Existing (%1$s)~~',
'Core:Synchro:label_repl_new' => 'New (%1$s)~~',
'Core:Synchro:label_obj_deleted' => 'Deleted (%1$s)~~',
'Core:Synchro:label_obj_obsoleted' => 'Obsoleted (%1$s)~~',
'Core:Synchro:label_obj_disappeared_errors' => 'Errors (%1$s)~~',
'Core:Synchro:label_obj_disappeared_no_action' => 'No Action (%1$s)~~',
'Core:Synchro:label_obj_unchanged' => 'Unchanged (%1$s)~~',
'Core:Synchro:label_obj_updated' => 'Updated (%1$s)~~',
'Core:Synchro:label_obj_updated_errors' => 'Errors (%1$s)~~',
'Core:Synchro:label_obj_new_unchanged' => 'Unchanged (%1$s)~~',
'Core:Synchro:label_obj_new_updated' => 'Updated (%1$s)~~',
'Core:Synchro:label_obj_created' => 'Created (%1$s)~~',
'Core:Synchro:label_obj_new_errors' => 'Errors (%1$s)~~',
'Core:SynchroLogTitle' => '%1$s - %2$s~~',
'Core:Synchro:Nb_Replica' => 'Replica processed: %1$s~~',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s~~',
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'At Least one reconciliation key must be specified, or the reconciliation policy must be to use the primary key.~~',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'A delete retention period must be specified, since objects are to be deleted after being marked as obsolete~~',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Obsolete objects are to be updated, but no update is specified.~~',
'Class:SynchroDataSource/Error:DataTableAlreadyExists' => 'The table %1$s already exists in the database. Please use another name for the synchro data table.~~',
'Core:SynchroReplica:PublicData' => 'Public Data~~',
'Core:SynchroReplica:PrivateDetails' => 'Private Details~~',
'Core:SynchroReplica:BackToDataSource' => 'Go Back to the Synchro Data Source: %1$s~~',
'Core:SynchroReplica:ListOfReplicas' => 'List of Replica~~',
'Core:SynchroAttExtKey:ReconciliationById' => 'id (Primary Key)~~',
'Core:SynchroAtt:attcode' => 'Attribute~~',
'Core:SynchroAtt:attcode+' => 'Field of the object~~',
'Core:SynchroAtt:reconciliation' => 'Reconciliation ?~~',
'Core:SynchroAtt:reconciliation+' => 'Used for searching~~',
'Core:SynchroAtt:update' => 'Update ?~~',
'Core:SynchroAtt:update+' => 'Used to update the object~~',
'Core:SynchroAtt:update_policy' => 'Update Policy~~',
'Core:SynchroAtt:update_policy+' => 'Behavior of the updated field~~',
'Core:SynchroAtt:reconciliation_attcode' => 'Reconciliation Key~~',
'Core:SynchroAtt:reconciliation_attcode+' => 'Attribute Code for the External Key Reconciliation~~',
'Core:SyncDataExchangeComment' => '(Data Synchro)~~',
'Core:Synchro:ListOfDataSources' => 'List of data sources:~~',
'Core:Synchro:LastSynchro' => 'Last synchronization:~~',
'Core:Synchro:ThisObjectIsSynchronized' => 'This object is synchronized with an external data source~~',
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'The object was <b>created</b> by the external data source %1$s~~',
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'The object <b>can be deleted</b> by the external data source %1$s~~',
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'You <b>cannot delete the object</b> because it is owned by the external data source %1$s~~',
'TitleSynchroExecution' => 'Execution of the synchronization~~',
'Class:SynchroDataSource:DataTable' => 'Database table: %1$s~~',
'Core:SyncDataSourceObsolete' => 'The data source is marked as obsolete. Operation cancelled.~~',
'Core:SyncDataSourceAccessRestriction' => 'Only adminstrators or the user specified in the data source can execute this operation. Operation cancelled.~~',
'Core:SyncTooManyMissingReplicas' => 'All records have been untouched for some time (all of the objects could be deleted). Please check that the process that writes into the synchronization table is still running. Operation cancelled.~~',
'Core:SyncSplitModeCLIOnly' => 'The synchronization can be executed in chunks only if run in mode CLI~~',
'Core:Synchro:ListReplicas_AllReplicas_Errors_Warnings' => '%1$s replicas, %2$s error(s), %3$s warning(s).~~',
'Core:SynchroReplica:TargetObject' => 'Synchronized Object: %1$s~~',
'Class:AsyncSendEmail' => 'Email (asynchronous)~~',
'Class:AsyncSendEmail/Attribute:to' => 'To~~',
'Class:AsyncSendEmail/Attribute:subject' => 'Subject~~',
'Class:AsyncSendEmail/Attribute:body' => 'Body~~',
'Class:AsyncSendEmail/Attribute:header' => 'Header~~',
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Encrypted Password~~',
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Previous Value~~',
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Encrypted Field~~',
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Previous Value~~',
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Case Log~~',
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Last Entry~~',
'Class:SynchroDataSource' => 'Synchro Data Source~~',
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implementation~~',
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsolete~~',
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Production~~',
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Scope restriction~~',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Use the attributes~~',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Use the primary_key field~~',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Create~~',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Error~~',
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Error~~',
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Update~~',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Create~~',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Error~~',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Take the first one (random?)~~',
'Class:SynchroDataSource/Attribute:delete_policy' => 'Delete Policy~~',
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Delete~~',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignore~~',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Update~~',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Update then Delete~~',
'Class:SynchroDataSource/Attribute:attribute_list' => 'Attributes List~~',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Administrators only~~',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Everybody allowed to delete such objects~~',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Nobody~~',
'Class:SynchroAttribute' => 'Synchro Attribute~~',
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Synchro Data Source~~',
'Class:SynchroAttribute/Attribute:attcode' => 'Attribute Code~~',
'Class:SynchroAttribute/Attribute:update' => 'Update~~',
'Class:SynchroAttribute/Attribute:reconcile' => 'Reconcile~~',
'Class:SynchroAttribute/Attribute:update_policy' => 'Update Policy~~',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'Locked~~',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'Unlocked~~',
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Initialize if empty~~',
'Class:SynchroAttribute/Attribute:finalclass' => 'Class~~',
'Class:SynchroAttExtKey' => 'Synchro Attribute (ExtKey)~~',
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Reconciliation Attribute~~',
'Class:SynchroAttLinkSet' => 'Synchro Attribute (Linkset)~~',
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Rows separator~~',
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Attributes separator~~',
'Class:SynchroLog' => 'Synchr Log~~',
'Class:SynchroLog/Attribute:sync_source_id' => 'Synchro Data Source~~',
'Class:SynchroLog/Attribute:start_date' => 'Start Date~~',
'Class:SynchroLog/Attribute:end_date' => 'End Date~~',
'Class:SynchroLog/Attribute:status' => 'Status~~',
'Class:SynchroLog/Attribute:status/Value:completed' => 'Completed~~',
'Class:SynchroLog/Attribute:status/Value:error' => 'Error~~',
'Class:SynchroLog/Attribute:status/Value:running' => 'Still Running~~',
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nb replica seen~~',
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nb replica total~~',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nb objects deleted~~',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nb of errors while deleting~~',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nb objects obsoleted~~',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nb of errors while obsoleting~~',
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nb objects created~~',
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nb or errors while creating~~',
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nb objects updated~~',
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nb errors while updating~~',
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nb of errors during reconciliation~~',
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nb replica disappeared~~',
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nb objects updated~~',
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nb objects unchanged~~',
'Class:SynchroLog/Attribute:last_error' => 'Last error~~',
'Class:SynchroLog/Attribute:traces' => 'Traces~~',
'Class:SynchroReplica' => 'Synchro Replica~~',
'Class:SynchroReplica/Attribute:sync_source_id' => 'Synchro Data Source~~',
'Class:SynchroReplica/Attribute:dest_id' => 'Destination object (ID)~~',
'Class:SynchroReplica/Attribute:dest_class' => 'Destination type~~',
'Class:SynchroReplica/Attribute:status_last_seen' => 'Last seen~~',
'Class:SynchroReplica/Attribute:status' => 'Status~~',
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modified~~',
'Class:SynchroReplica/Attribute:status/Value:new' => 'New~~',
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Obsolete~~',
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Orphan~~',
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Synchronized~~',
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Object Created ?~~',
'Class:SynchroReplica/Attribute:status_last_error' => 'Last Error~~',
'Class:SynchroReplica/Attribute:status_last_warning' => 'Warnings~~',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Creation Date~~',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Last Modified Date~~',
'Class:appUserPreferences' => 'User Preferences~~',
'Class:appUserPreferences/Attribute:userid' => 'User~~',
'Class:appUserPreferences/Attribute:preferences' => 'Prefs~~',
'Core:ExecProcess:Code1' => 'Wrong command or command finished with errors (e.g. wrong script name)~~',
'Core:ExecProcess:Code255' => 'PHP Error (parsing, or runtime)~~',
'Core:Duration_Seconds' => '%1$ds~~',
'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds~~',
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds~~',
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sd %2$dh %3$dmin %4$ds~~',
'Core:ExplainWTC:ElapsedTime' => 'Time elapsed (stored as \"%1$s\")~~',
'Core:ExplainWTC:StopWatch-TimeSpent' => 'Time spent for \"%1$s\"~~',
'Core:ExplainWTC:StopWatch-Deadline' => 'Deadline for \"%1$s\" at %2$d%%~~',
'Core:BulkExport:MissingParameter_Param' => 'Missing parameter \"%1$s\"~~',
'Core:BulkExport:InvalidParameter_Query' => 'Invalid value for the parameter \"query\". There is no Query Phrasebook corresponding to the id: \"%1$s\".~~',
'Core:BulkExport:ExportFormatPrompt' => 'Export format:~~',
'Core:BulkExportOf_Class' => '%1$s Export~~',
'Core:BulkExport:ClickHereToDownload_FileName' => 'Click here to download %1$s~~',
'Core:BulkExport:ExportResult' => 'Result of the export:~~',
'Core:BulkExport:RetrievingData' => 'Retrieving data...~~',
'Core:BulkExport:HTMLFormat' => 'Web Page (*.html)~~',
'Core:BulkExport:CSVFormat' => 'Comma Separated Values (*.csv)~~',
'Core:BulkExport:XLSXFormat' => 'Excel 2007 or newer (*.xlsx)~~',
'Core:BulkExport:PDFFormat' => 'PDF Document (*.pdf)~~',
'Core:BulkExport:DragAndDropHelp' => 'Drag and drop the columns\' headers to arrange the columns. Preview of %1$s lines. Total number of lines to export: %2$s.~~',
'Core:BulkExport:EmptyPreview' => 'Select the columns to be exported from the list above~~',
'Core:BulkExport:ColumnsOrder' => 'Columns order~~',
'Core:BulkExport:AvailableColumnsFrom_Class' => 'Available columns from %1$s~~',
'Core:BulkExport:NoFieldSelected' => 'Select at least one column to be exported~~',
'Core:BulkExport:CheckAll' => 'Check All~~',
'Core:BulkExport:UncheckAll' => 'Uncheck All~~',
'Core:BulkExport:ExportCancelledByUser' => 'Export cancelled by the user~~',
'Core:BulkExport:CSVOptions' => 'CSV Options~~',
'Core:BulkExport:CSVLocalization' => 'Localization~~',
'Core:BulkExport:PDFOptions' => 'PDF Options~~',
'Core:BulkExport:PDFPageFormat' => 'Page Format~~',
'Core:BulkExport:PDFPageSize' => 'Page Size:~~',
'Core:BulkExport:PageSize-A4' => 'A4~~',
'Core:BulkExport:PageSize-A3' => 'A3~~',
'Core:BulkExport:PageSize-Letter' => 'Letter~~',
'Core:BulkExport:PDFPageOrientation' => 'Page Orientation:~~',
'Core:BulkExport:PageOrientation-L' => 'Landscape~~',
'Core:BulkExport:PageOrientation-P' => 'Portrait~~',
'Core:BulkExport:XMLFormat' => 'XML file (*.xml)~~',
'Core:BulkExport:XMLOptions' => 'XML Options~~',
'Core:BulkExport:SpreadsheetFormat' => 'Spreadsheet HTML format (*.html)~~',
'Core:BulkExport:SpreadsheetOptions' => 'Spreadsheet Options~~',
'Core:BulkExport:OptionLinkSets' => 'Include linked objects~~',
'Core:BulkExport:OptionNoLocalize' => 'Do not localize the values (for Enumerated fields)~~',
'Core:BulkExport:OptionFormattedText' => 'Preserve text formatting~~',
'Core:BulkExport:ScopeDefinition' => 'Definition of the objects to export~~',
'Core:BulkExportLabelOQLExpression' => 'OQL Query:~~',
'Core:BulkExportLabelPhrasebookEntry' => 'Query Phrasebook Entry:~~',
'Core:BulkExportMessageEmptyOQL' => 'Please enter a valid OQL query.~~',
'Core:BulkExportMessageEmptyPhrasebookEntry' => 'Please select a valid phrasebook entry.~~',
'Core:BulkExportQueryPlaceholder' => 'Type an OQL query here...~~',
'Core:BulkExportCanRunNonInteractive' => 'Click here to run the export in non-interactive mode.~~',
'Core:BulkExportLegacyExport' => 'Click here to access the legacy export.~~',
'Core:BulkExport:XLSXOptions' => 'Excel Options~~',
'Core:BulkExport:TextFormat' => 'Text fields containing some HTML markup~~',
'Core:Validator:Default' => 'Wrong format~~',
'Core:Validator:Mandatory' => 'Please, fill this field~~',
'Core:Validator:MustBeInteger' => 'Must be an integer~~',
'Core:Validator:MustSelectOne' => 'Please, select one~~',
));

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,899 @@
<?php
// Copyright (C) 2010-2017 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Localized data
*
* @copyright Copyright (C) 2010-2017 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Core:DeletedObjectLabel' => '%1s (已删除)',
'Core:DeletedObjectTip' => 'The object has been deleted on %1$s (%2$s)',
'Core:UnknownObjectLabel' => '对象找不到 (class: %1$s, id: %2$d)',
'Core:UnknownObjectTip' => 'The object could not be found. It may have been deleted some time ago and the log has been purged since.',
'Core:AttributeLinkedSet' => '对象数组',
'Core:AttributeLinkedSet+' => 'Any kind of objects of the same class or subclass',
'Core:AttributeLinkedSetIndirect' => 'Array of objects (N-N)',
'Core:AttributeLinkedSetIndirect+' => 'Any kind of objects [subclass] of the same class',
'Core:AttributeInteger' => '整数',
'Core:AttributeInteger+' => 'Numeric value (could be negative)',
'Core:AttributeDecimal' => 'Decimal',
'Core:AttributeDecimal+' => 'Decimal value (could be negative)',
'Core:AttributeBoolean' => '布尔',
'Core:AttributeBoolean+' => 'Boolean',
'Core:AttributeBoolean/Value:null' => '',
'Core:AttributeBoolean/Value:yes' => '是',
'Core:AttributeBoolean/Value:no' => '否',
'Core:AttributeArchiveFlag' => '是否归档',
'Core:AttributeArchiveFlag/Value:yes' => '是',
'Core:AttributeArchiveFlag/Value:yes+' => 'This object is visible only in archive mode',
'Core:AttributeArchiveFlag/Value:no' => '否',
'Core:AttributeArchiveFlag/Label' => '已归档',
'Core:AttributeArchiveFlag/Label+' => '',
'Core:AttributeArchiveDate/Label' => '归档日期',
'Core:AttributeArchiveDate/Label+' => '',
'Core:AttributeObsolescenceFlag' => '是否废弃',
'Core:AttributeObsolescenceFlag/Value:yes' => '是',
'Core:AttributeObsolescenceFlag/Value:yes+' => 'This object is excluded from the impact analysis, and hidden from search results',
'Core:AttributeObsolescenceFlag/Value:no' => '否',
'Core:AttributeObsolescenceFlag/Label' => '是否废弃',
'Core:AttributeObsolescenceFlag/Label+' => 'Computed dynamically on other attributes',
'Core:AttributeObsolescenceDate/Label' => '废弃时间',
'Core:AttributeObsolescenceDate/Label+' => 'Approximative date at which the object has been considered obsolete',
'Core:AttributeString' => '字符串',
'Core:AttributeString+' => 'Alphanumeric string',
'Core:AttributeClass' => '类',
'Core:AttributeClass+' => 'Class',
'Core:AttributeApplicationLanguage' => '用户语言',
'Core:AttributeApplicationLanguage+' => 'Language and country (EN US)',
'Core:AttributeFinalClass' => '类 (auto)',
'Core:AttributeFinalClass+' => 'Real class of the object (automatically created by the core)',
'Core:AttributePassword' => '密码',
'Core:AttributePassword+' => 'Password of an external device',
'Core:AttributeEncryptedString' => '加密字符串',
'Core:AttributeEncryptedString+' => 'String encrypted with a local key',
'Core:AttributeText' => '文本',
'Core:AttributeText+' => '多行字符串',
'Core:AttributeHTML' => 'HTML',
'Core:AttributeHTML+' => 'HTML string',
'Core:AttributeEmailAddress' => '邮箱地址',
'Core:AttributeEmailAddress+' => '邮箱地址',
'Core:AttributeIPAddress' => 'IP 地址',
'Core:AttributeIPAddress+' => 'IP 地址',
'Core:AttributeOQL' => 'OQL',
'Core:AttributeOQL+' => 'Object Query Langage expression',
'Core:AttributeEnum' => 'Enum',
'Core:AttributeEnum+' => 'List of predefined alphanumeric strings',
'Core:AttributeTemplateString' => 'Template string',
'Core:AttributeTemplateString+' => 'String containing placeholders',
'Core:AttributeTemplateText' => '文字模板',
'Core:AttributeTemplateText+' => 'Text containing placeholders',
'Core:AttributeTemplateHTML' => 'HTML 模板',
'Core:AttributeTemplateHTML+' => 'HTML containing placeholders',
'Core:AttributeDateTime' => '日期/时间',
'Core:AttributeDateTime+' => 'Date and time (year-month-day hh:mm:ss)',
'Core:AttributeDateTime?SmartSearch' => '
<p>
日期格式:<br/>
<b>%1$s</b><br/>
例如: %2$s
</p>
<p>
运算符:<br/>
<b>&gt;</b><em>日期</em><br/>
<b>&lt;</b><em>日期</em><br/>
<b>[</b><em>日期</em>,<em>日期</em><b>]</b>
</p>
<p>
如果不写具体时间,则默认00:00:00
</p>',
'Core:AttributeDate' => '日期',
'Core:AttributeDate+' => '日期 (年-月-日)',
'Core:AttributeDate?SmartSearch' => '
<p>
日期格式:<br/>
<b>%1$s</b><br/>
例如: %2$s
</p>
<p>
Operators:<br/>
<b>&gt;</b><em>日期</em><br/>
<b>&lt;</b><em>日期</em><br/>
<b>[</b><em>日期</em>,<em>日期</em><b>]</b>
</p>',
'Core:AttributeDeadline' => '截止日期',
'Core:AttributeDeadline+' => 'Date, displayed relatively to the current time',
'Core:AttributeExternalKey' => '外键',
'Core:AttributeExternalKey+' => 'External (or foreign) key',
'Core:AttributeHierarchicalKey' => 'Hierarchical Key',
'Core:AttributeHierarchicalKey+' => 'External (or foreign) key to the parent',
'Core:AttributeExternalField' => 'External field',
'Core:AttributeExternalField+' => 'Field mapped to an external key',
'Core:AttributeURL' => 'URL',
'Core:AttributeURL+' => 'Absolute or relative URL as a text string',
'Core:AttributeBlob' => 'Blob',
'Core:AttributeBlob+' => 'Any binary content (document)',
'Core:AttributeOneWayPassword' => 'One way password',
'Core:AttributeOneWayPassword+' => 'One way encrypted (hashed) password',
'Core:AttributeTable' => 'Table',
'Core:AttributeTable+' => 'Indexed array having two dimensions',
'Core:AttributePropertySet' => '属性',
'Core:AttributePropertySet+' => 'List of untyped properties (name and value)',
'Core:AttributeFriendlyName' => '通用名称',
'Core:AttributeFriendlyName+' => 'Attribute created automatically ; the friendly name is computed after several attributes',
'Core:FriendlyName-Label' => '全称',
'Core:FriendlyName-Description' => 'Full name',
));
//////////////////////////////////////////////////////////////////////
// Classes in 'core/cmdb'
//////////////////////////////////////////////////////////////////////
//
//
// Class: CMDBChange
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChange' => '变更',
'Class:CMDBChange+' => '变更跟踪',
'Class:CMDBChange/Attribute:date' => '日期',
'Class:CMDBChange/Attribute:date+' => '变更被记录的日期和时间',
'Class:CMDBChange/Attribute:userinfo' => '杂项. 信息',
'Class:CMDBChange/Attribute:userinfo+' => '呼叫者已定义的信息',
));
//
// Class: CMDBChangeOp
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOp' => '变更操作',
'Class:CMDBChangeOp+' => '变更操作跟踪',
'Class:CMDBChangeOp/Attribute:change' => '变更',
'Class:CMDBChangeOp/Attribute:change+' => '变更',
'Class:CMDBChangeOp/Attribute:date' => '日期',
'Class:CMDBChangeOp/Attribute:date+' => '变更的日期和时间',
'Class:CMDBChangeOp/Attribute:userinfo' => '用户',
'Class:CMDBChangeOp/Attribute:userinfo+' => '变更的实施者',
'Class:CMDBChangeOp/Attribute:objclass' => '对象的类别',
'Class:CMDBChangeOp/Attribute:objclass+' => 'object class',
'Class:CMDBChangeOp/Attribute:objkey' => '对象id',
'Class:CMDBChangeOp/Attribute:objkey+' => 'object id',
'Class:CMDBChangeOp/Attribute:finalclass' => 'CMDBChangeOp sub-class',
'Class:CMDBChangeOp/Attribute:finalclass+' => 'Name of the final class',
));
//
// Class: CMDBChangeOpCreate
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOpCreate' => '对象创建',
'Class:CMDBChangeOpCreate+' => '对象创建跟踪',
));
//
// Class: CMDBChangeOpDelete
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOpDelete' => '对象删除',
'Class:CMDBChangeOpDelete+' => '对象删除跟踪',
));
//
// Class: CMDBChangeOpSetAttribute
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOpSetAttribute' => '对象变化',
'Class:CMDBChangeOpSetAttribute+' => '对象属性变化跟踪',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => '属性',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => 'code of the modified property',
));
//
// Class: CMDBChangeOpSetAttributeScalar
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOpSetAttributeScalar' => '属性变更',
'Class:CMDBChangeOpSetAttributeScalar+' => 'Object scalar properties change tracking',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => '旧值',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => 'previous value of the attribute',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => '新值',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => 'new value of the attribute',
));
// Used by CMDBChangeOp... & derived classes
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Change:ObjectCreated' => '对象已创建',
'Change:ObjectDeleted' => '对象已删除',
'Change:ObjectModified' => '对象已修改',
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s 设置成 %2$s (原来的值: %3$s)',
'Change:AttName_SetTo' => '%1$s 设置成 %2$s',
'Change:Text_AppendedTo_AttName' => '%1$s 追加到 %2$s',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s 已修改, 原来的值: %2$s',
'Change:AttName_Changed' => '%1$s 已修改',
'Change:AttName_EntryAdded' => '%1$s 已修改, 新条目已添加: %2$s',
'Change:LinkSet:Added' => '已添加 %1$s',
'Change:LinkSet:Removed' => '已移除 %1$s',
'Change:LinkSet:Modified' => '已修改 %1$s',
));
//
// Class: CMDBChangeOpSetAttributeBlob
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOpSetAttributeBlob' => '数据修改',
'Class:CMDBChangeOpSetAttributeBlob+' => 'data change tracking',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => '之前的值',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => 'previous contents of the attribute',
));
//
// Class: CMDBChangeOpSetAttributeText
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:CMDBChangeOpSetAttributeText' => '文本修改',
'Class:CMDBChangeOpSetAttributeText+' => '跟踪文本修改',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Previous data',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => 'previous contents of the attribute',
));
//
// Class: Event
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Event' => '日志事件',
'Class:Event+' => 'An application internal event',
'Class:Event/Attribute:message' => '消息',
'Class:Event/Attribute:message+' => 'short description of the event',
'Class:Event/Attribute:date' => '日期',
'Class:Event/Attribute:date+' => 'date and time at which the changes have been recorded',
'Class:Event/Attribute:userinfo' => '用户信息',
'Class:Event/Attribute:userinfo+' => 'identification of the user that was doing the action that triggered this event',
'Class:Event/Attribute:finalclass' => 'Event sub-class',
'Class:Event/Attribute:finalclass+' => 'Name of the final class',
));
//
// Class: EventNotification
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:EventNotification' => '通知事件',
'Class:EventNotification+' => 'Trace of a notification that has been sent',
'Class:EventNotification/Attribute:trigger_id' => '触发器',
'Class:EventNotification/Attribute:trigger_id+' => '用户帐户',
'Class:EventNotification/Attribute:action_id' => '用户',
'Class:EventNotification/Attribute:action_id+' => '用户帐户',
'Class:EventNotification/Attribute:object_id' => '对象id',
'Class:EventNotification/Attribute:object_id+' => 'object id (class defined by the trigger ?)',
));
//
// Class: EventNotificationEmail
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:EventNotificationEmail' => '邮件发送事件',
'Class:EventNotificationEmail+' => '跟踪每封已发送的邮件',
'Class:EventNotificationEmail/Attribute:to' => '收件人',
'Class:EventNotificationEmail/Attribute:to+' => '收件人',
'Class:EventNotificationEmail/Attribute:cc' => '抄送',
'Class:EventNotificationEmail/Attribute:cc+' => '抄送',
'Class:EventNotificationEmail/Attribute:bcc' => '密抄',
'Class:EventNotificationEmail/Attribute:bcc+' => '密抄',
'Class:EventNotificationEmail/Attribute:from' => '发件人',
'Class:EventNotificationEmail/Attribute:from+' => '消息发送者',
'Class:EventNotificationEmail/Attribute:subject' => '主题',
'Class:EventNotificationEmail/Attribute:subject+' => '主题',
'Class:EventNotificationEmail/Attribute:body' => '内容',
'Class:EventNotificationEmail/Attribute:body+' => '内容',
'Class:EventNotificationEmail/Attribute:attachments' => '附件',
'Class:EventNotificationEmail/Attribute:attachments+' => '',
));
//
// Class: EventIssue
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:EventIssue' => 'Issue event',
'Class:EventIssue+' => 'Trace of an issue (warning, error, etc.)',
'Class:EventIssue/Attribute:issue' => '事件',
'Class:EventIssue/Attribute:issue+' => '发生了什么',
'Class:EventIssue/Attribute:impact' => '影响',
'Class:EventIssue/Attribute:impact+' => '重要性如何',
'Class:EventIssue/Attribute:page' => 'Page',
'Class:EventIssue/Attribute:page+' => 'HTTP entry point',
'Class:EventIssue/Attribute:arguments_post' => 'Posted arguments',
'Class:EventIssue/Attribute:arguments_post+' => 'HTTP POST arguments',
'Class:EventIssue/Attribute:arguments_get' => 'URL arguments',
'Class:EventIssue/Attribute:arguments_get+' => 'HTTP GET arguments',
'Class:EventIssue/Attribute:callstack' => '调用栈',
'Class:EventIssue/Attribute:callstack+' => 'Call stack',
'Class:EventIssue/Attribute:data' => 'Data',
'Class:EventIssue/Attribute:data+' => '更多信息',
));
//
// Class: EventWebService
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:EventWebService' => 'Web service event',
'Class:EventWebService+' => 'Trace of an web service call',
'Class:EventWebService/Attribute:verb' => 'Verb',
'Class:EventWebService/Attribute:verb+' => 'Name of the operation',
'Class:EventWebService/Attribute:result' => 'Result',
'Class:EventWebService/Attribute:result+' => 'Overall success/failure',
'Class:EventWebService/Attribute:log_info' => 'Info log',
'Class:EventWebService/Attribute:log_info+' => 'Result info log',
'Class:EventWebService/Attribute:log_warning' => 'Warning log',
'Class:EventWebService/Attribute:log_warning+' => 'Result warning log',
'Class:EventWebService/Attribute:log_error' => 'Error log',
'Class:EventWebService/Attribute:log_error+' => 'Result error log',
'Class:EventWebService/Attribute:data' => 'Data',
'Class:EventWebService/Attribute:data+' => 'Result data',
));
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:EventRestService' => 'REST/JSON 调用',
'Class:EventRestService+' => 'Trace of a REST/JSON service call',
'Class:EventRestService/Attribute:operation' => '操作',
'Class:EventRestService/Attribute:operation+' => 'Argument \'operation\'',
'Class:EventRestService/Attribute:version' => '版本',
'Class:EventRestService/Attribute:version+' => '参数 \'版本\'',
'Class:EventRestService/Attribute:json_input' => '输入',
'Class:EventRestService/Attribute:json_input+' => 'Argument \'json_data\'',
'Class:EventRestService/Attribute:code' => '代码',
'Class:EventRestService/Attribute:code+' => '返回代码',
'Class:EventRestService/Attribute:json_output' => '响应',
'Class:EventRestService/Attribute:json_output+' => 'HTTP response (json)',
'Class:EventRestService/Attribute:provider' => 'Provider',
'Class:EventRestService/Attribute:provider+' => 'PHP class implementing the expected operation',
));
//
// Class: EventLoginUsage
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:EventLoginUsage' => '登录频率',
'Class:EventLoginUsage+' => 'Connection to the application',
'Class:EventLoginUsage/Attribute:user_id' => '登录',
'Class:EventLoginUsage/Attribute:user_id+' => '登录',
'Class:EventLoginUsage/Attribute:contact_name' => '用户名',
'Class:EventLoginUsage/Attribute:contact_name+' => '用户名',
'Class:EventLoginUsage/Attribute:contact_email' => '用户邮箱',
'Class:EventLoginUsage/Attribute:contact_email+' => '用户的邮箱地址',
));
//
// Class: Action
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Action' => '自定义操作',
'Class:Action+' => '用户定义的操作',
'Class:Action/Attribute:name' => '名称',
'Class:Action/Attribute:name+' => '',
'Class:Action/Attribute:description' => '描述',
'Class:Action/Attribute:description+' => '',
'Class:Action/Attribute:status' => '状态',
'Class:Action/Attribute:status+' => '是否正式环境?',
'Class:Action/Attribute:status/Value:test' => '测试',
'Class:Action/Attribute:status/Value:test+' => '测试',
'Class:Action/Attribute:status/Value:enabled' => '正式',
'Class:Action/Attribute:status/Value:enabled+' => '正式生产',
'Class:Action/Attribute:status/Value:disabled' => '停用',
'Class:Action/Attribute:status/Value:disabled+' => '停用',
'Class:Action/Attribute:trigger_list' => '相关的触发器',
'Class:Action/Attribute:trigger_list+' => '该操作关联的触发器',
'Class:Action/Attribute:finalclass' => 'Action sub-class',
'Class:Action/Attribute:finalclass+' => 'Name of the final class',
));
//
// Class: ActionNotification
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ActionNotification' => '通知',
'Class:ActionNotification+' => '通知 (抽象)',
));
//
// Class: ActionEmail
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:ActionEmail' => '邮件通知',
'Class:ActionEmail+' => '',
'Class:ActionEmail/Attribute:test_recipient' => 'Test recipient',
'Class:ActionEmail/Attribute:test_recipient+' => 'Detination in case status is set to "Test"',
'Class:ActionEmail/Attribute:from' => '发件人',
'Class:ActionEmail/Attribute:from+' => 'Will be sent into the email header',
'Class:ActionEmail/Attribute:reply_to' => '回复到',
'Class:ActionEmail/Attribute:reply_to+' => 'Will be sent into the email header',
'Class:ActionEmail/Attribute:to' => '收件人',
'Class:ActionEmail/Attribute:to+' => 'Destination of the email',
'Class:ActionEmail/Attribute:cc' => '抄送',
'Class:ActionEmail/Attribute:cc+' => 'Carbon Copy',
'Class:ActionEmail/Attribute:bcc' => '密抄',
'Class:ActionEmail/Attribute:bcc+' => 'Blind Carbon Copy',
'Class:ActionEmail/Attribute:subject' => '主题',
'Class:ActionEmail/Attribute:subject+' => 'Title of the email',
'Class:ActionEmail/Attribute:body' => '正文',
'Class:ActionEmail/Attribute:body+' => 'Contents of the email',
'Class:ActionEmail/Attribute:importance' => '重要性',
'Class:ActionEmail/Attribute:importance+' => 'Importance flag',
'Class:ActionEmail/Attribute:importance/Value:low' => '低',
'Class:ActionEmail/Attribute:importance/Value:low+' => '低',
'Class:ActionEmail/Attribute:importance/Value:normal' => '普通',
'Class:ActionEmail/Attribute:importance/Value:normal+' => '普通',
'Class:ActionEmail/Attribute:importance/Value:high' => '高',
'Class:ActionEmail/Attribute:importance/Value:high+' => '高',
));
//
// Class: Trigger
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:Trigger' => '触发器',
'Class:Trigger+' => 'Custom event handler',
'Class:Trigger/Attribute:description' => '描述',
'Class:Trigger/Attribute:description+' => 'one line description',
'Class:Trigger/Attribute:action_list' => '触发的行为',
'Class:Trigger/Attribute:action_list+' => 'Actions performed when the trigger is activated',
'Class:Trigger/Attribute:finalclass' => 'Trigger sub-class',
'Class:Trigger/Attribute:finalclass+' => 'Name of the final class',
));
//
// Class: TriggerOnObject
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:TriggerOnObject' => '触发器 (class dependent)',
'Class:TriggerOnObject+' => 'Trigger on a given class of objects',
'Class:TriggerOnObject/Attribute:target_class' => '目标类',
'Class:TriggerOnObject/Attribute:target_class+' => '',
'Class:TriggerOnObject/Attribute:filter' => '过滤器',
'Class:TriggerOnObject/Attribute:filter+' => '',
'TriggerOnObject:WrongFilterQuery' => 'Wrong filter query: %1$s',
'TriggerOnObject:WrongFilterClass' => 'The filter query must return objects of class "%1$s"',
));
//
// Class: TriggerOnPortalUpdate
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:TriggerOnPortalUpdate' => '触发器 (工单更新时)',
'Class:TriggerOnPortalUpdate+' => '终端用户更新工单时触发',
));
//
// Class: TriggerOnStateChange
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:TriggerOnStateChange' => '触发器 (当状态变化时)',
'Class:TriggerOnStateChange+' => '当对象状态变化时触发',
'Class:TriggerOnStateChange/Attribute:state' => '状态',
'Class:TriggerOnStateChange/Attribute:state+' => '',
));
//
// Class: TriggerOnStateEnter
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:TriggerOnStateEnter' => '触发器 (进入指定状态)',
'Class:TriggerOnStateEnter+' => '对象进入指定状态时触发',
));
//
// Class: TriggerOnStateLeave
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:TriggerOnStateLeave' => '触发器 (离开指定状态时)',
'Class:TriggerOnStateLeave+' => '对象离开指定状态时触发',
));
//
// Class: TriggerOnObjectCreate
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:TriggerOnObjectCreate' => '触发器 (对象创建时)',
'Class:TriggerOnObjectCreate+' => '对象创建时触发',
));
//
// Class: TriggerOnThresholdReached
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:TriggerOnThresholdReached' => '触发器 (基于阀值)',
'Class:TriggerOnThresholdReached+' => '当达到某个阀值时触发',
'Class:TriggerOnThresholdReached/Attribute:stop_watch_code' => 'Stop watch',
'Class:TriggerOnThresholdReached/Attribute:stop_watch_code+' => '',
'Class:TriggerOnThresholdReached/Attribute:threshold_index' => '阀值',
'Class:TriggerOnThresholdReached/Attribute:threshold_index+' => '',
));
//
// Class: lnkTriggerAction
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:lnkTriggerAction' => '操作/触发器',
'Class:lnkTriggerAction+' => 'Link between a trigger and an action',
'Class:lnkTriggerAction/Attribute:action_id' => '操作',
'Class:lnkTriggerAction/Attribute:action_id+' => 'The action to be executed',
'Class:lnkTriggerAction/Attribute:action_name' => '操作',
'Class:lnkTriggerAction/Attribute:action_name+' => '',
'Class:lnkTriggerAction/Attribute:trigger_id' => '触发器',
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
'Class:lnkTriggerAction/Attribute:trigger_name' => '触发器',
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
'Class:lnkTriggerAction/Attribute:order' => '顺序',
'Class:lnkTriggerAction/Attribute:order+' => '操作的执行顺序',
));
//
// Synchro Data Source
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:SynchroDataSource/Attribute:name' => '名称',
'Class:SynchroDataSource/Attribute:name+' => '名称',
'Class:SynchroDataSource/Attribute:description' => '描述',
'Class:SynchroDataSource/Attribute:status' => '状态', //TODO: enum values
'Class:SynchroDataSource/Attribute:scope_class' => '目标类',
'Class:SynchroDataSource/Attribute:user_id' => 'User',
'Class:SynchroDataSource/Attribute:notify_contact_id' => '要通知的人',
'Class:SynchroDataSource/Attribute:notify_contact_id+' => 'Contact to notify in case of error',
'Class:SynchroDataSource/Attribute:url_icon' => '图标的超链接',
'Class:SynchroDataSource/Attribute:url_icon+' => 'Hyperlink a (small) image representing the application with which iTop is synchronized',
'Class:SynchroDataSource/Attribute:url_application' => '应用的超链接',
'Class:SynchroDataSource/Attribute:url_application+' => 'Hyperlink to the iTop object in the external application with which iTop is synchronized (if applicable). Possible placeholders: $this->attribute$ and $replica->primary_key$',
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Reconciliation policy', //TODO enum values
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Full load interval',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => 'A complete reload of all data must occur at least as often as specified here',
'Class:SynchroDataSource/Attribute:action_on_zero' => '执行结果成功时',
'Class:SynchroDataSource/Attribute:action_on_zero+' => 'Action taken when the search returns no object',
'Class:SynchroDataSource/Attribute:action_on_one' => '执行结果失败时',
'Class:SynchroDataSource/Attribute:action_on_one+' => 'Action taken when the search returns exactly one object',
'Class:SynchroDataSource/Attribute:action_on_multiple' => '执行结果未知时',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => 'Action taken when the search returns more than one object',
'Class:SynchroDataSource/Attribute:user_delete_policy' => '授权用户',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => 'Who is allowed to delete synchronized objects',
'Class:SynchroDataSource/Attribute:user_delete_policy' => '授权用户',
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Nobody',
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => '仅限管理员',
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => '所有授权用户',
'Class:SynchroDataSource/Attribute:delete_policy_update' => '更新规则',
'Class:SynchroDataSource/Attribute:delete_policy_update+' => '语法: field_name:value; ...',
'Class:SynchroDataSource/Attribute:delete_policy_retention' => '保留期限',
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => 'How much time an obsolete object is kept before being deleted',
'Class:SynchroDataSource/Attribute:database_table_name' => 'Data table',
'Class:SynchroDataSource/Attribute:database_table_name+' => 'Name of the table to store the synchronization data. If left empty, a default name will be computed.',
'SynchroDataSource:Description' => '描述',
'SynchroDataSource:Reconciliation' => 'Search &amp; reconciliation',
'SynchroDataSource:Deletion' => '删除规则',
'SynchroDataSource:Status' => '状态',
'SynchroDataSource:Information' => '信息',
'SynchroDataSource:Definition' => '定义',
'Core:SynchroAttributes' => '属性',
'Core:SynchroStatus' => '状态',
'Core:Synchro:ErrorsLabel' => 'Errors',
'Core:Synchro:CreatedLabel' => '已创建',
'Core:Synchro:ModifiedLabel' => '已修改',
'Core:Synchro:UnchangedLabel' => '保持不变',
'Core:Synchro:ReconciledErrorsLabel' => '错误',
'Core:Synchro:ReconciledLabel' => 'Reconciled',
'Core:Synchro:ReconciledNewLabel' => '已创建',
'Core:SynchroReconcile:Yes' => '是',
'Core:SynchroReconcile:No' => '否',
'Core:SynchroUpdate:Yes' => '是',
'Core:SynchroUpdate:No' => '否',
'Core:Synchro:LastestStatus' => '最新状态',
'Core:Synchro:History' => '同步历史',
'Core:Synchro:NeverRun' => 'This synchro was never run. No log yet.',
'Core:Synchro:SynchroEndedOn_Date' => '最近的同步发生在 %1$s.',
'Core:Synchro:SynchroRunningStartedOn_Date' => ' %1$s 开始的同步还在进行中...',
'Menu:DataSources' => '同步数据源', // Duplicated into itop-welcome-itil (will be removed from here...)
'Menu:DataSources+' => '所有同步数据源', // Duplicated into itop-welcome-itil (will be removed from here...)
'Core:Synchro:label_repl_ignored' => '已忽略 (%1$s)',
'Core:Synchro:label_repl_disappeared' => '已消失 (%1$s)',
'Core:Synchro:label_repl_existing' => '已存在 (%1$s)',
'Core:Synchro:label_repl_new' => '新增 (%1$s)',
'Core:Synchro:label_obj_deleted' => '已删除 (%1$s)',
'Core:Synchro:label_obj_obsoleted' => '已废弃 (%1$s)',
'Core:Synchro:label_obj_disappeared_errors' => '错误 (%1$s)',
'Core:Synchro:label_obj_disappeared_no_action' => 'No Action (%1$s)',
'Core:Synchro:label_obj_unchanged' => '保持不变 (%1$s)',
'Core:Synchro:label_obj_updated' => '已更新 (%1$s)',
'Core:Synchro:label_obj_updated_errors' => 'Errors (%1$s)',
'Core:Synchro:label_obj_new_unchanged' => '保持不变 (%1$s)',
'Core:Synchro:label_obj_new_updated' => '已更新 (%1$s)',
'Core:Synchro:label_obj_created' => '已创建 (%1$s)',
'Core:Synchro:label_obj_new_errors' => '错误 (%1$s)',
'Core:Synchro:History' => '同步历史',
'Core:SynchroLogTitle' => '%1$s - %2$s',
'Core:Synchro:Nb_Replica' => 'Replica processed: %1$s',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'At Least one reconciliation key must be specified, or the reconciliation policy must be to use the primary key.',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'A delete retention period must be specified, since objects are to be deleted after being marked as obsolete',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Obsolete objects are to be updated, but no update is specified.',
'Class:SynchroDataSource/Error:DataTableAlreadyExists' => 'The table %1$s already exists in the database. Please use another name for the synchro data table.',
'Core:SynchroReplica:PublicData' => 'Public Data',
'Core:SynchroReplica:PrivateDetails' => 'Private Details',
'Core:SynchroReplica:BackToDataSource' => '返回同步数据源: %1$s',
'Core:SynchroReplica:ListOfReplicas' => 'List of Replica',
'Core:SynchroAttExtKey:ReconciliationById' => 'id (Primary Key)',
'Core:SynchroAtt:attcode' => '属性',
'Core:SynchroAtt:attcode+' => 'Field of the object',
'Core:SynchroAtt:reconciliation' => 'Reconciliation ?',
'Core:SynchroAtt:reconciliation+' => 'Used for searching',
'Core:SynchroAtt:update' => '更新 ?',
'Core:SynchroAtt:update+' => 'Used to update the object',
'Core:SynchroAtt:update_policy' => '更新策略',
'Core:SynchroAtt:update_policy+' => 'Behavior of the updated field',
'Core:SynchroAtt:reconciliation_attcode' => 'Reconciliation Key',
'Core:SynchroAtt:reconciliation_attcode+' => 'Attribute Code for the External Key Reconciliation',
'Core:SyncDataExchangeComment' => '(Data Synchro)',
'Core:Synchro:ListOfDataSources' => '数据源列表:',
'Core:Synchro:LastSynchro' => '上次同步:',
'Core:Synchro:ThisObjectIsSynchronized' => 'This object is synchronized with an external data source',
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'The object was <b>created</b> by the external data source %1$s',
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'The object <b>can be deleted</b> by the external data source %1$s',
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'You <b>cannot delete the object</b> because it is owned by the external data source %1$s',
'TitleSynchroExecution' => 'Execution of the synchronization',
'Class:SynchroDataSource:DataTable' => 'Database table: %1$s',
'Core:SyncDataSourceObsolete' => '数据源已被废弃. 操作已取消.',
'Core:SyncDataSourceAccessRestriction' => '仅数据源中指定的用户才能执行此操作. 操作已取消.',
'Core:SyncTooManyMissingReplicas' => 'All records have been untouched for some time (all of the objects could be deleted). Please check that the process that writes into the synchronization table is still running. Operation cancelled.',
'Core:SyncSplitModeCLIOnly' => 'The synchronization can be executed in chunks only if run in mode CLI',
'Core:Synchro:ListReplicas_AllReplicas_Errors_Warnings' => '%1$s replicas, %2$s error(s), %3$s warning(s).',
'Core:SynchroReplica:TargetObject' => '已同步的对象: %1$s',
'Class:AsyncSendEmail' => 'Email (异步)',
'Class:AsyncSendEmail/Attribute:to' => '收件人',
'Class:AsyncSendEmail/Attribute:subject' => '主题',
'Class:AsyncSendEmail/Attribute:body' => '正文',
'Class:AsyncSendEmail/Attribute:header' => 'Header',
'Class:CMDBChangeOpSetAttributeOneWayPassword' => '加密密码',
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => '之前的值',
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Encrypted Field',
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => '之前的值',
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Case Log',
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Last Entry',
'Class:SynchroDataSource' => '同步数据源',
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implementation',
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => '废弃',
'Class:SynchroDataSource/Attribute:status/Value:production' => '生产',
'Class:SynchroDataSource/Attribute:scope_restriction' => '范围限制',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Use the attributes',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Use the primary_key field',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => '已创建',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => '错误',
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => '错误',
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => '更新',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => '创建',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => '错误',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => '选择第一项(随机?)',
'Class:SynchroDataSource/Attribute:delete_policy' => '删除策略',
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => '删除',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => '忽略',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => '更新',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => '先更新再删除',
'Class:SynchroDataSource/Attribute:attribute_list' => '属性列表',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => '仅限管理员',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Everybody allowed to delete such objects',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Nobody',
'Class:SynchroAttribute' => '同步属性',
'Class:SynchroAttribute/Attribute:sync_source_id' => '同步数据源',
'Class:SynchroAttribute/Attribute:attcode' => 'Attribute Code',
'Class:SynchroAttribute/Attribute:update' => '更新',
'Class:SynchroAttribute/Attribute:reconcile' => 'Reconcile',
'Class:SynchroAttribute/Attribute:update_policy' => '更新策略',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => '加锁',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => '解锁',
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Initialize if empty',
'Class:SynchroAttribute/Attribute:finalclass' => 'Class',
'Class:SynchroAttExtKey' => 'Synchro Attribute (ExtKey)',
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Reconciliation Attribute',
'Class:SynchroAttLinkSet' => 'Synchro Attribute (Linkset)',
'Class:SynchroAttLinkSet/Attribute:row_separator' => '列的分隔符',
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => '属性的分隔符',
'Class:SynchroLog' => '同步日志',
'Class:SynchroLog/Attribute:sync_source_id' => '同步数据源',
'Class:SynchroLog/Attribute:start_date' => '开始日期',
'Class:SynchroLog/Attribute:end_date' => '结束日期',
'Class:SynchroLog/Attribute:status' => '状态',
'Class:SynchroLog/Attribute:status/Value:completed' => '已完成',
'Class:SynchroLog/Attribute:status/Value:error' => '错误',
'Class:SynchroLog/Attribute:status/Value:running' => '正在运行',
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nb replica seen',
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nb replica total',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nb objects deleted',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nb of errors while deleting',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nb objects obsoleted',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nb of errors while obsoleting',
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nb objects created',
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nb or errors while creating',
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nb objects updated',
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nb errors while updating',
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nb of errors during reconciliation',
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nb replica disappeared',
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nb objects updated',
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nb objects unchanged',
'Class:SynchroLog/Attribute:last_error' => 'Last error',
'Class:SynchroLog/Attribute:traces' => 'Traces',
'Class:SynchroReplica' => 'Synchro Replica',
'Class:SynchroReplica/Attribute:sync_source_id' => 'Synchro Data Source',
'Class:SynchroReplica/Attribute:dest_id' => 'Destination object (ID)',
'Class:SynchroReplica/Attribute:dest_class' => 'Destination type',
'Class:SynchroReplica/Attribute:status_last_seen' => 'Last seen',
'Class:SynchroReplica/Attribute:status' => '状态',
'Class:SynchroReplica/Attribute:status/Value:modified' => '已修改',
'Class:SynchroReplica/Attribute:status/Value:new' => '新建',
'Class:SynchroReplica/Attribute:status/Value:obsolete' => '废弃',
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Orphan',
'Class:SynchroReplica/Attribute:status/Value:synchronized' => '已同步',
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Object Created ?',
'Class:SynchroReplica/Attribute:status_last_error' => 'Last Error',
'Class:SynchroReplica/Attribute:status_last_warning' => '警告',
'Class:SynchroReplica/Attribute:info_creation_date' => '创建日期',
'Class:SynchroReplica/Attribute:info_last_modified' => '最后修改日期',
'Class:appUserPreferences' => '用户资料',
'Class:appUserPreferences/Attribute:userid' => '用户',
'Class:appUserPreferences/Attribute:preferences' => '首选项',
'Core:ExecProcess:Code1' => 'Wrong command or command finished with errors (e.g. wrong script name)',
'Core:ExecProcess:Code255' => 'PHP Error (parsing, or runtime)',
// Attribute Duration
'Core:Duration_Seconds' => '%1$ds',
'Core:Duration_Minutes_Seconds' =>'%1$dmin %2$ds',
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds',
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sd %2$dh %3$dmin %4$ds',
// Explain working time computing
'Core:ExplainWTC:ElapsedTime' => 'Time elapsed (stored as "%1$s")',
'Core:ExplainWTC:StopWatch-TimeSpent' => 'Time spent for "%1$s"',
'Core:ExplainWTC:StopWatch-Deadline' => 'Deadline for "%1$s" at %2$d%%',
// Bulk export
'Core:BulkExport:MissingParameter_Param' => '缺少参数 "%1$s"',
'Core:BulkExport:InvalidParameter_Query' => 'Invalid value for the parameter "query". There is no Query Phrasebook corresponding to the id: "%1$s".',
'Core:BulkExport:ExportFormatPrompt' => '导出格式:',
'Core:BulkExportOf_Class' => '%1$s 导出',
'Core:BulkExport:ClickHereToDownload_FileName' => '点击这里下载 %1$s',
'Core:BulkExport:ExportResult' => '导出结果:',
'Core:BulkExport:RetrievingData' => '正在检索数据...',
'Core:BulkExport:HTMLFormat' => '网页 (*.html)',
'Core:BulkExport:CSVFormat' => 'CSV (*.csv)',
'Core:BulkExport:XLSXFormat' => 'Excel 2007+ (*.xlsx)',
'Core:BulkExport:PDFFormat' => 'PDF 文档 (*.pdf)',
'Core:BulkExport:DragAndDropHelp' => '可拖动或删除列头进行排序. 正在预览 %1$s 行. 一共需要导出: %2$s 行.',
'Core:BulkExport:EmptyPreview' => '请选择要导出的列',
'Core:BulkExport:ColumnsOrder' => '列顺序',
'Core:BulkExport:AvailableColumnsFrom_Class' => '%1$s 属性中可用的列',
'Core:BulkExport:NoFieldSelected' => '至少选择导出一列',
'Core:BulkExport:CheckAll' => '全选',
'Core:BulkExport:UncheckAll' => '反选',
'Core:BulkExport:ExportCancelledByUser' => '导出被用户取消',
'Core:BulkExport:CSVOptions' => 'CSV 选项',
'Core:BulkExport:CSVLocalization' => '本地化',
'Core:BulkExport:PDFOptions' => 'PDF 选项',
'Core:BulkExport:PDFPageFormat' => '页面格式',
'Core:BulkExport:PDFPageSize' => '页面大小:',
'Core:BulkExport:PageSize-A4' => 'A4',
'Core:BulkExport:PageSize-A3' => 'A3',
'Core:BulkExport:PageSize-Letter' => '信纸',
'Core:BulkExport:PDFPageOrientation' => '页面方向:',
'Core:BulkExport:PageOrientation-L' => '横向',
'Core:BulkExport:PageOrientation-P' => '纵向',
'Core:BulkExport:XMLFormat' => 'XML文件 (*.xml)',
'Core:BulkExport:XMLOptions' => 'XML选项',
'Core:BulkExport:SpreadsheetFormat' => 'HTML表单(*.html)',
'Core:BulkExport:SpreadsheetOptions' => '表单选项',
'Core:BulkExport:OptionNoLocalize' => '不要本地化这些值 (举的例子)',
'Core:BulkExport:OptionLinkSets' => '包含外链的对象',
'Core:BulkExport:OptionFormattedText' => '保持文本格式',
'Core:BulkExport:ScopeDefinition' => '定义要导出的对象',
'Core:BulkExportLabelOQLExpression' => 'OQL Query:',
'Core:BulkExportLabelPhrasebookEntry' => 'Query Phrasebook Entry:',
'Core:BulkExportMessageEmptyOQL' => 'Please enter a valid OQL query.',
'Core:BulkExportMessageEmptyPhrasebookEntry' => 'Please select a valid phrasebook entry.',
'Core:BulkExportQueryPlaceholder' => 'Type an OQL query here...',
'Core:BulkExportCanRunNonInteractive' => '点击这里运行非交互式导出.',
'Core:BulkExportLegacyExport' => '点击这里进入旧版导出.',
'Core:BulkExport:XLSXOptions' => 'Excel 选项',
'Core:BulkExport:TextFormat' => '文本中包含一些HTML 标记',
'Core:BulkExport:DateTimeFormat' => '日期和时间格式',
'Core:BulkExport:DateTimeFormatDefault_Example' => '默认格式 (%1$s), e.g. %2$s',
'Core:BulkExport:DateTimeFormatCustom_Format' => '自定义格式: %1$s',
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
'Core:DateTime:Placeholder_Y' => 'YYYY', // Year on 4 digits
'Core:DateTime:Placeholder_y' => 'YY', // Year on 2 digits
'Core:DateTime:Placeholder_H' => 'hh', // Hour 00..23
'Core:DateTime:Placeholder_h' => 'h', // Hour 01..12
'Core:DateTime:Placeholder_G' => 'hh', // Hour 0..23
'Core:DateTime:Placeholder_g' => 'h', // Hour 1..12
'Core:DateTime:Placeholder_a' => 'am/pm', // am/pm (lowercase)
'Core:DateTime:Placeholder_A' => 'AM/PM', // AM/PM (uppercase)
'Core:DateTime:Placeholder_i' => 'mm', // minutes, 2 digits: 00..59
'Core:DateTime:Placeholder_s' => 'ss', // seconds, 2 digits 00..59
'Core:Validator:Default' => '格式错误',
'Core:Validator:Mandatory' => '这里必填',
'Core:Validator:MustBeInteger' => '必须是整数',
'Core:Validator:MustSelectOne' => '请选择一个',
));

File diff suppressed because it is too large Load Diff

View File

@@ -15,7 +15,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/>
function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper, sAttCode, bSearchMode)
function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper, sAttCode, bSearchMode, bDoSearch)
{
this.id = id;
this.sOriginalTargetClass = sTargetClass;
@@ -29,6 +29,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
this.ajax_request = null;
this.bSelectMode = bSelectMode; // true if the edited field is a SELECT, false if it's an autocomplete
this.bSearchMode = bSearchMode; // true if selecting a value in the context of a search form
this.bDoSearch = bDoSearch; // false if the search is not launched
var me = this;
this.Init = function()
@@ -91,11 +92,14 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
{
$('#ac_dlg_'+me.id).html(data);
$('#ac_dlg_'+me.id).dialog('open');
me.UpdateSizes();
me.UpdateButtons();
me.ajax_request = null;
if (me.bDoSearch)
{
me.DoSearchObjects();
}
FixSearchFormsDisposition();
me.DoSearchObjects();
me.UpdateSizes();
},
'html'
);

View File

@@ -142,6 +142,9 @@ $.Autocompleter = function(input, options) {
blockSubmit = true;
return false;
}
if ($(options.keyHolder).val() === "") {
return false;
}
break;
case KEY.ESC:

View File

@@ -11,6 +11,7 @@ $(function()
input_name: '',
class_name: '',
att_code: '',
do_search: true,
submit_to: '../pages/ajax.render.php',
submit_parameters: {},
labels: { 'delete': 'Delete',
@@ -211,7 +212,14 @@ $(function()
});
me.indicator.html('');
me.oButtons['add'].removeAttr('disabled');
me._onSearchToAdd();
if (me.options.do_search)
{
me._onSearchToAdd();
}
else
{
FixSearchFormsDisposition();
}
me._updateDlgPosition();
me._onSearchDlgUpdateSize();
});

View File

@@ -1,5 +1,5 @@
// JavaScript Document
function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates, oWizHelper, sExtKeyToRemote)
function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates, oWizHelper, sExtKeyToRemote, bDoSearch)
{
this.id = id;
this.iInputId = iInputId;
@@ -13,6 +13,7 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates, oWizH
this.aAdded = [];
this.aRemoved = [];
this.aModified = {};
this.bDoSearch = bDoSearch; // false if the search is not launched
var me = this;
this.Init = function()
@@ -107,7 +108,14 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates, oWizH
$('#dlg_'+me.id).html(data);
$('#dlg_'+me.id).dialog('open');
me.UpdateSizes(null, null);
me.SearchObjectsToAdd();
if (me.bDoSearch)
{
me.SearchObjectsToAdd();
}
else
{
FixSearchFormsDisposition();
}
$('#'+me.id+'_indicatorAdd').html('');
},
'html'

View File

@@ -19748,7 +19748,7 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
break;
}
case 'a': {
$this->HREF = '';
$this->HREF = array();
break;
}
case 'sup': {

View File

@@ -105,6 +105,7 @@ function GetRuleResultFilter($iRuleId, $oDefinitionFilter, $oAppContext)
{
$aValidIds[] = $aRow['id'];
}
/** @var \DBObjectSearch $oFilter */
$oFilter = $oDefinitionFilter->DeepClone();
if (count($aValidIds) > 0)
{
@@ -116,7 +117,7 @@ function GetRuleResultFilter($iRuleId, $oDefinitionFilter, $oAppContext)
$aInvalids = array_diff($aInDefSet, $aValidIds);
if (count($aInvalids) > 0)
{
$oFilter->AddCondition('id', $aInvalids, 'IN');
$oFilter->AddConditionForInOperatorUsingParam('id', $aInvalids, true);
}
else
{

View File

@@ -192,6 +192,13 @@ try
*/
function ProcessCSVData(WebPage $oPage, $bSimulate = true)
{
$sClassName = utils::ReadParam('class_name', '', false, 'class');
// Class access right check for the import
if (UserRights::IsActionAllowed($sClassName, UR_ACTION_MODIFY) == UR_ALLOWED_NO)
{
throw new CoreException(Dict::S('UI:ActionNotAllowed'));
}
$aResult = array();
$sCSVData = utils::ReadParam('csvdata', '', false, 'raw_data');
$sCSVDataTruncated = utils::ReadParam('csvdata_truncated', '', false, 'raw_data');
@@ -203,7 +210,6 @@ try
{
$iSkippedLines = utils::ReadParam('nb_skipped_lines', '0');
}
$sClassName = utils::ReadParam('class_name', '', false, 'class');
$aFieldsMapping = utils::ReadParam('field', array(), false, 'raw_data');
$aSearchFields = utils::ReadParam('search_field', array(), false, 'field_name');
$iCurrentStep = $bSimulate ? 4 : 5;

View File

@@ -1,7 +1,7 @@
iTop - version 2.4.1 - 14-Feb-2018
iTop - version 2.4.3 - 10-Oct-2018
Readme file
iTop 2.4.1 is the 31st release of iTop.
iTop 2.4.3 is the 34th release of iTop.
Changes since the previous version
-------------------------------------------------------------------

View File

@@ -1,182 +1,187 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Does load data from XML files (currently used in the setup only)
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* This page is called to perform "asynchronously" the setup actions
* parameters
* 'operation': one of 'compile_data_model', 'update_db_schema', 'after_db_creation', 'file'
*
* if 'operation' == 'update_db_schema':
* 'mode': install | upgrade
*
* if 'operation' == 'after_db_creation':
* 'mode': install | upgrade
*
* if 'operation' == 'file':
* 'file': string Name of the file to load
* 'session_status': string 'start', 'continue' or 'end'
* 'percent': integer 0..100 the percentage of completion once the file has been loaded
*/
define('SAFE_MINIMUM_MEMORY', 64*1024*1024);
require_once('../approot.inc.php');
require_once(APPROOT.'/application/utils.inc.php');
require_once(APPROOT.'/setup/setuppage.class.inc.php');
require_once(APPROOT.'/setup/moduleinstaller.class.inc.php');
ini_set('max_execution_time', max(3600, ini_get('max_execution_time'))); // Under Windows SQL/backup operations are part of the timeout and require extra time
date_default_timezone_set('Europe/Paris'); // Just to avoid a warning if the timezone is not set in php.ini
$sMemoryLimit = trim(ini_get('memory_limit'));
if (empty($sMemoryLimit))
{
// On some PHP installations, memory_limit does not exist as a PHP setting!
// (encountered on a 5.2.0 under Windows)
// In that case, ini_set will not work, let's keep track of this and proceed with the data load
SetupPage::log_info("No memory limit has been defined in this instance of PHP");
}
else
{
// Check that the limit will allow us to load the data
//
$iMemoryLimit = utils::ConvertToBytes($sMemoryLimit);
if ($iMemoryLimit < SAFE_MINIMUM_MEMORY)
{
if (ini_set('memory_limit', SAFE_MINIMUM_MEMORY) === FALSE)
{
SetupPage::log_error("memory_limit is too small: $iMemoryLimit and can not be increased by the script itself.");
}
else
{
SetupPage::log_info("memory_limit increased from $iMemoryLimit to ".SAFE_MINIMUM_MEMORY.".");
}
}
}
function FatalErrorCatcher($sOutput)
{
if ( preg_match('|<phpfatalerror>.*</phpfatalerror>|s', $sOutput, $aMatches) )
{
header("HTTP/1.0 500 Internal server error.");
$errors = '';
foreach ($aMatches as $sMatch)
{
$errors .= strip_tags($sMatch)."\n";
}
$sOutput = "$errors\n";
// Logging to a file does not work if the whole memory is exhausted...
//SetupPage::log_error("Fatal error - in $__FILE__ , $errors");
}
return $sOutput;
}
//Define some bogus, invalid HTML tags that no sane
//person would ever put in an actual document and tell
//PHP to delimit fatal error warnings with them.
ini_set('error_prepend_string', '<phpfatalerror>');
ini_set('error_append_string', '</phpfatalerror>');
// Starts the capture of the ouput, and sets a filter to capture the fatal errors.
ob_start('FatalErrorCatcher'); // Start capturing the output, and pass it through the fatal error catcher
require_once(APPROOT.'/core/config.class.inc.php');
require_once(APPROOT.'/core/log.class.inc.php');
require_once(APPROOT.'/core/kpi.class.inc.php');
require_once(APPROOT.'/core/cmdbsource.class.inc.php');
require_once('./xmldataloader.class.inc.php');
require_once(APPROOT.'/application/ajaxwebpage.class.inc.php');
// Never cache this page
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Fri, 17 Jul 1970 05:00:00 GMT"); // Date in the past
/**
* Main program
*/
$sOperation = Utils::ReadParam('operation', '');
try
{
switch($sOperation)
{
case 'async_action':
ini_set('max_execution_time', max(240, ini_get('max_execution_time')));
// While running the setup it is desirable to see any error that may happen
ini_set('display_errors', true);
ini_set('display_startup_errors', true);
require_once(APPROOT.'/setup/wizardcontroller.class.inc.php');
require_once(APPROOT.'/setup/wizardsteps.class.inc.php');
$sClass = utils::ReadParam('step_class', '');
$sState = utils::ReadParam('step_state', '');
$sActionCode = utils::ReadParam('code', '');
$aParams = utils::ReadParam('params', array(), false, 'raw_data');
$oPage = new ajax_page('');
$oDummyController = new WizardController('');
if (is_subclass_of($sClass, 'WizardStep'))
{
$oStep = new $sClass($oDummyController, $sState);
$sConfigFile = utils::GetConfigFilePath();
if (file_exists($sConfigFile) && !is_writable($sConfigFile) && $oStep->RequiresWritableConfig())
{
$oPage->error("<b>Error:</b> the configuration file '".$sConfigFile."' already exists and cannot be overwritten.");
$oPage->p("The wizard cannot modify the configuration file for you. If you want to upgrade ".ITOP_APPLICATION.", make sure that the file '<b>".realpath($sConfigFile)."</b>' can be modified by the web server.");
$oPage->output();
}
else
{
$oStep->AsyncAction($oPage, $sActionCode, $aParams);
}
}
$oPage->output();
break;
default:
throw(new Exception("Error unsupported operation '$sOperation'"));
}
}
catch(Exception $e)
{
header("HTTP/1.0 500 Internal server error.");
echo "<p>An error happened while processing the installation:</p>\n";
echo '<p>'.$e."</p>\n";
SetupPage::log_error("An error happened while processing the installation: ".$e);
}
if (function_exists('memory_get_peak_usage'))
{
if ($sOperation == 'file')
{
SetupPage::log_info("loading file '$sFileName', peak memory usage. ".memory_get_peak_usage());
}
else
{
SetupPage::log_info("operation '$sOperation', peak memory usage. ".memory_get_peak_usage());
}
}
?>
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Does load data from XML files (currently used in the setup only)
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* This page is called to perform "asynchronously" the setup actions
* parameters
* 'operation': one of 'compile_data_model', 'update_db_schema', 'after_db_creation', 'file'
*
* if 'operation' == 'update_db_schema':
* 'mode': install | upgrade
*
* if 'operation' == 'after_db_creation':
* 'mode': install | upgrade
*
* if 'operation' == 'file':
* 'file': string Name of the file to load
* 'session_status': string 'start', 'continue' or 'end'
* 'percent': integer 0..100 the percentage of completion once the file has been loaded
*/
define('SAFE_MINIMUM_MEMORY', 64*1024*1024);
require_once('../approot.inc.php');
require_once(APPROOT.'/application/utils.inc.php');
require_once(APPROOT.'/setup/setuppage.class.inc.php');
require_once(APPROOT.'/setup/moduleinstaller.class.inc.php');
ini_set('max_execution_time', max(3600, ini_get('max_execution_time'))); // Under Windows SQL/backup operations are part of the timeout and require extra time
date_default_timezone_set('Europe/Paris'); // Just to avoid a warning if the timezone is not set in php.ini
$sMemoryLimit = trim(ini_get('memory_limit'));
if (empty($sMemoryLimit))
{
// On some PHP installations, memory_limit does not exist as a PHP setting!
// (encountered on a 5.2.0 under Windows)
// In that case, ini_set will not work, let's keep track of this and proceed with the data load
SetupPage::log_info("No memory limit has been defined in this instance of PHP");
}
else
{
// Check that the limit will allow us to load the data
//
$iMemoryLimit = utils::ConvertToBytes($sMemoryLimit);
if ($iMemoryLimit < SAFE_MINIMUM_MEMORY)
{
if (ini_set('memory_limit', SAFE_MINIMUM_MEMORY) === FALSE)
{
SetupPage::log_error("memory_limit is too small: $iMemoryLimit and can not be increased by the script itself.");
}
else
{
SetupPage::log_info("memory_limit increased from $iMemoryLimit to ".SAFE_MINIMUM_MEMORY.".");
}
}
}
function FatalErrorCatcher($sOutput)
{
if ( preg_match('|<phpfatalerror>.*</phpfatalerror>|s', $sOutput, $aMatches) )
{
header("HTTP/1.0 500 Internal server error.");
$errors = '';
foreach ($aMatches as $sMatch)
{
$errors .= strip_tags($sMatch)."\n";
}
$sOutput = "$errors\n";
// Logging to a file does not work if the whole memory is exhausted...
//SetupPage::log_error("Fatal error - in $__FILE__ , $errors");
}
return $sOutput;
}
//Define some bogus, invalid HTML tags that no sane
//person would ever put in an actual document and tell
//PHP to delimit fatal error warnings with them.
ini_set('error_prepend_string', '<phpfatalerror>');
ini_set('error_append_string', '</phpfatalerror>');
// Starts the capture of the ouput, and sets a filter to capture the fatal errors.
ob_start('FatalErrorCatcher'); // Start capturing the output, and pass it through the fatal error catcher
require_once(APPROOT.'/core/config.class.inc.php');
require_once(APPROOT.'/core/log.class.inc.php');
require_once(APPROOT.'/core/kpi.class.inc.php');
require_once(APPROOT.'/core/cmdbsource.class.inc.php');
require_once('./xmldataloader.class.inc.php');
require_once(APPROOT.'/application/ajaxwebpage.class.inc.php');
// Never cache this page
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Fri, 17 Jul 1970 05:00:00 GMT"); // Date in the past
/**
* Main program
*/
$sOperation = Utils::ReadParam('operation', '');
try
{
if (is_file(utils::GetConfigFilePath()) && !is_writable(utils::GetConfigFilePath()))
{
throw new Exception('Setup operations are not allowed outside of the setup');
}
switch($sOperation)
{
case 'async_action':
ini_set('max_execution_time', max(240, ini_get('max_execution_time')));
// While running the setup it is desirable to see any error that may happen
ini_set('display_errors', true);
ini_set('display_startup_errors', true);
require_once(APPROOT.'/setup/wizardcontroller.class.inc.php');
require_once(APPROOT.'/setup/wizardsteps.class.inc.php');
$sClass = utils::ReadParam('step_class', '');
$sState = utils::ReadParam('step_state', '');
$sActionCode = utils::ReadParam('code', '');
$aParams = utils::ReadParam('params', array(), false, 'raw_data');
$oPage = new ajax_page('');
$oDummyController = new WizardController('');
if (is_subclass_of($sClass, 'WizardStep'))
{
$oStep = new $sClass($oDummyController, $sState);
$sConfigFile = utils::GetConfigFilePath();
if (file_exists($sConfigFile) && !is_writable($sConfigFile) && $oStep->RequiresWritableConfig())
{
$oPage->error("<b>Error:</b> the configuration file '".$sConfigFile."' already exists and cannot be overwritten.");
$oPage->p("The wizard cannot modify the configuration file for you. If you want to upgrade ".ITOP_APPLICATION.", make sure that the file '<b>".realpath($sConfigFile)."</b>' can be modified by the web server.");
$oPage->output();
}
else
{
$oStep->AsyncAction($oPage, $sActionCode, $aParams);
}
}
$oPage->output();
break;
default:
throw(new Exception("Error unsupported operation '$sOperation'"));
}
}
catch(Exception $e)
{
header("HTTP/1.0 500 Internal server error.");
echo "<p>An error happened while processing the installation:</p>\n";
echo '<p>'.$e."</p>\n";
SetupPage::log_error("An error happened while processing the installation: ".$e);
}
if (function_exists('memory_get_peak_usage'))
{
if ($sOperation == 'file')
{
SetupPage::log_info("loading file '$sFileName', peak memory usage. ".memory_get_peak_usage());
}
else
{
SetupPage::log_info("operation '$sOperation', peak memory usage. ".memory_get_peak_usage());
}
}
?>

View File

@@ -626,6 +626,17 @@ class TarGzArchive implements BackupArchive
return false;
}
/**
* @param string $p_path
* @param null $aEntries
*
* @return bool
*/
public function extractTo($p_path = '', $aEntries = null)
{
return $this->oArchive->extract($p_path);
}
/**
* @param string $sDestinationDir
* @param string $sArchiveFile

View File

@@ -308,12 +308,12 @@ class iTopExtensionsMap
$sModuleVersion = '0.0.1';
}
if ($sParentExtensionId !== null)
if (($sParentExtensionId !== null) && (array_key_exists($sParentExtensionId, $this->aExtensions)) && ($this->aExtensions[$sParentExtensionId] instanceof iTopExtension))
{
// Already inside an extension, let's add this module the list of modules belonging to this extension
$this->aExtensions[$sParentExtensionId]->aModules[] = $sModuleName;
$this->aExtensions[$sParentExtensionId]->aModuleVersion[$sModuleName] = $sModuleVersion;
}
}
else
{
// Not already inside an folder containing an 'extension.xml' file

File diff suppressed because it is too large Load Diff

View File

@@ -1,21 +1,42 @@
<?php
// Copyright (c) 2010-2017 Combodo SARL
//
// 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
//
/**
* File::CSV
*
* PHP versions 4 and 5
*
* Copyright (c) 1997-2008,
* Vincent Blavet <vincent@phpconcept.net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @category File_Formats
* @package Archive_Tar
* @author Vincent Blavet <vincent@phpconcept.net>
* @author Combodo
* @copyright 1997-2018 The Authors
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id$
* @link http://pear.php.net/package/Archive_Tar
*/
define('ARCHIVE_TAR_ATT_SEPARATOR', 90001);
define('ARCHIVE_TAR_END_BLOCK', pack("a512", ''));
@@ -1188,8 +1209,19 @@ class ArchiveTar
return false;
}
while (($v_buffer = fread($v_file, 512)) != '') {
$v_binary_data = pack("a512", "$v_buffer");
$iLen = 1024*1024;
while (($v_buffer = fread($v_file, $iLen)) != '') {
$iBufferLen = strlen("$v_buffer");
if ($iBufferLen != $iLen)
{
$iPack = (ceil($iBufferLen / 512)) * 512;
$sPack = sprintf('a%d', $iPack);
}
else
{
$sPack = sprintf('a%d', $iLen);
}
$v_binary_data = pack($sPack, "$v_buffer");
$this->_writeBlock($v_binary_data);
}

View File

@@ -29,6 +29,8 @@ use \Combodo\iTop\Form\Field\TextField;
* Description of TextAreaField
*
* @author Guillaume Lajarige <guillaume.lajarige@combodo.com>
* @package \Combodo\iTop\Form\Field
* @since 2.3.0
*/
class TextAreaField extends TextField
{
@@ -113,7 +115,7 @@ class TextAreaField extends TextField
{
if ($this->GetFormat() == TextAreaField::ENUM_FORMAT_TEXT)
{
$sValue = $this->GetCurrentValue();
$sValue = \Str::pure2html($this->GetCurrentValue());
$sValue = AttributeText::RenderWikiHtml($sValue);
return "<div>".str_replace("\n", "<br>\n", $sValue).'</div>';
}

View File

@@ -576,6 +576,7 @@ EOF
);
// Target object others attributes
// TODO: Support for AttriubteImage, AttributeBlob
foreach ($this->oField->GetAttributesToDisplay(true) as $sAttCode)
{
if ($sAttCode !== 'id')
@@ -598,7 +599,7 @@ EOF
}
else
{
$aAttProperties['value'] = $oAttDef->GetValueLabel($oRemoteItem->Get($sAttCode));
$aAttProperties['value'] = $oAttDef->GetAsHTML($oRemoteItem->Get($sAttCode));
if ($oAttDef instanceof AttributeFriendlyName)
{