mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-15 16:34:11 +01:00
Compare commits
208 Commits
support/1.
...
support/1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ea76869f4 | ||
|
|
8fe5450d9e | ||
|
|
b732673b65 | ||
|
|
05c709056b | ||
|
|
8e7f629923 | ||
|
|
92b3434954 | ||
|
|
71d3a9e443 | ||
|
|
f6aeeb0aaa | ||
|
|
48ab6cb737 | ||
|
|
8b0214eeee | ||
|
|
c6454c5a8e | ||
|
|
6fd3bdbef4 | ||
|
|
4a12c531e6 | ||
|
|
df086c8ce2 | ||
|
|
d66e413289 | ||
|
|
938d383efd | ||
|
|
cc35e41028 | ||
|
|
0771fd0636 | ||
|
|
e4fa7ba983 | ||
|
|
109e8f6157 | ||
|
|
99bce469a1 | ||
|
|
e439797767 | ||
|
|
7f17acf553 | ||
|
|
5e64834b06 | ||
|
|
79fbec3675 | ||
|
|
f4e796f607 | ||
|
|
0d710d0464 | ||
|
|
40701f3f36 | ||
|
|
fcabb8fc43 | ||
|
|
4c64419f19 | ||
|
|
c8c388dac5 | ||
|
|
374858ef73 | ||
|
|
d45149a327 | ||
|
|
0ea9968797 | ||
|
|
b68ac3916f | ||
|
|
e5c46340d1 | ||
|
|
1e6887062f | ||
|
|
fc0f6b636e | ||
|
|
bcb1864963 | ||
|
|
3a1932b742 | ||
|
|
438f7f19c0 | ||
|
|
15b8b18b90 | ||
|
|
b9f467f08f | ||
|
|
9f779b8dfe | ||
|
|
8ce3c48446 | ||
|
|
f84d91e482 | ||
|
|
c6493f6cdc | ||
|
|
fb87911677 | ||
|
|
60b2162d84 | ||
|
|
e42b0513a0 | ||
|
|
f92a7df522 | ||
|
|
b7bd1a5943 | ||
|
|
69f21b9b79 | ||
|
|
6614a90e38 | ||
|
|
88a29fd8d1 | ||
|
|
7e2982b848 | ||
|
|
ed5d59153b | ||
|
|
ab3fd7f1b4 | ||
|
|
6e685feb9f | ||
|
|
d8c5f26aed | ||
|
|
ada0b310ae | ||
|
|
1f43ba3654 | ||
|
|
cb1628c759 | ||
|
|
605edc261d | ||
|
|
46e7bbe2c8 | ||
|
|
a6ac44204c | ||
|
|
af63233fac | ||
|
|
b1b913d891 | ||
|
|
be5bbdf26c | ||
|
|
b03e9a969c | ||
|
|
c56c662be7 | ||
|
|
6d34c2aa93 | ||
|
|
af20723c8c | ||
|
|
35f09c3091 | ||
|
|
5f04a54df3 | ||
|
|
19bbde6144 | ||
|
|
6fe81320c0 | ||
|
|
d1c808b2c3 | ||
|
|
e3697c37f3 | ||
|
|
a9c6d81130 | ||
|
|
8ff40fb4b8 | ||
|
|
037d6cc4ba | ||
|
|
4b1726c1ca | ||
|
|
0fac58248e | ||
|
|
3a486f8edd | ||
|
|
4fefaa5658 | ||
|
|
65ef621e6f | ||
|
|
1a818f309d | ||
|
|
1a74fe1ec3 | ||
|
|
089a9fcf4a | ||
|
|
e1df33c7d0 | ||
|
|
ee0fcdd42e | ||
|
|
7908b87881 | ||
|
|
8e359682ae | ||
|
|
8f2089e1f6 | ||
|
|
8d61af3d22 | ||
|
|
5e234eefe9 | ||
|
|
25c529a797 | ||
|
|
446a8f74fb | ||
|
|
144af46e8b | ||
|
|
d33217285a | ||
|
|
6ff5b499b0 | ||
|
|
0c084c0b17 | ||
|
|
36dd9fc05e | ||
|
|
4febe204e1 | ||
|
|
9e2c556805 | ||
|
|
3a0be981d6 | ||
|
|
44f661cea4 | ||
|
|
195c1dabf8 | ||
|
|
ce13b05363 | ||
|
|
be4674de11 | ||
|
|
911d4177cc | ||
|
|
237e36f562 | ||
|
|
5fa64ab3d2 | ||
|
|
ad98b8893f | ||
|
|
851b41670e | ||
|
|
d4321ec1ce | ||
|
|
e3ac7067f7 | ||
|
|
eb3d226b3d | ||
|
|
5a30986690 | ||
|
|
b423e98295 | ||
|
|
bdf46e8136 | ||
|
|
d4bfa4c48f | ||
|
|
30a1528a28 | ||
|
|
7ae02a7c5b | ||
|
|
e5682fd2e9 | ||
|
|
c1b5614268 | ||
|
|
5ad7ea1b7b | ||
|
|
30f4ff8765 | ||
|
|
bec8b57fe1 | ||
|
|
9b50124513 | ||
|
|
c9b4468f17 | ||
|
|
3790c8f7d5 | ||
|
|
8f4ee29c69 | ||
|
|
cf737bb8ad | ||
|
|
a222b33566 | ||
|
|
78396eafe3 | ||
|
|
de5ccf5908 | ||
|
|
c3bd0b1b9e | ||
|
|
736247f6e1 | ||
|
|
3074683274 | ||
|
|
4929f94c20 | ||
|
|
b8b20f82d7 | ||
|
|
7989cf622f | ||
|
|
f3cc490295 | ||
|
|
52a47b193d | ||
|
|
cfbf77544e | ||
|
|
0b32f511b8 | ||
|
|
bca713a964 | ||
|
|
692f7060ea | ||
|
|
4fa9933dc7 | ||
|
|
45134e182d | ||
|
|
38a502aa25 | ||
|
|
49e05acd4b | ||
|
|
089407119b | ||
|
|
6262fa1d26 | ||
|
|
c4cca2b2f8 | ||
|
|
d5353c111c | ||
|
|
fd79d30483 | ||
|
|
d708ef585b | ||
|
|
6ac06d7e47 | ||
|
|
019888caff | ||
|
|
e36646a3e6 | ||
|
|
8b6672c0dd | ||
|
|
3d4e76d8b0 | ||
|
|
cf8174d54e | ||
|
|
33f1ec8bf3 | ||
|
|
be1d8674f3 | ||
|
|
76b5bfb19e | ||
|
|
bddb8b4c92 | ||
|
|
67f8ddf5a8 | ||
|
|
f3f2eb5c79 | ||
|
|
a1b9bdaf66 | ||
|
|
e020bad17d | ||
|
|
36278d59a8 | ||
|
|
20d0d33b60 | ||
|
|
573712e9af | ||
|
|
5897ae5bb9 | ||
|
|
cd71f02fad | ||
|
|
e4df8c8c92 | ||
|
|
d1879d0433 | ||
|
|
9e636b1ce5 | ||
|
|
cccea50159 | ||
|
|
3441911781 | ||
|
|
c97f4d5ee7 | ||
|
|
4c637548ac | ||
|
|
721ca8c652 | ||
|
|
293877d78a | ||
|
|
d92f89fbe6 | ||
|
|
1da6a264d0 | ||
|
|
89b58d44cd | ||
|
|
0b93e6f79e | ||
|
|
eb0ba24d7d | ||
|
|
64521eb758 | ||
|
|
2d65325f6f | ||
|
|
a97238c3cd | ||
|
|
ce993b60e4 | ||
|
|
283f7dc9f8 | ||
|
|
4441fb41b9 | ||
|
|
34322045df | ||
|
|
b73da47775 | ||
|
|
3d8ffba2fa | ||
|
|
f9a380b12d | ||
|
|
a9a530a2cb | ||
|
|
ba822a655e | ||
|
|
20ec91e9f3 | ||
|
|
735a9729c0 | ||
|
|
1a52f4de72 |
@@ -27,7 +27,27 @@
|
||||
define('ADMIN_PROFILE_NAME', 'Administrator');
|
||||
define('PORTAL_PROFILE_NAME', 'Portal user');
|
||||
|
||||
class UserRightsBaseClass extends cmdbAbstractObject
|
||||
class UserRightsBaseClassGUI extends cmdbAbstractObject
|
||||
{
|
||||
// Whenever something changes, reload the privileges
|
||||
|
||||
protected function AfterInsert()
|
||||
{
|
||||
UserRights::FlushPrivileges();
|
||||
}
|
||||
|
||||
protected function AfterUpdate()
|
||||
{
|
||||
UserRights::FlushPrivileges();
|
||||
}
|
||||
|
||||
protected function AfterDelete()
|
||||
{
|
||||
UserRights::FlushPrivileges();
|
||||
}
|
||||
}
|
||||
|
||||
class UserRightsBaseClass extends DBObject
|
||||
{
|
||||
// Whenever something changes, reload the privileges
|
||||
|
||||
@@ -50,7 +70,7 @@ class UserRightsBaseClass extends cmdbAbstractObject
|
||||
|
||||
|
||||
|
||||
class URP_Profiles extends UserRightsBaseClass
|
||||
class URP_Profiles extends UserRightsBaseClassGUI
|
||||
{
|
||||
public static function Init()
|
||||
{
|
||||
@@ -87,28 +107,115 @@ class URP_Profiles extends UserRightsBaseClass
|
||||
$this->m_bCheckReservedNames = false;
|
||||
}
|
||||
|
||||
|
||||
protected static $m_aActions = array(
|
||||
UR_ACTION_READ => 'Read',
|
||||
UR_ACTION_MODIFY => 'Modify',
|
||||
UR_ACTION_DELETE => 'Delete',
|
||||
UR_ACTION_BULK_READ => 'Bulk Read',
|
||||
UR_ACTION_BULK_MODIFY => 'Bulk Modify',
|
||||
UR_ACTION_BULK_DELETE => 'Bulk Delete',
|
||||
);
|
||||
|
||||
protected static $m_aCacheActionGrants = null;
|
||||
protected static $m_aCacheStimulusGrants = null;
|
||||
protected static $m_aCacheProfiles = null;
|
||||
|
||||
public static function DoCreateProfile($sName, $sDescription, $bReservedName = false)
|
||||
{
|
||||
if (is_null(self::$m_aCacheProfiles))
|
||||
{
|
||||
self::$m_aCacheProfiles = array();
|
||||
$oFilterAll = new DBObjectSearch('URP_Profiles');
|
||||
$oSet = new DBObjectSet($oFilterAll);
|
||||
while ($oProfile = $oSet->Fetch())
|
||||
{
|
||||
self::$m_aCacheProfiles[$oProfile->Get('name')] = $oProfile->GetKey();
|
||||
}
|
||||
}
|
||||
|
||||
$sCacheKey = $sName;
|
||||
if (isset(self::$m_aCacheProfiles[$sCacheKey]))
|
||||
{
|
||||
return self::$m_aCacheProfiles[$sCacheKey];
|
||||
}
|
||||
$oNewObj = MetaModel::NewObject("URP_Profiles");
|
||||
$oNewObj->Set('name', $sName);
|
||||
$oNewObj->Set('description', $sDescription);
|
||||
if ($bReservedName)
|
||||
{
|
||||
$oNewObj->DisableCheckOnReservedNames();
|
||||
}
|
||||
$iId = $oNewObj->DBInsertNoReload();
|
||||
self::$m_aCacheProfiles[$sCacheKey] = $iId;
|
||||
return $iId;
|
||||
}
|
||||
|
||||
public static function DoCreateActionGrant($iProfile, $iAction, $sClass, $bPermission = true)
|
||||
{
|
||||
$sAction = self::$m_aActions[$iAction];
|
||||
|
||||
if (is_null(self::$m_aCacheActionGrants))
|
||||
{
|
||||
self::$m_aCacheActionGrants = array();
|
||||
$oFilterAll = new DBObjectSearch('URP_ActionGrant');
|
||||
$oSet = new DBObjectSet($oFilterAll);
|
||||
while ($oGrant = $oSet->Fetch())
|
||||
{
|
||||
self::$m_aCacheActionGrants[$oGrant->Get('profileid').'-'.$oGrant->Get('action').'-'.$oGrant->Get('class')] = $oGrant->GetKey();
|
||||
}
|
||||
}
|
||||
|
||||
$sCacheKey = "$iProfile-$sAction-$sClass";
|
||||
if (isset(self::$m_aCacheActionGrants[$sCacheKey]))
|
||||
{
|
||||
return self::$m_aCacheActionGrants[$sCacheKey];
|
||||
}
|
||||
|
||||
$oNewObj = MetaModel::NewObject("URP_ActionGrant");
|
||||
$oNewObj->Set('profileid', $iProfile);
|
||||
$oNewObj->Set('permission', $bPermission ? 'yes' : 'no');
|
||||
$oNewObj->Set('class', $sClass);
|
||||
$oNewObj->Set('action', $sAction);
|
||||
$iId = $oNewObj->DBInsertNoReload();
|
||||
self::$m_aCacheActionGrants[$sCacheKey] = $iId;
|
||||
return $iId;
|
||||
}
|
||||
|
||||
public static function DoCreateStimulusGrant($iProfile, $sStimulusCode, $sClass)
|
||||
{
|
||||
if (is_null(self::$m_aCacheStimulusGrants))
|
||||
{
|
||||
self::$m_aCacheStimulusGrants = array();
|
||||
$oFilterAll = new DBObjectSearch('URP_StimulusGrant');
|
||||
$oSet = new DBObjectSet($oFilterAll);
|
||||
while ($oGrant = $oSet->Fetch())
|
||||
{
|
||||
self::$m_aCacheStimulusGrants[$oGrant->Get('profileid').'-'.$oGrant->Get('stimulus').'-'.$oGrant->Get('class')] = $oGrant->GetKey();
|
||||
}
|
||||
}
|
||||
|
||||
$sCacheKey = "$iProfile-$sStimulusCode-$sClass";
|
||||
if (isset(self::$m_aCacheStimulusGrants[$sCacheKey]))
|
||||
{
|
||||
return self::$m_aCacheStimulusGrants[$sCacheKey];
|
||||
}
|
||||
$oNewObj = MetaModel::NewObject("URP_StimulusGrant");
|
||||
$oNewObj->Set('profileid', $iProfile);
|
||||
$oNewObj->Set('permission', 'yes');
|
||||
$oNewObj->Set('class', $sClass);
|
||||
$oNewObj->Set('stimulus', $sStimulusCode);
|
||||
$iId = $oNewObj->DBInsertNoReload();
|
||||
self::$m_aCacheStimulusGrants[$sCacheKey] = $iId;
|
||||
return $iId;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create the built-in Administrator profile with its reserved name
|
||||
*/
|
||||
public static function DoCreateAdminProfile()
|
||||
{
|
||||
$oNewObj = MetaModel::NewObject("URP_Profiles");
|
||||
$oNewObj->Set('name', ADMIN_PROFILE_NAME);
|
||||
$oNewObj->Set('description', 'Has the rights on everything (bypassing any control)');
|
||||
$oNewObj->DisableCheckOnReservedNames();
|
||||
$iNewId = $oNewObj->DBInsertNoReload();
|
||||
}
|
||||
|
||||
/*
|
||||
* Create the built-in User Portal profile with its reserved name
|
||||
*/
|
||||
public static function DoCreateUserPortalProfile()
|
||||
{
|
||||
$oNewObj = MetaModel::NewObject("URP_Profiles");
|
||||
$oNewObj->Set('name', PORTAL_PROFILE_NAME);
|
||||
$oNewObj->Set('description', 'Has the rights to access to the user portal. People having this profile will not be allowed to access the standard application, they will be automatically redirected to the user portal.');
|
||||
$oNewObj->DisableCheckOnReservedNames();
|
||||
$iNewId = $oNewObj->DBInsertNoReload();
|
||||
self::DoCreateProfile(ADMIN_PROFILE_NAME, 'Has the rights on everything (bypassing any control)', true /* reserved name */);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -180,7 +287,7 @@ class URP_Profiles extends UserRightsBaseClass
|
||||
$oGrant = $oUserRights->GetClassStimulusGrant($this->GetKey(), $sClass, $sStimulusCode);
|
||||
if (is_object($oGrant) && ($oGrant->Get('permission') == 'yes'))
|
||||
{
|
||||
$aStimuli[] = '<span title="'.$sStimulusCode.': '.htmlentities($oStimulus->GetDescription()).'">'.htmlentities($oStimulus->GetLabel()).'</span>';
|
||||
$aStimuli[] = '<span title="'.$sStimulusCode.': '.htmlentities($oStimulus->GetDescription(), ENT_QUOTES, 'UTF-8').'">'.htmlentities($oStimulus->GetLabel(), ENT_QUOTES, 'UTF-8').'</span>';
|
||||
}
|
||||
}
|
||||
$sStimuli = implode(', ', $aStimuli);
|
||||
@@ -222,7 +329,7 @@ class URP_Profiles extends UserRightsBaseClass
|
||||
|
||||
|
||||
|
||||
class URP_UserProfile extends UserRightsBaseClass
|
||||
class URP_UserProfile extends UserRightsBaseClassGUI
|
||||
{
|
||||
public static function Init()
|
||||
{
|
||||
@@ -262,7 +369,7 @@ class URP_UserProfile extends UserRightsBaseClass
|
||||
}
|
||||
}
|
||||
|
||||
class URP_UserOrg extends UserRightsBaseClass
|
||||
class URP_UserOrg extends UserRightsBaseClassGUI
|
||||
{
|
||||
public static function Init()
|
||||
{
|
||||
@@ -489,7 +596,6 @@ class UserRightsProfile extends UserRightsAddOnAPI
|
||||
|
||||
public function Init()
|
||||
{
|
||||
MetaModel::RegisterPlugin('userrights', 'ACbyProfile');
|
||||
}
|
||||
|
||||
|
||||
@@ -649,6 +755,14 @@ exit;
|
||||
{
|
||||
$sAttCode = 'id';
|
||||
}
|
||||
elseif (is_callable("$sClass::MapContextParam"))
|
||||
{
|
||||
$sAttCode = eval("return $sClass::MapContextParam('org_id');"); // Returns null when there is no mapping for this parameter
|
||||
if ($sAttCode == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
elseif(MetaModel::IsValidAttCode($sClass, 'org_id'))
|
||||
{
|
||||
$sAttCode = 'org_id';
|
||||
|
||||
@@ -119,7 +119,7 @@ class URP_Profiles extends UserRightsBaseClass
|
||||
$oGrant = $oUserRights->GetClassStimulusGrant($this->GetKey(), $sClass, $sStimulusCode);
|
||||
if (is_object($oGrant) && ($oGrant->Get('permission') == 'yes'))
|
||||
{
|
||||
$aStimuli[] = '<span title="'.$sStimulusCode.': '.htmlentities($oStimulus->GetDescription()).'">'.htmlentities($oStimulus->GetLabel()).'</span>';
|
||||
$aStimuli[] = '<span title="'.$sStimulusCode.': '.htmlentities($oStimulus->GetDescription(), ENT_QUOTES, 'UTF-8').'">'.htmlentities($oStimulus->GetLabel(), ENT_QUOTES, 'UTF-8').'</span>';
|
||||
}
|
||||
}
|
||||
$sStimuli = implode(', ', $aStimuli);
|
||||
@@ -660,7 +660,8 @@ class UserRightsProjection extends UserRightsAddOnAPI
|
||||
|
||||
public function Init()
|
||||
{
|
||||
MetaModel::RegisterPlugin('userrights', 'ACbyProfile', array($this, 'CacheData'));
|
||||
// CacheData to be invoked in a module extension
|
||||
//MetaModel::RegisterPlugin('userrights', 'ACbyProfile', array($this, 'CacheData'));
|
||||
}
|
||||
|
||||
protected $m_aDimensions = array(); // id -> object
|
||||
|
||||
@@ -166,13 +166,19 @@ EOF
|
||||
$s_captured_output = ob_get_contents();
|
||||
ob_end_clean();
|
||||
echo $this->s_content;
|
||||
echo $this->s_deferred_content;
|
||||
//echo $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";
|
||||
}
|
||||
if (!empty($this->s_deferred_content))
|
||||
{
|
||||
echo "<script type=\"text/javascript\">\n";
|
||||
echo "\$('body').append('".$this->s_deferred_content."');\n";
|
||||
echo "\n</script>\n";
|
||||
}
|
||||
if (!empty($this->m_sReadyScript))
|
||||
{
|
||||
echo "<script type=\"text/javascript\">\n";
|
||||
|
||||
51
application/applicationextension.inc.php
Normal file
51
application/applicationextension.inc.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Class iPlugin
|
||||
* Management of application plugin
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
interface iApplicationUIExtension
|
||||
{
|
||||
public function OnDisplayProperties($oObject, WebPage $oPage, $bEditMode = false);
|
||||
public function OnDisplayRelations($oObject, WebPage $oPage, $bEditMode = false);
|
||||
public function OnFormSubmit($oObject, $sFormPrefix = '');
|
||||
public function OnFormCancel($sTempId); // temp id is made of session_id and transaction_id, it identifies the object in a unique way
|
||||
|
||||
public function EnumUsedAttributes($oObject); // Not yet implemented
|
||||
public function GetIcon($oObject); // Not yet implemented
|
||||
public function GetHilightClass($oObject);
|
||||
|
||||
public function EnumAllowedActions(DBObjectSet $oSet);
|
||||
}
|
||||
|
||||
interface iApplicationObjectExtension
|
||||
{
|
||||
public function OnIsModified($oObject);
|
||||
public function OnCheckToWrite($oObject);
|
||||
public function OnCheckToDelete($oObject);
|
||||
public function OnDBUpdate($oObject, $oChange = null);
|
||||
public function OnDBInsert($oObject, $oChange = null);
|
||||
public function OnDBDelete($oObject, $oChange = null);
|
||||
}
|
||||
|
||||
?>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -377,7 +377,14 @@ class DisplayBlock
|
||||
$sLabels = array();
|
||||
while($oObj = $this->m_oSet->Fetch())
|
||||
{
|
||||
$sValue = $oObj->Get($sGroupByField);
|
||||
if (isset($aExtraParams['group_by_expr']))
|
||||
{
|
||||
eval("\$sValue = ".sprintf($aExtraParams['group_by_expr'], $oObj->Get($sGroupByField)).';');
|
||||
}
|
||||
else
|
||||
{
|
||||
$sValue = $oObj->Get($sGroupByField);
|
||||
}
|
||||
$aGroupBy[$sValue] = isset($aGroupBy[$sValue]) ? $aGroupBy[$sValue]+1 : 1;
|
||||
$sLabels[$sValue] = $oObj->GetAsHtml($sGroupByField);
|
||||
}
|
||||
@@ -441,7 +448,15 @@ class DisplayBlock
|
||||
$aKeys = array();
|
||||
foreach($aGroupByFields as $aField)
|
||||
{
|
||||
$aKeys[$aField['alias'].'.'.$aField['att_code']] = $aObjects[$aField['alias']]->Get($aField['att_code']);
|
||||
$sAlias = $aField['alias'];
|
||||
if (is_null($aObjects[$sAlias]))
|
||||
{
|
||||
$aKeys[$sAlias.'.'.$aField['att_code']] = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
$aKeys[$sAlias.'.'.$aField['att_code']] = $aObjects[$sAlias]->Get($aField['att_code']);
|
||||
}
|
||||
}
|
||||
$sCategory = implode($aKeys, ' ');
|
||||
$aResults[$sCategory][] = $aObjects;
|
||||
@@ -469,7 +484,11 @@ class DisplayBlock
|
||||
$aSimpleArray = array();
|
||||
foreach($aObjects as $aRow)
|
||||
{
|
||||
$aSimpleArray[] = $aRow[$aDisplayAliases[0]];
|
||||
$oObj = $aRow[$aDisplayAliases[0]];
|
||||
if (!is_null($oObj))
|
||||
{
|
||||
$aSimpleArray[] = $oObj;
|
||||
}
|
||||
}
|
||||
$oSet = CMDBObjectSet::FromArray($this->m_oFilter->GetClass(), $aSimpleArray);
|
||||
$sHtml .= "<tr><td>".cmdbAbstractObject::GetDisplaySet($oPage, $oSet, $aExtraParams)."</td></tr>\n";
|
||||
@@ -748,11 +767,12 @@ EOF
|
||||
$sChartType = isset($aExtraParams['chart_type']) ? $aExtraParams['chart_type'] : 'pie';
|
||||
$sTitle = isset($aExtraParams['chart_title']) ? $aExtraParams['chart_title'] : '';
|
||||
$sGroupBy = isset($aExtraParams['group_by']) ? $aExtraParams['group_by'] : '';
|
||||
$sGroupByExpr = isset($aExtraParams['group_by_expr']) ? '¶ms[group_by_expr]='.$aExtraParams['group_by_expr'] : '';
|
||||
$sFilter = $this->m_oFilter->serialize();
|
||||
$sHtml .= "<div id=\"my_chart_{$iChartCounter}\">If the chart does not display, <a href=\"http://get.adobe.com/flash/\" target=\"_blank\">install Flash</a></div>\n";
|
||||
$oPage->add_script("function ofc_resize(left, width, top, height) { /* do nothing special */ }");
|
||||
$oPage->add_ready_script("swfobject.embedSWF(\"../images/open-flash-chart.swf\", \"my_chart_{$iChartCounter}\", \"100%\", \"300\",\"9.0.0\", \"expressInstall.swf\",
|
||||
{\"data-file\":\"".urlencode("../pages/ajax.render.php?operation=open_flash_chart¶ms[group_by]=$sGroupBy¶ms[chart_type]=$sChartType¶ms[chart_title]=$sTitle&filter=".$sFilter)."\"}, {wmode: 'transparent'} );\n");
|
||||
{\"data-file\":\"".urlencode("../pages/ajax.render.php?operation=open_flash_chart¶ms[group_by]=$sGroupBy{$sGroupByExpr}¶ms[chart_type]=$sChartType¶ms[chart_title]=$sTitle&filter=".$sFilter)."\"}, {wmode: 'transparent'} );\n");
|
||||
$iChartCounter++;
|
||||
break;
|
||||
|
||||
@@ -772,7 +792,14 @@ EOF
|
||||
$aGroupBy = array();
|
||||
while($oObj = $this->m_oSet->Fetch())
|
||||
{
|
||||
$sValue = $oObj->Get($sGroupByField);
|
||||
if (isset($aExtraParams['group_by_expr']))
|
||||
{
|
||||
eval("\$sValue = ".sprintf($aExtraParams['group_by_expr'], $oObj->Get($sGroupByField)).';');
|
||||
}
|
||||
else
|
||||
{
|
||||
$sValue = $oObj->Get($sGroupByField);
|
||||
}
|
||||
$aGroupBy[$sValue] = isset($aGroupBy[$sValue]) ? $aGroupBy[$sValue]+1 : 1;
|
||||
}
|
||||
$sFilter = urlencode($this->m_oFilter->serialize());
|
||||
@@ -828,7 +855,14 @@ EOF
|
||||
$aGroupBy = array();
|
||||
while($oObj = $this->m_oSet->Fetch())
|
||||
{
|
||||
$sValue = $oObj->Get($sGroupByField);
|
||||
if (isset($aExtraParams['group_by_expr']))
|
||||
{
|
||||
eval("\$sValue = ".sprintf($aExtraParams['group_by_expr'], $oObj->Get($sGroupByField)).';');
|
||||
}
|
||||
else
|
||||
{
|
||||
$sValue = $oObj->Get($sGroupByField);
|
||||
}
|
||||
$aGroupBy[$sValue] = isset($aGroupBy[$sValue]) ? $aGroupBy[$sValue]+1 : 1;
|
||||
}
|
||||
$sFilter = urlencode($this->m_oFilter->serialize());
|
||||
@@ -1047,6 +1081,15 @@ class MenuBlock extends DisplayBlock
|
||||
if ($bIsModifyAllowed) { $aActions[] = array ('label' => Dict::S('UI:Menu:Add'), 'url' => "../pages/$sUIPage?operation=modify_links&class=$sClass&link_attr=".$aExtraParams['link_attr']."&target_class=$sTargetClass&id=$id&addObjects=true&$sContext"); }
|
||||
if ($bIsModifyAllowed) { $aActions[] = array ('label' => Dict::S('UI:Menu:Manage'), 'url' => "../pages/$sUIPage?operation=modify_links&class=$sClass&link_attr=".$aExtraParams['link_attr']."&target_class=$sTargetClass&id=$id&sContext"); }
|
||||
}
|
||||
$this->AddMenuSeparator($aActions);
|
||||
foreach (MetaModel::EnumPlugins('iApplicationUIExtension') as $oExtensionInstance)
|
||||
{
|
||||
$oSet->Rewind();
|
||||
foreach($oExtensionInstance->EnumAllowedActions($oSet) as $sLabel => $sUrl)
|
||||
{
|
||||
$aActions[] = array ('label' => $sLabel, 'url' => $sUrl);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1071,12 +1114,61 @@ class MenuBlock extends DisplayBlock
|
||||
// many objects in the set, possible actions are: new / modify all / delete all
|
||||
$sUrl = utils::GetAbsoluteUrl();
|
||||
if ($bIsModifyAllowed) { $aActions[] = array ('label' => Dict::S('UI:Menu:New'), 'url' => "../pages/$sUIPage?operation=new&class=$sClass&$sContext{$sDefault}"); }
|
||||
//if ($bIsBulkModifyAllowed) { $aActions[] = array ('label' => 'Modify All...', 'url' => "../pages/$sUIPage?operation=modify_all&filter=$sFilter&$sContext"); }
|
||||
if ($bIsBulkModifyAllowed) { $aActions[] = array ('label' => Dict::S('UI:Menu:ModifyAll'), 'url' => "../pages/$sUIPage?operation=select_for_modify_all&class=$sClass&filter=$sFilter&sContext"); }
|
||||
if ($bIsBulkDeleteAllowed) { $aActions[] = array ('label' => Dict::S('UI:Menu:BulkDelete'), 'url' => "../pages/$sUIPage?operation=select_for_deletion&filter=$sFilter&$sContext"); }
|
||||
|
||||
// Stimuli
|
||||
$aStates = MetaModel::EnumStates($sClass);
|
||||
if (count($aStates) > 0)
|
||||
{
|
||||
// Life cycle actions may be available... if all objects are in the same state
|
||||
$oSet->Rewind();
|
||||
$aStates = array();
|
||||
while($oObj = $oSet->Fetch())
|
||||
{
|
||||
$aStates[$oObj->GetState()] = $oObj->GetState();
|
||||
}
|
||||
$oSet->Rewind();
|
||||
if (count($aStates) == 1)
|
||||
{
|
||||
// All objects are in the same state...
|
||||
$sState = array_pop($aStates);
|
||||
$aTransitions = Metamodel::EnumTransitions($sClass, $sState);
|
||||
if (count($aTransitions))
|
||||
{
|
||||
$this->AddMenuSeparator($aActions);
|
||||
$aStimuli = Metamodel::EnumStimuli($sClass);
|
||||
foreach($aTransitions as $sStimulusCode => $aTransitionDef)
|
||||
{
|
||||
$oChecker = new StimulusChecker($this->m_oFilter, $sState, $sStimulusCode);
|
||||
$iActionAllowed = (get_class($aStimuli[$sStimulusCode]) == 'StimulusUserAction') ? $oChecker->IsAllowed() : UR_ALLOWED_NO;
|
||||
switch($iActionAllowed)
|
||||
{
|
||||
case UR_ALLOWED_YES:
|
||||
case UR_ALLOWED_DEPENDS:
|
||||
$aActions[] = array('label' => $aStimuli[$sStimulusCode]->GetLabel(), 'url' => "../pages/UI.php?operation=select_bulk_stimulus&stimulus=$sStimulusCode&state=$sState&class=$sClass&filter=$sFilter&$sContext");
|
||||
break;
|
||||
|
||||
default:
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->AddMenuSeparator($aActions);
|
||||
$aActions[] = array ('label' => Dict::S('UI:Menu:EMail'), 'url' => "mailto:?subject=".$oSet->GetFilter()->__DescribeHTML()."&body=".urlencode("$sUrl?operation=search&filter=$sFilter&$sContext"));
|
||||
$aActions[] = array ('label' => Dict::S('UI:Menu:CSVExport'), 'url' => "../pages/$sUIPage?operation=search&filter=$sFilter&format=csv&$sContext");
|
||||
}
|
||||
$this->AddMenuSeparator($aActions);
|
||||
foreach (MetaModel::EnumPlugins('iApplicationUIExtension') as $oExtensionInstance)
|
||||
{
|
||||
$oSet->Rewind();
|
||||
foreach($oExtensionInstance->EnumAllowedActions($oSet) as $sLabel => $sUrl)
|
||||
{
|
||||
$aActions[] = array ('label' => $sLabel, 'url' => $sUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
$sHtml .= "<div class=\"itop_popup\"><ul>\n<li>".Dict::S('UI:Menu:Actions')."\n<ul>\n";
|
||||
foreach ($aActions as $aAction)
|
||||
|
||||
@@ -36,6 +36,8 @@ class iTopWebPage extends NiceWebPage
|
||||
private $m_aTabs;
|
||||
private $m_sCurrentTabContainer;
|
||||
private $m_sCurrentTab;
|
||||
private $m_sMessage;
|
||||
private $m_sInitScript;
|
||||
|
||||
public function __construct($sTitle)
|
||||
{
|
||||
@@ -44,6 +46,7 @@ class iTopWebPage extends NiceWebPage
|
||||
$this->m_sCurrentTab = '';
|
||||
$this->m_aTabs = array();
|
||||
$this->m_sMenu = "";
|
||||
$this->m_sMessage = '';
|
||||
$oAppContext = new ApplicationContext();
|
||||
$sExtraParams = $oAppContext->GetForLink();
|
||||
// $this->m_currentOrganization = $currentOrganization;
|
||||
@@ -58,7 +61,6 @@ class iTopWebPage extends NiceWebPage
|
||||
$this->add_linked_script("../js/jquery.tablehover.js");
|
||||
$this->add_linked_script("../js/jquery.treeview.js");
|
||||
$this->add_linked_script("../js/jquery.autocomplete.js");
|
||||
$this->add_linked_script("../js/jquery.bgiframe.js");
|
||||
$this->add_linked_script("../js/jquery.positionBy.js");
|
||||
$this->add_linked_script("../js/jquery.popupmenu.js");
|
||||
$this->add_linked_script("../js/date.js");
|
||||
@@ -69,13 +71,13 @@ class iTopWebPage extends NiceWebPage
|
||||
$this->add_linked_script("../js/swfobject.js");
|
||||
$this->add_linked_script("../js/ckeditor/ckeditor.js");
|
||||
$this->add_linked_script("../js/ckeditor/adapters/jquery.js");
|
||||
$this->add_ready_script(
|
||||
<<<EOF
|
||||
$this->add_linked_script("../js/jquery.qtip-1.0.min.js");
|
||||
$this->m_sInitScript =
|
||||
<<< EOF
|
||||
try
|
||||
{
|
||||
var myLayout; // a var is required because this page utilizes: myLayout.allowOverflow() method
|
||||
|
||||
$(document).ready(function () {
|
||||
var myLayout; // a var is required because this page utilizes: myLayout.allowOverflow() method
|
||||
|
||||
// Layout
|
||||
paneSize = GetUserPreference('menu_size', 300)
|
||||
myLayout = $('body').layout({
|
||||
@@ -127,10 +129,32 @@ class iTopWebPage extends NiceWebPage
|
||||
{
|
||||
myLayout.close('west');
|
||||
}
|
||||
|
||||
|
||||
// Accordion Menu
|
||||
$("#accordion").accordion({ header: "h3", navigation: true, autoHeight: false, collapsible: false, icons: false }); // collapsible will be enabled once the item will be selected
|
||||
});
|
||||
|
||||
// Tabs, using JQuery BBQ to store the history
|
||||
// The "tab widgets" to handle.
|
||||
var tabs = $('div[id^=tabbedContent]');
|
||||
|
||||
// This selector will be reused when selecting actual tab widget A elements.
|
||||
var tab_a_selector = 'ul.ui-tabs-nav a';
|
||||
|
||||
// Enable tabs on all tab widgets. The `event` property must be overridden so
|
||||
// that the tabs aren't changed on click, and any custom event name can be
|
||||
// specified. Note that if you define a callback for the 'select' event, it
|
||||
// will be executed for the selected tab whenever the hash changes.
|
||||
tabs.tabs({ event: 'change' });
|
||||
}
|
||||
catch(err)
|
||||
{
|
||||
// Do something with the error !
|
||||
alert(err);
|
||||
}
|
||||
EOF
|
||||
;
|
||||
$this->add_ready_script(
|
||||
<<< EOF
|
||||
//add new widget called TruncatedList to properly display truncated lists when they are sorted
|
||||
$.tablesorter.addWidget({
|
||||
// give the widget a id
|
||||
@@ -212,12 +236,6 @@ class iTopWebPage extends NiceWebPage
|
||||
// This selector will be reused when selecting actual tab widget A elements.
|
||||
var tab_a_selector = 'ul.ui-tabs-nav a';
|
||||
|
||||
// Enable tabs on all tab widgets. The `event` property must be overridden so
|
||||
// that the tabs aren't changed on click, and any custom event name can be
|
||||
// specified. Note that if you define a callback for the 'select' event, it
|
||||
// will be executed for the selected tab whenever the hash changes.
|
||||
tabs.tabs({ event: 'change' });
|
||||
|
||||
// Define our own click handler for the tabs, overriding the default.
|
||||
tabs.find( tab_a_selector ).click(function()
|
||||
{
|
||||
@@ -331,20 +349,8 @@ class iTopWebPage extends NiceWebPage
|
||||
$('#ModalDlg').dialog({ autoOpen: false, modal: true, width: 0.8*docWidth }); // JQuery UI dialogs
|
||||
ShowDebug();
|
||||
$('#logOffBtn>ul').popupmenu();
|
||||
// $.history.init(history_callback);
|
||||
// $("a[rel='history']").click(function()
|
||||
// {
|
||||
// $.history.load(this.href.replace(/^.*#/, ''));
|
||||
// return false;
|
||||
// });
|
||||
}
|
||||
catch(err)
|
||||
{
|
||||
// Do something with the error !
|
||||
alert(err);
|
||||
}
|
||||
|
||||
//$('.display_block').draggable(); // make the blocks draggable
|
||||
$('.caselog_header').click( function () { $(this).toggleClass('open').next('.caselog_entry').toggle(); });
|
||||
EOF
|
||||
);
|
||||
$sUserPrefs = appUserPreferences::GetAsJSON();
|
||||
@@ -398,6 +404,21 @@ EOF
|
||||
}
|
||||
|
||||
var oUserPreferences = $sUserPrefs;
|
||||
|
||||
// For disabling the CKEditor at init time when the corresponding textarea is disabled !
|
||||
CKEDITOR.plugins.add( 'disabler',
|
||||
{
|
||||
init : function( editor )
|
||||
{
|
||||
editor.on( 'instanceReady', function(e)
|
||||
{
|
||||
e.removeListener();
|
||||
$('#'+ editor.name).trigger('update');
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
EOF
|
||||
);
|
||||
|
||||
@@ -529,11 +550,22 @@ EOF
|
||||
}
|
||||
foreach($this->a_linked_scripts as $s_script)
|
||||
{
|
||||
// Make sure that the URL to the script contains the application's version number
|
||||
// so that the new script do NOT get reloaded from the cache when the application is upgraded
|
||||
if (strpos('?', $s_script) === false)
|
||||
{
|
||||
$s_script .= "?version=".ITOP_VERSION;
|
||||
}
|
||||
else
|
||||
{
|
||||
$s_script .= "&version=".ITOP_VERSION;
|
||||
}
|
||||
echo "<script type=\"text/javascript\" src=\"$s_script\"></script>\n";
|
||||
}
|
||||
$this->add_script("\$(document).ready(function() {\n{$this->m_sInitScript};\nwindow.setTimeout('onDelayedReady()',10)\n});");
|
||||
if (count($this->m_aReadyScripts)>0)
|
||||
{
|
||||
$this->add_script("\$(document).ready(function() {\n".implode("\n", $this->m_aReadyScripts)."\n});");
|
||||
$this->add_script("\nonDelayedReady = function() {\n".implode("\n", $this->m_aReadyScripts)."\n}\n");
|
||||
}
|
||||
if (count($this->a_scripts)>0)
|
||||
{
|
||||
@@ -669,6 +701,10 @@ EOF
|
||||
}
|
||||
$sApplicationBanner .= '</div>';
|
||||
}
|
||||
else if(strlen($this->m_sMessage))
|
||||
{
|
||||
$sApplicationBanner = '<div id="admin-banner"><span style="padding:5px;">'.$this->m_sMessage.'<span></div>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$sApplicationBanner = '';
|
||||
@@ -768,7 +804,8 @@ EOF
|
||||
{
|
||||
echo "<div id=\"rawOutput\" title=\"Debug Output\"><div style=\"height:500px; overflow-y:auto;\">$s_captured_output</div></div>\n";
|
||||
}
|
||||
echo $this->s_deferred_content;
|
||||
echo "<div id=\"at_the_end\">".$this->s_deferred_content."</div>";
|
||||
// echo $this->s_deferred_content;
|
||||
echo "<div style=\"display:none\" title=\"ex2\" id=\"ex2\">Please wait...</div>\n"; // jqModal Window
|
||||
echo "<div style=\"display:none\" title=\"dialog\" id=\"ModalDlg\"></div>";
|
||||
echo "<div style=\"display:none\" id=\"ajax_content\"></div>";
|
||||
@@ -882,6 +919,14 @@ EOF
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the message to be displayed in the 'admin-banner' section at the top of the page
|
||||
*/
|
||||
public function SetMessage($sMessage)
|
||||
{
|
||||
$this->m_sMessage = $sMessage;
|
||||
}
|
||||
|
||||
/*
|
||||
public function AddSearchForm($sClassName, $bOpen = false)
|
||||
{
|
||||
|
||||
@@ -326,6 +326,16 @@ EOF
|
||||
{
|
||||
// User is Ok, let's save it in the session and proceed with normal login
|
||||
UserRights::Login($sAuthUser, $sAuthentication); // Login & set the user's language
|
||||
|
||||
if (MetaModel::GetConfig()->Get('log_usage'))
|
||||
{
|
||||
$oLog = new EventLoginUsage();
|
||||
$oLog->Set('userinfo', UserRights::GetUser());
|
||||
$oLog->Set('user_id', UserRights::GetUserObject()->GetKey());
|
||||
$oLog->Set('message', 'Successful login');
|
||||
$oLog->DBInsertNoReload();
|
||||
}
|
||||
|
||||
$_SESSION['auth_user'] = $sAuthUser;
|
||||
$_SESSION['login_mode'] = $sLoginMode;
|
||||
}
|
||||
@@ -342,6 +352,7 @@ EOF
|
||||
*/
|
||||
static function DoLogin($bMustBeAdmin = false, $bIsAllowedToPortalUsers = false)
|
||||
{
|
||||
$sMessage = ''; // In case we need to return a message to the calling web page
|
||||
$operation = utils::ReadParam('loginop', '');
|
||||
session_name(MetaModel::GetConfig()->Get('session_name'));
|
||||
session_start();
|
||||
@@ -391,6 +402,7 @@ EOF
|
||||
$oPage->DisplayChangePwdForm(true); // old pwd was wrong
|
||||
$oPage->output();
|
||||
}
|
||||
$sMessage = Dict::S('UI:Login:PasswordChanged');
|
||||
}
|
||||
|
||||
self::Login();
|
||||
@@ -409,6 +421,7 @@ EOF
|
||||
// No rights to be here, redirect to the portal
|
||||
header('Location: ../portal/index.php');
|
||||
}
|
||||
return $sMessage;
|
||||
}
|
||||
|
||||
} // End of class
|
||||
|
||||
@@ -58,7 +58,6 @@ class PortalWebPage extends NiceWebPage
|
||||
$this->add_linked_script("../js/jquery.tablehover.js");
|
||||
$this->add_linked_script("../js/jquery.treeview.js");
|
||||
$this->add_linked_script("../js/jquery.autocomplete.js");
|
||||
$this->add_linked_script("../js/jquery.bgiframe.js");
|
||||
$this->add_linked_script("../js/jquery.positionBy.js");
|
||||
$this->add_linked_script("../js/jquery.popupmenu.js");
|
||||
$this->add_linked_script("../js/date.js");
|
||||
@@ -119,6 +118,7 @@ try
|
||||
changeYear: true
|
||||
});
|
||||
$('.resizable').resizable(); // Make resizable everything that claims to be resizable !
|
||||
$('.caselog_header').click( function () { $(this).toggleClass('open').next('.caselog_entry').toggle(); });
|
||||
}
|
||||
catch(err)
|
||||
{
|
||||
@@ -165,7 +165,7 @@ EOF
|
||||
public function output()
|
||||
{
|
||||
$sMenu = '';
|
||||
$this->AddMenuButton('logoff', 'Portal:Disconnect', '../pages/logoff.php?portal=1'); // This menu is always present and is the last one
|
||||
$this->AddMenuButton('logoff', 'Portal:Disconnect', '../pages/logoff.php'); // This menu is always present and is the last one
|
||||
foreach($this->m_aMenuButtons as $aMenuItem)
|
||||
{
|
||||
$sMenu .= "<a class=\"button\" id=\"{$aMenuItem['id']}\" href=\"{$aMenuItem['hyperlink']}\"><span>".Dict::S($aMenuItem['label'])."</span></a>";
|
||||
|
||||
@@ -161,7 +161,7 @@ class DisplayTemplate
|
||||
$oPage->AddTabContainer('Tabs_'.$iTabContainerCount);
|
||||
$oPage->SetCurrentTabContainer('Tabs_'.$iTabContainerCount);
|
||||
$iTabContainerCount++;
|
||||
//$oPage->p('Content:<pre>'.htmlentities($sContent).'</pre>');
|
||||
//$oPage->p('Content:<pre>'.htmlentities($sContent, ENT_QUOTES, 'UTF-8').'</pre>');
|
||||
$oTemplate = new DisplayTemplate($sContent);
|
||||
$oTemplate->Render($oPage, array()); // no params to apply, they have already been applied
|
||||
$oPage->SetCurrentTabContainer('');
|
||||
@@ -185,7 +185,7 @@ class DisplayTemplate
|
||||
$oPage->SetCurrentTab(Dict::S(str_replace('_', ' ', $aAttributes['name'])));
|
||||
$oTemplate = new DisplayTemplate($sContent);
|
||||
$oTemplate->Render($oPage, array()); // no params to apply, they have already been applied
|
||||
//$oPage->p('iTop Tab Content:<pre>'.htmlentities($sContent).'</pre>');
|
||||
//$oPage->p('iTop Tab Content:<pre>'.htmlentities($sContent, ENT_QUOTES, 'UTF-8').'</pre>');
|
||||
$oPage->SetCurrentTab('');
|
||||
break;
|
||||
|
||||
@@ -195,7 +195,7 @@ class DisplayTemplate
|
||||
$oPage->StartCollapsibleSection(Dict::S($sName), $bOpen);
|
||||
$oTemplate = new DisplayTemplate($sContent);
|
||||
$oTemplate->Render($oPage, array()); // no params to apply, they have already been applied
|
||||
//$oPage->p('iTop Tab Content:<pre>'.htmlentities($sContent).'</pre>');
|
||||
//$oPage->p('iTop Tab Content:<pre>'.htmlentities($sContent, ENT_QUOTES, 'UTF-8').'</pre>');
|
||||
$oPage->EndCollapsibleSection();
|
||||
break;
|
||||
|
||||
@@ -241,7 +241,7 @@ class DisplayTemplate
|
||||
</itoptabs>';
|
||||
|
||||
$oPage = new iTopWebPage('Unit Test');
|
||||
//$oPage->add("Template content: <pre>".htmlentities($sTemplate)."</pre>\n");
|
||||
//$oPage->add("Template content: <pre>".htmlentities($sTemplate, ENT_QUOTES, 'UTF-8')."</pre>\n");
|
||||
$oTemplate = new DisplayTemplate($sTemplate);
|
||||
$oTemplate->Render($oPage, array('class'=>'Network device','pkey'=> 271, 'name' => 'deliversw01.mecanorama.fr', 'org_id' => 3));
|
||||
$oPage->output();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<div style="width:100%;background: url(../images/welcome.jpg) top left no-repeat;">
|
||||
<div style="width:100%;background: #fff url(../images/welcome.jpg) top left no-repeat;">
|
||||
<style>
|
||||
.dashboard {
|
||||
vertical-align:top;
|
||||
|
||||
@@ -92,12 +92,24 @@ class UIExtKeyWidget
|
||||
* @param Hash $aArgs Extra context arguments
|
||||
* @return string The HTML fragment to be inserted into the page
|
||||
*/
|
||||
public function Display(WebPage $oPage, $aArgs = array())
|
||||
public function Display(WebPage $oPage, $aArgs = array(), $bSearchMode = false)
|
||||
{
|
||||
$bCreate = (!MetaModel::IsAbstract($this->sTargetClass)) && (UserRights::IsActionAllowed($this->sTargetClass, UR_ACTION_BULK_MODIFY) && $this->oAttDef->AllowTargetCreation());
|
||||
$oPage->add_linked_script('../js/extkeywidget.js');
|
||||
$oPage->add_linked_script('../js/forms-json-utils.js');
|
||||
|
||||
$bCreate = (!$bSearchMode) && (!MetaModel::IsAbstract($this->sTargetClass)) && (UserRights::IsActionAllowed($this->sTargetClass, UR_ACTION_BULK_MODIFY) && $this->oAttDef->AllowTargetCreation());
|
||||
$sMessage = Dict::S('UI:Message:EmptyList:UseSearchForm');
|
||||
$sAttrFieldPrefix = ($bSearchMode) ? '' : 'attr_';
|
||||
|
||||
$sHTMLValue = "<span style=\"white-space:nowrap\">"; // no wrap
|
||||
if($bSearchMode)
|
||||
{
|
||||
$sWizHelper = 'null';
|
||||
}
|
||||
else
|
||||
{
|
||||
$sWizHelper = 'oWizardHelper'.$this->sFormPrefix;
|
||||
}
|
||||
if (count($this->aAllowedValues) < $this->oAttDef->GetMaximumComboLength())
|
||||
{
|
||||
// Few choices, use a normal 'select'
|
||||
@@ -106,8 +118,15 @@ class UIExtKeyWidget
|
||||
$sHelpText = $this->oAttDef->GetHelpOnEdition();
|
||||
|
||||
// In case there are no valid values, the select will be empty, thus blocking the user from validating the form
|
||||
$sHTMLValue = "<select title=\"$sHelpText\" name=\"attr_{$this->sFieldPrefix}{$this->sAttCode}{$this->sNameSuffix}\" id=\"$this->iId\">\n";
|
||||
$sHTMLValue .= "<option value=\"\">".Dict::S('UI:SelectOne')."</option>\n";
|
||||
$sHTMLValue = "<select title=\"$sHelpText\" name=\"{$sAttrFieldPrefix}{$this->sFieldPrefix}{$this->sAttCode}{$this->sNameSuffix}\" id=\"$this->iId\">\n";
|
||||
if ($bSearchMode)
|
||||
{
|
||||
$sHTMLValue .= "<option value=\"\">".Dict::S('UI:SearchValue:Any')."</option>\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
$sHTMLValue .= "<option value=\"\">".Dict::S('UI:SelectOne')."</option>\n";
|
||||
}
|
||||
foreach($this->aAllowedValues as $key => $display_value)
|
||||
{
|
||||
if ((count($this->aAllowedValues) == 1) && ($this->bMandatory == 'true') )
|
||||
@@ -122,10 +141,11 @@ class UIExtKeyWidget
|
||||
$sHTMLValue .= "<option value=\"$key\"$sSelected>$display_value</option>\n";
|
||||
}
|
||||
$sHTMLValue .= "</select>\n";
|
||||
$oPage->add_ready_script(
|
||||
$oPage->add_ready_script(
|
||||
<<<EOF
|
||||
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sClass}', '{$this->sAttCode}', '{$this->sNameSuffix}', $sSelectMode, oWizardHelper{$this->sFormPrefix});
|
||||
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sClass}', '{$this->sAttCode}', '{$this->sNameSuffix}', $sSelectMode, $sWizHelper);
|
||||
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(); } );
|
||||
|
||||
EOF
|
||||
);
|
||||
@@ -149,29 +169,30 @@ EOF
|
||||
|
||||
// the input for the auto-complete
|
||||
$sHTMLValue = "<input count=\"".count($this->aAllowedValues)."\" type=\"text\" id=\"label_$this->iId\" size=\"30\" maxlength=\"$iFieldSize\" value=\"$sDisplayValue\"/> ";
|
||||
$sHTMLValue .= "<a class=\"no-arrow\" href=\"javascript:oACWidget_{$this->iId}.Search();\"><img style=\"border:0;vertical-align:middle;\" src=\"../images/mini_search.gif\" /></a> ";
|
||||
$sHTMLValue .= "<a class=\"no-arrow\" href=\"javascript:oACWidget_{$this->iId}.Search();\"><img id=\"mini_search_{$this->iId}\" style=\"border:0;vertical-align:middle;\" src=\"../images/mini_search.gif\" /></a> ";
|
||||
|
||||
// another hidden input to store & pass the object's Id
|
||||
$sHTMLValue .= "<input type=\"hidden\" id=\"$this->iId\" name=\"attr_{$this->sFieldPrefix}{$this->sAttCode}{$this->sNameSuffix}\" value=\"$this->value\" />\n";
|
||||
$sHTMLValue .= "<input type=\"hidden\" id=\"$this->iId\" name=\"{$sAttrFieldPrefix}{$this->sFieldPrefix}{$this->sAttCode}{$this->sNameSuffix}\" value=\"$this->value\" />\n";
|
||||
|
||||
// Scripts to start the autocomplete and bind some events to it
|
||||
$oPage->add_ready_script(
|
||||
$oPage->add_ready_script(
|
||||
<<<EOF
|
||||
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sClass}', '{$this->sAttCode}', '{$this->sNameSuffix}', $sSelectMode, oWizardHelper{$this->sFormPrefix});
|
||||
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sClass}', '{$this->sAttCode}', '{$this->sNameSuffix}', $sSelectMode, $sWizHelper);
|
||||
oACWidget_{$this->iId}.emptyHtml = "<div style=\"background: #fff; border:0; text-align:center; vertical-align:middle;\"><p>$sMessage</p></div>";
|
||||
$('#label_$this->iId').autocomplete('./ajax.render.php', { scroll:true, minChars:{$iMinChars}, formatItem:formatItem, autoFill:false, matchContains:true, keyHolder:'#{$this->iId}', extraParams:{operation:'autocomplete', sclass:'{$this->sClass}',attCode:'{$this->sAttCode}'}});
|
||||
$('#label_$this->iId').blur(function() { $(this).search(); } );
|
||||
$('#label_$this->iId').keyup(function() { if ($(this).val() == '') { $('#$this->iId').val(''); } } ); // Useful for search forms: empty value in the "label", means no value, immediatly !
|
||||
$('#label_$this->iId').result( function(event, data, formatted) { OnAutoComplete('{$this->iId}', event, data, formatted); } );
|
||||
$('#ac_dlg_$this->iId').dialog({ width: $(window).width()*0.8, height: $(window).height()*0.8, autoOpen: false, modal: true, title: '{$this->sTitle}', resizeStop: oACWidget_{$this->iId}.UpdateSizes, close: oACWidget_{$this->iId}.OnClose });
|
||||
|
||||
$('#$this->iId').bind('update', function() { oACWidget_{$this->iId}.Update(); } );
|
||||
EOF
|
||||
);
|
||||
$oPage->add_at_the_end($this->GetSearchDialog($oPage)); // To prevent adding forms inside the main form
|
||||
//$oPage->add_at_the_end($this->GetSearchDialog($oPage)); // To prevent adding forms inside the main form
|
||||
$oPage->add_at_the_end('<div id="ac_dlg_'.$this->iId.'"></div>'); // The place where to download the search dialog is outside of the main form (to prevent nested forms)
|
||||
|
||||
}
|
||||
if ($bCreate)
|
||||
{
|
||||
$sHTMLValue .= "<a class=\"no-arrow\" href=\"javascript:oACWidget_{$this->iId}.CreateObject();\"><img style=\"border:0;vertical-align:middle;\" src=\"../images/mini_add.gif\" /></a> ";
|
||||
$sHTMLValue .= "<a class=\"no-arrow\" href=\"javascript:oACWidget_{$this->iId}.CreateObject();\"><img id=\"mini_add_{$this->iId}\" style=\"border:0;vertical-align:middle;\" src=\"../images/mini_add.gif\" /></a> ";
|
||||
$oPage->add_at_the_end('<div id="ajax_'.$this->iId.'"></div>');
|
||||
}
|
||||
$sHTMLValue .= "<span id=\"v_{$this->iId}\"></span>";
|
||||
@@ -179,9 +200,9 @@ EOF
|
||||
return $sHTMLValue;
|
||||
}
|
||||
|
||||
protected function GetSearchDialog(WebPage $oPage)
|
||||
public function GetSearchDialog(WebPage $oPage)
|
||||
{
|
||||
$sHTML = '<div id="ac_dlg_'.$this->iId.'"><div class="wizContainer" style="vertical-align:top;"><div id="dc_'.$this->iId.'">';
|
||||
$sHTML = '<div class="wizContainer" style="vertical-align:top;"><div id="dc_'.$this->iId.'">';
|
||||
|
||||
$oFilter = new DBObjectSearch($this->sTargetClass);
|
||||
$oSet = new CMDBObjectSet($oFilter);
|
||||
@@ -194,12 +215,17 @@ EOF
|
||||
$sHTML .= "<input type=\"button\" id=\"btn_cancel_{$this->iId}\" value=\"".Dict::S('UI:Button:Cancel')."\" onClick=\"$('#ac_dlg_{$this->iId}').dialog('close');\"> ";
|
||||
$sHTML .= "<input type=\"button\" id=\"btn_ok_{$this->iId}\" value=\"".Dict::S('UI:Button:Ok')."\" onClick=\"oACWidget_{$this->iId}.DoOk();\">";
|
||||
$sHTML .= "</form>\n";
|
||||
$sHTML .= '</div></div></div>';
|
||||
$sHTML .= '</div></div>';
|
||||
|
||||
$oPage->add_ready_script("$('#fs_{$this->iId}').bind('submit.uiAutocomplete', oACWidget_{$this->iId}.DoSearchObjects);");
|
||||
$oPage->add_ready_script("$('#dc_{$this->iId}').resize(oACWidget_{$this->iId}.UpdateSizes);");
|
||||
|
||||
return $sHTML;
|
||||
$sDialogTitle = addslashes($this->sTitle);
|
||||
$oPage->add_ready_script(
|
||||
<<<EOF
|
||||
$('#ac_dlg_{$this->iId}').dialog({ width: $(window).width()*0.8, height: $(window).height()*0.8, autoOpen: false, modal: true, title: '$sDialogTitle', resizeStop: oACWidget_{$this->iId}.UpdateSizes, close: oACWidget_{$this->iId}.OnClose });
|
||||
$('#fs_{$this->iId}').bind('submit.uiAutocomplete', oACWidget_{$this->iId}.DoSearchObjects);
|
||||
$('#dc_{$this->iId}').resize(oACWidget_{$this->iId}.UpdateSizes);
|
||||
EOF
|
||||
);
|
||||
$oPage->add($sHTML);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -240,11 +266,13 @@ EOF
|
||||
*/
|
||||
public function GetObjectCreationForm(WebPage $oPage)
|
||||
{
|
||||
$sDialogTitle = addslashes($this->sTitle);
|
||||
$oPage->add('<div id="ac_create_'.$this->iId.'"><div class="wizContainer" style="vertical-align:top;"><div id="dcr_'.$this->iId.'">');
|
||||
$oPage->add("<h1>".MetaModel::GetClassIcon($this->sTargetClass)." ".Dict::Format('UI:CreationTitle_Class', MetaModel::GetName($this->sTargetClass))."</h1>\n");
|
||||
cmdbAbstractObject::DisplayCreationForm($oPage, $this->sTargetClass, null, array(), array('formPrefix' => $this->iId, 'noRelations' => true));
|
||||
$oPage->add('</div></div></div>');
|
||||
$oPage->add_ready_script("\$('#ac_create_$this->iId').dialog({ width: $(window).width()*0.8, height: 'auto', autoOpen: false, modal: true, title: '$this->sTitle'});\n");
|
||||
// $oPage->add_ready_script("\$('#ac_create_$this->iId').dialog({ width: $(window).width()*0.8, height: 'auto', autoOpen: false, modal: true, title: '$sDialogTitle'});\n");
|
||||
$oPage->add_ready_script("\$('#ac_create_$this->iId').dialog({ width: 'auto', height: 'auto', autoOpen: false, modal: true, title: '$sDialogTitle'});\n");
|
||||
$oPage->add_ready_script("$('#dcr_{$this->iId} form').removeAttr('onsubmit');");
|
||||
$oPage->add_ready_script("$('#dcr_{$this->iId} form').bind('submit.uilinksWizard', oACWidget_{$this->iId}.DoCreateObject);");
|
||||
}
|
||||
@@ -255,17 +283,21 @@ EOF
|
||||
public function DoCreateObject($oPage)
|
||||
{
|
||||
$oObj = MetaModel::NewObject($this->sTargetClass);
|
||||
$oObj->UpdateObject($this->sFormPrefix.$this->iId);
|
||||
$oMyChange = MetaModel::NewObject("CMDBChange");
|
||||
$oMyChange->Set("date", time());
|
||||
$sUserString = CMDBChange::GetCurrentUserName();
|
||||
$oMyChange->Set("userinfo", $sUserString);
|
||||
$iChangeId = $oMyChange->DBInsert();
|
||||
$oObj->DBInsertTracked($oMyChange);
|
||||
|
||||
return array('name' => $oObj->GetName(), 'id' => $oObj->GetKey());
|
||||
|
||||
//return array('name' => 'test', 'id' => '42');
|
||||
$aErrors = $oObj->UpdateObject($this->sFormPrefix.$this->iId);
|
||||
if (count($aErrors) == 0)
|
||||
{
|
||||
$oMyChange = MetaModel::NewObject("CMDBChange");
|
||||
$oMyChange->Set("date", time());
|
||||
$sUserString = CMDBChange::GetCurrentUserName();
|
||||
$oMyChange->Set("userinfo", $sUserString);
|
||||
$iChangeId = $oMyChange->DBInsert();
|
||||
$oObj->DBInsertTracked($oMyChange);
|
||||
return array('name' => $oObj->GetName(), 'id' => $oObj->GetKey());
|
||||
}
|
||||
else
|
||||
{
|
||||
return array('name' => implode(' ', $aErrors), 'id' => 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -61,14 +61,14 @@ class UIHTMLEditorWidget
|
||||
$sHelpText = $this->m_sHelpText;
|
||||
$sValidationField = $this->m_sValidationField;
|
||||
|
||||
$sHtmlValue = "<table><tr><td><textarea class=\"htmlEditor\" title=\"$sHelpText\" name=\"attr_{$this->m_sFieldPrefix}{$sCode}\" rows=\"14\" cols=\"110\" id=\"$iId\">$sValue</textarea></td><td>$sValidationField</td></tr></table>";
|
||||
$sHtmlValue = "<table><tr><td><textarea class=\"htmlEditor\" title=\"$sHelpText\" name=\"attr_{$this->m_sFieldPrefix}{$sCode}\" rows=\"10\" cols=\"10\" id=\"$iId\">$sValue</textarea></td><td>$sValidationField</td></tr></table>";
|
||||
|
||||
// Replace the text area with CKEditor
|
||||
// To change the default settings of the editor,
|
||||
// a) edit the file /js/ckeditor/config.js
|
||||
// b) or override some of the configuration settings, using the second parameter of ckeditor()
|
||||
$sLanguage = strtolower(trim(UserRights::GetUserLanguage()));
|
||||
$oPage->add_ready_script("$('#$iId').ckeditor(function() { /* callback code */ }, { language : '$sLanguage' , contentsLanguage : '$sLanguage' });"); // Transform $iId into a CKEdit
|
||||
$oPage->add_ready_script("$('#$iId').ckeditor(function() { /* callback code */ }, { language : '$sLanguage' , contentsLanguage : '$sLanguage', extraPlugins: 'disabler' });"); // Transform $iId into a CKEdit
|
||||
|
||||
// Please read...
|
||||
// ValidateCKEditField triggers a timer... calling itself indefinitely
|
||||
@@ -78,7 +78,8 @@ class UIHTMLEditorWidget
|
||||
// The most relevant solution would be to implement a plugin to CKEdit, and handle the internal events like: setData, insertHtml, insertElement, loadSnapshot, key, afterUndo, afterRedo
|
||||
|
||||
// Could also be bound to 'instanceReady.ckeditor'
|
||||
$oPage->add_ready_script("$('#$iId').bind('validate', function(evt, sFormId) { return ValidateCKEditField('$iId', '', {$this->m_sMandatory}, sFormId, '') } );");
|
||||
$oPage->add_ready_script("$('#$iId').bind('validate', function(evt, sFormId) { return ValidateCKEditField('$iId', '', {$this->m_sMandatory}, sFormId, '') } );\n");
|
||||
$oPage->add_ready_script("$('#$iId').bind('update', function() { BlockField('cke_$iId', $('#$iId').attr('disabled')); } );\n");
|
||||
|
||||
return $sHtmlValue;
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ class UILinksWidget
|
||||
{
|
||||
// State attribute is always hidden from the UI
|
||||
}
|
||||
else if (!$oAttDef->IsExternalField() && ($sAttCode != $sExtKeyToMe) && ($sAttCode != $this->m_sExtKeyToRemote) && ($sAttCode != 'finalclass'))
|
||||
else if ($oAttDef->IsWritable() && ($sAttCode != $sExtKeyToMe) && ($sAttCode != $this->m_sExtKeyToRemote) && ($sAttCode != 'finalclass'))
|
||||
{
|
||||
$iFlags = MetaModel::GetAttributeFlags($this->m_sLinkedClass, $sDefaultState, $sAttCode);
|
||||
if ( !($iFlags & OPT_ATT_HIDDEN) && !($iFlags & OPT_ATT_READONLY) )
|
||||
@@ -238,94 +238,7 @@ EOF
|
||||
$oPage->add_at_the_end($this->GetObjectPickerDialog($oPage)); // To prevent adding forms inside the main form
|
||||
return $sHtmlValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* This static function is called by the Ajax Page when there is a need to fill an autocomplete combo
|
||||
* @param $oPage WebPage The ajax page used for the output (sent back to the browser)
|
||||
* @param $sClass string The name of the class of the current object being edited
|
||||
* @param $sAttCode string The name of the attribute being edited
|
||||
* @param $sName string The partial name that was typed by the user
|
||||
* @param $iMaxCount integer The maximum number of items to return
|
||||
* @return void
|
||||
*/
|
||||
static public function Autocomplete(WebPage $oPage, $sClass, $sAttCode, $sName, $iMaxCount)
|
||||
{
|
||||
// #@# todo - add context information, otherwise any value will be authorized for external keys
|
||||
$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, array() /* $aArgs */, $sName);
|
||||
if ($aAllowedValues != null)
|
||||
{
|
||||
$iCount = $iMaxCount;
|
||||
foreach($aAllowedValues as $key => $value)
|
||||
{
|
||||
$oPage->add($value."|".$key."\n");
|
||||
$iCount--;
|
||||
if ($iCount == 0) break;
|
||||
}
|
||||
}
|
||||
else // No limitation to the allowed values
|
||||
{
|
||||
// Search for all the object of the linked class
|
||||
$oAttDef = $oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
|
||||
$sLinkedClass = $oAttDef->GetLinkedClass();
|
||||
$sSearchClass = self::GetTargetClass($sClass, $sAttCode);
|
||||
$oFilter = new DBObjectSearch($sSearchClass);
|
||||
$sSearchAttCode = MetaModel::GetNameAttributeCode($sSearchClass);
|
||||
$oFilter->AddCondition($sSearchAttCode, $sName, 'Begins with');
|
||||
$oSet = new CMDBObjectSet($oFilter, array($sSearchAttCode => true));
|
||||
$iCount = 0;
|
||||
while( ($iCount < $iMaxCount) && ($oObj = $oSet->fetch()) )
|
||||
{
|
||||
$oPage->add($oObj->GetName()."|".$oObj->GetKey()."\n");
|
||||
$iCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This static function is called by the Ajax Page display a set of objects being linked
|
||||
* to the object being created
|
||||
* @param $oPage WebPage The ajax page used for the put^put (sent back to the browser
|
||||
* @param $sClass string The name of the 'linking class' which is the class of the objects to display
|
||||
* @param $sSet JSON serialized set of objects
|
||||
* @param $sExtKeyToMe Name of the attribute in sClass that is pointing to a given object
|
||||
* @param $iObjectId The id of the object $sExtKeyToMe is pointing to
|
||||
* @return void
|
||||
*/
|
||||
static public function RenderSet($oPage, $sClass, $sJSONSet, $sExtKeyToMe, $sExtKeyToRemote, $iObjectId)
|
||||
{
|
||||
$aSet = json_decode($sJSONSet, true); // true means hash array instead of object
|
||||
$oSet = CMDBObjectSet::FromScratch($sClass);
|
||||
foreach($aSet as $aObject)
|
||||
{
|
||||
$oObj = MetaModel::NewObject($sClass);
|
||||
foreach($aObject as $sAttCode => $value)
|
||||
{
|
||||
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
|
||||
if ($oAttDef->IsExternalKey() && ($value != 0))
|
||||
{
|
||||
$oTargetObj = MetaModel::GetObject($oAttDef->GetTargetClass(), $value); // @@ optimization, don't do & query per object in the set !
|
||||
$oObj->Set($sAttCode, $oTargetObj);
|
||||
}
|
||||
else
|
||||
{
|
||||
$oObj->Set($sAttCode, $value);
|
||||
}
|
||||
|
||||
}
|
||||
$oSet->AddObject($oObj);
|
||||
}
|
||||
$aExtraParams = array();
|
||||
$aExtraParams['link_attr'] = $sExtKeyToMe;
|
||||
$aExtraParams['object_id'] = $iObjectId;
|
||||
$aExtraParams['target_attr'] = $sExtKeyToRemote;
|
||||
$aExtraParams['menu'] = false;
|
||||
$aExtraParams['select'] = false;
|
||||
$aExtraParams['view_link'] = false;
|
||||
|
||||
cmdbAbstractObject::DisplaySet($oPage, $oSet, $aExtraParams);
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected static function GetTargetClass($sClass, $sAttCode)
|
||||
{
|
||||
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
|
||||
|
||||
@@ -57,13 +57,28 @@ class UIPasswordWidget
|
||||
$sChangedValue = (($sPasswordValue != '*****') || ($sConfirmPasswordValue != '*****')) ? 1 : 0;
|
||||
$sHtmlValue = '';
|
||||
$sHtmlValue = '<input type="password" maxlength="255" name="attr_'.$sCode.'" id="'.$this->iId.'" value="'.htmlentities($sPasswordValue, ENT_QUOTES, 'UTF-8').'"/> <span class="form_validation" id="v_'.$this->iId.'"></span><br/>';
|
||||
$sHtmlValue .= '<input type="password" maxlength="255" id="'.$this->iId.'_confirm" value="'.htmlentities($sConfirmPasswordValue, ENT_QUOTES, 'UTF-8').'" name="attr_'.$sCode.'_confirmed"/> '.Dict::S('UI:PasswordConfirm').' <input type="button" value="'.Dict::S('UI:Button:ResetPassword').'" onClick="ResetPwd(\''.$this->iId.'\');">';
|
||||
$sHtmlValue .= '<input type="password" maxlength="255" id="'.$this->iId.'_confirm" value="'.htmlentities($sConfirmPasswordValue, ENT_QUOTES, 'UTF-8').'" name="attr_'.$sCode.'_confirmed"/> '.Dict::S('UI:PasswordConfirm').' <input id="'.$this->iId.'_reset" type="button" value="'.Dict::S('UI:Button:ResetPassword').'" onClick="ResetPwd(\''.$this->iId.'\');">';
|
||||
$sHtmlValue .= '<input type="hidden" id="'.$this->iId.'_changed" name="attr_'.$sCode.'_changed" value="'.$sChangedValue.'"/>';
|
||||
|
||||
$oPage->add_ready_script("$('#$this->iId').bind('keyup change', function(evt) { return PasswordFieldChanged('$this->iId') } );"); // Bind to a custom event: validate
|
||||
$oPage->add_ready_script("$('#$this->iId').bind('keyup change validate', function(evt, sFormId) { return ValidatePasswordField('$this->iId', sFormId) } );"); // Bind to a custom event: validate
|
||||
$oPage->add_ready_script("$('#{$this->iId}_confirm').bind('keyup change', function(evt, sFormId) { return ValidatePasswordField('$this->iId', sFormId) } );"); // Bind to a custom event: validate
|
||||
|
||||
$oPage->add_ready_script("$('#{$this->iId}').bind('update', function(evt, sFormId)
|
||||
{
|
||||
if ($(this).attr('disabled'))
|
||||
{
|
||||
$('#{$this->iId}_confirm').attr('disabled', 'disabled');
|
||||
$('#{$this->iId}_changed').attr('disabled', 'disabled');
|
||||
$('#{$this->iId}_reset').attr('disabled', 'disabled');
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#{$this->iId}_confirm').removeAttr('disabled');
|
||||
$('#{$this->iId}_changed').removeAttr('disabled');
|
||||
$('#{$this->iId}_reset').removeAttr('disabled');
|
||||
}
|
||||
}
|
||||
);"); // Bind to a custom event: update to handle enabling/disabling
|
||||
return $sHtmlValue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,7 +132,7 @@ class UILinksWizard
|
||||
function AddObjects()
|
||||
{
|
||||
// TO DO: compute the list of objects already linked with the current Object
|
||||
$.post( 'ajax.render.php', { 'operation': 'addObjects',
|
||||
$.post( '../pages/ajax.render.php', { 'operation': 'addObjects',
|
||||
'class': '{$this->m_sClass}',
|
||||
'linkageAttr': '{$this->m_sLinkageAttr}',
|
||||
'linkedClass': '{$this->m_sLinkedClass}',
|
||||
@@ -175,7 +175,7 @@ class UILinksWizard
|
||||
theMap['operation'] = 'searchObjectsToAdd';
|
||||
|
||||
// Run the query and display the results
|
||||
$.post( 'ajax.render.php', theMap,
|
||||
$.post( '../pages/ajax.render.php', theMap,
|
||||
function(data)
|
||||
{
|
||||
$('#SearchResultsToAdd').html(data);
|
||||
@@ -223,7 +223,7 @@ class UILinksWizard
|
||||
theMap['operation'] = 'doAddObjects';
|
||||
|
||||
// Run the query and display the results
|
||||
$.post( 'ajax.render.php', theMap,
|
||||
$.post( '../pages/ajax.render.php', theMap,
|
||||
function(data)
|
||||
{
|
||||
//console.log('Data: ' + data);
|
||||
|
||||
@@ -227,7 +227,7 @@ $sJSHandlerCode
|
||||
|
||||
// Now use the dependencies between the fields to order them
|
||||
// Start from the order of the 'details'
|
||||
$aList = MetaModel::GetZListItems($this->m_sClass, 'details');
|
||||
$aList = MetaModel::FlattenZlist(MetaModel::GetZListItems($this->m_sClass, 'details'));
|
||||
$index = 0;
|
||||
$aOrder = array();
|
||||
foreach($aFields as $sAttCode => $void)
|
||||
|
||||
@@ -169,9 +169,9 @@ class appUserPreferences extends DBObject
|
||||
* Overloading this function here to secure a fix done right before the release
|
||||
* The real fix should be to implement this verb in DBObject
|
||||
*/
|
||||
public function DBDeleteTracked(CMDBChange $oChange, $bSkipStrongSecurity = null)
|
||||
public function DBDeleteTracked(CMDBChange $oChange, $bSkipStrongSecurity = null, &$oDeletionPlan = null)
|
||||
{
|
||||
$this->DBDelete();
|
||||
$this->DBDelete($oDeletionPlan);
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -42,6 +42,60 @@ class utils
|
||||
private static $m_sConfigFile = ITOP_CONFIG_FILE;
|
||||
private static $m_oConfig = null;
|
||||
|
||||
// Parameters loaded from a file, parameters of the page/command line still have precedence
|
||||
private static $m_aParamsFromFile = null;
|
||||
|
||||
protected static function LoadParamFile($sParamFile)
|
||||
{
|
||||
if (!file_exists($sParamFile))
|
||||
{
|
||||
throw new Exception("Could not find the parameter file: '$sParamFile'");
|
||||
}
|
||||
if (!is_readable($sParamFile))
|
||||
{
|
||||
throw new Exception("Could not load parameter file: '$sParamFile'");
|
||||
}
|
||||
$sParams = file_get_contents($sParamFile);
|
||||
|
||||
if (is_null(self::$m_aParamsFromFile))
|
||||
{
|
||||
self::$m_aParamsFromFile = array();
|
||||
}
|
||||
|
||||
$aParamLines = explode("\n", $sParams);
|
||||
foreach ($aParamLines as $sLine)
|
||||
{
|
||||
$sLine = trim($sLine);
|
||||
|
||||
// Ignore the line after a '#'
|
||||
if (($iCommentPos = strpos($sLine, '#')) !== false)
|
||||
{
|
||||
$sLine = substr($sLine, 0, $iCommentPos);
|
||||
$sLine = trim($sLine);
|
||||
}
|
||||
|
||||
// Note: the line is supposed to be already trimmed
|
||||
if (preg_match('/^(\S*)\s*=(.*)$/', $sLine, $aMatches))
|
||||
{
|
||||
$sParam = $aMatches[1];
|
||||
$value = trim($aMatches[2]);
|
||||
self::$m_aParamsFromFile[$sParam] = $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function UseParamFile($sParamFileArgName = 'param_file', $bAllowCLI = true)
|
||||
{
|
||||
$sFileSpec = self::ReadParam($sParamFileArgName, '', $bAllowCLI);
|
||||
foreach(explode(',', $sFileSpec) as $sFile)
|
||||
{
|
||||
$sFile = trim($sFile);
|
||||
if (!empty($sFile))
|
||||
{
|
||||
self::LoadParamFile($sFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function IsModeCLI()
|
||||
{
|
||||
@@ -62,6 +116,15 @@ class utils
|
||||
{
|
||||
global $argv;
|
||||
$retValue = $defaultValue;
|
||||
|
||||
if (!is_null(self::$m_aParamsFromFile))
|
||||
{
|
||||
if (isset(self::$m_aParamsFromFile[$sName]))
|
||||
{
|
||||
$retValue = self::$m_aParamsFromFile[$sName];
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($_REQUEST[$sName]))
|
||||
{
|
||||
$retValue = $_REQUEST[$sName];
|
||||
@@ -282,14 +345,17 @@ class utils
|
||||
* @param $bForceHTTPS bool True to force HTTPS, false otherwise
|
||||
* @return string The absolute URL to the server's root, without the first slash
|
||||
*/
|
||||
static public function GetAbsoluteUrlRoot($bForceHTTPS = false)
|
||||
static public function GetAbsoluteUrlAppRoot($sCurrentRelativePath = '', $bForceHTTPS = false)
|
||||
{
|
||||
$sAbsoluteUrl = self::GetAbsoluteUrl(false, $bForceHTTPS); // False => Don't get the query string
|
||||
$sServerPos = 3 + strpos($sAbsoluteUrl, '://');
|
||||
$iFirstSlashPos = strpos($sAbsoluteUrl, '/', $sServerPos);
|
||||
if ($iFirstSlashPos !== false)
|
||||
$sAppRootPos = strpos($sAbsoluteUrl, $sCurrentRelativePath);
|
||||
if ($sAppRootPos !== false)
|
||||
{
|
||||
$sAbsoluteUrl = substr($sAbsoluteUrl, 0, $iFirstSlashPos); // remove the current page, keep just the path, without the first /
|
||||
$sAbsoluteUrl = substr($sAbsoluteUrl, 0, $sAppRootPos); // remove the current page and path
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("Failed to determine application root path $sAbsoluteUrl ($sCurrentRelativePath)");
|
||||
}
|
||||
return $sAbsoluteUrl;
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ class WebPage
|
||||
protected $a_headers;
|
||||
protected $a_base;
|
||||
protected $iNextId;
|
||||
protected $iTransactionId;
|
||||
|
||||
public function __construct($s_title)
|
||||
{
|
||||
@@ -59,6 +60,7 @@ class WebPage
|
||||
$this->a_headers = array();
|
||||
$this->a_base = array( 'href' => '', 'target' => '');
|
||||
$this->iNextId = 0;
|
||||
$this->iTransactionId = 0;
|
||||
ob_start(); // Start capturing the output
|
||||
}
|
||||
|
||||
@@ -202,7 +204,7 @@ class WebPage
|
||||
*/
|
||||
public function add_linked_script($s_linked_script)
|
||||
{
|
||||
$this->a_linked_scripts[] = $s_linked_script;
|
||||
$this->a_linked_scripts[$s_linked_script] = $s_linked_script;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -244,7 +246,7 @@ class WebPage
|
||||
*/
|
||||
public function GetDetails($aFields)
|
||||
{
|
||||
$sHtml = "<table>\n";
|
||||
$sHtml = "<table class=\"details\">\n";
|
||||
$sHtml .= "<tbody>\n";
|
||||
foreach($aFields as $aAttrib)
|
||||
{
|
||||
@@ -258,6 +260,9 @@ class WebPage
|
||||
{
|
||||
$sHtml .= "<td class=\"label\">".$aAttrib['label']."</td><td>".$aAttrib['value']."</td>\n";
|
||||
}
|
||||
$sComment = (isset($aAttrib['comments'])) ? $aAttrib['comments'] : ' ';
|
||||
$sInfo = (isset($aAttrib['infos'])) ? $aAttrib['infos'] : ' ';
|
||||
$sHtml .= "<td>$sComment</td><td>$sInfo</td>\n";
|
||||
$sHtml .= "</tr>\n";
|
||||
}
|
||||
$sHtml .= "</tbody>\n";
|
||||
@@ -279,11 +284,21 @@ class WebPage
|
||||
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
|
||||
echo "<html>\n";
|
||||
echo "<head>\n";
|
||||
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n";
|
||||
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n";
|
||||
echo "<title>{$this->s_title}</title>\n";
|
||||
echo $this->get_base_tag();
|
||||
foreach($this->a_linked_scripts as $s_script)
|
||||
{
|
||||
// Make sure that the URL to the script contains the application's version number
|
||||
// so that the new script do NOT get reloaded from the cache when the application is upgraded
|
||||
if (strpos('?', $s_script) === false)
|
||||
{
|
||||
$s_script .= "?version=".ITOP_VERSION;
|
||||
}
|
||||
else
|
||||
{
|
||||
$s_script .= "&version=".ITOP_VERSION;
|
||||
}
|
||||
echo "<script type=\"text/javascript\" src=\"$s_script\"></script>\n";
|
||||
}
|
||||
if (count($this->a_scripts)>0)
|
||||
@@ -324,7 +339,7 @@ class WebPage
|
||||
{
|
||||
echo "<div class=\"raw_output\">$s_captured_output</div>\n";
|
||||
}
|
||||
echo $this->s_deferred_content;
|
||||
echo '<div id="at_the_end">'.$this->s_deferred_content.'</div>';
|
||||
echo "</body>\n";
|
||||
echo "</html>\n";
|
||||
}
|
||||
@@ -369,5 +384,24 @@ class WebPage
|
||||
{
|
||||
return $this->iNextId++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the transactionId of the current form
|
||||
* @param $iTransactionId integer
|
||||
* @return void
|
||||
*/
|
||||
public function SetTransactionId($iTransactionId)
|
||||
{
|
||||
$this->iTransactionId = $iTransactionId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the transactionId of the current form
|
||||
* @return integer The current transactionID
|
||||
*/
|
||||
public function GetTransactionId()
|
||||
{
|
||||
return $this->iTransactionId;
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -121,6 +121,11 @@ class WizardHelper
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isset($this->m_aData['m_sState']) && !empty($this->m_aData['m_sState']))
|
||||
{
|
||||
$oObj->Set(MetaModel::GetStateAttributeCode($this->m_aData['m_sClass']), $this->m_aData['m_sState']);
|
||||
}
|
||||
|
||||
return $oObj;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
<?php
|
||||
define('APPROOT', dirname(__FILE__).'/');
|
||||
if (function_exists('microtime'))
|
||||
{
|
||||
$fItopStarted = microtime(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$fItopStarted = 1000 * time();
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -443,9 +443,9 @@ class Str
|
||||
public static function pure2html($pure, $maxLength = false)
|
||||
{
|
||||
// Check for HTML entities, but be careful the DB is in UTF-8
|
||||
return $maxLength
|
||||
? htmlentities(substr($pure, 0, $maxLength), ENT_COMPAT, 'UTF-8')
|
||||
: htmlentities($pure, ENT_COMPAT, 'UTF-8');
|
||||
return $maxLength
|
||||
? htmlentities(substr($pure, 0, $maxLength), ENT_QUOTES, 'UTF-8')
|
||||
: htmlentities($pure, ENT_QUOTES, 'UTF-8');
|
||||
}
|
||||
public static function pure2sql($pure, $maxLength = false)
|
||||
{
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
*/
|
||||
|
||||
|
||||
require_once(APPROOT.'/core/asynctask.class.inc.php');
|
||||
require_once(APPROOT.'/core/email.class.inc.php');
|
||||
|
||||
/**
|
||||
@@ -134,7 +135,7 @@ class ActionEmail extends ActionNotification
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "core/cmdb",
|
||||
"category" => "core/cmdb,bizmodel",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "name",
|
||||
"state_attcode" => "",
|
||||
@@ -162,7 +163,7 @@ class ActionEmail extends ActionNotification
|
||||
MetaModel::Init_SetZListItems('details', array('name', 'description', 'status', 'test_recipient', 'from', 'reply_to', 'to', 'cc', 'bcc', 'subject', 'body', 'importance', 'trigger_list')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('name', 'status', 'to', 'subject')); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
|
||||
MetaModel::Init_SetZListItems('standard_search', array('name','description', 'status', 'subject')); // Criteria of the std search form
|
||||
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
|
||||
}
|
||||
|
||||
@@ -219,120 +220,82 @@ class ActionEmail extends ActionNotification
|
||||
|
||||
public function DoExecute($oTrigger, $aContextArgs)
|
||||
{
|
||||
$this->m_iRecipients = 0;
|
||||
$this->m_aMailErrors = array();
|
||||
$bRes = false; // until we do succeed in sending the email
|
||||
try
|
||||
{
|
||||
// Determine recicipients
|
||||
//
|
||||
$sTo = $this->FindRecipients('to', $aContextArgs);
|
||||
$sCC = $this->FindRecipients('cc', $aContextArgs);
|
||||
$sBCC = $this->FindRecipients('bcc', $aContextArgs);
|
||||
|
||||
$sFrom = $this->Get('from');
|
||||
$sReplyTo = $this->Get('reply_to');
|
||||
|
||||
$sSubject = MetaModel::ApplyParams($this->Get('subject'), $aContextArgs);
|
||||
$sBody = MetaModel::ApplyParams($this->Get('body'), $aContextArgs);
|
||||
|
||||
$oObj = $aContextArgs['this->object()'];
|
||||
$sServerIP = $_SERVER['SERVER_ADDR']; //gethostbyname(gethostname());
|
||||
$sReference = '<iTop/'.get_class($oObj).'/'.$oObj->GetKey().'@'.$sServerIP.'>';
|
||||
|
||||
$oEmail = new EMail();
|
||||
|
||||
if ($this->IsBeingTested())
|
||||
{
|
||||
$oEmail->SetSubject('TEST['.$sSubject.']');
|
||||
$sTestBody = $sBody;
|
||||
$sTestBody .= "<div style=\"border: dashed;\">\n";
|
||||
$sTestBody .= "<h1>Testing email notification ".$this->GetHyperlink()."</h1>\n";
|
||||
$sTestBody .= "<p>The email should be sent with the following properties\n";
|
||||
$sTestBody .= "<ul>\n";
|
||||
$sTestBody .= "<li>TO: $sTo</li>\n";
|
||||
$sTestBody .= "<li>CC: $sCC</li>\n";
|
||||
$sTestBody .= "<li>BCC: $sBCC</li>\n";
|
||||
$sTestBody .= "<li>From: $sFrom</li>\n";
|
||||
$sTestBody .= "<li>Reply-To: $sReplyTo</li>\n";
|
||||
$sTestBody .= "<li>References: $sReference</li>\n";
|
||||
$sTestBody .= "</ul>\n";
|
||||
$sTestBody .= "</p>\n";
|
||||
$sTestBody .= "</div>\n";
|
||||
$oEmail->SetBody($sTestBody);
|
||||
$oEmail->SetRecipientTO($this->Get('test_recipient'));
|
||||
$oEmail->SetRecipientFrom($this->Get('test_recipient'));
|
||||
$oEmail->SetReferences($sReference);
|
||||
}
|
||||
else
|
||||
{
|
||||
$oEmail->SetSubject($sSubject);
|
||||
$oEmail->SetBody($sBody);
|
||||
$oEmail->SetRecipientTO($sTo);
|
||||
$oEmail->SetRecipientCC($sCC);
|
||||
$oEmail->SetRecipientBCC($sBCC);
|
||||
$oEmail->SetRecipientFrom($sFrom);
|
||||
$oEmail->SetRecipientReplyTo($sReplyTo);
|
||||
$oEmail->SetReferences($sReference);
|
||||
}
|
||||
|
||||
if (empty($this->m_aMailErrors))
|
||||
{
|
||||
if ($this->m_iRecipients == 0)
|
||||
{
|
||||
$this->m_aMailErrors[] = 'No recipient';
|
||||
}
|
||||
else
|
||||
{
|
||||
$oKPI = new ExecutionKPI();
|
||||
$this->m_aMailErrors = array_merge($this->m_aMailErrors, $oEmail->Send());
|
||||
$oKPI->ComputeStats('Send mail', $sTo);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
$this->m_aMailErrors[] = $e->getMessage();
|
||||
}
|
||||
|
||||
if (MetaModel::IsLogEnabledNotification())
|
||||
{
|
||||
$oLog = new EventNotificationEmail();
|
||||
if (empty($this->m_aMailErrors))
|
||||
if ($this->IsBeingTested())
|
||||
{
|
||||
if ($this->IsBeingTested())
|
||||
{
|
||||
$oLog->Set('message', 'TEST - Notification sent ('.$this->Get('test_recipient').')');
|
||||
}
|
||||
else
|
||||
{
|
||||
$oLog->Set('message', 'Notification sent');
|
||||
}
|
||||
$oLog->Set('message', 'TEST - Notification sent ('.$this->Get('test_recipient').')');
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_array($this->m_aMailErrors) && count($this->m_aMailErrors) > 0)
|
||||
{
|
||||
$sError = implode(', ', $this->m_aMailErrors);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sError = 'Unknown reason';
|
||||
}
|
||||
if ($this->IsBeingTested())
|
||||
{
|
||||
$oLog->Set('message', 'TEST - Notification was not sent: '.$sError);
|
||||
}
|
||||
else
|
||||
{
|
||||
$oLog->Set('message', 'Notification was not sent: '.$sError);
|
||||
}
|
||||
$oLog->Set('message', 'Notification pending');
|
||||
}
|
||||
$oLog->Set('userinfo', UserRights::GetUser());
|
||||
$oLog->Set('trigger_id', $oTrigger->GetKey());
|
||||
$oLog->Set('action_id', $this->GetKey());
|
||||
$oLog->Set('object_id', $aContextArgs['this->object()']->GetKey());
|
||||
// Must be inserted now so that it gets a valid id that will make the link
|
||||
// between an eventual asynchronous task (queued) and the log
|
||||
$oLog->DBInsertNoReload();
|
||||
}
|
||||
else
|
||||
{
|
||||
$oLog = null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$sRes = $this->_DoExecute($oTrigger, $aContextArgs, $oLog);
|
||||
|
||||
if ($this->IsBeingTested())
|
||||
{
|
||||
$sPrefix = 'TEST ('.$this->Get('test_recipient').') - ';
|
||||
}
|
||||
else
|
||||
{
|
||||
$sPrefix = '';
|
||||
}
|
||||
$oLog->Set('message', $sPrefix.$sRes);
|
||||
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
if ($oLog)
|
||||
{
|
||||
$oLog->Set('message', 'Error: '.$e->getMessage());
|
||||
}
|
||||
}
|
||||
if ($oLog)
|
||||
{
|
||||
$oLog->DBUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
protected function _DoExecute($oTrigger, $aContextArgs, &$oLog)
|
||||
{
|
||||
$this->m_iRecipients = 0;
|
||||
$this->m_aMailErrors = array();
|
||||
$bRes = false; // until we do succeed in sending the email
|
||||
|
||||
// Determine recicipients
|
||||
//
|
||||
$sTo = $this->FindRecipients('to', $aContextArgs);
|
||||
$sCC = $this->FindRecipients('cc', $aContextArgs);
|
||||
$sBCC = $this->FindRecipients('bcc', $aContextArgs);
|
||||
|
||||
$sFrom = $this->Get('from');
|
||||
$sReplyTo = $this->Get('reply_to');
|
||||
|
||||
$sSubject = MetaModel::ApplyParams($this->Get('subject'), $aContextArgs);
|
||||
$sBody = MetaModel::ApplyParams($this->Get('body'), $aContextArgs);
|
||||
|
||||
$oObj = $aContextArgs['this->object()'];
|
||||
$sServerIP = $_SERVER['SERVER_ADDR']; //gethostbyname(gethostname());
|
||||
$sReference = '<iTop/'.get_class($oObj).'/'.$oObj->GetKey().'@'.$sServerIP.'>';
|
||||
|
||||
if (!is_null($oLog))
|
||||
{
|
||||
// Note: we have to secure this because those values are calculated
|
||||
// inside the try statement, and we would like to keep track of as
|
||||
// many data as we could while some variables may still be undefined
|
||||
@@ -342,7 +305,77 @@ class ActionEmail extends ActionNotification
|
||||
if (isset($sFrom)) $oLog->Set('from', $sFrom);
|
||||
if (isset($sSubject)) $oLog->Set('subject', $sSubject);
|
||||
if (isset($sBody)) $oLog->Set('body', $sBody);
|
||||
$oLog->DBInsertNoReload();
|
||||
}
|
||||
|
||||
$oEmail = new EMail();
|
||||
|
||||
if ($this->IsBeingTested())
|
||||
{
|
||||
$oEmail->SetSubject('TEST['.$sSubject.']');
|
||||
$sTestBody = $sBody;
|
||||
$sTestBody .= "<div style=\"border: dashed;\">\n";
|
||||
$sTestBody .= "<h1>Testing email notification ".$this->GetHyperlink()."</h1>\n";
|
||||
$sTestBody .= "<p>The email should be sent with the following properties\n";
|
||||
$sTestBody .= "<ul>\n";
|
||||
$sTestBody .= "<li>TO: $sTo</li>\n";
|
||||
$sTestBody .= "<li>CC: $sCC</li>\n";
|
||||
$sTestBody .= "<li>BCC: $sBCC</li>\n";
|
||||
$sTestBody .= "<li>From: $sFrom</li>\n";
|
||||
$sTestBody .= "<li>Reply-To: $sReplyTo</li>\n";
|
||||
$sTestBody .= "<li>References: $sReference</li>\n";
|
||||
$sTestBody .= "</ul>\n";
|
||||
$sTestBody .= "</p>\n";
|
||||
$sTestBody .= "</div>\n";
|
||||
$oEmail->SetBody($sTestBody);
|
||||
$oEmail->SetRecipientTO($this->Get('test_recipient'));
|
||||
$oEmail->SetRecipientFrom($this->Get('test_recipient'));
|
||||
$oEmail->SetReferences($sReference);
|
||||
}
|
||||
else
|
||||
{
|
||||
$oEmail->SetSubject($sSubject);
|
||||
$oEmail->SetBody($sBody);
|
||||
$oEmail->SetRecipientTO($sTo);
|
||||
$oEmail->SetRecipientCC($sCC);
|
||||
$oEmail->SetRecipientBCC($sBCC);
|
||||
$oEmail->SetRecipientFrom($sFrom);
|
||||
$oEmail->SetRecipientReplyTo($sReplyTo);
|
||||
$oEmail->SetReferences($sReference);
|
||||
}
|
||||
|
||||
if (empty($this->m_aMailErrors))
|
||||
{
|
||||
if ($this->m_iRecipients == 0)
|
||||
{
|
||||
return 'No recipient';
|
||||
}
|
||||
else
|
||||
{
|
||||
$iRes = $oEmail->Send($aErrors, false, $oLog); // allow asynchronous mode
|
||||
switch ($iRes)
|
||||
{
|
||||
case EMAIL_SEND_OK:
|
||||
return "Sent";
|
||||
|
||||
case EMAIL_SEND_PENDING:
|
||||
return "Pending";
|
||||
|
||||
case EMAIL_SEND_ERROR:
|
||||
return "Errors: ".implode(', ', $aErrors);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_array($this->m_aMailErrors) && count($this->m_aMailErrors) > 0)
|
||||
{
|
||||
$sError = implode(', ', $this->m_aMailErrors);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sError = 'Unknown reason';
|
||||
}
|
||||
return 'Notification was not sent: '.$sError;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
192
core/asynctask.class.inc.php
Normal file
192
core/asynctask.class.inc.php
Normal file
@@ -0,0 +1,192 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Persistent classes (internal): user defined actions
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
|
||||
class ExecAsyncTask implements iBackgroundProcess
|
||||
{
|
||||
public function GetPeriodicity()
|
||||
{
|
||||
return 2; // seconds
|
||||
}
|
||||
|
||||
public function Process($iTimeLimit)
|
||||
{
|
||||
$sOQL = "SELECT AsyncTask WHERE ISNULL(started) AND (ISNULL(planned) OR (planned < NOW()))";
|
||||
$oSet = new CMDBObjectSet(DBObjectSearch::FromOQL($sOQL), array('created' => true) /* order by*/, array());
|
||||
$iProcessed = 0;
|
||||
while ((time() < $iTimeLimit) && ($oTask = $oSet->Fetch()))
|
||||
{
|
||||
$oTask->Set('started', time());
|
||||
$oTask->DBUpdate();
|
||||
|
||||
$oTask->Process();
|
||||
$iProcessed++;
|
||||
|
||||
$oTask->DBDelete();
|
||||
}
|
||||
if ($iProcessed == $oSet->Count())
|
||||
{
|
||||
return "processed $iProcessed tasks";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "processed $iProcessed tasks (remaining: ".($oSet->Count() - $iProcessed).")";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A
|
||||
*
|
||||
* @package iTopORM
|
||||
*/
|
||||
abstract class AsyncTask extends DBObject
|
||||
{
|
||||
public static function Init()
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "core/cmdb",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => array('created'),
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_async_task",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "realclass",
|
||||
"display_template" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
//MetaModel::Init_InheritAttributes();
|
||||
// MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values"=>null, "sql"=>"name", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeDateTime("created", array("allowed_values"=>null, "sql"=>"created", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeDateTime("started", array("allowed_values"=>null, "sql"=>"started", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
// planned... still not used - reserved for timer management
|
||||
MetaModel::Init_AddAttribute(new AttributeDateTime("planned", array("allowed_values"=>null, "sql"=>"planned", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("event_id", array("targetclass"=>"Event", "jointype"=> "", "allowed_values"=>null, "sql"=>"event_id", "is_null_allowed"=>true, "on_target_delete"=>DEL_SILENT, "depends_on"=>array())));
|
||||
|
||||
// Display lists
|
||||
// MetaModel::Init_SetZListItems('details', array()); // Attributes to be displayed for the complete details
|
||||
// MetaModel::Init_SetZListItems('list', array()); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
|
||||
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
|
||||
}
|
||||
|
||||
protected function OnInsert()
|
||||
{
|
||||
$this->Set('created', time());
|
||||
}
|
||||
|
||||
public function Process()
|
||||
{
|
||||
$sStatus = $this->DoProcess();
|
||||
if ($this->Get('event_id') != 0)
|
||||
{
|
||||
$oEventLog = MetaModel::GetObject('Event', $this->Get('event_id'));
|
||||
$oEventLog->Set('message', $sStatus);
|
||||
$oEventLog->DBUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
abstract public function DoProcess();
|
||||
}
|
||||
|
||||
/**
|
||||
* An email notification
|
||||
*
|
||||
* @package iTopORM
|
||||
*/
|
||||
class AsyncSendEmail extends AsyncTask
|
||||
{
|
||||
public static function Init()
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "core/cmdb",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "created",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_async_send_email",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
"display_template" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_InheritAttributes();
|
||||
|
||||
MetaModel::Init_AddAttribute(new AttributeText("to", array("allowed_values"=>null, "sql"=>"to", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeText("subject", array("allowed_values"=>null, "sql"=>"subject", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeText("body", array("allowed_values"=>null, "sql"=>"body", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeText("header", array("allowed_values"=>null, "sql"=>"header", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
|
||||
// Display lists
|
||||
// MetaModel::Init_SetZListItems('details', array('name', 'description', 'status', 'test_recipient', 'from', 'reply_to', 'to', 'cc', 'bcc', 'subject', 'body', 'importance', 'trigger_list')); // Attributes to be displayed for the complete details
|
||||
// MetaModel::Init_SetZListItems('list', array('name', 'status', 'to', 'subject')); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
|
||||
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
|
||||
}
|
||||
|
||||
static public function AddToQueue($sTo, $sSubject, $sBody, $aHeaders, $oLog)
|
||||
{
|
||||
$oNew = MetaModel::NewObject(__class__);
|
||||
if ($oLog)
|
||||
{
|
||||
$oNew->Set('event_id', $oLog->GetKey());
|
||||
}
|
||||
$oNew->Set('to', $sTo);
|
||||
$oNew->Set('subject', $sSubject);
|
||||
$oNew->Set('body', $sBody);
|
||||
$sHeaders = serialize($aHeaders);
|
||||
$oNew->Set('header', $sHeaders);
|
||||
$oNew->DBInsert();
|
||||
}
|
||||
|
||||
public function DoProcess()
|
||||
{
|
||||
$sTo = $this->Get('to');
|
||||
$sSubject = $this->Get('subject');
|
||||
$sBody = $this->Get('body');
|
||||
$sHeaders = $this->Get('header');
|
||||
$aHeaders = unserialize($sHeaders);
|
||||
|
||||
$oEmail = new EMail($sTo, $sSubject, $sBody, $aHeaders);
|
||||
$iRes = $oEmail->Send($aIssues, true /* force synchro !!!!! */);
|
||||
switch ($iRes)
|
||||
{
|
||||
case EMAIL_SEND_OK:
|
||||
return "Sent";
|
||||
|
||||
case EMAIL_SEND_PENDING:
|
||||
return "Bug - the email should be sent in synchronous mode";
|
||||
|
||||
case EMAIL_SEND_ERROR:
|
||||
return "Failed: ".implode(', ', $aIssues);
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
File diff suppressed because it is too large
Load Diff
33
core/backgroundprocess.inc.php
Normal file
33
core/backgroundprocess.inc.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Class BackgroundProcess
|
||||
* Any extension that must be called regularly to be executed in the background
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
interface iBackgroundProcess
|
||||
{
|
||||
public function GetPeriodicity();
|
||||
public function Process($iUnixTimeLimit);
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -52,19 +52,13 @@ abstract class CellChangeSpec
|
||||
$this->m_sOql = $sOql;
|
||||
}
|
||||
|
||||
static protected function ValueAsHtml($value)
|
||||
public function GetPureValue()
|
||||
{
|
||||
if (MetaModel::IsValidObject($value))
|
||||
{
|
||||
return $value->GetHyperLink();
|
||||
}
|
||||
else
|
||||
{
|
||||
return htmlentities($value, ENT_QUOTES, 'UTF-8');
|
||||
}
|
||||
// Todo - distinguish both values
|
||||
return $this->m_proposedValue;
|
||||
}
|
||||
|
||||
public function GetValue()
|
||||
public function GetDisplayableValue()
|
||||
{
|
||||
return $this->m_proposedValue;
|
||||
}
|
||||
@@ -101,10 +95,10 @@ class CellStatus_Modify extends CellChangeSpec
|
||||
return 'Modified';
|
||||
}
|
||||
|
||||
public function GetPreviousValue()
|
||||
{
|
||||
return $this->m_previousValue;
|
||||
}
|
||||
//public function GetPreviousValue()
|
||||
//{
|
||||
// return $this->m_previousValue;
|
||||
//}
|
||||
}
|
||||
|
||||
class CellStatus_Issue extends CellStatus_Modify
|
||||
@@ -270,6 +264,22 @@ class BulkChange
|
||||
$this->m_aOnDisappear = $aOnDisappear;
|
||||
}
|
||||
|
||||
protected $m_bReportHtml = false;
|
||||
protected $m_sReportCsvSep = ',';
|
||||
protected $m_sReportCsvDelimiter = '"';
|
||||
|
||||
public function SetReportHtml()
|
||||
{
|
||||
$this->m_bReportHtml = true;
|
||||
}
|
||||
|
||||
public function SetReportCsv($sSeparator = ',', $sDelimiter = '"')
|
||||
{
|
||||
$this->m_bReportHtml = false;
|
||||
$this->m_sReportCsvSep = $sSeparator;
|
||||
$this->m_sReportCsvDelimiter = $sDelimiter;
|
||||
}
|
||||
|
||||
protected function ResolveExternalKey($aRowData, $sAttCode, &$aResults)
|
||||
{
|
||||
$oExtKey = MetaModel::GetAttributeDef($this->m_sClass, $sAttCode);
|
||||
@@ -388,15 +398,31 @@ class BulkChange
|
||||
// skip the private key, if any
|
||||
if ($sAttCode == 'id') continue;
|
||||
|
||||
$res = $oTargetObj->CheckValue($sAttCode, $aRowData[$iCol]);
|
||||
if ($res === true)
|
||||
$oAttDef = MetaModel::GetAttributeDef($this->m_sClass, $sAttCode);
|
||||
if ($oAttDef->IsLinkSet() && $oAttDef->IsIndirect())
|
||||
{
|
||||
$oTargetObj->Set($sAttCode, $aRowData[$iCol]);
|
||||
try
|
||||
{
|
||||
$oSet = $oAttDef->MakeValueFromString($aRowData[$iCol]);
|
||||
$oTargetObj->Set($sAttCode, $oSet);
|
||||
}
|
||||
catch(CoreException $e)
|
||||
{
|
||||
$aErrors[$sAttCode] = "Failed to process input: ".$e->getMessage();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// $res is a string with the error description
|
||||
$aErrors[$sAttCode] = "Unexpected value for attribute '$sAttCode': $res";
|
||||
{
|
||||
$res = $oTargetObj->CheckValue($sAttCode, $aRowData[$iCol]);
|
||||
if ($res === true)
|
||||
{
|
||||
$oTargetObj->Set($sAttCode, $aRowData[$iCol]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// $res is a string with the error description
|
||||
$aErrors[$sAttCode] = "Unexpected value for attribute '$sAttCode': $res";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -409,25 +435,38 @@ class BulkChange
|
||||
{
|
||||
$aResults[$iCol]= new CellStatus_Void($aRowData[$iCol]);
|
||||
}
|
||||
if (isset($aErrors[$sAttCode]))
|
||||
else
|
||||
{
|
||||
$aResults[$iCol]= new CellStatus_Issue($oTargetObj->Get($sAttCode), $oTargetObj->GetOriginal($sAttCode), $aErrors[$sAttCode]);
|
||||
}
|
||||
elseif (array_key_exists($sAttCode, $aChangedFields))
|
||||
{
|
||||
if ($oTargetObj->IsNew())
|
||||
if ($this->m_bReportHtml)
|
||||
{
|
||||
$aResults[$iCol]= new CellStatus_Void($oTargetObj->Get($sAttCode));
|
||||
$sCurValue = $oTargetObj->GetAsHTML($sAttCode);
|
||||
$sOrigValue = $oTargetObj->GetOriginalAsHTML($sAttCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
$aResults[$iCol]= new CellStatus_Modify($oTargetObj->Get($sAttCode), $oTargetObj->GetOriginal($sAttCode));
|
||||
$sCurValue = $oTargetObj->GetAsCSV($sAttCode, $this->m_sReportCsvSep, $this->m_sReportCsvDelimiter);
|
||||
$sOrigValue = $oTargetObj->GetOriginalAsCSV($sAttCode, $this->m_sReportCsvSep, $this->m_sReportCsvDelimiter);
|
||||
}
|
||||
if (isset($aErrors[$sAttCode]))
|
||||
{
|
||||
$aResults[$iCol]= new CellStatus_Issue($sCurValue, $sOrigValue, $aErrors[$sAttCode]);
|
||||
}
|
||||
elseif (array_key_exists($sAttCode, $aChangedFields))
|
||||
{
|
||||
if ($oTargetObj->IsNew())
|
||||
{
|
||||
$aResults[$iCol]= new CellStatus_Void($sCurValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
$aResults[$iCol]= new CellStatus_Modify($sCurValue, $sOrigValue);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// By default... nothing happens
|
||||
$aResults[$iCol]= new CellStatus_Void($aRowData[$iCol]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// By default... nothing happens
|
||||
$aResults[$iCol]= new CellStatus_Void($aRowData[$iCol]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -581,7 +620,14 @@ class BulkChange
|
||||
//
|
||||
if ($oChange)
|
||||
{
|
||||
$oTargetObj->DBUpdateTracked($oChange);
|
||||
try
|
||||
{
|
||||
$oTargetObj->DBUpdateTracked($oChange);
|
||||
}
|
||||
catch(CoreException $e)
|
||||
{
|
||||
$aResult[$iRow]["__STATUS__"] = new RowStatus_Issue($e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -610,12 +656,19 @@ class BulkChange
|
||||
if (count($aChangedFields) > 0)
|
||||
{
|
||||
$aResult[$iRow]["__STATUS__"] = new RowStatus_Disappeared(count($aChangedFields));
|
||||
|
||||
|
||||
// Optionaly record the results
|
||||
//
|
||||
if ($oChange)
|
||||
{
|
||||
$oTargetObj->DBUpdateTracked($oChange);
|
||||
try
|
||||
{
|
||||
$oTargetObj->DBUpdateTracked($oChange);
|
||||
}
|
||||
catch(CoreException $e)
|
||||
{
|
||||
$aResult[$iRow]["__STATUS__"] = new RowStatus_Issue($e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -806,7 +859,7 @@ class BulkChange
|
||||
$oBulkChangeSearch = DBObjectSearch::FromOQL("SELECT CMDBChange WHERE userinfo LIKE '%(CSV)'");
|
||||
|
||||
$iQueryLimit = $bShowAll ? 0 : MetaModel::GetConfig()->GetMaxDisplayLimit() + 1;
|
||||
$oBulkChanges = new DBObjectSet($oBulkChangeSearch, array('date' => false), array(), $iQueryLimit);
|
||||
$oBulkChanges = new DBObjectSet($oBulkChangeSearch, array('date' => false), array(), null, $iQueryLimit);
|
||||
|
||||
$oAppContext = new ApplicationContext();
|
||||
|
||||
@@ -865,8 +918,10 @@ class BulkChange
|
||||
|
||||
// Assumption: there is only one class of objects being loaded
|
||||
// Then the last class found gives us the class for every object
|
||||
|
||||
$aDetails[] = array('date' => $sDate, 'user' => $sUser, 'class' => $sClass, 'created' => $iCreated, 'modified' => $iModified);
|
||||
if ( ($iModified > 0) || ($iCreated > 0))
|
||||
{
|
||||
$aDetails[] = array('date' => $sDate, 'user' => $sUser, 'class' => $sClass, 'created' => $iCreated, 'modified' => $iModified);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -968,7 +1023,7 @@ EOF
|
||||
{
|
||||
$aObjects[$iObjId]['__created__'] = true;
|
||||
}
|
||||
elseif (is_subclass_of($oOperation, 'CMDBChangeOpSetAttribute'))
|
||||
elseif ($oOperation instanceof CMDBChangeOpSetAttribute)
|
||||
{
|
||||
$sAttCode = $oOperation->Get('attcode');
|
||||
|
||||
@@ -1057,6 +1112,49 @@ EOF
|
||||
}
|
||||
$oPage->table($aConfig, $aDetails);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the user friendly name for an 'extended' attribute code i.e 'name', becomes 'Name' and 'org_id->name' becomes 'Organization->Name'
|
||||
* @param string $sClassName The name of the class
|
||||
* @param string $sAttCodeEx Either an attribute code or ext_key_name->att_code
|
||||
* @return string A user friendly format of the string: AttributeName or AttributeName->ExtAttributeName
|
||||
*/
|
||||
public static function GetFriendlyAttCodeName($sClassName, $sAttCodeEx)
|
||||
{
|
||||
$sFriendlyName = '';
|
||||
if (preg_match('/(.+)->(.+)/', $sAttCodeEx, $aMatches) > 0)
|
||||
{
|
||||
$sAttribute = $aMatches[1];
|
||||
$sField = $aMatches[2];
|
||||
$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttribute);
|
||||
if ($oAttDef->IsExternalKey())
|
||||
{
|
||||
$sTargetClass = $oAttDef->GetTargetClass();
|
||||
$oTargetAttDef = MetaModel::GetAttributeDef($sTargetClass, $sField);
|
||||
$sFriendlyName = $oAttDef->GetLabel().'->'.$oTargetAttDef->GetLabel();
|
||||
}
|
||||
else
|
||||
{
|
||||
// hum, hum... should never happen, we'd better raise an exception
|
||||
throw(new Exception(Dict::Format('UI:CSVImport:ErrorExtendedAttCode', $sAttCodeEx, $sAttribute, $sClassName)));
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($sAttCodeEx == 'id')
|
||||
{
|
||||
$sFriendlyName = Dict::S('UI:CSVImport:idField');
|
||||
}
|
||||
else
|
||||
{
|
||||
$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCodeEx);
|
||||
$sFriendlyName = $oAttDef->GetLabel();
|
||||
}
|
||||
}
|
||||
return $sFriendlyName;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -232,7 +232,14 @@ class CMDBChangeOpSetAttributeScalar extends CMDBChangeOpSetAttribute
|
||||
}
|
||||
else
|
||||
{
|
||||
$sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sNewValue, $sOldValue);
|
||||
if (strlen($sOldValue) == 0)
|
||||
{
|
||||
$sResult = Dict::Format('Change:AttName_SetTo', $sAttName, $sNewValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sNewValue, $sOldValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
elseif($bIsHtml && $oAttDef->IsExternalKey())
|
||||
@@ -241,6 +248,14 @@ class CMDBChangeOpSetAttributeScalar extends CMDBChangeOpSetAttribute
|
||||
$sFrom = MetaModel::GetHyperLink($sTargetClass, $sOldValue);
|
||||
$sTo = MetaModel::GetHyperLink($sTargetClass, $sNewValue);
|
||||
$sResult = "$sAttName set to $sTo (previous: $sFrom)";
|
||||
if (strlen($sFrom) == 0)
|
||||
{
|
||||
$sResult = Dict::Format('Change:AttName_SetTo', $sAttName, $sTo);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sTo, $sFrom);
|
||||
}
|
||||
}
|
||||
elseif ($oAttDef instanceOf AttributeBlob)
|
||||
{
|
||||
@@ -248,7 +263,14 @@ class CMDBChangeOpSetAttributeScalar extends CMDBChangeOpSetAttribute
|
||||
}
|
||||
else
|
||||
{
|
||||
$sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sNewValue, $sOldValue);
|
||||
if (strlen($sOldValue) == 0)
|
||||
{
|
||||
$sResult = Dict::Format('Change:AttName_SetTo', $sAttName, $sNewValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sNewValue, $sOldValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $sResult;
|
||||
@@ -475,4 +497,61 @@ class CMDBChangeOpSetAttributeText extends CMDBChangeOpSetAttribute
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Record the modification of a caselog (text)
|
||||
* since the caselog itself stores the history
|
||||
* of its entries, there is no need to duplicate
|
||||
* the text here
|
||||
*
|
||||
* @package iTopORM
|
||||
*/
|
||||
class CMDBChangeOpSetAttributeCaseLog extends CMDBChangeOpSetAttribute
|
||||
{
|
||||
public static function Init()
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "core/cmdb",
|
||||
"key_type" => "",
|
||||
"name_attcode" => "change",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_changeop_setatt_log",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_InheritAttributes();
|
||||
MetaModel::Init_AddAttribute(new AttributeInteger("lastentry", array("allowed_values"=>null, "sql"=>"lastentry", "default_value"=>0, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('date', 'userinfo', 'attcode')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('date', 'userinfo', 'attcode')); // Attributes to be displayed for a list
|
||||
}
|
||||
|
||||
/**
|
||||
* Describe (as a text string) the modifications corresponding to this change
|
||||
*/
|
||||
public function GetDescription()
|
||||
{
|
||||
// Temporary, until we change the options of GetDescription() -needs a more global revision
|
||||
$bIsHtml = true;
|
||||
|
||||
$sResult = '';
|
||||
$oTargetObjectClass = $this->Get('objclass');
|
||||
$oTargetObjectKey = $this->Get('objkey');
|
||||
$oTargetSearch = new DBObjectSearch($oTargetObjectClass);
|
||||
$oTargetSearch->AddCondition('id', $oTargetObjectKey, '=');
|
||||
|
||||
$oMonoObjectSet = new DBObjectSet($oTargetSearch);
|
||||
if (UserRights::IsActionAllowedOnAttribute($this->Get('objclass'), $this->Get('attcode'), UR_ACTION_READ, $oMonoObjectSet) == UR_ALLOWED_YES)
|
||||
{
|
||||
$oAttDef = MetaModel::GetAttributeDef($this->Get('objclass'), $this->Get('attcode'));
|
||||
$sAttName = $oAttDef->GetLabel();
|
||||
$sResult = Dict::Format('Change:AttName_EntryAdded', $sAttName);
|
||||
}
|
||||
return $sResult;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
@@ -59,6 +59,8 @@ require_once('dbobject.class.php');
|
||||
require_once('dbobjectsearch.class.php');
|
||||
require_once('dbobjectset.class.php');
|
||||
|
||||
require_once('backgroundprocess.inc.php');
|
||||
require_once('asynctask.class.inc.php');
|
||||
require_once('dbproperty.class.inc.php');
|
||||
|
||||
// db change tracking data model
|
||||
@@ -175,6 +177,17 @@ abstract class CMDBObject extends DBObject
|
||||
$oMyChangeOp->Set("prevdata", $original);
|
||||
$iId = $oMyChangeOp->DBInsertNoReload();
|
||||
}
|
||||
elseif ($oAttDef instanceOf AttributeCaseLog)
|
||||
{
|
||||
$oMyChangeOp = MetaModel::NewObject("CMDBChangeOpSetAttributeCaseLog");
|
||||
$oMyChangeOp->Set("change", $oChange->GetKey());
|
||||
$oMyChangeOp->Set("objclass", get_class($this));
|
||||
$oMyChangeOp->Set("objkey", $this->GetKey());
|
||||
$oMyChangeOp->Set("attcode", $sAttCode);
|
||||
|
||||
$oMyChangeOp->Set("lastentry", $value->GetLatestEntryIndex());
|
||||
$iId = $oMyChangeOp->DBInsertNoReload();
|
||||
}
|
||||
elseif ($oAttDef instanceOf AttributeText)
|
||||
{
|
||||
// Data blobs
|
||||
@@ -187,6 +200,10 @@ abstract class CMDBObject extends DBObject
|
||||
if (array_key_exists($sAttCode, $aOrigValues))
|
||||
{
|
||||
$original = $aOrigValues[$sAttCode];
|
||||
if ($original instanceof ormCaseLog)
|
||||
{
|
||||
$original = $original->GetText();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -352,28 +369,28 @@ abstract class CMDBObject extends DBObject
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public function DBDelete()
|
||||
public function DBDelete(&$oDeletionPlan = null)
|
||||
{
|
||||
if(!self::$m_oCurrChange)
|
||||
{
|
||||
throw new CoreException("DBDelete() could not be used here, please use DBDeleteTracked() instead");
|
||||
}
|
||||
return $this->DBDeleteTracked_Internal();
|
||||
return $this->DBDeleteTracked_Internal($oDeletionPlan);
|
||||
}
|
||||
|
||||
public function DBDeleteTracked(CMDBChange $oChange, $bSkipStrongSecurity = null)
|
||||
public function DBDeleteTracked(CMDBChange $oChange, $bSkipStrongSecurity = null, &$oDeletionPlan = null)
|
||||
{
|
||||
$this->CheckUserRights($bSkipStrongSecurity, UR_ACTION_DELETE);
|
||||
|
||||
self::$m_oCurrChange = $oChange;
|
||||
$this->DBDeleteTracked_Internal();
|
||||
$this->DBDeleteTracked_Internal($oDeletionPlan);
|
||||
self::$m_oCurrChange = null;
|
||||
}
|
||||
|
||||
protected function DBDeleteTracked_Internal()
|
||||
protected function DBDeleteTracked_Internal(&$oDeletionPlan = null)
|
||||
{
|
||||
$prevkey = $this->GetKey();
|
||||
$ret = parent::DBDelete();
|
||||
$ret = parent::DBDelete($oDeletionPlan);
|
||||
$this->RecordObjDeletion(self::$m_oCurrChange, $prevkey);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ class CMDBSource
|
||||
self::$m_sDBUser = $sUser;
|
||||
self::$m_sDBPwd = $sPwd;
|
||||
self::$m_sDBName = $sSource;
|
||||
if (!self::$m_resDBLink = @mysql_pconnect($sServer, $sUser, $sPwd))
|
||||
if (!self::$m_resDBLink = mysql_connect($sServer, $sUser, $sPwd))
|
||||
{
|
||||
throw new MySQLException('Could not connect to the DB server', array('host'=>$sServer, 'user'=>$sUser));
|
||||
}
|
||||
@@ -84,6 +84,17 @@ class CMDBSource
|
||||
}
|
||||
}
|
||||
|
||||
public static function SetTimezone($sTimezone = null)
|
||||
{
|
||||
// Note: requires the installation of MySQL special tables,
|
||||
// otherwise, only 'SYSTEM' or "+10:00' may be specified which is NOT sufficient because of day light saving times
|
||||
if (!is_null($sTimezone))
|
||||
{
|
||||
$sQuotedTimezone = self::Quote($sTimezone);
|
||||
self::Query("SET time_zone = $sQuotedTimezone");
|
||||
}
|
||||
}
|
||||
|
||||
public static function ListDB()
|
||||
{
|
||||
$aDBs = self::QueryToCol('SHOW DATABASES', 'Database');
|
||||
@@ -243,6 +254,31 @@ class CMDBSource
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function DeleteFrom($sSQLQuery)
|
||||
{
|
||||
self::Query($sSQLQuery);
|
||||
}
|
||||
|
||||
public static function QueryToScalar($sSql)
|
||||
{
|
||||
$result = mysql_query($sSql, self::$m_resDBLink);
|
||||
if (!$result)
|
||||
{
|
||||
throw new MySQLException('Failed to issue SQL query', array('query' => $sSql));
|
||||
}
|
||||
if ($aRow = mysql_fetch_array($result, MYSQL_BOTH))
|
||||
{
|
||||
$res = $aRow[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
mysql_free_result($result);
|
||||
throw new MySQLException('Found no result for query', array('query' => $sSql));
|
||||
}
|
||||
mysql_free_result($result);
|
||||
return $res;
|
||||
}
|
||||
|
||||
public static function QueryToArray($sSql)
|
||||
{
|
||||
$aData = array();
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
define('ITOP_APPLICATION', 'iTop');
|
||||
define('ITOP_VERSION', '$ITOP_VERSION$');
|
||||
define('ITOP_REVISION', '$WCREV$');
|
||||
define('ITOP_BUILD_DATE', '$WCNOW$');
|
||||
@@ -39,7 +40,7 @@ class ConfigException extends CoreException
|
||||
}
|
||||
|
||||
define ('DEFAULT_CHARACTER_SET', 'utf8');
|
||||
define ('DEFAULT_COLLATION', 'utf8_general_ci');
|
||||
define ('DEFAULT_COLLATION', 'utf8_unicode_ci');
|
||||
|
||||
define ('DEFAULT_LOG_GLOBAL', true);
|
||||
define ('DEFAULT_LOG_NOTIFICATION', true);
|
||||
@@ -94,7 +95,7 @@ class Config
|
||||
),
|
||||
'skip_check_ext_keys' => array(
|
||||
'type' => 'bool',
|
||||
'description' => 'Disable external key check when checking the value of attribtutes',
|
||||
'description' => 'Disable external key check when checking the value of attributes',
|
||||
'default' => false,
|
||||
'value' => false,
|
||||
'source_of_value' => '',
|
||||
@@ -125,7 +126,7 @@ class Config
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'max_combo_length' => array(
|
||||
'type' => 'int',
|
||||
'type' => 'integer',
|
||||
'description' => 'The maximum number of elements in a drop-down list. If more then an autocomplete will be used',
|
||||
'default' => 50,
|
||||
'value' => 50,
|
||||
@@ -133,7 +134,7 @@ class Config
|
||||
'show_in_conf_sample' => false,
|
||||
),
|
||||
'min_autocomplete_chars' => array(
|
||||
'type' => 'int',
|
||||
'type' => 'integer',
|
||||
'description' => 'The minimum number of characters to type in order to trigger the "autocomplete" behavior',
|
||||
'default' => 3,
|
||||
'value' => 3,
|
||||
@@ -205,6 +206,104 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'log_usage' => array(
|
||||
'type' => 'bool',
|
||||
'description' => 'Log the usage of the application (i.e. the date/time and the user name of each login)',
|
||||
'default' => false,
|
||||
'value' => false,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
),
|
||||
'synchro_trace' => array(
|
||||
'type' => 'string',
|
||||
'description' => 'Synchronization details: none, display, save (includes \'display\')',
|
||||
'default' => 'none',
|
||||
'value' => 'none',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'link_set_item_separator' => array(
|
||||
'type' => 'string',
|
||||
'description' => 'Link set from string: line separator',
|
||||
'default' => '|',
|
||||
'value' => '|',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'link_set_attribute_separator' => array(
|
||||
'type' => 'string',
|
||||
'description' => 'Link set from string: attribute separator',
|
||||
'default' => ';',
|
||||
'value' => ';',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'link_set_value_separator' => array(
|
||||
'type' => 'string',
|
||||
'description' => 'Link set from string: value separator (between the attcode and the value itself',
|
||||
'default' => ':',
|
||||
'value' => ':',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'link_set_attribute_qualifier' => array(
|
||||
'type' => 'string',
|
||||
'description' => 'Link set from string: attribute qualifier (encloses both the attcode and the value)',
|
||||
'default' => "'",
|
||||
'value' => "'",
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'cron_max_execution_time' => array(
|
||||
'type' => 'integer',
|
||||
'description' => 'Duration (seconds) of the page cron.php, must be shorter than php setting max_execution_time and shorter than the web server response timeout',
|
||||
'default' => 600,
|
||||
'value' => 600,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'cron_sleep' => array(
|
||||
'type' => 'integer',
|
||||
'description' => 'Duration (seconds) before cron.php checks again if something must be done',
|
||||
'default' => 2,
|
||||
'value' => 2,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
),
|
||||
'email_asynchronous' => array(
|
||||
'type' => 'bool',
|
||||
'description' => 'If set, the emails are sent off line, which requires cron.php to be activated. Exception: some features like the email test utility will force the serialized mode',
|
||||
'default' => false,
|
||||
'value' => false,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'apc_cache.enabled' => array(
|
||||
'type' => 'bool',
|
||||
'description' => 'If set, the APC cache is allowed (the PHP extension must also be active)',
|
||||
'default' => true,
|
||||
'value' => true,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'apc_cache.query_ttl' => array(
|
||||
'type' => 'integer',
|
||||
'description' => 'Time to live set in APC for the prepared queries (seconds - 0 means no timeout)',
|
||||
'default' => 3600,
|
||||
'value' => 3600,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'timezone' => array(
|
||||
'type' => 'string',
|
||||
'description' => 'Timezone (reference: http://php.net/manual/en/timezones.php). If empty, it will be left unchanged and MUST be explicitely configured in PHP',
|
||||
// examples... not used (nor 'description')
|
||||
'examples' => array('America/Sao_Paulo', 'America/New_York (standing for EDT)', 'America/Los_Angeles (standing for PDT)', 'Asia/Istanbul', 'Asia/Singapore', 'Africa/Casablanca', 'Australia/Sydney'),
|
||||
'default' => 'Europe/Paris',
|
||||
'value' => 'Europe/Paris',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
);
|
||||
|
||||
public function IsProperty($sPropCode)
|
||||
@@ -333,7 +432,7 @@ class Config
|
||||
'application/menunode.class.inc.php',
|
||||
'application/user.preferences.class.inc.php',
|
||||
'application/audit.rule.class.inc.php',
|
||||
// Romain - That's dirty, because those 3 classes are in fact part of the core
|
||||
// Romain - That's dirty, because those classes are in fact part of the core
|
||||
// but I needed those classes to be derived from cmdbAbstractObject
|
||||
// (to be managed via the GUI) and this class in not really known from
|
||||
// the core, PLUS I needed the includes to be there also for the setup
|
||||
@@ -341,6 +440,7 @@ class Config
|
||||
'core/event.class.inc.php',
|
||||
'core/action.class.inc.php',
|
||||
'core/trigger.class.inc.php',
|
||||
'synchro/synchrodatasource.class.inc.php',
|
||||
);
|
||||
$this->m_aDataModels = array();
|
||||
$this->m_aWebServiceCategories = array(
|
||||
@@ -368,6 +468,10 @@ class Config
|
||||
'dictionaries/tr.dictionary.itop.core.php', // Support for Turkish
|
||||
'dictionaries/zh.dictionary.itop.ui.php', // Support for Chinese
|
||||
'dictionaries/zh.dictionary.itop.core.php', // Support for Chinese
|
||||
'dictionaries/it.dictionary.itop.ui.php', // Support for Italian
|
||||
'dictionaries/it.dictionary.itop.core.php', // Support for Italian
|
||||
'dictionaries/hu.dictionary.itop.ui.php', // Support for Hungarian
|
||||
'dictionaries/hu.dictionary.itop.core.php', // Support for Hungarian
|
||||
);
|
||||
foreach($this->m_aSettings as $sPropCode => $aSettingInfo)
|
||||
{
|
||||
@@ -441,7 +545,7 @@ class Config
|
||||
if (strlen($sNoise) > 0)
|
||||
{
|
||||
// Note: sNoise is an html output, but so far it was ok for me (e.g. showing the entire call stack)
|
||||
throw new ConfigException('Syntax error in configuration file', array('file' => $sConfigFile, 'error' => '<tt>'.htmlentities($sNoise).'</tt>'));
|
||||
throw new ConfigException('Syntax error in configuration file', array('file' => $sConfigFile, 'error' => '<tt>'.htmlentities($sNoise, ENT_QUOTES, 'UTF-8').'</tt>'));
|
||||
}
|
||||
|
||||
if (!isset($MySettings) || !is_array($MySettings))
|
||||
@@ -943,7 +1047,7 @@ class Config
|
||||
$sSeenAs = $aSettingInfo['value'] ? '1' : '0';
|
||||
break;
|
||||
default:
|
||||
$sSeenAs = "'".$aSettingInfo['value']."'";
|
||||
$sSeenAs = "'".addslashes($aSettingInfo['value'])."'";
|
||||
}
|
||||
fwrite($hFile, "\t'$sPropCode' => $sSeenAs,\n");
|
||||
}
|
||||
|
||||
@@ -40,6 +40,8 @@ define('evTEXTQUAL', 3); // used for escaping as well
|
||||
define('evOTHERCHAR', 4);
|
||||
define('evEND', 5);
|
||||
|
||||
define('NULL_VALUE', '<NULL>');
|
||||
|
||||
|
||||
/**
|
||||
* CSVParser
|
||||
@@ -82,6 +84,10 @@ class CSVParser
|
||||
{
|
||||
$sCell = $this->m_sCurrCell;
|
||||
}
|
||||
if ($sCell == NULL_VALUE)
|
||||
{
|
||||
$sCell = null;
|
||||
}
|
||||
|
||||
if (!is_null($aFieldMap))
|
||||
{
|
||||
@@ -178,6 +184,7 @@ class CSVParser
|
||||
{
|
||||
if ($i == $iDataLength)
|
||||
{
|
||||
$c = null;
|
||||
$iEvent = evEND;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
*/
|
||||
|
||||
require_once('metamodel.class.php');
|
||||
require_once('deletionplan.class.inc.php');
|
||||
|
||||
|
||||
/**
|
||||
* A persistent object, as defined by the metamodel
|
||||
@@ -34,27 +36,37 @@ abstract class DBObject
|
||||
{
|
||||
private static $m_aMemoryObjectsByClass = array();
|
||||
|
||||
private static $m_aBulkInsertItems = array(); // class => array of ('table' => array of (array of <sql_value>))
|
||||
private static $m_aBulkInsertCols = array(); // class => array of ('table' => array of <sql_column>)
|
||||
private static $m_bBulkInsert = false;
|
||||
|
||||
private $m_bIsInDB = false; // true IIF the object is mapped to a DB record
|
||||
private $m_iKey = null;
|
||||
private $m_aCurrValues = array();
|
||||
protected $m_aOrigValues = array();
|
||||
|
||||
protected $m_aExtendedData = null;
|
||||
|
||||
private $m_bDirty = false; // Means: "a modification is ongoing"
|
||||
// The object may have incorrect external keys, then any attempt of reload must be avoided
|
||||
private $m_bCheckStatus = null; // Means: the object has been verified and is consistent with integrity rules
|
||||
// if null, then the check has to be performed again to know the status
|
||||
protected $m_bSecurityIssue = null;
|
||||
protected $m_aCheckIssues = null;
|
||||
protected $m_aDeleteIssues = null;
|
||||
|
||||
protected $m_aAsArgs = null; // The current object as a standard argument (cache)
|
||||
|
||||
private $m_bFullyLoaded = false; // Compound objects can be partially loaded
|
||||
private $m_aLoadedAtt = array(); // Compound objects can be partially loaded, array of sAttCode
|
||||
protected $m_oMasterReplicaSet = null; // Set of SynchroReplica related to this object
|
||||
|
||||
// Use the MetaModel::NewObject to build an object (do we have to force it?)
|
||||
public function __construct($aRow = null, $sClassAlias = '')
|
||||
public function __construct($aRow = null, $sClassAlias = '', $aExtendedDataSpec = null)
|
||||
{
|
||||
if (!empty($aRow))
|
||||
{
|
||||
$this->FromRow($aRow, $sClassAlias);
|
||||
$this->FromRow($aRow, $sClassAlias, $aExtendedDataSpec);
|
||||
$this->m_bFullyLoaded = $this->IsFullyLoaded();
|
||||
return;
|
||||
}
|
||||
@@ -98,12 +110,13 @@ abstract class DBObject
|
||||
// Returns an Id for memory objects
|
||||
static protected function GetNextTempId($sClass)
|
||||
{
|
||||
if (!array_key_exists($sClass, self::$m_aMemoryObjectsByClass))
|
||||
$sRootClass = MetaModel::GetRootClass($sClass);
|
||||
if (!array_key_exists($sRootClass, self::$m_aMemoryObjectsByClass))
|
||||
{
|
||||
self::$m_aMemoryObjectsByClass[$sClass] = 0;
|
||||
self::$m_aMemoryObjectsByClass[$sRootClass] = 0;
|
||||
}
|
||||
self::$m_aMemoryObjectsByClass[$sClass]++;
|
||||
return (- self::$m_aMemoryObjectsByClass[$sClass]);
|
||||
self::$m_aMemoryObjectsByClass[$sRootClass]++;
|
||||
return (- self::$m_aMemoryObjectsByClass[$sRootClass]);
|
||||
}
|
||||
|
||||
public function __toString()
|
||||
@@ -144,7 +157,7 @@ abstract class DBObject
|
||||
protected function Reload()
|
||||
{
|
||||
assert($this->m_bIsInDB);
|
||||
$aRow = MetaModel::MakeSingleRow(get_class($this), $this->m_iKey);
|
||||
$aRow = MetaModel::MakeSingleRow(get_class($this), $this->m_iKey, false/*, $this->m_bAllowAllData*/);
|
||||
if (empty($aRow))
|
||||
{
|
||||
throw new CoreException("Failed to reload object of class '".get_class($this)."', id = ".$this->m_iKey);
|
||||
@@ -181,7 +194,7 @@ abstract class DBObject
|
||||
$this->m_bFullyLoaded = true;
|
||||
}
|
||||
|
||||
protected function FromRow($aRow, $sClassAlias = '')
|
||||
protected function FromRow($aRow, $sClassAlias = '', $aExtendedDataSpec = null)
|
||||
{
|
||||
if (strlen($sClassAlias) == 0)
|
||||
{
|
||||
@@ -204,15 +217,20 @@ abstract class DBObject
|
||||
// #@# Bug ?
|
||||
throw new CoreException("Missing key for class '".get_class($this)."'");
|
||||
}
|
||||
else
|
||||
|
||||
$iPKey = $aRow[$sKeyField];
|
||||
if (!self::IsValidPKey($iPKey))
|
||||
{
|
||||
$iPKey = $aRow[$sKeyField];
|
||||
if (!self::IsValidPKey($iPKey))
|
||||
if (is_null($iPKey))
|
||||
{
|
||||
throw new CoreWarning("An object id must be an integer value ($iPKey)");
|
||||
throw new CoreException("Missing object id in query result (found null)");
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new CoreException("An object id must be an integer value ($iPKey)");
|
||||
}
|
||||
$this->m_iKey = $iPKey;
|
||||
}
|
||||
$this->m_iKey = $iPKey;
|
||||
|
||||
// Build the object from an array of "attCode"=>"value")
|
||||
//
|
||||
@@ -230,6 +248,7 @@ abstract class DBObject
|
||||
// Take care: the function isset will return false in case the value is null,
|
||||
// which is something that could happen on open joins
|
||||
$sAttRef = $sClassAlias.$sAttCode;
|
||||
|
||||
if (array_key_exists($sAttRef, $aRow))
|
||||
{
|
||||
$value = $oAttDef->FromSQLToValue($aRow, $sAttRef);
|
||||
@@ -244,6 +263,20 @@ abstract class DBObject
|
||||
$bFullyLoaded = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Load extended data
|
||||
if ($aExtendedDataSpec != null)
|
||||
{
|
||||
$aExtendedDataSpec['table'];
|
||||
foreach($aExtendedDataSpec['fields'] as $sColumn)
|
||||
{
|
||||
$sColRef = $sClassAlias.'_extdata_'.$sColumn;
|
||||
if (array_key_exists($sColRef, $aRow))
|
||||
{
|
||||
$this->m_aExtendedData[$sColumn] = $aRow[$sColRef];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $bFullyLoaded;
|
||||
}
|
||||
|
||||
@@ -310,7 +343,7 @@ abstract class DBObject
|
||||
}
|
||||
}
|
||||
|
||||
$realvalue = $oAttDef->MakeRealValue($value);
|
||||
$realvalue = $oAttDef->MakeRealValue($value, $this);
|
||||
$this->m_aCurrValues[$sAttCode] = $realvalue;
|
||||
|
||||
// The object has changed, reset caches
|
||||
@@ -321,6 +354,12 @@ abstract class DBObject
|
||||
$this->RegisterAsDirty();
|
||||
}
|
||||
|
||||
public function GetLabel($sAttCode)
|
||||
{
|
||||
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
|
||||
return $oAttDef->GetLabel();
|
||||
}
|
||||
|
||||
public function Get($sAttCode)
|
||||
{
|
||||
if (!array_key_exists($sAttCode, MetaModel::ListAttributeDefs(get_class($this))))
|
||||
@@ -332,7 +371,12 @@ abstract class DBObject
|
||||
// #@# non-scalar attributes.... handle that differently
|
||||
$this->Reload();
|
||||
}
|
||||
return $this->m_aCurrValues[$sAttCode];
|
||||
$value = $this->m_aCurrValues[$sAttCode];
|
||||
if ($value instanceof DBObjectSet)
|
||||
{
|
||||
$value->Rewind();
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
|
||||
public function GetOriginal($sAttCode)
|
||||
@@ -344,6 +388,14 @@ abstract class DBObject
|
||||
return $this->m_aOrigValues[$sAttCode];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns data loaded by the mean of a dynamic and explicit JOIN
|
||||
*/
|
||||
public function GetExtendedData()
|
||||
{
|
||||
return $this->m_aExtendedData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the value of an external field by (re)loading the object
|
||||
* corresponding to the external key and getting the value from it
|
||||
@@ -366,23 +418,25 @@ abstract class DBObject
|
||||
}
|
||||
}
|
||||
|
||||
// Compute scalar attributes that depend on any other type of attribute
|
||||
public function DoComputeValues()
|
||||
public function ComputeValues()
|
||||
{
|
||||
if (is_callable(array($this, 'ComputeValues')))
|
||||
}
|
||||
|
||||
// Compute scalar attributes that depend on any other type of attribute
|
||||
final public function DoComputeValues()
|
||||
{
|
||||
// TODO - use a flag rather than checking the call stack -> this will certainly accelerate things
|
||||
|
||||
// First check that we are not currently computing the fields
|
||||
// (yes, we need to do some things like Set/Get to compute the fields which will in turn trigger the update...)
|
||||
foreach (debug_backtrace() as $aCallInfo)
|
||||
{
|
||||
// First check that we are not currently computing the fields
|
||||
// (yes, we need to do some things like Set/Get to compute the fields which will in turn trigger the update...)
|
||||
foreach (debug_backtrace() as $aCallInfo)
|
||||
{
|
||||
if (!array_key_exists("class", $aCallInfo)) continue;
|
||||
if ($aCallInfo["class"] != get_class($this)) continue;
|
||||
if ($aCallInfo["function"] != "ComputeValues") continue;
|
||||
return; //skip!
|
||||
}
|
||||
|
||||
$this->ComputeValues();
|
||||
if (!array_key_exists("class", $aCallInfo)) continue;
|
||||
if ($aCallInfo["class"] != get_class($this)) continue;
|
||||
if ($aCallInfo["function"] != "ComputeValues") continue;
|
||||
return; //skip!
|
||||
}
|
||||
$this->ComputeValues();
|
||||
}
|
||||
|
||||
public function GetAsHTML($sAttCode)
|
||||
@@ -390,22 +444,13 @@ abstract class DBObject
|
||||
$sClass = get_class($this);
|
||||
$oAtt = MetaModel::GetAttributeDef($sClass, $sAttCode);
|
||||
|
||||
$aExtKeyFriends = MetaModel::GetExtKeyFriends($sClass, $sAttCode);
|
||||
if (count($aExtKeyFriends) > 0)
|
||||
if ($oAtt->IsExternalKey(EXTKEY_ABSOLUTE))
|
||||
{
|
||||
// This attribute is an ext key (in this class or in another class)
|
||||
// The corresponding value is an id of the remote object
|
||||
// Let's try to use the corresponding external fields for a sexy display
|
||||
|
||||
$aAvailableFields = array();
|
||||
foreach ($aExtKeyFriends as $sDispAttCode => $oExtField)
|
||||
{
|
||||
// $aAvailableFields[$oExtField->GetExtAttCode()] = $oExtField->GetAsHTML($this->Get($oExtField->GetCode()));
|
||||
$aAvailableFields[$oExtField->GetExtAttCode()] = $this->Get($oExtField->GetCode());
|
||||
}
|
||||
|
||||
//return $this->Get($sAttCode.'_friendlyname');
|
||||
$sTargetClass = $oAtt->GetTargetClass(EXTKEY_ABSOLUTE);
|
||||
return $this->MakeHyperLink($sTargetClass, $this->Get($sAttCode), $aAvailableFields);
|
||||
$iTargetKey = $this->Get($sAttCode);
|
||||
$sLabel = $this->Get($sAttCode.'_friendlyname');
|
||||
return $this->MakeHyperLink($sTargetClass, $iTargetKey, $sLabel);
|
||||
}
|
||||
|
||||
// That's a standard attribute (might be an ext field or a direct field, etc.)
|
||||
@@ -437,23 +482,7 @@ abstract class DBObject
|
||||
}
|
||||
else
|
||||
{
|
||||
$aAvailableFields = array();
|
||||
// retrieve the "external fields" linked to this external key
|
||||
foreach (MetaModel::GetExternalFields(get_class($this), $sAttCode) as $oExtField)
|
||||
{
|
||||
$aAvailableFields[$oExtField->GetExtAttCode()] = $oExtField->GetAsHTML($this->Get($oExtField->GetCode()));
|
||||
}
|
||||
// Use the "name" of the target class as the label of the hyperlink
|
||||
// unless it's not available in the external fields...
|
||||
$sExtClassNameAtt = MetaModel::GetNameAttributeCode($sTargetClass);
|
||||
if (isset($aAvailableFields[$sExtClassNameAtt]))
|
||||
{
|
||||
$sEditValue = $aAvailableFields[$sExtClassNameAtt];
|
||||
}
|
||||
else
|
||||
{
|
||||
$sEditValue = implode(' / ', $aAvailableFields);
|
||||
}
|
||||
$sEditValue = $this->Get($sAttCode.'_friendlyname');
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -466,26 +495,89 @@ abstract class DBObject
|
||||
public function GetAsXML($sAttCode)
|
||||
{
|
||||
$oAtt = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
|
||||
return $oAtt->GetAsXML($this->Get($sAttCode));
|
||||
return $oAtt->GetAsXML($this->Get($sAttCode), $this);
|
||||
}
|
||||
|
||||
public function GetAsCSV($sAttCode, $sSeparator = ',', $sTextQualifier = '"')
|
||||
{
|
||||
$oAtt = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
|
||||
return $oAtt->GetAsCSV($this->Get($sAttCode), $sSeparator, $sTextQualifier);
|
||||
return $oAtt->GetAsCSV($this->Get($sAttCode), $sSeparator, $sTextQualifier, $this);
|
||||
}
|
||||
|
||||
protected static function MakeHyperLink($sObjClass, $sObjKey, $aAvailableFields)
|
||||
public function GetOriginalAsHTML($sAttCode)
|
||||
{
|
||||
if ($sObjKey == 0) return '<em>undefined</em>';
|
||||
$oAtt = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
|
||||
return $oAtt->GetAsHTML($this->GetOriginal($sAttCode), $this);
|
||||
}
|
||||
|
||||
return MetaModel::GetName($sObjClass)."::$sObjKey";
|
||||
public function GetOriginalAsXML($sAttCode)
|
||||
{
|
||||
$oAtt = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
|
||||
return $oAtt->GetAsXML($this->GetOriginal($sAttCode), $this);
|
||||
}
|
||||
|
||||
public function GetOriginalAsCSV($sAttCode, $sSeparator = ',', $sTextQualifier = '"')
|
||||
{
|
||||
$oAtt = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
|
||||
return $oAtt->GetAsCSV($this->GetOriginal($sAttCode), $sSeparator, $sTextQualifier, $this);
|
||||
}
|
||||
|
||||
protected static function MakeHyperLink($sObjClass, $sObjKey, $sLabel = '')
|
||||
{
|
||||
if ($sObjKey <= 0) return '<em>'.Dict::S('UI:UndefinedObject').'</em>'; // Objects built in memory have negative IDs
|
||||
|
||||
$oAppContext = new ApplicationContext();
|
||||
$sPage = self::ComputeUIPage($sObjClass);
|
||||
$sAbsoluteUrl = utils::GetAbsoluteUrlPath();
|
||||
|
||||
// Safety net
|
||||
//
|
||||
if (empty($sLabel))
|
||||
{
|
||||
// If the object if not issued from a query but constructed programmatically
|
||||
// the label may be empty. In this case run a query to get the object's friendly name
|
||||
$oTmpObj = MetaModel::GetObject($sObjClass, $sObjKey);
|
||||
$sLabel = $oTmpObj->GetName();
|
||||
//$sLabel = MetaModel::GetName($sObjClass)." #$sObjKey";
|
||||
}
|
||||
$sHint = MetaModel::GetName($sObjClass)."::$sObjKey";
|
||||
return "<a href=\"{$sAbsoluteUrl}{$sPage}?operation=details&class=$sObjClass&id=$sObjKey&".$oAppContext->GetForLink()."\" title=\"$sHint\">$sLabel</a>";
|
||||
}
|
||||
|
||||
public function GetHyperlink()
|
||||
{
|
||||
$aAvailableFields[MetaModel::GetNameAttributeCode(get_class($this))] = $this->GetName();
|
||||
return $this->MakeHyperLink(get_class($this), $this->GetKey(), $aAvailableFields);
|
||||
if ($this->IsNew()) return '<em>'.Dict::S('UI:UndefinedObject').'</em>'; // Objects built in memory have negative IDs
|
||||
|
||||
$oAppContext = new ApplicationContext();
|
||||
$sPage = $this->GetUIPage();
|
||||
$sAbsoluteUrl = utils::GetAbsoluteUrlPath();
|
||||
$sObjClass = get_class($this);
|
||||
$sObjKey = $this->GetKey();
|
||||
|
||||
$sLabel = $this->GetName();
|
||||
$sHint = MetaModel::GetName($sObjClass)."::$sObjKey";
|
||||
return "<a href=\"{$sAbsoluteUrl}{$sPage}?operation=details&class=$sObjClass&id=$sObjKey&".$oAppContext->GetForLink()."\" title=\"$sHint\">$sLabel</a>";
|
||||
}
|
||||
|
||||
public static function ComputeUIPage($sClass)
|
||||
{
|
||||
static $aUIPagesCache = array(); // Cache to store the php page used to display each class of object
|
||||
if (!isset($aUIPagesCache[$sClass]))
|
||||
{
|
||||
$UIPage = false;
|
||||
if (is_callable("$sClass::GetUIPage"))
|
||||
{
|
||||
$UIPage = eval("return $sClass::GetUIPage();"); // May return false in case of error
|
||||
}
|
||||
$aUIPagesCache[$sClass] = $UIPage === false ? './UI.php' : $UIPage;
|
||||
}
|
||||
$sPage = $aUIPagesCache[$sClass];
|
||||
return $sPage;
|
||||
}
|
||||
|
||||
public static function GetUIPage()
|
||||
{
|
||||
return 'UI.php';
|
||||
}
|
||||
|
||||
|
||||
@@ -524,15 +616,23 @@ abstract class DBObject
|
||||
|
||||
public function GetName()
|
||||
{
|
||||
$sNameAttCode = MetaModel::GetNameAttributeCode(get_class($this));
|
||||
if (empty($sNameAttCode))
|
||||
{
|
||||
return $this->m_iKey;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $this->Get($sNameAttCode);
|
||||
$aNameSpec = MetaModel::GetNameSpec(get_class($this));
|
||||
$sFormat = $aNameSpec[0];
|
||||
$aAttributes = $aNameSpec[1];
|
||||
|
||||
$aValues = array();
|
||||
foreach ($aAttributes as $sAttCode)
|
||||
{
|
||||
if (empty($sAttCode))
|
||||
{
|
||||
$aValues[] = $this->m_iKey;
|
||||
}
|
||||
else
|
||||
{
|
||||
$aValues[] = $this->Get($sAttCode);
|
||||
}
|
||||
}
|
||||
return vsprintf($sFormat, $aValues);
|
||||
}
|
||||
|
||||
public function GetState()
|
||||
@@ -581,7 +681,7 @@ abstract class DBObject
|
||||
* @param string $sAttCode The code of the attribute
|
||||
* @return integer Flags: the binary combination of the flags applicable to this attribute
|
||||
*/
|
||||
public function GetAttributeFlags($sAttCode)
|
||||
public function GetAttributeFlags($sAttCode, &$aReasons = array())
|
||||
{
|
||||
$iFlags = 0; // By default (if no life cycle) no flag at all
|
||||
$sStateAttCode = MetaModel::GetStateAttributeCode(get_class($this));
|
||||
@@ -589,7 +689,9 @@ abstract class DBObject
|
||||
{
|
||||
$iFlags = MetaModel::GetAttributeFlags(get_class($this), $this->Get($sStateAttCode), $sAttCode);
|
||||
}
|
||||
return $iFlags;
|
||||
$aReasons = array();
|
||||
$iSynchroFlags = $this->GetSynchroReplicaFlags($sAttCode, $aReasons);
|
||||
return $iFlags | $iSynchroFlags; // Combine both sets of flags
|
||||
}
|
||||
|
||||
// check if the given (or current) value is suitable for the attribute
|
||||
@@ -673,6 +775,7 @@ abstract class DBObject
|
||||
$this->DoComputeValues();
|
||||
|
||||
$this->m_aCheckIssues = array();
|
||||
$aChanges = $this->ListChanges();
|
||||
|
||||
foreach(MetaModel::ListAttributeDefs(get_class($this)) as $sAttCode=>$oAttDef)
|
||||
{
|
||||
@@ -695,6 +798,27 @@ abstract class DBObject
|
||||
// $res contains the error description
|
||||
$this->m_aCheckIssues[] = "Consistency rules not followed: $res";
|
||||
}
|
||||
|
||||
// Synchronization: are we attempting to modify an attribute for which an external source is master?
|
||||
//
|
||||
if ($this->m_bIsInDB && $this->InSyncScope() && (count($aChanges) > 0))
|
||||
{
|
||||
foreach($aChanges as $sAttCode => $value)
|
||||
{
|
||||
$iFlags = $this->GetSynchroReplicaFlags($sAttCode, $aReasons);
|
||||
if ($iFlags & OPT_ATT_SLAVE)
|
||||
{
|
||||
// Note: $aReasonInfo['name'] could be reported (the task owning the attribute)
|
||||
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
|
||||
$sAttLabel = $oAttDef->GetLabel();
|
||||
foreach($aReasons as $aReasonInfo)
|
||||
{
|
||||
// Todo: associate the attribute code with the error
|
||||
$this->m_aCheckIssues[] = Dict::Format('UI:AttemptingToSetASlaveAttribute_Name', $sAttLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final public function CheckToWrite()
|
||||
@@ -717,16 +841,71 @@ abstract class DBObject
|
||||
$this->m_bCheckStatus = false;
|
||||
}
|
||||
}
|
||||
return array($this->m_bCheckStatus, $this->m_aCheckIssues);
|
||||
return array($this->m_bCheckStatus, $this->m_aCheckIssues, $this->m_bSecurityIssue);
|
||||
}
|
||||
|
||||
// check if it is allowed to delete the existing object from the database
|
||||
// a displayable error is returned
|
||||
public function CheckToDelete()
|
||||
protected function DoCheckToDelete(&$oDeletionPlan)
|
||||
{
|
||||
return true;
|
||||
$this->m_aDeleteIssues = array(); // Ok
|
||||
|
||||
if ($this->InSyncScope())
|
||||
{
|
||||
$oReplicaSet = $this->GetMasterReplica();
|
||||
if ($oReplicaSet->Count() > 0)
|
||||
{
|
||||
while($aData = $oReplicaSet->FetchAssoc())
|
||||
{
|
||||
$oDataSource = $aData['datasource'];
|
||||
$oReplica = $aData['replica'];
|
||||
|
||||
$oDeletionPlan->AddToDelete($oReplica, DEL_SILENT);
|
||||
|
||||
if ($oDataSource->GetKey() == SynchroDataSource::GetCurrentTaskId())
|
||||
{
|
||||
// The current task has the right to delete the object
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($oReplica->Get('status_dest_creator') != 1)
|
||||
{
|
||||
// The object is not owned by the task
|
||||
continue;
|
||||
}
|
||||
|
||||
$sLink = $oDataSource->GetName();
|
||||
$sUserDeletePolicy = $oDataSource->Get('user_delete_policy');
|
||||
switch($sUserDeletePolicy)
|
||||
{
|
||||
case 'nobody':
|
||||
$this->m_aDeleteIssues[] = Dict::Format('Core:Synchro:TheObjectCannotBeDeletedByUser_Source', $sLink);
|
||||
break;
|
||||
|
||||
case 'administrators':
|
||||
if (!UserRights::IsAdministrator())
|
||||
{
|
||||
$this->m_aDeleteIssues[] = Dict::Format('Core:Synchro:TheObjectCannotBeDeletedByUser_Source', $sLink);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'everybody':
|
||||
default:
|
||||
// Ok
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final public function CheckToDelete(&$oDeletionPlan)
|
||||
{
|
||||
$this->MakeDeletionPlan($oDeletionPlan);
|
||||
$oDeletionPlan->ComputeResults();
|
||||
return (!$oDeletionPlan->FoundStopper());
|
||||
}
|
||||
|
||||
protected function ListChangedValues(array $aProposal)
|
||||
{
|
||||
$aDelta = array();
|
||||
@@ -739,9 +918,9 @@ abstract class DBObject
|
||||
}
|
||||
elseif(is_object($proposedValue))
|
||||
{
|
||||
$oLinkAttDef = MetaModel::GetAttributeDef(get_class($this), $sAtt);
|
||||
// The value is an object, the comparison is not strict
|
||||
// #@# todo - should be even less strict => add verb on AttributeDefinition: Compare($a, $b)
|
||||
if ($this->m_aOrigValues[$sAtt] != $proposedValue)
|
||||
if (!$oLinkAttDef->Equals($proposedValue, $this->m_aOrigValues[$sAtt]))
|
||||
{
|
||||
$aDelta[$sAtt] = $proposedValue;
|
||||
}
|
||||
@@ -766,16 +945,58 @@ abstract class DBObject
|
||||
// Returns an array of attname => currentvalue
|
||||
public function ListChanges()
|
||||
{
|
||||
return $this->ListChangedValues($this->m_aCurrValues);
|
||||
if ($this->m_bIsInDB)
|
||||
{
|
||||
return $this->ListChangedValues($this->m_aCurrValues);
|
||||
}
|
||||
else
|
||||
{
|
||||
return $this->m_aCurrValues;
|
||||
}
|
||||
}
|
||||
|
||||
// Tells whether or not an object was modified
|
||||
// Tells whether or not an object was modified since last read (ie: does it differ from the DB ?)
|
||||
public function IsModified()
|
||||
{
|
||||
$aChanges = $this->ListChanges();
|
||||
return (count($aChanges) != 0);
|
||||
}
|
||||
|
||||
public function Equals($oSibling)
|
||||
{
|
||||
if (get_class($oSibling) != get_class($this))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if ($this->GetKey() != $oSibling->GetKey())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if ($this->m_bIsInDB)
|
||||
{
|
||||
// If one has changed, then consider them as being different
|
||||
if ($this->IsModified() || $oSibling->IsModified())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Todo - implement this case (loop on every attribute)
|
||||
//foreach(MetaModel::ListAttributeDefs(get_class($this) as $sAttCode => $oAttDef)
|
||||
//{
|
||||
//if (!isset($this->m_CurrentValues[$sAttCode])) continue;
|
||||
//if (!isset($this->m_CurrentValues[$sAttCode])) continue;
|
||||
//if (!$oAttDef->Equals($this->m_CurrentValues[$sAttCode], $oSibling->m_CurrentValues[$sAttCode]))
|
||||
//{
|
||||
//return false;
|
||||
//}
|
||||
//}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// used both by insert/update
|
||||
private function DBWriteLinks()
|
||||
{
|
||||
@@ -814,6 +1035,35 @@ abstract class DBObject
|
||||
}
|
||||
}
|
||||
|
||||
// Note: this is experimental - it was designed to speed up the setup of iTop
|
||||
// Known limitations:
|
||||
// - does not work with multi-table classes (issue with the unique id to maintain in several tables)
|
||||
// - the id of the object is not updated
|
||||
static public final function BulkInsertStart()
|
||||
{
|
||||
self::$m_bBulkInsert = true;
|
||||
}
|
||||
|
||||
static public final function BulkInsertFlush()
|
||||
{
|
||||
if (!self::$m_bBulkInsert) return;
|
||||
|
||||
foreach(self::$m_aBulkInsertCols as $sClass => $aTables)
|
||||
{
|
||||
foreach ($aTables as $sTable => $sColumns)
|
||||
{
|
||||
$sValues = implode(', ', self::$m_aBulkInsertItems[$sClass][$sTable]);
|
||||
$sInsertSQL = "INSERT INTO `$sTable` ($sColumns) VALUES $sValues";
|
||||
$iNewKey = CMDBSource::InsertInto($sInsertSQL);
|
||||
}
|
||||
}
|
||||
|
||||
// Reset
|
||||
self::$m_aBulkInsertItems = array();
|
||||
self::$m_aBulkInsertCols = array();
|
||||
self::$m_bBulkInsert = false;
|
||||
}
|
||||
|
||||
private function DBInsertSingleTable($sTableClass)
|
||||
{
|
||||
$sTable = MetaModel::DBGetTable($sTableClass);
|
||||
@@ -847,15 +1097,27 @@ abstract class DBObject
|
||||
|
||||
if (count($aValuesToWrite) == 0) return false;
|
||||
|
||||
$sInsertSQL = "INSERT INTO `$sTable` (".join(",", $aFieldsToWrite).") VALUES (".join(", ", $aValuesToWrite).")";
|
||||
|
||||
if (MetaModel::DBIsReadOnly())
|
||||
{
|
||||
$iNewKey = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
$iNewKey = CMDBSource::InsertInto($sInsertSQL);
|
||||
if (self::$m_bBulkInsert)
|
||||
{
|
||||
if (!isset(self::$m_aBulkInsertCols[$sClass][$sTable]))
|
||||
{
|
||||
self::$m_aBulkInsertCols[$sClass][$sTable] = implode(', ', $aFieldsToWrite);
|
||||
}
|
||||
self::$m_aBulkInsertItems[$sClass][$sTable][] = '('.implode (', ', $aValuesToWrite).')';
|
||||
|
||||
$iNewKey = 999999; // TODO - compute next id....
|
||||
}
|
||||
else
|
||||
{
|
||||
$sInsertSQL = "INSERT INTO `$sTable` (".join(",", $aFieldsToWrite).") VALUES (".join(", ", $aValuesToWrite).")";
|
||||
$iNewKey = CMDBSource::InsertInto($sInsertSQL);
|
||||
}
|
||||
}
|
||||
// Note that it is possible to have a key defined here, and the autoincrement expected, this is acceptable in a non root class
|
||||
if (empty($this->m_iKey))
|
||||
@@ -901,7 +1163,8 @@ abstract class DBObject
|
||||
list($bRes, $aIssues) = $this->CheckToWrite();
|
||||
if (!$bRes)
|
||||
{
|
||||
throw new CoreException("Object not following integrity rules - it will not be written into the DB", array('class' => $sClass, 'id' => $this->GetKey(), 'issues' => $aIssues));
|
||||
$sIssues = implode(', ', $aIssues);
|
||||
throw new CoreException("Object not following integrity rules", array('issues' => $sIssues, 'class' => get_class($this), 'id' => $this->GetKey()));
|
||||
}
|
||||
|
||||
// First query built upon on the root class, because the ID must be created first
|
||||
@@ -998,7 +1261,8 @@ abstract class DBObject
|
||||
list($bRes, $aIssues) = $this->CheckToWrite();
|
||||
if (!$bRes)
|
||||
{
|
||||
throw new CoreException("Object not following integrity rules - it will not be written into the DB", array('class' => get_class($this), 'id' => $this->GetKey(), 'issues' => $aIssues));
|
||||
$sIssues = implode(', ', $aIssues);
|
||||
throw new CoreException("Object not following integrity rules", array('issues' => $sIssues, 'class' => get_class($this), 'id' => $this->GetKey()));
|
||||
}
|
||||
|
||||
$bHasANewExternalKeyValue = false;
|
||||
@@ -1054,18 +1318,29 @@ abstract class DBObject
|
||||
}
|
||||
}
|
||||
|
||||
// Delete a record
|
||||
public function DBDelete()
|
||||
private function DBDeleteSingleTable($sTableClass)
|
||||
{
|
||||
$oFilter = new DBObjectSearch(get_class($this));
|
||||
$oFilter->AddCondition('id', $this->m_iKey, '=');
|
||||
$sTable = MetaModel::DBGetTable($sTableClass);
|
||||
// Abstract classes or classes having no specific attribute do not have an associated table
|
||||
if ($sTable == '') return;
|
||||
|
||||
$sPKField = '`'.MetaModel::DBGetKey($sTableClass).'`';
|
||||
$sKey = CMDBSource::Quote($this->m_iKey);
|
||||
|
||||
$sDeleteSQL = "DELETE FROM `$sTable` WHERE $sPKField = $sKey";
|
||||
CMDBSource::DeleteFrom($sDeleteSQL);
|
||||
}
|
||||
|
||||
protected function DBDeleteSingleObject()
|
||||
{
|
||||
$this->OnDelete();
|
||||
|
||||
$sSQL = MetaModel::MakeDeleteQuery($oFilter);
|
||||
if (!MetaModel::DBIsReadOnly())
|
||||
{
|
||||
CMDBSource::Query($sSQL);
|
||||
foreach(MetaModel::EnumParentClasses(get_class($this), ENUM_PARENT_CLASSES_ALL) as $sParentClass)
|
||||
{
|
||||
$this->DBDeleteSingleTable($sParentClass);
|
||||
}
|
||||
}
|
||||
|
||||
$this->AfterDelete();
|
||||
@@ -1074,9 +1349,53 @@ abstract class DBObject
|
||||
$this->m_iKey = null;
|
||||
}
|
||||
|
||||
public function DBDeleteTracked(CMDBChange $oVoid)
|
||||
// Delete an object... and guarantee data integrity
|
||||
//
|
||||
public function DBDelete(&$oDeletionPlan = null)
|
||||
{
|
||||
$this->DBDelete();
|
||||
if (is_null($oDeletionPlan))
|
||||
{
|
||||
$oDeletionPlan = new DeletionPlan();
|
||||
}
|
||||
$this->MakeDeletionPlan($oDeletionPlan);
|
||||
$oDeletionPlan->ComputeResults();
|
||||
|
||||
if ($oDeletionPlan->FoundStopper())
|
||||
{
|
||||
$aIssues = $oDeletionPlan->GetIssues();
|
||||
throw new DeleteException('Found issue(s)', array('target_class' => get_class($this), 'target_id' => $this->GetKey(), 'issues' => implode(', ', $aIssues)));
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ($oDeletionPlan->ListDeletes() as $sClass => $aToDelete)
|
||||
{
|
||||
foreach ($aToDelete as $iId => $aData)
|
||||
{
|
||||
$oToDelete = $aData['to_delete'];
|
||||
$oToDelete->DBDeleteSingleObject();
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($oDeletionPlan->ListUpdates() as $sClass => $aToUpdate)
|
||||
{
|
||||
foreach ($aToUpdate as $iId => $aData)
|
||||
{
|
||||
$oToUpdate = $aData['to_reset'];
|
||||
foreach ($aData['attributes'] as $sRemoteExtKey => $aRemoteAttDef)
|
||||
{
|
||||
$oToUpdate->Set($sRemoteExtKey, 0);
|
||||
$oToUpdate->DBUpdate();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $oDeletionPlan;
|
||||
}
|
||||
|
||||
public function DBDeleteTracked(CMDBChange $oVoid, $bSkipStrongSecurity = null, &$oDeletionPlan = null)
|
||||
{
|
||||
$this->DBDelete($oDeletionPlan);
|
||||
}
|
||||
|
||||
public function EnumTransitions()
|
||||
@@ -1250,7 +1569,7 @@ abstract class DBObject
|
||||
return $aResults;
|
||||
}
|
||||
|
||||
public function GetReferencingObjects()
|
||||
public function GetReferencingObjects($bAllowAllData = false)
|
||||
{
|
||||
$aDependentObjects = array();
|
||||
$aRererencingMe = MetaModel::EnumReferencingClasses(get_class($this));
|
||||
@@ -1263,6 +1582,10 @@ abstract class DBObject
|
||||
|
||||
$oSearch = new DBObjectSearch($sRemoteClass);
|
||||
$oSearch->AddCondition($sExtKeyAttCode, $this->GetKey(), '=');
|
||||
if ($bAllowAllData)
|
||||
{
|
||||
$oSearch->AllowAllData();
|
||||
}
|
||||
$oSet = new CMDBObjectSet($oSearch);
|
||||
if ($oSet->Count() > 0)
|
||||
{
|
||||
@@ -1276,22 +1599,32 @@ abstract class DBObject
|
||||
return $aDependentObjects;
|
||||
}
|
||||
|
||||
/**
|
||||
* $aDeletedObjs = array(); // [class][key] => structure
|
||||
* $aResetedObjs = array(); // [class][key] => object
|
||||
*/
|
||||
public function GetDeletionScheme(&$aDeletedObjs, &$aResetedObjs, $aVisited = array())
|
||||
private function MakeDeletionPlan(&$oDeletionPlan, $aVisited = array(), $iDeleteOption = null)
|
||||
{
|
||||
if (array_key_exists(get_class($this), $aVisited))
|
||||
$sClass = get_class($this);
|
||||
$iThisId = $this->GetKey();
|
||||
|
||||
$iDeleteOption = $oDeletionPlan->AddToDelete($this, $iDeleteOption);
|
||||
|
||||
if (array_key_exists($sClass, $aVisited))
|
||||
{
|
||||
if (in_array($this->GetKey(), $aVisited[get_class($this)]))
|
||||
if (in_array($iThisId, $aVisited[$sClass]))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
$aVisited[get_class($this)] = $this->GetKey();
|
||||
$aVisited[$sClass] = $iThisId;
|
||||
|
||||
$aDependentObjects = $this->GetReferencingObjects();
|
||||
if ($iDeleteOption == DEL_MANUAL)
|
||||
{
|
||||
// Stop the recursion here
|
||||
return;
|
||||
}
|
||||
// Check the node itself
|
||||
$this->DoCheckToDelete($oDeletionPlan);
|
||||
$oDeletionPlan->SetDeletionIssues($this, $this->m_aDeleteIssues, $this->m_bSecurityIssue);
|
||||
|
||||
$aDependentObjects = $this->GetReferencingObjects(true /* allow all data */);
|
||||
foreach ($aDependentObjects as $sRemoteClass => $aPotentialDeletes)
|
||||
{
|
||||
foreach ($aPotentialDeletes as $sRemoteExtKey => $aData)
|
||||
@@ -1306,46 +1639,90 @@ abstract class DBObject
|
||||
if ($oAttDef->IsNullAllowed())
|
||||
{
|
||||
// Optional external key, list to reset
|
||||
if (!array_key_exists($sRemoteClass, $aResetedObjs) || !array_key_exists($iId, $aResetedObjs[$sRemoteClass]))
|
||||
{
|
||||
$aResetedObjs[$sRemoteClass][$iId]['to_reset'] = $oDependentObj;
|
||||
}
|
||||
$aResetedObjs[$sRemoteClass][$iId]['attributes'][$sRemoteExtKey] = $oAttDef;
|
||||
$oDeletionPlan->AddToUpdate($oDependentObj, $oAttDef);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Mandatory external key, list to delete
|
||||
if (array_key_exists($sRemoteClass, $aDeletedObjs) && array_key_exists($iId, $aDeletedObjs[$sRemoteClass]))
|
||||
{
|
||||
$iCurrentOption = $aDeletedObjs[$sRemoteClass][$iId];
|
||||
if ($iCurrentOption == DEL_AUTO)
|
||||
{
|
||||
// be conservative, take the new option
|
||||
// (DEL_MANUAL has precedence over DEL_AUTO)
|
||||
$aDeletedObjs[$sRemoteClass][$iId]['auto_delete'] = ($iDeletePropagationOption == DEL_AUTO);
|
||||
}
|
||||
else
|
||||
{
|
||||
// DEL_MANUAL... leave it as is, it HAS to be verified anyway
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// First time we find the given object in the list
|
||||
// (and most likely case is that no other occurence will be found)
|
||||
$aDeletedObjs[$sRemoteClass][$iId]['to_delete'] = $oDependentObj;
|
||||
$aDeletedObjs[$sRemoteClass][$iId]['auto_delete'] = ($iDeletePropagationOption == DEL_AUTO);
|
||||
// Recursively inspect this object
|
||||
if ($iDeletePropagationOption == DEL_AUTO)
|
||||
{
|
||||
$oDependentObj->GetDeletionScheme($aDeletedObjs, $aResetedObjs, $aVisited);
|
||||
}
|
||||
}
|
||||
$oDependentObj->MakeDeletionPlan($oDeletionPlan, $aVisited, $iDeletePropagationOption);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the synchro replica related to this object
|
||||
* @param none
|
||||
* @return DBObjectSet Set with two columns: R=SynchroReplica S=SynchroDataSource
|
||||
*/
|
||||
public function GetMasterReplica()
|
||||
{
|
||||
if ($this->m_oMasterReplicaSet == null)
|
||||
{
|
||||
//$aParentClasses = MetaModel::EnumParentClasses(get_class($this), ENUM_PARENT_CLASSES_ALL);
|
||||
//$sClassesList = "'".implode("','", $aParentClasses)."'";
|
||||
$sOQL = "SELECT replica,datasource FROM SynchroReplica AS replica JOIN SynchroDataSource AS datasource ON replica.sync_source_id=datasource.id WHERE replica.dest_class = :dest_class AND replica.dest_id = :dest_id";
|
||||
$oReplicaSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array() /* order by*/, array('dest_class' => get_class($this), 'dest_id' => $this->GetKey()));
|
||||
$this->m_oMasterReplicaSet = $oReplicaSet;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->m_oMasterReplicaSet->Rewind();
|
||||
}
|
||||
return $this->m_oMasterReplicaSet;
|
||||
}
|
||||
|
||||
public function GetSynchroReplicaFlags($sAttCode, &$aReason)
|
||||
{
|
||||
$iFlags = OPT_ATT_NORMAL;
|
||||
$oSet = $this->GetMasterReplica();
|
||||
while($aData = $oSet->FetchAssoc())
|
||||
{
|
||||
if ($aData['datasource']->GetKey() == SynchroDataSource::GetCurrentTaskId())
|
||||
{
|
||||
// Ignore the current task (check to write => ok)
|
||||
continue;
|
||||
}
|
||||
// Assumption: $aData['datasource'] will not be null because the data source id is always set...
|
||||
$oReplica = $aData['replica'];
|
||||
$oSource = $aData['datasource'];
|
||||
$oAttrSet = $oSource->Get('attribute_list');
|
||||
while($oSyncAttr = $oAttrSet->Fetch())
|
||||
{
|
||||
if (($oSyncAttr->Get('attcode') == $sAttCode) && ($oSyncAttr->Get('update') == 1) && ($oSyncAttr->Get('update_policy') == 'master_locked'))
|
||||
{
|
||||
$iFlags |= OPT_ATT_SLAVE;
|
||||
$sUrl = $oSource->GetApplicationUrl($this, $oReplica);
|
||||
$aReason[] = array('name' => $oSource->GetName(), 'description' => $oSource->Get('description'), 'url_application' => $sUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $iFlags;
|
||||
}
|
||||
|
||||
public function InSyncScope()
|
||||
{
|
||||
return true;
|
||||
|
||||
// TODO - FINALIZE THIS OPTIMIZATION
|
||||
//
|
||||
// Optimization: cache the list of Data Sources and classes candidates for synchro
|
||||
//
|
||||
static $aSynchroClasses = null;
|
||||
if (is_null($aSynchroClasses))
|
||||
{
|
||||
$aSynchroClasses = array();
|
||||
$sOQL = "SELECT SynchroDataSource AS datasource";
|
||||
$oSourceSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array() /* order by*/, array());
|
||||
while($oSource = $oSourceSet->Fetch())
|
||||
{
|
||||
$sTarget = $oSource->Get('scope_class');
|
||||
$aSynchroClasses[] = $oSource;
|
||||
}
|
||||
}
|
||||
// to be continued...
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -209,7 +209,7 @@ class DBObjectSearch
|
||||
|
||||
protected function TransferConditionExpression($oFilter, $aTranslation)
|
||||
{
|
||||
$oTranslated = $oFilter->GetCriteria()->Translate($aTranslation, false);
|
||||
$oTranslated = $oFilter->GetCriteria()->Translate($aTranslation, false, false /* leave unresolved fields */);
|
||||
$this->AddConditionExpression($oTranslated);
|
||||
// #@# what about collisions in parameter names ???
|
||||
$this->m_aParams = array_merge($this->m_aParams, $oFilter->m_aParams);
|
||||
@@ -226,6 +226,14 @@ class DBObjectSearch
|
||||
$this->m_oSearchCondition = $this->m_oSearchCondition->LogAnd($oExpression);
|
||||
}
|
||||
|
||||
public function AddNameCondition($sName)
|
||||
{
|
||||
$oValueExpr = new ScalarExpression($sName);
|
||||
$oNameExpr = new FieldExpression('friendlyname', $this->GetClassAlias());
|
||||
$oNewCondition = new BinaryExpression($oNameExpr, '=', $oValueExpr);
|
||||
$this->AddConditionExpression($oNewCondition);
|
||||
}
|
||||
|
||||
public function AddCondition($sFilterCode, $value, $sOpCode = null)
|
||||
{
|
||||
MyHelpers::CheckKeyInArray('filter code', $sFilterCode, MetaModel::GetClassFilterDefs($this->GetClass()));
|
||||
|
||||
@@ -38,17 +38,18 @@ class DBObjectSet
|
||||
private $m_aId2Row;
|
||||
private $m_iCurrRow;
|
||||
|
||||
public function __construct(DBObjectSearch $oFilter, $aOrderBy = array(), $aArgs = array(), $iLimitCount = 0, $iLimitStart = 0)
|
||||
public function __construct(DBObjectSearch $oFilter, $aOrderBy = array(), $aArgs = array(), $aExtendedDataSpec = null, $iLimitCount = 0, $iLimitStart = 0)
|
||||
{
|
||||
$this->m_oFilter = $oFilter;
|
||||
$this->m_aOrderBy = $aOrderBy;
|
||||
$this->m_aArgs = $aArgs;
|
||||
$this->m_aExtendedDataSpec = $aExtendedDataSpec;
|
||||
$this->m_iLimitCount = $iLimitCount;
|
||||
$this->m_iLimitStart = $iLimitStart;
|
||||
|
||||
$this->m_bLoaded = false;
|
||||
$this->m_aData = array(); // array of (row => array of (classalias) => object)
|
||||
$this->m_aId2Row = array();
|
||||
$this->m_bLoaded = false; // true when the filter has been used OR the set is built step by step (AddObject...)
|
||||
$this->m_aData = array(); // array of (row => array of (classalias) => object/null)
|
||||
$this->m_aId2Row = array(); // array of (pkey => index in m_aData)
|
||||
$this->m_iCurrRow = 0;
|
||||
}
|
||||
|
||||
@@ -162,19 +163,42 @@ class DBObjectSet
|
||||
{
|
||||
if (!$this->m_bLoaded) $this->Load();
|
||||
|
||||
$aSelectedClasses = $this->m_oFilter->GetSelectedClasses();
|
||||
|
||||
$aRet = array();
|
||||
foreach($this->m_aData as $iRow => $aObjects)
|
||||
{
|
||||
foreach($aObjects as $sClassAlias => $oObject)
|
||||
{
|
||||
$aRet[$iRow][$sClassAlias.'.'.'id'] = $oObject->GetKey();
|
||||
$sClass = get_class($oObject);
|
||||
if (is_null($oObject))
|
||||
{
|
||||
$aRet[$iRow][$sClassAlias.'.'.'id'] = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
$aRet[$iRow][$sClassAlias.'.'.'id'] = $oObject->GetKey();
|
||||
}
|
||||
if (is_null($oObject))
|
||||
{
|
||||
$sClass = $aSelectedClasses[$sClassAlias];
|
||||
}
|
||||
else
|
||||
{
|
||||
$sClass = get_class($oObject);
|
||||
}
|
||||
foreach(MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef)
|
||||
{
|
||||
if ($oAttDef->IsScalar())
|
||||
{
|
||||
$sAttName = $sClassAlias.'.'.$sAttCode;
|
||||
$aRet[$iRow][$sAttName] = $oObject->Get($sAttCode);
|
||||
if (is_null($oObject))
|
||||
{
|
||||
$aRet[$iRow][$sAttName] = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
$aRet[$iRow][$sAttName] = $oObject->Get($sAttCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -202,6 +226,7 @@ class DBObjectSet
|
||||
|
||||
public function GetFilter()
|
||||
{
|
||||
// #@# This is false as soon as the set has been manipulated (AddObject...)
|
||||
return $this->m_oFilter;
|
||||
}
|
||||
|
||||
@@ -239,13 +264,16 @@ class DBObjectSet
|
||||
public function Load()
|
||||
{
|
||||
if ($this->m_bLoaded) return;
|
||||
// Note: it is mandatory to set this value now, to protect against reentrance
|
||||
$this->m_bLoaded = true;
|
||||
|
||||
if ($this->m_iLimitCount > 0)
|
||||
{
|
||||
$sSQL = MetaModel::MakeSelectQuery($this->m_oFilter, $this->m_aOrderBy, $this->m_aArgs, $this->m_iLimitCount, $this->m_iLimitStart);
|
||||
$sSQL = MetaModel::MakeSelectQuery($this->m_oFilter, $this->m_aOrderBy, $this->m_aArgs, $this->m_aExtendedDataSpec, $this->m_iLimitCount, $this->m_iLimitStart);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sSQL = MetaModel::MakeSelectQuery($this->m_oFilter, $this->m_aOrderBy, $this->m_aArgs);
|
||||
$sSQL = MetaModel::MakeSelectQuery($this->m_oFilter, $this->m_aOrderBy, $this->m_aArgs, $this->m_aExtendedDataSpec);
|
||||
}
|
||||
$resQuery = CMDBSource::Query($sSQL);
|
||||
if (!$resQuery) return;
|
||||
@@ -256,25 +284,37 @@ class DBObjectSet
|
||||
$aObjects = array();
|
||||
foreach ($this->m_oFilter->GetSelectedClasses() as $sClassAlias => $sClass)
|
||||
{
|
||||
$oObject = MetaModel::GetObjectByRow($sClass, $aRow, $sClassAlias);
|
||||
if (is_null($aRow[$sClassAlias.'id']))
|
||||
{
|
||||
$oObject = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
$oObject = MetaModel::GetObjectByRow($sClass, $aRow, $sClassAlias, $this->m_aExtendedDataSpec);
|
||||
}
|
||||
$aObjects[$sClassAlias] = $oObject;
|
||||
}
|
||||
$this->AddObjectExtended($aObjects);
|
||||
}
|
||||
CMDBSource::FreeResult($resQuery);
|
||||
|
||||
$this->m_bLoaded = true;
|
||||
}
|
||||
|
||||
public function Count()
|
||||
{
|
||||
$sSQL = MetaModel::MakeSelectQuery($this->m_oFilter, $this->m_aOrderBy, $this->m_aArgs, 0, 0, true);
|
||||
$resQuery = CMDBSource::Query($sSQL);
|
||||
if (!$resQuery) return 0;
|
||||
|
||||
$aRow = CMDBSource::FetchArray($resQuery);
|
||||
CMDBSource::FreeResult($resQuery);
|
||||
return $aRow['COUNT'];
|
||||
if ($this->m_bLoaded && ($this->m_iLimitCount == 0) && ($this->m_iLimitStart == 0))
|
||||
{
|
||||
return count($this->m_aData);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sSQL = MetaModel::MakeSelectQuery($this->m_oFilter, $this->m_aOrderBy, $this->m_aArgs, null, 0, 0, true);
|
||||
$resQuery = CMDBSource::Query($sSQL);
|
||||
if (!$resQuery) return 0;
|
||||
|
||||
$aRow = CMDBSource::FetchArray($resQuery);
|
||||
CMDBSource::FreeResult($resQuery);
|
||||
return $aRow['COUNT'];
|
||||
}
|
||||
}
|
||||
|
||||
public function Fetch($sClassAlias = '')
|
||||
@@ -326,6 +366,8 @@ class DBObjectSet
|
||||
|
||||
public function AddObject($oObject, $sClassAlias = '')
|
||||
{
|
||||
if (!$this->m_bLoaded) $this->Load();
|
||||
|
||||
if (strlen($sClassAlias) == 0)
|
||||
{
|
||||
$sClassAlias = $this->m_oFilter->GetClassAlias();
|
||||
@@ -333,22 +375,32 @@ class DBObjectSet
|
||||
|
||||
$iNextPos = count($this->m_aData);
|
||||
$this->m_aData[$iNextPos][$sClassAlias] = $oObject;
|
||||
$this->m_aId2Row[$sClassAlias][$oObject->GetKey()] = $iNextPos;
|
||||
if (!is_null($oObject))
|
||||
{
|
||||
$this->m_aId2Row[$sClassAlias][$oObject->GetKey()] = $iNextPos;
|
||||
}
|
||||
}
|
||||
|
||||
protected function AddObjectExtended($aObjectArray)
|
||||
{
|
||||
if (!$this->m_bLoaded) $this->Load();
|
||||
|
||||
$iNextPos = count($this->m_aData);
|
||||
|
||||
foreach ($aObjectArray as $sClassAlias => $oObject)
|
||||
{
|
||||
$this->m_aData[$iNextPos][$sClassAlias] = $oObject;
|
||||
$this->m_aId2Row[$sClassAlias][$oObject->GetKey()] = $iNextPos;
|
||||
if (!is_null($oObject))
|
||||
{
|
||||
$this->m_aId2Row[$sClassAlias][$oObject->GetKey()] = $iNextPos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function AddObjectArray($aObjects, $sClassAlias = '')
|
||||
{
|
||||
if (!$this->m_bLoaded) $this->Load();
|
||||
|
||||
// #@# todo - add a check on the object class ?
|
||||
foreach ($aObjects as $oObj)
|
||||
{
|
||||
@@ -393,6 +445,43 @@ class DBObjectSet
|
||||
return $oNewSet;
|
||||
}
|
||||
|
||||
// Note: This verb works only with objects existing in the database
|
||||
//
|
||||
public function HasSameContents($oObjectSet)
|
||||
{
|
||||
if ($this->GetRootClass() != $oObjectSet->GetRootClass())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (!$this->m_bLoaded) $this->Load();
|
||||
|
||||
if ($this->Count() != $oObjectSet->Count())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$sClassAlias = $this->m_oFilter->GetClassAlias();
|
||||
$oObjectSet->Rewind();
|
||||
while ($oObject = $oObjectSet->Fetch())
|
||||
{
|
||||
$iObjectKey = $oObject->GetKey();
|
||||
if ($iObjectKey < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (!array_key_exists($iObjectKey, $this->m_aId2Row[$sClassAlias]))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$iRow = $this->m_aId2Row[$sClassAlias][$iObjectKey];
|
||||
$oSibling = $this->m_aData[$iRow][$sClassAlias];
|
||||
if (!$oObject->Equals($oSibling))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function CreateDelta($oObjectSet)
|
||||
{
|
||||
if ($this->GetRootClass() != $oObjectSet->GetRootClass())
|
||||
@@ -437,6 +526,106 @@ class DBObjectSet
|
||||
}
|
||||
return $aRelatedObjs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds an object that contains the values that are common to all the objects
|
||||
* in the set. If for a given attribute, objects in the set have various values
|
||||
* then the resulting object will contain null for this value.
|
||||
* @param $aValues Hash Output: the distribution of the values, in the set, for each attribute
|
||||
* @return Object
|
||||
*/
|
||||
public function ComputeCommonObject(&$aValues)
|
||||
{
|
||||
$sClass = $this->GetClass();
|
||||
$aList = MetaModel::ListAttributeDefs($sClass);
|
||||
$aValues = array();
|
||||
foreach($aList as $sAttCode => $oAttDef)
|
||||
{
|
||||
if ($oAttDef->IsScalar())
|
||||
{
|
||||
$aValues[$sAttCode] = array();
|
||||
}
|
||||
}
|
||||
$this->Rewind();
|
||||
while($oObj = $this->Fetch())
|
||||
{
|
||||
foreach($aList as $sAttCode => $oAttDef)
|
||||
{
|
||||
if ($oAttDef->IsScalar() && $oAttDef->IsWritable())
|
||||
{
|
||||
$currValue = $oObj->Get($sAttCode);
|
||||
if (is_object($currValue)) continue; // Skip non scalar values...
|
||||
if(!array_key_exists($currValue, $aValues[$sAttCode]))
|
||||
{
|
||||
$aValues[$sAttCode][$currValue] = array('count' => 1, 'display' => $oObj->GetAsHTML($sAttCode));
|
||||
}
|
||||
else
|
||||
{
|
||||
$aValues[$sAttCode][$currValue]['count']++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach($aValues as $sAttCode => $aMultiValues)
|
||||
{
|
||||
if (count($aMultiValues) > 1)
|
||||
{
|
||||
uasort($aValues[$sAttCode], 'HashCountComparison');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Now create an object that has values for the homogenous values only
|
||||
$oCommonObj = new $sClass(); // @@ What if the class is abstract ?
|
||||
$aComments = array();
|
||||
|
||||
$iFormId = cmdbAbstractObject::GetNextFormId(); // Identifier that prefixes all the form fields
|
||||
$sReadyScript = '';
|
||||
$aDependsOn = array();
|
||||
$sFormPrefix = '2_';
|
||||
foreach($aList as $sAttCode => $oAttDef)
|
||||
{
|
||||
if ($oAttDef->IsScalar() && $oAttDef->IsWritable())
|
||||
{
|
||||
if ($oAttDef->GetEditClass() == 'One Way Password')
|
||||
{
|
||||
$oCommonObj->Set($sAttCode, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
$iCount = count($aValues[$sAttCode]);
|
||||
if ($iCount == 1)
|
||||
{
|
||||
// Homogenous value
|
||||
reset($aValues[$sAttCode]);
|
||||
$aKeys = array_keys($aValues[$sAttCode]);
|
||||
$currValue = $aKeys[0]; // The only value is the first key
|
||||
$oCommonObj->Set($sAttCode, $currValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Non-homogenous value
|
||||
$oCommonObj->Set($sAttCode, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->Rewind();
|
||||
return $oCommonObj;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to perform a custom sort of a hash array
|
||||
*/
|
||||
function HashCountComparison($a, $b) // Sort descending on 'count'
|
||||
{
|
||||
if ($a['count'] == $b['count'])
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return ($a['count'] > $b['count']) ? -1 : 1;
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
287
core/deletionplan.class.inc.php
Normal file
287
core/deletionplan.class.inc.php
Normal file
@@ -0,0 +1,287 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Class dbObject: the root of persistent classes
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
class DeleteException extends CoreException
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletion plan (other objects to be deleted/modified, eventual issues, etc.)
|
||||
*
|
||||
* @package iTopORM
|
||||
*/
|
||||
class DeletionPlan
|
||||
{
|
||||
//protected $m_aIssues;
|
||||
|
||||
protected $m_bFoundStopper;
|
||||
protected $m_bFoundSecurityIssue;
|
||||
protected $m_bFoundManualDelete;
|
||||
protected $m_bFoundManualOperation;
|
||||
|
||||
protected $m_iToDelete;
|
||||
protected $m_iToUpdate;
|
||||
|
||||
protected $m_aToDelete;
|
||||
protected $m_aToUpdate;
|
||||
|
||||
protected static $m_aModeUpdate = array(
|
||||
DEL_SILENT => array(
|
||||
DEL_SILENT => DEL_SILENT,
|
||||
DEL_AUTO => DEL_AUTO,
|
||||
DEL_MANUAL => DEL_MANUAL
|
||||
),
|
||||
DEL_MANUAL => array(
|
||||
DEL_SILENT => DEL_MANUAL,
|
||||
DEL_AUTO => DEL_AUTO,
|
||||
DEL_MANUAL => DEL_MANUAL
|
||||
),
|
||||
DEL_AUTO => array(
|
||||
DEL_SILENT => DEL_AUTO,
|
||||
DEL_AUTO => DEL_AUTO,
|
||||
DEL_MANUAL => DEL_AUTO
|
||||
)
|
||||
);
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->m_iToDelete = 0;
|
||||
$this->m_iToUpdate = 0;
|
||||
|
||||
$this->m_aToDelete = array();
|
||||
$this->m_aToUpdate = array();
|
||||
|
||||
$this->m_bFoundStopper = false;
|
||||
$this->m_bFoundSecurityIssue = false;
|
||||
$this->m_bFoundManualDelete = false;
|
||||
$this->m_bFoundManualOperation = false;
|
||||
}
|
||||
|
||||
public function ComputeResults()
|
||||
{
|
||||
foreach($this->m_aToDelete as $sClass => $aToDelete)
|
||||
{
|
||||
foreach($aToDelete as $iId => $aData)
|
||||
{
|
||||
$this->m_iToDelete++;
|
||||
if (isset($aData['issue']))
|
||||
{
|
||||
$this->m_bFoundStopper = true;
|
||||
$this->m_bFoundManualOperation = true;
|
||||
if (isset($aData['issue_security']))
|
||||
{
|
||||
$this->m_bFoundSecurityIssue = true;
|
||||
}
|
||||
}
|
||||
if ($aData['mode'] == DEL_MANUAL)
|
||||
{
|
||||
$this->m_bFoundStopper = true;
|
||||
$this->m_bFoundManualDelete = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach($this->m_aToUpdate as $sClass => $aToUpdate)
|
||||
{
|
||||
foreach($aToUpdate as $iId => $aData)
|
||||
{
|
||||
$this->m_iToUpdate++;
|
||||
|
||||
$oObject = $aData['to_reset'];
|
||||
$aExtKeyLabels = array();
|
||||
foreach ($aData['attributes'] as $sRemoteExtKey => $aRemoteAttDef)
|
||||
{
|
||||
$oObject->Set($sRemoteExtKey, 0);
|
||||
$aExtKeyLabels[] = $aRemoteAttDef->GetLabel();
|
||||
}
|
||||
$this->m_aToUpdate[$sClass][$iId]['attributes_list'] = implode(', ', $aExtKeyLabels);
|
||||
|
||||
list($bRes, $aIssues, $bSecurityIssues) = $oObject->CheckToWrite();
|
||||
if (!$bRes)
|
||||
{
|
||||
$this->m_aToUpdate[$sClass][$iId]['issue'] = implode(', ', $aIssues);
|
||||
$this->m_bFoundStopper = true;
|
||||
|
||||
if ($bSecurityIssues)
|
||||
{
|
||||
$this->m_aToUpdate[$sClass][$iId]['issue_security'] = true;
|
||||
$this->m_bFoundSecurityIssue = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function GetIssues()
|
||||
{
|
||||
$aIssues = array();
|
||||
foreach ($this->m_aToDelete as $sClass => $aToDelete)
|
||||
{
|
||||
foreach ($aToDelete as $iId => $aData)
|
||||
{
|
||||
if (isset($aData['issue']))
|
||||
{
|
||||
$aIssues[] = $aData['issue'];
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($this->m_aToUpdate as $sClass => $aToUpdate)
|
||||
{
|
||||
foreach ($aToUpdate as $iId => $aData)
|
||||
{
|
||||
if (isset($aData['issue']))
|
||||
{
|
||||
$aIssues[] = $aData['issue'];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $aIssues;
|
||||
}
|
||||
|
||||
public function ListDeletes()
|
||||
{
|
||||
return $this->m_aToDelete;
|
||||
}
|
||||
|
||||
public function ListUpdates()
|
||||
{
|
||||
return $this->m_aToUpdate;
|
||||
}
|
||||
|
||||
public function GetTargetCount()
|
||||
{
|
||||
return $this->m_iToDelete + $this->m_iToUpdate;
|
||||
}
|
||||
|
||||
public function FoundStopper()
|
||||
{
|
||||
return $this->m_bFoundStopper;
|
||||
}
|
||||
|
||||
public function FoundSecurityIssue()
|
||||
{
|
||||
return $this->m_bFoundSecurityIssue;
|
||||
}
|
||||
|
||||
public function FoundManualOperation()
|
||||
{
|
||||
return $this->m_bFoundManualOperation;
|
||||
}
|
||||
|
||||
public function FoundManualDelete()
|
||||
{
|
||||
return $this->m_bFoundManualDelete;
|
||||
}
|
||||
|
||||
public function FoundManualUpdate()
|
||||
{
|
||||
}
|
||||
|
||||
public function AddToDelete($oObject, $iDeletionMode = null)
|
||||
{
|
||||
if (is_null($iDeletionMode))
|
||||
{
|
||||
$bRequestedExplicitely = true;
|
||||
$iDeletionMode = DEL_AUTO;
|
||||
}
|
||||
else
|
||||
{
|
||||
$bRequestedExplicitely = false;
|
||||
}
|
||||
|
||||
$sClass = get_class($oObject);
|
||||
$iId = $oObject->GetKey();
|
||||
|
||||
if (isset($this->m_aToUpdate[$sClass][$iId]))
|
||||
{
|
||||
unset($this->m_aToUpdate[$sClass][$iId]);
|
||||
}
|
||||
|
||||
if (isset($this->m_aToDelete[$sClass][$iId]))
|
||||
{
|
||||
if ($this->m_aToDelete[$sClass][$iId]['requested_explicitely'])
|
||||
{
|
||||
// No change: let it in mode DEL_AUTO
|
||||
}
|
||||
else
|
||||
{
|
||||
$iPrevDeletionMode = $this->m_aToDelete[$sClass][$iId]['mode'];
|
||||
$iNewDeletionMode = self::$m_aModeUpdate[$iPrevDeletionMode][$iDeletionMode];
|
||||
$this->m_aToDelete[$sClass][$iId]['mode'] = $iNewDeletionMode;
|
||||
|
||||
if ($bRequestedExplicitely)
|
||||
{
|
||||
// This object was in the root list
|
||||
$this->m_aToDelete[$sClass][$iId]['requested_explicitely'] = true;
|
||||
$this->m_aToDelete[$sClass][$iId]['mode'] = DEL_AUTO;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->m_aToDelete[$sClass][$iId] = array(
|
||||
'to_delete' => $oObject,
|
||||
'mode' => $iDeletionMode,
|
||||
'requested_explicitely' => $bRequestedExplicitely,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public function SetDeletionIssues($oObject, $aIssues, $bSecurityIssue)
|
||||
{
|
||||
if (count($aIssues) > 0)
|
||||
{
|
||||
$sClass = get_class($oObject);
|
||||
$iId = $oObject->GetKey();
|
||||
$this->m_aToDelete[$sClass][$iId]['issue'] = implode(', ', $aIssues);
|
||||
if ($bSecurityIssue)
|
||||
{
|
||||
$this->m_aToDelete[$sClass][$iId]['issue_security'] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function AddToUpdate($oObject, $oAttDef)
|
||||
{
|
||||
$sClass = get_class($oObject);
|
||||
$iId = $oObject->GetKey();
|
||||
if (isset($this->m_aToDelete[$sClass][$iId]))
|
||||
{
|
||||
// skip... it should be deleted anyhow !
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!isset($this->m_aToUpdate[$sClass][$iId]))
|
||||
{
|
||||
$this->m_aToUpdate[$sClass][$iId] = array(
|
||||
'to_reset' => $oObject,
|
||||
);
|
||||
}
|
||||
$this->m_aToUpdate[$sClass][$iId]['attributes'][$oAttDef->GetCode()] = $oAttDef;
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,235 +1,318 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Class Dict
|
||||
* Management of localizable strings
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
class DictException extends CoreException
|
||||
{
|
||||
}
|
||||
|
||||
class DictExceptionUnknownLanguage extends DictException
|
||||
{
|
||||
public function __construct($sLanguageCode)
|
||||
{
|
||||
$aContext = array();
|
||||
$aContext['language_code'] = $sLanguageCode;
|
||||
parent::__construct('Unknown localization language', $aContext);
|
||||
}
|
||||
}
|
||||
|
||||
class DictExceptionMissingString extends DictException
|
||||
{
|
||||
public function __construct($sLanguageCode, $sStringCode)
|
||||
{
|
||||
$aContext = array();
|
||||
$aContext['language_code'] = $sLanguageCode;
|
||||
$aContext['string_code'] = $sStringCode;
|
||||
parent::__construct('Missing localized string', $aContext);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
define('DICT_ERR_STRING', 1); // when a string is missing, return the identifier
|
||||
define('DICT_ERR_EXCEPTION', 2); // when a string is missing, throw an exception
|
||||
//define('DICT_ERR_LOG', 3); // when a string is missing, log an error
|
||||
|
||||
|
||||
class Dict
|
||||
{
|
||||
protected static $m_iErrorMode = DICT_ERR_STRING;
|
||||
protected static $m_sDefaultLanguage = 'EN US';
|
||||
protected static $m_sCurrentLanguage = null; // No language selected by default
|
||||
|
||||
protected static $m_aLanguages = array(); // array( code => array( 'description' => '...', 'localized_description' => '...') ...)
|
||||
protected static $m_aData = array();
|
||||
|
||||
|
||||
public static function SetDefaultLanguage($sLanguageCode)
|
||||
{
|
||||
if (!array_key_exists($sLanguageCode, self::$m_aLanguages))
|
||||
{
|
||||
throw new DictExceptionUnknownLanguage($sLanguageCode);
|
||||
}
|
||||
self::$m_sDefaultLanguage = $sLanguageCode;
|
||||
}
|
||||
|
||||
public static function SetUserLanguage($sLanguageCode)
|
||||
{
|
||||
if (!array_key_exists($sLanguageCode, self::$m_aLanguages))
|
||||
{
|
||||
throw new DictExceptionUnknownLanguage($sLanguageCode);
|
||||
}
|
||||
self::$m_sCurrentLanguage = $sLanguageCode;
|
||||
}
|
||||
|
||||
|
||||
public static function GetCurrentLanguage()
|
||||
{
|
||||
if (self::$m_sCurrentLanguage == null) // May happen when no user is logged in (i.e login screen, non authentifed page)
|
||||
{
|
||||
// In which case let's use the default language
|
||||
return self::$m_sDefaultLanguage;
|
||||
}
|
||||
return self::$m_sCurrentLanguage;
|
||||
}
|
||||
|
||||
//returns a hash array( code => array( 'description' => '...', 'localized_description' => '...') ...)
|
||||
public static function GetLanguages()
|
||||
{
|
||||
return self::$m_aLanguages;
|
||||
}
|
||||
|
||||
// iErrorMode from {DICT_ERR_STRING, DICT_ERR_EXCEPTION}
|
||||
public static function SetErrorMode($iErrorMode)
|
||||
{
|
||||
self::$m_iErrorMode = $iErrorMode;
|
||||
}
|
||||
|
||||
|
||||
public static function S($sStringCode, $sDefault = null)
|
||||
{
|
||||
// Attempt to find the string in the user language
|
||||
//
|
||||
if (!array_key_exists(self::GetCurrentLanguage(), self::$m_aData))
|
||||
{
|
||||
// It may happen, when something happens before the dictionnaries get loaded
|
||||
return $sStringCode;
|
||||
}
|
||||
$aCurrentDictionary = self::$m_aData[self::GetCurrentLanguage()];
|
||||
if (array_key_exists($sStringCode, $aCurrentDictionary))
|
||||
{
|
||||
return $aCurrentDictionary[$sStringCode];
|
||||
}
|
||||
// Attempt to find the string in the default language
|
||||
//
|
||||
$aDefaultDictionary = self::$m_aData[self::$m_sDefaultLanguage];
|
||||
if (array_key_exists($sStringCode, $aDefaultDictionary))
|
||||
{
|
||||
return $aDefaultDictionary[$sStringCode];
|
||||
}
|
||||
// Attempt to find the string in english
|
||||
//
|
||||
$aDefaultDictionary = self::$m_aData['EN US'];
|
||||
if (array_key_exists($sStringCode, $aDefaultDictionary))
|
||||
{
|
||||
return $aDefaultDictionary[$sStringCode];
|
||||
}
|
||||
// Could not find the string...
|
||||
//
|
||||
switch (self::$m_iErrorMode)
|
||||
{
|
||||
case DICT_ERR_STRING:
|
||||
if (is_null($sDefault))
|
||||
{
|
||||
return $sStringCode;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $sDefault;
|
||||
}
|
||||
break;
|
||||
|
||||
case DICT_ERR_EXCEPTION:
|
||||
default:
|
||||
throw new DictExceptionMissingString(self::$m_sCurrentLanguage, $sStringCode);
|
||||
break;
|
||||
}
|
||||
return 'bug!';
|
||||
}
|
||||
|
||||
|
||||
public static function Format($sFormatCode /*, ... arguments ....*/)
|
||||
{
|
||||
$sLocalizedFormat = self::S($sFormatCode);
|
||||
$aArguments = func_get_args();
|
||||
|
||||
if ($sLocalizedFormat == $sFormatCode)
|
||||
{
|
||||
// Make sure the information will be displayed (ex: an error occuring before the dictionary gets loaded)
|
||||
return $sFormatCode.' - '.implode(', ', $aArguments);
|
||||
}
|
||||
|
||||
array_shift($aArguments);
|
||||
return vsprintf($sLocalizedFormat, $aArguments);
|
||||
}
|
||||
|
||||
|
||||
// sLanguageCode: Code identifying the language i.e. FR-FR
|
||||
// sEnglishLanguageDesc: Description of the language code, in English. i.e. French (France)
|
||||
// sLocalizedLanguageDesc: Description of the language code, in its own language. i.e. Français (France)
|
||||
// aEntries: Hash array of dictionnary entries
|
||||
public static function Add($sLanguageCode, $sEnglishLanguageDesc, $sLocalizedLanguageDesc, $aEntries)
|
||||
{
|
||||
if (!array_key_exists($sLanguageCode, self::$m_aLanguages))
|
||||
{
|
||||
self::$m_aLanguages[$sLanguageCode] = array('description' => $sEnglishLanguageDesc, 'localized_description' => $sLocalizedLanguageDesc);
|
||||
self::$m_aData[$sLanguageCode] = array();
|
||||
}
|
||||
self::$m_aData[$sLanguageCode] = array_merge(self::$m_aData[$sLanguageCode], $aEntries);
|
||||
}
|
||||
|
||||
public static function MakeStats($sLanguageCode, $sLanguageRef = 'EN US')
|
||||
{
|
||||
$aMissing = array(); // Strings missing for the target language
|
||||
$aUnexpected = array(); // Strings defined for the target language, but not found in the reference dictionary
|
||||
$aNotTranslated = array(); // Strings having the same value in both dictionaries
|
||||
$aOK = array(); // Strings having different values in both dictionaries
|
||||
|
||||
foreach (self::$m_aData[$sLanguageRef] as $sStringCode => $sValue)
|
||||
{
|
||||
if (!array_key_exists($sStringCode, self::$m_aData[$sLanguageCode]))
|
||||
{
|
||||
$aMissing[$sStringCode] = $sValue;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (self::$m_aData[$sLanguageCode] as $sStringCode => $sValue)
|
||||
{
|
||||
if (!array_key_exists($sStringCode, self::$m_aData[$sLanguageRef]))
|
||||
{
|
||||
$aUnexpected[$sStringCode] = $sValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
// The value exists in the reference
|
||||
$sRefValue = self::$m_aData[$sLanguageRef][$sStringCode];
|
||||
if ($sValue == $sRefValue)
|
||||
{
|
||||
$aNotTranslated[$sStringCode] = $sValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
$aOK[$sStringCode] = $sValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
return array($aMissing, $aUnexpected, $aNotTranslated, $aOK);
|
||||
}
|
||||
|
||||
public static function Dump()
|
||||
{
|
||||
MyHelpers::var_dump_html(self::$m_aData);
|
||||
}
|
||||
}
|
||||
?>
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Class Dict
|
||||
* Management of localizable strings
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
class DictException extends CoreException
|
||||
{
|
||||
}
|
||||
|
||||
class DictExceptionUnknownLanguage extends DictException
|
||||
{
|
||||
public function __construct($sLanguageCode)
|
||||
{
|
||||
$aContext = array();
|
||||
$aContext['language_code'] = $sLanguageCode;
|
||||
parent::__construct('Unknown localization language', $aContext);
|
||||
}
|
||||
}
|
||||
|
||||
class DictExceptionMissingString extends DictException
|
||||
{
|
||||
public function __construct($sLanguageCode, $sStringCode)
|
||||
{
|
||||
$aContext = array();
|
||||
$aContext['language_code'] = $sLanguageCode;
|
||||
$aContext['string_code'] = $sStringCode;
|
||||
parent::__construct('Missing localized string', $aContext);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
define('DICT_ERR_STRING', 1); // when a string is missing, return the identifier
|
||||
define('DICT_ERR_EXCEPTION', 2); // when a string is missing, throw an exception
|
||||
//define('DICT_ERR_LOG', 3); // when a string is missing, log an error
|
||||
|
||||
|
||||
class Dict
|
||||
{
|
||||
protected static $m_bTraceFiles = false;
|
||||
protected static $m_aEntryFiles = array();
|
||||
|
||||
protected static $m_iErrorMode = DICT_ERR_STRING;
|
||||
protected static $m_sDefaultLanguage = 'EN US';
|
||||
protected static $m_sCurrentLanguage = null; // No language selected by default
|
||||
|
||||
protected static $m_aLanguages = array(); // array( code => array( 'description' => '...', 'localized_description' => '...') ...)
|
||||
protected static $m_aData = array();
|
||||
|
||||
|
||||
public static function EnableTraceFiles()
|
||||
{
|
||||
self::$m_bTraceFiles = true;
|
||||
}
|
||||
|
||||
public static function GetEntryFiles()
|
||||
{
|
||||
return self::$m_aEntryFiles;
|
||||
}
|
||||
|
||||
public static function SetDefaultLanguage($sLanguageCode)
|
||||
{
|
||||
if (!array_key_exists($sLanguageCode, self::$m_aLanguages))
|
||||
{
|
||||
throw new DictExceptionUnknownLanguage($sLanguageCode);
|
||||
}
|
||||
self::$m_sDefaultLanguage = $sLanguageCode;
|
||||
}
|
||||
|
||||
public static function SetUserLanguage($sLanguageCode)
|
||||
{
|
||||
if (!array_key_exists($sLanguageCode, self::$m_aLanguages))
|
||||
{
|
||||
throw new DictExceptionUnknownLanguage($sLanguageCode);
|
||||
}
|
||||
self::$m_sCurrentLanguage = $sLanguageCode;
|
||||
}
|
||||
|
||||
|
||||
public static function GetCurrentLanguage()
|
||||
{
|
||||
if (self::$m_sCurrentLanguage == null) // May happen when no user is logged in (i.e login screen, non authentifed page)
|
||||
{
|
||||
// In which case let's use the default language
|
||||
return self::$m_sDefaultLanguage;
|
||||
}
|
||||
return self::$m_sCurrentLanguage;
|
||||
}
|
||||
|
||||
//returns a hash array( code => array( 'description' => '...', 'localized_description' => '...') ...)
|
||||
public static function GetLanguages()
|
||||
{
|
||||
return self::$m_aLanguages;
|
||||
}
|
||||
|
||||
// iErrorMode from {DICT_ERR_STRING, DICT_ERR_EXCEPTION}
|
||||
public static function SetErrorMode($iErrorMode)
|
||||
{
|
||||
self::$m_iErrorMode = $iErrorMode;
|
||||
}
|
||||
|
||||
|
||||
public static function S($sStringCode, $sDefault = null)
|
||||
{
|
||||
// Attempt to find the string in the user language
|
||||
//
|
||||
if (!array_key_exists(self::GetCurrentLanguage(), self::$m_aData))
|
||||
{
|
||||
// It may happen, when something happens before the dictionnaries get loaded
|
||||
return $sStringCode;
|
||||
}
|
||||
$aCurrentDictionary = self::$m_aData[self::GetCurrentLanguage()];
|
||||
if (array_key_exists($sStringCode, $aCurrentDictionary))
|
||||
{
|
||||
return $aCurrentDictionary[$sStringCode];
|
||||
}
|
||||
// Attempt to find the string in the default language
|
||||
//
|
||||
$aDefaultDictionary = self::$m_aData[self::$m_sDefaultLanguage];
|
||||
if (array_key_exists($sStringCode, $aDefaultDictionary))
|
||||
{
|
||||
return $aDefaultDictionary[$sStringCode];
|
||||
}
|
||||
// Attempt to find the string in english
|
||||
//
|
||||
$aDefaultDictionary = self::$m_aData['EN US'];
|
||||
if (array_key_exists($sStringCode, $aDefaultDictionary))
|
||||
{
|
||||
return $aDefaultDictionary[$sStringCode];
|
||||
}
|
||||
// Could not find the string...
|
||||
//
|
||||
switch (self::$m_iErrorMode)
|
||||
{
|
||||
case DICT_ERR_STRING:
|
||||
if (is_null($sDefault))
|
||||
{
|
||||
return $sStringCode;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $sDefault;
|
||||
}
|
||||
break;
|
||||
|
||||
case DICT_ERR_EXCEPTION:
|
||||
default:
|
||||
throw new DictExceptionMissingString(self::$m_sCurrentLanguage, $sStringCode);
|
||||
break;
|
||||
}
|
||||
return 'bug!';
|
||||
}
|
||||
|
||||
|
||||
public static function Format($sFormatCode /*, ... arguments ....*/)
|
||||
{
|
||||
$sLocalizedFormat = self::S($sFormatCode);
|
||||
$aArguments = func_get_args();
|
||||
array_shift($aArguments);
|
||||
|
||||
if ($sLocalizedFormat == $sFormatCode)
|
||||
{
|
||||
// Make sure the information will be displayed (ex: an error occuring before the dictionary gets loaded)
|
||||
return $sFormatCode.' - '.implode(', ', $aArguments);
|
||||
}
|
||||
|
||||
return vsprintf($sLocalizedFormat, $aArguments);
|
||||
}
|
||||
|
||||
|
||||
// sLanguageCode: Code identifying the language i.e. FR-FR
|
||||
// sEnglishLanguageDesc: Description of the language code, in English. i.e. French (France)
|
||||
// sLocalizedLanguageDesc: Description of the language code, in its own language. i.e. Français (France)
|
||||
// aEntries: Hash array of dictionnary entries
|
||||
// ~~ or ~* can be used to indicate entries still to be translated.
|
||||
public static function Add($sLanguageCode, $sEnglishLanguageDesc, $sLocalizedLanguageDesc, $aEntries)
|
||||
{
|
||||
if (self::$m_bTraceFiles)
|
||||
{
|
||||
$aBacktrace = debug_backtrace();
|
||||
$sFile = $aBacktrace[0]["file"];
|
||||
|
||||
foreach($aEntries as $sKey => $sValue)
|
||||
{
|
||||
self::$m_aEntryFiles[$sLanguageCode][$sKey] = array(
|
||||
'file' => $sFile,
|
||||
'value' => $sValue
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (!array_key_exists($sLanguageCode, self::$m_aLanguages))
|
||||
{
|
||||
self::$m_aLanguages[$sLanguageCode] = array('description' => $sEnglishLanguageDesc, 'localized_description' => $sLocalizedLanguageDesc);
|
||||
self::$m_aData[$sLanguageCode] = array();
|
||||
}
|
||||
foreach($aEntries as $sCode => $sValue)
|
||||
{
|
||||
self::$m_aData[$sLanguageCode][$sCode] = self::FilterString($sValue);
|
||||
}
|
||||
}
|
||||
|
||||
public static function MakeStats($sLanguageCode, $sLanguageRef = 'EN US')
|
||||
{
|
||||
$aMissing = array(); // Strings missing for the target language
|
||||
$aUnexpected = array(); // Strings defined for the target language, but not found in the reference dictionary
|
||||
$aNotTranslated = array(); // Strings having the same value in both dictionaries
|
||||
$aOK = array(); // Strings having different values in both dictionaries
|
||||
|
||||
foreach (self::$m_aData[$sLanguageRef] as $sStringCode => $sValue)
|
||||
{
|
||||
if (!array_key_exists($sStringCode, self::$m_aData[$sLanguageCode]))
|
||||
{
|
||||
$aMissing[$sStringCode] = $sValue;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (self::$m_aData[$sLanguageCode] as $sStringCode => $sValue)
|
||||
{
|
||||
if (!array_key_exists($sStringCode, self::$m_aData[$sLanguageRef]))
|
||||
{
|
||||
$aUnexpected[$sStringCode] = $sValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
// The value exists in the reference
|
||||
$sRefValue = self::$m_aData[$sLanguageRef][$sStringCode];
|
||||
if ($sValue == $sRefValue)
|
||||
{
|
||||
$aNotTranslated[$sStringCode] = $sValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
$aOK[$sStringCode] = $sValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
return array($aMissing, $aUnexpected, $aNotTranslated, $aOK);
|
||||
}
|
||||
|
||||
public static function Dump()
|
||||
{
|
||||
MyHelpers::var_dump_html(self::$m_aData);
|
||||
}
|
||||
|
||||
public static function InCache($sApplicationPrefix)
|
||||
{
|
||||
if (function_exists('apc_fetch'))
|
||||
{
|
||||
$bResult = false;
|
||||
// Note: For versions of APC older than 3.0.17, fetch() accepts only one parameter
|
||||
//
|
||||
self::$m_aData = apc_fetch($sApplicationPrefix.'-dict');
|
||||
if (is_bool(self::$m_aData) && (self::$m_aData === false))
|
||||
{
|
||||
self::$m_aData = array();
|
||||
}
|
||||
else
|
||||
{
|
||||
self::$m_aLanguages = apc_fetch($sApplicationPrefix.'-languages');
|
||||
if (is_bool(self::$m_aLanguages) && (self::$m_aLanguages === false))
|
||||
{
|
||||
self::$m_aLanguages = array();
|
||||
}
|
||||
else
|
||||
{
|
||||
$bResult = true;
|
||||
}
|
||||
}
|
||||
return $bResult;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function InitCache($sApplicationPrefix)
|
||||
{
|
||||
if (function_exists('apc_store'))
|
||||
{
|
||||
apc_store($sApplicationPrefix.'-languages', self::$m_aLanguages);
|
||||
apc_store($sApplicationPrefix.'-dict', self::$m_aData);
|
||||
}
|
||||
}
|
||||
|
||||
public static function ResetCache($sApplicationPrefix)
|
||||
{
|
||||
if (function_exists('apc_delete'))
|
||||
{
|
||||
apc_delete($sApplicationPrefix.'-languages');
|
||||
apc_delete($sApplicationPrefix.'-dict');
|
||||
}
|
||||
}
|
||||
|
||||
protected static function FilterString($s)
|
||||
{
|
||||
return str_replace(array('~~', '~*'), '', $s);
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -24,6 +24,11 @@
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
define ('EMAIL_SEND_OK', 0);
|
||||
define ('EMAIL_SEND_PENDING', 1);
|
||||
define ('EMAIL_SEND_ERROR', 2);
|
||||
|
||||
|
||||
class EMail
|
||||
{
|
||||
protected $m_sBody;
|
||||
@@ -31,15 +36,14 @@ class EMail
|
||||
protected $m_sTo;
|
||||
protected $m_aHeaders; // array of key=>value
|
||||
|
||||
public function __construct()
|
||||
public function __construct($sTo = '', $sSubject = '', $sBody = '', $aHeaders = array())
|
||||
{
|
||||
$this->m_sTo = '';
|
||||
$this->m_sSubject = '';
|
||||
$this->m_sBody = '';
|
||||
$this->m_aHeaders = array();
|
||||
$this->m_sTo = $sTo;
|
||||
$this->m_sSubject = $sSubject;
|
||||
$this->m_sBody = $sBody;
|
||||
$this->m_aHeaders = $aHeaders;
|
||||
}
|
||||
|
||||
|
||||
// Errors management : not that simple because we need that function to be
|
||||
// executed in the background, while making sure that any issue would be reported clearly
|
||||
protected $m_aMailErrors; //array of strings explaining the issues
|
||||
@@ -50,9 +54,22 @@ class EMail
|
||||
$this->m_aMailErrors[] = $sCleanMessage;
|
||||
}
|
||||
|
||||
protected function SendAsynchronous(&$aIssues, $oLog = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
AsyncSendEmail::AddToQueue($this->m_sTo, $this->m_sSubject, $this->m_sBody, $this->m_aHeaders, $oLog);
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
$aIssues = array($e->GetMessage());
|
||||
return EMAIL_SEND_ERROR;
|
||||
}
|
||||
$aIssues = array();
|
||||
return EMAIL_SEND_PENDING;
|
||||
}
|
||||
|
||||
// returns a list of issues if any
|
||||
public function Send()
|
||||
protected function SendSynchronous(&$aIssues, $oLog = null)
|
||||
{
|
||||
$sHeaders = 'MIME-Version: 1.0' . "\r\n";
|
||||
// ! the case is important for MS-Outlook
|
||||
@@ -79,7 +96,36 @@ class EMail
|
||||
{
|
||||
$this->m_aMailErrors[] = 'Unknown reason';
|
||||
}
|
||||
return $this->m_aMailErrors;
|
||||
if (count($this->m_aMailErrors) > 0)
|
||||
{
|
||||
$aIssues = $this->m_aMailErrors;
|
||||
return EMAIL_SEND_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
$aIssues = array();
|
||||
return EMAIL_SEND_OK;
|
||||
}
|
||||
}
|
||||
|
||||
public function Send(&$aIssues, $bForceSynchronous = false, $oLog = null)
|
||||
{
|
||||
if ($bForceSynchronous)
|
||||
{
|
||||
return $this->SendSynchronous($aIssues, $oLog);
|
||||
}
|
||||
else
|
||||
{
|
||||
$bConfigASYNC = MetaModel::GetConfig()->Get('email_asynchronous');
|
||||
if ($bConfigASYNC)
|
||||
{
|
||||
return $this->SendAsynchronous($aIssues, $oLog);
|
||||
}
|
||||
else
|
||||
{
|
||||
return $this->SendSynchronous($aIssues, $oLog);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function AddToHeader($sKey, $sValue)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
class Event extends cmdbAbstractObject
|
||||
class Event extends DBObject implements iDisplay
|
||||
{
|
||||
public static function Init()
|
||||
{
|
||||
@@ -46,14 +46,77 @@ class Event extends cmdbAbstractObject
|
||||
MetaModel::Init_AddAttribute(new AttributeText("message", array("allowed_values"=>null, "sql"=>"message", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeDateTime("date", array("allowed_values"=>null, "sql"=>"date", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("userinfo", array("allowed_values"=>null, "sql"=>"userinfo", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
// MetaModel::Init_AddAttribute(new AttributeString("userinfo", array("allowed_values"=>null, "sql"=>"userinfo", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('message', 'date', 'userinfo')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('details', array('date', 'message', 'userinfo')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('date', 'finalclass', 'message')); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
|
||||
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps the given context parameter name to the appropriate filter/search code for this class
|
||||
* @param string $sContextParam Name of the context parameter, i.e. 'org_id'
|
||||
* @return string Filter code, i.e. 'customer_id'
|
||||
*/
|
||||
public static function MapContextParam($sContextParam)
|
||||
{
|
||||
if ($sContextParam == 'menu')
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $sContextParam;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns a 'hilight' CSS class, used to hilight a given row in a table
|
||||
* There are currently (i.e defined in the CSS) 4 possible values HILIGHT_CLASS_CRITICAL,
|
||||
* HILIGHT_CLASS_WARNING, HILIGHT_CLASS_OK, HILIGHT_CLASS_NONE
|
||||
* To Be overridden by derived classes
|
||||
* @param void
|
||||
* @return String The desired higlight class for the object/row
|
||||
*/
|
||||
public function GetHilightClass()
|
||||
{
|
||||
// Possible return values are:
|
||||
// HILIGHT_CLASS_CRITICAL, HILIGHT_CLASS_WARNING, HILIGHT_CLASS_OK, HILIGHT_CLASS_NONE
|
||||
return HILIGHT_CLASS_NONE; // Not hilighted by default
|
||||
}
|
||||
|
||||
public static function GetUIPage()
|
||||
{
|
||||
return '../pages/UI.php';
|
||||
}
|
||||
|
||||
function DisplayDetails(WebPage $oPage, $bEditMode = false)
|
||||
{
|
||||
// Object's details
|
||||
//$this->DisplayBareHeader($oPage, $bEditMode);
|
||||
$oPage->AddTabContainer(OBJECT_PROPERTIES_TAB);
|
||||
$oPage->SetCurrentTabContainer(OBJECT_PROPERTIES_TAB);
|
||||
$oPage->SetCurrentTab(Dict::S('UI:PropertiesTab'));
|
||||
$this->DisplayBareProperties($oPage, $bEditMode);
|
||||
}
|
||||
|
||||
function DisplayBareProperties(WebPage $oPage, $bEditMode = false)
|
||||
{
|
||||
if ($bEditMode) return; // Not editable
|
||||
|
||||
$aDetails = array();
|
||||
$sClass = get_class($this);
|
||||
$aZList = MetaModel::FlattenZlist(MetaModel::GetZListItems($sClass, 'details'));
|
||||
foreach( $aZList as $sAttCode)
|
||||
{
|
||||
$sDisplayValue = $this->GetAsHTML($sAttCode);
|
||||
$aDetails[] = array('label' => '<span title="'.MetaModel::GetDescription($sClass, $sAttCode).'">'.MetaModel::GetLabel($sClass, $sAttCode).'</span>', 'value' => $sDisplayValue);
|
||||
}
|
||||
$oPage->Details($aDetails);
|
||||
}
|
||||
}
|
||||
|
||||
class EventNotification extends Event
|
||||
@@ -79,8 +142,8 @@ class EventNotification extends Event
|
||||
MetaModel::Init_AddAttribute(new AttributeInteger("object_id", array("allowed_values"=>null, "sql"=>"object_id", "default_value"=>0, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('date', 'userinfo', 'trigger_id', 'action_id', 'object_id')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('date', 'userinfo')); // Attributes to be displayed for a list
|
||||
MetaModel::Init_SetZListItems('details', array('date', 'message', 'userinfo', 'trigger_id', 'action_id', 'object_id')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('date', 'message')); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
|
||||
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
|
||||
@@ -115,7 +178,7 @@ class EventNotificationEmail extends EventNotification
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('date', 'userinfo', 'message', 'trigger_id', 'action_id', 'object_id', 'to', 'cc', 'bcc', 'from', 'subject', 'body')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('date', 'userinfo', 'message', 'to', 'subject')); // Attributes to be displayed for a list
|
||||
MetaModel::Init_SetZListItems('list', array('date', 'message', 'to', 'subject')); // Attributes to be displayed for a list
|
||||
|
||||
// Search criteria
|
||||
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
|
||||
@@ -258,4 +321,35 @@ class EventWebService extends Event
|
||||
}
|
||||
}
|
||||
|
||||
class EventLoginUsage extends Event
|
||||
{
|
||||
public static function Init()
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "core/cmdb,view_in_gui",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_event_loginusage",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_InheritAttributes();
|
||||
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("user_id", array("targetclass"=>"User", "jointype"=> "", "allowed_values"=>null, "sql"=>"user_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("contact_name", array("allowed_values"=>null, "extkey_attcode"=>"user_id", "target_attcode"=>"contactid", "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("contact_email", array("allowed_values"=>null, "extkey_attcode"=>"user_id", "target_attcode"=>"email", "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('date', 'user_id', 'contact_name', 'contact_email', 'userinfo', 'message')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('date', 'user_id', 'contact_name', 'contact_email', 'userinfo')); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
MetaModel::Init_SetZListItems('standard_search', array('date', 'user_id', 'contact_name', 'contact_email')); // Criteria of the std search form
|
||||
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
@@ -30,7 +30,8 @@ class MissingQueryArgument extends CoreException
|
||||
abstract class Expression
|
||||
{
|
||||
// recursive translation of identifiers
|
||||
abstract public function Translate($aTranslationData, $bMatchAll = true);
|
||||
abstract public function GetUnresolvedFields($sAlias, &$aUnresolved);
|
||||
abstract public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true);
|
||||
|
||||
// recursive rendering (aArgs used as input by default, or used as output if bRetrofitParams set to True
|
||||
abstract public function Render(&$aArgs = null, $bRetrofitParams = false);
|
||||
@@ -66,6 +67,12 @@ abstract class Expression
|
||||
return $oExpression;
|
||||
}
|
||||
|
||||
static public function FromSQL($sSQL)
|
||||
{
|
||||
$oSql = new SQLExpression($sSQL);
|
||||
return $oSql;
|
||||
}
|
||||
|
||||
public function LogAnd($oExpr)
|
||||
{
|
||||
if ($this->IsTrue()) return clone $oExpr;
|
||||
@@ -79,6 +86,42 @@ abstract class Expression
|
||||
}
|
||||
}
|
||||
|
||||
class SQLExpression extends Expression
|
||||
{
|
||||
protected $m_sSQL;
|
||||
|
||||
public function __construct($sSQL)
|
||||
{
|
||||
$this->m_sSQL = $sSQL;
|
||||
}
|
||||
|
||||
public function IsTrue()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// recursive rendering
|
||||
public function Render(&$aArgs = null, $bRetrofitParams = false)
|
||||
{
|
||||
return $this->m_sSQL;
|
||||
}
|
||||
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
|
||||
{
|
||||
return clone $this;
|
||||
}
|
||||
|
||||
public function ListRequiredFields()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
class BinaryExpression extends Expression
|
||||
{
|
||||
@@ -143,10 +186,16 @@ class BinaryExpression extends Expression
|
||||
return "($sLeft $sOperator $sRight)";
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true)
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
$oLeft = $this->GetLeftExpr()->Translate($aTranslationData, $bMatchAll);
|
||||
$oRight = $this->GetRightExpr()->Translate($aTranslationData, $bMatchAll);
|
||||
$this->GetLeftExpr()->GetUnresolvedFields($sAlias, $aUnresolved);
|
||||
$this->GetRightExpr()->GetUnresolvedFields($sAlias, $aUnresolved);
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
|
||||
{
|
||||
$oLeft = $this->GetLeftExpr()->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
|
||||
$oRight = $this->GetRightExpr()->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
|
||||
return new BinaryExpression($oLeft, $this->GetOperator(), $oRight);
|
||||
}
|
||||
|
||||
@@ -194,7 +243,11 @@ class UnaryExpression extends Expression
|
||||
}
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true)
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
|
||||
{
|
||||
return clone $this;
|
||||
}
|
||||
@@ -275,7 +328,21 @@ class FieldExpression extends UnaryExpression
|
||||
return "`{$this->m_sParent}`.`{$this->m_sName}`";
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true)
|
||||
public function ListRequiredFields()
|
||||
{
|
||||
return array($this->m_sParent.'.'.$this->m_sName);
|
||||
}
|
||||
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
if ($this->m_sParent == $sAlias)
|
||||
{
|
||||
// Add a reference to the field
|
||||
$aUnresolved[$this->m_sName] = $this;
|
||||
}
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
|
||||
{
|
||||
if (!array_key_exists($this->m_sParent, $aTranslationData))
|
||||
{
|
||||
@@ -292,21 +359,35 @@ class FieldExpression extends UnaryExpression
|
||||
}
|
||||
$sNewParent = $aTranslationData[$this->m_sParent]['*'];
|
||||
$sNewName = $this->m_sName;
|
||||
if ($bMarkFieldsAsResolved)
|
||||
{
|
||||
$oRet = new FieldExpressionResolved($sNewName, $sNewParent);
|
||||
}
|
||||
else
|
||||
{
|
||||
$oRet = new FieldExpression($sNewName, $sNewParent);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sNewParent = $aTranslationData[$this->m_sParent][$this->m_sName][0];
|
||||
$sNewName = $aTranslationData[$this->m_sParent][$this->m_sName][1];
|
||||
$oRet = $aTranslationData[$this->m_sParent][$this->m_sName];
|
||||
}
|
||||
return new FieldExpression($sNewName, $sNewParent);
|
||||
}
|
||||
|
||||
public function ListRequiredFields()
|
||||
{
|
||||
return array($this->m_sParent.'.'.$this->m_sName);
|
||||
return $oRet;
|
||||
}
|
||||
}
|
||||
|
||||
// Has been resolved into an SQL expression
|
||||
class FieldExpressionResolved extends FieldExpression
|
||||
{
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
|
||||
{
|
||||
return clone $this;
|
||||
}
|
||||
}
|
||||
|
||||
class VariableExpression extends UnaryExpression
|
||||
{
|
||||
@@ -393,12 +474,20 @@ class ListExpression extends Expression
|
||||
return '('.implode(', ', $aRes).')';
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true)
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
foreach ($this->m_aExpressions as $oExpr)
|
||||
{
|
||||
$oExpr->GetUnresolvedFields($sAlias, $aUnresolved);
|
||||
}
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
|
||||
{
|
||||
$aRes = array();
|
||||
foreach ($this->m_aExpressions as $oExpr)
|
||||
{
|
||||
$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll);
|
||||
$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
|
||||
}
|
||||
return new ListExpression($aRes);
|
||||
}
|
||||
@@ -453,12 +542,20 @@ class FunctionExpression extends Expression
|
||||
return $this->m_sVerb.'('.implode(', ', $aRes).')';
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true)
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
foreach ($this->m_aArgs as $oExpr)
|
||||
{
|
||||
$oExpr->GetUnresolvedFields($sAlias, $aUnresolved);
|
||||
}
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
|
||||
{
|
||||
$aRes = array();
|
||||
foreach ($this->m_aArgs as $oExpr)
|
||||
{
|
||||
$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll);
|
||||
$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
|
||||
}
|
||||
return new FunctionExpression($this->m_sVerb, $aRes);
|
||||
}
|
||||
@@ -507,9 +604,14 @@ class IntervalExpression extends Expression
|
||||
return 'INTERVAL '.$this->m_oValue->Render($aArgs, $bRetrofitParams).' '.$this->m_sUnit;
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true)
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
return new IntervalExpression($this->m_oValue->Translate($aTranslationData, $bMatchAll), $this->m_sUnit);
|
||||
$this->m_oValue->GetUnresolvedFields($sAlias, $aUnresolved);
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
|
||||
{
|
||||
return new IntervalExpression($this->m_oValue->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved), $this->m_sUnit);
|
||||
}
|
||||
|
||||
public function ListRequiredFields()
|
||||
@@ -551,12 +653,20 @@ class CharConcatExpression extends Expression
|
||||
return "CAST(CONCAT(".implode(', ', $aRes).") AS CHAR)";
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true)
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
foreach ($this->m_aExpressions as $oExpr)
|
||||
{
|
||||
$oExpr->GetUnresolvedFields($sAlias, $aUnresolved);
|
||||
}
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
|
||||
{
|
||||
$aRes = array();
|
||||
foreach ($this->m_aExpressions as $oExpr)
|
||||
{
|
||||
$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll);
|
||||
$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
|
||||
}
|
||||
return new CharConcatExpression($aRes);
|
||||
}
|
||||
@@ -572,4 +682,102 @@ class CharConcatExpression extends Expression
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class CharConcatWSExpression extends CharConcatExpression
|
||||
{
|
||||
protected $m_separator;
|
||||
|
||||
public function __construct($separator, $aExpressions)
|
||||
{
|
||||
$this->m_separator = $separator;
|
||||
parent::__construct($aExpressions);
|
||||
}
|
||||
|
||||
// recursive rendering
|
||||
public function Render(&$aArgs = null, $bRetrofitParams = false)
|
||||
{
|
||||
$aRes = array();
|
||||
foreach ($this->m_aExpressions as $oExpr)
|
||||
{
|
||||
$sCol = $oExpr->Render($aArgs, $bRetrofitParams);
|
||||
// Concat will be globally NULL if one single argument is null !
|
||||
$aRes[] = "COALESCE($sCol, '')";
|
||||
}
|
||||
$sSep = CMDBSource::Quote($this->m_separator);
|
||||
return "CAST(CONCAT_WS($sSep, ".implode(', ', $aRes).") AS CHAR)";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class QueryBuilderExpressions
|
||||
{
|
||||
protected $m_oConditionExpr;
|
||||
protected $m_aSelectExpr;
|
||||
protected $m_aJoinFields;
|
||||
|
||||
public function __construct($aSelect, $oCondition)
|
||||
{
|
||||
$this->m_oConditionExpr = $oCondition;
|
||||
$this->m_aSelectExpr = $aSelect;
|
||||
$this->m_aJoinFields = array();
|
||||
}
|
||||
|
||||
public function GetSelect()
|
||||
{
|
||||
return $this->m_aSelectExpr;
|
||||
}
|
||||
|
||||
public function GetCondition()
|
||||
{
|
||||
return $this->m_oConditionExpr;
|
||||
}
|
||||
|
||||
public function PopJoinField()
|
||||
{
|
||||
return array_pop($this->m_aJoinFields);
|
||||
}
|
||||
|
||||
public function AddSelect($sAttAlias, $oExpression)
|
||||
{
|
||||
$this->m_aSelectExpr[$sAttAlias] = $oExpression;
|
||||
}
|
||||
|
||||
//$oConditionTree = $oConditionTree->LogAnd($oFinalClassRestriction);
|
||||
public function AddCondition($oExpression)
|
||||
{
|
||||
$this->m_oConditionExpr = $this->m_oConditionExpr->LogAnd($oExpression);
|
||||
}
|
||||
|
||||
public function PushJoinField($oExpression)
|
||||
{
|
||||
array_push($this->m_aJoinFields, $oExpression);
|
||||
}
|
||||
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
$this->m_oConditionExpr->GetUnresolvedFields($sAlias, $aUnresolved);
|
||||
foreach($this->m_aSelectExpr as $sColAlias => $oExpr)
|
||||
{
|
||||
$oExpr->GetUnresolvedFields($sAlias, $aUnresolved);
|
||||
}
|
||||
foreach($this->m_aJoinFields as $oExpression)
|
||||
{
|
||||
$oExpression->GetUnresolvedFields($sAlias, $aUnresolved);
|
||||
}
|
||||
}
|
||||
|
||||
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
|
||||
{
|
||||
$this->m_oConditionExpr = $this->m_oConditionExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
|
||||
foreach($this->m_aSelectExpr as $sColAlias => $oExpr)
|
||||
{
|
||||
$this->m_aSelectExpr[$sColAlias] = $oExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
|
||||
}
|
||||
foreach($this->m_aJoinFields as $index => $oExpression)
|
||||
{
|
||||
$this->m_aJoinFields[$index] = $oExpression->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
@@ -193,4 +193,13 @@ class ExecutionKPI
|
||||
}
|
||||
}
|
||||
|
||||
class ApplicationStartupKPI extends ExecutionKPI
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
global $fItopStarted;
|
||||
$this->m_fStarted = $fItopStarted;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,29 @@
|
||||
<?php
|
||||
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* OQL syntax analyzer, to be used prior to run the lexical analyzer
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
// Notes (from the source file: oql-lexer.plex) - Romain
|
||||
//
|
||||
// The strval rule is a little bit cryptic.
|
||||
@@ -98,6 +122,7 @@ class OQLLexerRaw
|
||||
'/^,/',
|
||||
'/^\\(/',
|
||||
'/^\\)/',
|
||||
'/^REGEXP/',
|
||||
'/^=/',
|
||||
'/^!=/',
|
||||
'/^>/',
|
||||
@@ -112,6 +137,7 @@ class OQLLexerRaw
|
||||
'/^IF/',
|
||||
'/^ELT/',
|
||||
'/^COALESCE/',
|
||||
'/^ISNULL/',
|
||||
'/^CONCAT/',
|
||||
'/^SUBSTR/',
|
||||
'/^TRIM/',
|
||||
@@ -314,204 +340,214 @@ class OQLLexerRaw
|
||||
function yy_r1_16($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::EQ;
|
||||
$this->token = OQLParser::REGEXP;
|
||||
}
|
||||
function yy_r1_17($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::NOT_EQ;
|
||||
$this->token = OQLParser::EQ;
|
||||
}
|
||||
function yy_r1_18($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::GT;
|
||||
$this->token = OQLParser::NOT_EQ;
|
||||
}
|
||||
function yy_r1_19($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::LT;
|
||||
$this->token = OQLParser::GT;
|
||||
}
|
||||
function yy_r1_20($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::GE;
|
||||
$this->token = OQLParser::LT;
|
||||
}
|
||||
function yy_r1_21($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::LE;
|
||||
$this->token = OQLParser::GE;
|
||||
}
|
||||
function yy_r1_22($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::LIKE;
|
||||
$this->token = OQLParser::LE;
|
||||
}
|
||||
function yy_r1_23($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::NOT_LIKE;
|
||||
$this->token = OQLParser::LIKE;
|
||||
}
|
||||
function yy_r1_24($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::IN;
|
||||
$this->token = OQLParser::NOT_LIKE;
|
||||
}
|
||||
function yy_r1_25($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::NOT_IN;
|
||||
$this->token = OQLParser::IN;
|
||||
}
|
||||
function yy_r1_26($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::INTERVAL;
|
||||
$this->token = OQLParser::NOT_IN;
|
||||
}
|
||||
function yy_r1_27($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_IF;
|
||||
$this->token = OQLParser::INTERVAL;
|
||||
}
|
||||
function yy_r1_28($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_ELT;
|
||||
$this->token = OQLParser::F_IF;
|
||||
}
|
||||
function yy_r1_29($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_COALESCE;
|
||||
$this->token = OQLParser::F_ELT;
|
||||
}
|
||||
function yy_r1_30($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_CONCAT;
|
||||
$this->token = OQLParser::F_COALESCE;
|
||||
}
|
||||
function yy_r1_31($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_SUBSTR;
|
||||
$this->token = OQLParser::F_ISNULL;
|
||||
}
|
||||
function yy_r1_32($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_TRIM;
|
||||
$this->token = OQLParser::F_CONCAT;
|
||||
}
|
||||
function yy_r1_33($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_DATE;
|
||||
$this->token = OQLParser::F_SUBSTR;
|
||||
}
|
||||
function yy_r1_34($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_DATE_FORMAT;
|
||||
$this->token = OQLParser::F_TRIM;
|
||||
}
|
||||
function yy_r1_35($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_CURRENT_DATE;
|
||||
$this->token = OQLParser::F_DATE;
|
||||
}
|
||||
function yy_r1_36($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_NOW;
|
||||
$this->token = OQLParser::F_DATE_FORMAT;
|
||||
}
|
||||
function yy_r1_37($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_TIME;
|
||||
$this->token = OQLParser::F_CURRENT_DATE;
|
||||
}
|
||||
function yy_r1_38($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_TO_DAYS;
|
||||
$this->token = OQLParser::F_NOW;
|
||||
}
|
||||
function yy_r1_39($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_FROM_DAYS;
|
||||
$this->token = OQLParser::F_TIME;
|
||||
}
|
||||
function yy_r1_40($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_YEAR;
|
||||
$this->token = OQLParser::F_TO_DAYS;
|
||||
}
|
||||
function yy_r1_41($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_MONTH;
|
||||
$this->token = OQLParser::F_FROM_DAYS;
|
||||
}
|
||||
function yy_r1_42($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_DAY;
|
||||
$this->token = OQLParser::F_YEAR;
|
||||
}
|
||||
function yy_r1_43($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_HOUR;
|
||||
$this->token = OQLParser::F_MONTH;
|
||||
}
|
||||
function yy_r1_44($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_MINUTE;
|
||||
$this->token = OQLParser::F_DAY;
|
||||
}
|
||||
function yy_r1_45($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_SECOND;
|
||||
$this->token = OQLParser::F_HOUR;
|
||||
}
|
||||
function yy_r1_46($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_DATE_ADD;
|
||||
$this->token = OQLParser::F_MINUTE;
|
||||
}
|
||||
function yy_r1_47($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_DATE_SUB;
|
||||
$this->token = OQLParser::F_SECOND;
|
||||
}
|
||||
function yy_r1_48($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_ROUND;
|
||||
$this->token = OQLParser::F_DATE_ADD;
|
||||
}
|
||||
function yy_r1_49($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_FLOOR;
|
||||
$this->token = OQLParser::F_DATE_SUB;
|
||||
}
|
||||
function yy_r1_50($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_INET_ATON;
|
||||
$this->token = OQLParser::F_ROUND;
|
||||
}
|
||||
function yy_r1_51($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::F_INET_NTOA;
|
||||
$this->token = OQLParser::F_FLOOR;
|
||||
}
|
||||
function yy_r1_52($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::NUMVAL;
|
||||
$this->token = OQLParser::F_INET_ATON;
|
||||
}
|
||||
function yy_r1_53($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::STRVAL;
|
||||
$this->token = OQLParser::F_INET_NTOA;
|
||||
}
|
||||
function yy_r1_54($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::NAME;
|
||||
$this->token = OQLParser::NUMVAL;
|
||||
}
|
||||
function yy_r1_55($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::VARNAME;
|
||||
$this->token = OQLParser::STRVAL;
|
||||
}
|
||||
function yy_r1_56($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::NAME;
|
||||
}
|
||||
function yy_r1_57($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::VARNAME;
|
||||
}
|
||||
function yy_r1_58($yy_subpatterns)
|
||||
{
|
||||
|
||||
$this->token = OQLParser::DOT;
|
||||
|
||||
@@ -94,6 +94,7 @@ math_plus = "+"
|
||||
math_minus = "-"
|
||||
log_and = "AND"
|
||||
log_or = "OR"
|
||||
regexp = "REGEXP"
|
||||
eq = "="
|
||||
not_eq = "!="
|
||||
gt = ">"
|
||||
@@ -108,6 +109,7 @@ interval = "INTERVAL"
|
||||
f_if = "IF"
|
||||
f_elt = "ELT"
|
||||
f_coalesce = "COALESCE"
|
||||
f_isnull = "ISNULL"
|
||||
f_concat = "CONCAT"
|
||||
f_substr = "SUBSTR"
|
||||
f_trim = "TRIM"
|
||||
@@ -186,6 +188,9 @@ par_open {
|
||||
par_close {
|
||||
$this->token = OQLParser::PAR_CLOSE;
|
||||
}
|
||||
regexp {
|
||||
$this->token = OQLParser::REGEXP;
|
||||
}
|
||||
eq {
|
||||
$this->token = OQLParser::EQ;
|
||||
}
|
||||
@@ -228,6 +233,9 @@ f_elt {
|
||||
f_coalesce {
|
||||
$this->token = OQLParser::F_COALESCE;
|
||||
}
|
||||
f_isnull {
|
||||
$this->token = OQLParser::F_ISNULL;
|
||||
}
|
||||
f_concat {
|
||||
$this->token = OQLParser::F_CONCAT;
|
||||
}
|
||||
|
||||
@@ -133,43 +133,45 @@ class OQLParserRaw#line 102 "oql-parser.php"
|
||||
const NAME = 20;
|
||||
const NUMVAL = 21;
|
||||
const STRVAL = 22;
|
||||
const NOT_EQ = 23;
|
||||
const LOG_AND = 24;
|
||||
const LOG_OR = 25;
|
||||
const MATH_DIV = 26;
|
||||
const MATH_MULT = 27;
|
||||
const MATH_PLUS = 28;
|
||||
const MATH_MINUS = 29;
|
||||
const GT = 30;
|
||||
const LT = 31;
|
||||
const GE = 32;
|
||||
const LE = 33;
|
||||
const LIKE = 34;
|
||||
const NOT_LIKE = 35;
|
||||
const IN = 36;
|
||||
const NOT_IN = 37;
|
||||
const F_IF = 38;
|
||||
const F_ELT = 39;
|
||||
const F_COALESCE = 40;
|
||||
const F_CONCAT = 41;
|
||||
const F_SUBSTR = 42;
|
||||
const F_TRIM = 43;
|
||||
const F_DATE = 44;
|
||||
const F_DATE_FORMAT = 45;
|
||||
const F_CURRENT_DATE = 46;
|
||||
const F_NOW = 47;
|
||||
const F_TIME = 48;
|
||||
const F_TO_DAYS = 49;
|
||||
const F_FROM_DAYS = 50;
|
||||
const F_DATE_ADD = 51;
|
||||
const F_DATE_SUB = 52;
|
||||
const F_ROUND = 53;
|
||||
const F_FLOOR = 54;
|
||||
const F_INET_ATON = 55;
|
||||
const F_INET_NTOA = 56;
|
||||
const YY_NO_ACTION = 234;
|
||||
const YY_ACCEPT_ACTION = 233;
|
||||
const YY_ERROR_ACTION = 232;
|
||||
const REGEXP = 23;
|
||||
const NOT_EQ = 24;
|
||||
const LOG_AND = 25;
|
||||
const LOG_OR = 26;
|
||||
const MATH_DIV = 27;
|
||||
const MATH_MULT = 28;
|
||||
const MATH_PLUS = 29;
|
||||
const MATH_MINUS = 30;
|
||||
const GT = 31;
|
||||
const LT = 32;
|
||||
const GE = 33;
|
||||
const LE = 34;
|
||||
const LIKE = 35;
|
||||
const NOT_LIKE = 36;
|
||||
const IN = 37;
|
||||
const NOT_IN = 38;
|
||||
const F_IF = 39;
|
||||
const F_ELT = 40;
|
||||
const F_COALESCE = 41;
|
||||
const F_ISNULL = 42;
|
||||
const F_CONCAT = 43;
|
||||
const F_SUBSTR = 44;
|
||||
const F_TRIM = 45;
|
||||
const F_DATE = 46;
|
||||
const F_DATE_FORMAT = 47;
|
||||
const F_CURRENT_DATE = 48;
|
||||
const F_NOW = 49;
|
||||
const F_TIME = 50;
|
||||
const F_TO_DAYS = 51;
|
||||
const F_FROM_DAYS = 52;
|
||||
const F_DATE_ADD = 53;
|
||||
const F_DATE_SUB = 54;
|
||||
const F_ROUND = 55;
|
||||
const F_FLOOR = 56;
|
||||
const F_INET_ATON = 57;
|
||||
const F_INET_NTOA = 58;
|
||||
const YY_NO_ACTION = 238;
|
||||
const YY_ACCEPT_ACTION = 237;
|
||||
const YY_ERROR_ACTION = 236;
|
||||
|
||||
/* Next are that tables used to determine what action to take based on the
|
||||
** current state and lookahead token. These tables are used to implement
|
||||
@@ -221,165 +223,179 @@ class OQLParserRaw#line 102 "oql-parser.php"
|
||||
** shifting non-terminals after a reduce.
|
||||
** self::$yy_default Default action for each state.
|
||||
*/
|
||||
const YY_SZ_ACTTAB = 384;
|
||||
const YY_SZ_ACTTAB = 455;
|
||||
static public $yy_action = array(
|
||||
/* 0 */ 4, 117, 5, 11, 8, 106, 121, 122, 130, 103,
|
||||
/* 10 */ 89, 91, 82, 83, 26, 3, 134, 118, 116, 12,
|
||||
/* 20 */ 105, 70, 54, 58, 60, 59, 63, 64, 57, 90,
|
||||
/* 30 */ 107, 108, 127, 126, 125, 123, 124, 128, 129, 133,
|
||||
/* 40 */ 132, 131, 113, 112, 81, 109, 110, 114, 16, 52,
|
||||
/* 50 */ 69, 31, 30, 29, 95, 97, 4, 33, 96, 101,
|
||||
/* 60 */ 49, 27, 121, 122, 130, 25, 89, 91, 82, 83,
|
||||
/* 70 */ 94, 86, 85, 84, 94, 86, 85, 84, 50, 28,
|
||||
/* 80 */ 141, 141, 74, 25, 53, 90, 107, 108, 127, 126,
|
||||
/* 90 */ 125, 123, 124, 128, 129, 133, 132, 131, 113, 112,
|
||||
/* 100 */ 81, 109, 110, 114, 4, 87, 42, 88, 93, 23,
|
||||
/* 110 */ 121, 122, 130, 74, 89, 91, 82, 83, 46, 2,
|
||||
/* 120 */ 7, 94, 86, 85, 84, 102, 82, 83, 19, 48,
|
||||
/* 130 */ 62, 45, 105, 90, 107, 108, 127, 126, 125, 123,
|
||||
/* 140 */ 124, 128, 129, 133, 132, 131, 113, 112, 81, 109,
|
||||
/* 150 */ 110, 114, 233, 111, 100, 52, 56, 74, 74, 74,
|
||||
/* 160 */ 6, 97, 37, 34, 96, 101, 49, 17, 38, 186,
|
||||
/* 170 */ 22, 23, 14, 6, 41, 44, 76, 55, 23, 52,
|
||||
/* 180 */ 94, 86, 85, 84, 50, 97, 40, 34, 96, 101,
|
||||
/* 190 */ 49, 47, 20, 75, 22, 52, 14, 1, 41, 35,
|
||||
/* 200 */ 61, 51, 67, 52, 94, 86, 85, 84, 50, 97,
|
||||
/* 210 */ 40, 34, 96, 101, 49, 13, 104, 52, 22, 24,
|
||||
/* 220 */ 14, 74, 41, 66, 50, 10, 80, 91, 94, 86,
|
||||
/* 230 */ 85, 84, 50, 98, 52, 25, 36, 120, 119, 23,
|
||||
/* 240 */ 97, 37, 34, 96, 101, 49, 50, 92, 74, 22,
|
||||
/* 250 */ 52, 14, 43, 41, 71, 68, 51, 23, 52, 94,
|
||||
/* 260 */ 86, 85, 84, 50, 97, 18, 34, 96, 101, 49,
|
||||
/* 270 */ 193, 193, 99, 22, 193, 14, 193, 41, 193, 50,
|
||||
/* 280 */ 9, 193, 52, 94, 86, 85, 84, 50, 97, 32,
|
||||
/* 290 */ 34, 96, 101, 49, 115, 193, 193, 22, 193, 14,
|
||||
/* 300 */ 193, 41, 193, 193, 193, 193, 52, 94, 86, 85,
|
||||
/* 310 */ 84, 50, 97, 193, 34, 96, 101, 49, 193, 193,
|
||||
/* 320 */ 193, 22, 193, 14, 193, 39, 193, 193, 193, 193,
|
||||
/* 330 */ 52, 94, 86, 85, 84, 50, 97, 193, 34, 96,
|
||||
/* 340 */ 101, 49, 193, 193, 193, 22, 193, 15, 65, 77,
|
||||
/* 350 */ 79, 78, 73, 72, 52, 94, 86, 85, 84, 50,
|
||||
/* 360 */ 97, 105, 34, 96, 101, 49, 193, 193, 193, 21,
|
||||
/* 370 */ 193, 193, 193, 193, 193, 193, 193, 193, 193, 94,
|
||||
/* 380 */ 86, 85, 84, 50,
|
||||
/* 0 */ 17, 6, 29, 143, 143, 28, 23, 56, 5, 120,
|
||||
/* 10 */ 12, 2, 107, 10, 133, 134, 135, 102, 83, 82,
|
||||
/* 20 */ 87, 88, 103, 104, 121, 119, 115, 116, 106, 105,
|
||||
/* 30 */ 117, 118, 136, 66, 58, 59, 60, 57, 93, 92,
|
||||
/* 40 */ 91, 89, 90, 108, 109, 128, 127, 126, 124, 125,
|
||||
/* 50 */ 129, 130, 131, 132, 123, 122, 114, 113, 5, 35,
|
||||
/* 60 */ 7, 3, 24, 70, 133, 134, 135, 106, 83, 82,
|
||||
/* 70 */ 87, 88, 4, 75, 74, 73, 76, 77, 79, 62,
|
||||
/* 80 */ 52, 69, 30, 20, 26, 63, 55, 106, 93, 92,
|
||||
/* 90 */ 91, 89, 90, 108, 109, 128, 127, 126, 124, 125,
|
||||
/* 100 */ 129, 130, 131, 132, 123, 122, 114, 113, 5, 54,
|
||||
/* 110 */ 64, 64, 64, 64, 133, 134, 135, 8, 83, 82,
|
||||
/* 120 */ 87, 88, 71, 43, 16, 24, 24, 31, 25, 81,
|
||||
/* 130 */ 111, 27, 188, 19, 53, 23, 49, 50, 93, 92,
|
||||
/* 140 */ 91, 89, 90, 108, 109, 128, 127, 126, 124, 125,
|
||||
/* 150 */ 129, 130, 131, 132, 123, 122, 114, 113, 237, 110,
|
||||
/* 160 */ 100, 52, 64, 64, 9, 68, 64, 97, 46, 32,
|
||||
/* 170 */ 96, 101, 51, 44, 45, 84, 21, 24, 15, 38,
|
||||
/* 180 */ 40, 13, 24, 82, 11, 52, 95, 94, 86, 85,
|
||||
/* 190 */ 54, 97, 39, 32, 96, 101, 51, 47, 112, 1,
|
||||
/* 200 */ 21, 23, 15, 8, 40, 99, 80, 72, 78, 52,
|
||||
/* 210 */ 95, 94, 86, 85, 54, 97, 39, 32, 96, 101,
|
||||
/* 220 */ 51, 42, 197, 197, 21, 52, 15, 197, 40, 197,
|
||||
/* 230 */ 67, 55, 61, 52, 95, 94, 86, 85, 54, 97,
|
||||
/* 240 */ 36, 32, 96, 101, 51, 197, 197, 197, 21, 197,
|
||||
/* 250 */ 15, 197, 40, 197, 54, 48, 98, 52, 95, 94,
|
||||
/* 260 */ 86, 85, 54, 97, 46, 32, 96, 101, 51, 197,
|
||||
/* 270 */ 197, 197, 21, 52, 15, 197, 40, 197, 197, 65,
|
||||
/* 280 */ 197, 52, 95, 94, 86, 85, 54, 97, 41, 32,
|
||||
/* 290 */ 96, 101, 51, 197, 197, 197, 21, 197, 15, 197,
|
||||
/* 300 */ 40, 197, 54, 197, 197, 52, 95, 94, 86, 85,
|
||||
/* 310 */ 54, 97, 33, 32, 96, 101, 51, 197, 197, 197,
|
||||
/* 320 */ 21, 197, 15, 197, 40, 197, 197, 197, 197, 52,
|
||||
/* 330 */ 95, 94, 86, 85, 54, 97, 18, 32, 96, 101,
|
||||
/* 340 */ 51, 197, 197, 197, 21, 197, 15, 197, 40, 197,
|
||||
/* 350 */ 197, 197, 197, 52, 95, 94, 86, 85, 54, 97,
|
||||
/* 360 */ 197, 32, 96, 101, 51, 197, 197, 197, 21, 197,
|
||||
/* 370 */ 15, 197, 37, 197, 197, 197, 197, 52, 95, 94,
|
||||
/* 380 */ 86, 85, 54, 97, 197, 32, 96, 101, 51, 197,
|
||||
/* 390 */ 197, 197, 21, 197, 14, 197, 197, 197, 197, 197,
|
||||
/* 400 */ 197, 52, 95, 94, 86, 85, 54, 97, 197, 32,
|
||||
/* 410 */ 96, 101, 51, 197, 197, 197, 22, 197, 197, 197,
|
||||
/* 420 */ 197, 197, 197, 197, 197, 52, 95, 94, 86, 85,
|
||||
/* 430 */ 54, 97, 197, 34, 96, 101, 51, 197, 197, 197,
|
||||
/* 440 */ 197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
|
||||
/* 450 */ 95, 94, 86, 85, 54,
|
||||
);
|
||||
static public $yy_lookahead = array(
|
||||
/* 0 */ 9, 8, 11, 4, 79, 10, 15, 16, 17, 10,
|
||||
/* 10 */ 19, 20, 21, 22, 2, 5, 23, 92, 93, 7,
|
||||
/* 20 */ 25, 28, 29, 30, 31, 32, 33, 34, 35, 38,
|
||||
/* 30 */ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
|
||||
/* 40 */ 49, 50, 51, 52, 53, 54, 55, 56, 1, 61,
|
||||
/* 50 */ 63, 3, 4, 61, 70, 67, 9, 69, 70, 71,
|
||||
/* 60 */ 72, 2, 15, 16, 17, 6, 19, 20, 21, 22,
|
||||
/* 70 */ 86, 87, 88, 89, 86, 87, 88, 89, 90, 2,
|
||||
/* 80 */ 3, 4, 90, 6, 61, 38, 39, 40, 41, 42,
|
||||
/* 90 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
|
||||
/* 100 */ 53, 54, 55, 56, 9, 70, 62, 36, 37, 65,
|
||||
/* 110 */ 15, 16, 17, 90, 19, 20, 21, 22, 83, 4,
|
||||
/* 120 */ 81, 86, 87, 88, 89, 10, 21, 22, 61, 61,
|
||||
/* 130 */ 61, 64, 25, 38, 39, 40, 41, 42, 43, 44,
|
||||
/* 140 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
|
||||
/* 150 */ 55, 56, 58, 59, 60, 61, 24, 90, 90, 90,
|
||||
/* 160 */ 82, 67, 68, 69, 70, 71, 72, 8, 62, 18,
|
||||
/* 170 */ 76, 65, 78, 82, 80, 62, 85, 63, 65, 61,
|
||||
/* 180 */ 86, 87, 88, 89, 90, 67, 68, 69, 70, 71,
|
||||
/* 190 */ 72, 73, 61, 63, 76, 61, 78, 9, 80, 18,
|
||||
/* 200 */ 66, 67, 84, 61, 86, 87, 88, 89, 90, 67,
|
||||
/* 210 */ 68, 69, 70, 71, 72, 7, 75, 61, 76, 61,
|
||||
/* 220 */ 78, 90, 80, 67, 90, 9, 84, 20, 86, 87,
|
||||
/* 230 */ 88, 89, 90, 60, 61, 6, 62, 26, 27, 65,
|
||||
/* 240 */ 67, 68, 69, 70, 71, 72, 90, 90, 90, 76,
|
||||
/* 250 */ 61, 78, 74, 80, 62, 66, 67, 65, 61, 86,
|
||||
/* 260 */ 87, 88, 89, 90, 67, 68, 69, 70, 71, 72,
|
||||
/* 270 */ 94, 94, 63, 76, 94, 78, 94, 80, 94, 90,
|
||||
/* 280 */ 77, 94, 61, 86, 87, 88, 89, 90, 67, 68,
|
||||
/* 290 */ 69, 70, 71, 72, 91, 94, 94, 76, 94, 78,
|
||||
/* 300 */ 94, 80, 94, 94, 94, 94, 61, 86, 87, 88,
|
||||
/* 310 */ 89, 90, 67, 94, 69, 70, 71, 72, 94, 94,
|
||||
/* 320 */ 94, 76, 94, 78, 94, 80, 94, 94, 94, 94,
|
||||
/* 330 */ 61, 86, 87, 88, 89, 90, 67, 94, 69, 70,
|
||||
/* 340 */ 71, 72, 94, 94, 94, 76, 94, 78, 12, 13,
|
||||
/* 350 */ 14, 15, 16, 17, 61, 86, 87, 88, 89, 90,
|
||||
/* 360 */ 67, 25, 69, 70, 71, 72, 94, 94, 94, 76,
|
||||
/* 370 */ 94, 94, 94, 94, 94, 94, 94, 94, 94, 86,
|
||||
/* 380 */ 87, 88, 89, 90,
|
||||
/* 0 */ 1, 4, 2, 3, 4, 2, 6, 10, 9, 8,
|
||||
/* 10 */ 7, 4, 10, 81, 15, 16, 17, 10, 19, 20,
|
||||
/* 20 */ 21, 22, 37, 38, 23, 24, 94, 95, 26, 77,
|
||||
/* 30 */ 29, 30, 31, 32, 33, 34, 35, 36, 39, 40,
|
||||
/* 40 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
|
||||
/* 50 */ 51, 52, 53, 54, 55, 56, 57, 58, 9, 64,
|
||||
/* 60 */ 11, 5, 67, 65, 15, 16, 17, 26, 19, 20,
|
||||
/* 70 */ 21, 22, 9, 12, 13, 14, 15, 16, 17, 25,
|
||||
/* 80 */ 63, 63, 63, 63, 63, 68, 69, 26, 39, 40,
|
||||
/* 90 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
|
||||
/* 100 */ 51, 52, 53, 54, 55, 56, 57, 58, 9, 92,
|
||||
/* 110 */ 92, 92, 92, 92, 15, 16, 17, 84, 19, 20,
|
||||
/* 120 */ 21, 22, 64, 64, 8, 67, 67, 3, 4, 27,
|
||||
/* 130 */ 28, 2, 18, 63, 63, 6, 66, 63, 39, 40,
|
||||
/* 140 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
|
||||
/* 150 */ 51, 52, 53, 54, 55, 56, 57, 58, 60, 61,
|
||||
/* 160 */ 62, 63, 92, 92, 83, 65, 92, 69, 70, 71,
|
||||
/* 170 */ 72, 73, 74, 18, 64, 92, 78, 67, 80, 64,
|
||||
/* 180 */ 82, 7, 67, 20, 79, 63, 88, 89, 90, 91,
|
||||
/* 190 */ 92, 69, 70, 71, 72, 73, 74, 75, 93, 9,
|
||||
/* 200 */ 78, 6, 80, 84, 82, 65, 87, 65, 86, 63,
|
||||
/* 210 */ 88, 89, 90, 91, 92, 69, 70, 71, 72, 73,
|
||||
/* 220 */ 74, 76, 96, 96, 78, 63, 80, 96, 82, 96,
|
||||
/* 230 */ 68, 69, 86, 63, 88, 89, 90, 91, 92, 69,
|
||||
/* 240 */ 70, 71, 72, 73, 74, 96, 96, 96, 78, 96,
|
||||
/* 250 */ 80, 96, 82, 96, 92, 85, 62, 63, 88, 89,
|
||||
/* 260 */ 90, 91, 92, 69, 70, 71, 72, 73, 74, 96,
|
||||
/* 270 */ 96, 96, 78, 63, 80, 96, 82, 96, 96, 69,
|
||||
/* 280 */ 96, 63, 88, 89, 90, 91, 92, 69, 70, 71,
|
||||
/* 290 */ 72, 73, 74, 96, 96, 96, 78, 96, 80, 96,
|
||||
/* 300 */ 82, 96, 92, 96, 96, 63, 88, 89, 90, 91,
|
||||
/* 310 */ 92, 69, 70, 71, 72, 73, 74, 96, 96, 96,
|
||||
/* 320 */ 78, 96, 80, 96, 82, 96, 96, 96, 96, 63,
|
||||
/* 330 */ 88, 89, 90, 91, 92, 69, 70, 71, 72, 73,
|
||||
/* 340 */ 74, 96, 96, 96, 78, 96, 80, 96, 82, 96,
|
||||
/* 350 */ 96, 96, 96, 63, 88, 89, 90, 91, 92, 69,
|
||||
/* 360 */ 96, 71, 72, 73, 74, 96, 96, 96, 78, 96,
|
||||
/* 370 */ 80, 96, 82, 96, 96, 96, 96, 63, 88, 89,
|
||||
/* 380 */ 90, 91, 92, 69, 96, 71, 72, 73, 74, 96,
|
||||
/* 390 */ 96, 96, 78, 96, 80, 96, 96, 96, 96, 96,
|
||||
/* 400 */ 96, 63, 88, 89, 90, 91, 92, 69, 96, 71,
|
||||
/* 410 */ 72, 73, 74, 96, 96, 96, 78, 96, 96, 96,
|
||||
/* 420 */ 96, 96, 96, 96, 96, 63, 88, 89, 90, 91,
|
||||
/* 430 */ 92, 69, 96, 71, 72, 73, 74, 96, 96, 96,
|
||||
/* 440 */ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
|
||||
/* 450 */ 88, 89, 90, 91, 92,
|
||||
);
|
||||
const YY_SHIFT_USE_DFLT = -10;
|
||||
const YY_SHIFT_MAX = 53;
|
||||
const YY_SHIFT_USE_DFLT = -16;
|
||||
const YY_SHIFT_MAX = 55;
|
||||
static public $yy_shift_ofst = array(
|
||||
/* 0 */ 47, -9, -9, 95, 95, 95, 95, 95, 95, 95,
|
||||
/* 10 */ 105, 105, 207, 207, -7, -7, 207, 207, 336, 77,
|
||||
/* 20 */ 59, 211, 211, 229, 229, 207, 207, 207, 207, 229,
|
||||
/* 30 */ 207, 207, -5, 71, 71, 207, 10, 107, 10, 132,
|
||||
/* 40 */ 107, 132, 10, 216, 10, 48, -1, 115, 12, 188,
|
||||
/* 50 */ 151, 159, 181, 208,
|
||||
/* 0 */ -1, 49, 49, 99, 99, 99, 99, 99, 99, 99,
|
||||
/* 10 */ 99, 99, 163, 163, 1, 1, 163, 163, 61, 0,
|
||||
/* 20 */ 129, 102, 102, 163, 195, 163, 195, 163, 163, 163,
|
||||
/* 30 */ 195, 163, -15, 2, -15, 56, 41, 54, 56, 41,
|
||||
/* 40 */ 54, 41, 63, 56, 163, 56, 41, 7, -3, 124,
|
||||
/* 50 */ 3, 190, 155, 174, 114, 116,
|
||||
);
|
||||
const YY_REDUCE_USE_DFLT = -76;
|
||||
const YY_REDUCE_MAX = 44;
|
||||
const YY_REDUCE_USE_DFLT = -69;
|
||||
const YY_REDUCE_MAX = 46;
|
||||
static public $yy_reduce_ofst = array(
|
||||
/* 0 */ 94, 118, 142, 173, 221, 197, 245, 269, 293, -12,
|
||||
/* 10 */ 35, -16, 134, 189, -75, -75, 67, 156, 91, 174,
|
||||
/* 20 */ 113, 203, 203, 192, 44, 68, 23, -8, 158, 106,
|
||||
/* 30 */ 69, 131, 78, 178, 178, 157, 209, 78, 114, 39,
|
||||
/* 40 */ 78, 39, -13, 141, 130,
|
||||
/* 0 */ 98, 122, 146, 194, 170, 242, 218, 266, 290, 314,
|
||||
/* 10 */ 338, 362, 162, 17, -68, -68, 210, 70, 119, 115,
|
||||
/* 20 */ 110, 105, 105, 74, 58, 18, -5, 19, 71, 21,
|
||||
/* 30 */ 59, 20, 145, 33, 145, 142, 33, 81, 140, 33,
|
||||
/* 40 */ 81, 33, -48, -2, 83, 100, 33,
|
||||
);
|
||||
static public $yyExpectedTokens = array(
|
||||
/* 0 */ array(1, 9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
|
||||
/* 1 */ array(9, 11, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
|
||||
/* 2 */ array(9, 11, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
|
||||
/* 3 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
|
||||
/* 4 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
|
||||
/* 5 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
|
||||
/* 6 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
|
||||
/* 7 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
|
||||
/* 8 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
|
||||
/* 9 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
|
||||
/* 10 */ array(21, 22, ),
|
||||
/* 11 */ array(21, 22, ),
|
||||
/* 0 */ array(1, 9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
|
||||
/* 1 */ array(9, 11, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
|
||||
/* 2 */ array(9, 11, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
|
||||
/* 3 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
|
||||
/* 4 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
|
||||
/* 5 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
|
||||
/* 6 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
|
||||
/* 7 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
|
||||
/* 8 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
|
||||
/* 9 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
|
||||
/* 10 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
|
||||
/* 11 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
|
||||
/* 12 */ array(20, ),
|
||||
/* 13 */ array(20, ),
|
||||
/* 14 */ array(8, 23, 28, 29, 30, 31, 32, 33, 34, 35, ),
|
||||
/* 15 */ array(8, 23, 28, 29, 30, 31, 32, 33, 34, 35, ),
|
||||
/* 14 */ array(8, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, ),
|
||||
/* 15 */ array(8, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, ),
|
||||
/* 16 */ array(20, ),
|
||||
/* 17 */ array(20, ),
|
||||
/* 18 */ array(12, 13, 14, 15, 16, 17, 25, ),
|
||||
/* 18 */ array(12, 13, 14, 15, 16, 17, 26, ),
|
||||
/* 19 */ array(2, 3, 4, 6, ),
|
||||
/* 20 */ array(2, 6, ),
|
||||
/* 21 */ array(26, 27, ),
|
||||
/* 22 */ array(26, 27, ),
|
||||
/* 23 */ array(6, ),
|
||||
/* 21 */ array(27, 28, ),
|
||||
/* 22 */ array(27, 28, ),
|
||||
/* 23 */ array(20, ),
|
||||
/* 24 */ array(6, ),
|
||||
/* 25 */ array(20, ),
|
||||
/* 26 */ array(20, ),
|
||||
/* 26 */ array(6, ),
|
||||
/* 27 */ array(20, ),
|
||||
/* 28 */ array(20, ),
|
||||
/* 29 */ array(6, ),
|
||||
/* 30 */ array(20, ),
|
||||
/* 29 */ array(20, ),
|
||||
/* 30 */ array(6, ),
|
||||
/* 31 */ array(20, ),
|
||||
/* 32 */ array(10, 25, ),
|
||||
/* 33 */ array(36, 37, ),
|
||||
/* 34 */ array(36, 37, ),
|
||||
/* 35 */ array(20, ),
|
||||
/* 36 */ array(5, ),
|
||||
/* 32 */ array(37, 38, ),
|
||||
/* 33 */ array(10, 26, ),
|
||||
/* 34 */ array(37, 38, ),
|
||||
/* 35 */ array(5, ),
|
||||
/* 36 */ array(26, ),
|
||||
/* 37 */ array(25, ),
|
||||
/* 38 */ array(5, ),
|
||||
/* 39 */ array(24, ),
|
||||
/* 39 */ array(26, ),
|
||||
/* 40 */ array(25, ),
|
||||
/* 41 */ array(24, ),
|
||||
/* 42 */ array(5, ),
|
||||
/* 43 */ array(9, ),
|
||||
/* 44 */ array(5, ),
|
||||
/* 45 */ array(3, 4, ),
|
||||
/* 46 */ array(4, 10, ),
|
||||
/* 41 */ array(26, ),
|
||||
/* 42 */ array(9, ),
|
||||
/* 43 */ array(5, ),
|
||||
/* 44 */ array(20, ),
|
||||
/* 45 */ array(5, ),
|
||||
/* 46 */ array(26, ),
|
||||
/* 47 */ array(4, 10, ),
|
||||
/* 48 */ array(2, 7, ),
|
||||
/* 49 */ array(9, ),
|
||||
/* 50 */ array(18, ),
|
||||
/* 51 */ array(8, ),
|
||||
/* 48 */ array(4, 10, ),
|
||||
/* 49 */ array(3, 4, ),
|
||||
/* 50 */ array(2, 7, ),
|
||||
/* 51 */ array(9, ),
|
||||
/* 52 */ array(18, ),
|
||||
/* 53 */ array(7, ),
|
||||
/* 54 */ array(),
|
||||
/* 55 */ array(),
|
||||
/* 54 */ array(18, ),
|
||||
/* 55 */ array(8, ),
|
||||
/* 56 */ array(),
|
||||
/* 57 */ array(),
|
||||
/* 58 */ array(),
|
||||
@@ -459,22 +475,24 @@ static public $yy_action = array(
|
||||
/* 132 */ array(),
|
||||
/* 133 */ array(),
|
||||
/* 134 */ array(),
|
||||
/* 135 */ array(),
|
||||
/* 136 */ array(),
|
||||
);
|
||||
static public $yy_default = array(
|
||||
/* 0 */ 232, 169, 232, 232, 232, 232, 232, 232, 232, 232,
|
||||
/* 10 */ 232, 232, 232, 232, 162, 163, 232, 232, 232, 147,
|
||||
/* 20 */ 147, 161, 160, 146, 147, 232, 232, 232, 232, 147,
|
||||
/* 30 */ 232, 232, 232, 159, 158, 232, 144, 151, 144, 165,
|
||||
/* 40 */ 172, 164, 144, 232, 144, 232, 232, 232, 232, 232,
|
||||
/* 50 */ 184, 232, 232, 232, 201, 140, 196, 207, 202, 204,
|
||||
/* 60 */ 203, 149, 142, 205, 206, 174, 150, 170, 148, 138,
|
||||
/* 70 */ 200, 145, 179, 178, 186, 139, 173, 175, 177, 176,
|
||||
/* 80 */ 171, 228, 189, 190, 183, 182, 181, 167, 208, 187,
|
||||
/* 90 */ 210, 188, 185, 209, 180, 168, 152, 153, 143, 137,
|
||||
/* 100 */ 136, 154, 155, 166, 157, 197, 156, 211, 212, 229,
|
||||
/* 110 */ 230, 135, 227, 226, 231, 191, 193, 194, 192, 199,
|
||||
/* 120 */ 198, 225, 224, 216, 217, 215, 214, 213, 218, 219,
|
||||
/* 130 */ 223, 222, 221, 220, 195,
|
||||
/* 0 */ 236, 171, 236, 236, 236, 236, 236, 236, 236, 236,
|
||||
/* 10 */ 236, 236, 236, 236, 165, 164, 236, 236, 236, 149,
|
||||
/* 20 */ 149, 162, 163, 236, 148, 236, 149, 236, 236, 236,
|
||||
/* 30 */ 149, 236, 160, 236, 161, 146, 169, 167, 146, 174,
|
||||
/* 40 */ 166, 170, 236, 146, 236, 146, 153, 236, 236, 236,
|
||||
/* 50 */ 236, 236, 236, 236, 186, 236, 168, 210, 207, 208,
|
||||
/* 60 */ 209, 173, 199, 150, 188, 152, 206, 151, 141, 144,
|
||||
/* 70 */ 142, 147, 140, 178, 177, 176, 179, 180, 172, 181,
|
||||
/* 80 */ 175, 201, 190, 189, 187, 185, 184, 191, 192, 216,
|
||||
/* 90 */ 217, 215, 214, 213, 183, 182, 154, 155, 145, 139,
|
||||
/* 100 */ 138, 156, 157, 211, 212, 159, 200, 158, 218, 219,
|
||||
/* 110 */ 137, 202, 193, 235, 234, 194, 195, 203, 204, 198,
|
||||
/* 120 */ 197, 196, 233, 232, 223, 224, 222, 221, 220, 225,
|
||||
/* 130 */ 226, 230, 231, 229, 228, 227, 205,
|
||||
);
|
||||
/* The next thing included is series of defines which control
|
||||
** various aspects of the generated parser.
|
||||
@@ -491,11 +509,11 @@ static public $yy_action = array(
|
||||
** self::YYERRORSYMBOL is the code number of the error symbol. If not
|
||||
** defined, then do no error processing.
|
||||
*/
|
||||
const YYNOCODE = 95;
|
||||
const YYNOCODE = 97;
|
||||
const YYSTACKDEPTH = 100;
|
||||
const YYNSTATE = 135;
|
||||
const YYNRULE = 97;
|
||||
const YYERRORSYMBOL = 57;
|
||||
const YYNSTATE = 137;
|
||||
const YYNRULE = 99;
|
||||
const YYERRORSYMBOL = 59;
|
||||
const YYERRSYMDT = 'yy0';
|
||||
const YYFALLBACK = 0;
|
||||
/** The next table maps tokens into fallback tokens. If a construct
|
||||
@@ -582,25 +600,25 @@ static public $yy_action = array(
|
||||
'EQ', 'PAR_OPEN', 'PAR_CLOSE', 'INTERVAL',
|
||||
'F_SECOND', 'F_MINUTE', 'F_HOUR', 'F_DAY',
|
||||
'F_MONTH', 'F_YEAR', 'DOT', 'VARNAME',
|
||||
'NAME', 'NUMVAL', 'STRVAL', 'NOT_EQ',
|
||||
'LOG_AND', 'LOG_OR', 'MATH_DIV', 'MATH_MULT',
|
||||
'MATH_PLUS', 'MATH_MINUS', 'GT', 'LT',
|
||||
'GE', 'LE', 'LIKE', 'NOT_LIKE',
|
||||
'IN', 'NOT_IN', 'F_IF', 'F_ELT',
|
||||
'F_COALESCE', 'F_CONCAT', 'F_SUBSTR', 'F_TRIM',
|
||||
'F_DATE', 'F_DATE_FORMAT', 'F_CURRENT_DATE', 'F_NOW',
|
||||
'F_TIME', 'F_TO_DAYS', 'F_FROM_DAYS', 'F_DATE_ADD',
|
||||
'F_DATE_SUB', 'F_ROUND', 'F_FLOOR', 'F_INET_ATON',
|
||||
'F_INET_NTOA', 'error', 'result', 'query',
|
||||
'condition', 'class_name', 'join_statement', 'where_statement',
|
||||
'class_list', 'join_item', 'join_condition', 'field_id',
|
||||
'expression_prio4', 'expression_basic', 'scalar', 'var_name',
|
||||
'func_name', 'arg_list', 'list_operator', 'list',
|
||||
'expression_prio1', 'operator1', 'expression_prio2', 'operator2',
|
||||
'expression_prio3', 'operator3', 'operator4', 'scalar_list',
|
||||
'argument', 'interval_unit', 'num_scalar', 'str_scalar',
|
||||
'num_value', 'str_value', 'name', 'num_operator1',
|
||||
'num_operator2', 'str_operator',
|
||||
'NAME', 'NUMVAL', 'STRVAL', 'REGEXP',
|
||||
'NOT_EQ', 'LOG_AND', 'LOG_OR', 'MATH_DIV',
|
||||
'MATH_MULT', 'MATH_PLUS', 'MATH_MINUS', 'GT',
|
||||
'LT', 'GE', 'LE', 'LIKE',
|
||||
'NOT_LIKE', 'IN', 'NOT_IN', 'F_IF',
|
||||
'F_ELT', 'F_COALESCE', 'F_ISNULL', 'F_CONCAT',
|
||||
'F_SUBSTR', 'F_TRIM', 'F_DATE', 'F_DATE_FORMAT',
|
||||
'F_CURRENT_DATE', 'F_NOW', 'F_TIME', 'F_TO_DAYS',
|
||||
'F_FROM_DAYS', 'F_DATE_ADD', 'F_DATE_SUB', 'F_ROUND',
|
||||
'F_FLOOR', 'F_INET_ATON', 'F_INET_NTOA', 'error',
|
||||
'result', 'query', 'condition', 'class_name',
|
||||
'join_statement', 'where_statement', 'class_list', 'join_item',
|
||||
'join_condition', 'field_id', 'expression_prio4', 'expression_basic',
|
||||
'scalar', 'var_name', 'func_name', 'arg_list',
|
||||
'list_operator', 'list', 'expression_prio1', 'operator1',
|
||||
'expression_prio2', 'operator2', 'expression_prio3', 'operator3',
|
||||
'operator4', 'list_items', 'argument', 'interval_unit',
|
||||
'num_scalar', 'str_scalar', 'num_value', 'str_value',
|
||||
'name', 'num_operator1', 'num_operator2', 'str_operator',
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -639,9 +657,9 @@ static public $yy_action = array(
|
||||
/* 28 */ "expression_prio3 ::= expression_prio3 operator3 expression_prio2",
|
||||
/* 29 */ "expression_prio4 ::= expression_prio3",
|
||||
/* 30 */ "expression_prio4 ::= expression_prio4 operator4 expression_prio3",
|
||||
/* 31 */ "list ::= PAR_OPEN scalar_list PAR_CLOSE",
|
||||
/* 32 */ "scalar_list ::= scalar",
|
||||
/* 33 */ "scalar_list ::= scalar_list COMA scalar",
|
||||
/* 31 */ "list ::= PAR_OPEN list_items PAR_CLOSE",
|
||||
/* 32 */ "list_items ::= expression_prio4",
|
||||
/* 33 */ "list_items ::= list_items COMA expression_prio4",
|
||||
/* 34 */ "arg_list ::=",
|
||||
/* 35 */ "arg_list ::= argument",
|
||||
/* 36 */ "arg_list ::= arg_list COMA argument",
|
||||
@@ -667,44 +685,46 @@ static public $yy_action = array(
|
||||
/* 56 */ "operator1 ::= num_operator1",
|
||||
/* 57 */ "operator2 ::= num_operator2",
|
||||
/* 58 */ "operator2 ::= str_operator",
|
||||
/* 59 */ "operator2 ::= EQ",
|
||||
/* 60 */ "operator2 ::= NOT_EQ",
|
||||
/* 61 */ "operator3 ::= LOG_AND",
|
||||
/* 62 */ "operator4 ::= LOG_OR",
|
||||
/* 63 */ "num_operator1 ::= MATH_DIV",
|
||||
/* 64 */ "num_operator1 ::= MATH_MULT",
|
||||
/* 65 */ "num_operator2 ::= MATH_PLUS",
|
||||
/* 66 */ "num_operator2 ::= MATH_MINUS",
|
||||
/* 67 */ "num_operator2 ::= GT",
|
||||
/* 68 */ "num_operator2 ::= LT",
|
||||
/* 69 */ "num_operator2 ::= GE",
|
||||
/* 70 */ "num_operator2 ::= LE",
|
||||
/* 71 */ "str_operator ::= LIKE",
|
||||
/* 72 */ "str_operator ::= NOT_LIKE",
|
||||
/* 73 */ "list_operator ::= IN",
|
||||
/* 74 */ "list_operator ::= NOT_IN",
|
||||
/* 75 */ "func_name ::= F_IF",
|
||||
/* 76 */ "func_name ::= F_ELT",
|
||||
/* 77 */ "func_name ::= F_COALESCE",
|
||||
/* 78 */ "func_name ::= F_CONCAT",
|
||||
/* 79 */ "func_name ::= F_SUBSTR",
|
||||
/* 80 */ "func_name ::= F_TRIM",
|
||||
/* 81 */ "func_name ::= F_DATE",
|
||||
/* 82 */ "func_name ::= F_DATE_FORMAT",
|
||||
/* 83 */ "func_name ::= F_CURRENT_DATE",
|
||||
/* 84 */ "func_name ::= F_NOW",
|
||||
/* 85 */ "func_name ::= F_TIME",
|
||||
/* 86 */ "func_name ::= F_TO_DAYS",
|
||||
/* 87 */ "func_name ::= F_FROM_DAYS",
|
||||
/* 88 */ "func_name ::= F_YEAR",
|
||||
/* 89 */ "func_name ::= F_MONTH",
|
||||
/* 90 */ "func_name ::= F_DAY",
|
||||
/* 91 */ "func_name ::= F_DATE_ADD",
|
||||
/* 92 */ "func_name ::= F_DATE_SUB",
|
||||
/* 93 */ "func_name ::= F_ROUND",
|
||||
/* 94 */ "func_name ::= F_FLOOR",
|
||||
/* 95 */ "func_name ::= F_INET_ATON",
|
||||
/* 96 */ "func_name ::= F_INET_NTOA",
|
||||
/* 59 */ "operator2 ::= REGEXP",
|
||||
/* 60 */ "operator2 ::= EQ",
|
||||
/* 61 */ "operator2 ::= NOT_EQ",
|
||||
/* 62 */ "operator3 ::= LOG_AND",
|
||||
/* 63 */ "operator4 ::= LOG_OR",
|
||||
/* 64 */ "num_operator1 ::= MATH_DIV",
|
||||
/* 65 */ "num_operator1 ::= MATH_MULT",
|
||||
/* 66 */ "num_operator2 ::= MATH_PLUS",
|
||||
/* 67 */ "num_operator2 ::= MATH_MINUS",
|
||||
/* 68 */ "num_operator2 ::= GT",
|
||||
/* 69 */ "num_operator2 ::= LT",
|
||||
/* 70 */ "num_operator2 ::= GE",
|
||||
/* 71 */ "num_operator2 ::= LE",
|
||||
/* 72 */ "str_operator ::= LIKE",
|
||||
/* 73 */ "str_operator ::= NOT_LIKE",
|
||||
/* 74 */ "list_operator ::= IN",
|
||||
/* 75 */ "list_operator ::= NOT_IN",
|
||||
/* 76 */ "func_name ::= F_IF",
|
||||
/* 77 */ "func_name ::= F_ELT",
|
||||
/* 78 */ "func_name ::= F_COALESCE",
|
||||
/* 79 */ "func_name ::= F_ISNULL",
|
||||
/* 80 */ "func_name ::= F_CONCAT",
|
||||
/* 81 */ "func_name ::= F_SUBSTR",
|
||||
/* 82 */ "func_name ::= F_TRIM",
|
||||
/* 83 */ "func_name ::= F_DATE",
|
||||
/* 84 */ "func_name ::= F_DATE_FORMAT",
|
||||
/* 85 */ "func_name ::= F_CURRENT_DATE",
|
||||
/* 86 */ "func_name ::= F_NOW",
|
||||
/* 87 */ "func_name ::= F_TIME",
|
||||
/* 88 */ "func_name ::= F_TO_DAYS",
|
||||
/* 89 */ "func_name ::= F_FROM_DAYS",
|
||||
/* 90 */ "func_name ::= F_YEAR",
|
||||
/* 91 */ "func_name ::= F_MONTH",
|
||||
/* 92 */ "func_name ::= F_DAY",
|
||||
/* 93 */ "func_name ::= F_DATE_ADD",
|
||||
/* 94 */ "func_name ::= F_DATE_SUB",
|
||||
/* 95 */ "func_name ::= F_ROUND",
|
||||
/* 96 */ "func_name ::= F_FLOOR",
|
||||
/* 97 */ "func_name ::= F_INET_ATON",
|
||||
/* 98 */ "func_name ::= F_INET_NTOA",
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -1069,103 +1089,105 @@ static public $yy_action = array(
|
||||
* </pre>
|
||||
*/
|
||||
static public $yyRuleInfo = array(
|
||||
array( 'lhs' => 58, 'rhs' => 1 ),
|
||||
array( 'lhs' => 58, 'rhs' => 1 ),
|
||||
array( 'lhs' => 59, 'rhs' => 4 ),
|
||||
array( 'lhs' => 59, 'rhs' => 6 ),
|
||||
array( 'lhs' => 59, 'rhs' => 6 ),
|
||||
array( 'lhs' => 59, 'rhs' => 8 ),
|
||||
array( 'lhs' => 64, 'rhs' => 1 ),
|
||||
array( 'lhs' => 64, 'rhs' => 3 ),
|
||||
array( 'lhs' => 63, 'rhs' => 2 ),
|
||||
array( 'lhs' => 63, 'rhs' => 0 ),
|
||||
array( 'lhs' => 62, 'rhs' => 2 ),
|
||||
array( 'lhs' => 62, 'rhs' => 1 ),
|
||||
array( 'lhs' => 62, 'rhs' => 0 ),
|
||||
array( 'lhs' => 65, 'rhs' => 6 ),
|
||||
array( 'lhs' => 65, 'rhs' => 4 ),
|
||||
array( 'lhs' => 66, 'rhs' => 3 ),
|
||||
array( 'lhs' => 60, 'rhs' => 1 ),
|
||||
array( 'lhs' => 69, 'rhs' => 1 ),
|
||||
array( 'lhs' => 69, 'rhs' => 1 ),
|
||||
array( 'lhs' => 69, 'rhs' => 1 ),
|
||||
array( 'lhs' => 69, 'rhs' => 4 ),
|
||||
array( 'lhs' => 69, 'rhs' => 3 ),
|
||||
array( 'lhs' => 69, 'rhs' => 3 ),
|
||||
array( 'lhs' => 76, 'rhs' => 1 ),
|
||||
array( 'lhs' => 76, 'rhs' => 3 ),
|
||||
array( 'lhs' => 60, 'rhs' => 1 ),
|
||||
array( 'lhs' => 61, 'rhs' => 4 ),
|
||||
array( 'lhs' => 61, 'rhs' => 6 ),
|
||||
array( 'lhs' => 61, 'rhs' => 6 ),
|
||||
array( 'lhs' => 61, 'rhs' => 8 ),
|
||||
array( 'lhs' => 66, 'rhs' => 1 ),
|
||||
array( 'lhs' => 66, 'rhs' => 3 ),
|
||||
array( 'lhs' => 65, 'rhs' => 2 ),
|
||||
array( 'lhs' => 65, 'rhs' => 0 ),
|
||||
array( 'lhs' => 64, 'rhs' => 2 ),
|
||||
array( 'lhs' => 64, 'rhs' => 1 ),
|
||||
array( 'lhs' => 64, 'rhs' => 0 ),
|
||||
array( 'lhs' => 67, 'rhs' => 6 ),
|
||||
array( 'lhs' => 67, 'rhs' => 4 ),
|
||||
array( 'lhs' => 68, 'rhs' => 3 ),
|
||||
array( 'lhs' => 62, 'rhs' => 1 ),
|
||||
array( 'lhs' => 71, 'rhs' => 1 ),
|
||||
array( 'lhs' => 71, 'rhs' => 1 ),
|
||||
array( 'lhs' => 71, 'rhs' => 1 ),
|
||||
array( 'lhs' => 71, 'rhs' => 4 ),
|
||||
array( 'lhs' => 71, 'rhs' => 3 ),
|
||||
array( 'lhs' => 71, 'rhs' => 3 ),
|
||||
array( 'lhs' => 78, 'rhs' => 1 ),
|
||||
array( 'lhs' => 78, 'rhs' => 3 ),
|
||||
array( 'lhs' => 80, 'rhs' => 1 ),
|
||||
array( 'lhs' => 80, 'rhs' => 3 ),
|
||||
array( 'lhs' => 68, 'rhs' => 1 ),
|
||||
array( 'lhs' => 68, 'rhs' => 3 ),
|
||||
array( 'lhs' => 82, 'rhs' => 1 ),
|
||||
array( 'lhs' => 82, 'rhs' => 3 ),
|
||||
array( 'lhs' => 70, 'rhs' => 1 ),
|
||||
array( 'lhs' => 70, 'rhs' => 3 ),
|
||||
array( 'lhs' => 77, 'rhs' => 3 ),
|
||||
array( 'lhs' => 85, 'rhs' => 1 ),
|
||||
array( 'lhs' => 85, 'rhs' => 3 ),
|
||||
array( 'lhs' => 75, 'rhs' => 0 ),
|
||||
array( 'lhs' => 75, 'rhs' => 1 ),
|
||||
array( 'lhs' => 75, 'rhs' => 3 ),
|
||||
array( 'lhs' => 83, 'rhs' => 1 ),
|
||||
array( 'lhs' => 83, 'rhs' => 3 ),
|
||||
array( 'lhs' => 73, 'rhs' => 0 ),
|
||||
array( 'lhs' => 73, 'rhs' => 1 ),
|
||||
array( 'lhs' => 73, 'rhs' => 3 ),
|
||||
array( 'lhs' => 84, 'rhs' => 1 ),
|
||||
array( 'lhs' => 84, 'rhs' => 3 ),
|
||||
array( 'lhs' => 85, 'rhs' => 1 ),
|
||||
array( 'lhs' => 85, 'rhs' => 1 ),
|
||||
array( 'lhs' => 85, 'rhs' => 1 ),
|
||||
array( 'lhs' => 85, 'rhs' => 1 ),
|
||||
array( 'lhs' => 85, 'rhs' => 1 ),
|
||||
array( 'lhs' => 85, 'rhs' => 1 ),
|
||||
array( 'lhs' => 70, 'rhs' => 1 ),
|
||||
array( 'lhs' => 70, 'rhs' => 1 ),
|
||||
array( 'lhs' => 86, 'rhs' => 1 ),
|
||||
array( 'lhs' => 86, 'rhs' => 3 ),
|
||||
array( 'lhs' => 87, 'rhs' => 1 ),
|
||||
array( 'lhs' => 67, 'rhs' => 1 ),
|
||||
array( 'lhs' => 67, 'rhs' => 3 ),
|
||||
array( 'lhs' => 61, 'rhs' => 1 ),
|
||||
array( 'lhs' => 71, 'rhs' => 1 ),
|
||||
array( 'lhs' => 90, 'rhs' => 1 ),
|
||||
array( 'lhs' => 87, 'rhs' => 1 ),
|
||||
array( 'lhs' => 87, 'rhs' => 1 ),
|
||||
array( 'lhs' => 87, 'rhs' => 1 ),
|
||||
array( 'lhs' => 87, 'rhs' => 1 ),
|
||||
array( 'lhs' => 87, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 88, 'rhs' => 1 ),
|
||||
array( 'lhs' => 89, 'rhs' => 1 ),
|
||||
array( 'lhs' => 77, 'rhs' => 1 ),
|
||||
array( 'lhs' => 79, 'rhs' => 1 ),
|
||||
array( 'lhs' => 79, 'rhs' => 1 ),
|
||||
array( 'lhs' => 79, 'rhs' => 1 ),
|
||||
array( 'lhs' => 69, 'rhs' => 1 ),
|
||||
array( 'lhs' => 69, 'rhs' => 3 ),
|
||||
array( 'lhs' => 63, 'rhs' => 1 ),
|
||||
array( 'lhs' => 73, 'rhs' => 1 ),
|
||||
array( 'lhs' => 92, 'rhs' => 1 ),
|
||||
array( 'lhs' => 90, 'rhs' => 1 ),
|
||||
array( 'lhs' => 91, 'rhs' => 1 ),
|
||||
array( 'lhs' => 79, 'rhs' => 1 ),
|
||||
array( 'lhs' => 81, 'rhs' => 1 ),
|
||||
array( 'lhs' => 82, 'rhs' => 1 ),
|
||||
array( 'lhs' => 91, 'rhs' => 1 ),
|
||||
array( 'lhs' => 91, 'rhs' => 1 ),
|
||||
array( 'lhs' => 92, 'rhs' => 1 ),
|
||||
array( 'lhs' => 92, 'rhs' => 1 ),
|
||||
array( 'lhs' => 92, 'rhs' => 1 ),
|
||||
array( 'lhs' => 92, 'rhs' => 1 ),
|
||||
array( 'lhs' => 92, 'rhs' => 1 ),
|
||||
array( 'lhs' => 92, 'rhs' => 1 ),
|
||||
array( 'lhs' => 81, 'rhs' => 1 ),
|
||||
array( 'lhs' => 81, 'rhs' => 1 ),
|
||||
array( 'lhs' => 81, 'rhs' => 1 ),
|
||||
array( 'lhs' => 81, 'rhs' => 1 ),
|
||||
array( 'lhs' => 83, 'rhs' => 1 ),
|
||||
array( 'lhs' => 84, 'rhs' => 1 ),
|
||||
array( 'lhs' => 93, 'rhs' => 1 ),
|
||||
array( 'lhs' => 93, 'rhs' => 1 ),
|
||||
array( 'lhs' => 94, 'rhs' => 1 ),
|
||||
array( 'lhs' => 94, 'rhs' => 1 ),
|
||||
array( 'lhs' => 94, 'rhs' => 1 ),
|
||||
array( 'lhs' => 94, 'rhs' => 1 ),
|
||||
array( 'lhs' => 94, 'rhs' => 1 ),
|
||||
array( 'lhs' => 94, 'rhs' => 1 ),
|
||||
array( 'lhs' => 95, 'rhs' => 1 ),
|
||||
array( 'lhs' => 95, 'rhs' => 1 ),
|
||||
array( 'lhs' => 76, 'rhs' => 1 ),
|
||||
array( 'lhs' => 76, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 74, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
array( 'lhs' => 72, 'rhs' => 1 ),
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -1227,7 +1249,6 @@ static public $yy_action = array(
|
||||
49 => 49,
|
||||
50 => 50,
|
||||
51 => 51,
|
||||
75 => 51,
|
||||
76 => 51,
|
||||
77 => 51,
|
||||
78 => 51,
|
||||
@@ -1249,6 +1270,8 @@ static public $yy_action = array(
|
||||
94 => 51,
|
||||
95 => 51,
|
||||
96 => 51,
|
||||
97 => 51,
|
||||
98 => 51,
|
||||
52 => 52,
|
||||
53 => 53,
|
||||
54 => 54,
|
||||
@@ -1271,6 +1294,7 @@ static public $yy_action = array(
|
||||
72 => 54,
|
||||
73 => 54,
|
||||
74 => 54,
|
||||
75 => 54,
|
||||
55 => 55,
|
||||
);
|
||||
/* Beginning here are the reduction cases. A typical example
|
||||
@@ -1281,44 +1305,44 @@ static public $yy_action = array(
|
||||
*/
|
||||
#line 29 "oql-parser.y"
|
||||
function yy_r0(){ $this->my_result = $this->yystack[$this->yyidx + 0]->minor; }
|
||||
#line 1288 "oql-parser.php"
|
||||
#line 1312 "oql-parser.php"
|
||||
#line 32 "oql-parser.y"
|
||||
function yy_r2(){
|
||||
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor));
|
||||
}
|
||||
#line 1293 "oql-parser.php"
|
||||
#line 1317 "oql-parser.php"
|
||||
#line 35 "oql-parser.y"
|
||||
function yy_r3(){
|
||||
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor));
|
||||
}
|
||||
#line 1298 "oql-parser.php"
|
||||
#line 1322 "oql-parser.php"
|
||||
#line 39 "oql-parser.y"
|
||||
function yy_r4(){
|
||||
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -4]->minor);
|
||||
}
|
||||
#line 1303 "oql-parser.php"
|
||||
#line 1327 "oql-parser.php"
|
||||
#line 42 "oql-parser.y"
|
||||
function yy_r5(){
|
||||
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -6]->minor);
|
||||
}
|
||||
#line 1308 "oql-parser.php"
|
||||
#line 1332 "oql-parser.php"
|
||||
#line 47 "oql-parser.y"
|
||||
function yy_r6(){
|
||||
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 1313 "oql-parser.php"
|
||||
#line 1337 "oql-parser.php"
|
||||
#line 50 "oql-parser.y"
|
||||
function yy_r7(){
|
||||
array_push($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor;
|
||||
}
|
||||
#line 1319 "oql-parser.php"
|
||||
#line 1343 "oql-parser.php"
|
||||
#line 55 "oql-parser.y"
|
||||
function yy_r8(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; }
|
||||
#line 1322 "oql-parser.php"
|
||||
#line 1346 "oql-parser.php"
|
||||
#line 56 "oql-parser.y"
|
||||
function yy_r9(){ $this->_retvalue = null; }
|
||||
#line 1325 "oql-parser.php"
|
||||
#line 1349 "oql-parser.php"
|
||||
#line 58 "oql-parser.y"
|
||||
function yy_r10(){
|
||||
// insert the join statement on top of the existing list
|
||||
@@ -1326,67 +1350,67 @@ static public $yy_action = array(
|
||||
// and return the updated array
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
#line 1333 "oql-parser.php"
|
||||
#line 1357 "oql-parser.php"
|
||||
#line 64 "oql-parser.y"
|
||||
function yy_r11(){
|
||||
$this->_retvalue = Array($this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 1338 "oql-parser.php"
|
||||
#line 1362 "oql-parser.php"
|
||||
#line 70 "oql-parser.y"
|
||||
function yy_r13(){
|
||||
// create an array with one single item
|
||||
$this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 1344 "oql-parser.php"
|
||||
#line 1368 "oql-parser.php"
|
||||
#line 75 "oql-parser.y"
|
||||
function yy_r14(){
|
||||
// create an array with one single item
|
||||
$this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 1350 "oql-parser.php"
|
||||
#line 1374 "oql-parser.php"
|
||||
#line 80 "oql-parser.y"
|
||||
function yy_r15(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, '=', $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1353 "oql-parser.php"
|
||||
#line 1377 "oql-parser.php"
|
||||
#line 82 "oql-parser.y"
|
||||
function yy_r16(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; }
|
||||
#line 1356 "oql-parser.php"
|
||||
#line 1380 "oql-parser.php"
|
||||
#line 87 "oql-parser.y"
|
||||
function yy_r20(){ $this->_retvalue = new FunctionOqlExpression($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor); }
|
||||
#line 1359 "oql-parser.php"
|
||||
#line 1383 "oql-parser.php"
|
||||
#line 88 "oql-parser.y"
|
||||
function yy_r21(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; }
|
||||
#line 1362 "oql-parser.php"
|
||||
#line 1386 "oql-parser.php"
|
||||
#line 89 "oql-parser.y"
|
||||
function yy_r22(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1365 "oql-parser.php"
|
||||
#line 1389 "oql-parser.php"
|
||||
#line 104 "oql-parser.y"
|
||||
function yy_r31(){
|
||||
$this->_retvalue = new ListOqlExpression($this->yystack[$this->yyidx + -1]->minor);
|
||||
}
|
||||
#line 1370 "oql-parser.php"
|
||||
#line 1394 "oql-parser.php"
|
||||
#line 115 "oql-parser.y"
|
||||
function yy_r34(){
|
||||
$this->_retvalue = array();
|
||||
}
|
||||
#line 1375 "oql-parser.php"
|
||||
#line 1399 "oql-parser.php"
|
||||
#line 126 "oql-parser.y"
|
||||
function yy_r38(){ $this->_retvalue = new IntervalOqlExpression($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1378 "oql-parser.php"
|
||||
#line 1402 "oql-parser.php"
|
||||
#line 138 "oql-parser.y"
|
||||
function yy_r47(){ $this->_retvalue = new ScalarOqlExpression($this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1381 "oql-parser.php"
|
||||
#line 1405 "oql-parser.php"
|
||||
#line 141 "oql-parser.y"
|
||||
function yy_r49(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1384 "oql-parser.php"
|
||||
#line 1408 "oql-parser.php"
|
||||
#line 142 "oql-parser.y"
|
||||
function yy_r50(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -2]->minor); }
|
||||
#line 1387 "oql-parser.php"
|
||||
#line 1411 "oql-parser.php"
|
||||
#line 143 "oql-parser.y"
|
||||
function yy_r51(){ $this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; }
|
||||
#line 1390 "oql-parser.php"
|
||||
#line 1414 "oql-parser.php"
|
||||
#line 146 "oql-parser.y"
|
||||
function yy_r52(){ $this->_retvalue = new VariableOqlExpression(substr($this->yystack[$this->yyidx + 0]->minor, 1)); }
|
||||
#line 1393 "oql-parser.php"
|
||||
#line 1417 "oql-parser.php"
|
||||
#line 148 "oql-parser.y"
|
||||
function yy_r53(){
|
||||
if ($this->yystack[$this->yyidx + 0]->minor[0] == '`')
|
||||
@@ -1399,13 +1423,13 @@ static public $yy_action = array(
|
||||
}
|
||||
$this->_retvalue = new OqlName($name, $this->m_iColPrev);
|
||||
}
|
||||
#line 1406 "oql-parser.php"
|
||||
#line 1430 "oql-parser.php"
|
||||
#line 160 "oql-parser.y"
|
||||
function yy_r54(){$this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; }
|
||||
#line 1409 "oql-parser.php"
|
||||
#line 1433 "oql-parser.php"
|
||||
#line 161 "oql-parser.y"
|
||||
function yy_r55(){$this->_retvalue=stripslashes(substr($this->yystack[$this->yyidx + 0]->minor, 1, strlen($this->yystack[$this->yyidx + 0]->minor) - 2)); }
|
||||
#line 1412 "oql-parser.php"
|
||||
#line 1436 "oql-parser.php"
|
||||
|
||||
/**
|
||||
* placeholder for the left hand side in a reduce operation.
|
||||
@@ -1520,7 +1544,7 @@ static public $yy_action = array(
|
||||
#line 25 "oql-parser.y"
|
||||
|
||||
throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN);
|
||||
#line 1528 "oql-parser.php"
|
||||
#line 1552 "oql-parser.php"
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1672,7 +1696,7 @@ throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCo
|
||||
}
|
||||
} while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
|
||||
}
|
||||
}#line 211 "oql-parser.y"
|
||||
}#line 213 "oql-parser.y"
|
||||
|
||||
|
||||
class OQLParserException extends OQLException
|
||||
@@ -1737,4 +1761,4 @@ class OQLParser extends OQLParserRaw
|
||||
}
|
||||
}
|
||||
|
||||
#line 1747 "oql-parser.php"
|
||||
#line 1771 "oql-parser.php"
|
||||
|
||||
@@ -101,13 +101,13 @@ expression_prio4(A) ::= expression_prio3(X). { A = X; }
|
||||
expression_prio4(A) ::= expression_prio4(X) operator4(Y) expression_prio3(Z). { A = new BinaryOqlExpression(X, Y, Z); }
|
||||
|
||||
|
||||
list(A) ::= PAR_OPEN scalar_list(X) PAR_CLOSE. {
|
||||
list(A) ::= PAR_OPEN list_items(X) PAR_CLOSE. {
|
||||
A = new ListOqlExpression(X);
|
||||
}
|
||||
scalar_list(A) ::= scalar(X). {
|
||||
list_items(A) ::= expression_prio4(X). {
|
||||
A = array(X);
|
||||
}
|
||||
scalar_list(A) ::= scalar_list(L) COMA scalar(X). {
|
||||
list_items(A) ::= list_items(L) COMA expression_prio4(X). {
|
||||
array_push(L, X);
|
||||
A = L;
|
||||
}
|
||||
@@ -164,6 +164,7 @@ str_value(A) ::= STRVAL(X). {A=stripslashes(substr(X, 1, strlen(X) - 2));}
|
||||
operator1(A) ::= num_operator1(X). {A=X;}
|
||||
operator2(A) ::= num_operator2(X). {A=X;}
|
||||
operator2(A) ::= str_operator(X). {A=X;}
|
||||
operator2(A) ::= REGEXP(X). {A=X;}
|
||||
operator2(A) ::= EQ(X). {A=X;}
|
||||
operator2(A) ::= NOT_EQ(X). {A=X;}
|
||||
operator3(A) ::= LOG_AND(X). {A=X;}
|
||||
@@ -187,6 +188,7 @@ list_operator(A) ::= NOT_IN(X). {A=X;}
|
||||
func_name(A) ::= F_IF(X). { A=X; }
|
||||
func_name(A) ::= F_ELT(X). { A=X; }
|
||||
func_name(A) ::= F_COALESCE(X). { A=X; }
|
||||
func_name(A) ::= F_ISNULL(X). { A=X; }
|
||||
func_name(A) ::= F_CONCAT(X). { A=X; }
|
||||
func_name(A) ::= F_SUBSTR(X). { A=X; }
|
||||
func_name(A) ::= F_TRIM(X). { A=X; }
|
||||
|
||||
@@ -52,19 +52,19 @@ class OQLException extends CoreException
|
||||
|
||||
public function getHtmlDesc($sHighlightHtmlBegin = '<b>', $sHighlightHtmlEnd = '</b>')
|
||||
{
|
||||
$sRet = htmlentities($this->m_MyIssue.", found '".$this->m_sUnexpected."' in: ");
|
||||
$sRet .= htmlentities(substr($this->m_sInput, 0, $this->m_iCol));
|
||||
$sRet .= $sHighlightHtmlBegin.htmlentities(substr($this->m_sInput, $this->m_iCol, strlen($this->m_sUnexpected))).$sHighlightHtmlEnd;
|
||||
$sRet .= htmlentities(substr($this->m_sInput, $this->m_iCol + strlen($this->m_sUnexpected)));
|
||||
$sRet = htmlentities($this->m_MyIssue.", found '".$this->m_sUnexpected."' in: ", ENT_QUOTES, 'UTF-8');
|
||||
$sRet .= htmlentities(substr($this->m_sInput, 0, $this->m_iCol), ENT_QUOTES, 'UTF-8');
|
||||
$sRet .= $sHighlightHtmlBegin.htmlentities(substr($this->m_sInput, $this->m_iCol, strlen($this->m_sUnexpected)), ENT_QUOTES, 'UTF-8').$sHighlightHtmlEnd;
|
||||
$sRet .= htmlentities(substr($this->m_sInput, $this->m_iCol + strlen($this->m_sUnexpected)), ENT_QUOTES, 'UTF-8');
|
||||
|
||||
if (!is_null($this->m_aExpecting) && (count($this->m_aExpecting) > 0))
|
||||
{
|
||||
$sExpectations = '{'.implode(', ', $this->m_aExpecting).'}';
|
||||
$sRet .= ", expecting ".htmlentities($sExpectations);
|
||||
$sRet .= ", expecting ".htmlentities($sExpectations, ENT_QUOTES, 'UTF-8');
|
||||
$sSuggest = self::FindClosestString($this->m_sUnexpected, $this->m_aExpecting);
|
||||
if (strlen($sSuggest) > 0)
|
||||
{
|
||||
$sRet .= ", I would suggest to use '$sHighlightHtmlBegin".htmlentities($sSuggest)."$sHighlightHtmlEnd'";
|
||||
$sRet .= ", I would suggest to use '$sHighlightHtmlBegin".htmlentities($sSuggest, ENT_QUOTES, 'UTF-8')."$sHighlightHtmlEnd'";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
172
core/ormcaselog.class.inc.php
Normal file
172
core/ormcaselog.class.inc.php
Normal file
@@ -0,0 +1,172 @@
|
||||
<?php
|
||||
// Copyright (C) 2011 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
define('CASELOG_VISIBLE_ITEMS', 2);
|
||||
define('CASELOG_SEPARATOR', "\n".'========== %1$s : %2$s (%3$d) ============'."\n\n");
|
||||
|
||||
//require_once(APPROOT.'/core/userrights.class.inc.php');
|
||||
//require_once(APPROOT.'/application/webpage.class.inc.php');
|
||||
|
||||
/**
|
||||
* Class to store a "case log" in a structured way, keeping track of its successive entries
|
||||
*/
|
||||
class ormCaseLog {
|
||||
protected $m_sLog;
|
||||
protected $m_aIndex;
|
||||
|
||||
/**
|
||||
* Initializes the log with the first (initial) entry
|
||||
* @param $sLog string The text of the whole case log
|
||||
* @param $aIndex hash The case log index
|
||||
*/
|
||||
public function __construct($sLog = '', $aIndex = array())
|
||||
{
|
||||
$this->m_sLog = $sLog;
|
||||
$this->m_aIndex = $aIndex;
|
||||
}
|
||||
|
||||
public function GetText()
|
||||
{
|
||||
return $this->m_sLog;
|
||||
}
|
||||
|
||||
public function GetIndex()
|
||||
{
|
||||
return $this->m_aIndex;
|
||||
}
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
return $this->m_sLog;
|
||||
}
|
||||
|
||||
public function GetAsHTML(WebPage $oP = null, $bEditMode = false, $aTransfoHandler = null)
|
||||
{
|
||||
$sHtml = '<table style="width:100%;table-layout:fixed"><tr><td>'; // Use table-layout:fixed to force the with to be independent from the actual content
|
||||
$iPos = 0;
|
||||
for($index=count($this->m_aIndex)-1 ; $index >= 0 ; $index--)
|
||||
{
|
||||
if ($index < count($this->m_aIndex) - CASELOG_VISIBLE_ITEMS)
|
||||
{
|
||||
$sOpen = '';
|
||||
$sDisplay = 'style="display:none;"';
|
||||
}
|
||||
else
|
||||
{
|
||||
$sOpen = ' open';
|
||||
$sDisplay = '';
|
||||
}
|
||||
$iPos += $this->m_aIndex[$index]['separator_length'];
|
||||
$sTextEntry = substr($this->m_sLog, $iPos, $this->m_aIndex[$index]['text_length']);
|
||||
$sTextEntry = str_replace(array("\r\n", "\n", "\r"), "<br/>", htmlentities($sTextEntry, ENT_QUOTES, 'UTF-8'));
|
||||
if (!is_null($aTransfoHandler))
|
||||
{
|
||||
$sTextEntry = call_user_func($aTransfoHandler, $sTextEntry);
|
||||
}
|
||||
$iPos += $this->m_aIndex[$index]['text_length'];
|
||||
|
||||
$sEntry = '<div class="caselog_header'.$sOpen.'">';
|
||||
$sEntry .= sprintf(Dict::S('UI:CaseLog:Header_Date_UserName'), $this->m_aIndex[$index]['date']->format(Dict::S('UI:CaseLog:DateFormat')), $this->m_aIndex[$index]['user_name']);
|
||||
$sEntry .= '</div>';
|
||||
$sEntry .= '<div class="caselog_entry"'.$sDisplay.'>';
|
||||
$sEntry .= $sTextEntry;
|
||||
$sEntry .= '</div>';
|
||||
$sHtml = $sHtml.$sEntry;
|
||||
}
|
||||
|
||||
// Process the case of an eventual remainder (quick migration of AttributeText fields)
|
||||
if ($iPos < (strlen($this->m_sLog) - 1))
|
||||
{
|
||||
$sTextEntry = substr($this->m_sLog, $iPos);
|
||||
$sTextEntry = str_replace(array("\r\n", "\n", "\r"), "<br/>", htmlentities($sTextEntry, ENT_QUOTES, 'UTF-8'));
|
||||
if (!is_null($aTransfoHandler))
|
||||
{
|
||||
$sTextEntry = call_user_func($aTransfoHandler, $sTextEntry);
|
||||
}
|
||||
|
||||
if (count($this->m_aIndex) == 0)
|
||||
{
|
||||
$sHtml .= '<div class="caselog_entry open">';
|
||||
$sHtml .= $sTextEntry;
|
||||
$sHtml .= '</div>';
|
||||
}
|
||||
else
|
||||
{
|
||||
if (count($this->m_aIndex) - CASELOG_VISIBLE_ITEMS > 0)
|
||||
{
|
||||
$sOpen = '';
|
||||
$sDisplay = 'style="display:none;"';
|
||||
}
|
||||
else
|
||||
{
|
||||
$sOpen = ' open';
|
||||
$sDisplay = '';
|
||||
}
|
||||
$sHtml .= '<div class="caselog_header'.$sOpen.'">';
|
||||
$sHtml .= Dict::S('UI:CaseLog:InitialValue');
|
||||
$sHtml .= '</div>';
|
||||
$sHtml .= '<div class="caselog_entry"'.$sDisplay.'>';
|
||||
$sHtml .= $sTextEntry;
|
||||
$sHtml .= '</div>';
|
||||
}
|
||||
}
|
||||
$sHtml .= '</td></tr></table>';
|
||||
return $sHtml;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new entry to the log and updates the internal index
|
||||
* @param $sText string The text of the new entry
|
||||
*/
|
||||
public function AddLogEntry($sText)
|
||||
{
|
||||
$sDate = date(Dict::S('UI:CaseLog:DateFormat'));
|
||||
$sSeparator = sprintf(CASELOG_SEPARATOR, $sDate, UserRights::GetUserFriendlyName(), UserRights::GetUserId());
|
||||
$iSepLength = strlen($sSeparator);
|
||||
$iTextlength = strlen($sText);
|
||||
$this->m_sLog = $sSeparator.$sText.$this->m_sLog; // Latest entry printed first
|
||||
$this->m_aIndex[] = array(
|
||||
'user_name' => UserRights::GetUserFriendlyName(),
|
||||
'user_id' => UserRights::GetUserId(),
|
||||
'date' => new DateTime(),
|
||||
'text_length' => $iTextlength,
|
||||
'separator_length' => $iSepLength,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latest entry from the log
|
||||
* @return string
|
||||
*/
|
||||
public function GetLatestEntry()
|
||||
{
|
||||
$iLast = count($this->m_aIndex) - 1;
|
||||
$aLastEntry = $this->m_aIndex[$iLast];
|
||||
$sRes = substr($this->m_sLog, $aLastEntry['separator_length'], $aLastEntry['text_length']);
|
||||
return $sRes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the index of the latest entry from the log
|
||||
* @return integer
|
||||
*/
|
||||
public function GetLatestEntryIndex()
|
||||
{
|
||||
$iLast = count($this->m_aIndex) - 1;
|
||||
return $iLast;
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -35,36 +35,19 @@
|
||||
require_once('cmdbsource.class.inc.php');
|
||||
|
||||
|
||||
class SQLExpression extends BinaryExpression
|
||||
{
|
||||
}
|
||||
class ScalarSQLExpression extends ScalarExpression
|
||||
{
|
||||
}
|
||||
class TrueSQLExpression extends TrueExpression
|
||||
{
|
||||
}
|
||||
class FieldSQLExpression extends FieldExpression
|
||||
{
|
||||
}
|
||||
class VariableSQLExpression extends VariableExpression
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
class SQLQuery
|
||||
{
|
||||
private $m_SourceOQL = '';
|
||||
private $m_sTable = '';
|
||||
private $m_sTableAlias = '';
|
||||
private $m_aFields = array();
|
||||
private $m_oConditionExpr = null;
|
||||
private $m_aFullTextNeedles = array();
|
||||
private $m_bToDelete = true; // The current table must be listed for deletion ?
|
||||
private $m_aValues = array(); // Values to set in case of an update query
|
||||
private $m_oSelectedIdField = null;
|
||||
private $m_aJoinSelects = array();
|
||||
|
||||
public function __construct($sTable, $sTableAlias, $aFields, $oConditionExpr, $aFullTextNeedles, $bToDelete = true, $aValues = array())
|
||||
public function __construct($sTable, $sTableAlias, $aFields, $bToDelete = true, $aValues = array(), $oSelectedIdField = null)
|
||||
{
|
||||
// This check is not needed but for developping purposes
|
||||
//if (!CMDBSource::IsTable($sTable))
|
||||
@@ -79,18 +62,20 @@ class SQLQuery
|
||||
$this->m_sTable = $sTable;
|
||||
$this->m_sTableAlias = $sTableAlias;
|
||||
$this->m_aFields = $aFields;
|
||||
$this->m_oConditionExpr = $oConditionExpr;
|
||||
if (is_null($oConditionExpr))
|
||||
{
|
||||
$this->m_oConditionExpr = new TrueExpression;
|
||||
}
|
||||
else if (!$oConditionExpr instanceof Expression)
|
||||
{
|
||||
throw new CoreException('Invalid type for condition, expecting an Expression', array('class' => get_class($oConditionExpr)));
|
||||
}
|
||||
$this->m_aFullTextNeedles = $aFullTextNeedles;
|
||||
$this->m_oConditionExpr = null;
|
||||
$this->m_bToDelete = $bToDelete;
|
||||
$this->m_aValues = $aValues;
|
||||
$this->m_oSelectedIdField = $oSelectedIdField;
|
||||
}
|
||||
|
||||
public function SetSourceOQL($sOQL)
|
||||
{
|
||||
$this->m_SourceOQL = $sOQL;
|
||||
}
|
||||
|
||||
public function GetSourceOQL()
|
||||
{
|
||||
return $this->m_SourceOQL;
|
||||
}
|
||||
|
||||
public function DisplayHtml()
|
||||
@@ -108,16 +93,6 @@ class SQLQuery
|
||||
echo "<b>$this->m_sTable</b>$sFields<br/>\n";
|
||||
// #@# todo - display html of an expression tree
|
||||
//$this->m_oConditionExpr->DisplayHtml()
|
||||
if (count($this->m_aFullTextNeedles) > 0)
|
||||
{
|
||||
echo "Full text criteria...<br/>\n";
|
||||
echo "<ul class=\"treeview\">\n";
|
||||
foreach ($this->m_aFullTextNeedles as $sFTNeedle)
|
||||
{
|
||||
echo "<li>$sFTNeedle</li>\n";
|
||||
}
|
||||
echo "</ul>";
|
||||
}
|
||||
if (count($this->m_aJoinSelects) > 0)
|
||||
{
|
||||
echo "Joined to...<br/>\n";
|
||||
@@ -139,13 +114,19 @@ class SQLQuery
|
||||
$oCondition = null;
|
||||
$aDelTables = array();
|
||||
$aSetValues = array();
|
||||
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues);
|
||||
$aSelectedIdFields = array();
|
||||
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues, $aSelectedIdFields);
|
||||
echo "From ...<br/>\n";
|
||||
echo "<pre style=\"font-size: smaller;\">\n";
|
||||
print_r($aFrom);
|
||||
echo "</pre>";
|
||||
}
|
||||
|
||||
public function SetSelect($aExpressions)
|
||||
{
|
||||
$this->m_aFields = $aExpressions;
|
||||
}
|
||||
|
||||
public function SetCondition($oConditionExpr)
|
||||
{
|
||||
$this->m_oConditionExpr = $oConditionExpr;
|
||||
@@ -153,7 +134,14 @@ class SQLQuery
|
||||
|
||||
public function AddCondition($oConditionExpr)
|
||||
{
|
||||
$this->m_oConditionExpr->LogAnd($oConditionExpr);
|
||||
if (is_null($this->m_oConditionExpr))
|
||||
{
|
||||
$this->m_oConditionExpr = $oConditionExpr;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->m_oConditionExpr->LogAnd($oConditionExpr);
|
||||
}
|
||||
}
|
||||
|
||||
private function AddJoin($sJoinType, $oSQLQuery, $sLeftField, $sRightField, $sRightTableAlias = '')
|
||||
@@ -202,7 +190,8 @@ class SQLQuery
|
||||
$oCondition = null;
|
||||
$aDelTables = array();
|
||||
$aSetValues = array();
|
||||
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues);
|
||||
$aSelectedIdFields = array();
|
||||
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues, $aSelectedIdFields);
|
||||
|
||||
// Target: DELETE myAlias1, myAlias2 FROM t1 as myAlias1, t2 as myAlias2, t3 as topreserve WHERE ...
|
||||
|
||||
@@ -216,8 +205,15 @@ class SQLQuery
|
||||
throw new CoreException("Building a request wich will delete every object of a given table -looks suspicious- please use truncate instead...");
|
||||
}
|
||||
*/
|
||||
$sWhere = self::ClauseWhere($oCondition, $aArgs);
|
||||
return "DELETE $sDelete FROM $sFrom WHERE $sWhere";
|
||||
if (is_null($oCondition))
|
||||
{
|
||||
// Delete all !!!
|
||||
}
|
||||
else
|
||||
{
|
||||
$sWhere = self::ClauseWhere($oCondition, $aArgs);
|
||||
return "DELETE $sDelete FROM $sFrom WHERE $sWhere";
|
||||
}
|
||||
}
|
||||
|
||||
// Interface, build the SQL query
|
||||
@@ -229,7 +225,8 @@ class SQLQuery
|
||||
$oCondition = null;
|
||||
$aDelTables = array();
|
||||
$aSetValues = array();
|
||||
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues);
|
||||
$aSelectedIdFields = array();
|
||||
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues, $aSelectedIdFields);
|
||||
|
||||
$sFrom = self::ClauseFrom($aFrom);
|
||||
$sValues = self::ClauseValues($aSetValues);
|
||||
@@ -246,13 +243,22 @@ class SQLQuery
|
||||
$oCondition = null;
|
||||
$aDelTables = array();
|
||||
$aSetValues = array();
|
||||
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues);
|
||||
$aSelectedIdFields = array();
|
||||
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues, $aSelectedIdFields);
|
||||
|
||||
$sFrom = self::ClauseFrom($aFrom);
|
||||
$sWhere = self::ClauseWhere($oCondition, $aArgs);
|
||||
if ($bGetCount)
|
||||
{
|
||||
$sSQL = "SELECT COUNT(*) AS COUNT FROM $sFrom WHERE $sWhere";
|
||||
if (count($aSelectedIdFields) > 0)
|
||||
{
|
||||
$sIDFields = implode(', ', $aSelectedIdFields);
|
||||
$sSQL = "SELECT COUNT(DISTINCT $sIDFields) AS COUNT FROM $sFrom WHERE $sWhere";
|
||||
}
|
||||
else
|
||||
{
|
||||
$sSQL = "SELECT COUNT(*) AS COUNT FROM $sFrom WHERE $sWhere";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -338,7 +344,14 @@ class SQLQuery
|
||||
|
||||
private static function ClauseWhere($oConditionExpr, $aArgs = array())
|
||||
{
|
||||
return $oConditionExpr->Render($aArgs);
|
||||
if (is_null($oConditionExpr))
|
||||
{
|
||||
return '1';
|
||||
}
|
||||
else
|
||||
{
|
||||
return $oConditionExpr->Render($aArgs);
|
||||
}
|
||||
}
|
||||
|
||||
private static function ClauseOrderBy($aOrderBy)
|
||||
@@ -353,43 +366,14 @@ class SQLQuery
|
||||
}
|
||||
|
||||
// Purpose: prepare the query data, once for all
|
||||
private function privRender(&$aFrom, &$aFields, &$oCondition, &$aDelTables, &$aSetValues)
|
||||
private function privRender(&$aFrom, &$aFields, &$oCondition, &$aDelTables, &$aSetValues, &$aSelectedIdFields)
|
||||
{
|
||||
$sTableAlias = $this->privRenderSingleTable($aFrom, $aFields, $aDelTables, $aSetValues);
|
||||
|
||||
// Add the full text search condition, based on each and every requested field
|
||||
//
|
||||
// To be updated with a real full text search based on the mySQL settings
|
||||
// (then it might move somewhere else !)
|
||||
//
|
||||
$sTableAlias = $this->privRenderSingleTable($aFrom, $aFields, $aDelTables, $aSetValues, $aSelectedIdFields);
|
||||
$oCondition = $this->m_oConditionExpr;
|
||||
if ((count($aFields) > 0) && (count($this->m_aFullTextNeedles) > 0))
|
||||
{
|
||||
$aFieldExp = array();
|
||||
foreach ($aFields as $sField)
|
||||
{
|
||||
// This is TEMPORARY (that's why it is weird, actually)
|
||||
// Full text match will be done as an expression in the filter condition
|
||||
|
||||
// $sField is already a string `table`.`column`
|
||||
// Let's make an expression out of it (again !)
|
||||
$aFieldExp[] = Expression::FromOQL($sField);
|
||||
}
|
||||
$oFullTextExpr = new CharConcatExpression($aFieldExp);
|
||||
// The cast is necessary because the CONCAT result in a binary string:
|
||||
// if any of the field is a binary string => case sensitive comparison
|
||||
//
|
||||
foreach($this->m_aFullTextNeedles as $sFTNeedle)
|
||||
{
|
||||
$oNewCond = new BinaryExpression($oFullTextExpr, 'LIKE', new ScalarExpression("%$sFTNeedle%"));
|
||||
$oCondition = $oCondition->LogAnd($oNewCond);
|
||||
}
|
||||
}
|
||||
|
||||
return $sTableAlias;
|
||||
}
|
||||
|
||||
private function privRenderSingleTable(&$aFrom, &$aFields, &$aDelTables, &$aSetValues, $sJoinType = 'first', $sCallerAlias = '', $sLeftField = '', $sRightField = '', $sRightTableAlias = '')
|
||||
private function privRenderSingleTable(&$aFrom, &$aFields, &$aDelTables, &$aSetValues, &$aSelectedIdFields, $sJoinType = 'first', $sCallerAlias = '', $sLeftField = '', $sRightField = '', $sRightTableAlias = '')
|
||||
{
|
||||
$aActualTableFields = CMDBSource::GetTableFieldsList($this->m_sTable);
|
||||
|
||||
@@ -419,8 +403,6 @@ class SQLQuery
|
||||
//
|
||||
foreach($this->m_aFields as $sAlias => $oExpression)
|
||||
{
|
||||
$sTable = $oExpression->GetParent();
|
||||
$sColumn = $oExpression->GetName();
|
||||
$aFields["`$sAlias`"] = $oExpression->Render();
|
||||
}
|
||||
if ($this->m_bToDelete)
|
||||
@@ -432,6 +414,11 @@ class SQLQuery
|
||||
$aSetValues["`{$this->m_sTableAlias}`.`$sFieldName`"] = $value; // quoted further!
|
||||
}
|
||||
|
||||
if (!is_null($this->m_oSelectedIdField))
|
||||
{
|
||||
$aSelectedIdFields[] = $this->m_oSelectedIdField->Render();
|
||||
}
|
||||
|
||||
// loop on joins, to complete the list of tables/fields/conditions
|
||||
//
|
||||
$aTempFrom = array(); // temporary subset of 'from' specs, to be grouped in the final query
|
||||
@@ -443,7 +430,7 @@ class SQLQuery
|
||||
$sRightField = $aJoinData["rightfield"];
|
||||
$sRightTableAlias = $aJoinData["righttablealias"];
|
||||
|
||||
$sJoinTableAlias = $oRightSelect->privRenderSingleTable($aTempFrom, $aFields, $aDelTables, $aSetValues, $sJoinType, $this->m_sTableAlias, $sLeftField, $sRightField, $sRightTableAlias);
|
||||
$sJoinTableAlias = $oRightSelect->privRenderSingleTable($aTempFrom, $aFields, $aDelTables, $aSetValues, $aSelectedIdFields, $sJoinType, $this->m_sTableAlias, $sLeftField, $sRightField, $sRightTableAlias);
|
||||
}
|
||||
$aFrom[$this->m_sTableAlias]['subfrom'] = $aTempFrom;
|
||||
|
||||
|
||||
@@ -105,6 +105,34 @@ abstract class TriggerOnObject extends Trigger
|
||||
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
|
||||
}
|
||||
}
|
||||
/**
|
||||
* To trigger notifications when a ticket is updated from the portal
|
||||
*/
|
||||
class TriggerOnPortalUpdate extends TriggerOnObject
|
||||
{
|
||||
public static function Init()
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "core/cmdb",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_trigger_onportalupdate",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
"display_template" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_InheritAttributes();
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('description', 'target_class', 'action_list')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('finalclass', 'target_class', 'description')); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
}
|
||||
}
|
||||
|
||||
abstract class TriggerOnStateChange extends TriggerOnObject
|
||||
{
|
||||
@@ -130,7 +158,7 @@ abstract class TriggerOnStateChange extends TriggerOnObject
|
||||
MetaModel::Init_SetZListItems('details', array('description', 'target_class', 'state', 'action_list')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('finalclass', 'target_class', 'state')); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
|
||||
MetaModel::Init_SetZListItems('standard_search', array('description', 'target_class', 'state')); // Criteria of the std search form
|
||||
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
|
||||
}
|
||||
}
|
||||
@@ -141,7 +169,7 @@ class TriggerOnStateEnter extends TriggerOnStateChange
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "core/cmdb",
|
||||
"category" => "core/cmdb,bizmodel",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"state_attcode" => "",
|
||||
@@ -158,7 +186,7 @@ class TriggerOnStateEnter extends TriggerOnStateChange
|
||||
MetaModel::Init_SetZListItems('details', array('description', 'target_class', 'state', 'action_list')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('target_class', 'state')); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
|
||||
MetaModel::Init_SetZListItems('standard_search', array('description', 'target_class', 'state')); // Criteria of the std search form
|
||||
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
|
||||
}
|
||||
}
|
||||
@@ -169,7 +197,7 @@ class TriggerOnStateLeave extends TriggerOnStateChange
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "core/cmdb",
|
||||
"category" => "core/cmdb,bizmodel",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"state_attcode" => "",
|
||||
@@ -186,7 +214,7 @@ class TriggerOnStateLeave extends TriggerOnStateChange
|
||||
MetaModel::Init_SetZListItems('details', array('description', 'target_class', 'state', 'action_list')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('target_class', 'state')); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
// MetaModel::Init_SetZListItems('standard_search', array('')); // Criteria of the std search form
|
||||
MetaModel::Init_SetZListItems('standard_search', array('description', 'target_class', 'state')); // Criteria of the std search form
|
||||
// MetaModel::Init_SetZListItems('advanced_search', array('')); // Criteria of the advanced search form
|
||||
}
|
||||
}
|
||||
@@ -197,7 +225,7 @@ class TriggerOnObjectCreate extends TriggerOnObject
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "core/cmdb",
|
||||
"category" => "core/cmdb,bizmodel",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"state_attcode" => "",
|
||||
@@ -214,7 +242,7 @@ class TriggerOnObjectCreate extends TriggerOnObject
|
||||
MetaModel::Init_SetZListItems('details', array('description', 'target_class', 'action_list')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('finalclass', 'target_class')); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
|
||||
MetaModel::Init_SetZListItems('standard_search', array('description', 'target_class')); // Criteria of the std search form
|
||||
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
|
||||
}
|
||||
}
|
||||
@@ -225,7 +253,7 @@ class lnkTriggerAction extends cmdbAbstractObject
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "core/cmdb",
|
||||
"category" => "core/cmdb,bizmodel",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "",
|
||||
"state_attcode" => "",
|
||||
|
||||
@@ -160,8 +160,7 @@ abstract class User extends cmdbAbstractObject
|
||||
}
|
||||
// Check that this user has at least one profile assigned
|
||||
$oSet = $this->Get('profile_list');
|
||||
$aProfileLinks = $oSet->ToArray();
|
||||
if (count($aProfileLinks) == 0)
|
||||
if ($oSet->Count() == 0)
|
||||
{
|
||||
$this->m_aCheckIssues[] = Dict::Format('Class:User/Error:AtLeastOneProfileIsNeeded');
|
||||
}
|
||||
@@ -202,7 +201,7 @@ abstract class User extends cmdbAbstractObject
|
||||
{
|
||||
if (UserRights::IsStimulusAllowed($sClass, $sStimulusCode, null, $this))
|
||||
{
|
||||
$aStimuli[] = '<span title="'.$sStimulusCode.': '.htmlentities($oStimulus->GetDescription()).'">'.htmlentities($oStimulus->GetLabel()).'</span>';
|
||||
$aStimuli[] = '<span title="'.$sStimulusCode.': '.htmlentities($oStimulus->GetDescription(), ENT_QUOTES, 'UTF-8').'">'.htmlentities($oStimulus->GetLabel(), ENT_QUOTES, 'UTF-8').'</span>';
|
||||
}
|
||||
}
|
||||
$sStimuli = implode(', ', $aStimuli);
|
||||
@@ -668,10 +667,7 @@ class UserRights
|
||||
|
||||
if (MetaModel::DBIsReadOnly())
|
||||
{
|
||||
if ($iActionCode == UR_ACTION_MODIFY) return false;
|
||||
if ($iActionCode == UR_ACTION_DELETE) return false;
|
||||
if ($iActionCode == UR_ACTION_BULK_MODIFY) return false;
|
||||
if ($iActionCode == UR_ACTION_BULK_DELETE) return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (self::IsAdministrator($oUser)) return true;
|
||||
@@ -820,4 +816,169 @@ class UserRights
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper class to get the number/list of items for which a given action is allowed/possible
|
||||
*/
|
||||
class ActionChecker
|
||||
{
|
||||
var $oFilter;
|
||||
var $iActionCode;
|
||||
var $iAllowedCount = null;
|
||||
var $aAllowedIDs = null;
|
||||
|
||||
public function __construct(DBObjectSearch $oFilter, $iActionCode)
|
||||
{
|
||||
$this->oFilter = $oFilter;
|
||||
$this->iActionCode = $iActionCode;
|
||||
$this->iAllowedCount = null;
|
||||
$this->aAllowedIDs = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the number of objects for which the action is allowed
|
||||
* @return integer The number of "allowed" objects 0..N
|
||||
*/
|
||||
public function GetAllowedCount()
|
||||
{
|
||||
if ($this->iAllowedCount == null) $this->CheckObjects();
|
||||
return $this->iAllowedCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* If IsAllowed returned UR_ALLOWED_DEPENDS, this methods returns
|
||||
* an array of ObjKey => Status (true|false)
|
||||
* @return array
|
||||
*/
|
||||
public function GetAllowedIDs()
|
||||
{
|
||||
if ($this->aAllowedIDs == null) $this->IsAllowed();
|
||||
return $this->aAllowedIDs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the speficied stimulus is allowed for the set of objects
|
||||
* @return UR_ALLOWED_YES, UR_ALLOWED_NO or UR_ALLOWED_DEPENDS
|
||||
*/
|
||||
public function IsAllowed()
|
||||
{
|
||||
$sClass = $this->oFilter->GetClass();
|
||||
$oSet = new DBObjectSet($this->oFilter);
|
||||
$iActionAllowed = UserRights::IsActionAllowed($sClass, $oSet, $this->iActionCode);
|
||||
if ($iActionAllowed == UR_ALLOWED_DEPENDS)
|
||||
{
|
||||
// Check for each object if the action is allowed or not
|
||||
$this->aAllowedIDs = array();
|
||||
$oSet->Rewind();
|
||||
$this->iAllowedCount = 0;
|
||||
while($oObj = $oSet->Fetch())
|
||||
{
|
||||
$oObjSet = DBObjectSet::FromArray($sClass, array($oObj));
|
||||
if (UserRights::IsActionAllowed($sClass, $this->iActionCode, $oObjSet) == UR_ALLOWED_NO)
|
||||
{
|
||||
$this->aAllowedIDs[$oObj->GetKey()] = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Assume UR_ALLOWED_YES, since there is just one object !
|
||||
$this->aAllowedIDs[$oObj->GetKey()] = true;
|
||||
$this->iAllowedCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ($iActionAllowed == UR_ALLOWED_YES)
|
||||
{
|
||||
$this->iAllowedCount = $oSet->Count();
|
||||
$this->aAllowedIDs = array(); // Optimization: not filled when Ok for all objects
|
||||
}
|
||||
else // UR_ALLOWED_NO
|
||||
{
|
||||
$this->iAllowedCount = 0;
|
||||
$this->aAllowedIDs = array();
|
||||
}
|
||||
return $iActionAllowed;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper class to get the number/list of items for which a given stimulus can be applied (allowed & possible)
|
||||
*/
|
||||
class StimulusChecker extends ActionChecker
|
||||
{
|
||||
var $sState = null;
|
||||
|
||||
public function __construct(DBObjectSearch $oFilter, $sState, $iStimulusCode)
|
||||
{
|
||||
parent::__construct($oFilter, $iStimulusCode);
|
||||
$this->sState = $sState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the speficied stimulus is allowed for the set of objects
|
||||
* @return UR_ALLOWED_YES, UR_ALLOWED_NO or UR_ALLOWED_DEPENDS
|
||||
*/
|
||||
public function IsAllowed()
|
||||
{
|
||||
$sClass = $this->oFilter->GetClass();
|
||||
$oSet = new DBObjectSet($this->oFilter);
|
||||
$iActionAllowed = UserRights::IsStimulusAllowed($sClass, $this->iActionCode, $oSet);
|
||||
if ($iActionAllowed == UR_ALLOWED_NO)
|
||||
{
|
||||
$this->iAllowedCount = 0;
|
||||
$this->aAllowedIDs = array();
|
||||
}
|
||||
else // Even if UR_ALLOWED_YES, we need to check if each object is in the appropriate state
|
||||
{
|
||||
// Hmmm, may not be needed right now because we limit the "multiple" action to object in
|
||||
// the same state... may be useful later on if we want to extend this behavior...
|
||||
|
||||
// Check for each object if the action is allowed or not
|
||||
$this->aAllowedIDs = array();
|
||||
$oSet->Rewind();
|
||||
$iAllowedCount = 0;
|
||||
$iActionAllowed = UR_ALLOWED_DEPENDS;
|
||||
while($oObj = $oSet->Fetch())
|
||||
{
|
||||
$aTransitions = $oObj->EnumTransitions();
|
||||
if (array_key_exists($this->iActionCode, $aTransitions))
|
||||
{
|
||||
// Temporary optimization possible: since the current implementation
|
||||
// of IsActionAllowed does not perform a 'per instance' check, we could
|
||||
// skip this second validation phase and assume it would return UR_ALLOWED_YES
|
||||
$oObjSet = DBObjectSet::FromArray($sClass, array($oObj));
|
||||
if (UserRights::IsActionAllowed($sClass, $this->iActionCode, $oObjSet) == UR_ALLOWED_NO)
|
||||
{
|
||||
$this->aAllowedIDs[$oObj->GetKey()] = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Assume UR_ALLOWED_YES, since there is just one object !
|
||||
$this->aAllowedIDs[$oObj->GetKey()] = true;
|
||||
$this->iState = $oObj->GetState();
|
||||
$this->iAllowedCount++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->aAllowedIDs[$oObj->GetKey()] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->iAllowedCount == $oSet->Count())
|
||||
{
|
||||
$iActionAllowed = UR_ALLOWED_YES;
|
||||
}
|
||||
if ($this->iAllowedCount == 0)
|
||||
{
|
||||
$iActionAllowed = UR_ALLOWED_NO;
|
||||
}
|
||||
|
||||
return $iActionAllowed;
|
||||
}
|
||||
|
||||
public function GetState()
|
||||
{
|
||||
return $this->iState;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* CSS Document */
|
||||
body {
|
||||
font-family: Tahoma, Verdana, Arial, Helevtica;
|
||||
font-family: Tahoma, Verdana, Arial, Helvetica;
|
||||
font-size: 10pt;
|
||||
background-color: #fff;
|
||||
color:#000000;
|
||||
@@ -10,7 +10,7 @@ body {
|
||||
}
|
||||
|
||||
.raw_output {
|
||||
font-family: Courier-New, Courier, Arial, Helevtica;
|
||||
font-family: Courier-New, Courier, Arial, Helvetica;
|
||||
font-size: 8pt;
|
||||
background-color: #eeeeee;
|
||||
color: #000000;
|
||||
@@ -126,9 +126,9 @@ th.headerSortDown {
|
||||
|
||||
td {
|
||||
font-family: Tahoma, Verdana, Arial, Helvetica;
|
||||
font-size: 8pt;
|
||||
font-size: 12px;
|
||||
color:#696969;
|
||||
background-color: #ffffff;
|
||||
nobackground-color: #ffffff;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
@@ -139,14 +139,43 @@ tr.clicked td {
|
||||
}
|
||||
|
||||
td.label {
|
||||
vertical-align: top;
|
||||
}
|
||||
td.label span {
|
||||
font-family: Tahoma, Verdana, Arial, Helvetica;
|
||||
font-size: 12px;
|
||||
color: #000000;
|
||||
background-color:#f6f6f6;
|
||||
padding: 0.25em;
|
||||
font-weight:bold;
|
||||
padding: 5px;
|
||||
padding-right: 10px;
|
||||
font-weight:bold;
|
||||
vertical-align: top;
|
||||
text-align: right;
|
||||
display: block;
|
||||
}
|
||||
fieldset td.label span {
|
||||
padding: 3px;
|
||||
padding-right: 10px;
|
||||
}
|
||||
fieldset {
|
||||
margin-top: 3px;
|
||||
-moz-border-radius: 6px;
|
||||
-webkit-border-radius: 6px;
|
||||
border-radius: 6px;
|
||||
border-style: solid;
|
||||
border-color: #ddd;
|
||||
}
|
||||
|
||||
legend {
|
||||
font-family: Tahoma, Verdana, Arial, Helvetica;
|
||||
font-size: 12px;
|
||||
padding:8px;
|
||||
color: #fff;
|
||||
background-color: #1C94C4;
|
||||
font-weight: bold;
|
||||
-moz-border-radius: 6px;
|
||||
-webkit-border-radius: 6px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.ui-widget-content td a, p a, p a:visited, td a, td a:visited {
|
||||
text-decoration:none;
|
||||
color: #1C94C4;
|
||||
@@ -160,7 +189,7 @@ p a:hover, td a:hover {
|
||||
background: url(../images/mini-arrow-orange.gif) no-repeat left;
|
||||
}
|
||||
|
||||
td a.no-arrow, td a.no-arrow:visited {
|
||||
td a.no-arrow, td a.no-arrow:visited, .SearchDrawer a.no-arrow, .SearchDrawer a.no-arrow:visited {
|
||||
text-decoration:none;
|
||||
color:#000000;
|
||||
padding-left:0px;
|
||||
@@ -917,3 +946,106 @@ span.form_validation {
|
||||
width: 95%;
|
||||
-moz-border-radius: 0.5em;
|
||||
}
|
||||
.wiki_broken_link {
|
||||
text-decoration: line-through;
|
||||
}
|
||||
.synoptics, .synoptics tr td {
|
||||
background: transparent;
|
||||
padding:10px;
|
||||
font-size:1em;
|
||||
vertical-align:middle;
|
||||
color:#fff;
|
||||
text-align:center;
|
||||
}
|
||||
.synoptics tr td.arrow {
|
||||
color:#333;
|
||||
border-top: 1px dashed #333;
|
||||
width:100px;
|
||||
}
|
||||
.synoptics tr.synoptics_header td {
|
||||
color:#000; font-size:1em;
|
||||
vertical-align:middle;
|
||||
text-align:center;
|
||||
}
|
||||
.mono_value {
|
||||
display: inline-block;
|
||||
background-color: #3c3;
|
||||
color: #fff;
|
||||
font-weight:bold;
|
||||
padding: 3px;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
margin-left:3px;
|
||||
-moz-border-radius: 10px;
|
||||
-webkit-border-radius: 10px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
.multi_values {
|
||||
display: inline-block;
|
||||
background-color: #c33;
|
||||
color: #fff;
|
||||
font-weight:bold;
|
||||
padding: 3px;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
margin-left:3px;
|
||||
-moz-border-radius: 10px;
|
||||
-webkit-border-radius: 10px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
.caselog {
|
||||
overflow-x: hidden;
|
||||
display: block;
|
||||
overflow-y: auto;
|
||||
border: 1px #ddd solid;
|
||||
font-family: Tahoma, Verdana, Arial, Helvetica;
|
||||
font-size: 12px;
|
||||
}
|
||||
.caselog_input_header {
|
||||
padding-top:3px;
|
||||
padding-bottom:3px;
|
||||
border-top:1px solid #fff;
|
||||
background: #ddd;
|
||||
width:100%;
|
||||
}
|
||||
.caselog_header {
|
||||
padding:3px;
|
||||
border-top:1px solid #fff;
|
||||
background: #ddd url(../images/plus.gif) left no-repeat;
|
||||
padding-left: 16px;
|
||||
cursor: pointer;
|
||||
width:100%;
|
||||
}
|
||||
.caselog_header.open {
|
||||
background: #ddd url(../images/minus.gif) left no-repeat;
|
||||
}
|
||||
.caselog_entry {
|
||||
padding:3px;
|
||||
padding-left: 16px;
|
||||
border-bottom:1px #999 solid;
|
||||
margin-left:0;
|
||||
margin-right:0;
|
||||
white-space: pre-wrap; /* css-3 */
|
||||
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||
white-space: -pre-wrap; /* Opera 4-6 */
|
||||
white-space: -o-pre-wrap; /* Opera 7 */
|
||||
word-wrap: break-word; /* Internet Explorer 5.5+, CSS3 */
|
||||
}
|
||||
table.details {
|
||||
border-collapse: collapse;
|
||||
noborder-bottom: 2px #fff solid;
|
||||
width:100%;
|
||||
}
|
||||
table.details>tbody>tr>td {
|
||||
border-bottom: 2px #ddd solid;
|
||||
padding-bottom: 5px;
|
||||
padding-top: 3px;
|
||||
}
|
||||
fieldset table.details>tbody>tr>td {
|
||||
padding-top: 3px;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
}
|
||||
.ac_dlg_loading {
|
||||
background: white url('../images/indicator.gif') right center no-repeat;
|
||||
}
|
||||
@@ -94,9 +94,6 @@ Dict::Add('DE DE', 'English', 'English', array(
|
||||
'Core:AttributeTemplateHTML' => 'Template HTML',
|
||||
'Core:AttributeTemplateHTML+' => 'HTML containing placeholders',
|
||||
|
||||
'Core:AttributeWikiText' => 'Wiki article',
|
||||
'Core:AttributeWikiText+' => 'Wiki formatted text',
|
||||
|
||||
'Core:AttributeDateTime' => 'Date/time',
|
||||
'Core:AttributeDateTime+' => 'Date and time (year-month-day hh:mm:ss)',
|
||||
|
||||
@@ -206,6 +203,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Change:ObjectDeleted' => 'Object deleted',
|
||||
'Change:ObjectModified' => 'Object modified',
|
||||
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s geändert zu %2$s (vorheriger Wert: %3$s)',
|
||||
'Change:AttName_SetTo' => '%1$s geändert zu %2$s',
|
||||
'Change:Text_AppendedTo_AttName' => '%1$s zugefügt an %2$s',
|
||||
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s modifiziert, vorheriger Wert: %2$s',
|
||||
'Change:AttName_Changed' => '%1$s modifiziert',
|
||||
|
||||
@@ -653,6 +653,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'Massenlöschung von %1$d Objekten der %2$s',
|
||||
'UI:Delete:NotAllowedToDelete' => 'Sie sind nicht berechtigt, dieses Objekt zu löschen.',
|
||||
'UI:Delete:NotAllowedToUpdate_Fields' => 'Sie sind nicht berechtigt, die folgenden Felder zu aktualisieren: %1$s',
|
||||
'UI:Error:CannotDeleteBecause' => 'This object could not be deleted because: %1$s',
|
||||
'UI:Error:NotEnoughRightsToDelete' => 'Dieses Objekt konnte nicht gelöscht werden, da der derzeitige Benutzer nicht die notwendigen Rechte dazu besitzt.',
|
||||
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Dieses Objekt konnte nicht gelöscht werden, da zuerst dazu einige manuelle Operationen durchgeführt werden müssen.',
|
||||
'UI:Archive_User_OnBehalfOf_User' => '%1$s im Auftrag von %2$s',
|
||||
@@ -664,8 +665,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s gelöscht.',
|
||||
'UI:Delete:ConfirmDeletionOf_Name' => 'Löschung von %1$s',
|
||||
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Löschung von %1$d Objekten der Klasse %2$s',
|
||||
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Sollte automatisch gelöscht werden, aber Sie sind nicht berechtigt, dies zu tun',
|
||||
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Muss automatisch gelöscht werden, aber Sie sind nicht berechtigt, dieses Objekt zu löschen. Bitte kontaktieren Sie Ihren Anwendungs-Administrator',
|
||||
// 'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Sollte automatisch gelöscht werden, aber Sie sind nicht berechtigt, dies zu tun',
|
||||
// 'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Muss automatisch gelöscht werden, aber Sie sind nicht berechtigt, dieses Objekt zu löschen. Bitte kontaktieren Sie Ihren Anwendungs-Administrator',
|
||||
'UI:Delete:WillBeDeletedAutomatically' => 'Wird automatisch gelöscht',
|
||||
'UI:Delete:MustBeDeletedManually' => 'Muss manuell gelöscht werden',
|
||||
'UI:Delete:CannotUpdateBecause_Issue' => 'Sollte automatisch aktualisiert werden, aber: %1$s',
|
||||
|
||||
@@ -84,9 +84,6 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'Core:AttributeTemplateHTML' => 'Template HTML',
|
||||
'Core:AttributeTemplateHTML+' => 'HTML containing placeholders',
|
||||
|
||||
'Core:AttributeWikiText' => 'Wiki article',
|
||||
'Core:AttributeWikiText+' => 'Wiki formatted text',
|
||||
|
||||
'Core:AttributeDateTime' => 'Date/time',
|
||||
'Core:AttributeDateTime+' => 'Date and time (year-month-day hh:mm:ss)',
|
||||
|
||||
@@ -205,9 +202,11 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'Change:ObjectDeleted' => 'Object deleted',
|
||||
'Change:ObjectModified' => 'Object modified',
|
||||
'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',
|
||||
'Change:AttName_EntryAdded' => '%1$s modified, new entry added.',
|
||||
));
|
||||
|
||||
//
|
||||
@@ -239,13 +238,13 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:Event' => 'Log Event',
|
||||
'Class:Event+' => 'An application internal event',
|
||||
'Class:Event/Attribute:message' => 'message',
|
||||
'Class:Event/Attribute:message' => 'Message',
|
||||
'Class:Event/Attribute:message+' => 'short description of the event',
|
||||
'Class:Event/Attribute:date' => 'date',
|
||||
'Class:Event/Attribute:date' => 'Date',
|
||||
'Class:Event/Attribute:date+' => 'date and time at which the changes have been recorded',
|
||||
'Class:Event/Attribute:userinfo' => 'user info',
|
||||
'Class:Event/Attribute:userinfo' => 'User info',
|
||||
'Class:Event/Attribute:userinfo+' => 'identification of the user that was doing the action that triggered this event',
|
||||
'Class:Event/Attribute:finalclass' => 'type',
|
||||
'Class:Event/Attribute:finalclass' => 'Type',
|
||||
'Class:Event/Attribute:finalclass+' => '',
|
||||
));
|
||||
|
||||
@@ -329,6 +328,21 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:EventWebService/Attribute:data+' => 'Result data',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: EventLoginUsage
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', array(
|
||||
'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: Action
|
||||
//
|
||||
@@ -422,6 +436,15 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:TriggerOnObject/Attribute:target_class+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: TriggerOnPortalUpdate
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:TriggerOnPortalUpdate' => 'Trigger (when updated from the portal)',
|
||||
|
||||
));
|
||||
|
||||
//
|
||||
// Class: TriggerOnStateChange
|
||||
//
|
||||
@@ -479,5 +502,218 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:lnkTriggerAction/Attribute:order+' => 'Actions execution order',
|
||||
));
|
||||
|
||||
//
|
||||
// Synchro Data Source
|
||||
//
|
||||
Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:SynchroDataSource/Attribute:name' => 'Name',
|
||||
'Class:SynchroDataSource/Attribute:name+' => 'Name',
|
||||
'Class:SynchroDataSource/Attribute:description' => 'Description',
|
||||
'Class:SynchroDataSource/Attribute:status' => 'Status', //TODO: enum values
|
||||
'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', //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' => '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:user_delete_policy' => 'Users allowed',
|
||||
'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',
|
||||
'SynchroDataSource:Description' => 'Description',
|
||||
'SynchroDataSource:Reconciliation' => 'Search & 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:Synchro:History' => 'Synchronization 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.',
|
||||
'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' => '(DataExchange)',
|
||||
'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.',
|
||||
|
||||
'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' => 'Sycnhro 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' => 'Lat 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: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',
|
||||
));
|
||||
|
||||
//
|
||||
// Attribute Duration
|
||||
//
|
||||
Dict::Add('EN US', 'English', 'English', array(
|
||||
'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',
|
||||
));
|
||||
|
||||
?>
|
||||
|
||||
@@ -400,7 +400,7 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'UI:HistoryTab' => 'History',
|
||||
'UI:NotificationsTab' => 'Notifications',
|
||||
'UI:History:BulkImports' => 'History',
|
||||
'UI:History:BulkImports+' => 'List of CSV imports (last first)',
|
||||
'UI:History:BulkImports+' => 'List of CSV imports (latest import first)',
|
||||
'UI:History:BulkImportDetails' => 'Changes resulting from the CSV import performed on %1$s (by %2$s)',
|
||||
'UI:History:Date' => 'Date',
|
||||
'UI:History:Date+' => 'Date of the change',
|
||||
@@ -456,6 +456,7 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'UI:LogOff:ThankYou' => 'Thank you for using iTop',
|
||||
'UI:LogOff:ClickHereToLoginAgain' => 'Click here to login again...',
|
||||
'UI:ChangePwdMenu' => 'Change Password...',
|
||||
'UI:Login:PasswordChanged' => 'Password successfully set !',
|
||||
'UI:AccessRO-All' => 'iTop is read-only',
|
||||
'UI:AccessRO-Users' => 'iTop is read-only for end-users',
|
||||
'UI:Login:RetypePwdDoesNotMatch' => 'New password and retyped new password do not match !',
|
||||
@@ -623,8 +624,11 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'UI:Delete:NotAllowedToDelete' => 'You are not allowed to delete this object',
|
||||
'UI:Delete:NotAllowedToUpdate_Fields' => 'You are not allowed to update the following field(s): %1$s',
|
||||
'UI:Error:NotEnoughRightsToDelete' => 'This object could not be deleted because the current user do not have sufficient rights',
|
||||
'UI:Error:CannotDeleteBecause' => 'This object could not be deleted because: %1$s',
|
||||
'UI:Error:CannotDeleteBecauseOfDepencies' => 'This object could not be deleted because some manual operations must be performed prior to that',
|
||||
'UI:Error:CannotDeleteBecauseManualOpNeeded' => 'This object could not be deleted because some manual operations must be performed prior to that',
|
||||
'UI:Archive_User_OnBehalfOf_User' => '%1$s on behalf of %2$s',
|
||||
'UI:Delete:Deleted' => 'deleted',
|
||||
'UI:Delete:AutomaticallyDeleted' => 'automatically deleted',
|
||||
'UI:Delete:AutomaticResetOf_Fields' => 'automatic reset of field(s): %1$s',
|
||||
'UI:Delete:CleaningUpRefencesTo_Object' => 'Cleaning up all references to %1$s...',
|
||||
@@ -633,8 +637,9 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s deleted.',
|
||||
'UI:Delete:ConfirmDeletionOf_Name' => 'Deletion of %1$s',
|
||||
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Deletion of %1$d objects of class %2$s',
|
||||
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Should be automaticaly deleted, but you are not allowed to do so',
|
||||
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Must be deleted manually - but you are not allowed to delete this object, please contact your application admin',
|
||||
'UI:Delete:CannotDeleteBecause' => 'Could not be deleted: %1$s',
|
||||
'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Should be automaticaly deleted, but this is not feasible: %1$s',
|
||||
'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Must be deleted manually, but this is not feasible: %1$s',
|
||||
'UI:Delete:WillBeDeletedAutomatically' => 'Will be automaticaly deleted',
|
||||
'UI:Delete:MustBeDeletedManually' => 'Must be deleted manually',
|
||||
'UI:Delete:CannotUpdateBecause_Issue' => 'Should be automatically updated, but: %1$s',
|
||||
@@ -879,9 +884,36 @@ When associated with a trigger, each action is given an "order" number, specifyi
|
||||
'Portal:AddAttachment' => ' Add Attachment ',
|
||||
'Portal:RemoveAttachment' => ' Remove Attachment ',
|
||||
'Portal:Attachment_No_To_Ticket_Name' => 'Attachment #%1$d to %2$s (%3$s)',
|
||||
'Enum:Undefined' => 'Undefined',
|
||||
'Enum:Undefined' => 'Undefined',
|
||||
'UI:DurationForm_Days_Hours_Minutes_Seconds' => '%1$s Days %2$s Hours %3$s Minutes %4$s Seconds',
|
||||
'UI:ModifyAllPageTitle' => 'Modify All',
|
||||
'UI:Modify_N_ObjectsOf_Class' => 'Modifying %1$d objects of class %2$s',
|
||||
'UI:Modify_M_ObjectsOf_Class_OutOf_N' => 'Modifying %1$d objects of class %2$s out of %3$d',
|
||||
'UI:Menu:ModifyAll' => 'Modify...',
|
||||
'UI:Button:ModifyAll' => 'Modify All',
|
||||
'UI:Button:PreviewModifications' => 'Preview Modifications >>',
|
||||
'UI:ModifiedObject' => 'Object Modified',
|
||||
'UI:BulkModifyStatus' => 'Operation',
|
||||
'UI:BulkModifyStatus+' => 'Status of the operation',
|
||||
'UI:BulkModifyErrors' => 'Errors (if any)',
|
||||
'UI:BulkModifyErrors+' => 'Errors preventing the modification',
|
||||
'UI:BulkModifyStatusOk' => 'Ok',
|
||||
'UI:BulkModifyStatusError' => 'Error',
|
||||
'UI:BulkModifyStatusModified' => 'Modified',
|
||||
'UI:BulkModifyStatusSkipped' => 'Skipped',
|
||||
'UI:BulkModify_Count_DistinctValues' => '%1$d distinct values:',
|
||||
'UI:BulkModify:Value_Exists_N_Times' => '%1$s, %2$d time(s)',
|
||||
'UI:BulkModify:N_MoreValues' => '%1$d more values...',
|
||||
'UI:AttemptingToSetAReadOnlyAttribute_Name' => 'Attempting to set the read-only field: %1$s',
|
||||
'UI:FailedToApplyStimuli' => 'The action has failed.',
|
||||
'UI:StimulusModify_N_ObjectsOf_Class' => '%1$s: Modifying %2$d objects of class %3$s',
|
||||
'UI:CaseLogTypeYourTextHere' => 'Type your text here:',
|
||||
'UI:CaseLog:DateFormat' => 'Y-m-d H:i:s',
|
||||
'UI:CaseLog:Header_Date_UserName' => '%1$s - %2$s:',
|
||||
'UI:CaseLog:InitialValue' => 'Initial value:',
|
||||
'UI:AttemptingToSetASlaveAttribute_Name' => 'The field %1$s is not writable because it is mastered by the data synchronization. Value not set.',
|
||||
'UI:ActionNotAllowed' => 'You are not allowed to perform this action on these objects.',
|
||||
'UI:BulkAction:NoObjectSelected' => 'Please select at least one object to perform this operation',
|
||||
'UI:AttemptingToChangeASlaveAttribute_Name' => 'The field %1$s is not writable because it is mastered by the data synchronization. Value remains unchanged.',
|
||||
));
|
||||
|
||||
|
||||
|
||||
?>
|
||||
|
||||
@@ -90,9 +90,6 @@ Dict::Add('ES CR', 'English', 'English', array(
|
||||
'Core:AttributeTemplateHTML' => 'Template HTML',
|
||||
'Core:AttributeTemplateHTML+' => 'HTML containing placeholders',
|
||||
|
||||
'Core:AttributeWikiText' => 'Wiki article',
|
||||
'Core:AttributeWikiText+' => 'Wiki formatted text',
|
||||
|
||||
'Core:AttributeDateTime' => 'Date/time',
|
||||
'Core:AttributeDateTime+' => 'Date and time (year-month-day hh:mm:ss)',
|
||||
|
||||
@@ -203,6 +200,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
|
||||
// Used by CMDBChangeOp... & derived classes
|
||||
Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
|
||||
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s modificado en %2$s (valor anterior: %3$s)',
|
||||
'Change:AttName_SetTo' => '%1$s modificado en %2$s',
|
||||
'Change:Text_AppendedTo_AttName' => '%1$s añadido a %2$s',
|
||||
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s modificado, valor anterior: %2$s',
|
||||
'Change:AttName_Changed' => '%1$s modificado',
|
||||
|
||||
@@ -628,8 +628,8 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
|
||||
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s borrado.',
|
||||
'UI:Delete:ConfirmDeletionOf_Name' => 'Borrado de %1$s',
|
||||
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Borrado de %1$d objetos de al clase %2$s',
|
||||
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Beberia ser eliminado automaticamente, pero usted no esta autorizado para hacerlo',
|
||||
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Debe ser borrado manualmente - pero usted no esta autorizado para borrar este objeto, por favor contacte al administrador de la aplicacion',
|
||||
// 'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Beberia ser eliminado automaticamente, pero usted no esta autorizado para hacerlo',
|
||||
// 'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Debe ser borrado manualmente - pero usted no esta autorizado para borrar este objeto, por favor contacte al administrador de la aplicacion',
|
||||
'UI:Delete:WillBeDeletedAutomatically' => 'Sera borrado automaticamente',
|
||||
'UI:Delete:MustBeDeletedManually' => 'Debe ser borrado manualmente',
|
||||
'UI:Delete:CannotUpdateBecause_Issue' => 'Debe ser actualizado automaticamente, pero: %1$s',
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -15,46 +15,12 @@
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Classes in 'gui'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Classes in 'application'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
//
|
||||
// Class: AuditCategory
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:AuditCategory' => 'Catégorie d\'audit',
|
||||
'Class:AuditCategory+' => 'A section inside the overall audit',
|
||||
'Class:AuditCategory/Attribute:name' => 'Nom',
|
||||
'Class:AuditCategory/Attribute:name+' => 'Nom raccourci',
|
||||
'Class:AuditCategory/Attribute:description' => 'Description',
|
||||
'Class:AuditCategory/Attribute:description+' => 'Description',
|
||||
'Class:AuditCategory/Attribute:definition_set' => 'Ensemble de définition',
|
||||
'Class:AuditCategory/Attribute:definition_set+' => 'Expression OQL qui défini le périmètre d\'application de l\'audit',
|
||||
'Class:AuditCategory/Attribute:rules_list' => 'Règles d\'audit',
|
||||
'Class:AuditCategory/Attribute:rules_list+' => 'Règles d\'audit pour cette catégorie',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: AuditRule
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:AuditRule' => 'Règle d\'audit',
|
||||
'Class:AuditRule+' => '',
|
||||
@@ -66,26 +32,94 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:AuditRule/Attribute:query+' => 'Expression OQL de calcul des éléments incorrects',
|
||||
'Class:AuditRule/Attribute:valid_flag' => 'Interprétation',
|
||||
'Class:AuditRule/Attribute:valid_flag+' => 'La requête définit-elle les éléments valides ?',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:true' => 'Objets valides',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:true+' => '',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:false' => 'Objets incorrects',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:false+' => '',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:true' => 'Objets valides',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:true+' => '',
|
||||
'Class:AuditRule/Attribute:category_id' => 'Catégorie',
|
||||
'Class:AuditRule/Attribute:category_id+' => '',
|
||||
'Class:AuditRule/Attribute:category_name' => 'Category',
|
||||
'Class:AuditRule/Attribute:category_name' => 'Categorie',
|
||||
'Class:AuditRule/Attribute:category_name+' => '',
|
||||
));
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Classes in 'addon/userrights'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
//
|
||||
// Class: User
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:AuditCategory' => 'Catégorie d\'audit',
|
||||
'Class:AuditCategory+' => 'Une section de l\'audit',
|
||||
'Class:AuditCategory/Attribute:name' => 'Nom',
|
||||
'Class:AuditCategory/Attribute:name+' => 'Nom raccourci',
|
||||
'Class:AuditCategory/Attribute:description' => 'Description',
|
||||
'Class:AuditCategory/Attribute:description+' => 'Description',
|
||||
'Class:AuditCategory/Attribute:definition_set' => 'Ensemble de définition',
|
||||
'Class:AuditCategory/Attribute:definition_set+' => 'Expression OQL qui défini le périmètre d\'application de l\'audit',
|
||||
'Class:AuditCategory/Attribute:rules_list' => 'Règles d\'audit',
|
||||
'Class:AuditCategory/Attribute:rules_list+' => 'Règles d\'audit pour cette catégorie',
|
||||
'Class:URP_Profiles' => 'Profil',
|
||||
'Class:URP_Profiles+' => 'Profil utilisateur',
|
||||
'Class:URP_Profiles/Attribute:name' => 'Nom',
|
||||
'Class:URP_Profiles/Attribute:name+' => '',
|
||||
'Class:URP_Profiles/Attribute:description' => 'Description',
|
||||
'Class:URP_Profiles/Attribute:description+' => '',
|
||||
'Class:URP_Profiles/Attribute:user_list' => 'Utilisateurs',
|
||||
'Class:URP_Profiles/Attribute:user_list+' => 'Comptes utilisateur (logins) ayant ce profil',
|
||||
'Class:URP_UserProfile' => 'Utilisateur/Profil',
|
||||
'Class:URP_UserProfile+' => '',
|
||||
'Class:URP_UserProfile/Attribute:userid' => 'Utilisateur',
|
||||
'Class:URP_UserProfile/Attribute:userid+' => '',
|
||||
'Class:URP_UserProfile/Attribute:userlogin' => 'Login',
|
||||
'Class:URP_UserProfile/Attribute:userlogin+' => '',
|
||||
'Class:URP_UserProfile/Attribute:profileid' => 'Profil',
|
||||
'Class:URP_UserProfile/Attribute:profileid+' => '',
|
||||
'Class:URP_UserProfile/Attribute:profile' => 'Profil',
|
||||
'Class:URP_UserProfile/Attribute:profile+' => '',
|
||||
'Class:URP_UserProfile/Attribute:reason' => 'Raison',
|
||||
'Class:URP_UserProfile/Attribute:reason+' => 'Justifie le rôle affecté à cet utilisateur',
|
||||
'Class:URP_UserOrg' => 'Utilisateur/Organisation',
|
||||
'Class:URP_UserOrg+' => 'Organizations permises pour l\'utilisateur',
|
||||
'Class:URP_UserOrg/Attribute:userid' => 'Utilisateur',
|
||||
'Class:URP_UserOrg/Attribute:userid+' => '',
|
||||
'Class:URP_UserOrg/Attribute:userlogin' => 'Login',
|
||||
'Class:URP_UserOrg/Attribute:userlogin+' => '',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_id' => 'Organisation',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_id+' => '',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_name' => 'Organisation',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_name+' => '',
|
||||
'Class:URP_UserOrg/Attribute:reason' => 'Raison',
|
||||
'Class:URP_UserOrg/Attribute:reason+' => 'Justifie la permission de voir les données de cette organisation',
|
||||
'Class:URP_ActionGrant' => 'action_permission',
|
||||
'Class:URP_ActionGrant+' => 'permissions on classes',
|
||||
'Class:URP_ActionGrant/Attribute:profileid' => 'Profile',
|
||||
'Class:URP_ActionGrant/Attribute:profileid+' => 'usage profile',
|
||||
'Class:URP_ActionGrant/Attribute:profile' => 'Profile',
|
||||
'Class:URP_ActionGrant/Attribute:profile+' => 'usage profile',
|
||||
'Class:URP_ActionGrant/Attribute:class' => 'Class',
|
||||
'Class:URP_ActionGrant/Attribute:class+' => 'Target class',
|
||||
'Class:URP_ActionGrant/Attribute:permission' => 'Permission',
|
||||
'Class:URP_ActionGrant/Attribute:permission+' => 'allowed or not allowed?',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:no' => 'no',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:no+' => 'no',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:yes' => 'yes',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:yes+' => 'yes',
|
||||
'Class:URP_ActionGrant/Attribute:action' => 'Action',
|
||||
'Class:URP_ActionGrant/Attribute:action+' => 'operations to perform on the given class',
|
||||
'Class:URP_StimulusGrant' => 'stimulus_permission',
|
||||
'Class:URP_StimulusGrant+' => 'permissions on stimilus in the life cycle of the object',
|
||||
'Class:URP_StimulusGrant/Attribute:profileid' => 'Profile',
|
||||
'Class:URP_StimulusGrant/Attribute:profileid+' => 'usage profile',
|
||||
'Class:URP_StimulusGrant/Attribute:profile' => 'Profile',
|
||||
'Class:URP_StimulusGrant/Attribute:profile+' => 'usage profile',
|
||||
'Class:URP_StimulusGrant/Attribute:class' => 'Class',
|
||||
'Class:URP_StimulusGrant/Attribute:class+' => 'Target class',
|
||||
'Class:URP_StimulusGrant/Attribute:permission' => 'Permission',
|
||||
'Class:URP_StimulusGrant/Attribute:permission+' => 'allowed or not allowed?',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:no' => 'no',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:no+' => 'no',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:yes' => 'yes',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:yes+' => 'yes',
|
||||
'Class:URP_StimulusGrant/Attribute:stimulus' => 'Stimulus',
|
||||
'Class:URP_StimulusGrant/Attribute:stimulus+' => 'stimulus code',
|
||||
'Class:URP_AttributeGrant' => 'attribute_permission',
|
||||
'Class:URP_AttributeGrant+' => 'permissions at the attributes level',
|
||||
'Class:URP_AttributeGrant/Attribute:actiongrantid' => 'Action grant',
|
||||
'Class:URP_AttributeGrant/Attribute:actiongrantid+' => 'action grant',
|
||||
'Class:URP_AttributeGrant/Attribute:attcode' => 'Attribute',
|
||||
'Class:URP_AttributeGrant/Attribute:attcode+' => 'attribute code',
|
||||
'Class:User' => 'Utilisateur',
|
||||
'Class:User+' => 'Compte utilisateur',
|
||||
'Class:User/Attribute:finalclass' => 'Type de compte',
|
||||
@@ -110,31 +144,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:User/Attribute:profile_list+' => 'Rôles, ouvrants les droits d\'accès',
|
||||
'Class:User/Attribute:allowed_org_list' => 'Organisations permises',
|
||||
'Class:User/Attribute:allowed_org_list+' => 'L\'utilisateur a le droit de voir les données des organisations listées ici. Si aucune organisation n\'est spécifiée, alors aucune restriction ne s\'applique.',
|
||||
|
||||
'Class:User/Error:LoginMustBeUnique' => 'Le login doit être unique - "%1s" est déjà utilisé.',
|
||||
'Class:User/Error:AtLeastOneProfileIsNeeded' => 'L\'utilisateur doit avoir au moins un profil.',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: URP_Profiles
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_Profiles' => 'Profil',
|
||||
'Class:URP_Profiles+' => 'Profil utilisateur',
|
||||
'Class:URP_Profiles/Attribute:name' => 'Nom',
|
||||
'Class:URP_Profiles/Attribute:name+' => '',
|
||||
'Class:URP_Profiles/Attribute:description' => 'Description',
|
||||
'Class:URP_Profiles/Attribute:description+' => '',
|
||||
'Class:URP_Profiles/Attribute:user_list' => 'Utilisateurs',
|
||||
'Class:URP_Profiles/Attribute:user_list+' => 'Comptes utilisateur (logins) ayant ce profil',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: URP_Dimensions
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_Dimensions' => 'Dimension',
|
||||
'Class:URP_Dimensions+' => 'Dimension applicative (défini des silos)',
|
||||
'Class:URP_Dimensions/Attribute:name' => 'Nom',
|
||||
@@ -143,51 +154,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_Dimensions/Attribute:description+' => '',
|
||||
'Class:URP_Dimensions/Attribute:type' => 'Type',
|
||||
'Class:URP_Dimensions/Attribute:type+' => 'Nom de classe ou type de données (unité de projection)',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: URP_UserProfile
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_UserProfile' => 'Utilisateur/Profil',
|
||||
'Class:URP_UserProfile+' => '',
|
||||
'Class:URP_UserProfile/Attribute:userid' => 'Utilisateur',
|
||||
'Class:URP_UserProfile/Attribute:userid+' => '',
|
||||
'Class:URP_UserProfile/Attribute:userlogin' => 'Login',
|
||||
'Class:URP_UserProfile/Attribute:userlogin+' => '',
|
||||
'Class:URP_UserProfile/Attribute:profileid' => 'Profil',
|
||||
'Class:URP_UserProfile/Attribute:profileid+' => '',
|
||||
'Class:URP_UserProfile/Attribute:profile' => 'Profil',
|
||||
'Class:URP_UserProfile/Attribute:profile+' => '',
|
||||
'Class:URP_UserProfile/Attribute:reason' => 'Raison',
|
||||
'Class:URP_UserProfile/Attribute:reason+' => 'Justifie le rôle affecté à cet utilisateur',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: URP_UserOrg
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_UserOrg' => 'Utilisateur/Organisation',
|
||||
'Class:URP_UserOrg+' => 'Organizations permises pour l\'utilisateur',
|
||||
'Class:URP_UserOrg/Attribute:userid' => 'Utilisateur',
|
||||
'Class:URP_UserOrg/Attribute:userid+' => '',
|
||||
'Class:URP_UserOrg/Attribute:userlogin' => 'Login',
|
||||
'Class:URP_UserOrg/Attribute:userlogin+' => '',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_id' => 'Organisation',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_id+' => '',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_name' => 'Organisation',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_name+' => '',
|
||||
'Class:URP_UserOrg/Attribute:reason' => 'Raison',
|
||||
'Class:URP_UserOrg/Attribute:reason+' => 'Justifie la permission de voir les données de cette organisation',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: URP_ProfileProjection
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_ProfileProjection' => 'profile_projection',
|
||||
'Class:URP_ProfileProjection+' => 'profile projections',
|
||||
'Class:URP_ProfileProjection/Attribute:dimensionid' => 'Dimension',
|
||||
@@ -202,13 +168,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_ProfileProjection/Attribute:value+' => 'OQL expression (using $user) | constant | | +attribute code',
|
||||
'Class:URP_ProfileProjection/Attribute:attribute' => 'Attribute',
|
||||
'Class:URP_ProfileProjection/Attribute:attribute+' => 'Target attribute code (optional)',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: URP_ClassProjection
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_ClassProjection' => 'class_projection',
|
||||
'Class:URP_ClassProjection+' => 'class projections',
|
||||
'Class:URP_ClassProjection/Attribute:dimensionid' => 'Dimension',
|
||||
@@ -221,78 +180,11 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_ClassProjection/Attribute:value+' => 'OQL expression (using $this) | constant | | +attribute code',
|
||||
'Class:URP_ClassProjection/Attribute:attribute' => 'Attribute',
|
||||
'Class:URP_ClassProjection/Attribute:attribute+' => 'Target attribute code (optional)',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: URP_ActionGrant
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_ActionGrant' => 'action_permission',
|
||||
'Class:URP_ActionGrant+' => 'permissions on classes',
|
||||
'Class:URP_ActionGrant/Attribute:profileid' => 'Profile',
|
||||
'Class:URP_ActionGrant/Attribute:profileid+' => 'usage profile',
|
||||
'Class:URP_ActionGrant/Attribute:profile' => 'Profile',
|
||||
'Class:URP_ActionGrant/Attribute:profile+' => 'usage profile',
|
||||
'Class:URP_ActionGrant/Attribute:class' => 'Class',
|
||||
'Class:URP_ActionGrant/Attribute:class+' => 'Target class',
|
||||
'Class:URP_ActionGrant/Attribute:permission' => 'Permission',
|
||||
'Class:URP_ActionGrant/Attribute:permission+' => 'allowed or not allowed?',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:yes' => 'yes',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:yes+' => 'yes',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:no' => 'no',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:no+' => 'no',
|
||||
'Class:URP_ActionGrant/Attribute:action' => 'Action',
|
||||
'Class:URP_ActionGrant/Attribute:action+' => 'operations to perform on the given class',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: URP_StimulusGrant
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_StimulusGrant' => 'stimulus_permission',
|
||||
'Class:URP_StimulusGrant+' => 'permissions on stimilus in the life cycle of the object',
|
||||
'Class:URP_StimulusGrant/Attribute:profileid' => 'Profile',
|
||||
'Class:URP_StimulusGrant/Attribute:profileid+' => 'usage profile',
|
||||
'Class:URP_StimulusGrant/Attribute:profile' => 'Profile',
|
||||
'Class:URP_StimulusGrant/Attribute:profile+' => 'usage profile',
|
||||
'Class:URP_StimulusGrant/Attribute:class' => 'Class',
|
||||
'Class:URP_StimulusGrant/Attribute:class+' => 'Target class',
|
||||
'Class:URP_StimulusGrant/Attribute:permission' => 'Permission',
|
||||
'Class:URP_StimulusGrant/Attribute:permission+' => 'allowed or not allowed?',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:yes' => 'yes',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:yes+' => 'yes',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:no' => 'no',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:no+' => 'no',
|
||||
'Class:URP_StimulusGrant/Attribute:stimulus' => 'Stimulus',
|
||||
'Class:URP_StimulusGrant/Attribute:stimulus+' => 'stimulus code',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: URP_AttributeGrant
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_AttributeGrant' => 'attribute_permission',
|
||||
'Class:URP_AttributeGrant+' => 'permissions at the attributes level',
|
||||
'Class:URP_AttributeGrant/Attribute:actiongrantid' => 'Action grant',
|
||||
'Class:URP_AttributeGrant/Attribute:actiongrantid+' => 'action grant',
|
||||
'Class:URP_AttributeGrant/Attribute:attcode' => 'Attribute',
|
||||
'Class:URP_AttributeGrant/Attribute:attcode+' => 'attribute code',
|
||||
));
|
||||
|
||||
//
|
||||
// String from the User Interface: menu, messages, buttons, etc...
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Menu:WelcomeMenu' => 'Bienvenue',
|
||||
'Menu:WelcomeMenu+' => 'Bienvenue dans iTop',
|
||||
'Menu:WelcomeMenuPage' => 'Bienvenue',
|
||||
'Menu:WelcomeMenuPage+' => 'Bienvenue dans iTop',
|
||||
'UI:WelcomeMenu:Title' => 'Bienvenue dans iTop',
|
||||
|
||||
'UI:WelcomeMenu:LeftBlock' => '<p>iTop est un portail opérationnel complet et libre pour gérer votre SI.</p>
|
||||
<ul>il contient:
|
||||
<li>Une base de gestion des configuration (CMDB - Configuration management database) pour documenter et gérer votre parc informatique.</li>
|
||||
@@ -303,7 +195,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
<li>Des tableaux de bord pour avoir rapidement une vue synthétique de votre SI.</li>
|
||||
</ul>
|
||||
<p>Tous ces modules peuvent être installés séparément, à votre rythme.</p>',
|
||||
|
||||
'UI:WelcomeMenu:RightBlock' => '<p>iTop a été conçu pour les fournisseurs de service, il permet à vos équipes IT de gérer facilement de multiples clients et organisations.
|
||||
<ul>iTop fournit un riche ensemble de processus métier pour:
|
||||
<li>Augmenter l\'efficacité de la gestion de votre SI</li>
|
||||
@@ -319,7 +210,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
<li>Contrôllez l\'actif le plus important de votre SI : la documentation.</li>
|
||||
</ul>
|
||||
</p>',
|
||||
|
||||
'UI:WelcomeMenu:AllOpenRequests' => 'Requêtes en cours: %1$d',
|
||||
'UI:WelcomeMenu:MyCalls' => 'Mes Appels Support',
|
||||
'UI:WelcomeMenu:OpenIncidents' => 'Incidents en cours: %1$d',
|
||||
@@ -332,7 +222,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:Button:Logoff' => 'Déconnexion',
|
||||
'UI:Button:GlobalSearch' => 'Rechercher',
|
||||
'UI:Button:Search' => 'Rechercher',
|
||||
|
||||
'UI:Button:Query' => ' Lancer la requête ',
|
||||
'UI:Button:Ok' => 'Ok',
|
||||
'UI:Button:Cancel' => 'Annuler',
|
||||
@@ -356,13 +245,12 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:Button:Delete' => ' Supprimer ! ',
|
||||
'UI:Button:ChangePassword' => ' Changer ! ',
|
||||
'UI:Button:ResetPassword' => ' Ràz du mot de passe ',
|
||||
|
||||
'UI:SearchToggle' => 'Recherche',
|
||||
|
||||
'UI:ClickToCreateNew' => 'Créer un nouvel objet de type %1$s',
|
||||
'UI:SearchFor_Class' => 'Rechercher des objets de type %1$s',
|
||||
'UI:NoObjectToDisplay' => 'Aucun objet à afficher.',
|
||||
'UI:Error:MandatoryTemplateParameter_object_id' => 'Le paramètre object_id est obligatoire quand link_attr est spécifié. Vérifiez la définition du modèle.',
|
||||
'UI:Error:MandatoryTemplateParameter_link_attr' => 'Le paramètre target_attr est obligatoire quand link_attr est spécifié. Vérifiez la définition du modèle.',
|
||||
'UI:Error:MandatoryTemplateParameter_target_attr' => 'Le paramètre taarget_attr est obligatoire quand link_attr est spécifié. Vérifiez la définition du modèle.',
|
||||
'UI:Error:MandatoryTemplateParameter_group_by' => 'Le paramètre group_by est obligatoire. Vérifiez la définition du modèle.',
|
||||
'UI:Error:InvalidGroupByFields' => 'Liste des champs "group by" incorrecte: "%1$s".',
|
||||
'UI:Error:UnsupportedStyleOfBlock' => 'Erreur: style de bloc("%1$s") inconnu.',
|
||||
@@ -375,7 +263,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:Error:CannotWriteToTmp_Dir' => 'Impossible d\'écrire le fichier temporaire sur disque. upload_tmp_dir = "%1$s".',
|
||||
'UI:Error:UploadStoppedByExtension_FileName' => 'Téléchargement arrêté à cause de l\'extension. (Nom du fichier original = "%1$s").',
|
||||
'UI:Error:UploadFailedUnknownCause_Code' => 'Le téléchargement a échoué pour une raison inconnue. (Code d\'erreur = "%1$s").',
|
||||
|
||||
'UI:Error:1ParametersMissing' => 'Erreur: Pour effectuer cette opération il manque le paramètre suivant: %1$s.',
|
||||
'UI:Error:2ParametersMissing' => 'Erreur: Pour effectuer cette opération il manque les paramètres suivants: %1$s and %2$s.',
|
||||
'UI:Error:3ParametersMissing' => 'Erreur: Pour effectuer cette opération il manque les paramètres suivants: %1$s, %2$s and %3$s.',
|
||||
@@ -391,7 +278,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:Error:ObjectAlreadyCloned' => 'Erreur: l\'objet a déjà été dupliqué !',
|
||||
'UI:Error:ObjectAlreadyCreated' => 'Erreur: l\'objet a déjà été créé !',
|
||||
'UI:Error:Invalid_Stimulus_On_Object_In_State' => 'Erreur: le stimulus "%1$s" n\'est pas valide pour l\'objet %2$s dans l\'état "%3$s".',
|
||||
|
||||
'UI:GroupBy:Count' => 'Nombre',
|
||||
'UI:GroupBy:Count+' => 'Nombre d\'éléments',
|
||||
'UI:CountOfObjects' => '%1$d objets correspondants aux critères.',
|
||||
@@ -424,11 +310,10 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:Menu:CSVExport' => 'Exporter en CSV',
|
||||
'UI:Menu:Modify' => 'Modifier...',
|
||||
'UI:Menu:Delete' => 'Supprimer...',
|
||||
'UI:Menu:Manage' => 'Gérer...',
|
||||
'UI:Menu:BulkDelete' => 'Supprimer...',
|
||||
'UI:UndefinedObject' => 'non défini',
|
||||
'UI:Document:OpenInNewWindow:Download' => 'Ouvrir dans un nouvelle fenêtre: %1$s, Télécharger: %2$s',
|
||||
'UI:SelectAllToggle+' => 'Tout Sélectionner / Tout Désélectionner',
|
||||
'UI:SelectAllToggle+' => 'Tout sélectionner / Tout déselectionner',
|
||||
'UI:TruncatedResults' => '%1$d objets affichés sur %2$d',
|
||||
'UI:DisplayAll' => 'Tout afficher',
|
||||
'UI:CollapseList' => 'Refermer',
|
||||
@@ -457,6 +342,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:LogOff:ThankYou' => 'Merci d\'avoir utilisé iTop',
|
||||
'UI:LogOff:ClickHereToLoginAgain' => 'Cliquez ici pour vous reconnecter...',
|
||||
'UI:ChangePwdMenu' => 'Changer de mot de passe...',
|
||||
'UI:Login:PasswordChanged' => 'Mot de passe mis à jour !',
|
||||
'UI:AccessRO-All' => 'iTop est en lecture seule',
|
||||
'UI:AccessRO-Users' => 'iTop est en lecture seule pour les utilisateurs finaux',
|
||||
'UI:Login:RetypePwdDoesNotMatch' => 'Les deux saisies du nouveau mot de passe ne sont pas identiques !',
|
||||
@@ -507,35 +393,28 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:CSVImport:Tab:Templates' => 'Modèles',
|
||||
'UI:CSVImport:PasteData' => 'Collez ici les données à importer:',
|
||||
'UI:CSVImport:PickClassForTemplate' => 'Choisissez un modèle à télécharger: ',
|
||||
'UI:CSVImport:SeparatorCharacter' => 'Caractère séparateur:',
|
||||
'UI:CSVImport:TextQualifierCharacter' => 'Entourage des champs texte',
|
||||
'UI:CSVImport:CommentsAndHeader' => 'En-tête et commentaires',
|
||||
'UI:CSVImport:SeparatorCharacter' => 'Separator character:',
|
||||
'UI:CSVImport:TextQualifierCharacter' => 'Text qualifier character',
|
||||
'UI:CSVImport:CommentsAndHeader' => 'Comments and header',
|
||||
'UI:CSVImport:SeparatorCharacter' => 'Séparateur:',
|
||||
'UI:CSVImport:TextQualifierCharacter' => 'Délimiteur de texte',
|
||||
'UI:CSVImport:CommentsAndHeader' => 'Commentaires et en-tête',
|
||||
'UI:CSVImport:SelectClass' => 'Sélectionner le type d\'objets à importer:',
|
||||
'UI:CSVImport:AdvancedMode' => 'Mode expert',
|
||||
'UI:CSVImport:AdvancedMode+' => 'En mode expert, l\'"id" (clef primaire) des objets peut être utilisé pour renommer des objets.' .
|
||||
'Cependant la colonne "id" (si elle est présente) ne peut être utilisée que comme clef de recherche et ne peut pas être combinée avec une autre clef de recherche.',
|
||||
'UI:CSVImport:AdvancedMode+' => 'En mode expert, l\'"id" (clef primaire) des objets peut être utilisé pour renommer des objets.Cependant la colonne "id" (si elle est présente) ne peut être utilisée que comme clef de recherche et ne peut pas être combinée avec une autre clef de recherche.',
|
||||
'UI:CSVImport:SelectAClassFirst' => 'Pour configurer la correspondance, choississez d\'abord un type ci-dessus.',
|
||||
'UI:CSVImport:HeaderFields' => 'Champs',
|
||||
'UI:CSVImport:HeaderMappings' => 'Correspondance',
|
||||
'UI:CSVImport:HeaderSearch' => 'Recherche ?',
|
||||
'UI:CSVImport:AlertIncompleteMapping' => 'Veuillez choisir le correspondance de chacun des champs.',
|
||||
'UI:CSVImport:AlertNoSearchCriteria' => 'Veuillez choisir au moins une clef de recherche.',
|
||||
'UI:CSVImport:Encoding' => 'Encodage des caractères',
|
||||
|
||||
'UI:CSVImport:Encoding' => 'Encodage des caractères',
|
||||
'UI:UniversalSearchTitle' => 'iTop - Recherche Universelle',
|
||||
'UI:UniversalSearch:Error' => 'Erreur : %1$s',
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Sélectionnez le type d\'objets à rechercher : ',
|
||||
|
||||
'UI:Audit:Title' => 'iTop - Audit de la CMDB',
|
||||
'UI:Audit:InteractiveAudit' => 'Audit Interactif',
|
||||
'UI:Audit:HeaderAuditRule' => 'Règle d\'audit',
|
||||
'UI:Audit:HeaderNbObjects' => 'Nb d\'Objets',
|
||||
'UI:Audit:HeaderNbErrors' => 'Nb d\'Erreurs',
|
||||
'UI:Audit:PercentageOk' => '% Ok',
|
||||
|
||||
'UI:RunQuery:Title' => 'iTop - Evaluation de requêtes OQL',
|
||||
'UI:RunQuery:QueryExamples' => 'Exemples de requêtes',
|
||||
'UI:RunQuery:HeaderPurpose' => 'Objectif',
|
||||
@@ -547,7 +426,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:RunQuery:DevelopedQuery' => 'Requête OQL décompilée : ',
|
||||
'UI:RunQuery:SerializedFilter' => 'Version sérialisée : ',
|
||||
'UI:RunQuery:Error' => 'Une erreur s\'est produite durant l\'exécution de la requête : %1$s',
|
||||
|
||||
'UI:Schema:Title' => 'Modèle de données iTop',
|
||||
'UI:Schema:CategoryMenuItem' => 'Catégorie <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Relations',
|
||||
@@ -606,13 +484,11 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:Schema:LifeCycleAttributeMustChange' => 'Doit changer',
|
||||
'UI:Schema:LifeCycleAttributeMustPrompt' => 'L\'utilisateur se verra proposer de changer la valeur',
|
||||
'UI:Schema:LifeCycleEmptyList' => 'liste vide',
|
||||
|
||||
'UI:LinksWidget:Autocomplete+' => 'Tapez les 3 premiers caractères...',
|
||||
'UI:Combo:SelectValue' => '--- choisissez une valeur ---',
|
||||
'UI:Label:SelectedObjects' => 'Objets sélectionnés: ',
|
||||
'UI:Label:AvailableObjects' => 'Objets disponibles: ',
|
||||
'UI:Link_Class_Attributes' => 'Attributs du type %1$s',
|
||||
'UI:SelectAllToggle+' => 'Tout sélectionner / Tout déselectionner',
|
||||
'UI:AddObjectsOf_Class_LinkedWith_Class_Instance' => 'Ajouter des objets de type %1$s liés à %3$s (%2$s)',
|
||||
'UI:AddObjectsOf_Class_LinkedWith_Class' => 'Ajouter des objets de type %1$s à lier à cet objet de type %2$s',
|
||||
'UI:ManageObjectsOf_Class_LinkedWith_Class_Instance' => 'Gérer les objets de type %1$s liés à %3$s (%2$s)',
|
||||
@@ -620,15 +496,17 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:RemoveLinkedObjectsOf_Class' => 'Enlever les objets sélectionnés',
|
||||
'UI:Message:EmptyList:UseAdd' => 'La liste est vide, utilisez le bouton "Ajouter..." pour ajouter des objets.',
|
||||
'UI:Message:EmptyList:UseSearchForm' => 'Utilisez le formulaire de recherche ci-dessus pour trouver les objets à ajouter.',
|
||||
|
||||
'UI:Wizard:FinalStepTitle' => 'Dernière étape: confirmation',
|
||||
'UI:Title:DeletionOf_Object' => 'Suppression de %1$s',
|
||||
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'Suppression massive de %1$d objets de type %2$s',
|
||||
'UI:Delete:NotAllowedToDelete' => 'Vous n\'êtes pas autorisé à supprimer cet objet',
|
||||
'UI:Delete:NotAllowedToUpdate_Fields' => 'Vous n\'êtes pas autorisé à mettre à jour les champs suivants : %1$s',
|
||||
'UI:Error:NotEnoughRightsToDelete' => 'Cet objet ne peut pas être supprimé car l\'utilisateur courant n\'a pas les droits nécessaires.',
|
||||
'UI:Error:CannotDeleteBecause' => 'Cet objet ne peut pas être effacé. Raison: %1$s',
|
||||
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Cet objet ne peut pas être supprimé, des opérations manuelles sont nécessaire avant sa suppression.',
|
||||
'UI:Error:CannotDeleteBecauseManualOpNeeded' => 'Des opération manuelles sont nécessaires avant de pouvoir effacer cet objet',
|
||||
'UI:Archive_User_OnBehalfOf_User' => '%1$s pour %2$s',
|
||||
'UI:Delete:Deleted' => 'supprimé',
|
||||
'UI:Delete:AutomaticallyDeleted' => 'supprimé automatiquement',
|
||||
'UI:Delete:AutomaticResetOf_Fields' => 'mise à jour automatique des champ(s): %1$s',
|
||||
'UI:Delete:CleaningUpRefencesTo_Object' => 'Suppression de toutes les références vers %1$s...',
|
||||
@@ -637,14 +515,15 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:Delete:_Name_Class_Deleted' => ' %2$s %1$s supprimé.',
|
||||
'UI:Delete:ConfirmDeletionOf_Name' => 'Suppression de %1$s',
|
||||
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Suppression de %1$d objets de type %2$s',
|
||||
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Devrait être supprimé automatiquement, mais vous n\'avez pas le droit d\'effectuer cette opération.',
|
||||
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Doit être supprimé manuellement - mais vous n\'avez pas le droit de supprimer cet objet, contactez votre administrateur pour régler ce problème',
|
||||
'UI:Delete:CannotDeleteBecause' => 'Ne peux pas être supprimé: %1$s',
|
||||
'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Devrait être supprimé automatiquement, mais cela n\'est pas possible: %1$s',
|
||||
'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Doit être supprimé manuellement, mais cela n\'est pas possible: %1$s',
|
||||
'UI:Delete:WillBeDeletedAutomatically' => 'Sera supprimé automatiquement',
|
||||
'UI:Delete:MustBeDeletedManually' => 'Doit être supprimé manuellement',
|
||||
'UI:Delete:CannotUpdateBecause_Issue' => 'Devrait être mis à jour automatiquement, mais: %1$s',
|
||||
'UI:Delete:WillAutomaticallyUpdate_Fields' => 'Va être mis à jour automatiquement (champs impactés : %1$s)',
|
||||
'UI:Delete:Count_Objects/LinksReferencing_Object' => '%1$d objets ou liens font référence à %2$s',
|
||||
'UI:Delete:Count_Objects/LinksReferencingTheObjects' => '%1$d objets ou liens font référence à certain des objets à supprimer',
|
||||
'UI:Delete:Count_Objects/LinksReferencingTheObjects' => '%1$d objets ou liens font référence à certain des objets à supprimer',
|
||||
'UI:Delete:ReferencesMustBeDeletedToEnsureIntegrity' => 'pour garantir l\'intégrité de la base de données, toutes les références doivent être supprimées.',
|
||||
'UI:Delete:Consequence+' => 'Ce qui va être effectué',
|
||||
'UI:Delete:SorryDeletionNotAllowed' => 'Désolé, vous n\'êtes pas autorisé à supprimer cette objet. Voir les explications détaillées ci-dessus.',
|
||||
@@ -661,9 +540,9 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:Search:Count_ObjectsOf_Class_Found' => 'Trouvé %1$d objet(s) de type %2$s.',
|
||||
'UI:Search:NoObjectFound' => 'Aucun objet trouvé.',
|
||||
'UI:ModificationPageTitle_Object_Class' => 'iTop - %2$s - Modification de %1$s',
|
||||
'UI:ModificationTitle_Class_Object' => '%1$s - Modification de <span class=\"hilite\">%2$s</span>',
|
||||
'UI:ModificationTitle_Class_Object' => '%1$s - Modification de <span class="hilite">%2$s</span>',
|
||||
'UI:ClonePageTitle_Object_Class' => 'iTop - %2$s - Duplication de %1$s',
|
||||
'UI:CloneTitle_Class_Object' => ' %1$s - Duplication de <span class=\"hilite\">%2$s</span>',
|
||||
'UI:CloneTitle_Class_Object' => ' %1$s - Duplication de <span class="hilite">%2$s</span>',
|
||||
'UI:CreationPageTitle_Class' => 'iTop - Création d\'un objet de type %1$s ',
|
||||
'UI:CreationTitle_Class' => 'Création d\'un objet de type %1$s',
|
||||
'UI:SelectTheTypeOf_Class_ToCreate' => 'Sélectionnez le type de %1$s à créer :',
|
||||
@@ -676,11 +555,10 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => '%1$s pour %2$s de l\'état %3$s vers l\'état %4$s.',
|
||||
'UI:ObjectCouldNotBeWritten' => 'L\'objet ne peut pas être enregistré: %1$s',
|
||||
'UI:PageTitle:FatalError' => 'iTop - Erreur Fatale',
|
||||
'UI:FatalErrorMessage' => 'Erreur fatale, iTop ne peut pas continuer.',
|
||||
'UI:SystemIntrusion' => 'Accès non autorisé. Vous êtes en train de d\'effectuer une opération qui ne vous est pas permise.',
|
||||
'UI:FatalErrorMessage' => 'Erreur fatale, iTop ne peut pas continuer.',
|
||||
'UI:Error_Details' => 'Erreur: %1$s.',
|
||||
|
||||
'UI:PageTitle:ClassProjections' => 'iTop gestion des utilisateurs - projections des classes',
|
||||
'UI:PageTitle:ClassProjections' => 'iTop gestion des utilisateurs - projections des classes',
|
||||
'UI:PageTitle:ProfileProjections' => 'iTop gestion des utilisateurs - projections des profils',
|
||||
'UI:UserManagement:Class' => 'Type',
|
||||
'UI:UserManagement:Class+' => 'Type des objets',
|
||||
@@ -717,16 +595,11 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:UserManagement:NoLifeCycleApplicable' => 'N/A',
|
||||
'UI:UserManagement:NoLifeCycleApplicable+' => 'Aucun cycle de vie n\'est défini pour ce type d\'objets.',
|
||||
'UI:UserManagement:GrantMatrix' => 'Matrice des droits',
|
||||
'UI:USerManagement:LinkBetween_User_And_Profile' => 'Lien entre %1$s et %2$s',
|
||||
'UI:USerManagement:LinkBetween_User_And_Org' => 'Lien entre %1$s et %2$s',
|
||||
|
||||
'UI:UserManagement:LinkBetween_User_And_Profile' => 'Lien entre %1$s et %2$s',
|
||||
'UI:UserManagement:LinkBetween_User_And_Org' => 'Lien entre %1$s et %2$s',
|
||||
'Menu:AdminTools' => 'Outils d\'admin',
|
||||
'Menu:AdminTools+' => 'Outils d\'administration',
|
||||
'Menu:AdminTools?' => 'Ces outils sont accessibles uniquement aux utilisateurs possédant le profil Administrateur.',
|
||||
|
||||
'UI:AuditMenu' => 'Audit',
|
||||
'UI:AuditMenu+' => 'Audit',
|
||||
|
||||
'UI:ChangeManagementMenu' => 'Gestion du Changement',
|
||||
'UI:ChangeManagementMenu+' => 'Gestion du Changement',
|
||||
'UI:ChangeManagementMenu:Title' => 'Résumé des changements',
|
||||
@@ -734,67 +607,48 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI-ChangeManagementMenu-ChangesByStatus' => 'Changements par état',
|
||||
'UI-ChangeManagementMenu-ChangesByWorkgroup' => 'Changements par workgroup',
|
||||
'UI-ChangeManagementMenu-ChangesNotYetAssigned' => 'Changements en attente d\'assignation',
|
||||
|
||||
'UI:ConfigurationItemsMenu'=> 'Actifs (CIs)',
|
||||
'UI:ConfigurationItemsMenu+'=> 'Tous les actifs',
|
||||
'UI:ConfigurationItemsMenu' => 'Actifs (CIs)',
|
||||
'UI:ConfigurationItemsMenu+' => 'Tous les actifs',
|
||||
'UI:ConfigurationItemsMenu:Title' => 'Résumé des actifs (CIs)',
|
||||
'UI-ConfigurationItemsMenu-ServersByCriticity' => 'Serveurs par criticité',
|
||||
'UI-ConfigurationItemsMenu-PCsByCriticity' => 'PCs par criticité',
|
||||
'UI-ConfigurationItemsMenu-NWDevicesByCriticity' => 'Equipements réseau par criticité',
|
||||
'UI-ConfigurationItemsMenu-ApplicationsByCriticity' => 'Applications par criticité',
|
||||
|
||||
'UI:ConfigurationManagementMenu' => 'Gestion de Configuration',
|
||||
'UI:ConfigurationManagementMenu+' => 'Gestion de Configuration',
|
||||
'UI:ConfigurationManagementMenu:Title' => 'Résumé de l\'Infrastructure',
|
||||
'UI-ConfigurationManagementMenu-InfraByType' => 'Nombre d\'éléments par type',
|
||||
'UI-ConfigurationManagementMenu-InfraByStatus' => 'Nombre d\'éléments par état',
|
||||
|
||||
'UI:ConfigMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion de Configuration',
|
||||
'UI-ConfigMgmtMenuOverview-FunctionalCIbyStatus' => 'Actifs par état',
|
||||
'UI-ConfigMgmtMenuOverview-FunctionalCIByType' => 'Actifs par type',
|
||||
|
||||
'UI:RequestMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Demandes Utilisateurs',
|
||||
'UI-RequestManagementOverview-RequestByService' => 'Demandes par service',
|
||||
'UI-RequestManagementOverview-RequestByPriority' => 'Demandes par priorité',
|
||||
'UI-RequestManagementOverview-RequestUnassigned' => 'Demandes non affectées à un agent',
|
||||
|
||||
'UI:IncidentMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Incidents',
|
||||
'UI-IncidentManagementOverview-IncidentByService' => 'Incidents par service',
|
||||
'UI-IncidentManagementOverview-IncidentByPriority' => 'Incidents par priorité',
|
||||
'UI-IncidentManagementOverview-IncidentUnassigned' => 'Incidents non affectés à un agent',
|
||||
|
||||
'UI:ChangeMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Changements',
|
||||
'UI-ChangeManagementOverview-ChangeByType' => 'Changes par type',
|
||||
'UI-ChangeManagementOverview-ChangeUnassigned' => 'Changes non affectés à un agent',
|
||||
'UI-ChangeManagementOverview-ChangeWithOutage' => 'Interruptions de service liées à un changement',
|
||||
|
||||
'UI:ServiceMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Services',
|
||||
'UI-ServiceManagementOverview-CustomerContractToRenew' => 'Contrats clients à renouveler dans les 30 jours',
|
||||
'UI-ServiceManagementOverview-ProviderContractToRenew' => 'Contrats fournisseurs à renouveler dans les 30 jours',
|
||||
|
||||
'UI:ConfigMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion de Configuration',
|
||||
'UI-ConfigMgmtMenuOverview-FunctionalCIbyStatus' => 'Actifs par état',
|
||||
'UI-ConfigMgmtMenuOverview-FunctionalCIByType' => 'Actifs par type',
|
||||
'UI:RequestMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Demandes Utilisateurs',
|
||||
'UI-RequestManagementOverview-RequestByService' => 'Demandes par service',
|
||||
'UI-RequestManagementOverview-RequestByPriority' => 'Demandes par priorité',
|
||||
'UI-RequestManagementOverview-RequestUnassigned' => 'Demandes non affectées à un agent',
|
||||
'UI:IncidentMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Incidents',
|
||||
'UI-IncidentManagementOverview-IncidentByService' => 'Incidents par service',
|
||||
'UI-IncidentManagementOverview-IncidentByPriority' => 'Incidents par priorité',
|
||||
'UI-IncidentManagementOverview-IncidentUnassigned' => 'Incidents non affectés à un agent',
|
||||
'UI:ChangeMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Changements',
|
||||
'UI-ChangeManagementOverview-ChangeByType' => 'Changes par type',
|
||||
'UI-ChangeManagementOverview-ChangeUnassigned' => 'Changes non affectés à un agent',
|
||||
'UI-ChangeManagementOverview-ChangeWithOutage' => 'Interruptions de service liées à un changement',
|
||||
'UI:ServiceMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Services',
|
||||
'UI-ServiceManagementOverview-CustomerContractToRenew' => 'Contrats clients à renouveler dans les 30 jours',
|
||||
'UI-ServiceManagementOverview-ProviderContractToRenew' => 'Contrats fournisseurs à renouveler dans les 30 jours',
|
||||
'UI:ContactsMenu' => 'Contacts',
|
||||
'UI:ContactsMenu+' => 'Contacts',
|
||||
'UI:ContactsMenu:Title' => 'Résumé des contacts',
|
||||
'UI-ContactsMenu-ContactsByLocation' => 'Contacts par emplacement',
|
||||
'UI-ContactsMenu-ContactsByType' => 'Contacts par type',
|
||||
'UI-ContactsMenu-ContactsByStatus' => 'Contacts par état',
|
||||
|
||||
|
||||
'Menu:CSVImportMenu' => 'Import CSV',
|
||||
'Menu:CSVImportMenu+' => 'Import ou mise à jour en masse',
|
||||
|
||||
'Menu:DataModelMenu' => 'Modèle de Données',
|
||||
'Menu:DataModelMenu+' => 'Résumé du Modèle de Données',
|
||||
|
||||
'Menu:ExportMenu' => 'Exportation',
|
||||
'Menu:ExportMenu+' => 'Exportation des résultats d\'une requête en HTML, CSV ou XML',
|
||||
|
||||
'UI:IncidentManagementMenu:Title' => 'Résumé des incidents',
|
||||
'UI-IncidentManagementMenu-IncidentsByType' => 'Incidents par type',
|
||||
'UI-IncidentManagementMenu-IncidentsByStatus' => 'Incidents par état',
|
||||
'UI-IncidentManagementMenu-IncidentsByWorkgroup' => 'Incidents par workgroup',
|
||||
'UI-IncidentManagementMenu-IncidentsNotYetAssigned' => 'Incidents en attente d\'assignation',
|
||||
|
||||
'Menu:NotificationsMenu' => 'Notifications',
|
||||
'Menu:NotificationsMenu+' => 'Configuration des Notifications',
|
||||
'UI:NotificationsMenu:Title' => 'Configuration des <span class="hilite">Notifications</span>',
|
||||
@@ -820,43 +674,36 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
|
||||
'UI:NotificationsMenu:OnStateLeave' => 'Quand un objet quitte un état donné',
|
||||
'UI:NotificationsMenu:Actions' => 'Actions',
|
||||
'UI:NotificationsMenu:AvailableActions' => 'Actions existantes',
|
||||
|
||||
'Menu:AuditCategories' => 'Catégories d\'audit',
|
||||
'Menu:AuditCategories+' => 'Catégories d\'audit',
|
||||
'Menu:Notifications:Title' => 'Catégories d\'audit',
|
||||
|
||||
'Menu:RunQueriesMenu' => 'Requêtes OQL',
|
||||
'Menu:RunQueriesMenu+' => 'Executer une requête OQL',
|
||||
|
||||
'Menu:DataAdministration' => 'Administration des données',
|
||||
'Menu:DataAdministration+' => 'Administration des données',
|
||||
|
||||
'Menu:UniversalSearchMenu' => 'Recherche Universelle',
|
||||
'Menu:UniversalSearchMenu+' => 'Rechercher n\'importe quel objet...',
|
||||
|
||||
'Menu:ApplicationLogMenu' => 'Application Log',
|
||||
'Menu:ApplicationLogMenu+' => 'Application Log',
|
||||
'Menu:ApplicationLogMenu:Title' => 'Application Log',
|
||||
|
||||
'Menu:UserManagementMenu' => 'Gestion des Utilisateurs',
|
||||
'Menu:UserManagementMenu+' => 'Gestion des Utilisateurs',
|
||||
|
||||
'Menu:ProfilesMenu' => 'Profils',
|
||||
'Menu:ProfilesMenu+' => 'Profils',
|
||||
'Menu:ProfilesMenu:Title' => 'Profils',
|
||||
|
||||
'Menu:UserAccountsMenu' => 'Comptes Utilisateur',
|
||||
'Menu:UserAccountsMenu+' => 'Comptes Utilisateur',
|
||||
'MenuUI:UserAccountsMenu:Title' => 'Comptes Utilisateur',
|
||||
|
||||
'Menu:UserAccountsMenu' => 'Comptes Utilisateurs',
|
||||
'Menu:UserAccountsMenu+' => 'Comptes Utilisateurs',
|
||||
'Menu:UserAccountsMenu:Title' => 'Comptes Utilisateusr',
|
||||
'UI:iTopVersion:Short' => 'iTop version %1$s',
|
||||
'UI:iTopVersion:Long' => 'iTop version %1$s-%2$s du %3$s',
|
||||
'UI:PropertiesTab' => 'Propriétés',
|
||||
|
||||
'UI:OpenDocumentInNewWindow_' => 'Ouvrir de document dans un autre fenêtre: %1$s',
|
||||
'UI:DownloadDocument_' => 'Télécharger ce document: %1$s',
|
||||
'UI:Document:NoPreview' => 'L\'aperçu n\'est pas disponible pour ce type de documents',
|
||||
'UI:DeadlineMissedBy_duration' => 'Passé de %1$s',
|
||||
'UI:Deadline_LessThan1Min' => '< 1 min',
|
||||
'UI:Deadline_Minutes' => '%1$d min',
|
||||
'UI:Deadline_Hours_Minutes' => '%1$dh %2$dmin',
|
||||
'UI:Deadline_LessThan1Min' => '< 1 min',
|
||||
'UI:Deadline_Minutes' => '%1$d min',
|
||||
'UI:Deadline_Hours_Minutes' => '%1$dh %2$dmin',
|
||||
'UI:Deadline_Days_Hours_Minutes' => '%1$dj %2$dh %3$dmin',
|
||||
'UI:Help' => 'Aide',
|
||||
'UI:PasswordConfirm' => '(Confirmer)',
|
||||
@@ -865,7 +712,6 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
|
||||
'UI:RelationshipGraph' => 'Vue graphique',
|
||||
'UI:RelationshipList' => 'Liste',
|
||||
'UI:OperationCancelled' => 'Opération Annulée',
|
||||
|
||||
'Portal:Title' => 'Portail utilisateur iTop',
|
||||
'Portal:Refresh' => 'Rafraîchir',
|
||||
'Portal:Back' => 'Retour',
|
||||
@@ -873,11 +719,11 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
|
||||
'Portal:ChangeMyPassword' => 'Changer mon mot de passe',
|
||||
'Portal:Disconnect' => 'Déconnexion',
|
||||
'Portal:OpenRequests' => 'Mes requêtes en cours',
|
||||
'Portal:ResolvedRequests' => 'Mes requêtes résolues',
|
||||
'Portal:ResolvedRequests' => 'Mes requêtes résolues',
|
||||
'Portal:SelectService' => 'Choisissez un service dans le catalogue:',
|
||||
'Portal:PleaseSelectOneService' => 'Veuillez choisir un service',
|
||||
'Portal:SelectSubcategoryFrom_Service' => 'Choisissez une sous-catégorie du service %1$s:',
|
||||
'Portal:PleaseSelectAServiceSubCategory' => 'Veuillez choisir une sous-catégorie',
|
||||
'Portal:PleaseSelectAServiceSubCategory' => 'Veuillez choisir une sous-catégorie',
|
||||
'Portal:DescriptionOfTheRequest' => 'Entrez la description de votre requête:',
|
||||
'Portal:TitleRequestDetailsFor_Request' => 'Détails de votre requête %1$s:',
|
||||
'Portal:NoOpenRequest' => 'Aucune requête.',
|
||||
@@ -888,8 +734,36 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
|
||||
'Portal:AddAttachment' => ' Ajouter une pièce jointe ',
|
||||
'Portal:RemoveAttachment' => ' Enlever la pièce jointe ',
|
||||
'Portal:Attachment_No_To_Ticket_Name' => 'Pièce jointe #%1$d à %2$s (%3$s)',
|
||||
|
||||
'Enum:Undefined' => 'Non défini',
|
||||
'UI:DurationForm_Days_Hours_Minutes_Seconds' => '%1$s J %2$s H %3$s min %4$s s',
|
||||
'UI:ModifyAllPageTitle' => 'Modification par lots',
|
||||
'UI:Modify_N_ObjectsOf_Class' => 'Modification de %1$d objet(s) de type %2$s',
|
||||
'UI:Modify_M_ObjectsOf_Class_OutOf_N' => 'Modification de %1$d (sur %3$d) objets de type %2$s',
|
||||
'UI:Menu:ModifyAll' => 'Modifier...',
|
||||
'UI:Button:ModifyAll' => 'Modifier',
|
||||
'UI:Button:PreviewModifications' => 'Aperçu des modifications >>',
|
||||
'UI:ModifiedObject' => 'Objet Modifié',
|
||||
'UI:BulkModifyStatus' => 'Opération',
|
||||
'UI:BulkModifyStatus+' => '',
|
||||
'UI:BulkModifyErrors' => 'Erreur',
|
||||
'UI:BulkModifyErrors+' => '',
|
||||
'UI:BulkModifyStatusOk' => 'Ok',
|
||||
'UI:BulkModifyStatusError' => 'Erreur',
|
||||
'UI:BulkModifyStatusModified' => 'Modifié',
|
||||
'UI:BulkModifyStatusSkipped' => 'Ignoré',
|
||||
'UI:BulkModify_Count_DistinctValues' => '%1$d valeurs distinctes:',
|
||||
'UI:BulkModify:Value_Exists_N_Times' => '%1$s, %2$d fois',
|
||||
'UI:BulkModify:N_MoreValues' => '%1$d valeurs supplémentaires...',
|
||||
'UI:AttemptingToSetAReadOnlyAttribute_Name' => 'Tentative de modification du champ en lecture seule: %1$s',
|
||||
'UI:FailedToApplyStimuli' => 'L\'action a échoué',
|
||||
'UI:StimulusModify_N_ObjectsOf_Class' => '%1$s: Modification de %2$d objet(s) de type %3$s',
|
||||
'UI:CaseLogTypeYourTextHere' => 'Nouvelle entrée ci-dessous:',
|
||||
'UI:CaseLog:DateFormat' => 'Y-m-d H:i:s',
|
||||
'UI:CaseLog:Header_Date_UserName' => '%1$s - %2$s:',
|
||||
'UI:CaseLog:InitialValue' => 'Valeur initiale:',
|
||||
'UI:AttemptingToSetASlaveAttribute_Name' => 'Le champ %1$s ne peut pas être modifié car il est géré par une synchronisation avec une source de données. Valeur ignorée.',
|
||||
'UI:ActionNotAllowed' => 'Vous n\'êtes pas autorisé à exécuter cette opération sur ces objets.',
|
||||
'UI:BulkAction:NoObjectSelected' => 'Veuillez s\électionner au moins un objet pour cette opération.',
|
||||
'UI:AttemptingToChangeASlaveAttribute_Name' => 'Le champ %1$s ne peut pas être modifié car il est géré par une synchronisation avec une source de données. Valeur inchangée.',
|
||||
));
|
||||
|
||||
?>
|
||||
|
||||
481
dictionaries/hu.dictionary.itop.core.php
Executable file
481
dictionaries/hu.dictionary.itop.core.php
Executable file
@@ -0,0 +1,481 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
|
||||
'Class:ActionEmail' => 'E-mail értesítés',
|
||||
'Class:ActionEmail+' => '',
|
||||
'Class:ActionEmail/Attribute:test_recipient' => 'Teszt címzett',
|
||||
'Class:ActionEmail/Attribute:test_recipient+' => '',
|
||||
'Class:ActionEmail/Attribute:from' => 'Feladó',
|
||||
'Class:ActionEmail/Attribute:from+' => '',
|
||||
'Class:ActionEmail/Attribute:reply_to' => 'Válasz',
|
||||
'Class:ActionEmail/Attribute:reply_to+' => '',
|
||||
'Class:ActionEmail/Attribute:to' => 'Címzett',
|
||||
'Class:ActionEmail/Attribute:to+' => '',
|
||||
'Class:ActionEmail/Attribute:cc' => 'Másolatot kap',
|
||||
'Class:ActionEmail/Attribute:cc+' => '',
|
||||
'Class:ActionEmail/Attribute:bcc' => 'Titkos másolatot kap',
|
||||
'Class:ActionEmail/Attribute:bcc+' => '',
|
||||
'Class:ActionEmail/Attribute:subject' => 'Tárgy',
|
||||
'Class:ActionEmail/Attribute:subject+' => '',
|
||||
'Class:ActionEmail/Attribute:body' => 'Szöveg',
|
||||
'Class:ActionEmail/Attribute:body+' => '',
|
||||
'Class:ActionEmail/Attribute:importance' => 'Fontosság',
|
||||
'Class:ActionEmail/Attribute:importance+' => '',
|
||||
'Class:ActionEmail/Attribute:importance/Value:high' => 'Fontos',
|
||||
'Class:ActionEmail/Attribute:importance/Value:high+' => '',
|
||||
'Class:ActionEmail/Attribute:importance/Value:low' => 'Nem fontos',
|
||||
'Class:ActionEmail/Attribute:importance/Value:low+' => '',
|
||||
'Class:ActionEmail/Attribute:importance/Value:normal' => 'Normál',
|
||||
'Class:ActionEmail/Attribute:importance/Value:normal+' => '',
|
||||
'Class:TriggerOnStateEnter' => 'Kiváltó ok (állapotba belépés)',
|
||||
'Class:TriggerOnStateEnter+' => '',
|
||||
'Class:TriggerOnStateLeave' => 'Kiváltó ok (állapot elhagyás)',
|
||||
'Class:TriggerOnStateLeave+' => '',
|
||||
'Class:TriggerOnObjectCreate' => 'Kiváltó ok (objektum létrehozás)',
|
||||
'Class:TriggerOnObjectCreate+' => '',
|
||||
'Class:lnkTriggerAction' => 'Akció / Kiváltó ok',
|
||||
'Class:lnkTriggerAction+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:action_id' => 'Akció',
|
||||
'Class:lnkTriggerAction/Attribute:action_id+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_id' => 'Kiváltó ok',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:order' => 'Sorrend',
|
||||
'Class:lnkTriggerAction/Attribute:order+' => '',
|
||||
'Class:AsyncSendEmail' => 'E-mail (aszinkron)',
|
||||
'Class:AsyncSendEmail/Attribute:to' => 'Címzett',
|
||||
'Class:AsyncSendEmail/Attribute:subject' => 'Tárgy',
|
||||
'Class:AsyncSendEmail/Attribute:body' => 'Szöveg',
|
||||
'Class:AsyncSendEmail/Attribute:header' => 'Fejléc',
|
||||
'Class:CMDBChange' => 'Változás',
|
||||
'Class:CMDBChange+' => '',
|
||||
'Class:CMDBChange/Attribute:date' => 'Dátum',
|
||||
'Class:CMDBChange/Attribute:date+' => '',
|
||||
'Class:CMDBChange/Attribute:userinfo' => 'Egyéb információ',
|
||||
'Class:CMDBChange/Attribute:userinfo+' => '',
|
||||
'Class:CMDBChangeOp' => 'Változtatás művelet',
|
||||
'Class:CMDBChangeOp+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:change' => 'Válktozás',
|
||||
'Class:CMDBChangeOp/Attribute:change+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:objclass' => 'Objektum osztály',
|
||||
'Class:CMDBChangeOp/Attribute:objclass+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:objkey' => 'Objektum azonosító',
|
||||
'Class:CMDBChangeOp/Attribute:objkey+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:finalclass' => 'Típus',
|
||||
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
|
||||
'Class:CMDBChangeOpCreate' => 'Objektum létrehozás',
|
||||
'Class:CMDBChangeOpCreate+' => '',
|
||||
'Class:CMDBChangeOpDelete' => 'Objektum törlés',
|
||||
'Class:CMDBChangeOpDelete+' => '',
|
||||
'Class:CMDBChangeOpSetAttribute' => 'Objektum változtatás',
|
||||
'Class:CMDBChangeOpSetAttribute+' => '',
|
||||
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => 'Attribútum',
|
||||
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeScalar' => 'Tulajdonság változtatás',
|
||||
'Class:CMDBChangeOpSetAttributeScalar+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'Előző érték',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'Új érték',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeBlob' => 'Módosítás dátuma',
|
||||
'Class:CMDBChangeOpSetAttributeBlob+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'Előző adat',
|
||||
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Titkosított jelszó',
|
||||
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Előző érték',
|
||||
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Titkosított mező',
|
||||
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Előző érték',
|
||||
'Class:CMDBChangeOpSetAttributeText' => 'Szöveg változás',
|
||||
'Class:CMDBChangeOpSetAttributeText+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Előző adat',
|
||||
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Esemény napló',
|
||||
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Utolsó bejegyzés',
|
||||
'Class:Event' => 'Napló esemény',
|
||||
'Class:Event+' => '',
|
||||
'Class:Event/Attribute:message' => 'Üzenet',
|
||||
'Class:Event/Attribute:message+' => '',
|
||||
'Class:Event/Attribute:date' => 'Dátum',
|
||||
'Class:Event/Attribute:date+' => '',
|
||||
'Class:Event/Attribute:userinfo' => 'Felhasználói információ',
|
||||
'Class:Event/Attribute:userinfo+' => '',
|
||||
'Class:Event/Attribute:finalclass' => 'Típus',
|
||||
'Class:Event/Attribute:finalclass+' => '',
|
||||
'Class:EventNotification' => 'Értesítés esemény',
|
||||
'Class:EventNotification+' => '',
|
||||
'Class:EventNotification/Attribute:trigger_id' => 'Kiváltó ok',
|
||||
'Class:EventNotification/Attribute:trigger_id+' => '',
|
||||
'Class:EventNotification/Attribute:action_id' => 'Felhasználó',
|
||||
'Class:EventNotification/Attribute:action_id+' => '',
|
||||
'Class:EventNotification/Attribute:object_id' => 'Objektum azonosító',
|
||||
'Class:EventNotification/Attribute:object_id+' => '',
|
||||
'Class:EventNotificationEmail' => 'E-mail küldés esemény',
|
||||
'Class:EventNotificationEmail+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:to' => 'Címzett',
|
||||
'Class:EventNotificationEmail/Attribute:to+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:cc' => 'Másolatot kap',
|
||||
'Class:EventNotificationEmail/Attribute:cc+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:bcc' => 'Titkos másolatot kap',
|
||||
'Class:EventNotificationEmail/Attribute:bcc+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:from' => 'Feladó',
|
||||
'Class:EventNotificationEmail/Attribute:from+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:subject' => 'Tárgy',
|
||||
'Class:EventNotificationEmail/Attribute:subject+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:body' => 'Szöveg',
|
||||
'Class:EventNotificationEmail/Attribute:body+' => '',
|
||||
'Class:EventIssue' => 'Kérés esemény',
|
||||
'Class:EventIssue+' => '',
|
||||
'Class:EventIssue/Attribute:issue' => 'Kérés',
|
||||
'Class:EventIssue/Attribute:issue+' => '',
|
||||
'Class:EventIssue/Attribute:impact' => 'Hatás',
|
||||
'Class:EventIssue/Attribute:impact+' => '',
|
||||
'Class:EventIssue/Attribute:page' => 'Oldal',
|
||||
'Class:EventIssue/Attribute:page+' => '',
|
||||
'Class:EventIssue/Attribute:arguments_post' => 'Kérés részletei',
|
||||
'Class:EventIssue/Attribute:arguments_post+' => '',
|
||||
'Class:EventIssue/Attribute:arguments_get' => 'URL ',
|
||||
'Class:EventIssue/Attribute:arguments_get+' => '',
|
||||
'Class:EventIssue/Attribute:callstack' => 'Híváslista',
|
||||
'Class:EventIssue/Attribute:callstack+' => '',
|
||||
'Class:EventIssue/Attribute:data' => 'Dátum',
|
||||
'Class:EventIssue/Attribute:data+' => '',
|
||||
'Class:EventWebService' => 'Web szolgáltatás esemény',
|
||||
'Class:EventWebService+' => '',
|
||||
'Class:EventWebService/Attribute:verb' => 'Kérés',
|
||||
'Class:EventWebService/Attribute:verb+' => '',
|
||||
'Class:EventWebService/Attribute:result' => 'Eredmény',
|
||||
'Class:EventWebService/Attribute:result+' => '',
|
||||
'Class:EventWebService/Attribute:log_info' => 'Info napló',
|
||||
'Class:EventWebService/Attribute:log_info+' => '',
|
||||
'Class:EventWebService/Attribute:log_warning' => 'Warning napló',
|
||||
'Class:EventWebService/Attribute:log_warning+' => '',
|
||||
'Class:EventWebService/Attribute:log_error' => 'Error napló',
|
||||
'Class:EventWebService/Attribute:log_error+' => '',
|
||||
'Class:EventWebService/Attribute:data' => 'Adat',
|
||||
'Class:EventWebService/Attribute:data+' => '',
|
||||
'Class:EventLoginUsage' => 'Belépés esemény',
|
||||
'Class:EventLoginUsage+' => '',
|
||||
'Class:EventLoginUsage/Attribute:user_id' => 'Felhasználó név',
|
||||
'Class:EventLoginUsage/Attribute:user_id+' => '',
|
||||
'Class:SynchroDataSource' => 'Szinkron adatforrás',
|
||||
'Class:SynchroDataSource/Attribute:name' => 'Neve',
|
||||
'Class:SynchroDataSource/Attribute:name+' => '',
|
||||
'Class:SynchroDataSource/Attribute:description' => 'Leírás',
|
||||
'Class:SynchroDataSource/Attribute:status' => 'Státusz',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Megvalósított',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Elavult',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Éles üzemben',
|
||||
'Class:SynchroDataSource/Attribute:user_id' => 'Felhasználó',
|
||||
'Class:SynchroDataSource/Attribute:scope_class' => 'Cél osztály',
|
||||
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Tartalom szűkítés',
|
||||
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Teljesen feltöltött intervallum',
|
||||
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => '',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Egyeztetési szabály',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'A következő attribútum használata',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Elsődleges kulcs használata',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Action on zero',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Létrehozás',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Hiba',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one' => 'Action on one',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Hiba',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Firssítés',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Action on many',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Létrehozás',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Hiba',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Take the first one (véletlen?)',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy' => 'Törlési szabály',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Törlés',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Figyelmen kívül hagyás',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Frissítés',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Frissítés után törlés',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Szabályok frissítése',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_update+' => '',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Késleltetés időtartama',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => '',
|
||||
'Class:SynchroDataSource/Attribute:attribute_list' => 'Attribútum lista',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'Engedélyezett felhasználók',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy+' => '',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Csak rendszergazdák',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Mindenkinek engedélyezett az objektumok törlése',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Senki',
|
||||
'Class:SynchroDataSource/Attribute:url_icon' => 'Ikonok URL-je',
|
||||
'Class:SynchroDataSource/Attribute:url_icon+' => '',
|
||||
'Class:SynchroDataSource/Attribute:url_application' => 'Alkalmazások URL-je',
|
||||
'Class:SynchroDataSource/Attribute:url_application+' => '',
|
||||
'Class:SynchroAttribute' => 'Szinkron attribútumok',
|
||||
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Szinkron adatforrás',
|
||||
'Class:SynchroAttribute/Attribute:attcode' => 'Kód',
|
||||
'Class:SynchroAttribute/Attribute:update' => 'Frissítés',
|
||||
'Class:SynchroAttribute/Attribute:reconcile' => 'Egyeztetés',
|
||||
'Class:SynchroAttribute/Attribute:update_policy' => 'Frissítési irányelv',
|
||||
'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' => 'Inicializálás ha üres',
|
||||
'Class:SynchroAttribute/Attribute:finalclass' => 'Osztály',
|
||||
'Class:SynchroAttExtKey' => 'Szinkron attribútum (ExtKey)',
|
||||
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Egyeztetés attribútuma',
|
||||
'Class:SynchroAttLinkSet' => 'Szinkron attribútum (Linkset)',
|
||||
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Sor elválasztó',
|
||||
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Attribútum elválasztó',
|
||||
'Class:SynchroLog' => 'Szinkron napló',
|
||||
'Class:SynchroLog/Attribute:sync_source_id' => 'Szinkron adatforrás',
|
||||
'Class:SynchroLog/Attribute:start_date' => 'Kezdés dátuma',
|
||||
'Class:SynchroLog/Attribute:end_date' => 'Befejezés dátuma',
|
||||
'Class:SynchroLog/Attribute:status' => 'Státusz',
|
||||
'Class:SynchroLog/Attribute:status/Value:completed' => 'Hibátlanul lefutott',
|
||||
'Class:SynchroLog/Attribute:status/Value:error' => 'Hibás',
|
||||
'Class:SynchroLog/Attribute:status/Value:running' => 'Még fut',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nb replikáció létrejött',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nb replikáció összesen',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nb objektumok törölve',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nb hibái törlés közben',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nb objketumok elavultak',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nb hibák elavulás közben',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nb objketumok létrehozva',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nb hibák létrehozás közben',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nb objektum frissítve',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nb hibák firssítés közben',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nb hibák rekonsziliálás közben',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nb replikáció eltűnt',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nb objketumok frissítve',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nb objketumok változatlanok',
|
||||
'Class:SynchroLog/Attribute:last_error' => 'Utolsó hiba',
|
||||
'Class:SynchroLog/Attribute:traces' => 'Trace',
|
||||
'Class:SynchroReplica' => 'Szinkron másolat',
|
||||
'Class:SynchroReplica/Attribute:sync_source_id' => 'Szinkron adatforrás',
|
||||
'Class:SynchroReplica/Attribute:dest_id' => 'Cél objektum azonosító',
|
||||
'Class:SynchroReplica/Attribute:dest_class' => 'Cél típusa',
|
||||
'Class:SynchroReplica/Attribute:status_last_seen' => 'Utolsó megtekintett',
|
||||
'Class:SynchroReplica/Attribute:status' => 'Státusz',
|
||||
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Módosított',
|
||||
'Class:SynchroReplica/Attribute:status/Value:new' => 'Új',
|
||||
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Elavult',
|
||||
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Árva',
|
||||
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Szinkronizált',
|
||||
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Objektum létrehozott?',
|
||||
'Class:SynchroReplica/Attribute:status_last_error' => 'Utolsó hiba',
|
||||
'Class:SynchroReplica/Attribute:info_creation_date' => 'Létrehozás dátuma',
|
||||
'Class:SynchroReplica/Attribute:info_last_modified' => 'Utolsó módosítás dátuma',
|
||||
'Class:appUserPreferences' => 'Felhasználói beállítások',
|
||||
'Class:appUserPreferences/Attribute:userid' => 'Felhasználó',
|
||||
'Class:appUserPreferences/Attribute:preferences' => 'Beállítások',
|
||||
'Core:AttributeLinkedSet' => 'Objektum tömbök',
|
||||
'Core:AttributeLinkedSet+' => '',
|
||||
'Core:AttributeLinkedSetIndirect' => 'Objektum tömbök (N-N)',
|
||||
'Core:AttributeLinkedSetIndirect+' => '',
|
||||
'Core:AttributeInteger' => 'Integer',
|
||||
'Core:AttributeInteger+' => '',
|
||||
'Core:AttributeDecimal' => 'Decimal',
|
||||
'Core:AttributeDecimal+' => '',
|
||||
'Core:AttributeBoolean' => 'Boolean',
|
||||
'Core:AttributeBoolean+' => '',
|
||||
'Core:AttributeString' => 'String',
|
||||
'Core:AttributeString+' => '',
|
||||
'Core:AttributeClass' => 'Class',
|
||||
'Core:AttributeClass+' => '',
|
||||
'Core:AttributeApplicationLanguage' => 'Alkalmazás nyelve',
|
||||
'Core:AttributeApplicationLanguage+' => '',
|
||||
'Core:AttributeFinalClass' => 'Class (auto)',
|
||||
'Core:AttributeFinalClass+' => '',
|
||||
'Core:AttributePassword' => 'Jelszó',
|
||||
'Core:AttributePassword+' => '',
|
||||
'Core:AttributeEncryptedString' => 'Encrypted string',
|
||||
'Core:AttributeEncryptedString+' => '',
|
||||
'Core:AttributeText' => 'Text',
|
||||
'Core:AttributeText+' => '',
|
||||
'Core:AttributeHTML' => 'HTML',
|
||||
'Core:AttributeHTML+' => '',
|
||||
'Core:AttributeEmailAddress' => 'E-mail cím',
|
||||
'Core:AttributeEmailAddress+' => '',
|
||||
'Core:AttributeIPAddress' => 'IP cím',
|
||||
'Core:AttributeIPAddress+' => '',
|
||||
'Core:AttributeOQL' => 'OQL',
|
||||
'Core:AttributeOQL+' => '',
|
||||
'Core:AttributeEnum' => 'Enum',
|
||||
'Core:AttributeEnum+' => '',
|
||||
'Core:AttributeTemplateString' => 'Sablon szöveg',
|
||||
'Core:AttributeTemplateString+' => '',
|
||||
'Core:AttributeTemplateText' => 'Sablon szöveg',
|
||||
'Core:AttributeTemplateText+' => '',
|
||||
'Core:AttributeTemplateHTML' => 'Sablon HTML',
|
||||
'Core:AttributeTemplateHTML+' => '',
|
||||
'Core:AttributeDateTime' => 'Date/time',
|
||||
'Core:AttributeDateTime+' => '',
|
||||
'Core:AttributeDate' => 'Date',
|
||||
'Core:AttributeDate+' => '',
|
||||
'Core:AttributeDeadline' => 'Határidő',
|
||||
'Core:AttributeDeadline+' => '',
|
||||
'Core:AttributeExternalKey' => 'Külső kulcs',
|
||||
'Core:AttributeExternalKey+' => '',
|
||||
'Core:AttributeExternalField' => 'Külső mező',
|
||||
'Core:AttributeExternalField+' => '',
|
||||
'Core:AttributeURL' => 'URL',
|
||||
'Core:AttributeURL+' => '',
|
||||
'Core:AttributeBlob' => 'Blob',
|
||||
'Core:AttributeBlob+' => '',
|
||||
'Core:AttributeOneWayPassword' => 'One way password',
|
||||
'Core:AttributeOneWayPassword+' => '',
|
||||
'Core:AttributeTable' => 'Table',
|
||||
'Core:AttributeTable+' => '',
|
||||
'Core:AttributePropertySet' => 'Tulajdonságok',
|
||||
'Core:AttributePropertySet+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:date' => 'Dátum',
|
||||
'Class:CMDBChangeOp/Attribute:date+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:userinfo' => 'Felhasználó',
|
||||
'Class:CMDBChangeOp/Attribute:userinfo+' => '',
|
||||
'Change:ObjectCreated' => 'Objektum létrehozva',
|
||||
'Change:ObjectDeleted' => 'Objektum törölve',
|
||||
'Change:ObjectModified' => 'Objektum módosítva',
|
||||
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s új értéke: %2$s (előző értéke: %3$s)',
|
||||
'Change:AttName_SetTo' => '%1$s új értéke %2$s',
|
||||
'Change:Text_AppendedTo_AttName' => '%1$s hozzáfűzve %2$s',
|
||||
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s módosítva, előző érték: %2$s',
|
||||
'Change:AttName_Changed' => '%1$s módosítva',
|
||||
'Change:AttName_EntryAdded' => '%1$s módosítva, új bejegyzés hozzáadva.',
|
||||
'Class:EventLoginUsage/Attribute:contact_name' => 'Felhasználó neve',
|
||||
'Class:EventLoginUsage/Attribute:contact_name+' => '',
|
||||
'Class:EventLoginUsage/Attribute:contact_email' => 'Felhasználó e-mail',
|
||||
'Class:EventLoginUsage/Attribute:contact_email+' => '',
|
||||
'Class:Action' => 'Egyedi akciók',
|
||||
'Class:Action+' => '',
|
||||
'Class:Action/Attribute:name' => 'Neve',
|
||||
'Class:Action/Attribute:name+' => '',
|
||||
'Class:Action/Attribute:description' => 'Leírás',
|
||||
'Class:Action/Attribute:description+' => '',
|
||||
'Class:Action/Attribute:status' => 'Státusz',
|
||||
'Class:Action/Attribute:status+' => '',
|
||||
'Class:Action/Attribute:status/Value:test' => 'Tesztelés alatt',
|
||||
'Class:Action/Attribute:status/Value:test+' => '',
|
||||
'Class:Action/Attribute:status/Value:enabled' => 'Éles üzemeben',
|
||||
'Class:Action/Attribute:status/Value:enabled+' => '',
|
||||
'Class:Action/Attribute:status/Value:disabled' => 'Inaktív',
|
||||
'Class:Action/Attribute:status/Value:disabled+' => '',
|
||||
'Class:Action/Attribute:trigger_list' => 'Kapcsolódó kiváltó okok',
|
||||
'Class:Action/Attribute:trigger_list+' => '',
|
||||
'Class:Action/Attribute:finalclass' => 'Típus',
|
||||
'Class:Action/Attribute:finalclass+' => '',
|
||||
'Class:ActionNotification' => 'Értesítés',
|
||||
'Class:ActionNotification+' => '',
|
||||
'Class:Trigger' => 'Kiváltó ok',
|
||||
'Class:Trigger+' => '',
|
||||
'Class:Trigger/Attribute:description' => 'Leírás',
|
||||
'Class:Trigger/Attribute:description+' => '',
|
||||
'Class:Trigger/Attribute:action_list' => 'Kiváltott akció',
|
||||
'Class:Trigger/Attribute:action_list+' => '',
|
||||
'Class:Trigger/Attribute:finalclass' => 'Típus',
|
||||
'Class:Trigger/Attribute:finalclass+' => '',
|
||||
'Class:TriggerOnObject' => 'Kiváltó ok (osztály függő)',
|
||||
'Class:TriggerOnObject+' => '',
|
||||
'Class:TriggerOnObject/Attribute:target_class' => 'Cél osztály',
|
||||
'Class:TriggerOnObject/Attribute:target_class+' => '',
|
||||
'Class:TriggerOnStateChange' => 'Kiváltó ok (állapot változás)',
|
||||
'Class:TriggerOnStateChange+' => '',
|
||||
'Class:TriggerOnStateChange/Attribute:state' => 'Állapot',
|
||||
'Class:TriggerOnStateChange/Attribute:state+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:action_name' => 'Akció',
|
||||
'Class:lnkTriggerAction/Attribute:action_name+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_name' => 'Kiváltó ok',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Senki',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Csak adminisztrátorok',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'Tíltott felhasználók',
|
||||
'SynchroDataSource:Description' => 'Leírás',
|
||||
'SynchroDataSource:Reconciliation' => 'Keresés & rekponsziliálás',
|
||||
'SynchroDataSource:Deletion' => 'Törlés szabályai',
|
||||
'SynchroDataSource:Status' => 'Státusz',
|
||||
'SynchroDataSource:Information' => 'Információ',
|
||||
'SynchroDataSource:Definition' => 'Meghatározás',
|
||||
'Core:SynchroAttributes' => 'Attribútumok',
|
||||
'Core:SynchroStatus' => 'Státusz',
|
||||
'Core:Synchro:ErrorsLabel' => 'Hibák',
|
||||
'Core:Synchro:CreatedLabel' => 'Létrehozva',
|
||||
'Core:Synchro:ModifiedLabel' => 'Módosítva',
|
||||
'Core:Synchro:UnchangedLabel' => 'Változatlan',
|
||||
'Core:Synchro:ReconciledErrorsLabel' => 'Hibák',
|
||||
'Core:Synchro:ReconciledLabel' => 'Rekonsziliált',
|
||||
'Core:Synchro:ReconciledNewLabel' => 'Létrehozva',
|
||||
'Core:SynchroReconcile:Yes' => 'Igen',
|
||||
'Core:SynchroReconcile:No' => 'Nem',
|
||||
'Core:SynchroUpdate:Yes' => 'Igen',
|
||||
'Core:SynchroUpdate:No' => 'Nem',
|
||||
'Core:Synchro:LastestStatus' => 'Utolsó státusz',
|
||||
'Core:Synchro:History' => 'Szinkronizáció történet',
|
||||
'Core:Synchro:NeverRun' => 'Ez a szinkronizáció még soha nem futott. Nincs még napló bejegyzés.',
|
||||
'Core:Synchro:SynchroEndedOn_Date' => 'Az utolsó szinkronizáció lefutásának időpontja: %1$s.',
|
||||
'Core:Synchro:SynchroRunningStartedOn_Date' => 'Az szinkronizáció elindut $1$s, de még fut.',
|
||||
'Menu:DataSources' => 'Szinkronizált adatforrások',
|
||||
'Menu:DataSources+' => '',
|
||||
'Core:Synchro:label_repl_ignored' => 'Figyelmen kívül hagyott (%1$s)',
|
||||
'Core:Synchro:label_repl_disappeared' => 'Elveszett (%1$s)',
|
||||
'Core:Synchro:label_repl_existing' => 'Létező (%1$s)',
|
||||
'Core:Synchro:label_repl_new' => 'Új (%1$s)',
|
||||
'Core:Synchro:label_obj_deleted' => 'Törölt (%1$s)',
|
||||
'Core:Synchro:label_obj_obsoleted' => 'Elavult (%1$s)',
|
||||
'Core:Synchro:label_obj_disappeared_errors' => 'Hibák (%1$s)',
|
||||
'Core:Synchro:label_obj_disappeared_no_action' => 'Beavatkozás nem szükséges (%1$s)',
|
||||
'Core:Synchro:label_obj_unchanged' => 'Változatan (%1$s)',
|
||||
'Core:Synchro:label_obj_updated' => 'Frisített (%1$s)',
|
||||
'Core:Synchro:label_obj_updated_errors' => 'Hibák (%1$s)',
|
||||
'Core:Synchro:label_obj_new_unchanged' => 'Változatlan (%1$s)',
|
||||
'Core:Synchro:label_obj_new_updated' => 'Frissített (%1$s)',
|
||||
'Core:Synchro:label_obj_created' => 'Létrehozott (%1$s)',
|
||||
'Core:Synchro:label_obj_new_errors' => 'Hibák (%1$s)',
|
||||
'Core:SynchroLogTitle' => '%1$s - %2$s',
|
||||
'Core:Synchro:Nb_Replica' => 'Másolat elkészítve: %1$s',
|
||||
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
|
||||
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Egyeztetéshez legalább egy kulcsot meg kell adni, egyébként az egyeztetés az elsődleges kulcs alapján történik.',
|
||||
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'A törlés késleltetésének időtartamát meg kell adni, egyébként az objektum törölve lesz annak elavulttá minősítése után.',
|
||||
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Lejárt objektumok frissítése nem tud megtörténni.',
|
||||
'Core:SynchroReplica:PublicData' => 'Publikus adatok',
|
||||
'Core:SynchroReplica:PrivateDetails' => 'Privát adatok',
|
||||
'Core:SynchroReplica:BackToDataSource' => 'Vissza a következő szinkron adatforráshoz: %1$s',
|
||||
'Core:SynchroReplica:ListOfReplicas' => 'Másolatok listája',
|
||||
'Core:SynchroAttExtKey:ReconciliationById' => 'Azonosító (Elsődleges kulcs)',
|
||||
'Core:SynchroAtt:attcode' => 'Attribútum',
|
||||
'Core:SynchroAtt:attcode+' => '',
|
||||
'Core:SynchroAtt:reconciliation' => 'Egyeztetés?',
|
||||
'Core:SynchroAtt:reconciliation+' => '',
|
||||
'Core:SynchroAtt:update' => 'Frissített?',
|
||||
'Core:SynchroAtt:update+' => '',
|
||||
'Core:SynchroAtt:update_policy' => 'Frissítési szabály',
|
||||
'Core:SynchroAtt:update_policy+' => '',
|
||||
'Core:SynchroAtt:reconciliation_attcode' => 'Egyeztetés kulcsa',
|
||||
'Core:SynchroAtt:reconciliation_attcode+' => '',
|
||||
'Core:SyncDataExchangeComment' => '(DataExchange)',
|
||||
'Core:Synchro:ListOfDataSources' => 'Adatforrások listája',
|
||||
'Core:Synchro:LastSynchro' => 'Utolsó szimkronizáció',
|
||||
'Core:Synchro:ThisObjectIsSynchronized' => 'Az objektum szinkronizálva a külső adatforrással.',
|
||||
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'Objektum <b>létrehozva</b> a következő adatforrásban: %1$s',
|
||||
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'Objektum <b>törölhető</b> a következő külső adatforrásból: %1$s',
|
||||
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => '<b>Objektum nem törölhető</b> mert egy másik adatforrás (%1$s) tulajdona',
|
||||
'TitleSynchroExecution' => 'Szinkronizáció végrehajtás',
|
||||
'Class:SynchroDataSource:DataTable' => 'Adatbázis tábla: %1$s',
|
||||
'Core:SyncDataSourceObsolete' => 'Az adatforrás elvalultnak van jelölve. Művelet visszavonva.',
|
||||
'Core:SyncDataSourceAccessRestriction' => 'Csak az adminisztrátor vagy speciális jogokkal rendelkező felhasználó futtathatja a műveletet. Művelet visszavonva.',
|
||||
'Core:SyncTooManyMissingReplicas' => 'Import során az összes másolat elveszett. Az import valóban lefutott? Művelet visszavonva.',
|
||||
'Core:Duration_Seconds' => '%1$sds',
|
||||
'Core:Duration_Minutes_Seconds' => '%1$sdmin %2$sds',
|
||||
'Core:Duration_Hours_Minutes_Seconds' => '%1$sdh %2$sdmin %3$sds',
|
||||
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sd %2$sdh %3$sdmin %4$ds',
|
||||
));
|
||||
?>
|
||||
768
dictionaries/hu.dictionary.itop.ui.php
Executable file
768
dictionaries/hu.dictionary.itop.ui.php
Executable file
@@ -0,0 +1,768 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
|
||||
'Class:AuditRule' => 'Auditálási szabály',
|
||||
'Class:AuditRule+' => '',
|
||||
'Class:AuditRule/Attribute:name' => 'Szabály neve',
|
||||
'Class:AuditRule/Attribute:name+' => '',
|
||||
'Class:AuditRule/Attribute:description' => 'Auditálási szabály leírása',
|
||||
'Class:AuditRule/Attribute:description+' => '',
|
||||
'Class:AuditRule/Attribute:query' => 'Futtatandó lekérdezés',
|
||||
'Class:AuditRule/Attribute:query+' => '',
|
||||
'Class:AuditRule/Attribute:valid_flag' => 'Érvényes objektum?',
|
||||
'Class:AuditRule/Attribute:valid_flag+' => '',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:false' => 'hamis',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:false+' => '',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:true' => 'igaz',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:true+' => '',
|
||||
'Class:AuditRule/Attribute:category_id' => 'Kategória',
|
||||
'Class:AuditRule/Attribute:category_id+' => '',
|
||||
'Class:AuditCategory' => 'Audit kategória',
|
||||
'Class:AuditCategory+' => '',
|
||||
'Class:AuditCategory/Attribute:name' => 'Kategória neve',
|
||||
'Class:AuditCategory/Attribute:name+' => '',
|
||||
'Class:AuditCategory/Attribute:description' => 'Audit kategória leírása',
|
||||
'Class:AuditCategory/Attribute:description+' => '',
|
||||
'Class:AuditCategory/Attribute:definition_set' => 'Meghatározás halmaz',
|
||||
'Class:AuditCategory/Attribute:definition_set+' => '',
|
||||
'Class:AuditCategory/Attribute:rules_list' => 'Audit szabályok',
|
||||
'Class:AuditCategory/Attribute:rules_list+' => '',
|
||||
'Class:URP_Profiles' => 'Profil',
|
||||
'Class:URP_Profiles+' => '',
|
||||
'Class:URP_Profiles/Attribute:name' => 'Neve',
|
||||
'Class:URP_Profiles/Attribute:name+' => '',
|
||||
'Class:URP_Profiles/Attribute:description' => 'Leírás',
|
||||
'Class:URP_Profiles/Attribute:description+' => '',
|
||||
'Class:URP_Profiles/Attribute:user_list' => 'Felhasználók',
|
||||
'Class:URP_Profiles/Attribute:user_list+' => '',
|
||||
'Class:URP_UserProfile' => 'Profilhoz rendelt felhasználók',
|
||||
'Class:URP_UserProfile+' => '',
|
||||
'Class:URP_UserProfile/Attribute:userid' => 'Felhasználó',
|
||||
'Class:URP_UserProfile/Attribute:userid+' => '',
|
||||
'Class:URP_UserProfile/Attribute:profileid' => 'Profil',
|
||||
'Class:URP_UserProfile/Attribute:profileid+' => '',
|
||||
'Class:URP_UserProfile/Attribute:reason' => 'Ok',
|
||||
'Class:URP_UserProfile/Attribute:reason+' => '',
|
||||
'Class:URP_UserOrg' => 'Felhasználó szervezeti egysége',
|
||||
'Class:URP_UserOrg+' => '',
|
||||
'Class:URP_UserOrg/Attribute:userid' => 'Felhasználó',
|
||||
'Class:URP_UserOrg/Attribute:userid+' => '',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_id' => 'Szervezeti egység',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_id+' => '',
|
||||
'Class:URP_UserOrg/Attribute:reason' => 'Ok',
|
||||
'Class:URP_UserOrg/Attribute:reason+' => '',
|
||||
'Class:URP_ActionGrant' => 'action_permission',
|
||||
'Class:URP_ActionGrant+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:profileid' => 'Profil',
|
||||
'Class:URP_ActionGrant/Attribute:profileid+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:class' => 'Osztály',
|
||||
'Class:URP_ActionGrant/Attribute:class+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:permission' => 'Hozzáférés',
|
||||
'Class:URP_ActionGrant/Attribute:permission+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:no' => 'Nem',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:no+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:yes' => 'Igen',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:yes+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:action' => 'Akció',
|
||||
'Class:URP_ActionGrant/Attribute:action+' => '',
|
||||
'Class:URP_StimulusGrant' => 'stimulus_permission',
|
||||
'Class:URP_StimulusGrant+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:profileid' => 'Profil',
|
||||
'Class:URP_StimulusGrant/Attribute:profileid+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:class' => 'Osztály',
|
||||
'Class:URP_StimulusGrant/Attribute:class+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:permission' => 'Hozzáférés',
|
||||
'Class:URP_StimulusGrant/Attribute:permission+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:no' => 'Nem',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:no+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:yes' => 'Igen',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:yes+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:stimulus' => 'Stimulus',
|
||||
'Class:URP_StimulusGrant/Attribute:stimulus+' => '',
|
||||
'Class:URP_AttributeGrant' => 'attribute_permission',
|
||||
'Class:URP_AttributeGrant+' => '',
|
||||
'Class:URP_AttributeGrant/Attribute:actiongrantid' => 'Akció engedély',
|
||||
'Class:URP_AttributeGrant/Attribute:actiongrantid+' => '',
|
||||
'Class:URP_AttributeGrant/Attribute:attcode' => 'Attribútum',
|
||||
'Class:URP_AttributeGrant/Attribute:attcode+' => '',
|
||||
'Class:AuditRule/Attribute:category_name' => 'Kategória',
|
||||
'Class:AuditRule/Attribute:category_name+' => '',
|
||||
'Class:User' => 'Felhasználó',
|
||||
'Class:User+' => '',
|
||||
'Class:User/Attribute:finalclass' => 'Felhasználó típusa',
|
||||
'Class:User/Attribute:finalclass+' => '',
|
||||
'Class:User/Attribute:contactid' => 'Kapcsolattartó (személy)',
|
||||
'Class:User/Attribute:contactid+' => '',
|
||||
'Class:User/Attribute:last_name' => 'Családnév',
|
||||
'Class:User/Attribute:last_name+' => '',
|
||||
'Class:User/Attribute:first_name' => 'Keresztnév',
|
||||
'Class:User/Attribute:first_name+' => '',
|
||||
'Class:User/Attribute:email' => 'E-mail',
|
||||
'Class:User/Attribute:email+' => '',
|
||||
'Class:User/Attribute:login' => 'Bejelentkezési név',
|
||||
'Class:User/Attribute:login+' => '',
|
||||
'Class:User/Attribute:language' => 'Nyelv',
|
||||
'Class:User/Attribute:language+' => '',
|
||||
'Class:User/Attribute:language/Value:EN US' => 'Angol',
|
||||
'Class:User/Attribute:language/Value:EN US+' => '',
|
||||
'Class:User/Attribute:language/Value:HU HU' => 'Magyar',
|
||||
'Class:User/Attribute:language/Value:HU HU+' => '',
|
||||
'Class:User/Attribute:language/Value:FR FR' => 'Francia',
|
||||
'Class:User/Attribute:language/Value:FR FR+' => '',
|
||||
'Class:User/Attribute:profile_list' => 'Profil',
|
||||
'Class:User/Attribute:profile_list+' => '',
|
||||
'Class:User/Attribute:allowed_org_list' => 'Engedélyezett szervezeti egységek',
|
||||
'Class:User/Attribute:allowed_org_list+' => '',
|
||||
'Class:User/Error:LoginMustBeUnique' => 'Bejelentkezési névnek egyedinek kell lennie - "%1s" már létezik.',
|
||||
'Class:User/Error:AtLeastOneProfileIsNeeded' => 'Legalább egy profilt a felhasználóhoz kell rendelni.',
|
||||
'Class:URP_Dimensions' => 'Dimenzió',
|
||||
'Class:URP_Dimensions+' => '',
|
||||
'Class:URP_Dimensions/Attribute:name' => 'Neve',
|
||||
'Class:URP_Dimensions/Attribute:name+' => '',
|
||||
'Class:URP_Dimensions/Attribute:description' => 'Leírás',
|
||||
'Class:URP_Dimensions/Attribute:description+' => '',
|
||||
'Class:URP_Dimensions/Attribute:type' => 'Típus',
|
||||
'Class:URP_Dimensions/Attribute:type+' => '',
|
||||
'Class:URP_UserProfile/Attribute:userlogin' => 'Bejelentkezési név',
|
||||
'Class:URP_UserProfile/Attribute:userlogin+' => '',
|
||||
'Class:URP_UserProfile/Attribute:profile' => 'Profil',
|
||||
'Class:URP_UserProfile/Attribute:profile+' => '',
|
||||
'Class:URP_UserOrg/Attribute:userlogin' => 'Bejelentkezési név',
|
||||
'Class:URP_UserOrg/Attribute:userlogin+' => '',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_name' => 'Szervezeti egység',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_name+' => '',
|
||||
'Class:URP_ProfileProjection' => 'profile_projection',
|
||||
'Class:URP_ProfileProjection+' => '',
|
||||
'Class:URP_ProfileProjection/Attribute:dimensionid' => 'Dimenzió',
|
||||
'Class:URP_ProfileProjection/Attribute:dimensionid+' => '',
|
||||
'Class:URP_ProfileProjection/Attribute:dimension' => 'Dimenzió',
|
||||
'Class:URP_ProfileProjection/Attribute:dimension+' => '',
|
||||
'Class:URP_ProfileProjection/Attribute:profileid' => 'Profil',
|
||||
'Class:URP_ProfileProjection/Attribute:profileid+' => '',
|
||||
'Class:URP_ProfileProjection/Attribute:profile' => 'Profil',
|
||||
'Class:URP_ProfileProjection/Attribute:profile+' => '',
|
||||
'Class:URP_ProfileProjection/Attribute:value' => 'Érték',
|
||||
'Class:URP_ProfileProjection/Attribute:value+' => '',
|
||||
'Class:URP_ProfileProjection/Attribute:attribute' => 'Attribútum',
|
||||
'Class:URP_ProfileProjection/Attribute:attribute+' => '',
|
||||
'Class:URP_ClassProjection' => 'class_projection',
|
||||
'Class:URP_ClassProjection+' => '',
|
||||
'Class:URP_ClassProjection/Attribute:dimensionid' => 'Dimenzió',
|
||||
'Class:URP_ClassProjection/Attribute:dimensionid+' => '',
|
||||
'Class:URP_ClassProjection/Attribute:dimension' => 'Dimenzió',
|
||||
'Class:URP_ClassProjection/Attribute:dimension+' => '',
|
||||
'Class:URP_ClassProjection/Attribute:class' => 'Osztály',
|
||||
'Class:URP_ClassProjection/Attribute:class+' => '',
|
||||
'Class:URP_ClassProjection/Attribute:value' => 'Érték',
|
||||
'Class:URP_ClassProjection/Attribute:value+' => '',
|
||||
'Class:URP_ClassProjection/Attribute:attribute' => 'Attribútum',
|
||||
'Class:URP_ClassProjection/Attribute:attribute+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:profile' => 'Profil',
|
||||
'Class:URP_ActionGrant/Attribute:profile+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:profile' => 'Profil',
|
||||
'Class:URP_StimulusGrant/Attribute:profile+' => '',
|
||||
'Menu:WelcomeMenu' => 'Üdvözlöm',
|
||||
'Menu:WelcomeMenu+' => '',
|
||||
'Menu:WelcomeMenuPage' => 'Üdvözlöm',
|
||||
'Menu:WelcomeMenuPage+' => '',
|
||||
'UI:WelcomeMenu:Title' => 'Üdvözli az iTop',
|
||||
'UI:WelcomeMenu:LeftBlock' => '<p>iTop egy teljeskörű, OpenSource, IT üzemeltetés támogató portál.</p>
|
||||
<ul>A következőket tartalmazza:
|
||||
<li>Teljeskörű CMDB (Konfiguráció menedzsment adatbázis) az IT eszközök dokumentálására és verzió kezelésére.</li>
|
||||
<li>Incidens menedzsment modul az összes IT-hez kapcsolódó kérés életciklusának követésére.</li>
|
||||
<li>Változás menedzsment modul az IT infrastruktúra változásainak nyomonkövetésére és tervezésére.</li>
|
||||
<li>Ismert hibák adatbázisa az incidens kezelés sebességének növelésére.</li>
|
||||
<li>Üzmeszünet modul az összes tervezett leállás tervezésére és azzal kapcsolatos kommunikáció támogatására.</li>
|
||||
<li>Dashboard-ok az IT infrastruktúra pillanatnyi állapotának gyors áttekintésére.</li>
|
||||
</ul>
|
||||
<p>Mindegyik modul önállóan telepíthető és használható.</p>',
|
||||
'UI:WelcomeMenu:RightBlock' => '<p>iTop egy szolgáltatás orientált megoldás, amely segít az IT szakembereknek több ügyfél és szervezet egyidejű menedzselését.
|
||||
<ul>az iTop az üzleti folyamatok javításához egy hatékony eszköz, mert:
|
||||
<li>javítja az IT menedzsment hatékonyságát</li>
|
||||
<li>növeli IT üzemeltetés teljesítményét</li>
|
||||
<li>növeli az ügyfél elégedettséget és a vezetők számára lehetőséget ad az üzleti teljesítmény növelésére</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>Az iTop teljesn nyílt ezért, egyszerűen integrálható a jelenlegi IT infrastruktúrába</p>
|
||||
<p>
|
||||
<ul>Az üzemeltetési portál bevezetésével:
|
||||
<li>jobban menedzselhető az egyre komplexebb IT infrstruktúra</li>
|
||||
<li>az ITIL folyamatok bevezetésre kerülnek</li>
|
||||
<li>hatékonyan tudja kezelni az egyik legfontosabb IT eszközt, a dokumentációt.</li>
|
||||
</ul>
|
||||
</p>',
|
||||
'UI:WelcomeMenu:AllOpenRequests' => 'Összes nyitott kérés: %1$d',
|
||||
'UI:WelcomeMenu:MyCalls' => 'Saját kérések',
|
||||
'UI:WelcomeMenu:OpenIncidents' => 'Nyitott incidensek: %1$d',
|
||||
'UI:WelcomeMenu:AllConfigItems' => 'Konfigurációs elemek: %1$d',
|
||||
'UI:WelcomeMenu:MyIncidents' => 'Hozzám rendelt incidensek',
|
||||
'UI:AllOrganizations' => 'Összes szervezeti egység',
|
||||
'UI:YourSearch' => 'Saját keresések',
|
||||
'UI:LoggedAsMessage' => 'Bejelentkezve %1$s',
|
||||
'UI:LoggedAsMessage+Admin' => 'Bejelentkezve %1$s (Administrator)',
|
||||
'UI:Button:Logoff' => 'Kijelentkezés',
|
||||
'UI:Button:GlobalSearch' => 'Keresés',
|
||||
'UI:Button:Search' => ' Keresés',
|
||||
'UI:Button:Query' => ' Lekérdezés',
|
||||
'UI:Button:Ok' => 'OK',
|
||||
'UI:Button:Cancel' => 'Mégse',
|
||||
'UI:Button:Apply' => 'Alkalmazás',
|
||||
'UI:Button:Back' => ' << Vissza',
|
||||
'UI:Button:Restart' => ' |<< Újraindítás',
|
||||
'UI:Button:Next' => ' Következő >>',
|
||||
'UI:Button:Finish' => ' Befejezés',
|
||||
'UI:Button:DoImport' => ' Importálás indítása',
|
||||
'UI:Button:Done' => ' Kész',
|
||||
'UI:Button:SimulateImport' => ' Import szimulálása',
|
||||
'UI:Button:Test' => 'Teszt!',
|
||||
'UI:Button:Evaluate' => ' Értékelés',
|
||||
'UI:Button:AddObject' => ' Hozzáad...',
|
||||
'UI:Button:BrowseObjects' => ' Böngészés...',
|
||||
'UI:Button:Add' => ' Hozzáad ',
|
||||
'UI:Button:AddToList' => ' << Hozzáad ',
|
||||
'UI:Button:RemoveFromList' => ' Eltávolít >> ',
|
||||
'UI:Button:FilterList' => ' Szűrés... ',
|
||||
'UI:Button:Create' => ' Létrehoz',
|
||||
'UI:Button:Delete' => ' Töröl !',
|
||||
'UI:Button:ChangePassword' => ' Jelszó változtatás',
|
||||
'UI:Button:ResetPassword' => ' Jelszó változtatás',
|
||||
'UI:SearchToggle' => 'Keresés',
|
||||
'UI:ClickToCreateNew' => 'Új %1$s létrehozása',
|
||||
'UI:SearchFor_Class' => '%1$s objektumok keresése',
|
||||
'UI:NoObjectToDisplay' => 'Nincs megjeleníthető objektum',
|
||||
'UI:Error:MandatoryTemplateParameter_object_id' => 'object_id pareméter kötelező a link_attr megadásánál. Ellenőrizze a sablon definíciót.',
|
||||
'UI:Error:MandatoryTemplateParameter_target_attr' => 'target_attr pareméter kötelező a link_attr megadásánál. Ellenőrizze a sablon definíciót.',
|
||||
'UI:Error:MandatoryTemplateParameter_group_by' => 'group_by paraméter kötelező. Ellenőrizze a sablon definíciót.',
|
||||
'UI:Error:InvalidGroupByFields' => 'Csoportosításnál használt érvénytelen mezők: "%1$s".',
|
||||
'UI:Error:UnsupportedStyleOfBlock' => 'Hiba: nem támogatott stílus tömb: "%1$s".',
|
||||
'UI:Error:IncorrectLinkDefinition_LinkedClass_Class' => 'Nem megfelelő kapcsolat meghatározás: kapcsolódó osztály: %1$s nem külső kulcs a %2$s osztályban',
|
||||
'UI:Error:Object_Class_Id_NotFound' => 'Objektum: %1$s:%2$d nem található.',
|
||||
'UI:Error:WizardCircularReferenceInDependencies' => 'Hiba: Körkörös hivatkozás az egymásra mutató mezők között. Ellenőrizze az adatmodelt.',
|
||||
'UI:Error:UploadedFileTooBig' => 'Feltöltendő fájl túl nagy. (Maximális méret: %1$s). Ellenőroizze a PHP konfigurációs fájlban az upload_max_filesize és post_max_size beállításokat.',
|
||||
'UI:Error:UploadedFileTruncated.' => 'Feltöltött fájl átméretezett!',
|
||||
'UI:Error:NoTmpDir' => 'Az átmeneti könyvtár nem meghatározott.',
|
||||
'UI:Error:CannotWriteToTmp_Dir' => 'Az átmeneti fájl nem írható. upload_tmp_dir = "%1$s".',
|
||||
'UI:Error:UploadStoppedByExtension_FileName' => 'Feltöltés megállt a fájl kiterjesztés miatt. (Eredeti fájl név = "%1$s").',
|
||||
'UI:Error:UploadFailedUnknownCause_Code' => 'Fájl feltöltés sikertelen ismeretlen hiba miatt. (Hibakód = "%1$s").',
|
||||
'UI:Error:1ParametersMissing' => 'Hiba: a következő paramétert meg kell adni ennél a műveletnél: %1$s.',
|
||||
'UI:Error:2ParametersMissing' => 'Hiba: a következő paramétereket meg kell adni ennél a műveletnél: %1$s és %2$s.',
|
||||
'UI:Error:3ParametersMissing' => 'Hiba: a következő paramétereket meg kell adni ennél a műveletnél: %1$s, %2$s és %3$s.',
|
||||
'UI:Error:4ParametersMissing' => 'Hiba: a következő paramétereket meg kell adni ennél a műveletnél: %1$s, %2$s, %3$s és %4$s.',
|
||||
'UI:Error:IncorrectOQLQuery_Message' => 'Hiba: nem megfelelő OQL lekérdezés: %1$',
|
||||
'UI:Error:AnErrorOccuredWhileRunningTheQuery_Message' => 'Hiba történt a lekérdezs futtatása közben: %1$s',
|
||||
'UI:Error:ObjectAlreadyUpdated' => 'Hiba: az objketum már korábban módosításra került.',
|
||||
'UI:Error:ObjectCannotBeUpdated' => 'Hiba: az objektum nem frissíthető.',
|
||||
'UI:Error:ObjectsAlreadyDeleted' => 'Hiba: az objektum már korában törlésre került!',
|
||||
'UI:Error:BulkDeleteNotAllowedOn_Class' => 'Az osztály objektumainak tömeges törlése nem engedélyezett %1$s',
|
||||
'UI:Error:DeleteNotAllowedOn_Class' => 'Az osztály objektumainak törlése nem engedélyezett %1$s',
|
||||
'UI:Error:BulkModifyNotAllowedOn_Class' => 'Az osztály objektumainak tömeges frissítése nem engedélyezett %1$s',
|
||||
'UI:Error:ObjectAlreadyCloned' => 'Hiba: az objektum már klónozott!',
|
||||
'UI:Error:ObjectAlreadyCreated' => 'Hiba: az objekltum már létrehozva!',
|
||||
'UI:Error:Invalid_Stimulus_On_Object_In_State' => 'Hiba: érvénytelen stimulus "%1$s" a következő objektum %2$s következő állapotában "%3$s".',
|
||||
'UI:GroupBy:Count' => 'Számossága',
|
||||
'UI:GroupBy:Count+' => '',
|
||||
'UI:CountOfObjects' => '%1$d darab objektum felel meg a kritériumoknak.',
|
||||
'UI_CountOfObjectsShort' => '%1$d objketum.',
|
||||
'UI:NoObject_Class_ToDisplay' => 'Nincs megjeleníthető %1$s',
|
||||
'UI:History:LastModified_On_By' => 'Utolsó módosítást a következő objektumon %1$s %2$s végezte.',
|
||||
'UI:HistoryTab' => 'Törénet',
|
||||
'UI:NotificationsTab' => 'Értesítés',
|
||||
'UI:History:BulkImports' => 'Történet',
|
||||
'UI:History:BulkImports+' => '',
|
||||
'UI:History:BulkImportDetails' => 'CSV import végrehajtva: %1$s (%2$s által)',
|
||||
'UI:History:Date' => 'Dátum',
|
||||
'UI:History:Date+' => '',
|
||||
'UI:History:User' => 'Felhasználó',
|
||||
'UI:History:User+' => '',
|
||||
'UI:History:Changes' => 'Változások',
|
||||
'UI:History:Changes+' => '',
|
||||
'UI:History:StatsCreations' => 'Létrehozva',
|
||||
'UI:History:StatsCreations+' => '',
|
||||
'UI:History:StatsModifs' => 'Módosítva',
|
||||
'UI:History:StatsModifs+' => '',
|
||||
'UI:History:StatsDeletes' => 'Törölve',
|
||||
'UI:History:StatsDeletes+' => '',
|
||||
'UI:Loading' => 'Betöltés...',
|
||||
'UI:Menu:Actions' => 'Akciók',
|
||||
'UI:Menu:New' => 'Új...',
|
||||
'UI:Menu:Add' => 'Hozzáad...',
|
||||
'UI:Menu:Manage' => 'Kezel...',
|
||||
'UI:Menu:EMail' => 'e-mail',
|
||||
'UI:Menu:CSVExport' => 'CSV export',
|
||||
'UI:Menu:Modify' => 'Módosít...',
|
||||
'UI:Menu:Delete' => 'Töröl...',
|
||||
'UI:Menu:BulkDelete' => 'Töröl...',
|
||||
'UI:UndefinedObject' => 'nem meghatározott',
|
||||
'UI:Document:OpenInNewWindow:Download' => 'Megnyitás új ablakban: %1$s, Letöltés: %2$s',
|
||||
'UI:SelectAllToggle+' => '',
|
||||
'UI:TruncatedResults' => '%1$d objektum megjelenítve %2$d példányból',
|
||||
'UI:DisplayAll' => 'Összes megjelenítése',
|
||||
'UI:CollapseList' => 'Elemek',
|
||||
'UI:CountOfResults' => '%1$d objektum',
|
||||
'UI:ChangesLogTitle' => 'Változás napló (%1$d):',
|
||||
'UI:EmptyChangesLogTitle' => 'Változás napló üres',
|
||||
'UI:SearchFor_Class_Objects' => 'Keresés %1$s objektumra',
|
||||
'UI:OQLQueryBuilderTitle' => 'OQL lekérdezés szerkesztő',
|
||||
'UI:OQLQueryTab' => 'OQL lekérdezés',
|
||||
'UI:SimpleSearchTab' => 'Egyszerű keresés',
|
||||
'UI:Details+' => '',
|
||||
'UI:SearchValue:Any' => '* Any *',
|
||||
'UI:SearchValue:Mixed' => '* mixed *',
|
||||
'UI:SelectOne' => '-- válasszon ki egyet --',
|
||||
'UI:Login:Welcome' => 'Üdvözli az iTop!',
|
||||
'UI:Login:IncorrectLoginPassword' => 'Nem megfelelő bejelentkezési név/jelszó, kérjük próbálja újra.',
|
||||
'UI:Login:IdentifyYourself' => 'Folytatás előtt azonosítsa magát',
|
||||
'UI:Login:UserNamePrompt' => 'Felhasználó név',
|
||||
'UI:Login:PasswordPrompt' => 'Jelszó',
|
||||
'UI:Login:ChangeYourPassword' => 'Jelszó változtatás',
|
||||
'UI:Login:OldPasswordPrompt' => 'Jelenlegi jelszó',
|
||||
'UI:Login:NewPasswordPrompt' => 'Új jelszó',
|
||||
'UI:Login:RetypeNewPasswordPrompt' => 'Új jelszó ismét',
|
||||
'UI:Login:IncorrectOldPassword' => 'Hiba: a jelenlegi jelszó hibás',
|
||||
'UI:LogOffMenu' => 'Kilépés',
|
||||
'UI:LogOff:ThankYou' => 'Köszönjük, hogy az iTop-ot használja!',
|
||||
'UI:LogOff:ClickHereToLoginAgain' => 'Ismételt bejelentkezéshez kattintson ide',
|
||||
'UI:ChangePwdMenu' => 'Jelszó módosítás...',
|
||||
'UI:Login:PasswordChanged' => 'Jelszó sikeresen beállítva!',
|
||||
'UI:AccessRO-All' => 'iTop csak olvasás módban',
|
||||
'UI:AccessRO-Users' => 'iTop csak olvasás módban a végfelhasználók számára',
|
||||
'UI:Login:RetypePwdDoesNotMatch' => 'Az új jelszó és ismételten beírt érték nem egyezik!',
|
||||
'UI:Button:Login' => 'Belépés az iTop alkalmazásba',
|
||||
'UI:Login:Error:AccessRestricted' => 'iTop hozzáférés korlátozva. Kérem forduljon az iTop adminisztrátorhoz!',
|
||||
'UI:Login:Error:AccessAdmin' => 'Adminisztrátori hozzáférés korlátozott. Kérem forduljon az iTop adminisztrátorhoz!',
|
||||
'UI:CSVImport:MappingSelectOne' => '-- válasszon ki egyet --',
|
||||
'UI:CSVImport:MappingNotApplicable' => '-- mező figyelmen kívül hagyása --',
|
||||
'UI:CSVImport:NoData' => 'Üres mező..., kérem agyjon meg adatot!',
|
||||
'UI:Title:DataPreview' => 'Adatok előnézete',
|
||||
'UI:CSVImport:ErrorOnlyOneColumn' => 'Hiba: Az import fájl egyetlen oszlopot tartalmaz. A megfelelő elválasztó karaktert adta meg?',
|
||||
'UI:CSVImport:FieldName' => 'Mező %1$d',
|
||||
'UI:CSVImport:DataLine1' => 'Adatsor 1',
|
||||
'UI:CSVImport:DataLine2' => 'Adatsor 2',
|
||||
'UI:CSVImport:idField' => 'id (elsődeges kulcs)',
|
||||
'UI:Title:BulkImport' => 'iTop - tömeges betöltés',
|
||||
'UI:Title:BulkImport+' => '',
|
||||
'UI:Title:BulkSynchro_nbItem_ofClass_class' => '%2$s osztály %1$d objektumának szinkronizációja',
|
||||
'UI:CSVImport:ClassesSelectOne' => '-- válasszon ki egyet --',
|
||||
'UI:CSVImport:ErrorExtendedAttCode' => 'Belső hiba: "%1$s" nem megfelelő kód, mert "%2$s" nem külső kulcsa a "%3$s" osztálynak',
|
||||
'UI:CSVImport:ObjectsWillStayUnchanged' => '%1$d objektumok változatlanok maradnak.',
|
||||
'UI:CSVImport:ObjectsWillBeModified' => '%1$d objektumok fognak megváltozni.',
|
||||
'UI:CSVImport:ObjectsWillBeAdded' => '%1$d objektumok hozzáadásra kerülnek.',
|
||||
'UI:CSVImport:ObjectsWillHaveErrors' => '%1$d objektumok hibásak lesznek.',
|
||||
'UI:CSVImport:ObjectsRemainedUnchanged' => '%1$d objektumok változatlanak maradtak',
|
||||
'UI:CSVImport:ObjectsWereModified' => '%1$d objektumok módosításra kerültek.',
|
||||
'UI:CSVImport:ObjectsWereAdded' => '%1$d objektumok hozzáadásra kerültek.',
|
||||
'UI:CSVImport:ObjectsHadErrors' => '%1$d objkektumok hibásak.',
|
||||
'UI:Title:CSVImportStep2' => '2. lépés az 5-ből: CSV adat opciók',
|
||||
'UI:Title:CSVImportStep3' => '3. lépés az 5-ből: Adatok összerendelés',
|
||||
'UI:Title:CSVImportStep4' => '4. lépés az 5-ből: Import szimuláció',
|
||||
'UI:Title:CSVImportStep5' => '5. lépés az 5-ből: Import befejezve',
|
||||
'UI:CSVImport:LinesNotImported' => 'Sorok, melyek nem lettek betöltve:',
|
||||
'UI:CSVImport:LinesNotImported+' => '',
|
||||
'UI:CSVImport:SeparatorComma+' => '',
|
||||
'UI:CSVImport:SeparatorSemicolon+' => '',
|
||||
'UI:CSVImport:SeparatorTab+' => '',
|
||||
'UI:CSVImport:SeparatorOther' => 'egyéb:',
|
||||
'UI:CSVImport:QualifierDoubleQuote+' => '',
|
||||
'UI:CSVImport:QualifierSimpleQuote+' => '',
|
||||
'UI:CSVImport:QualifierOther' => 'egyéb:',
|
||||
'UI:CSVImport:TreatFirstLineAsHeader' => 'Első sor fejléc információkat tartalmaz (oszlopok nevei)',
|
||||
'UI:CSVImport:Skip_N_LinesAtTheBeginning' => '%1$s sorok kihagyása a fájl elejéről',
|
||||
'UI:CSVImport:CSVDataPreview' => 'CSV adat előnézet',
|
||||
'UI:CSVImport:SelectFile' => 'Import fájl kiválasztása:',
|
||||
'UI:CSVImport:Tab:LoadFromFile' => 'Betöltés fájlból',
|
||||
'UI:CSVImport:Tab:CopyPaste' => 'Adat másolás és beillesztés',
|
||||
'UI:CSVImport:Tab:Templates' => 'Sablonok',
|
||||
'UI:CSVImport:PasteData' => 'Import adatok beillesztése:',
|
||||
'UI:CSVImport:PickClassForTemplate' => 'Letöltendő sablon kiválasztása:',
|
||||
'UI:CSVImport:SeparatorCharacter' => 'Elválasztó karakter:',
|
||||
'UI:CSVImport:TextQualifierCharacter' => 'Szöveg qualifier karakter',
|
||||
'UI:CSVImport:CommentsAndHeader' => 'Megjegyzések és fejléc',
|
||||
'UI:CSVImport:SelectClass' => 'Importálandó osztály kiválasztása:',
|
||||
'UI:CSVImport:AdvancedMode' => 'Haladó mód',
|
||||
'UI:CSVImport:AdvancedMode+' => '',
|
||||
'UI:CSVImport:SelectAClassFirst' => 'Adat összerendeléshez elöször válassza ki az osztályt.',
|
||||
'UI:CSVImport:HeaderFields' => 'Mező',
|
||||
'UI:CSVImport:HeaderMappings' => 'Összerendelés',
|
||||
'UI:CSVImport:HeaderSearch' => 'Keresés?',
|
||||
'UI:CSVImport:AlertIncompleteMapping' => 'Kérem adja meg az összes mezőre az összerendelési szabályokat.',
|
||||
'UI:CSVImport:AlertNoSearchCriteria' => 'Kérem adjon eg legalább egy keresési kritériumot',
|
||||
'UI:CSVImport:Encoding' => 'Karakter kódolása',
|
||||
'UI:UniversalSearchTitle' => 'iTop - Univerzális kereső',
|
||||
'UI:UniversalSearch:Error' => 'Hiba: %1$s',
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Keresendő osztály kiválasztása:',
|
||||
'UI:Audit:Title' => 'iTop - CMDB Audit',
|
||||
'UI:Audit:InteractiveAudit' => 'Interaktív Audit',
|
||||
'UI:Audit:HeaderAuditRule' => 'Audit szabály',
|
||||
'UI:Audit:HeaderNbObjects' => '# Objektumok',
|
||||
'UI:Audit:HeaderNbErrors' => '# Hibák',
|
||||
'UI:Audit:PercentageOk' => '% OK',
|
||||
'UI:RunQuery:Title' => 'iTop - OQL lekérdezés értékelés',
|
||||
'UI:RunQuery:QueryExamples' => 'Lekérdezés példák',
|
||||
'UI:RunQuery:HeaderPurpose' => 'Cél',
|
||||
'UI:RunQuery:HeaderPurpose+' => '',
|
||||
'UI:RunQuery:HeaderOQLExpression' => 'OQL kifejezés',
|
||||
'UI:RunQuery:HeaderOQLExpression+' => '',
|
||||
'UI:RunQuery:ExpressionToEvaluate' => 'Értékelendő kifejezés: ',
|
||||
'UI:RunQuery:MoreInfo' => 'Több információ a lekérdezésről: ',
|
||||
'UI:RunQuery:DevelopedQuery' => 'Újraírt lekérdező értékelés: ',
|
||||
'UI:RunQuery:SerializedFilter' => 'Szerializált szűrő: ',
|
||||
'UI:RunQuery:Error' => 'A lekérdezés futtatása közben a következő hiba jelentkezett: %1$s',
|
||||
'UI:Schema:Title' => 'iTop objektum séma',
|
||||
'UI:Schema:CategoryMenuItem' => '<b>%1$s</b> kategória',
|
||||
'UI:Schema:Relationships' => 'Kapcsolatok',
|
||||
'UI:Schema:AbstractClass' => 'Absztrakt osztály: nem példányosítható belőle objektum.',
|
||||
'UI:Schema:NonAbstractClass' => 'Nem absztrakt osztály: objektum példányosítható belőle.',
|
||||
'UI:Schema:ClassHierarchyTitle' => 'Osztály hierarchia',
|
||||
'UI:Schema:AllClasses' => 'Összes osztály',
|
||||
'UI:Schema:ExternalKey_To' => 'Külső kulcs %1$s-hoz',
|
||||
'UI:Schema:Columns_Description' => 'Oszlopok: <em>%1$s</em>',
|
||||
'UI:Schema:Default_Description' => 'Alapértelmezett: "%1$s"',
|
||||
'UI:Schema:NullAllowed' => 'Null érték engedélyezett',
|
||||
'UI:Schema:NullNotAllowed' => 'Null érték nem engedélyezett',
|
||||
'UI:Schema:Attributes' => 'Attribútumok',
|
||||
'UI:Schema:AttributeCode' => 'Attribútum kód',
|
||||
'UI:Schema:AttributeCode+' => '',
|
||||
'UI:Schema:Label' => 'Cimke',
|
||||
'UI:Schema:Label+' => '',
|
||||
'UI:Schema:Type' => 'Típus',
|
||||
'UI:Schema:Type+' => '',
|
||||
'UI:Schema:Origin' => 'Származás',
|
||||
'UI:Schema:Origin+' => '',
|
||||
'UI:Schema:Description' => 'Leírás',
|
||||
'UI:Schema:Description+' => '',
|
||||
'UI:Schema:AllowedValues' => 'Engedélyezett értékek',
|
||||
'UI:Schema:AllowedValues+' => '',
|
||||
'UI:Schema:MoreInfo' => 'Több információ',
|
||||
'UI:Schema:MoreInfo+' => '',
|
||||
'UI:Schema:SearchCriteria' => 'Keresési kritériumok',
|
||||
'UI:Schema:FilterCode' => 'Szűrő kód',
|
||||
'UI:Schema:FilterCode+' => '',
|
||||
'UI:Schema:FilterDescription' => 'Leírás',
|
||||
'UI:Schema:FilterDescription+' => '',
|
||||
'UI:Schema:AvailOperators' => 'Elérhető műveletek',
|
||||
'UI:Schema:AvailOperators+' => '',
|
||||
'UI:Schema:ChildClasses' => 'Leszármazott osztályok',
|
||||
'UI:Schema:ReferencingClasses' => 'Referált osztályok',
|
||||
'UI:Schema:RelatedClasses' => 'Kapcsolódó osztályok',
|
||||
'UI:Schema:LifeCycle' => 'Életciklus',
|
||||
'UI:Schema:Triggers' => 'Kiváltó okok',
|
||||
'UI:Schema:Relation_Code_Description' => 'Kapcsolat <em>%1$s</em> (%2$s)',
|
||||
'UI:Schema:RelationDown_Description' => 'Lenn: %1$s',
|
||||
'UI:Schema:RelationUp_Description' => 'Fenn: %1$s',
|
||||
'UI:Schema:RelationPropagates' => '%1$s: kiterjesztése %2$d szintre, lekérdezés: %3$s',
|
||||
'UI:Schema:RelationDoesNotPropagate' => '%1$s: nincs kiterjesztve (%2$d szintekre), lekérdezés: %3$s',
|
||||
'UI:Schema:Class_ReferencingClasses_From_By' => '%1$s hivatkozva %2$s az osztályban %3$s mezőn keresztül',
|
||||
'UI:Schema:Class_IsLinkedTo_Class_Via_ClassAndAttribute' => '%1$s hozzácsatolva %2$s-hoz %3$s-n keresztül::<em>%4$s</em>',
|
||||
'UI:Schema:Links:1-n' => 'A következő osztályok mutatnak %1$s-ra (1:n kapcsolat):',
|
||||
'UI:Schema:Links:n-n' => 'A következő osztályok mutatnak %1$s-ra (n:n kapcsolat):',
|
||||
'UI:Schema:Links:All' => 'Össze kapcsolódó osztály grafikonja',
|
||||
'UI:Schema:NoLifeCyle' => 'Nincs életciklus rendelve ehhez az osztályhoz.',
|
||||
'UI:Schema:LifeCycleTransitions' => 'Átmenetek',
|
||||
'UI:Schema:LifeCyleAttributeOptions' => 'Attribútum opciók',
|
||||
'UI:Schema:LifeCycleHiddenAttribute' => 'Rejtett',
|
||||
'UI:Schema:LifeCycleReadOnlyAttribute' => 'Csak olvasható',
|
||||
'UI:Schema:LifeCycleMandatoryAttribute' => 'Kötelező',
|
||||
'UI:Schema:LifeCycleAttributeMustChange' => 'Változtatni kell',
|
||||
'UI:Schema:LifeCycleAttributeMustPrompt' => 'Felhasználó kéri a változtatását',
|
||||
'UI:Schema:LifeCycleEmptyList' => 'üres lista',
|
||||
'UI:LinksWidget:Autocomplete+' => '',
|
||||
'UI:Combo:SelectValue' => '--- válasszon értéket ---',
|
||||
'UI:Label:SelectedObjects' => 'Kiválasztott objektumok: ',
|
||||
'UI:Label:AvailableObjects' => 'Lehetséges objektumok: ',
|
||||
'UI:Link_Class_Attributes' => '%1$s attribútumai',
|
||||
'UI:AddObjectsOf_Class_LinkedWith_Class_Instance' => '%1$s objektumok hozzáadása %2$s osztályhoz kapcsolással: %3$s',
|
||||
'UI:AddObjectsOf_Class_LinkedWith_Class' => '%1$s objektumok hozzáadása %2$s osztályhoz csatolással',
|
||||
'UI:ManageObjectsOf_Class_LinkedWith_Class_Instance' => '%2$s osztályhoz kapcsolt %1$s objektumok kezelése: %3$s',
|
||||
'UI:AddLinkedObjectsOf_Class' => 'Hozzáadás %1$s osztályhoz',
|
||||
'UI:RemoveLinkedObjectsOf_Class' => 'Kiválasztott objektum eltávolítása',
|
||||
'UI:Message:EmptyList:UseAdd' => 'A lista üres, használja a "Hozzáadás..." gombot az elemekre.',
|
||||
'UI:Message:EmptyList:UseSearchForm' => 'Használja a kereső formot a hozzáadandó objektumok kiválasztásához.',
|
||||
'UI:Wizard:FinalStepTitle' => 'Utolsó lépés: megerősítés',
|
||||
'UI:Title:DeletionOf_Object' => '%1$s törlése',
|
||||
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => '%2$s osztály %1$d objektumának tömeges törlése',
|
||||
'UI:Delete:NotAllowedToDelete' => 'Nem enegedélyezett az objektum törlése',
|
||||
'UI:Delete:NotAllowedToUpdate_Fields' => 'A következő mező módosítása nem engedélyezett: %1$s',
|
||||
'UI:Error:NotEnoughRightsToDelete' => 'Az objektum nem törölhető, mert a felhasználónak nincs elegendő joga',
|
||||
'UI:Error:CannotDeleteBecause' => 'Az objektum nem törölhető, mert: %1$s',
|
||||
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Az objektum nem törölhető, mert néhány hozzá kapcsolódó magasabb prioritású manuális művelet végrehajtásra vár',
|
||||
'UI:Error:CannotDeleteBecauseManualOpNeeded' => 'Az objektum nem törölhető, mert néhány hozzá kapcsolódó magasabb prioritású manuális művelet végrehajtásra vár',
|
||||
'UI:Archive_User_OnBehalfOf_User' => '%1$s felhasználó %2$s nevében',
|
||||
'UI:Delete:Deleted' => 'törölt',
|
||||
'UI:Delete:AutomaticallyDeleted' => 'automatikusan törölt',
|
||||
'UI:Delete:AutomaticResetOf_Fields' => ' következő mezők automatikus újratöltése: %1$s',
|
||||
'UI:Delete:CleaningUpRefencesTo_Object' => 'Összes referencia tisztítása %1$s...',
|
||||
'UI:Delete:CleaningUpRefencesTo_Several_ObjectsOf_Class' => '%2$s osztály %1$d objektumára mutató referenciák tisztítása',
|
||||
'UI:Delete:Done+' => '',
|
||||
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s törölve.',
|
||||
'UI:Delete:ConfirmDeletionOf_Name' => '%1$s törlése',
|
||||
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => '%2$s osztály %1$d objektumának törlése',
|
||||
'UI:Delete:CannotDeleteBecause' => 'Sikertelenül töröltek: %1$s',
|
||||
'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Automatikusan kellett volna törlődniük, de a művelet nem volt végrehajtható: %1$s',
|
||||
'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Manuállis törlés nem végrehajtható: %1$s',
|
||||
'UI:Delete:WillBeDeletedAutomatically' => 'Automatikusan lesznek törölve',
|
||||
'UI:Delete:MustBeDeletedManually' => 'Manuálisan törlendők',
|
||||
'UI:Delete:CannotUpdateBecause_Issue' => 'Automatikus frissítés sikeretelen: %1$s',
|
||||
'UI:Delete:WillAutomaticallyUpdate_Fields' => 'Automatikusan lesznek frissítve (reset: %1$s)',
|
||||
'UI:Delete:Count_Objects/LinksReferencing_Object' => '%1$d objektumok / kapcsolatok hivatkoznak erre: %2$s',
|
||||
'UI:Delete:Count_Objects/LinksReferencingTheObjects' => '%1$d objektumok / kapcsolatok hivatkoznak törlendő objektumokra',
|
||||
'UI:Delete:ReferencesMustBeDeletedToEnsureIntegrity' => 'Adatbázis integritás ellenőrzés szükséges. Néhány hivatkozás megszüntetésre kerül.',
|
||||
'UI:Delete:Consequence+' => '',
|
||||
'UI:Delete:SorryDeletionNotAllowed' => 'Az objektum törlése nem engedélyezett. Részletes magyarázat a következő sorokban.',
|
||||
'UI:Delete:PleaseDoTheManualOperations' => 'Kérem hajtsa végre a következő listában található műveleteket manuálisan az objektum törlésének kéréséhez',
|
||||
'UI:Delect:Confirm_Object' => 'Kérjük hagyja jóvá a %1$s törlését!',
|
||||
'UI:Delect:Confirm_Count_ObjectsOf_Class' => 'Kérjük hagyja jóvá a %2$s ostály %1$d objektumának törlését!',
|
||||
'UI:WelcomeToITop' => 'Üdvözli az iTop',
|
||||
'UI:DetailsPageTitle' => 'iTop - %1$s - %2$s részletek',
|
||||
'UI:ErrorPageTitle' => 'iTop - Hiba',
|
||||
'UI:ObjectDoesNotExist' => 'Sajnálom ez az objektum nem létezik (vagy a megtekintése nem engedélyezett a felhasználó számára).',
|
||||
'UI:SearchResultsPageTitle' => 'iTop - Keresés eredményei',
|
||||
'UI:Search:NoSearch' => 'Nincs keresés',
|
||||
'UI:FullTextSearchTitle_Text' => '"%1$s" keresés eredményei:',
|
||||
'UI:Search:Count_ObjectsOf_Class_Found' => '%2$s osztály %1$d objektuma',
|
||||
'UI:Search:NoObjectFound' => 'Objektum nem található',
|
||||
'UI:ModificationPageTitle_Object_Class' => 'iTop - %1$s - %2$s módosítása',
|
||||
'UI:ModificationTitle_Class_Object' => '%1$s: <span class=\"hilite\">%2$s</span> módosítása',
|
||||
'UI:ClonePageTitle_Object_Class' => 'iTop - %1$s - %2$s klón módosítása',
|
||||
'UI:CloneTitle_Class_Object' => '%1$s: <span class=\"hilite\">%2$s</span> klón',
|
||||
'UI:CreationPageTitle_Class' => 'iTop - %1$s létrehozása',
|
||||
'UI:CreationTitle_Class' => '%1$s létrehozása',
|
||||
'UI:SelectTheTypeOf_Class_ToCreate' => 'Válassza ki a létrehozni kívánt %1$s osztály típusát:',
|
||||
'UI:Class_Object_NotUpdated' => 'Változás nem történt, %1$s (%2$s) <strong>NEM</strong> lett módosítva.',
|
||||
'UI:Class_Object_Updated' => '%1$s (%2$s) frissítve.',
|
||||
'UI:BulkDeletePageTitle' => 'iTop - Tömeges törlés',
|
||||
'UI:BulkDeleteTitle' => 'Válassza ki a törölni kívánt objektumokat:',
|
||||
'UI:PageTitle:ObjectCreated' => 'iTop objektum létrehozva.',
|
||||
'UI:Title:Object_Of_Class_Created' => '%1$s - %2$s létrehozva.',
|
||||
'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => 'Alkalmazva %1$s objektumon: %2$s.Kinduló állapot: %3$s cél állapot: %4$s.',
|
||||
'UI:ObjectCouldNotBeWritten' => 'Au objektum írása sikertlen: %1$s',
|
||||
'UI:PageTitle:FatalError' => 'iTop - Fatális hiba',
|
||||
'UI:SystemIntrusion' => 'Hozzáférés megtagadva. A művelet végrehajtása nem engedélyezett.',
|
||||
'UI:FatalErrorMessage' => 'Fatális hiba, iTop nem tudja a működését folytatni',
|
||||
'UI:Error_Details' => 'Hiba: %1$s.',
|
||||
'UI:PageTitle:ClassProjections' => 'iTop felhasználó menedzsmet - osztály nézet',
|
||||
'UI:PageTitle:ProfileProjections' => 'iTop felhasználó menedzsmet - profil nézet',
|
||||
'UI:UserManagement:Class' => 'Osztály',
|
||||
'UI:UserManagement:Class+' => '',
|
||||
'UI:UserManagement:ProjectedObject' => 'Objektum',
|
||||
'UI:UserManagement:ProjectedObject+' => '',
|
||||
'UI:UserManagement:AnyObject' => '* any *',
|
||||
'UI:UserManagement:User' => 'Felhasználó',
|
||||
'UI:UserManagement:User+' => '',
|
||||
'UI:UserManagement:Profile' => 'Profil',
|
||||
'UI:UserManagement:Profile+' => '',
|
||||
'UI:UserManagement:Action:Read' => 'Olvas',
|
||||
'UI:UserManagement:Action:Read+' => '',
|
||||
'UI:UserManagement:Action:Modify' => 'Módosít',
|
||||
'UI:UserManagement:Action:Modify+' => '',
|
||||
'UI:UserManagement:Action:Delete' => 'Töröl',
|
||||
'UI:UserManagement:Action:Delete+' => '',
|
||||
'UI:UserManagement:Action:BulkRead' => 'Tömeges beolvasás (Export)',
|
||||
'UI:UserManagement:Action:BulkRead+' => '',
|
||||
'UI:UserManagement:Action:BulkModify' => 'Tömeges módosítás',
|
||||
'UI:UserManagement:Action:BulkModify+' => '',
|
||||
'UI:UserManagement:Action:BulkDelete' => 'Tömeges törlés',
|
||||
'UI:UserManagement:Action:BulkDelete+' => '',
|
||||
'UI:UserManagement:Action:Stimuli' => 'Stimuli',
|
||||
'UI:UserManagement:Action:Stimuli+' => '',
|
||||
'UI:UserManagement:Action' => 'Akció',
|
||||
'UI:UserManagement:Action+' => '',
|
||||
'UI:UserManagement:TitleActions' => 'Akciók',
|
||||
'UI:UserManagement:Permission' => 'Engedély',
|
||||
'UI:UserManagement:Permission+' => '',
|
||||
'UI:UserManagement:Attributes' => 'Attribútumok',
|
||||
'UI:UserManagement:ActionAllowed:Yes' => 'Igen',
|
||||
'UI:UserManagement:ActionAllowed:No' => 'Nem',
|
||||
'UI:UserManagement:AdminProfile+' => '',
|
||||
'UI:UserManagement:NoLifeCycleApplicable' => 'N/A',
|
||||
'UI:UserManagement:NoLifeCycleApplicable+' => '',
|
||||
'UI:UserManagement:GrantMatrix' => 'Jogosutlsági mátrix',
|
||||
'UI:UserManagement:LinkBetween_User_And_Profile' => 'Kapcsolat %1$s és %2$s között',
|
||||
'UI:UserManagement:LinkBetween_User_And_Org' => 'Kapcsolat %1$s és %2$s között',
|
||||
'Menu:AdminTools' => 'Adminisztrációs eszközök',
|
||||
'Menu:AdminTools+' => '',
|
||||
'Menu:AdminTools?' => 'Eszközök csak az adminisztrátori profilhoz rendlet felhasználók számára elérhetők.',
|
||||
'UI:ChangeManagementMenu' => 'Változás menedzsment',
|
||||
'UI:ChangeManagementMenu+' => '',
|
||||
'UI:ChangeManagementMenu:Title' => 'Változás áttekintése',
|
||||
'UI-ChangeManagementMenu-ChangesByType' => 'Változások típusok szerint',
|
||||
'UI-ChangeManagementMenu-ChangesByStatus' => 'Változások státusz szerint',
|
||||
'UI-ChangeManagementMenu-ChangesByWorkgroup' => 'Változások csoportok szerint',
|
||||
'UI-ChangeManagementMenu-ChangesNotYetAssigned' => 'Még nem kiosztott változások',
|
||||
'UI:ConfigurationItemsMenu' => 'Konfigurációs elemek',
|
||||
'UI:ConfigurationItemsMenu+' => '',
|
||||
'UI:ConfigurationItemsMenu:Title' => 'Konfigurációs elemek áttekintése',
|
||||
'UI-ConfigurationItemsMenu-ServersByCriticity' => 'Szerverek kritikusság szerint',
|
||||
'UI-ConfigurationItemsMenu-PCsByCriticity' => 'PC-k kritikusság szerint',
|
||||
'UI-ConfigurationItemsMenu-NWDevicesByCriticity' => 'Hálózati eszközök kritikusság szerint',
|
||||
'UI-ConfigurationItemsMenu-ApplicationsByCriticity' => 'Alkalmazások kritikusság szerint',
|
||||
'UI:ConfigurationManagementMenu' => 'Konfiguráció menedzsment',
|
||||
'UI:ConfigurationManagementMenu+' => '',
|
||||
'UI:ConfigurationManagementMenu:Title' => 'Infrastruktúra áttekintő',
|
||||
'UI-ConfigurationManagementMenu-InfraByType' => 'Infrastruktúra objetumok típusok szerint',
|
||||
'UI-ConfigurationManagementMenu-InfraByStatus' => 'Infrastruktúra objetumok státuszok szerint',
|
||||
'UI:ConfigMgmtMenuOverview:Title' => 'Konfiguráció menedzsment dashboard',
|
||||
'UI-ConfigMgmtMenuOverview-FunctionalCIbyStatus' => 'Konfigurációs elemek státusz szerint',
|
||||
'UI-ConfigMgmtMenuOverview-FunctionalCIByType' => 'Konfigurációs elemek típus szerint',
|
||||
'UI:RequestMgmtMenuOverview:Title' => 'Igény menedzsment dashboard',
|
||||
'UI-RequestManagementOverview-RequestByService' => 'Felhasználói kérések szolgáltatásonként',
|
||||
'UI-RequestManagementOverview-RequestByPriority' => 'Felhasználói kérések prioritás szerint',
|
||||
'UI-RequestManagementOverview-RequestUnassigned' => 'Felhasználói kérések, amelyek még nem lettek felelőshöz rendelve',
|
||||
'UI:IncidentMgmtMenuOverview:Title' => 'Incidens menedzsment dashboard',
|
||||
'UI-IncidentManagementOverview-IncidentByService' => 'Incidensek szolgáltatásonként',
|
||||
'UI-IncidentManagementOverview-IncidentByPriority' => 'Incidensek prioritás szerint',
|
||||
'UI-IncidentManagementOverview-IncidentUnassigned' => 'Incidensek, amelyek még nem lettek felelőshöz rendelve',
|
||||
'UI:ChangeMgmtMenuOverview:Title' => 'Változás menedzsment dashboard',
|
||||
'UI-ChangeManagementOverview-ChangeByType' => 'Változások típusonként',
|
||||
'UI-ChangeManagementOverview-ChangeUnassigned' => 'Változások, amelyek még nem lettek felelőshöz rendelve',
|
||||
'UI-ChangeManagementOverview-ChangeWithOutage' => 'Változások által okozott leállási idő',
|
||||
'UI:ServiceMgmtMenuOverview:Title' => 'Szolgáltatás menedszment dashboard',
|
||||
'UI-ServiceManagementOverview-CustomerContractToRenew' => 'A következő 30 napban lejáró ügyfél szerződések',
|
||||
'UI-ServiceManagementOverview-ProviderContractToRenew' => 'A következő 30 napban lejáró szállítói szerződések',
|
||||
'UI:ContactsMenu' => 'Kapcsolattartók',
|
||||
'UI:ContactsMenu+' => '',
|
||||
'UI:ContactsMenu:Title' => 'Kapcsolattartó áttekintő',
|
||||
'UI-ContactsMenu-ContactsByLocation' => 'Kapcsolattartók földrajzi hely szerint',
|
||||
'UI-ContactsMenu-ContactsByType' => 'Kapcsolattartók típus szerint',
|
||||
'UI-ContactsMenu-ContactsByStatus' => 'Kapcsolattartók státusz szerint',
|
||||
'Menu:CSVImportMenu' => 'CSV import',
|
||||
'Menu:CSVImportMenu+' => '',
|
||||
'Menu:DataModelMenu' => 'Adatmodell',
|
||||
'Menu:DataModelMenu+' => '',
|
||||
'Menu:ExportMenu' => 'Export',
|
||||
'Menu:ExportMenu+' => '',
|
||||
'Menu:NotificationsMenu' => 'Értesítések',
|
||||
'Menu:NotificationsMenu+' => '',
|
||||
'UI:NotificationsMenu:Title' => '<span class="hilite">Értesítések</span> beállítása',
|
||||
'UI:NotificationsMenu:Help' => 'Segítség',
|
||||
'UI:NotificationsMenu:HelpContent' => '<p>Az iTop alkalmazásban az értesítések teljesen testreszabhatók. Értesítések az objektumok két csoportjára épülnek: <i>kiváltó okok és akciók</i>.</p>
|
||||
<p><i><b>Kiváltó ok</b></i> határozza meg mikor kell az értesítést végrehajtani. Kiváltó okoknak 2 típusa van az objektum életciklius három fázisának lefedésére:
|
||||
<ol>
|
||||
<li>"OnCreate" kiváltó ok egy objektum létrehozása</li>
|
||||
<li>"OnStateEnter" kiváltó ok egy adott objektum állapot változása - az új objektum állapot elérése előtt váltódik ki</li>
|
||||
<li>"OnStateLeave" kiváltó ok egy adott objektum állapot változása - az új objektum állapot elhagyása után váltódik ki</li>
|
||||
</ol>
|
||||
</p>
|
||||
<p>
|
||||
<i><b>Akciók</b></i> határozzák meg mit kell végrehjatani a kiváltó ok bekövetkezésekor. Jelenleg egyetlen akció fajta van: e-mail küldés.Természetesen az egyedi akciókbna meg lehet határozni a levél alapját képző sablont és az abba beépülő speciális paramétereket, pl.: címzett, fontossás, stb.
|
||||
</p>
|
||||
<p>Speciális oldal: <a href="../setup/email.test.php" target="_blank">email.test.php</a> oldalon keresztül a PHP mail konfiguráció tesztelhető.</p>
|
||||
<p>Akció végrehjatásához azt kiváltó okhoz kell rendelni.
|
||||
Akció kiváltó okhoz rendelésekor kap egy sorszámot , amely meghatározza az akciók végrehatási sorrendjét.</p>',
|
||||
'UI:NotificationsMenu:Triggers' => 'Kiváltó okok',
|
||||
'UI:NotificationsMenu:AvailableTriggers' => 'Lehetséges kiváltó okok',
|
||||
'UI:NotificationsMenu:OnCreate' => 'Objektum létrehozás',
|
||||
'UI:NotificationsMenu:OnStateEnter' => 'Objketum állapotba való belépése',
|
||||
'UI:NotificationsMenu:OnStateLeave' => 'Objektum állotból való kilépése',
|
||||
'UI:NotificationsMenu:Actions' => 'Akciók',
|
||||
'UI:NotificationsMenu:AvailableActions' => 'Lehetséges akciók',
|
||||
'Menu:AuditCategories' => 'Audit kategóriák',
|
||||
'Menu:AuditCategories+' => '',
|
||||
'Menu:Notifications:Title' => 'Audit kategóriák',
|
||||
'Menu:RunQueriesMenu' => 'Lekérdezés futtatás',
|
||||
'Menu:RunQueriesMenu+' => '',
|
||||
'Menu:DataAdministration' => 'Adat adminisztráció',
|
||||
'Menu:DataAdministration+' => '',
|
||||
'Menu:UniversalSearchMenu' => 'Univerzális keresés',
|
||||
'Menu:UniversalSearchMenu+' => '',
|
||||
'Menu:ApplicationLogMenu' => 'Alkalmazás napló',
|
||||
'Menu:ApplicationLogMenu+' => '',
|
||||
'Menu:ApplicationLogMenu:Title' => 'Alkalmazás napló',
|
||||
'Menu:UserManagementMenu' => 'Felhasználó menedzsment',
|
||||
'Menu:UserManagementMenu+' => '',
|
||||
'Menu:ProfilesMenu' => 'Profilok',
|
||||
'Menu:ProfilesMenu+' => '',
|
||||
'Menu:ProfilesMenu:Title' => 'Profilok',
|
||||
'Menu:UserAccountsMenu' => 'Felhasználói fiókok',
|
||||
'Menu:UserAccountsMenu+' => '',
|
||||
'Menu:UserAccountsMenu:Title' => 'Felhasználói fiókok',
|
||||
'UI:iTopVersion:Short' => 'iTop verzió: %1$s',
|
||||
'UI:iTopVersion:Long' => 'iTop verzió: %1$s-%2$s %3$s',
|
||||
'UI:PropertiesTab' => 'Tulajdonságok',
|
||||
'UI:OpenDocumentInNewWindow_' => 'A követekező dokumentum megnyitása új ablakban: %1$s',
|
||||
'UI:DownloadDocument_' => 'A következő dokuemntum letöltése: %1$s',
|
||||
'UI:Document:NoPreview' => 'Nem elérhető előnézet ehhez a dokuemntumhoz',
|
||||
'UI:DeadlineMissedBy_duration' => 'Elmulsztva %1$s által',
|
||||
'UI:Deadline_LessThan1Min' => '< 1 perc',
|
||||
'UI:Deadline_Minutes' => '%1$d perc',
|
||||
'UI:Deadline_Hours_Minutes' => '%1$dóra %2$dperc',
|
||||
'UI:Deadline_Days_Hours_Minutes' => '%1$nap %2$dóra %3$dperc',
|
||||
'UI:Help' => 'Segítség',
|
||||
'UI:PasswordConfirm' => '(Jóváhagyás)',
|
||||
'UI:BeforeAdding_Class_ObjectsSaveThisObject' => '%1$s objektumok hozzáadása előtt mentse ezt az objektumot',
|
||||
'UI:DisplayThisMessageAtStartup' => 'Az üzenet megjelenítése indításkor',
|
||||
'UI:RelationshipGraph' => 'Grafikus nézet',
|
||||
'UI:RelationshipList' => 'Lista',
|
||||
'UI:OperationCancelled' => 'Művelet visszavonva',
|
||||
'Portal:Title' => 'iTop felhasználói portál',
|
||||
'Portal:Refresh' => 'Frissítés',
|
||||
'Portal:Back' => 'Vissza',
|
||||
'Portal:CreateNewRequest' => 'Új kérés létrehozása',
|
||||
'Portal:ChangeMyPassword' => 'Jelszó változtatás',
|
||||
'Portal:Disconnect' => 'Kilépés',
|
||||
'Portal:OpenRequests' => 'Nyitott kéréseim',
|
||||
'Portal:ResolvedRequests' => 'Megoldott kéréseim',
|
||||
'Portal:SelectService' => 'Válasszon szolgáltatást a katalógusból:',
|
||||
'Portal:PleaseSelectOneService' => 'Kérem válasszon egy szolgáltatást',
|
||||
'Portal:SelectSubcategoryFrom_Service' => 'Válassza ki a %1$s szolgáltatás alkategóriáját:',
|
||||
'Portal:PleaseSelectAServiceSubCategory' => 'Kérem válasszon egy alkategóriát',
|
||||
'Portal:DescriptionOfTheRequest' => 'Adja meg a kérés leírásást:',
|
||||
'Portal:TitleRequestDetailsFor_Request' => '%1$s kérés részletei:',
|
||||
'Portal:NoOpenRequest' => 'A kategóriához nem tartozik nyitott kérés.',
|
||||
'Portal:Button:CloseTicket' => 'Hibajegy lezárása',
|
||||
'Portal:EnterYourCommentsOnTicket' => 'Adjon megjegyzést a megoldáshoz:',
|
||||
'Portal:ErrorNoContactForThisUser' => 'Hiba: az aktuális felhasználó nem tartozik egyetlen Kapcsolattartóhoz / Szemályhez sem. Kérem vegye felk a kapcsolatot az adminisztrátorral.',
|
||||
'Portal:Attachments' => 'Csatolmányok',
|
||||
'Portal:AddAttachment' => 'Csatolmány hozzáadása',
|
||||
'Portal:RemoveAttachment' => 'Csatolmány eltávolítása',
|
||||
'Portal:Attachment_No_To_Ticket_Name' => 'Csatolmányok: #%1$d a %2$s (%3$s) hibajegyhez',
|
||||
'Enum:Undefined' => 'Nem meghatározott',
|
||||
'UI:DurationForm_Days_Hours_Minutes_Seconds' => '%1$s nap %2$s óra %3$s perc %4$s másodperc',
|
||||
'UI:ModifyAllPageTitle' => 'Összes módosítása',
|
||||
'UI:Modify_N_ObjectsOf_Class' => '%2$s osztály %1$d objketumainak módosítása',
|
||||
'UI:Modify_M_ObjectsOf_Class_OutOf_N' => '%2$s osztály %1$d objektumának módosítása, kivéve: %3$d',
|
||||
'UI:Menu:ModifyAll' => 'Módosítás...',
|
||||
'UI:Button:ModifyAll' => 'Összes módosítása',
|
||||
'UI:Button:PreviewModifications' => 'Módosítások előnézete >>',
|
||||
'UI:ModifiedObject' => 'Objektum módosítva',
|
||||
'UI:BulkModifyStatus' => 'Művelet',
|
||||
'UI:BulkModifyStatus+' => '',
|
||||
'UI:BulkModifyErrors' => 'Hibák (ha vannak)',
|
||||
'UI:BulkModifyErrors+' => '',
|
||||
'UI:BulkModifyStatusOk' => 'OK',
|
||||
'UI:BulkModifyStatusError' => 'Hiba',
|
||||
'UI:BulkModifyStatusModified' => 'Módosítva',
|
||||
'UI:BulkModifyStatusSkipped' => 'Átugorva',
|
||||
'UI:BulkModify_Count_DistinctValues' => '%1$d eltérő értékek:',
|
||||
'UI:BulkModify:Value_Exists_N_Times' => '%1$s *, %2$d *',
|
||||
'UI:BulkModify:N_MoreValues' => '%1$d további értékei ...',
|
||||
'UI:AttemptingToSetAReadOnlyAttribute_Name' => 'Kísérlet a következő csak olvaható mező beállítására: %1$s',
|
||||
'UI:FailedToApplyStimuli' => 'A művelet sikertelen',
|
||||
'UI:StimulusModify_N_ObjectsOf_Class' => '%1$s: %3$s osztály %2$d objketumainak módosítása',
|
||||
'UI:CaseLogTypeYourTextHere' => 'Írjon ide:',
|
||||
'UI:CaseLog:DateFormat' => 'Y-m-d H:i:s',
|
||||
'UI:CaseLog:Header_Date_UserName' => '%1$s - %2$s:',
|
||||
'UI:CaseLog:InitialValue' => 'Kezdeti érték:',
|
||||
'UI:AttemptingToSetASlaveAttribute_Name' => '%1$s mező nem írható, mert a szinkronizációnál használt kulcs. Érték nem lett beállítva.',
|
||||
'UI:ActionNotAllowed' => 'Ennek a műveletnek a végrehajtása nem engedélyezett ezen az objektumon.',
|
||||
'UI:BulkAction:NoObjectSelected' => 'Válasszon ki legalább egy objketumot a művelet végrehajtásához',
|
||||
'UI:AttemptingToChangeASlaveAttribute_Name' => '%1$s mező nem írható, mert a szinkronizációnál használt kulcs. Érték változatlan maradt.',
|
||||
));
|
||||
?>
|
||||
485
dictionaries/it.dictionary.itop.core.php
Normal file
485
dictionaries/it.dictionary.itop.core.php
Normal file
@@ -0,0 +1,485 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('IT IT', 'Italian', 'Italiano', array(
|
||||
'Class:ActionEmail' => 'E-mail di notifica',
|
||||
'Class:ActionEmail+' => '',
|
||||
'Class:ActionEmail/Attribute:test_recipient' => 'Test destinatario',
|
||||
'Class:ActionEmail/Attribute:test_recipient+' => '',
|
||||
'Class:ActionEmail/Attribute:from' => 'Da',
|
||||
'Class:ActionEmail/Attribute:from+' => '',
|
||||
'Class:ActionEmail/Attribute:reply_to' => 'Rispondi A',
|
||||
'Class:ActionEmail/Attribute:reply_to+' => '',
|
||||
'Class:ActionEmail/Attribute:to' => 'A',
|
||||
'Class:ActionEmail/Attribute:to+' => '',
|
||||
'Class:ActionEmail/Attribute:cc' => 'Cc',
|
||||
'Class:ActionEmail/Attribute:cc+' => '',
|
||||
'Class:ActionEmail/Attribute:bcc' => 'BCC',
|
||||
'Class:ActionEmail/Attribute:bcc+' => '',
|
||||
'Class:ActionEmail/Attribute:subject' => 'Oggetto',
|
||||
'Class:ActionEmail/Attribute:subject+' => '',
|
||||
'Class:ActionEmail/Attribute:body' => 'corpo',
|
||||
'Class:ActionEmail/Attribute:body+' => '',
|
||||
'Class:ActionEmail/Attribute:importance' => 'priorità',
|
||||
'Class:ActionEmail/Attribute:importance+' => '',
|
||||
'Class:ActionEmail/Attribute:importance/Value:high' => 'alta',
|
||||
'Class:ActionEmail/Attribute:importance/Value:high+' => '',
|
||||
'Class:ActionEmail/Attribute:importance/Value:low' => 'bassa',
|
||||
'Class:ActionEmail/Attribute:importance/Value:low+' => '',
|
||||
'Class:ActionEmail/Attribute:importance/Value:normal' => 'normake',
|
||||
'Class:ActionEmail/Attribute:importance/Value:normal+' => '',
|
||||
'Class:TriggerOnStateEnter' => 'Trigger (sull\'entrare in uno stato)',
|
||||
'Class:TriggerOnStateEnter+' => '',
|
||||
'Class:TriggerOnStateLeave' => 'Trigger (sul lasciare uno stato)~~',
|
||||
'Class:TriggerOnStateLeave+' => '',
|
||||
'Class:TriggerOnObjectCreate' => 'Trigger (sulla creazione di un oggetto)~~',
|
||||
'Class:TriggerOnObjectCreate+' => '',
|
||||
'Class:lnkTriggerAction' => 'Azione/Trigger~~',
|
||||
'Class:lnkTriggerAction+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:action_id' => 'Azione',
|
||||
'Class:lnkTriggerAction/Attribute:action_id+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_id' => 'Trigger',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:order' => 'Ordine',
|
||||
'Class:lnkTriggerAction/Attribute:order+' => '',
|
||||
'Class:AsyncSendEmail' => 'Email (asincrona)',
|
||||
'Class:AsyncSendEmail/Attribute:to' => 'A',
|
||||
'Class:AsyncSendEmail/Attribute:subject' => 'Oggetto',
|
||||
'Class:AsyncSendEmail/Attribute:body' => 'Corpo',
|
||||
'Class:AsyncSendEmail/Attribute:header' => 'Intestazione',
|
||||
'Class:CMDBChange' => 'Cambio',
|
||||
'Class:CMDBChange+' => '',
|
||||
'Class:CMDBChange/Attribute:date' => 'data',
|
||||
'Class:CMDBChange/Attribute:date+' => '',
|
||||
'Class:CMDBChange/Attribute:userinfo' => 'info varie',
|
||||
'Class:CMDBChange/Attribute:userinfo+' => '',
|
||||
'Class:CMDBChangeOp' => 'Operazione di Cambio',
|
||||
'Class:CMDBChangeOp+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:change' => 'cambio',
|
||||
'Class:CMDBChangeOp/Attribute:change+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:objclass' => 'oggetto della classe',
|
||||
'Class:CMDBChangeOp/Attribute:objclass+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:objkey' => 'oggetto id',
|
||||
'Class:CMDBChangeOp/Attribute:objkey+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:finalclass' => 'tipo',
|
||||
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
|
||||
'Class:CMDBChangeOpCreate' => 'creazione dell\'oggetto',
|
||||
'Class:CMDBChangeOpCreate+' => '',
|
||||
'Class:CMDBChangeOpDelete' => 'cancellazione dell\'oggetto',
|
||||
'Class:CMDBChangeOpDelete+' => '',
|
||||
'Class:CMDBChangeOpSetAttribute' => 'cambio dell\'oggetto',
|
||||
'Class:CMDBChangeOpSetAttribute+' => '',
|
||||
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => 'Attributo',
|
||||
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeScalar' => 'cambio della proprietà',
|
||||
'Class:CMDBChangeOpSetAttributeScalar+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'Valore precedente',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'Valore Nuovo',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeBlob' => 'modifica i dati',
|
||||
'Class:CMDBChangeOpSetAttributeBlob+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'Dati precedenti',
|
||||
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Password criptata',
|
||||
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Valore Precedente',
|
||||
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Encrypted Field~~',
|
||||
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Valore Precedente',
|
||||
'Class:CMDBChangeOpSetAttributeText' => 'modifica testo',
|
||||
'Class:CMDBChangeOpSetAttributeText+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Dati precendenti',
|
||||
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Log dei casi',
|
||||
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Ultima entrata',
|
||||
'Class:Event' => 'Log dell\'evento',
|
||||
'Class:Event+' => '',
|
||||
'Class:Event/Attribute:message' => 'Messaggio',
|
||||
'Class:Event/Attribute:message+' => '',
|
||||
'Class:Event/Attribute:date' => 'Data',
|
||||
'Class:Event/Attribute:date+' => '',
|
||||
'Class:Event/Attribute:userinfo' => 'Info Utente',
|
||||
'Class:Event/Attribute:userinfo+' => '',
|
||||
'Class:Event/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Event/Attribute:finalclass+' => '',
|
||||
'Class:EventNotification' => 'Notifica dell\'evento',
|
||||
'Class:EventNotification+' => '',
|
||||
'Class:EventNotification/Attribute:trigger_id' => 'Trigger',
|
||||
'Class:EventNotification/Attribute:trigger_id+' => '',
|
||||
'Class:EventNotification/Attribute:action_id' => 'utente',
|
||||
'Class:EventNotification/Attribute:action_id+' => '',
|
||||
'Class:EventNotification/Attribute:object_id' => 'Oggetto id',
|
||||
'Class:EventNotification/Attribute:object_id+' => '',
|
||||
'Class:EventNotificationEmail' => 'Email caso di emissione',
|
||||
'Class:EventNotificationEmail+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:to' => 'A',
|
||||
'Class:EventNotificationEmail/Attribute:to+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:cc' => 'CC',
|
||||
'Class:EventNotificationEmail/Attribute:cc+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:bcc' => 'BCC',
|
||||
'Class:EventNotificationEmail/Attribute:bcc+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:from' => 'Da',
|
||||
'Class:EventNotificationEmail/Attribute:from+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:subject' => 'Oggeto',
|
||||
'Class:EventNotificationEmail/Attribute:subject+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:body' => 'Corpo',
|
||||
'Class:EventNotificationEmail/Attribute:body+' => '',
|
||||
'Class:EventIssue' => 'Evento Problema',
|
||||
'Class:EventIssue+' => '',
|
||||
'Class:EventIssue/Attribute:issue' => 'Problema',
|
||||
'Class:EventIssue/Attribute:issue+' => '',
|
||||
'Class:EventIssue/Attribute:impact' => 'Impatto',
|
||||
'Class:EventIssue/Attribute:impact+' => '',
|
||||
'Class:EventIssue/Attribute:page' => 'Pagina',
|
||||
'Class:EventIssue/Attribute:page+' => '',
|
||||
'Class:EventIssue/Attribute:arguments_post' => 'Argomenti inviati',
|
||||
'Class:EventIssue/Attribute:arguments_post+' => '',
|
||||
'Class:EventIssue/Attribute:arguments_get' => 'Argomenti URL',
|
||||
'Class:EventIssue/Attribute:arguments_get+' => '',
|
||||
'Class:EventIssue/Attribute:callstack' => 'Callstack',
|
||||
'Class:EventIssue/Attribute:callstack+' => '',
|
||||
'Class:EventIssue/Attribute:data' => 'Dati',
|
||||
'Class:EventIssue/Attribute:data+' => '',
|
||||
'Class:EventWebService' => 'Evento Servizio Web',
|
||||
'Class:EventWebService+' => '',
|
||||
'Class:EventWebService/Attribute:verb' => 'Verbo',
|
||||
'Class:EventWebService/Attribute:verb+' => '',
|
||||
'Class:EventWebService/Attribute:result' => 'Resulto',
|
||||
'Class:EventWebService/Attribute:result+' => '',
|
||||
'Class:EventWebService/Attribute:log_info' => 'Log delle info',
|
||||
'Class:EventWebService/Attribute:log_info+' => '',
|
||||
'Class:EventWebService/Attribute:log_warning' => 'Log dei warning',
|
||||
'Class:EventWebService/Attribute:log_warning+' => '',
|
||||
'Class:EventWebService/Attribute:log_error' => 'Log degli errori',
|
||||
'Class:EventWebService/Attribute:log_error+' => '',
|
||||
'Class:EventWebService/Attribute:data' => 'Dati',
|
||||
'Class:EventWebService/Attribute:data+' => '',
|
||||
'Class:EventLoginUsage' => 'Login di utilizzo',
|
||||
'Class:EventLoginUsage+' => '',
|
||||
'Class:EventLoginUsage/Attribute:user_id' => 'Login',
|
||||
'Class:EventLoginUsage/Attribute:user_id+' => '',
|
||||
'Class:SynchroDataSource' => 'Sorgente di sincronizzazione dei dati',
|
||||
'Class:SynchroDataSource/Attribute:name' => 'Nome',
|
||||
'Class:SynchroDataSource/Attribute:name+' => '',
|
||||
'Class:SynchroDataSource/Attribute:description' => 'Descrizione',
|
||||
'Class:SynchroDataSource/Attribute:status' => 'Stato',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implementazione',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsoleto',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Produzione',
|
||||
'Class:SynchroDataSource/Attribute:user_id' => 'Utente',
|
||||
'Class:SynchroDataSource/Attribute:scope_class' => 'Classe Target',
|
||||
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Campo di applicazione restrizione',
|
||||
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Intervallo a pieno carico',
|
||||
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => '',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Policy di riconciliazione',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Usa gli attributi',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Usa il campo chiave primaria',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Azione su zero~~',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Crea',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Errore',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one' => 'Azione su uno',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Error',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Aggiorna',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Azione su molti',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Crea',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Errore',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Considera il primo (random?)',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy' => 'Policy di cancellazioen',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Cancella',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignora',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Aggiorna',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Aggiorna e poi Cancella',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Regole per l\'aggiornamento',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_update+' => '',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Durata di conservazione',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => '',
|
||||
'Class:SynchroDataSource/Attribute:attribute_list' => 'Lista degli attributi',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'utenti autorizzati',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy+' => '',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Solo Amministratore',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Tutti sono autorizzati a cancellare questi oggetti',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Nessuno',
|
||||
'Class:SynchroDataSource/Attribute:url_icon' => 'Icona di collegamento ipertestuale',
|
||||
'Class:SynchroDataSource/Attribute:url_icon+' => '',
|
||||
'Class:SynchroDataSource/Attribute:url_application' => 'Collegamento ipertestuale all\'applicazione',
|
||||
'Class:SynchroDataSource/Attribute:url_application+' => '',
|
||||
'Class:SynchroAttribute' => 'Attributo di sincronizzazione',
|
||||
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Sorgente sincronizzazione dati',
|
||||
'Class:SynchroAttribute/Attribute:attcode' => 'Codice attributo',
|
||||
'Class:SynchroAttribute/Attribute:update' => 'Aggiorna',
|
||||
'Class:SynchroAttribute/Attribute:reconcile' => 'Rincocilia',
|
||||
'Class:SynchroAttribute/Attribute:update_policy' => 'Policy di aggiornamento',
|
||||
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'Bloccato',
|
||||
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'Sbloccato',
|
||||
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Inizializza se vuoto',
|
||||
'Class:SynchroAttribute/Attribute:finalclass' => 'Classe',
|
||||
'Class:SynchroAttExtKey' => 'Attributo di sincronizzazione (ExtKey)',
|
||||
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Attributo di riconciliazione',
|
||||
'Class:SynchroAttLinkSet' => 'Attributo di sincronizzazione (Linkset)',
|
||||
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Separatore di righe',
|
||||
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Separatore di attributi',
|
||||
'Class:SynchroLog' => 'Log di sincronizzazione',
|
||||
'Class:SynchroLog/Attribute:sync_source_id' => 'Sorgente di sincronizzazione dati',
|
||||
'Class:SynchroLog/Attribute:start_date' => 'Data di inizio',
|
||||
'Class:SynchroLog/Attribute:end_date' => 'Data di fine',
|
||||
'Class:SynchroLog/Attribute:status' => 'Stato',
|
||||
'Class:SynchroLog/Attribute:status/Value:completed' => 'Completo',
|
||||
'Class:SynchroLog/Attribute:status/Value:error' => 'Errore',
|
||||
'Class:SynchroLog/Attribute:status/Value:running' => 'Ancora in esecuzione',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nb replica viste',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nb replica totale',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nb oggetti cancellati',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nb di errore durante la cancellazione',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nb oggetti obsoleti',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nb di errori mentre obsoleta',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nb oggetti creati',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nb di errori durante la creazione',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nb oggetti aggiornati',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nb di errori durante l\'aggiornamento',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nb di errori durante la riconcilazione',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nb repliche scomparse',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nb oggetti aggiornati',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nb oggetti non modificati',
|
||||
'Class:SynchroLog/Attribute:last_error' => 'Untimo errore',
|
||||
'Class:SynchroLog/Attribute:traces' => 'Tracce',
|
||||
'Class:SynchroReplica' => 'Replica sincronizzazione',
|
||||
'Class:SynchroReplica/Attribute:sync_source_id' => 'Sorgente di sincronizzazione dati',
|
||||
'Class:SynchroReplica/Attribute:dest_id' => 'Oggetto di destinazione (ID)~~',
|
||||
'Class:SynchroReplica/Attribute:dest_class' => 'Tipo di destinazione',
|
||||
'Class:SynchroReplica/Attribute:status_last_seen' => 'Ultimo visto',
|
||||
'Class:SynchroReplica/Attribute:status' => 'Stato',
|
||||
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modificato',
|
||||
'Class:SynchroReplica/Attribute:status/Value:new' => 'Nuovo',
|
||||
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Obsoleto',
|
||||
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Orfano',
|
||||
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Sincronizzato',
|
||||
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Oggetto Creato ?',
|
||||
'Class:SynchroReplica/Attribute:status_last_error' => 'Ultimo Errore',
|
||||
'Class:SynchroReplica/Attribute:info_creation_date' => 'Data di creazione',
|
||||
'Class:SynchroReplica/Attribute:info_last_modified' => 'Data ultima modifica',
|
||||
'Class:appUserPreferences' => 'Preferenze utente',
|
||||
'Class:appUserPreferences/Attribute:userid' => 'Utente',
|
||||
'Class:appUserPreferences/Attribute:preferences' => 'Preferenze',
|
||||
'Core:AttributeLinkedSet' => 'Array di oggetti',
|
||||
'Core:AttributeLinkedSet+' => '',
|
||||
'Core:AttributeLinkedSetIndirect' => 'Array di oggetti (N-N)',
|
||||
'Core:AttributeLinkedSetIndirect+' => '',
|
||||
'Core:AttributeInteger' => 'Integero',
|
||||
'Core:AttributeInteger+' => '',
|
||||
'Core:AttributeDecimal' => 'Decimale',
|
||||
'Core:AttributeDecimal+' => '',
|
||||
'Core:AttributeBoolean' => 'Booleano',
|
||||
'Core:AttributeBoolean+' => '',
|
||||
'Core:AttributeString' => 'Stringa',
|
||||
'Core:AttributeString+' => '',
|
||||
'Core:AttributeClass' => 'Classe',
|
||||
'Core:AttributeClass+' => '',
|
||||
'Core:AttributeApplicationLanguage' => 'Linguaggio Utente',
|
||||
'Core:AttributeApplicationLanguage+' => '',
|
||||
'Core:AttributeFinalClass' => 'Classe (auto)',
|
||||
'Core:AttributeFinalClass+' => '',
|
||||
'Core:AttributePassword' => 'Password',
|
||||
'Core:AttributePassword+' => '',
|
||||
'Core:AttributeEncryptedString' => 'Stringa criptata',
|
||||
'Core:AttributeEncryptedString+' => '',
|
||||
'Core:AttributeText' => 'Testo',
|
||||
'Core:AttributeText+' => '',
|
||||
'Core:AttributeHTML' => 'HTML',
|
||||
'Core:AttributeHTML+' => '',
|
||||
'Core:AttributeEmailAddress' => 'Indirizzo Email',
|
||||
'Core:AttributeEmailAddress+' => '',
|
||||
'Core:AttributeIPAddress' => 'Indirizzo IP',
|
||||
'Core:AttributeIPAddress+' => '',
|
||||
'Core:AttributeOQL' => 'OQL',
|
||||
'Core:AttributeOQL+' => '',
|
||||
'Core:AttributeEnum' => 'Enum',
|
||||
'Core:AttributeEnum+' => '',
|
||||
'Core:AttributeTemplateString' => 'Stringa Template',
|
||||
'Core:AttributeTemplateString+' => '',
|
||||
'Core:AttributeTemplateText' => 'Testo Template',
|
||||
'Core:AttributeTemplateText+' => '',
|
||||
'Core:AttributeTemplateHTML' => 'HTML Template',
|
||||
'Core:AttributeTemplateHTML+' => '',
|
||||
'Core:AttributeDateTime' => 'Data/ora',
|
||||
'Core:AttributeDateTime+' => '',
|
||||
'Core:AttributeDate' => 'Data',
|
||||
'Core:AttributeDate+' => '',
|
||||
'Core:AttributeDeadline' => 'Scadenza',
|
||||
'Core:AttributeDeadline+' => '',
|
||||
'Core:AttributeExternalKey' => 'Chiave esterna',
|
||||
'Core:AttributeExternalKey+' => '',
|
||||
'Core:AttributeExternalField' => 'Campo esterno',
|
||||
'Core:AttributeExternalField+' => '',
|
||||
'Core:AttributeURL' => 'URL',
|
||||
'Core:AttributeURL+' => '',
|
||||
'Core:AttributeBlob' => 'Blob',
|
||||
'Core:AttributeBlob+' => '',
|
||||
'Core:AttributeOneWayPassword' => 'Password unidierzionale',
|
||||
'Core:AttributeOneWayPassword+' => '',
|
||||
'Core:AttributeTable' => 'Tabella',
|
||||
'Core:AttributeTable+' => '',
|
||||
'Core:AttributePropertySet' => 'Proprietà',
|
||||
'Core:AttributePropertySet+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:date' => 'data',
|
||||
'Class:CMDBChangeOp/Attribute:date+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:userinfo' => 'utente',
|
||||
'Class:CMDBChangeOp/Attribute:userinfo+' => '',
|
||||
'Change:ObjectCreated' => 'Oggetto creato',
|
||||
'Change:ObjectDeleted' => 'Oggetto cancellato',
|
||||
'Change:ObjectModified' => 'Object modificato',
|
||||
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s imposatato a %2$s (valore precendente: %3$s)',
|
||||
'Change:AttName_SetTo' => '%1$s impostato a %2$s~~',
|
||||
'Change:Text_AppendedTo_AttName' => '%1$s allegato a %2$s~~',
|
||||
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s moficato, valore precendente: %2$s',
|
||||
'Change:AttName_Changed' => '%1$s modificato',
|
||||
'Change:AttName_EntryAdded' => '%1$s modificato, nuova entrata aggiunta.',
|
||||
'Class:EventLoginUsage/Attribute:contact_name' => 'Nome Utente',
|
||||
'Class:EventLoginUsage/Attribute:contact_name+' => '',
|
||||
'Class:EventLoginUsage/Attribute:contact_email' => 'Email Utente',
|
||||
'Class:EventLoginUsage/Attribute:contact_email+' => '',
|
||||
'Class:Action' => 'Azione personalizzata',
|
||||
'Class:Action+' => '',
|
||||
'Class:Action/Attribute:name' => 'Nome',
|
||||
'Class:Action/Attribute:name+' => '',
|
||||
'Class:Action/Attribute:description' => 'Descrizione',
|
||||
'Class:Action/Attribute:description+' => '',
|
||||
'Class:Action/Attribute:status' => 'Stato',
|
||||
'Class:Action/Attribute:status+' => '',
|
||||
'Class:Action/Attribute:status/Value:test' => 'In fase di test',
|
||||
'Class:Action/Attribute:status/Value:test+' => '',
|
||||
'Class:Action/Attribute:status/Value:enabled' => 'In produzione',
|
||||
'Class:Action/Attribute:status/Value:enabled+' => '',
|
||||
'Class:Action/Attribute:status/Value:disabled' => 'Inattivo',
|
||||
'Class:Action/Attribute:status/Value:disabled+' => '',
|
||||
'Class:Action/Attribute:trigger_list' => 'Trigger Correlati',
|
||||
'Class:Action/Attribute:trigger_list+' => '',
|
||||
'Class:Action/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Action/Attribute:finalclass+' => '',
|
||||
'Class:ActionNotification' => 'Notifica',
|
||||
'Class:ActionNotification+' => '',
|
||||
'Class:Trigger' => 'Trigger',
|
||||
'Class:Trigger+' => '',
|
||||
'Class:Trigger/Attribute:description' => 'Descrizione',
|
||||
'Class:Trigger/Attribute:description+' => '',
|
||||
'Class:Trigger/Attribute:action_list' => 'Azioni Triggerate',
|
||||
'Class:Trigger/Attribute:action_list+' => '',
|
||||
'Class:Trigger/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Trigger/Attribute:finalclass+' => '',
|
||||
'Class:TriggerOnObject' => 'Trigger (classe dipendente)',
|
||||
'Class:TriggerOnObject+' => '',
|
||||
'Class:TriggerOnObject/Attribute:target_class' => 'Classe Target',
|
||||
'Class:TriggerOnObject/Attribute:target_class+' => '',
|
||||
'Class:TriggerOnStateChange' => 'Trigger (sul cambio di stato)',
|
||||
'Class:TriggerOnStateChange+' => '',
|
||||
'Class:TriggerOnStateChange/Attribute:state' => 'Stato',
|
||||
'Class:TriggerOnStateChange/Attribute:state+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:action_name' => 'Azione',
|
||||
'Class:lnkTriggerAction/Attribute:action_name+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_name' => 'Trigger',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Nessuno',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Solo Amministratore',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'Tutti gli utenti autorizzati',
|
||||
'SynchroDataSource:Description' => 'Descrizione',
|
||||
'SynchroDataSource:Reconciliation' => 'Ricerca & riconciliazione',
|
||||
'SynchroDataSource:Deletion' => 'Regole di cancellazione',
|
||||
'SynchroDataSource:Status' => 'Stato',
|
||||
'SynchroDataSource:Information' => 'Informazione',
|
||||
'SynchroDataSource:Definition' => 'Definizione',
|
||||
'Core:SynchroAttributes' => 'Attributi',
|
||||
'Core:SynchroStatus' => 'Stato',
|
||||
'Core:Synchro:ErrorsLabel' => 'Errori',
|
||||
'Core:Synchro:CreatedLabel' => 'Creato',
|
||||
'Core:Synchro:ModifiedLabel' => 'Modificato',
|
||||
'Core:Synchro:UnchangedLabel' => 'Non modificato',
|
||||
'Core:Synchro:ReconciledErrorsLabel' => 'Errori',
|
||||
'Core:Synchro:ReconciledLabel' => 'Reconciliato',
|
||||
'Core:Synchro:ReconciledNewLabel' => 'Creato',
|
||||
'Core:SynchroReconcile:Yes' => 'Si',
|
||||
'Core:SynchroReconcile:No' => 'No',
|
||||
'Core:SynchroUpdate:Yes' => 'Si',
|
||||
'Core:SynchroUpdate:No' => 'No',
|
||||
'Core:Synchro:LastestStatus' => 'Ultimo stato',
|
||||
'Core:Synchro:History' => 'Storia della sincronizzazione',
|
||||
'Core:Synchro:NeverRun' => 'Questa sincronizzazione non è mai stata eseguita. Nessun Log ancora...',
|
||||
'Core:Synchro:SynchroEndedOn_Date' => 'L\'ultima sincronizzazione si è conclusa il %1$s.~~',
|
||||
'Core:Synchro:SynchroRunningStartedOn_Date' => 'La sincronizzazione è iniziata il $1$s è ancora in esecuzione...~~',
|
||||
'Menu:DataSources' => 'Sorgente di sincronizzazione dei dati',
|
||||
'Menu:DataSources+' => '',
|
||||
'Core:Synchro:label_repl_ignored' => 'Ignorato(%1$s)',
|
||||
'Core:Synchro:label_repl_disappeared' => 'Scomparso (%1$s)',
|
||||
'Core:Synchro:label_repl_existing' => 'Esistente (%1$s)',
|
||||
'Core:Synchro:label_repl_new' => 'Nuovo (%1$s)~~',
|
||||
'Core:Synchro:label_obj_deleted' => 'Cancellato (%1$s)',
|
||||
'Core:Synchro:label_obj_obsoleted' => 'Obsoleto (%1$s)',
|
||||
'Core:Synchro:label_obj_disappeared_errors' => 'Errori (%1$s)',
|
||||
'Core:Synchro:label_obj_disappeared_no_action' => 'Nessuna Azione (%1$s)',
|
||||
'Core:Synchro:label_obj_unchanged' => 'Non modificato(%1$s)',
|
||||
'Core:Synchro:label_obj_updated' => 'Aggiornato (%1$s)',
|
||||
'Core:Synchro:label_obj_updated_errors' => 'Errori (%1$s)',
|
||||
'Core:Synchro:label_obj_new_unchanged' => 'Non modificato (%1$s)',
|
||||
'Core:Synchro:label_obj_new_updated' => 'Aggiornato (%1$s)',
|
||||
'Core:Synchro:label_obj_created' => 'Creato (%1$s)',
|
||||
'Core:Synchro:label_obj_new_errors' => 'Errori (%1$s)',
|
||||
'Core:SynchroLogTitle' => '%1$s - %2$s~~',
|
||||
'Core:Synchro:Nb_Replica' => 'Replica processata: %1$s',
|
||||
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
|
||||
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Almeno una chiave riconciliazione deve essere specificata, o la policy di conciliazione deve essere quella di utilizzare la chiave primaria',
|
||||
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'Deve essere specificato un periodo di conservazione di cancellazione , dato che gli oggetti devono essere eliminati dopo essere contrassegnati come obsoleti ',
|
||||
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Oggetti obsoleti devono essere aggiornati, ma nessun aggiornamento è specificato',
|
||||
'Core:SynchroReplica:PublicData' => 'Dati Pubblici',
|
||||
'Core:SynchroReplica:PrivateDetails' => 'Dettagli Privati',
|
||||
'Core:SynchroReplica:BackToDataSource' => 'Torna indietro alla sorgente di sincronizzazione dei dati: %1$s~~',
|
||||
'Core:SynchroReplica:ListOfReplicas' => 'Lista della Replica',
|
||||
'Core:SynchroAttExtKey:ReconciliationById' => 'id (Chiave Primaria)',
|
||||
'Core:SynchroAtt:attcode' => 'Attributo',
|
||||
'Core:SynchroAtt:attcode+' => '',
|
||||
'Core:SynchroAtt:reconciliation' => 'Riconciliazione ?~~',
|
||||
'Core:SynchroAtt:reconciliation+' => '',
|
||||
'Core:SynchroAtt:update' => 'Aggiornamento ?~~',
|
||||
'Core:SynchroAtt:update+' => '',
|
||||
'Core:SynchroAtt:update_policy' => 'Policy di aggiornamento',
|
||||
'Core:SynchroAtt:update_policy+' => '',
|
||||
'Core:SynchroAtt:reconciliation_attcode' => 'Chiave di riconciliazione',
|
||||
'Core:SynchroAtt:reconciliation_attcode+' => '',
|
||||
'Core:SyncDataExchangeComment' => '(Scambio dati)',
|
||||
'Core:Synchro:ListOfDataSources' => 'Lista delle sorgenti di dati:',
|
||||
'Core:Synchro:LastSynchro' => 'Ultima sincronizzazione:',
|
||||
'Core:Synchro:ThisObjectIsSynchronized' => 'Questo oggetto è sincronizzato con una sorgente esterna di dati',
|
||||
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'L\'oggetti è stato <b>creato</b> da una sorgente esterna di dati %1$s~~',
|
||||
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'L\'oggetti <b>può essere cancellato</b> da una sorgente esterna di dati %1$s~~',
|
||||
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'Tu <b>non puoi cancellare l\'oggetto</b> perché è di proprietà della sorgente dati esterna %1$s~~',
|
||||
'TitleSynchroExecution' => 'Esecuzione della sincronizzazione',
|
||||
'Class:SynchroDataSource:DataTable' => 'Tabella del database: %1$s',
|
||||
'Core:SyncDataSourceObsolete' => 'La fonte dei dati è contrassegnata come obsoleta. Operazione annullata',
|
||||
'Core:SyncDataSourceAccessRestriction' => 'Solo amministratori o l\'utente specificato nella fonte dei dati può eseguire questa operazione. Operazione annullata',
|
||||
'Core:SyncTooManyMissingReplicas' => 'Tutte le repliche sono mancanti dall\'importazione. Hai eseguito realmente l\'importazione? Operazione annullata',
|
||||
'Core:Duration_Seconds' => '%1$ds',
|
||||
'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds',
|
||||
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$sec~~',
|
||||
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sg %2$dh %3$dmin %4$ds~~',
|
||||
));
|
||||
?>
|
||||
773
dictionaries/it.dictionary.itop.ui.php
Normal file
773
dictionaries/it.dictionary.itop.ui.php
Normal file
@@ -0,0 +1,773 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('IT IT', 'Italian', 'Italiano', array(
|
||||
'Class:AuditRule' => 'Regola di Audit',
|
||||
'Class:AuditRule+' => '',
|
||||
'Class:AuditRule/Attribute:name' => 'Nome della regola',
|
||||
'Class:AuditRule/Attribute:name+' => '',
|
||||
'Class:AuditRule/Attribute:description' => 'Descrizione della regola di Audit',
|
||||
'Class:AuditRule/Attribute:description+' => '',
|
||||
'Class:AuditRule/Attribute:query' => 'Query da eseguire',
|
||||
'Class:AuditRule/Attribute:query+' => '',
|
||||
'Class:AuditRule/Attribute:valid_flag' => 'Oggetti validi?',
|
||||
'Class:AuditRule/Attribute:valid_flag+' => '',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:false' => 'falso',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:false+' => '',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:true' => 'vero',
|
||||
'Class:AuditRule/Attribute:valid_flag/Value:true+' => '',
|
||||
'Class:AuditRule/Attribute:category_id' => 'Categoria',
|
||||
'Class:AuditRule/Attribute:category_id+' => '',
|
||||
'Class:AuditCategory' => 'Categoria di Audit',
|
||||
'Class:AuditCategory+' => '',
|
||||
'Class:AuditCategory/Attribute:name' => 'Nome della Categoria',
|
||||
'Class:AuditCategory/Attribute:name+' => '',
|
||||
'Class:AuditCategory/Attribute:description' => 'Descrizione della Categoria di Audit',
|
||||
'Class:AuditCategory/Attribute:description+' => '',
|
||||
'Class:AuditCategory/Attribute:definition_set' => 'Insieme di definizione',
|
||||
'Class:AuditCategory/Attribute:definition_set+' => '',
|
||||
'Class:AuditCategory/Attribute:rules_list' => 'Regole di Audit',
|
||||
'Class:AuditCategory/Attribute:rules_list+' => '',
|
||||
'Class:URP_Profiles' => 'Profilo',
|
||||
'Class:URP_Profiles+' => '',
|
||||
'Class:URP_Profiles/Attribute:name' => 'Nome',
|
||||
'Class:URP_Profiles/Attribute:name+' => '',
|
||||
'Class:URP_Profiles/Attribute:description' => 'Descrizione',
|
||||
'Class:URP_Profiles/Attribute:description+' => '',
|
||||
'Class:URP_Profiles/Attribute:user_list' => 'Utenti',
|
||||
'Class:URP_Profiles/Attribute:user_list+' => '',
|
||||
'Class:URP_UserProfile' => 'Utente da Profilare',
|
||||
'Class:URP_UserProfile+' => '',
|
||||
'Class:URP_UserProfile/Attribute:userid' => 'Utente',
|
||||
'Class:URP_UserProfile/Attribute:userid+' => '',
|
||||
'Class:URP_UserProfile/Attribute:profileid' => 'Profilo',
|
||||
'Class:URP_UserProfile/Attribute:profileid+' => '',
|
||||
'Class:URP_UserProfile/Attribute:reason' => 'Motivo',
|
||||
'Class:URP_UserProfile/Attribute:reason+' => '',
|
||||
'Class:URP_UserOrg' => 'Organizzazione dell\'utente',
|
||||
'Class:URP_UserOrg+' => '',
|
||||
'Class:URP_UserOrg/Attribute:userid' => 'Utente',
|
||||
'Class:URP_UserOrg/Attribute:userid+' => '',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_id' => 'Organizazione',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_id+' => '',
|
||||
'Class:URP_UserOrg/Attribute:reason' => 'Motivo',
|
||||
'Class:URP_UserOrg/Attribute:reason+' => '',
|
||||
'Class:URP_ActionGrant' => 'azione_autorizzazione',
|
||||
'Class:URP_ActionGrant+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:profileid' => 'Profilo',
|
||||
'Class:URP_ActionGrant/Attribute:profileid+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:class' => 'Classe',
|
||||
'Class:URP_ActionGrant/Attribute:class+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:permission' => 'Autorizzazione',
|
||||
'Class:URP_ActionGrant/Attribute:permission+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:no' => 'no',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:no+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:yes' => 'yes',
|
||||
'Class:URP_ActionGrant/Attribute:permission/Value:yes+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:action' => 'Azione',
|
||||
'Class:URP_ActionGrant/Attribute:action+' => '',
|
||||
'Class:URP_StimulusGrant' => 'stimulus_autorizzazione',
|
||||
'Class:URP_StimulusGrant+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:profileid' => 'Profilo',
|
||||
'Class:URP_StimulusGrant/Attribute:profileid+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:class' => 'Classe',
|
||||
'Class:URP_StimulusGrant/Attribute:class+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:permission' => 'Autorizzazione',
|
||||
'Class:URP_StimulusGrant/Attribute:permission+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:no' => 'no',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:no+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:yes' => 'yes',
|
||||
'Class:URP_StimulusGrant/Attribute:permission/Value:yes+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:stimulus' => 'Stimulus',
|
||||
'Class:URP_StimulusGrant/Attribute:stimulus+' => '',
|
||||
'Class:URP_AttributeGrant' => 'attributo_autorizzazione',
|
||||
'Class:URP_AttributeGrant+' => '',
|
||||
'Class:URP_AttributeGrant/Attribute:actiongrantid' => 'Azione di sovvenzione',
|
||||
'Class:URP_AttributeGrant/Attribute:actiongrantid+' => '',
|
||||
'Class:URP_AttributeGrant/Attribute:attcode' => 'Attributo',
|
||||
'Class:URP_AttributeGrant/Attribute:attcode+' => '',
|
||||
'Class:AuditRule/Attribute:category_name' => 'Categoria',
|
||||
'Class:AuditRule/Attribute:category_name+' => '',
|
||||
'Class:User' => 'User~~',
|
||||
'Class:User+' => '',
|
||||
'Class:User/Attribute:finalclass' => 'Tipo di account',
|
||||
'Class:User/Attribute:finalclass+' => '',
|
||||
'Class:User/Attribute:contactid' => 'Contatto (persona)',
|
||||
'Class:User/Attribute:contactid+' => '',
|
||||
'Class:User/Attribute:last_name' => 'Cognome',
|
||||
'Class:User/Attribute:last_name+' => '',
|
||||
'Class:User/Attribute:first_name' => 'Nome',
|
||||
'Class:User/Attribute:first_name+' => '',
|
||||
'Class:User/Attribute:email' => 'Email',
|
||||
'Class:User/Attribute:email+' => '',
|
||||
'Class:User/Attribute:login' => 'Login',
|
||||
'Class:User/Attribute:login+' => '',
|
||||
'Class:User/Attribute:language' => 'Lingua',
|
||||
'Class:User/Attribute:language+' => '',
|
||||
'Class:User/Attribute:language/Value:EN US' => 'Inglese',
|
||||
'Class:User/Attribute:language/Value:EN US+' => '',
|
||||
'Class:User/Attribute:language/Value:FR FR' => 'Francese',
|
||||
'Class:User/Attribute:language/Value:FR FR+' => '',
|
||||
'Class:User/Attribute:profile_list' => 'Profili',
|
||||
'Class:User/Attribute:profile_list+' => '',
|
||||
'Class:User/Attribute:allowed_org_list' => 'Organizzazioni autorizzate',
|
||||
'Class:User/Attribute:allowed_org_list+' => '',
|
||||
'Class:User/Error:LoginMustBeUnique' => 'Login deve essere unico - "%1s" è già utilizzato.~~',
|
||||
'Class:User/Error:AtLeastOneProfileIsNeeded' => 'Almeno un profilo deve essere assegnato a questo utente',
|
||||
'Class:URP_Dimensions' => 'dimensione',
|
||||
'Class:URP_Dimensions+' => '',
|
||||
'Class:URP_Dimensions/Attribute:name' => 'Nome',
|
||||
'Class:URP_Dimensions/Attribute:name+' => '',
|
||||
'Class:URP_Dimensions/Attribute:description' => 'Descrizione',
|
||||
'Class:URP_Dimensions/Attribute:description+' => '',
|
||||
'Class:URP_Dimensions/Attribute:type' => 'Tipo',
|
||||
'Class:URP_Dimensions/Attribute:type+' => '',
|
||||
'Class:URP_UserProfile/Attribute:userlogin' => 'Login',
|
||||
'Class:URP_UserProfile/Attribute:userlogin+' => '',
|
||||
'Class:URP_UserProfile/Attribute:profile' => 'Profilo',
|
||||
'Class:URP_UserProfile/Attribute:profile+' => '',
|
||||
'Class:URP_UserOrg/Attribute:userlogin' => 'Login',
|
||||
'Class:URP_UserOrg/Attribute:userlogin+' => '',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_name' => 'Organizazione',
|
||||
'Class:URP_UserOrg/Attribute:allowed_org_name+' => '',
|
||||
'Class:URP_ProfileProjection' => 'profilo_proiezione',
|
||||
'Class:URP_ProfileProjection+' => '',
|
||||
'Class:URP_ProfileProjection/Attribute:dimensionid' => 'Dimensione',
|
||||
'Class:URP_ProfileProjection/Attribute:dimensionid+' => '',
|
||||
'Class:URP_ProfileProjection/Attribute:dimension' => 'Dimensione',
|
||||
'Class:URP_ProfileProjection/Attribute:dimension+' => '',
|
||||
'Class:URP_ProfileProjection/Attribute:profileid' => 'Profilo',
|
||||
'Class:URP_ProfileProjection/Attribute:profileid+' => '',
|
||||
'Class:URP_ProfileProjection/Attribute:profile' => 'Profilo',
|
||||
'Class:URP_ProfileProjection/Attribute:profile+' => '',
|
||||
'Class:URP_ProfileProjection/Attribute:value' => 'Valore dell\'espressione',
|
||||
'Class:URP_ProfileProjection/Attribute:value+' => '',
|
||||
'Class:URP_ProfileProjection/Attribute:attribute' => 'Attributo',
|
||||
'Class:URP_ProfileProjection/Attribute:attribute+' => '',
|
||||
'Class:URP_ClassProjection' => 'classe_proiezione',
|
||||
'Class:URP_ClassProjection+' => '',
|
||||
'Class:URP_ClassProjection/Attribute:dimensionid' => 'Dimensione',
|
||||
'Class:URP_ClassProjection/Attribute:dimensionid+' => '',
|
||||
'Class:URP_ClassProjection/Attribute:dimension' => 'Dimensione',
|
||||
'Class:URP_ClassProjection/Attribute:dimension+' => '',
|
||||
'Class:URP_ClassProjection/Attribute:class' => 'Classe',
|
||||
'Class:URP_ClassProjection/Attribute:class+' => '',
|
||||
'Class:URP_ClassProjection/Attribute:value' => 'Valore dell\'espressione',
|
||||
'Class:URP_ClassProjection/Attribute:value+' => '',
|
||||
'Class:URP_ClassProjection/Attribute:attribute' => 'Attributo',
|
||||
'Class:URP_ClassProjection/Attribute:attribute+' => '',
|
||||
'Class:URP_ActionGrant/Attribute:profile' => 'Profilo',
|
||||
'Class:URP_ActionGrant/Attribute:profile+' => '',
|
||||
'Class:URP_StimulusGrant/Attribute:profile' => 'Profilo',
|
||||
'Class:URP_StimulusGrant/Attribute:profile+' => '',
|
||||
'Menu:WelcomeMenu' => 'Benveuto',
|
||||
'Menu:WelcomeMenu+' => '',
|
||||
'Menu:WelcomeMenuPage' => 'Benvenuto',
|
||||
'Menu:WelcomeMenuPage+' => '',
|
||||
'UI:WelcomeMenu:Title' => 'Benveuto su iTop',
|
||||
'UI:WelcomeMenu:LeftBlock' => '<p>iTop è un completo Portale Funzionale IT, Open Source.</p>
|
||||
<ul>Esso include:
|
||||
<li>Un completo CMDB (Configuration management database) per documentare e gestire l\'IT di inventario.</li>
|
||||
<li>Un modulo di gestione degli incidenti per monitorare e comunicare su tutte le problematiche che si verificano nel settore IT.</li>
|
||||
<li>Un modulo di gestione delle modifiche per pianificare e monitorare i cambiamenti all\'ambiente IT.</li>
|
||||
<li>Una banca dati errori noti per accelerare la risoluzione di incidenti.</li>
|
||||
<li>Un modulo di interruzione per documentare tutte le interruzioni pianificate e notificare gli opportuni contatti.</li>
|
||||
<li>Un cruscotto per ottenere rapidamente una panoramica del sistema IT.</li>
|
||||
</ul>
|
||||
<p>Tutti i moduli possono essere installati, passo dopo passo, indipendentemente l\'uno dall\'altro.</p>',
|
||||
'UI:WelcomeMenu:RightBlock' => '<p>iTop è fornitore di servizi di orientamento, che consente ai progettisti di gestire più o organizzazioni o clienti con facilità.
|
||||
<ul>>iTop, offre un set ricco di funzionalità dei processi di business che:
|
||||
<li>Migliora l\'efficacia di gestione IT</li>
|
||||
<li>Guida le prestazione delle operazioni IT</li>
|
||||
<li>Migliora la soddisfazione del cliente e fornisce ai dirigenti un idea della performance del business.</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>iTop è completamente aperto per essere integrato all\'interno della vostra infrastruttura di gestione dell\'IT.</p>
|
||||
<p>
|
||||
<ul>L\'adozione di questa nuova generazione di portale funzionale IT vi aiuterà a:
|
||||
<li>Meglio gestire un ambiente IT sempre più complesso.</li>
|
||||
<li>Implementare i processi ITIL al proprio ritmo.</li>
|
||||
<li>Gestire la risorsa più importante della tua IT: Documentazione.</li>
|
||||
</ul>
|
||||
</p>',
|
||||
'UI:WelcomeMenu:AllOpenRequests' => 'Apri le richieste: %1$d',
|
||||
'UI:WelcomeMenu:MyCalls' => 'Le mie richieste',
|
||||
'UI:WelcomeMenu:OpenIncidents' => 'Apri gli incidenti: %1$d',
|
||||
'UI:WelcomeMenu:AllConfigItems' => 'Elementi di Configurazione (CI): %1$d',
|
||||
'UI:WelcomeMenu:MyIncidents' => 'Incidenti assegnati a me',
|
||||
'UI:AllOrganizations' => ' Tutte le Organizzazioni ',
|
||||
'UI:YourSearch' => 'La tua Cerca',
|
||||
'UI:LoggedAsMessage' => 'Logged come %1$s',
|
||||
'UI:LoggedAsMessage+Admin' => 'Logged come %1$s (Amministratore)',
|
||||
'UI:Button:Logoff' => 'Log off',
|
||||
'UI:Button:GlobalSearch' => 'Cerca',
|
||||
'UI:Button:Search' => ' Cerca',
|
||||
'UI:Button:Query' => ' Domanda',
|
||||
'UI:Button:Ok' => 'Ok',
|
||||
'UI:Button:Cancel' => 'Cancella',
|
||||
'UI:Button:Apply' => 'Applica',
|
||||
'UI:Button:Back' => ' << Indietro',
|
||||
'UI:Button:Restart' => ' |<< Riavvia',
|
||||
'UI:Button:Next' => ' Prossimo >> ',
|
||||
'UI:Button:Finish' => ' Fine',
|
||||
'UI:Button:DoImport' => ' Esegui le Imporazioni ! ~~',
|
||||
'UI:Button:Done' => ' Fatto',
|
||||
'UI:Button:SimulateImport' => ' Simula l\'Importazione ~~',
|
||||
'UI:Button:Test' => 'Testa!',
|
||||
'UI:Button:Evaluate' => ' Valuta',
|
||||
'UI:Button:AddObject' => ' Aggiungi... ~~',
|
||||
'UI:Button:BrowseObjects' => ' Sfoglia... ~~',
|
||||
'UI:Button:Add' => ' Aggiungi ~~',
|
||||
'UI:Button:AddToList' => ' << Aggiungi ~~',
|
||||
'UI:Button:RemoveFromList' => ' Rimuovi >> ~~',
|
||||
'UI:Button:FilterList' => ' Filtra... ~~',
|
||||
'UI:Button:Create' => ' Crea ~~',
|
||||
'UI:Button:Delete' => ' Cancella ! ~~',
|
||||
'UI:Button:ChangePassword' => ' Cambia Password ~~',
|
||||
'UI:Button:ResetPassword' => ' Resetta Password ~~',
|
||||
'UI:SearchToggle' => 'Cerca',
|
||||
'UI:ClickToCreateNew' => 'Crea un nuovo %1$s~~',
|
||||
'UI:SearchFor_Class' => 'Cerca l\'oggetto %1$s',
|
||||
'UI:NoObjectToDisplay' => 'Nessun oggetto da mostrare.',
|
||||
'UI:Error:MandatoryTemplateParameter_object_id' => 'Object_id parametro è obbligatorio quando link_attr è specificato. Verificare la definizione del modello di display.',
|
||||
'UI:Error:MandatoryTemplateParameter_target_attr' => 'Target_attr parametro è obbligatorio quando link_attr è specificato. Verificare la definizione del modello di display.',
|
||||
'UI:Error:MandatoryTemplateParameter_group_by' => 'Il parametro è group_by obbligatoria. Verificare la definizione del modello di display.',
|
||||
'UI:Error:InvalidGroupByFields' => 'Elenco di campi non valido per il raggruppamento: "%1$s".',
|
||||
'UI:Error:UnsupportedStyleOfBlock' => 'Errore: Stile non supportato di blocco: "%1$s".',
|
||||
'UI:Error:IncorrectLinkDefinition_LinkedClass_Class' => 'Errata definizione di link: la classe di oggetti da gestire: %1$s non è stato trovato come chiave esterna nella classe %2$s',
|
||||
'UI:Error:Object_Class_Id_NotFound' => 'Oggetto: %1$s:%2$d non trovato.',
|
||||
'UI:Error:WizardCircularReferenceInDependencies' => 'Errore: Riferimento circolare nelle dipendenze tra i campi, controllare il modello di dati.',
|
||||
'UI:Error:UploadedFileTooBig' => 'Il file caricato è troppo grande. (dimensione massima consentita è di %1$s). Verificare di configurazione di PHP per upload_max_filesize e post_max_size.',
|
||||
'UI:Error:UploadedFileTruncated.' => 'Il file caricato è stata troncato !',
|
||||
'UI:Error:NoTmpDir' => 'La directory temporanea non è definita.',
|
||||
'UI:Error:CannotWriteToTmp_Dir' => 'Impossibile scrivere il file temporaneo sul disco. upload_tmp_dir = "%1$s".',
|
||||
'UI:Error:UploadStoppedByExtension_FileName' => 'Caricamento fermato per estensione. (Nome del file originale = "%1$s").',
|
||||
'UI:Error:UploadFailedUnknownCause_Code' => 'Il caricamento del file non riuscito, causa sconosciuta. (Codice errore = "%1$s").',
|
||||
'UI:Error:1ParametersMissing' => 'Errore: il seguente parametro deve essere specificato per questa operazione: %1$s.',
|
||||
'UI:Error:2ParametersMissing' => 'Errore: i seguenti parametri devono essere specificati per questa operazione: %1$s e %2$s.',
|
||||
'UI:Error:3ParametersMissing' => 'Errore: i seguenti parametri devono essere specificati per questa operazione: %1$s, %2$s e %3$s.',
|
||||
'UI:Error:4ParametersMissing' => 'Errore: i seguenti parametri devono essere specificati per questa operazione: %1$s, %2$s, %3$s e %4$s.',
|
||||
'UI:Error:IncorrectOQLQuery_Message' => 'Errore: errata OQL query: %1$s',
|
||||
'UI:Error:AnErrorOccuredWhileRunningTheQuery_Message' => 'Si è verificato un errore durante l\'esecuzione della query: %1$s',
|
||||
'UI:Error:ObjectAlreadyUpdated' => 'Errore: l\'oggetto è già stato aggiornato.',
|
||||
'UI:Error:ObjectCannotBeUpdated' => 'Errore: oggetto non può essere aggiornato.',
|
||||
'UI:Error:ObjectsAlreadyDeleted' => 'Errore: gli oggetti sono già stati eliminati!',
|
||||
'UI:Error:BulkDeleteNotAllowedOn_Class' => 'Non hai i permessi per eseguire una eliminazione collettiva degli oggetti della classe %1$s',
|
||||
'UI:Error:DeleteNotAllowedOn_Class' => 'Non ti è permesso di eliminare gli oggetti della classe %1$s',
|
||||
'UI:Error:BulkModifyNotAllowedOn_Class' => 'Non hai i permessi per eseguire un aggiornamento collettivo degli oggetti della classe %1$s',
|
||||
'UI:Error:ObjectAlreadyCloned' => 'Errore: l\'oggetto è già stato clonato!',
|
||||
'UI:Error:ObjectAlreadyCreated' => 'Errore: l\'oggetto è già stato creato!',
|
||||
'UI:Error:Invalid_Stimulus_On_Object_In_State' => 'Errore: stimolo non valido "%1$s" su un oggetto %2$s nello stato "%3$s".',
|
||||
|
||||
'UI:GroupBy:Count' => 'Conteggio',
|
||||
'UI:GroupBy:Count+' => '',
|
||||
'UI:CountOfObjects' => '%1$d oggetti corrispondenti ai criteri.',
|
||||
'UI_CountOfObjectsShort' => '%1$d oggetti.',
|
||||
'UI:NoObject_Class_ToDisplay' => 'No %1$s da visualizzare',
|
||||
'UI:History:LastModified_On_By' => 'Ultima modifica %1$s da %2$s.',
|
||||
'UI:HistoryTab' => 'Storia',
|
||||
'UI:NotificationsTab' => 'Notifiche',
|
||||
'UI:History:BulkImports' => 'Storia',
|
||||
'UI:History:BulkImports+' => 'Elenco delle importazioni CSV (primo ultimo)',
|
||||
'UI:History:BulkImportDetails' => 'Modifiche derivanti dai importazione CSV eseguita su %1$s (da %2$s)',
|
||||
'UI:History:Date' => 'Data',
|
||||
'UI:History:Date+' => '',
|
||||
'UI:History:User' => 'Utente',
|
||||
'UI:History:User+' => '',
|
||||
'UI:History:Changes' => 'Modifiche',
|
||||
'UI:History:Changes+' => '',
|
||||
'UI:History:StatsCreations' => 'Creato',
|
||||
'UI:History:StatsCreations+' => '',
|
||||
'UI:History:StatsModifs' => 'Modificato',
|
||||
'UI:History:StatsModifs+' => '',
|
||||
'UI:History:StatsDeletes' => 'Cancellato',
|
||||
'UI:History:StatsDeletes+' => '',
|
||||
'UI:Loading' => 'Caricamento...',
|
||||
'UI:Menu:Actions' => 'Azioni',
|
||||
'UI:Menu:New' => 'Nuovo...',
|
||||
'UI:Menu:Add' => 'Aggiungi...',
|
||||
'UI:Menu:Manage' => 'Gestischi...',
|
||||
'UI:Menu:EMail' => 'eMail',
|
||||
'UI:Menu:CSVExport' => 'CSV Export',
|
||||
'UI:Menu:Modify' => 'Modifica...',
|
||||
'UI:Menu:Delete' => 'Cancella...',
|
||||
'UI:Menu:BulkDelete' => 'Cancella...',
|
||||
'UI:UndefinedObject' => 'non definito',
|
||||
'UI:Document:OpenInNewWindow:Download' => 'Apri in una nuova finestra: %1$s, Scarica: %2$s',
|
||||
'UI:SelectAllToggle+' => '',
|
||||
'UI:TruncatedResults' => '%1$d oggetti visualizzati su %2$d',
|
||||
'UI:DisplayAll' => 'Mostra tutto',
|
||||
'UI:CollapseList' => 'Collassa',
|
||||
'UI:CountOfResults' => '%1$d oggetto(i)',
|
||||
'UI:ChangesLogTitle' => 'Log delle modifiche (%1$d):',
|
||||
'UI:EmptyChangesLogTitle' => 'Log delle modifiche è vuoto',
|
||||
'UI:SearchFor_Class_Objects' => 'Cerca per %1$s Oggetti',
|
||||
'UI:OQLQueryBuilderTitle' => 'OQL Query Builder',
|
||||
'UI:OQLQueryTab' => 'OQL Query',
|
||||
'UI:SimpleSearchTab' => 'Ricerca semplice',
|
||||
'UI:Details+' => '',
|
||||
'UI:SearchValue:Any' => '* Qualsiasi *',
|
||||
'UI:SearchValue:Mixed' => '* misti *',
|
||||
'UI:SelectOne' => '-- selezionare uno --',
|
||||
'UI:Login:Welcome' => 'Benvenuti su iTop!',
|
||||
'UI:Login:IncorrectLoginPassword' => 'Errato login/password, si prega di riprovare.',
|
||||
'UI:Login:IdentifyYourself' => 'Identifica te stesso prima di continuare',
|
||||
'UI:Login:UserNamePrompt' => 'Nome Utente',
|
||||
'UI:Login:PasswordPrompt' => 'Password',
|
||||
'UI:Login:ChangeYourPassword' => 'Cambia la tua password',
|
||||
'UI:Login:OldPasswordPrompt' => 'Vecchia password',
|
||||
'UI:Login:NewPasswordPrompt' => 'Nuova password',
|
||||
'UI:Login:RetypeNewPasswordPrompt' => 'Riscrivi la nuova password',
|
||||
'UI:Login:IncorrectOldPassword' => 'Errore: la vecchia password non è corretta',
|
||||
'UI:LogOffMenu' => 'Log off',
|
||||
'UI:LogOff:ThankYou' => 'Grazie per aver scelto iTop',
|
||||
'UI:LogOff:ClickHereToLoginAgain' => 'Clicca qui per effettuare il login di nuovo...',
|
||||
'UI:ChangePwdMenu' => 'Cambia Password...',
|
||||
'UI:AccessRO-All' => 'iTop è di sola lettura',
|
||||
'UI:AccessRO-Users' => 'iTop è di sola lettura per gli utenti finali',
|
||||
'UI:Login:RetypePwdDoesNotMatch' => 'Nuova password e la nuova password digitata nuovamente non corrispondono !',
|
||||
'UI:Button:Login' => 'Entra in iTop',
|
||||
|
||||
'UI:Login:Error:AccessRestricted' => 'L\'accesso a iTop è limitato. Si prega di contattare un amministratore iTop.',
|
||||
'UI:Login:Error:AccessAdmin' => 'Accesso limitato alle persone che hanno privilegi di amministratore. Si prega di contattare un amministratore iTop.',
|
||||
'UI:CSVImport:MappingSelectOne' => '-- seleziona uno --',
|
||||
'UI:CSVImport:MappingNotApplicable' => '-- ignora questo campo --',
|
||||
'UI:CSVImport:NoData' => 'Insieme di dati vuoto ..., si prega di fornire alcuni dati!',
|
||||
'UI:Title:DataPreview' => 'Anteprima dati',
|
||||
'UI:CSVImport:ErrorOnlyOneColumn' => 'Errore: I dati contengono solo una colonna. Avete selezionato il carattere separatore appropriato?',
|
||||
'UI:CSVImport:FieldName' => 'Campo %1$d',
|
||||
'UI:CSVImport:DataLine1' => 'Dati Linea 1',
|
||||
'UI:CSVImport:DataLine2' => 'Dati Linea 2',
|
||||
'UI:CSVImport:idField' => 'id (Chiave Primaria)',
|
||||
'UI:Title:BulkImport' => 'iTop - importazione collettiva',
|
||||
'UI:Title:BulkImport+' => '',
|
||||
'UI:Title:BulkSynchro_nbItem_ofClass_class' => 'Sincronizzazione di %1$d oggetti della classe %2$s',
|
||||
'UI:CSVImport:ClassesSelectOne' => '-- seleziona uno --',
|
||||
'UI:CSVImport:ErrorExtendedAttCode' => 'Errore interno: "%1$s" è un codice errato, perché "%2$s" NON è una chiave esterna della classe "%3$s"',
|
||||
'UI:CSVImport:ObjectsWillStayUnchanged' => '%1$d oggetto(i) rimarrà invariato.',
|
||||
'UI:CSVImport:ObjectsWillBeModified' => '%1$d oggetto(i) sarà modificato.',
|
||||
'UI:CSVImport:ObjectsWillBeAdded' => '%1$d oggetto(i) sarà aggiunto.',
|
||||
'UI:CSVImport:ObjectsWillHaveErrors' => '%1$d oggetto(i) avranno i errori.',
|
||||
'UI:CSVImport:ObjectsRemainedUnchanged' => '%1$d oggetto(i) è rimasto invariato.',
|
||||
'UI:CSVImport:ObjectsWereModified' => '%1$d oggetto(i) sono stati modificati.',
|
||||
'UI:CSVImport:ObjectsWereAdded' => '%1$d oggetto(i) sono stati aggiunti.',
|
||||
'UI:CSVImport:ObjectsHadErrors' => '%1$d oggetto(i) hanno avuto errori.',
|
||||
'UI:Title:CSVImportStep2' => 'Step 2 of 5: opzioni dati CVS',
|
||||
'UI:Title:CSVImportStep3' => 'Step 3 of 5: Mappatura dei dati',
|
||||
'UI:Title:CSVImportStep4' => 'Step 4 of 5: Importa simulazione',
|
||||
'UI:Title:CSVImportStep5' => 'Step 5 of 5: Importazione completata',
|
||||
'UI:CSVImport:LinesNotImported' => 'Linee che non possono essere caricate:',
|
||||
'UI:CSVImport:LinesNotImported+' => '',
|
||||
'UI:CSVImport:SeparatorComma+' => '',
|
||||
'UI:CSVImport:SeparatorSemicolon+' => '',
|
||||
'UI:CSVImport:SeparatorTab+' => '',
|
||||
'UI:CSVImport:SeparatorOther' => 'altri:',
|
||||
'UI:CSVImport:QualifierDoubleQuote+' => '',
|
||||
'UI:CSVImport:QualifierSimpleQuote+' => '',
|
||||
'UI:CSVImport:QualifierOther' => 'other:~~',
|
||||
'UI:CSVImport:TreatFirstLineAsHeader' => 'Tratta la prima riga come intestazione (nomi di colonna)',
|
||||
'UI:CSVImport:Skip_N_LinesAtTheBeginning' => 'Salta le linee %1$s all\'inzio del file',
|
||||
'UI:CSVImport:CSVDataPreview' => 'CSV Anteprima dei dati',
|
||||
'UI:CSVImport:SelectFile' => 'Selezionare il file da importare:',
|
||||
'UI:CSVImport:Tab:LoadFromFile' => 'Carica da un file',
|
||||
'UI:CSVImport:Tab:CopyPaste' => 'Copia e incolla i dati',
|
||||
'UI:CSVImport:Tab:Templates' => 'Modelli',
|
||||
'UI:CSVImport:PasteData' => 'Incolla i dati da importare:',
|
||||
'UI:CSVImport:PickClassForTemplate' => 'Scegli il modello da scaricare: ',
|
||||
'UI:CSVImport:SeparatorCharacter' => 'Separatore di carattere:',
|
||||
'UI:CSVImport:TextQualifierCharacter' => 'Testo di qualificazione carattere',
|
||||
'UI:CSVImport:CommentsAndHeader' => 'Commenti e intestazione',
|
||||
'UI:CSVImport:SelectClass' => 'Selezionare la classe da importare:',
|
||||
'UI:CSVImport:AdvancedMode' => 'Modalità avanzata',
|
||||
'UI:CSVImport:AdvancedMode+' => '',
|
||||
'UI:CSVImport:SelectAClassFirst' => 'Per configurare il mapping, selezionare prima una classe.',
|
||||
'UI:CSVImport:HeaderFields' => 'Campi',
|
||||
'UI:CSVImport:HeaderMappings' => 'Mappings',
|
||||
'UI:CSVImport:HeaderSearch' => 'Cerca?',
|
||||
'UI:CSVImport:AlertIncompleteMapping' => 'Per favore seleziona una mappatura per ogni campo.',
|
||||
'UI:CSVImport:AlertNoSearchCriteria' => 'Per favore seleziona almeno un criterio di ricerca',
|
||||
'UI:CSVImport:Encoding' => 'Codifica dei caratteri',
|
||||
'UI:UniversalSearchTitle' => 'iTop - Ricerca Universale',
|
||||
'UI:UniversalSearch:Error' => 'Errore: %1$s~~',
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Seleziona la classe per la ricerca: ',
|
||||
'UI:Audit:Title' => 'iTop - CMDB Audit~~',
|
||||
'UI:Audit:InteractiveAudit' => 'Audit Interattivo',
|
||||
'UI:Audit:HeaderAuditRule' => 'Regole di Audit',
|
||||
'UI:Audit:HeaderNbObjects' => '# Oggetti',
|
||||
'UI:Audit:HeaderNbErrors' => '# Errori',
|
||||
'UI:Audit:PercentageOk' => '% Ok',
|
||||
'UI:RunQuery:Title' => 'iTop - Valutazione Query OQL',
|
||||
'UI:RunQuery:QueryExamples' => 'Esempi di Query',
|
||||
'UI:RunQuery:HeaderPurpose' => 'Scopo',
|
||||
'UI:RunQuery:HeaderPurpose+' => '',
|
||||
'UI:RunQuery:HeaderOQLExpression' => 'Espressioni OQL',
|
||||
'UI:RunQuery:HeaderOQLExpression+' => '',
|
||||
'UI:RunQuery:ExpressionToEvaluate' => 'Espressione da valutare: ',
|
||||
'UI:RunQuery:MoreInfo' => 'Maggiori informazioni sulla query: ',
|
||||
'UI:RunQuery:DevelopedQuery' => 'Espressione della query riqualificata:',
|
||||
'UI:RunQuery:SerializedFilter' => 'Filtro pubblicato: ',
|
||||
'UI:RunQuery:Error' => 'Si è verificato un errore durante l\'esecuzione della query: %1$s',
|
||||
'UI:Schema:Title' => 'iTop schema degli oggetti',
|
||||
'UI:Schema:CategoryMenuItem' => 'Categoria <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Relazioni',
|
||||
'UI:Schema:AbstractClass' => 'Classe astratta: nessun oggetto da questa classe può essere istanziato.',
|
||||
'UI:Schema:NonAbstractClass' => 'Classe non-astratta: oggetti da questa classe possono essere istanziati.',
|
||||
'UI:Schema:ClassHierarchyTitle' => 'Gerarchia delle classi',
|
||||
'UI:Schema:AllClasses' => 'Tutte le classi',
|
||||
'UI:Schema:ExternalKey_To' => 'Chiave esterna %1$s',
|
||||
'UI:Schema:Columns_Description' => 'Colonne: <em>%1$s</em>',
|
||||
'UI:Schema:Default_Description' => 'Default: "%1$s"',
|
||||
'UI:Schema:NullAllowed' => 'Null consentito',
|
||||
'UI:Schema:NullNotAllowed' => 'Null NON consentito',
|
||||
'UI:Schema:Attributes' => 'Attributi',
|
||||
'UI:Schema:AttributeCode' => 'Codice attributo',
|
||||
'UI:Schema:AttributeCode+' => '',
|
||||
'UI:Schema:Label' => 'Etichetta',
|
||||
'UI:Schema:Label+' => '',
|
||||
'UI:Schema:Type' => 'Tipo',
|
||||
'UI:Schema:Type+' => '',
|
||||
'UI:Schema:Origin' => 'Origine',
|
||||
'UI:Schema:Origin+' => '',
|
||||
'UI:Schema:Description' => 'Descrizione',
|
||||
'UI:Schema:Description+' => '',
|
||||
'UI:Schema:AllowedValues' => 'Valori consentiti',
|
||||
'UI:Schema:AllowedValues+' => '',
|
||||
'UI:Schema:MoreInfo' => 'Maggiori informazioni',
|
||||
'UI:Schema:MoreInfo+' => '',
|
||||
'UI:Schema:SearchCriteria' => 'Criteri di ricerca',
|
||||
'UI:Schema:FilterCode' => 'Codice di filtro',
|
||||
'UI:Schema:FilterCode+' => '',
|
||||
'UI:Schema:FilterDescription' => 'Descrizione',
|
||||
'UI:Schema:FilterDescription+' => '',
|
||||
'UI:Schema:AvailOperators' => 'Operatori disponibili',
|
||||
'UI:Schema:AvailOperators+' => '',
|
||||
'UI:Schema:ChildClasses' => 'Classi figlio',
|
||||
'UI:Schema:ReferencingClasses' => 'Classi di rifermento',
|
||||
'UI:Schema:RelatedClasses' => 'Classi correlate',
|
||||
'UI:Schema:LifeCycle' => 'Ciclo di vita',
|
||||
'UI:Schema:Triggers' => 'Triggers',
|
||||
'UI:Schema:Relation_Code_Description' => 'Relazione <em>%1$s</em> (%2$s)',
|
||||
'UI:Schema:RelationDown_Description' => 'Giù: %1$s',
|
||||
'UI:Schema:RelationUp_Description' => 'Su: %1$s',
|
||||
'UI:Schema:RelationPropagates' => '%1$s: propagato al livello %2$d, query: %3$s',
|
||||
'UI:Schema:RelationDoesNotPropagate' => '%1$s: non si propaga a (%2$d livelli), query: %3$s',
|
||||
'UI:Schema:Class_ReferencingClasses_From_By' => '%1$s fa riferimento la classe %2$s tramite il campo %3$s',
|
||||
'UI:Schema:Class_IsLinkedTo_Class_Via_ClassAndAttribute' => '%1$s è legata alla %2$s via %3$s::<em>%4$s</em>',
|
||||
'UI:Schema:Links:1-n' => 'Classi che puntano a %1$s (1:n links):',
|
||||
'UI:Schema:Links:n-n' => 'Classi legati alla %1$s (n:n links):',
|
||||
'UI:Schema:Links:All' => 'Grafico di tutte le classi correlate',
|
||||
'UI:Schema:NoLifeCyle' => 'Non vi è alcun ciclo di vita definito per questa classe.',
|
||||
'UI:Schema:LifeCycleTransitions' => 'Transizioni',
|
||||
'UI:Schema:LifeCyleAttributeOptions' => 'Opzioni per l\'attributo',
|
||||
'UI:Schema:LifeCycleHiddenAttribute' => 'Nascosto',
|
||||
'UI:Schema:LifeCycleReadOnlyAttribute' => 'Di sola lettura',
|
||||
'UI:Schema:LifeCycleMandatoryAttribute' => 'Obbigatorio',
|
||||
'UI:Schema:LifeCycleAttributeMustChange' => 'Deve cambiare',
|
||||
'UI:Schema:LifeCycleAttributeMustPrompt' => 'All\'utente verrà richiesto di modificare il valore',
|
||||
'UI:Schema:LifeCycleEmptyList' => 'lista vuota',
|
||||
'UI:LinksWidget:Autocomplete+' => '',
|
||||
'UI:Combo:SelectValue' => '--- seleziona un valore ---',
|
||||
'UI:Label:SelectedObjects' => 'oggetti selezionati: ',
|
||||
'UI:Label:AvailableObjects' => 'Oggetti disponibili: ',
|
||||
'UI:Link_Class_Attributes' => '%1$s attributi',
|
||||
'UI:AddObjectsOf_Class_LinkedWith_Class_Instance' => 'Aggiungi l\'oggeto %1$s collegato con %2$s: %3$s',
|
||||
'UI:AddObjectsOf_Class_LinkedWith_Class' => 'Aggiungi l\'oggeto %1$s al collegamento con %2$s',
|
||||
'UI:ManageObjectsOf_Class_LinkedWith_Class_Instance' => 'Gestisci l\'oggetto %1$s collegato con %2$s: %3$s',
|
||||
'UI:AddLinkedObjectsOf_Class' => 'Aggiungi %1$s...',
|
||||
'UI:RemoveLinkedObjectsOf_Class' => 'Rimuovi gli oggetti selezionati',
|
||||
'UI:Message:EmptyList:UseAdd' => 'La lista è vuota, utilizzare il pulsante "Aggiungi ..." per aggiungere elementi.',
|
||||
'UI:Message:EmptyList:UseSearchForm' => 'Utilizza il modulo di ricerca qui sopra per cercare oggetti da aggiungere.',
|
||||
'UI:Wizard:FinalStepTitle' => 'Passo finale: la conferma',
|
||||
'UI:Title:DeletionOf_Object' => 'Soppressione di %1$s',
|
||||
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'Cancellazione collettiva di %1$d oggetti della classe %2$s',
|
||||
'UI:Delete:NotAllowedToDelete' => 'Non ti è permesso di eliminare l\'oggetto',
|
||||
'UI:Delete:NotAllowedToUpdate_Fields' => 'Non hai i permessi per aggiornare il seguente campo(i): %1$s',
|
||||
'UI:Error:NotEnoughRightsToDelete' => 'Questo oggetto non può essere cancellato perché l\'utente corrente non dispone dei diritti necessari',
|
||||
'UI:Error:CannotDeleteBecause' => 'Questo oggetto non può essere cancellato perchè: %1$s~~',
|
||||
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Questo oggetto non può essere cancellato perché alcune operazioni manuali devono essere effettuate prima di questo',
|
||||
'UI:Error:CannotDeleteBecauseManualOpNeeded' => 'Questo oggetto non può essere cancellato perché alcune operazioni manuali devono essere effettuate prima di questo',
|
||||
'UI:Archive_User_OnBehalfOf_User' => '%1$s a nome di %2$s',
|
||||
'UI:Delete:Deleted' => 'deleted~~',
|
||||
'UI:Delete:AutomaticallyDeleted' => 'automaticamente eliminato',
|
||||
'UI:Delete:AutomaticResetOf_Fields' => 'ripristino automatico del campo(i): %1$s',
|
||||
'UI:Delete:CleaningUpRefencesTo_Object' => 'Pulizia di tutti i riferimenti a %1$s...',
|
||||
'UI:Delete:CleaningUpRefencesTo_Several_ObjectsOf_Class' => 'Pulizia di tutti i riferimenti a %1$d oggetti di classe %2$s...',
|
||||
'UI:Delete:Done+' => '',
|
||||
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s cancellato.',
|
||||
'UI:Delete:ConfirmDeletionOf_Name' => 'Soppressione di %1$s',
|
||||
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Soppressione di %1$d oggetti di classe %2$s',
|
||||
'UI:Delete:CannotDeleteBecause' => 'Non può essere cancellato: %1$s~~',
|
||||
'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Dovrebbe essere eliminato automaticamente, ma questo non è fattibile: %1$s~~',
|
||||
'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Deve essere cancellato manualmente, ma questo non è fattibile: %1$s~~',
|
||||
'UI:Delete:WillBeDeletedAutomatically' => 'Sarà cancellato automaticamente',
|
||||
'UI:Delete:MustBeDeletedManually' => 'Deve essere cancellato manualmente',
|
||||
'UI:Delete:CannotUpdateBecause_Issue' => 'Dovrebbero essere automaticamente aggiornati, ma: %1$s~~',
|
||||
'UI:Delete:WillAutomaticallyUpdate_Fields' => 'Sarà automaticamente aggiornato (reset: %1$s)~~',
|
||||
'UI:Delete:Count_Objects/LinksReferencing_Object' => '%1$d oggetti/link fanno riferimento %2$s',
|
||||
'UI:Delete:Count_Objects/LinksReferencingTheObjects' => '%1$d oggetti / link fanno riferimento alcuni degli oggetti da eliminare',
|
||||
'UI:Delete:ReferencesMustBeDeletedToEnsureIntegrity' => 'Per garantire l\'integrità del database, ogni riferimento dovrebbe essere ulteriormente eliminato',
|
||||
'UI:Delete:Consequence+' => '',
|
||||
'UI:Delete:SorryDeletionNotAllowed' => 'Spiacenti, non sei autorizzato a cancellare questo oggetto, vedere le spiegazioni di cui sopra',
|
||||
'UI:Delete:PleaseDoTheManualOperations' => 'Si prega di eseguire le operazioni manuali di cui sopra prima di richiedere la cancellazione di questo oggetto',
|
||||
'UI:Delect:Confirm_Object' => 'Si prega di confermare che si desidera eliminare %1$s.',
|
||||
'UI:Delect:Confirm_Count_ObjectsOf_Class' => 'Si prega di confermare che si desidera eliminare i seguenti oggetti %1$d della classe %2$s.',
|
||||
'UI:WelcomeToITop' => 'Benvenuto su iTop',
|
||||
'UI:DetailsPageTitle' => 'iTop - %1$s - %2$s dettagli',
|
||||
'UI:ErrorPageTitle' => 'iTop - Errore',
|
||||
'UI:ObjectDoesNotExist' => 'Spiacenti, questo oggetto non esiste (o non si è autorizzati per vederlo).',
|
||||
'UI:SearchResultsPageTitle' => 'iTop - Risultati della ricerca',
|
||||
'UI:Search:NoSearch' => 'Niente da ricercare',
|
||||
'UI:FullTextSearchTitle_Text' => 'Risultati per "%1$s":',
|
||||
'UI:Search:Count_ObjectsOf_Class_Found' => 'Trovato l\'oggetto(i) %1$d della classe %2$s.',
|
||||
'UI:Search:NoObjectFound' => 'Nessun oggetto trovato.',
|
||||
'UI:ModificationPageTitle_Object_Class' => 'iTop - %1$s - %2$s modifica',
|
||||
'UI:ModificationTitle_Class_Object' => 'Modifica di %1$s: <span class=\"hilite\">%2$s</span>',
|
||||
'UI:ClonePageTitle_Object_Class' => 'iTop - Clone %1$s - %2$s modifica',
|
||||
'UI:CloneTitle_Class_Object' => 'Clone di %1$s: <span class=\"hilite\">%2$s</span>',
|
||||
'UI:CreationPageTitle_Class' => 'iTop - Creazione di un nuovo %1$s ',
|
||||
'UI:CreationTitle_Class' => 'Creazione di un nuovo %1$s',
|
||||
'UI:SelectTheTypeOf_Class_ToCreate' => 'Seleziona il tipo di %1$s da creare:',
|
||||
'UI:Class_Object_NotUpdated' => 'Nessun cambiamento rilevato, %1$s (%2$s) <strong>non</strong> è stato modificato.',
|
||||
'UI:Class_Object_Updated' => '%1$s (%2$s) aggiornato.',
|
||||
'UI:BulkDeletePageTitle' => 'iTop - Eliminazione collettiva',
|
||||
'UI:BulkDeleteTitle' => 'Seleziona gli oggetti che si desidera eliminare:',
|
||||
'UI:PageTitle:ObjectCreated' => 'iTop Oggetto Creato.',
|
||||
'UI:Title:Object_Of_Class_Created' => '%1$s - %2$s creato.',
|
||||
'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => 'Applicazione %1$s all\'oggetto: %2$s nello stato %3$s allo stato target: %4$s.',
|
||||
'UI:ObjectCouldNotBeWritten' => 'L\'oggetto non può essere scritto: %1$s~~',
|
||||
'UI:PageTitle:FatalError' => 'iTop - Fatal Error',
|
||||
'UI:SystemIntrusion' => 'Accesso negato. Hai cercato di eseguire un\'operazione che non ti è consentita.',
|
||||
'UI:FatalErrorMessage' => 'Fatal error, iTop non può continuare.',
|
||||
'UI:Error_Details' => 'Errore: %1$s.',
|
||||
'UI:PageTitle:ClassProjections' => 'iTop gestione degli utenti - proiezioni classe',
|
||||
'UI:PageTitle:ProfileProjections' => 'iTop gestione degli utenti - proiezioni profilo',
|
||||
'UI:UserManagement:Class' => 'Classe',
|
||||
'UI:UserManagement:Class+' => '',
|
||||
'UI:UserManagement:ProjectedObject' => 'Oggetto',
|
||||
'UI:UserManagement:ProjectedObject+' => '',
|
||||
'UI:UserManagement:AnyObject' => '* qualsiasi *',
|
||||
'UI:UserManagement:User' => 'Utente',
|
||||
'UI:UserManagement:User+' => '',
|
||||
'UI:UserManagement:Profile' => 'Profilo',
|
||||
'UI:UserManagement:Profile+' => '',
|
||||
'UI:UserManagement:Action:Read' => 'Leggi',
|
||||
'UI:UserManagement:Action:Read+' => '',
|
||||
'UI:UserManagement:Action:Modify' => 'Modifica',
|
||||
'UI:UserManagement:Action:Modify+' => '',
|
||||
'UI:UserManagement:Action:Delete' => 'Cancella',
|
||||
'UI:UserManagement:Action:Delete+' => '',
|
||||
'UI:UserManagement:Action:BulkRead' => 'Leggi Bulk (Export)',
|
||||
'UI:UserManagement:Action:BulkRead+' => '',
|
||||
'UI:UserManagement:Action:BulkModify' => 'Modifica Bulk',
|
||||
'UI:UserManagement:Action:BulkModify+' => '',
|
||||
'UI:UserManagement:Action:BulkDelete' => 'Cancella Bulk ',
|
||||
'UI:UserManagement:Action:BulkDelete+' => '',
|
||||
'UI:UserManagement:Action:Stimuli' => 'Stimoli',
|
||||
'UI:UserManagement:Action:Stimuli+' => '',
|
||||
'UI:UserManagement:Action' => 'Azione',
|
||||
'UI:UserManagement:Action+' => '',
|
||||
'UI:UserManagement:TitleActions' => 'Azioni',
|
||||
'UI:UserManagement:Permission' => 'Autorizzazione',
|
||||
'UI:UserManagement:Permission+' => '',
|
||||
'UI:UserManagement:Attributes' => 'Attributi',
|
||||
'UI:UserManagement:ActionAllowed:Yes' => 'Si',
|
||||
'UI:UserManagement:ActionAllowed:No' => 'No',
|
||||
'UI:UserManagement:AdminProfile+' => '',
|
||||
'UI:UserManagement:NoLifeCycleApplicable' => 'N/A',
|
||||
'UI:UserManagement:NoLifeCycleApplicable+' => '',
|
||||
'UI:UserManagement:GrantMatrix' => 'Grant Matrix',
|
||||
'UI:UserManagement:LinkBetween_User_And_Profile' => 'Collegamento tra %1$s e %2$s',
|
||||
'UI:UserManagement:LinkBetween_User_And_Org' => 'Collegamento tra %1$s e %2$s',
|
||||
'Menu:AdminTools' => 'Strumenti di amministrazione',
|
||||
'Menu:AdminTools+' => '',
|
||||
'Menu:AdminTools?' => 'Strumenti accessibile solo agli utenti con il profilo di amministratore',
|
||||
'UI:ChangeManagementMenu' => 'Gestione Cambi',
|
||||
'UI:ChangeManagementMenu+' => '',
|
||||
'UI:ChangeManagementMenu:Title' => 'Panoramica dei cambi',
|
||||
'UI-ChangeManagementMenu-ChangesByType' => 'Cambi per tipo',
|
||||
'UI-ChangeManagementMenu-ChangesByStatus' => 'Cambi per stato',
|
||||
'UI-ChangeManagementMenu-ChangesByWorkgroup' => 'Cambi per gruppi di lavoro',
|
||||
'UI-ChangeManagementMenu-ChangesNotYetAssigned' => 'Cambi non ancora assegnati',
|
||||
'UI:ConfigurationItemsMenu' => 'Configuration Items',
|
||||
'UI:ConfigurationItemsMenu+' => '',
|
||||
'UI:ConfigurationItemsMenu:Title' => 'Configuration Items Panoramica',
|
||||
'UI-ConfigurationItemsMenu-ServersByCriticity' => 'Server per criticità',
|
||||
'UI-ConfigurationItemsMenu-PCsByCriticity' => 'PCs per criticità',
|
||||
'UI-ConfigurationItemsMenu-NWDevicesByCriticity' => 'Dispositivi di rete per criticità',
|
||||
'UI-ConfigurationItemsMenu-ApplicationsByCriticity' => 'Applicazioni per criticità',
|
||||
'UI:ConfigurationManagementMenu' => 'Gestione Configurazione',
|
||||
'UI:ConfigurationManagementMenu+' => '',
|
||||
'UI:ConfigurationManagementMenu:Title' => 'Panoramica delle infrastrutture',
|
||||
'UI-ConfigurationManagementMenu-InfraByType' => 'Oggetti infrastruttutura per tipo',
|
||||
'UI-ConfigurationManagementMenu-InfraByStatus' => 'Oggetti infrastruttutura per stato',
|
||||
'UI:ConfigMgmtMenuOverview:Title' => 'Cruscotto per Gestione configurazione',
|
||||
'UI-ConfigMgmtMenuOverview-FunctionalCIbyStatus' => 'Configuration Items per stato',
|
||||
'UI-ConfigMgmtMenuOverview-FunctionalCIByType' => 'Configuration Items per tipo',
|
||||
'UI:RequestMgmtMenuOverview:Title' => 'Cruscotto per Gestione Richieste',
|
||||
'UI-RequestManagementOverview-RequestByService' => 'Richieste degli utenti per servizio',
|
||||
'UI-RequestManagementOverview-RequestByPriority' => 'Richieste degli utenti per priorità',
|
||||
'UI-RequestManagementOverview-RequestUnassigned' => 'Richieste degli utenti non ancora assegnate ad un agente',
|
||||
'UI:IncidentMgmtMenuOverview:Title' => 'Cruscotto Gestione degli Incidenti',
|
||||
'UI-IncidentManagementOverview-IncidentByService' => 'Incidenti per servizio',
|
||||
'UI-IncidentManagementOverview-IncidentByPriority' => 'Incidenti per priorità',
|
||||
'UI-IncidentManagementOverview-IncidentUnassigned' => 'Incidenti non ancora assegnati ad un agente',
|
||||
'UI:ChangeMgmtMenuOverview:Title' => 'Cruscotto per Gestione dei Cambi',
|
||||
'UI-ChangeManagementOverview-ChangeByType' => 'Cambi per tipo',
|
||||
'UI-ChangeManagementOverview-ChangeUnassigned' => 'Cambi non ancora assegnati ad un agente',
|
||||
'UI-ChangeManagementOverview-ChangeWithOutage' => 'Interruzioni dovute ai cambi',
|
||||
'UI:ServiceMgmtMenuOverview:Title' => 'Cruscotto per Gestione dei Cambi',
|
||||
'UI-ServiceManagementOverview-CustomerContractToRenew' => 'Contratti con i clienti da rinnovarsi in 30 giorni',
|
||||
'UI-ServiceManagementOverview-ProviderContractToRenew' => 'Contratti con i fornitori da rinnovarsi in 30 giorni',
|
||||
'UI:ContactsMenu' => 'Contatti',
|
||||
'UI:ContactsMenu+' => '',
|
||||
'UI:ContactsMenu:Title' => 'Contatti Panoramica',
|
||||
'UI-ContactsMenu-ContactsByLocation' => 'Contatti per localizzazione',
|
||||
'UI-ContactsMenu-ContactsByType' => 'Contatti per tipo',
|
||||
'UI-ContactsMenu-ContactsByStatus' => 'Contatti per stato',
|
||||
'Menu:CSVImportMenu' => 'Importazione CSV',
|
||||
'Menu:CSVImportMenu+' => '',
|
||||
'Menu:DataModelMenu' => 'Modello Dati',
|
||||
'Menu:DataModelMenu+' => '',
|
||||
'Menu:ExportMenu' => 'Esporta',
|
||||
'Menu:ExportMenu+' => '',
|
||||
'Menu:NotificationsMenu' => 'Notifiche',
|
||||
'Menu:NotificationsMenu+' => '',
|
||||
'UI:NotificationsMenu:Title' => 'Configurazione delle <span class="hilite">Notifiche</span>',
|
||||
'UI:NotificationsMenu:Help' => 'Aiuto',
|
||||
'UI:NotificationsMenu:HelpContent' => '<p>In iTop le notifiche sono completamente personalizzabili. Essi si basano su due serie di oggetti: <i>trigger e azioni</i>.</p>
|
||||
<p><i><b>Triggers</b></i> per definire quando una notifica verrà eseguita. Ci sono 3 tipi di trigger per la copertura di 3 fasi differenti del ciclo di vita di un oggetto:
|
||||
<ol>
|
||||
<li>the "OnCreate" trigger vengono eseguiti quando un oggetto della classe specificata viene creata</li>
|
||||
<li>the "OnStateEnter" trigger vengono eseguiti prima che un oggetto della classe data entra in uno stato specifico (provenienti da un altro Stato)</li>
|
||||
<li>the "OnStateLeave" trigger vengono eseguiti quando un oggetto della classe lascia uno stato specificato</li>
|
||||
</ol>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
<i><b>Azioni</b></i> definire le azioni da eseguire quando il trigger vengono eseguiti. Per ora c\'è solo un tipo di azione consiste nel mandare un messaggio email.
|
||||
Inoltre, tali azioni definiscono il modello da utilizzare per l\'invio della e-mail così come gli altri parametri del messaggio come, l\'importanza dei destinatari, etc
|
||||
</p>
|
||||
<p>Una Pagina speciale: <a href="../setup/email.test.php" target="_blank">email.test.php</a> è disponibile per il testing e la risoluzione dei problemi di configurazione PHP mail.</p>
|
||||
<p>Per essere eseguite, le azioni devono essere associate ai trigger.
|
||||
Quando è associata a un trigger, ad ogni azione è assegnato un numero "ordine", che specifica in quale ordine le azioni devono essere eseguite.</p>',
|
||||
'UI:NotificationsMenu:Triggers' => 'Triggers',
|
||||
'UI:NotificationsMenu:AvailableTriggers' => 'Triggers Disponibili',
|
||||
'UI:NotificationsMenu:OnCreate' => 'When an object is created~~',
|
||||
'UI:NotificationsMenu:OnStateEnter' => 'Quando un oggetto viene creato',
|
||||
'UI:NotificationsMenu:OnStateLeave' => 'Quando un oggetto lascia un determinato stato',
|
||||
'UI:NotificationsMenu:Actions' => 'Azioni',
|
||||
'UI:NotificationsMenu:AvailableActions' => 'Azioni disponibili',
|
||||
'Menu:AuditCategories' => 'Categorie di Audit',
|
||||
'Menu:AuditCategories+' => '',
|
||||
'Menu:Notifications:Title' => 'Categorie di Audit',
|
||||
'Menu:RunQueriesMenu' => 'Esegui query',
|
||||
'Menu:RunQueriesMenu+' => '',
|
||||
'Menu:DataAdministration' => 'Dati di amministrazione',
|
||||
'Menu:DataAdministration+' => '',
|
||||
'Menu:UniversalSearchMenu' => 'Ricerca universale',
|
||||
'Menu:UniversalSearchMenu+' => '',
|
||||
'Menu:ApplicationLogMenu' => 'Log dell\'applicazione',
|
||||
'Menu:ApplicationLogMenu+' => '',
|
||||
'Menu:ApplicationLogMenu:Title' => 'Log dell\'applicazione',
|
||||
'Menu:UserManagementMenu' => 'Gestione degli utenti',
|
||||
'Menu:UserManagementMenu+' => '',
|
||||
'Menu:ProfilesMenu' => 'Profili',
|
||||
'Menu:ProfilesMenu+' => '',
|
||||
'Menu:ProfilesMenu:Title' => 'Profili',
|
||||
'Menu:UserAccountsMenu' => 'Account utente',
|
||||
'Menu:UserAccountsMenu+' => '',
|
||||
'Menu:UserAccountsMenu:Title' => 'Account utente',
|
||||
'UI:iTopVersion:Short' => 'Versione iTop %1$s',
|
||||
'UI:iTopVersion:Long' => 'Versione iTop %1$s-%2$s costruita il %3$s',
|
||||
'UI:PropertiesTab' => 'Proprietà',
|
||||
'UI:OpenDocumentInNewWindow_' => 'Apri questo documento in una nuova finestra: %1$s',
|
||||
'UI:DownloadDocument_' => 'Scarica questo documento: %1$s',
|
||||
'UI:Document:NoPreview' => 'Non è disponibile un\'anteprima per questo tipo di documento',
|
||||
'UI:DeadlineMissedBy_duration' => 'Mancati %1$s',
|
||||
'UI:Deadline_LessThan1Min' => '< 1 min',
|
||||
'UI:Deadline_Minutes' => '%1$d min',
|
||||
'UI:Deadline_Hours_Minutes' => '%1$dh %2$dmin',
|
||||
'UI:Deadline_Days_Hours_Minutes' => '%1$dg %2$dh %3$dmin',
|
||||
'UI:Help' => 'Aiuto',
|
||||
'UI:PasswordConfirm' => '(Conferma)',
|
||||
'UI:BeforeAdding_Class_ObjectsSaveThisObject' => 'Prima di aggiungere più %1$s oggetti, salva questo oggetto.',
|
||||
'UI:DisplayThisMessageAtStartup' => 'Visualizza questo messaggio in fase di avvio',
|
||||
'UI:RelationshipGraph' => 'Visualizzazione grafica',
|
||||
'UI:RelationshipList' => 'Lista',
|
||||
'UI:OperationCancelled' => 'Operazione Annullata',
|
||||
'Portal:Title' => 'Portale Utente iTop',
|
||||
'Portal:Refresh' => 'Ricarica',
|
||||
'Portal:Back' => 'Indietro',
|
||||
'Portal:CreateNewRequest' => 'Crea una nuova richiesta',
|
||||
'Portal:ChangeMyPassword' => 'Cambia la mia password',
|
||||
'Portal:Disconnect' => 'Disconnetti',
|
||||
'Portal:OpenRequests' => 'Le mie richieste aperte',
|
||||
'Portal:ResolvedRequests' => 'Le mie richieste risolte',
|
||||
'Portal:SelectService' => 'Seleziona un servizio dal catalogo:',
|
||||
'Portal:PleaseSelectOneService' => 'Si prega di selezionare un servizio',
|
||||
'Portal:SelectSubcategoryFrom_Service' => 'Seleziona una sotto-categoria per il servizio %1$s:',
|
||||
'Portal:PleaseSelectAServiceSubCategory' => 'Si prega di selezionare una delle sottocategorie',
|
||||
'Portal:DescriptionOfTheRequest' => 'Inserisci la descrizione della tua richiesta:',
|
||||
'Portal:TitleRequestDetailsFor_Request' => 'Dettagli per la richiesta %1$s:',
|
||||
'Portal:NoOpenRequest' => 'Nessuna richiesta in questa categoria.',
|
||||
'Portal:Button:CloseTicket' => 'Chiudi questo ticket',
|
||||
'Portal:EnterYourCommentsOnTicket' => 'Inserisci il tuo commento sulla risoluzione di questo ticket:',
|
||||
'Portal:ErrorNoContactForThisUser' => 'Errore: l\'utente corrente non è associato ad un Contatto/Persona. Si prega di contattare l\'amministratore.',
|
||||
'Portal:Attachments' => 'Allegati',
|
||||
'Portal:AddAttachment' => ' Aggiungi allegati ',
|
||||
'Portal:RemoveAttachment' => ' Rimuovi allegati ',
|
||||
'Portal:Attachment_No_To_Ticket_Name' => 'Allegato #%1$d a %2$s (%3$s)',
|
||||
'Enum:Undefined' => 'Non definito',
|
||||
'UI:DurationForm_Days_Hours_Minutes_Seconds' => '%1$s Giorni %2$s Ore %3$s Minuti %4$s Secondi',
|
||||
'UI:ModifyAllPageTitle' => 'Modifica Tutto',
|
||||
'UI:Modify_N_ObjectsOf_Class' => 'Modifica %1$d oggetto della classe %2$s',
|
||||
'UI:Modify_M_ObjectsOf_Class_OutOf_N' => 'Modifica %1$d oggetto della classe %2$s fuori da %3$d~~',
|
||||
'UI:Menu:ModifyAll' => 'Modifica...',
|
||||
'UI:Button:ModifyAll' => 'Modifica tutto',
|
||||
'UI:Button:PreviewModifications' => 'Anteprima Modifiche >>~~',
|
||||
'UI:ModifiedObject' => 'Oggetto Modificato',
|
||||
'UI:BulkModifyStatus' => 'Operazioni',
|
||||
'UI:BulkModifyStatus+' => '',
|
||||
'UI:BulkModifyErrors' => 'Errori (eventuali)',
|
||||
'UI:BulkModifyErrors+' => '',
|
||||
'UI:BulkModifyStatusOk' => 'Ok',
|
||||
'UI:BulkModifyStatusError' => 'Errore',
|
||||
'UI:BulkModifyStatusModified' => 'Modificato',
|
||||
'UI:BulkModifyStatusSkipped' => 'Saltato',
|
||||
'UI:BulkModify_Count_DistinctValues' => '%1$d valori distinti:',
|
||||
'UI:BulkModify:Value_Exists_N_Times' => '%1$s, %2$d volta(e)',
|
||||
'UI:BulkModify:N_MoreValues' => '%1$d più valori...~~',
|
||||
'UI:AttemptingToSetAReadOnlyAttribute_Name' => 'Tentativo di impostare il campo di sola lettura: %1$s',
|
||||
'UI:FailedToApplyStimuli' => 'L\'azione non è riuscita.',
|
||||
'UI:StimulusModify_N_ObjectsOf_Class' => '%1$s: Modifica %2$d oggetti della classe %3$s~~',
|
||||
'UI:CaseLogTypeYourTextHere' => 'Digitare il tuo testo qui:',
|
||||
'UI:CaseLog:DateFormat' => 'A-m-g H:m:s',
|
||||
'UI:CaseLog:Header_Date_UserName' => '%1$s - %2$s:~~',
|
||||
'UI:CaseLog:InitialValue' => 'Valore iniziale:',
|
||||
'UI:AttemptingToSetASlaveAttribute_Name' => 'Il campo %1$s on è scrivibile, perché è comandato dalla sincronizzazione dei dati. Valore non impostato.',
|
||||
'UI:ActionNotAllowed' => 'Non hai i permessi per eseguire questa azione su questi oggetti.',
|
||||
'UI:BulkAction:NoObjectSelected' => 'Si prega di selezionare almeno un oggetto per eseguire questa operazione',
|
||||
'UI:AttemptingToChangeASlaveAttribute_Name' => 'Il campo %1$s on è scrivibile, perché è comandato dalla sincronizzazione dei dati. Valore rimane invariato.',
|
||||
));
|
||||
?>
|
||||
@@ -1,474 +1,488 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
|
||||
Dict::Add('PT BR', 'English', 'English', array(
|
||||
'Core:AttributeLinkedSet' => 'Array of objects',
|
||||
'Core:AttributeLinkedSet+' => 'Any kind of objects [subclass] of the same class',
|
||||
|
||||
'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: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:AttributeWikiText' => 'Wiki article',
|
||||
'Core:AttributeWikiText+' => 'Wiki formatted text',
|
||||
|
||||
'Core:AttributeDateTime' => 'Date/time',
|
||||
'Core:AttributeDateTime+' => 'Date and time (year-month-day hh:mm:ss)',
|
||||
|
||||
'Core:AttributeDate' => 'Date',
|
||||
'Core:AttributeDate+' => 'Date (year-month-day)',
|
||||
|
||||
'Core:AttributeDeadline' => 'Deadline',
|
||||
'Core:AttributeDeadline+' => 'Date, displayed relatively to the current time',
|
||||
|
||||
'Core:AttributeExternalKey' => 'External key',
|
||||
'Core:AttributeExternalKey+' => 'External (or foreign) key',
|
||||
|
||||
'Core:AttributeExternalField' => 'External field',
|
||||
'Core:AttributeExternalField+' => 'Field mapped from 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)',
|
||||
));
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Classes in 'core/cmdb'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
//
|
||||
// Class: CMDBChange
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:CMDBChange' => 'Mudanças',
|
||||
'Class:CMDBChange+' => 'Monitoramento Mudanças',
|
||||
'Class:CMDBChange/Attribute:date' => 'data',
|
||||
'Class:CMDBChange/Attribute:date+' => 'data e hora que as mudanças tenham sido registradas.',
|
||||
'Class:CMDBChange/Attribute:userinfo' => 'misc. info',
|
||||
'Class:CMDBChange/Attribute:userinfo+' => 'Solicitante definido informação',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: CMDBChangeOp
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:CMDBChangeOp' => 'Operação Mudança',
|
||||
'Class:CMDBChangeOp+' => 'Controle Operação Mudança',
|
||||
'Class:CMDBChangeOp/Attribute:change' => 'mudanças',
|
||||
'Class:CMDBChangeOp/Attribute:change+' => 'mudanças',
|
||||
'Class:CMDBChangeOp/Attribute:date' => 'data',
|
||||
'Class:CMDBChangeOp/Attribute:date+' => 'data e hora das mudanças',
|
||||
'Class:CMDBChangeOp/Attribute:userinfo' => 'usuário',
|
||||
'Class:CMDBChangeOp/Attribute:userinfo+' => 'quem fez esta mudanças',
|
||||
'Class:CMDBChangeOp/Attribute:objclass' => 'classe objeto',
|
||||
'Class:CMDBChangeOp/Attribute:objclass+' => 'classe objeto',
|
||||
'Class:CMDBChangeOp/Attribute:objkey' => 'id objeto',
|
||||
'Class:CMDBChangeOp/Attribute:objkey+' => 'objeto',
|
||||
'Class:CMDBChangeOp/Attribute:finalclass' => 'tipo',
|
||||
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: CMDBChangeOpCreate
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:CMDBChangeOpCreate' => 'objeto criado',
|
||||
'Class:CMDBChangeOpCreate+' => 'Controle criação objeto',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: CMDBChangeOpDelete
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:CMDBChangeOpDelete' => 'objeto apagado',
|
||||
'Class:CMDBChangeOpDelete+' => 'Controle objeto eliminado',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: CMDBChangeOpSetAttribute
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:CMDBChangeOpSetAttribute' => 'objeto alterado',
|
||||
'Class:CMDBChangeOpSetAttribute+' => 'Controle do objeto alterado',
|
||||
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => 'Atributo',
|
||||
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => 'código da modificação',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: CMDBChangeOpSetAttributeScalar
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:CMDBChangeOpSetAttributeScalar' => 'mudança propriedade',
|
||||
'Class:CMDBChangeOpSetAttributeScalar+' => 'controle da mudança propriedade do objeto',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'Valor anterior',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => 'valores anteriores do atributo',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'Novo valor',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => 'novo valor do atributo',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: CMDBChangeOpSetAttributeBlob
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:CMDBChangeOpSetAttributeBlob' => 'mudança dado',
|
||||
'Class:CMDBChangeOpSetAttributeBlob+' => 'controle mudança dado',
|
||||
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'Dado anterior',
|
||||
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => 'conteúdo anterior do atributo',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: CMDBChangeOpSetAttributeText
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:CMDBChangeOpSetAttributeText' => 'mudança texto',
|
||||
'Class:CMDBChangeOpSetAttributeText+' => 'controle mudança texto',
|
||||
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Dado anterior',
|
||||
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => 'conteúdo anterior do atributo',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: Event
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:Event' => 'Log Eventos',
|
||||
'Class:Event+' => 'An application internal event',
|
||||
'Class:Event/Attribute:message' => 'mensagem',
|
||||
'Class:Event/Attribute:message+' => 'descrição curta do evento',
|
||||
'Class:Event/Attribute:date' => 'data',
|
||||
'Class:Event/Attribute:date+' => 'data e hora em que as mudanças tenham sido registadas',
|
||||
'Class:Event/Attribute:userinfo' => 'info usu´rio',
|
||||
'Class:Event/Attribute:userinfo+' => 'identificação do usuário queestava fazendo a ação e desencadeou este evento',
|
||||
'Class:Event/Attribute:finalclass' => 'tipo',
|
||||
'Class:Event/Attribute:finalclass+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: EventNotification
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:EventNotification' => 'Notificação evento',
|
||||
'Class:EventNotification+' => 'Trace of a notification that has been sent',
|
||||
'Class:EventNotification/Attribute:trigger_id' => 'Trigger',
|
||||
'Class:EventNotification/Attribute:trigger_id+' => 'conta usuário',
|
||||
'Class:EventNotification/Attribute:action_id' => 'usuário',
|
||||
'Class:EventNotification/Attribute:action_id+' => 'conta usuário',
|
||||
'Class:EventNotification/Attribute:object_id' => 'Objeto id',
|
||||
'Class:EventNotification/Attribute:object_id+' => 'objeto id (classe definida pela trigger ?)',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: EventNotificationEmail
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:EventNotificationEmail' => 'Enviando evento Email',
|
||||
'Class:EventNotificationEmail+' => 'Controle de um email que foi enviado',
|
||||
'Class:EventNotificationEmail/Attribute:to' => 'Para',
|
||||
'Class:EventNotificationEmail/Attribute:to+' => 'Para',
|
||||
'Class:EventNotificationEmail/Attribute:cc' => 'CC',
|
||||
'Class:EventNotificationEmail/Attribute:cc+' => 'CC',
|
||||
'Class:EventNotificationEmail/Attribute:bcc' => 'BCC',
|
||||
'Class:EventNotificationEmail/Attribute:bcc+' => 'BCC',
|
||||
'Class:EventNotificationEmail/Attribute:from' => 'De',
|
||||
'Class:EventNotificationEmail/Attribute:from+' => 'Rementente da mensagem',
|
||||
'Class:EventNotificationEmail/Attribute:subject' => 'Assunto',
|
||||
'Class:EventNotificationEmail/Attribute:subject+' => 'Assunto',
|
||||
'Class:EventNotificationEmail/Attribute:body' => 'Corpo',
|
||||
'Class:EventNotificationEmail/Attribute:body+' => 'Corpo',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: EventIssue
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:EventIssue' => 'Emissão de evento',
|
||||
'Class:EventIssue+' => 'Controle da emissão (atenção, erros, etc.)',
|
||||
'Class:EventIssue/Attribute:issue' => 'Emissão',
|
||||
'Class:EventIssue/Attribute:issue+' => 'O que aconteceu?',
|
||||
'Class:EventIssue/Attribute:impact' => 'Impacto',
|
||||
'Class:EventIssue/Attribute:impact+' => 'Quais são as consequências?',
|
||||
'Class:EventIssue/Attribute:page' => 'Página',
|
||||
'Class:EventIssue/Attribute:page+' => 'HTTP ponto de entrada',
|
||||
'Class:EventIssue/Attribute:arguments_post' => 'Postados argumentos',
|
||||
'Class:EventIssue/Attribute:arguments_post+' => 'HTTP POST argumentos',
|
||||
'Class:EventIssue/Attribute:arguments_get' => 'URL argumentos',
|
||||
'Class:EventIssue/Attribute:arguments_get+' => 'HTTP GET argumentos',
|
||||
'Class:EventIssue/Attribute:callstack' => 'Callstack',
|
||||
'Class:EventIssue/Attribute:callstack+' => 'Call stack',
|
||||
'Class:EventIssue/Attribute:data' => 'Dado',
|
||||
'Class:EventIssue/Attribute:data+' => 'Mais informações',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: EventWebService
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:EventWebService' => 'Evento Web service',
|
||||
'Class:EventWebService+' => 'Controle chamado do web service',
|
||||
'Class:EventWebService/Attribute:verb' => 'Verb',
|
||||
'Class:EventWebService/Attribute:verb+' => 'Nome da operação',
|
||||
'Class:EventWebService/Attribute:result' => 'Resultado',
|
||||
'Class:EventWebService/Attribute:result+' => 'Visão geral successos/falhas',
|
||||
'Class:EventWebService/Attribute:log_info' => 'Info log',
|
||||
'Class:EventWebService/Attribute:log_info+' => 'Resultado info log',
|
||||
'Class:EventWebService/Attribute:log_warning' => 'Log atenção',
|
||||
'Class:EventWebService/Attribute:log_warning+' => 'Resultado Log atenção',
|
||||
'Class:EventWebService/Attribute:log_error' => 'Log erro',
|
||||
'Class:EventWebService/Attribute:log_error+' => 'Resultado log erro',
|
||||
'Class:EventWebService/Attribute:data' => 'Dado',
|
||||
'Class:EventWebService/Attribute:data+' => 'Resultado dado',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: Action
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:Action' => 'Personalizar Ação',
|
||||
'Class:Action+' => 'Ação definida usuário',
|
||||
'Class:Action/Attribute:name' => 'Nome',
|
||||
'Class:Action/Attribute:name+' => '',
|
||||
'Class:Action/Attribute:description' => 'Descrição',
|
||||
'Class:Action/Attribute:description+' => '',
|
||||
'Class:Action/Attribute:status' => 'Status',
|
||||
'Class:Action/Attribute:status+' => 'Em produção ou ?',
|
||||
'Class:Action/Attribute:status/Value:test' => 'Que está sendo testado',
|
||||
'Class:Action/Attribute:status/Value:test+' => 'Que está sendo testado',
|
||||
'Class:Action/Attribute:status/Value:enabled' => 'Em produção',
|
||||
'Class:Action/Attribute:status/Value:enabled+' => 'Em produção',
|
||||
'Class:Action/Attribute:status/Value:disabled' => 'Inativo',
|
||||
'Class:Action/Attribute:status/Value:disabled+' => 'Inativo',
|
||||
'Class:Action/Attribute:trigger_list' => 'Triggers relacionados',
|
||||
'Class:Action/Attribute:trigger_list+' => 'Triggers ligado a esta ação',
|
||||
'Class:Action/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Action/Attribute:finalclass+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: ActionNotification
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:ActionNotification' => 'Notificação',
|
||||
'Class:ActionNotification+' => 'Notificação (abstrato)',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: ActionEmail
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:ActionEmail' => 'Email notificação',
|
||||
'Class:ActionEmail+' => '',
|
||||
'Class:ActionEmail/Attribute:test_recipient' => 'Teste destino',
|
||||
'Class:ActionEmail/Attribute:test_recipient+' => 'Destinatário o status está como "Teste"',
|
||||
'Class:ActionEmail/Attribute:from' => 'De',
|
||||
'Class:ActionEmail/Attribute:from+' => 'Será enviado dentro do cabeçalho do email',
|
||||
'Class:ActionEmail/Attribute:reply_to' => 'Responder para',
|
||||
'Class:ActionEmail/Attribute:reply_to+' => 'Será enviado dentro do cabeçalho do email',
|
||||
'Class:ActionEmail/Attribute:to' => 'Para',
|
||||
'Class:ActionEmail/Attribute:to+' => 'Destinatário para o email',
|
||||
'Class:ActionEmail/Attribute:cc' => 'Cc',
|
||||
'Class:ActionEmail/Attribute:cc+' => 'Com cópia',
|
||||
'Class:ActionEmail/Attribute:bcc' => 'bcc',
|
||||
'Class:ActionEmail/Attribute:bcc+' => 'Com cópia oculta',
|
||||
'Class:ActionEmail/Attribute:subject' => 'assunto',
|
||||
'Class:ActionEmail/Attribute:subject+' => 'Título do email',
|
||||
'Class:ActionEmail/Attribute:body' => 'corpo',
|
||||
'Class:ActionEmail/Attribute:body+' => 'Conteúdo do email',
|
||||
'Class:ActionEmail/Attribute:importance' => 'importância',
|
||||
'Class:ActionEmail/Attribute:importance+' => 'Flag importância',
|
||||
'Class:ActionEmail/Attribute:importance/Value:low' => 'baixo',
|
||||
'Class:ActionEmail/Attribute:importance/Value:low+' => 'baixo',
|
||||
'Class:ActionEmail/Attribute:importance/Value:normal' => 'normal',
|
||||
'Class:ActionEmail/Attribute:importance/Value:normal+' => 'normal',
|
||||
'Class:ActionEmail/Attribute:importance/Value:high' => 'alto',
|
||||
'Class:ActionEmail/Attribute:importance/Value:high+' => 'alto',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: Trigger
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:Trigger' => 'Trigger',
|
||||
'Class:Trigger+' => 'Personalizar manipulador de eventos',
|
||||
'Class:Trigger/Attribute:description' => 'Descrição',
|
||||
'Class:Trigger/Attribute:description+' => 'uma linha descrição',
|
||||
'Class:Trigger/Attribute:action_list' => 'Ações desencadeadas',
|
||||
'Class:Trigger/Attribute:action_list+' => 'Ações executadas quando a Trigger é ativado',
|
||||
'Class:Trigger/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Trigger/Attribute:finalclass+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: TriggerOnObject
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:TriggerOnObject' => 'Trigger (classe dependente)',
|
||||
'Class:TriggerOnObject+' => 'Trigger em uma determinada classe de objetos',
|
||||
'Class:TriggerOnObject/Attribute:target_class' => 'Alvo classe',
|
||||
'Class:TriggerOnObject/Attribute:target_class+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: TriggerOnStateChange
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:TriggerOnStateChange' => 'Trigger (em estato mudança)',
|
||||
'Class:TriggerOnStateChange+' => 'Trigger sobre a mudança de estado do objeto',
|
||||
'Class:TriggerOnStateChange/Attribute:state' => 'Estado',
|
||||
'Class:TriggerOnStateChange/Attribute:state+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: TriggerOnStateEnter
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:TriggerOnStateEnter' => 'Trigger (ao entrar em um estado)',
|
||||
'Class:TriggerOnStateEnter+' => 'Trigger sobre a mudança de estado do objeto - entrar',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: TriggerOnStateLeave
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:TriggerOnStateLeave' => 'Trigger (na saída de um estado)',
|
||||
'Class:TriggerOnStateLeave+' => 'Trigger sobre a mudança de estado do objeto - deixando',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: TriggerOnObjectCreate
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:TriggerOnObjectCreate' => 'Trigger (sobre a criação do objeto)',
|
||||
'Class:TriggerOnObjectCreate+' => 'Trigger sobre a criação do objeto de [uma classe filha de] uma determinada classe',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: lnkTriggerAction
|
||||
//
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:lnkTriggerAction' => 'Ação/Trigger',
|
||||
'Class:lnkTriggerAction+' => 'Ligação entre uma trigger e uma ação',
|
||||
'Class:lnkTriggerAction/Attribute:action_id' => 'Ação',
|
||||
'Class:lnkTriggerAction/Attribute:action_id+' => 'Ação a ser executada',
|
||||
'Class:lnkTriggerAction/Attribute:action_name' => 'Ação',
|
||||
'Class:lnkTriggerAction/Attribute:action_name+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_id' => 'Trigger',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_name' => 'Trigger',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:order' => 'Ordem',
|
||||
'Class:lnkTriggerAction/Attribute:order+' => 'AAções executadas ordem',
|
||||
));
|
||||
|
||||
|
||||
?>
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @author Marco Tulio <mtulio@opensolucoes.com.br>
|
||||
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:ActionEmail' => 'Email notificação',
|
||||
'Class:ActionEmail+' => '',
|
||||
'Class:ActionEmail/Attribute:test_recipient' => 'Teste destino',
|
||||
'Class:ActionEmail/Attribute:test_recipient+' => 'Destinatário o status está como "Teste"',
|
||||
'Class:ActionEmail/Attribute:from' => 'De',
|
||||
'Class:ActionEmail/Attribute:from+' => 'Será enviado dentro do cabeçalho do email',
|
||||
'Class:ActionEmail/Attribute:reply_to' => 'Responder para',
|
||||
'Class:ActionEmail/Attribute:reply_to+' => 'Será enviado dentro do cabeçalho do email',
|
||||
'Class:ActionEmail/Attribute:to' => 'Para',
|
||||
'Class:ActionEmail/Attribute:to+' => 'Destinatário para o email',
|
||||
'Class:ActionEmail/Attribute:cc' => 'Cc',
|
||||
'Class:ActionEmail/Attribute:cc+' => 'Com cópia',
|
||||
'Class:ActionEmail/Attribute:bcc' => 'bcc',
|
||||
'Class:ActionEmail/Attribute:bcc+' => 'Com cópia oculta',
|
||||
'Class:ActionEmail/Attribute:subject' => 'assunto',
|
||||
'Class:ActionEmail/Attribute:subject+' => 'Título do email',
|
||||
'Class:ActionEmail/Attribute:body' => 'corpo',
|
||||
'Class:ActionEmail/Attribute:body+' => 'Conteúdo do email',
|
||||
'Class:ActionEmail/Attribute:importance' => 'importância',
|
||||
'Class:ActionEmail/Attribute:importance+' => 'Flag importância',
|
||||
'Class:ActionEmail/Attribute:importance/Value:high' => 'alto',
|
||||
'Class:ActionEmail/Attribute:importance/Value:high+' => 'alto',
|
||||
'Class:ActionEmail/Attribute:importance/Value:low' => 'baixo',
|
||||
'Class:ActionEmail/Attribute:importance/Value:low+' => 'baixo',
|
||||
'Class:ActionEmail/Attribute:importance/Value:normal' => 'normal',
|
||||
'Class:ActionEmail/Attribute:importance/Value:normal+' => 'normal',
|
||||
'Class:TriggerOnStateEnter' => 'Trigger (ao entrar em um estado)',
|
||||
'Class:TriggerOnStateEnter+' => 'Trigger sobre a mudança de estado do objeto - entrar',
|
||||
'Class:TriggerOnStateLeave' => 'Trigger (na saída de um estado)',
|
||||
'Class:TriggerOnStateLeave+' => 'Trigger sobre a mudança de estado do objeto - deixando',
|
||||
'Class:TriggerOnObjectCreate' => 'Trigger (sobre a criação do objeto)',
|
||||
'Class:TriggerOnObjectCreate+' => 'Trigger sobre a criação do objeto de [uma classe filha de] uma determinada classe',
|
||||
'Class:lnkTriggerAction' => 'Ação/Trigger',
|
||||
'Class:lnkTriggerAction+' => 'Ligação entre uma trigger e uma ação',
|
||||
'Class:lnkTriggerAction/Attribute:action_id' => 'Ação',
|
||||
'Class:lnkTriggerAction/Attribute:action_id+' => 'Ação a ser executada',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_id' => 'Trigger',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:order' => 'Ordem',
|
||||
'Class:lnkTriggerAction/Attribute:order+' => 'AAções executadas ordem',
|
||||
'Class:AsyncSendEmail' => 'Email (assíncrono)',
|
||||
'Class:AsyncSendEmail/Attribute:to' => 'Para',
|
||||
'Class:AsyncSendEmail/Attribute:subject' => 'Assunto',
|
||||
'Class:AsyncSendEmail/Attribute:body' => 'Corpo',
|
||||
'Class:AsyncSendEmail/Attribute:header' => 'Cabeçalho',
|
||||
'Class:CMDBChange' => 'Mudanças',
|
||||
'Class:CMDBChange+' => 'Monitoramento Mudanças',
|
||||
'Class:CMDBChange/Attribute:date' => 'data',
|
||||
'Class:CMDBChange/Attribute:date+' => 'data e hora que as mudanças tenham sido registradas.',
|
||||
'Class:CMDBChange/Attribute:userinfo' => 'misc. info',
|
||||
'Class:CMDBChange/Attribute:userinfo+' => 'Solicitante definido informação',
|
||||
'Class:CMDBChangeOp' => 'Operação Mudança',
|
||||
'Class:CMDBChangeOp+' => 'Controle Operação Mudança',
|
||||
'Class:CMDBChangeOp/Attribute:change' => 'mudanças',
|
||||
'Class:CMDBChangeOp/Attribute:change+' => 'mudanças',
|
||||
'Class:CMDBChangeOp/Attribute:objclass' => 'classe objeto',
|
||||
'Class:CMDBChangeOp/Attribute:objclass+' => 'classe objeto',
|
||||
'Class:CMDBChangeOp/Attribute:objkey' => 'id objeto',
|
||||
'Class:CMDBChangeOp/Attribute:objkey+' => 'objeto',
|
||||
'Class:CMDBChangeOp/Attribute:finalclass' => 'tipo',
|
||||
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
|
||||
'Class:CMDBChangeOpCreate' => 'objeto criado',
|
||||
'Class:CMDBChangeOpCreate+' => 'Controle criação objeto',
|
||||
'Class:CMDBChangeOpDelete' => 'objeto apagado',
|
||||
'Class:CMDBChangeOpDelete+' => 'Controle objeto eliminado',
|
||||
'Class:CMDBChangeOpSetAttribute' => 'objeto alterado',
|
||||
'Class:CMDBChangeOpSetAttribute+' => 'Controle do objeto alterado',
|
||||
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => 'Atributo',
|
||||
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => 'código da modificação',
|
||||
'Class:CMDBChangeOpSetAttributeScalar' => 'mudança propriedade',
|
||||
'Class:CMDBChangeOpSetAttributeScalar+' => 'controle da mudança propriedade do objeto',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'Valor anterior',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => 'valores anteriores do atributo',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'Novo valor',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => 'novo valor do atributo',
|
||||
'Class:CMDBChangeOpSetAttributeBlob' => 'mudança dado',
|
||||
'Class:CMDBChangeOpSetAttributeBlob+' => 'controle mudança dado',
|
||||
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'Dado anterior',
|
||||
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => 'conteúdo anterior do atributo',
|
||||
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Senha criptografada',
|
||||
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Valores anteriores',
|
||||
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Campo criptografado',
|
||||
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Valores anteriores',
|
||||
'Class:CMDBChangeOpSetAttributeText' => 'mudança texto',
|
||||
'Class:CMDBChangeOpSetAttributeText+' => 'controle mudança texto',
|
||||
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Dado anterior',
|
||||
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => 'conteúdo anterior do atributo',
|
||||
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Caso Log',
|
||||
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Última entrada',
|
||||
'Class:Event' => 'Log Eventos',
|
||||
'Class:Event+' => 'Um pedido de evento interno',
|
||||
'Class:Event/Attribute:message' => 'mensagem',
|
||||
'Class:Event/Attribute:message+' => 'descrição curta do evento',
|
||||
'Class:Event/Attribute:date' => 'data',
|
||||
'Class:Event/Attribute:date+' => 'data e hora em que as mudanças tenham sido registadas',
|
||||
'Class:Event/Attribute:userinfo' => 'info usuário',
|
||||
'Class:Event/Attribute:userinfo+' => 'identificação do usuário queestava fazendo a ação e desencadeou este evento',
|
||||
'Class:Event/Attribute:finalclass' => 'tipo',
|
||||
'Class:Event/Attribute:finalclass+' => '',
|
||||
'Class:EventNotification' => 'Notificação evento',
|
||||
'Class:EventNotification+' => 'Trace of a notification that has been sent',
|
||||
'Class:EventNotification/Attribute:trigger_id' => 'Trigger',
|
||||
'Class:EventNotification/Attribute:trigger_id+' => 'conta usuário',
|
||||
'Class:EventNotification/Attribute:action_id' => 'usuário',
|
||||
'Class:EventNotification/Attribute:action_id+' => 'conta usuário',
|
||||
'Class:EventNotification/Attribute:object_id' => 'Objeto id',
|
||||
'Class:EventNotification/Attribute:object_id+' => 'objeto id (classe definida pela trigger ?)',
|
||||
'Class:EventNotificationEmail' => 'Enviando evento Email',
|
||||
'Class:EventNotificationEmail+' => 'Controle de um email que foi enviado',
|
||||
'Class:EventNotificationEmail/Attribute:to' => 'Para',
|
||||
'Class:EventNotificationEmail/Attribute:to+' => 'Para',
|
||||
'Class:EventNotificationEmail/Attribute:cc' => 'CC',
|
||||
'Class:EventNotificationEmail/Attribute:cc+' => 'CC',
|
||||
'Class:EventNotificationEmail/Attribute:bcc' => 'BCC',
|
||||
'Class:EventNotificationEmail/Attribute:bcc+' => 'BCC',
|
||||
'Class:EventNotificationEmail/Attribute:from' => 'De',
|
||||
'Class:EventNotificationEmail/Attribute:from+' => 'Rementente da mensagem',
|
||||
'Class:EventNotificationEmail/Attribute:subject' => 'Assunto',
|
||||
'Class:EventNotificationEmail/Attribute:subject+' => 'Assunto',
|
||||
'Class:EventNotificationEmail/Attribute:body' => 'Corpo',
|
||||
'Class:EventNotificationEmail/Attribute:body+' => 'Corpo',
|
||||
'Class:EventIssue' => 'Emissão de evento',
|
||||
'Class:EventIssue+' => 'Controle da emissão (atenção, erros, etc.)',
|
||||
'Class:EventIssue/Attribute:issue' => 'Emissão',
|
||||
'Class:EventIssue/Attribute:issue+' => 'O que aconteceu?',
|
||||
'Class:EventIssue/Attribute:impact' => 'Impacto',
|
||||
'Class:EventIssue/Attribute:impact+' => 'Quais são as consequências?',
|
||||
'Class:EventIssue/Attribute:page' => 'Página',
|
||||
'Class:EventIssue/Attribute:page+' => 'HTTP ponto de entrada',
|
||||
'Class:EventIssue/Attribute:arguments_post' => 'Postados argumentos',
|
||||
'Class:EventIssue/Attribute:arguments_post+' => 'HTTP POST argumentos',
|
||||
'Class:EventIssue/Attribute:arguments_get' => 'URL argumentos',
|
||||
'Class:EventIssue/Attribute:arguments_get+' => 'HTTP GET argumentos',
|
||||
'Class:EventIssue/Attribute:callstack' => 'PilhaChamada',
|
||||
'Class:EventIssue/Attribute:callstack+' => 'Pilha de chamada',
|
||||
'Class:EventIssue/Attribute:data' => 'Dado',
|
||||
'Class:EventIssue/Attribute:data+' => 'Mais informações',
|
||||
'Class:EventWebService' => 'Evento Web service',
|
||||
'Class:EventWebService+' => 'Controle chamado do web service',
|
||||
'Class:EventWebService/Attribute:verb' => 'Verbo',
|
||||
'Class:EventWebService/Attribute:verb+' => 'Nome da operação',
|
||||
'Class:EventWebService/Attribute:result' => 'Resultado',
|
||||
'Class:EventWebService/Attribute:result+' => 'Visão geral successos/falhas',
|
||||
'Class:EventWebService/Attribute:log_info' => 'Info log',
|
||||
'Class:EventWebService/Attribute:log_info+' => 'Resultado info log',
|
||||
'Class:EventWebService/Attribute:log_warning' => 'Log atenção',
|
||||
'Class:EventWebService/Attribute:log_warning+' => 'Resultado Log atenção',
|
||||
'Class:EventWebService/Attribute:log_error' => 'Log erro',
|
||||
'Class:EventWebService/Attribute:log_error+' => 'Resultado log erro',
|
||||
'Class:EventWebService/Attribute:data' => 'Dado',
|
||||
'Class:EventWebService/Attribute:data+' => 'Resultado dado',
|
||||
'Class:EventLoginUsage' => 'Uso Login',
|
||||
'Class:EventLoginUsage+' => '',
|
||||
'Class:EventLoginUsage/Attribute:user_id' => 'Entrar',
|
||||
'Class:EventLoginUsage/Attribute:user_id+' => '',
|
||||
'Class:SynchroDataSource' => 'Fontes de dados de sincronização',
|
||||
'Class:SynchroDataSource/Attribute:name' => 'Nome',
|
||||
'Class:SynchroDataSource/Attribute:name+' => '',
|
||||
'Class:SynchroDataSource/Attribute:description' => 'Descrição',
|
||||
'Class:SynchroDataSource/Attribute:status' => 'Status',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implementação',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsoleto',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Produção',
|
||||
'Class:SynchroDataSource/Attribute:user_id' => 'Usuário',
|
||||
'Class:SynchroDataSource/Attribute:notify_contact_id' => 'Contato para notificação',
|
||||
'Class:SynchroDataSource/Attribute:notify_contact_id+' => '',
|
||||
'Class:SynchroDataSource/Attribute:scope_class' => 'Classe alvo',
|
||||
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Restrição de escopo',
|
||||
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Intervalo de carga total',
|
||||
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => '',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Política de conciliação',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Use os atributos',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Use o campo primary_key',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Ação sobre o zero',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Criar',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Erro',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one' => 'Ação sobre o um',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Erro',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Atualizar',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Ação em muitos',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Criar',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Erro',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Pegue o primeiro (acaso?)',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy' => 'Apagar política',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Apagar',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignorar',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Atualizar',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Atualizar, em seguida, Apagar',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Atualizar regra',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_update+' => '',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Retenção Duração',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => '',
|
||||
'Class:SynchroDataSource/Attribute:attribute_list' => 'Lista atributos',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'Usuários permitidos',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy+' => '',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Somente administradores',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Toda permissão para excluir esses objetos',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Ninguém',
|
||||
'Class:SynchroDataSource/Attribute:url_icon' => 'Icone\'s hyperlink',
|
||||
'Class:SynchroDataSource/Attribute:url_icon+' => '',
|
||||
'Class:SynchroDataSource/Attribute:url_application' => 'Aplicação hyperlink',
|
||||
'Class:SynchroDataSource/Attribute:url_application+' => '',
|
||||
'Class:SynchroAttribute' => 'Synchro atributo',
|
||||
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Sycnhro origem dado',
|
||||
'Class:SynchroAttribute/Attribute:attcode' => 'Código atributo',
|
||||
'Class:SynchroAttribute/Attribute:update' => 'Atualizar',
|
||||
'Class:SynchroAttribute/Attribute:reconcile' => 'Reconciliar',
|
||||
'Class:SynchroAttribute/Attribute:update_policy' => 'Atualizar política',
|
||||
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'Bloqueado',
|
||||
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'Desbloqueado',
|
||||
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Inicializar se vazio',
|
||||
'Class:SynchroAttribute/Attribute:finalclass' => 'Classe',
|
||||
'Class:SynchroAttExtKey' => 'Atributo sincronia (ExtKey)',
|
||||
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Reconciliar atributos',
|
||||
'Class:SynchroAttLinkSet' => 'Atributo sincronia (Linkset)',
|
||||
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Separador linhas',
|
||||
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Separador atributos',
|
||||
'Class:SynchroLog' => 'Sincronia Log',
|
||||
'Class:SynchroLog/Attribute:sync_source_id' => 'Sincronização fonte dados',
|
||||
'Class:SynchroLog/Attribute:start_date' => 'Data início',
|
||||
'Class:SynchroLog/Attribute:end_date' => 'Data final',
|
||||
'Class:SynchroLog/Attribute:status' => 'Status',
|
||||
'Class:SynchroLog/Attribute:status/Value:completed' => 'Completado',
|
||||
'Class:SynchroLog/Attribute:status/Value:error' => 'Erro',
|
||||
'Class:SynchroLog/Attribute:status/Value:running' => 'Em execução',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nro réplica visita',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nro réplica total',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nro objetos apagados',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nro de erros enquanto apagando',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nro objetos obsoletos',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nro de erros enquanto obsoletos',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nro objetos criados',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nro de erros enquanto criando',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nro objetos atualizados',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nro erros enquanto atualizando',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nro de erros durante reconciliação',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nro réplica desaparecido',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nro objetos atualizados',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nro objetos não alterados',
|
||||
'Class:SynchroLog/Attribute:last_error' => 'Último erro',
|
||||
'Class:SynchroLog/Attribute:traces' => 'Traços',
|
||||
'Class:SynchroReplica' => 'Synchro Réplica',
|
||||
'Class:SynchroReplica/Attribute:sync_source_id' => 'Synchro origem dado',
|
||||
'Class:SynchroReplica/Attribute:dest_id' => 'Destino objeto (ID)',
|
||||
'Class:SynchroReplica/Attribute:dest_class' => 'Tipo Destino',
|
||||
'Class:SynchroReplica/Attribute:status_last_seen' => 'Última visita',
|
||||
'Class:SynchroReplica/Attribute:status' => 'Status',
|
||||
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modificação',
|
||||
'Class:SynchroReplica/Attribute:status/Value:new' => 'Novo',
|
||||
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Obsoleto',
|
||||
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Orfão',
|
||||
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Sincronizado',
|
||||
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Objeto criado?',
|
||||
'Class:SynchroReplica/Attribute:status_last_error' => 'Último erro',
|
||||
'Class:SynchroReplica/Attribute:info_creation_date' => 'Data criação',
|
||||
'Class:SynchroReplica/Attribute:info_last_modified' => 'Última data modificação',
|
||||
'Class:appUserPreferences' => 'Preferências usuário',
|
||||
'Class:appUserPreferences/Attribute:userid' => 'Usuários',
|
||||
'Class:appUserPreferences/Attribute:preferences' => 'Prefs',
|
||||
'Core:AttributeLinkedSet' => 'Ordem de objetos',
|
||||
'Core:AttributeLinkedSet+' => 'Qualquer tipo objeto [sub-classe] da mesma classe',
|
||||
'Core:AttributeLinkedSetIndirect' => 'Ordem de objetos (N-N)',
|
||||
'Core:AttributeLinkedSetIndirect+' => 'Qualquer tipo objeto [sub-classe] da mesma classe',
|
||||
'Core:AttributeInteger' => 'Inteiro',
|
||||
'Core:AttributeInteger+' => 'Valor número (não pode ser negativo)',
|
||||
'Core:AttributeDecimal' => 'Decimal',
|
||||
'Core:AttributeDecimal+' => 'Valor decimal (não pode ser negativo)',
|
||||
'Core:AttributeBoolean' => 'Boolean',
|
||||
'Core:AttributeBoolean+' => 'Boolean',
|
||||
'Core:AttributeString' => 'String',
|
||||
'Core:AttributeString+' => 'String alfa-numéricos',
|
||||
'Core:AttributeClass' => 'Classe',
|
||||
'Core:AttributeClass+' => 'Classe',
|
||||
'Core:AttributeApplicationLanguage' => 'Linguagem Usuário',
|
||||
'Core:AttributeApplicationLanguage+' => 'Linguagem e País (pt BR)',
|
||||
'Core:AttributeFinalClass' => 'Classe (auto)',
|
||||
'Core:AttributeFinalClass+' => 'Classe real do objeto (automaticamente criado pelo núcleo)',
|
||||
'Core:AttributePassword' => 'Senha',
|
||||
'Core:AttributePassword+' => 'Senha de um dispositivo externo',
|
||||
'Core:AttributeEncryptedString' => 'Senha criptografado',
|
||||
'Core:AttributeEncryptedString+' => 'String criptografada com uma chave local',
|
||||
'Core:AttributeText' => 'Texto',
|
||||
'Core:AttributeText+' => 'Cadeia de caracteres multi-linhas',
|
||||
'Core:AttributeHTML' => 'HTML',
|
||||
'Core:AttributeHTML+' => 'HTML string',
|
||||
'Core:AttributeEmailAddress' => 'Endereço Email',
|
||||
'Core:AttributeEmailAddress+' => 'Endereço Email',
|
||||
'Core:AttributeIPAddress' => 'Endereço IP',
|
||||
'Core:AttributeIPAddress+' => 'Endereço IP',
|
||||
'Core:AttributeOQL' => 'OQL',
|
||||
'Core:AttributeOQL+' => 'Expressão linguagem consulta objetos',
|
||||
'Core:AttributeEnum' => 'Enum',
|
||||
'Core:AttributeEnum+' => 'Lista de pré-seqüências alfanuméricas',
|
||||
'Core:AttributeTemplateString' => 'Modelo string',
|
||||
'Core:AttributeTemplateString+' => 'String contendo espaços reservados',
|
||||
'Core:AttributeTemplateText' => 'Modelo texto',
|
||||
'Core:AttributeTemplateText+' => 'Texto contendo espaços reservados',
|
||||
'Core:AttributeTemplateHTML' => 'Modelo HTML',
|
||||
'Core:AttributeTemplateHTML+' => 'HTML contendo espaços reservados',
|
||||
'Core:AttributeDateTime' => 'Data/hora',
|
||||
'Core:AttributeDateTime+' => 'Data e hora (ano-mês-dia hh:mm:ss)',
|
||||
'Core:AttributeDate' => 'Data',
|
||||
'Core:AttributeDate+' => 'Data (ano-mês-dia)',
|
||||
'Core:AttributeDeadline' => 'Prazo',
|
||||
'Core:AttributeDeadline+' => 'Data, apresentada em relação ao tempo real',
|
||||
'Core:AttributeExternalKey' => 'Chave externa',
|
||||
'Core:AttributeExternalKey+' => 'Chave externa (ou estrangeira)',
|
||||
'Core:AttributeExternalField' => 'Campo externo',
|
||||
'Core:AttributeExternalField+' => 'Campo mapeado por uma chave externa',
|
||||
'Core:AttributeURL' => 'URL',
|
||||
'Core:AttributeURL+' => 'URL absoluta ou relativa, como uma seqüência de texto',
|
||||
'Core:AttributeBlob' => 'Blob',
|
||||
'Core:AttributeBlob+' => 'Qualquer conteúdo binário (documento)',
|
||||
'Core:AttributeOneWayPassword' => 'Uma forma senha',
|
||||
'Core:AttributeOneWayPassword+' => 'One way encrypted (hashed) password',
|
||||
'Core:AttributeTable' => 'Tabela',
|
||||
'Core:AttributeTable+' => 'Matriz cadastrada ter duas dimensões',
|
||||
'Core:AttributePropertySet' => 'Propriedades',
|
||||
'Core:AttributePropertySet+' => 'Lista de propriedades não tipado (nome e valor)',
|
||||
'Class:CMDBChangeOp/Attribute:date' => 'data',
|
||||
'Class:CMDBChangeOp/Attribute:date+' => 'data e hora das mudanças',
|
||||
'Class:CMDBChangeOp/Attribute:userinfo' => 'usuário',
|
||||
'Class:CMDBChangeOp/Attribute:userinfo+' => 'quem fez esta mudanças',
|
||||
'Change:ObjectCreated' => 'Objeto criado',
|
||||
'Change:ObjectDeleted' => 'Objeto apagado',
|
||||
'Change:ObjectModified' => 'Objeto modificado',
|
||||
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s configurado para %2$s (valor anterior: %3$s)',
|
||||
'Change:AttName_SetTo' => '%1$s configurado para %2$s',
|
||||
'Change:Text_AppendedTo_AttName' => '%1$s anexado ao %2$s',
|
||||
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s modificado, valor anterior: %2$s',
|
||||
'Change:AttName_Changed' => '%1$s modificado',
|
||||
'Change:AttName_EntryAdded' => '%1$s modificado, nova entrada adicionada.',
|
||||
'Class:EventLoginUsage/Attribute:contact_name' => 'Nome usuário',
|
||||
'Class:EventLoginUsage/Attribute:contact_name+' => '',
|
||||
'Class:EventLoginUsage/Attribute:contact_email' => 'Email usuários',
|
||||
'Class:EventLoginUsage/Attribute:contact_email+' => '',
|
||||
'Class:Action' => 'Personalizar Ação',
|
||||
'Class:Action+' => 'Ação definida usuário',
|
||||
'Class:Action/Attribute:name' => 'Nome',
|
||||
'Class:Action/Attribute:name+' => '',
|
||||
'Class:Action/Attribute:description' => 'Descrição',
|
||||
'Class:Action/Attribute:description+' => '',
|
||||
'Class:Action/Attribute:status' => 'Status',
|
||||
'Class:Action/Attribute:status+' => 'Em produção ou ?',
|
||||
'Class:Action/Attribute:status/Value:test' => 'Que está sendo testado',
|
||||
'Class:Action/Attribute:status/Value:test+' => 'Que está sendo testado',
|
||||
'Class:Action/Attribute:status/Value:enabled' => 'Em produção',
|
||||
'Class:Action/Attribute:status/Value:enabled+' => 'Em produção',
|
||||
'Class:Action/Attribute:status/Value:disabled' => 'Inativo',
|
||||
'Class:Action/Attribute:status/Value:disabled+' => 'Inativo',
|
||||
'Class:Action/Attribute:trigger_list' => 'Triggers relacionados',
|
||||
'Class:Action/Attribute:trigger_list+' => 'Triggers ligado a esta ação',
|
||||
'Class:Action/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Action/Attribute:finalclass+' => '',
|
||||
'Class:ActionNotification' => 'Notificação',
|
||||
'Class:ActionNotification+' => 'Notificação (abstrato)',
|
||||
'Class:Trigger' => 'Trigger',
|
||||
'Class:Trigger+' => 'Personalizar manipulador de eventos',
|
||||
'Class:Trigger/Attribute:description' => 'Descrição',
|
||||
'Class:Trigger/Attribute:description+' => 'uma linha descrição',
|
||||
'Class:Trigger/Attribute:action_list' => 'Ações desencadeadas',
|
||||
'Class:Trigger/Attribute:action_list+' => 'Ações executadas quando a Trigger é ativado',
|
||||
'Class:Trigger/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Trigger/Attribute:finalclass+' => '',
|
||||
'Class:TriggerOnObject' => 'Trigger (classe dependente)',
|
||||
'Class:TriggerOnObject+' => 'Trigger em uma determinada classe de objetos',
|
||||
'Class:TriggerOnObject/Attribute:target_class' => 'Alvo classe',
|
||||
'Class:TriggerOnObject/Attribute:target_class+' => '',
|
||||
'Class:TriggerOnStateChange' => 'Trigger (em estato mudança)',
|
||||
'Class:TriggerOnStateChange+' => 'Trigger sobre a mudança de estado do objeto',
|
||||
'Class:TriggerOnStateChange/Attribute:state' => 'Estado',
|
||||
'Class:TriggerOnStateChange/Attribute:state+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:action_name' => 'Ação',
|
||||
'Class:lnkTriggerAction/Attribute:action_name+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_name' => 'Trigger',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Ninguém',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Somente administradores',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'Todos usuários permitidos',
|
||||
'SynchroDataSource:Description' => 'Descrição',
|
||||
'SynchroDataSource:Reconciliation' => 'Pesquisar & reconciliação',
|
||||
'SynchroDataSource:Deletion' => 'Apagar regras',
|
||||
'SynchroDataSource:Status' => 'Status',
|
||||
'SynchroDataSource:Information' => 'Informação',
|
||||
'SynchroDataSource:Definition' => 'Definição',
|
||||
'Core:SynchroAttributes' => 'Atributos',
|
||||
'Core:SynchroStatus' => 'Status',
|
||||
'Core:Synchro:ErrorsLabel' => 'Erro',
|
||||
'Core:Synchro:CreatedLabel' => 'Criado',
|
||||
'Core:Synchro:ModifiedLabel' => 'Modificado',
|
||||
'Core:Synchro:UnchangedLabel' => 'Não alterado',
|
||||
'Core:Synchro:ReconciledErrorsLabel' => 'Erro',
|
||||
'Core:Synchro:ReconciledLabel' => 'Reconciliação',
|
||||
'Core:Synchro:ReconciledNewLabel' => 'Criado',
|
||||
'Core:SynchroReconcile:Yes' => 'Sim',
|
||||
'Core:SynchroReconcile:No' => 'Não',
|
||||
'Core:SynchroUpdate:Yes' => 'Sim',
|
||||
'Core:SynchroUpdate:No' => 'Não',
|
||||
'Core:Synchro:LastestStatus' => 'Último Status',
|
||||
'Core:Synchro:History' => 'Histórico de sincronização',
|
||||
'Core:Synchro:NeverRun' => 'Este sincronismo nunca foi executado. Sem registo ainda.',
|
||||
'Core:Synchro:SynchroEndedOn_Date' => 'A última sincronização terminou em% 1 $ s.',
|
||||
'Core:Synchro:SynchroRunningStartedOn_Date' => 'A sincronização começou em $1$s e em execução ainda...',
|
||||
'Menu:DataSources' => 'Fontes de dados de sincronização',
|
||||
'Menu:DataSources+' => '',
|
||||
'Core:Synchro:label_repl_ignored' => 'Ignorado (%1$s)',
|
||||
'Core:Synchro:label_repl_disappeared' => 'Desaparecido (%1$s)',
|
||||
'Core:Synchro:label_repl_existing' => 'Existente (%1$s)',
|
||||
'Core:Synchro:label_repl_new' => 'Novo (%1$s)',
|
||||
'Core:Synchro:label_obj_deleted' => 'Apagado (%1$s)',
|
||||
'Core:Synchro:label_obj_obsoleted' => 'Obsoleto (%1$s)',
|
||||
'Core:Synchro:label_obj_disappeared_errors' => 'Erros (%1$s)',
|
||||
'Core:Synchro:label_obj_disappeared_no_action' => 'Nenhuma ação (%1$s)',
|
||||
'Core:Synchro:label_obj_unchanged' => 'Não alterado (%1$s)',
|
||||
'Core:Synchro:label_obj_updated' => 'Atualizado (%1$s)',
|
||||
'Core:Synchro:label_obj_updated_errors' => 'Erros (%1$s)',
|
||||
'Core:Synchro:label_obj_new_unchanged' => 'Não alterado (%1$s)',
|
||||
'Core:Synchro:label_obj_new_updated' => 'Atualizado (%1$s)',
|
||||
'Core:Synchro:label_obj_created' => 'Criado (%1$s)',
|
||||
'Core:Synchro:label_obj_new_errors' => 'Erros (%1$s)',
|
||||
'Core:SynchroLogTitle' => '%1$s - %2$s',
|
||||
'Core:Synchro:Nb_Replica' => 'Réplica processadas: %1$s',
|
||||
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
|
||||
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Na chave de reconciliação pelo menos um deve ser especificado, ou a política de reconciliação deve ser o de utilizar a chave primária.',
|
||||
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'Um período de retenção a apagar deve ser especificado, desde que os objetos serão excluídos após ser marcado como obsoleto.',
|
||||
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Objetos obsoletos devem ser atualizados, mas nenhuma atualização é especificado.',
|
||||
'Core:SynchroReplica:PublicData' => 'Dados públicos',
|
||||
'Core:SynchroReplica:PrivateDetails' => 'Detalhes privativos',
|
||||
'Core:SynchroReplica:BackToDataSource' => 'Voltar para a fonte de dados sincronizada:: %1$s',
|
||||
'Core:SynchroReplica:ListOfReplicas' => 'Lista de réplica',
|
||||
'Core:SynchroAttExtKey:ReconciliationById' => 'id (Chave primária)',
|
||||
'Core:SynchroAtt:attcode' => 'Atributos',
|
||||
'Core:SynchroAtt:attcode+' => '',
|
||||
'Core:SynchroAtt:reconciliation' => 'Reconciliação?',
|
||||
'Core:SynchroAtt:reconciliation+' => '',
|
||||
'Core:SynchroAtt:update' => 'Atualizar?',
|
||||
'Core:SynchroAtt:update+' => '',
|
||||
'Core:SynchroAtt:update_policy' => 'Atualização Política',
|
||||
'Core:SynchroAtt:update_policy+' => '',
|
||||
'Core:SynchroAtt:reconciliation_attcode' => 'Chave reconciliação',
|
||||
'Core:SynchroAtt:reconciliation_attcode+' => '',
|
||||
'Core:SyncDataExchangeComment' => '(DataExchange)',
|
||||
'Core:Synchro:ListOfDataSources' => 'Lista de fontes de dados:',
|
||||
'Core:Synchro:LastSynchro' => 'Última sincronização:',
|
||||
'Core:Synchro:ThisObjectIsSynchronized' => 'Este objeto é sincronizado com uma fonte de dados externa',
|
||||
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'O objeto foi <b>criado</b> por uma fonte dados externa %1$s',
|
||||
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'O objeto <b>não pode ser apagado</b> por uma fonte dados externa %1$s',
|
||||
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'Você <b>não pode apagar o objeto</b> porque é propriedade de uma fonte dados externa %1$s',
|
||||
'TitleSynchroExecution' => 'Execução da sincronização',
|
||||
'Class:SynchroDataSource:DataTable' => 'Tabela de banco de dados: %1$s',
|
||||
'Core:SyncDataSourceObsolete' => 'A fonte de dados está marcada como obsoleto. Operação cancelada.',
|
||||
'Core:SyncDataSourceAccessRestriction' => 'Somente administradores ou o usuário especificado na fonte de dados pode executar essa operação. Operação cancelada.',
|
||||
'Core:SyncTooManyMissingReplicas' => 'Todos os registros foram tocados por algum tempo (todos os objetos podem ser apagados). Verifique se o processo que grava na tabela de sincronização ainda está em execução. Operação cancelada.',
|
||||
'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',
|
||||
));
|
||||
?>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -107,6 +107,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
|
||||
'Change:ObjectCreated' => 'Объект создан',
|
||||
'Change:ObjectDeleted' => 'Объект удалён',
|
||||
'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 изменено',
|
||||
|
||||
@@ -609,6 +609,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
|
||||
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'Пакетное удаление %1$d объектов класса %2$s',
|
||||
'UI:Delete:NotAllowedToDelete' => 'Вы не можете удалить этот объект',
|
||||
'UI:Delete:NotAllowedToUpdate_Fields' => 'Вы не можете обновить следующее(ие) поле(я): %1$s',
|
||||
'UI:Error:CannotDeleteBecause' => 'This object could not be deleted because: %1$s',
|
||||
'UI:Error:NotEnoughRightsToDelete' => 'Этот объект не может быть удален, потому что текущий пользователь не имеет достаточных прав',
|
||||
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Этот объект не может быть удален, потому что некоторые ручные операции должны быть выполнены до этого',
|
||||
'UI:Archive_User_OnBehalfOf_User' => '%1$s от имени %2$s',
|
||||
@@ -620,8 +621,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
|
||||
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s удалено.',
|
||||
'UI:Delete:ConfirmDeletionOf_Name' => 'Удаление %1$s',
|
||||
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Удаление %1$d объектов класса %2$s',
|
||||
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Должно быть автоматичски удалено, но вы не можете это сделать',
|
||||
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Необходимо удалить вручную - но вы не можете удалить этот объект, свяжитесь с администратором вашего приложения',
|
||||
// 'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Должно быть автоматичски удалено, но вы не можете это сделать',
|
||||
// 'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Необходимо удалить вручную - но вы не можете удалить этот объект, свяжитесь с администратором вашего приложения',
|
||||
'UI:Delete:WillBeDeletedAutomatically' => 'Будет удалено автоматически',
|
||||
'UI:Delete:MustBeDeletedManually' => 'Необходимо удалить вручную',
|
||||
'UI:Delete:CannotUpdateBecause_Issue' => 'Должно быть автоматически обновлено, но: %1$s',
|
||||
|
||||
@@ -108,6 +108,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
|
||||
'Change:ObjectCreated' => 'Nesne yaratıldı',
|
||||
'Change:ObjectDeleted' => 'Nesne silindi',
|
||||
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s\'nin değeri %2$s olarak atandı (önceki değer: %3$s)',
|
||||
'Change:AttName_SetTo' => '%1$s\'nin değeri %2$s olarak atandı',
|
||||
'Change:Text_AppendedTo_AttName' => '%2$s\'ye %1$s eklendi',
|
||||
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$\'nin değeri deiştirildi, önceki değer: %2$s',
|
||||
'Change:AttName_Changed' => '%1$s değiştirildi',
|
||||
|
||||
@@ -608,6 +608,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
|
||||
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => '%2$s sınıfına ait çoklu %1$d nesne silimi',
|
||||
'UI:Delete:NotAllowedToDelete' => 'Bu nesneyi silmek için yetkiniz yok',
|
||||
'UI:Delete:NotAllowedToUpdate_Fields' => '%1$s alanlarını güncellemek için yetkiniz yok',
|
||||
'UI:Error:CannotDeleteBecause' => 'This object could not be deleted because: %1$s',
|
||||
'UI:Error:NotEnoughRightsToDelete' => 'Nesne yetersiz yetki nedeniyle silinemedi',
|
||||
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Bu nesneyi silmek için öncelikli dışarıdan yapılması gereken işlemler var',
|
||||
'UI:Archive_User_OnBehalfOf_User' => '%1$s on behalf of %2$s',
|
||||
@@ -619,8 +620,8 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
|
||||
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s silindi.',
|
||||
'UI:Delete:ConfirmDeletionOf_Name' => '%1$s\'in silimi',
|
||||
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => '%2$s sınıfına ait %1$d nesnelerinin silimi ',
|
||||
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Otomatik silimesini mi istiyorsunuz, ancak buna yetkiniz yok',
|
||||
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Manuel silinmeli - ancak bu nesneyi silmeye yetkiniz yok, lütfen sistem yöneticisiyle irtibata geçiniz.',
|
||||
// 'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Otomatik silimesini mi istiyorsunuz, ancak buna yetkiniz yok',
|
||||
// 'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Manuel silinmeli - ancak bu nesneyi silmeye yetkiniz yok, lütfen sistem yöneticisiyle irtibata geçiniz.',
|
||||
'UI:Delete:WillBeDeletedAutomatically' => 'Otomatik olarak silinecek',
|
||||
'UI:Delete:MustBeDeletedManually' => 'Manuel silinmeli',
|
||||
'UI:Delete:CannotUpdateBecause_Issue' => 'Otomatik güncellenmeli, ancak: %1$s',
|
||||
|
||||
@@ -107,6 +107,7 @@ 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',
|
||||
|
||||
@@ -607,6 +607,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
|
||||
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => '批量删除 %1$d 个 %2$s 类的对象',
|
||||
'UI:Delete:NotAllowedToDelete' => '您未被允许删除该对象',
|
||||
'UI:Delete:NotAllowedToUpdate_Fields' => '您未被允许更新下述栏目: %1$s',
|
||||
'UI:Error:CannotDeleteBecause' => 'This object could not be deleted because: %1$s',
|
||||
'UI:Error:NotEnoughRightsToDelete' => '该对象不能被删除, 因为当前用户没有足够权限',
|
||||
'UI:Error:CannotDeleteBecauseOfDepencies' => '该对象不能被删除, 因为一些手工操作必须事先完成',
|
||||
'UI:Archive_User_OnBehalfOf_User' => '%1$s on behalf of %2$s',
|
||||
@@ -618,8 +619,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
|
||||
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s 删除了.',
|
||||
'UI:Delete:ConfirmDeletionOf_Name' => '删除 %1$s',
|
||||
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => '删除 %2$s 类的 %1$d 个对象',
|
||||
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => '应该自动删除, 但您未被允许这样做',
|
||||
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => '必须手工删除 - 但您未被允许删除该对象, 请联系您的应用程序系统管理员',
|
||||
// 'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => '应该自动删除, 但您未被允许这样做',
|
||||
// 'UI:Delete:MustBeDeletedManuallyButNotPossible' => '必须手工删除 - 但您未被允许删除该对象, 请联系您的应用程序系统管理员',
|
||||
'UI:Delete:WillBeDeletedAutomatically' => '将被自动删除',
|
||||
'UI:Delete:MustBeDeletedManually' => '必须手工删除',
|
||||
'UI:Delete:CannotUpdateBecause_Issue' => '应该被自动更新, 但是: %1$s',
|
||||
|
||||
@@ -62,11 +62,47 @@ a.internal {
|
||||
a.internal:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.code {
|
||||
background-color: #ccc;
|
||||
padding: 10px;
|
||||
border: 1px solid #999;
|
||||
font-family: Courier, Courier-New, monospace;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="banner"><span>Installation Help</span></div>
|
||||
<div id="content">
|
||||
<h1><a name="Installation">Completing the iTop installation</a></h1>
|
||||
<h2>cron.php - overview</h2>
|
||||
<p>In order to operate properly, iTop maintenance operations and asynchronous tasks must be executed on a regular basis.
|
||||
In order to ease the installation, all the background tasks have been grouped to be launched from a single file: <tt>webservices/cron.php</tt></p>
|
||||
<p>The following features require the activation of cron.php</p>
|
||||
<ul>
|
||||
<li><b>Asynchronous emails</b>. By default, this option is disabled. To enable it, set 'email_asynchronous' to 1 in the configuration file</li>
|
||||
<li><b>Check ticket SLA</b>. Tickets reaching the limits will be passed into Escalation TTO/TTR states</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>For more information about cron.php, check the <a href="https://sourceforge.net/apps/mediawiki/itop/index.php?title=Cron.php">Wiki</a></p>
|
||||
<h2>Scheduling cron.php on Windows</h2>
|
||||
<ol>
|
||||
<li>Edit the file <em><itop root></em>/webservices/<b>cron.params</b> to set the credentials used for cronified tasks (requires administator privileges)</li>
|
||||
<li>Edit the file <em><itop root></em>/webservices/<b>cron.cmd</b>, and set the relevant path for your installation of PHP. If you care about security, it is recommended to change also the path to the parameters file <em><itop root></em>/webservices/<b>cron.params</b> and move this file to a place where its content is not served by the web server.</li>
|
||||
<li>Schedule the execution of cron.cmd:
|
||||
<pre>schtasks.exe /create /tn "iTop CRON" /sc minute /mo 1 /tr "\"<em><itop root></em>/webservices/cron.cmd\""</pre>
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
|
||||
<h2>Scheduling cron.php on Linux/Unix</h2>
|
||||
<ol>
|
||||
<li>Edit the file <em><itop root></em>/webservices/<b>cron.params</b> to set the credentials used for cronified tasks (requires administator privileges)</li>
|
||||
<li>If you care about security: move the file <em><itop root></em>/webservices/<b>cron.params</b> into a directory not in the scope of the web server (Apache), and make it be readable only by the account that will execute the cron</li>
|
||||
<li>Edit the crontab and add the following line:
|
||||
<pre>* * * * * /usr/bin/php <em><itop root></em>/webservices/cron.php --param_file=<em><itop root></em>/webservices/cron.params</pre>
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<h1><a name="Modules">iTop Modules</a></h1>
|
||||
|
||||
<!-- Configuration Management Module -->
|
||||
@@ -75,7 +111,7 @@ a.internal:hover {
|
||||
<p>This module allows IT operators to document all items they have under their control, it implements a CMDB following the ITIL best practices. The module provides a logical model of the IT infrastructure by identifying, controlling, maintaining and verifying the version of all existing Configuration Items (CIs).
|
||||
Relationships between CIs are also documented in the Configuration Management module, so that IT engineers can easily analyze dependencies within the infrastructure and understand the impact due to incidents or changes.</p>
|
||||
<p>Out of the box, iTop 1.0 allows you to manage:</p>
|
||||
<ul>
|
||||
<ul>
|
||||
<li>Persons and Teams</li>
|
||||
<li>Locations</li>
|
||||
<li>Business Processes</li>
|
||||
@@ -89,7 +125,7 @@ Relationships between CIs are also documented in the Configuration Management mo
|
||||
<p><i>This module is the base for all other iTop modules and is automatically installed with iTop</i></p>
|
||||
|
||||
<!-- Service Management Module -->
|
||||
|
||||
|
||||
<h2 id="Service"><a name="ServiceMgmt">Service Management</a></h2>
|
||||
<p>This module allows you to define and maintain the Services provided by your organization, the contracts with your customers and providers and the available Service Levels for each of Service.</p>
|
||||
<p>Using this module, you can document:</p>
|
||||
|
||||
BIN
images/details_sep.gif
Normal file
BIN
images/details_sep.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 38 B |
BIN
images/synchro.png
Normal file
BIN
images/synchro.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.1 KiB |
BIN
images/transp-lock.png
Normal file
BIN
images/transp-lock.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 406 B |
@@ -1,12 +1,12 @@
|
||||
Prerequisites:
|
||||
|
||||
iTop requires
|
||||
- A web server running PHP 5.2.0 or higher, with PCRE, SESSION, mysql, iconv, simplexml and soap support.
|
||||
- A web server running PHP 5.2.0 or higher, with PCRE, SESSION, mysql, iconv, simplexml, hash, json and soap support.
|
||||
If you wish to use LDAP authentication, then LDAP support must be enabled in PHP.
|
||||
- A connection to MySQL 5.0 or higher
|
||||
|
||||
Web browser support:
|
||||
iTop is developed using FireFox 3.x and tested with IE 7 and IE 8.
|
||||
iTop is developed using FireFox 3.x and tested with IE 8, IE 9, Safari 5 and Chrome.
|
||||
|
||||
Installation:
|
||||
|
||||
@@ -21,4 +21,4 @@ Installation:
|
||||
other scripts will be a problem).
|
||||
|
||||
3. Open the main iTop directory in your web browser. iTop should then display
|
||||
the setup instructions on screen.
|
||||
the setup instructions on screen.
|
||||
|
||||
@@ -45,14 +45,57 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
|
||||
this.Search = function()
|
||||
{
|
||||
$('#ac_dlg_'+me.id).dialog('open');
|
||||
this.UpdateSizes();
|
||||
this.UpdateButtons();
|
||||
if($('#'+me.id).attr('disabled')) return; // Disabled, do nothing
|
||||
var value = $('#'+me.id).val(); // Current value
|
||||
|
||||
// Query the server to get the form to search for target objects
|
||||
if (me.bSelectMode)
|
||||
{
|
||||
me.v_html = $('#v_'+me.id).html();
|
||||
$('#v_'+me.id).html('<img src="../images/indicator.gif" />');
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#label_'+me.id).addClass('ac_dlg_loading');
|
||||
}
|
||||
var theMap = { sAttCode: me.sAttCode,
|
||||
iInputId: me.id,
|
||||
sSuffix: me.sSuffix,
|
||||
'class': me.sClass,
|
||||
sValue: value,
|
||||
operation: 'objectSearchForm'
|
||||
}
|
||||
|
||||
// Make sure that we cancel any pending request before issuing another
|
||||
// since responses may arrive in arbitrary order
|
||||
me.StopPendingRequest();
|
||||
|
||||
// Run the query and get the result back directly in HTML
|
||||
me.ajax_request = $.post( '../pages/ajax.render.php', theMap,
|
||||
function(data)
|
||||
{
|
||||
$('#ac_dlg_'+me.id).html(data);
|
||||
$('#ac_dlg_'+me.id).dialog('open');
|
||||
me.UpdateSizes();
|
||||
me.UpdateButtons();
|
||||
me.ajax_request = null;
|
||||
},
|
||||
'html'
|
||||
);
|
||||
}
|
||||
|
||||
this.UpdateSizes = function()
|
||||
{
|
||||
var dlg = $('#ac_dlg_'+me.id);
|
||||
// Adjust the dialog's size to fit into the screen
|
||||
if (dlg.width() > ($(window).width()-40))
|
||||
{
|
||||
dlg.width($(window).width()-40);
|
||||
}
|
||||
if (dlg.height() > ($(window).height()-70))
|
||||
{
|
||||
dlg.height($(window).height()-70);
|
||||
}
|
||||
var searchForm = dlg.find('div.display_block:first'); // Top search form, enclosing display_block
|
||||
var results = $('#dr_'+me.id);
|
||||
padding_right = parseInt(dlg.css('padding-right').replace('px', ''));
|
||||
@@ -65,7 +108,6 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
results.height(height - form_height - 40); // Leave some space for the buttons
|
||||
}
|
||||
|
||||
|
||||
this.UpdateButtons = function()
|
||||
{
|
||||
var okBtn = $('#btn_ok_'+me.id);
|
||||
@@ -83,7 +125,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
{
|
||||
var theMap = { sAttCode: me.sAttCode,
|
||||
iInputId: me.id,
|
||||
sSuffix: me.sSuffix,
|
||||
sSuffix: me.sSuffix
|
||||
}
|
||||
|
||||
// Gather the parameters from the search form
|
||||
@@ -97,8 +139,16 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
}
|
||||
);
|
||||
|
||||
me.oWizardHelper.UpdateWizard();
|
||||
theMap['json'] = me.oWizardHelper.ToJSON();
|
||||
if (me.oWizardHelper == null)
|
||||
{
|
||||
theMap['json'] = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not inside a "search form", updating a real object
|
||||
me.oWizardHelper.UpdateWizard();
|
||||
theMap['json'] = me.oWizardHelper.ToJSON();
|
||||
}
|
||||
|
||||
theMap['sRemoteClass'] = theMap['class']; // swap 'class' (defined in the form) and 'remoteClass'
|
||||
theMap['class'] = me.sClass;
|
||||
@@ -114,7 +164,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
me.StopPendingRequest();
|
||||
|
||||
// Run the query and display the results
|
||||
me.ajax_request = $.post( 'ajax.render.php', theMap,
|
||||
me.ajax_request = $.post( '../pages/ajax.render.php', theMap,
|
||||
function(data)
|
||||
{
|
||||
$(sSearchAreaId).html(data);
|
||||
@@ -134,7 +184,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
{
|
||||
var iObjectId = $('#fr_'+me.id+' input[name=selectObject]:checked').val();
|
||||
$('#ac_dlg_'+this.id).dialog('close');
|
||||
$('#label_'+this.id).addClass('ac_loading');
|
||||
$('#label_'+this.id).addClass('ac_dlg_loading');
|
||||
|
||||
// Query the server again to get the display name of the selected object
|
||||
var theMap = { sAttCode: me.sAttCode,
|
||||
@@ -150,11 +200,11 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
me.StopPendingRequest();
|
||||
|
||||
// Run the query and get the result back directly in JSON
|
||||
me.ajax_request = $.post( 'ajax.render.php', theMap,
|
||||
me.ajax_request = $.post( '../pages/ajax.render.php', theMap,
|
||||
function(data)
|
||||
{
|
||||
$('#label_'+me.id).val(data.name);
|
||||
$('#label_'+me.id).removeClass('ac_loading');
|
||||
$('#label_'+me.id).removeClass('ac_dlg_loading');
|
||||
$('#'+me.id).val(iObjectId);
|
||||
$('#'+me.id).trigger('validate');
|
||||
$('#label_'+me.id).focus();
|
||||
@@ -171,16 +221,20 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
// dialog is very slow. So empty it each time.
|
||||
this.OnClose = function()
|
||||
{
|
||||
me.StopPendingRequest();
|
||||
// called by the dialog, so in the context 'this' points to the jQueryObject
|
||||
if (me.emptyOnClose)
|
||||
{
|
||||
$('#dr_'+me.id).html(me.emptyHtml);
|
||||
}
|
||||
$('#label_'+me.id).removeClass('ac_dlg_loading');
|
||||
$('#label_'+me.id).focus();
|
||||
me.ajax_request = null;
|
||||
}
|
||||
|
||||
this.CreateObject = function(oWizHelper)
|
||||
{
|
||||
if($('#'+me.id).attr('disabled')) return; // Disabled, do nothing
|
||||
// Query the server to get the form to create a target object
|
||||
if (me.bSelectMode)
|
||||
{
|
||||
@@ -189,7 +243,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#label_'+me.id).addClass('ac_loading');
|
||||
$('#label_'+me.id).addClass('ac_dlg_loading');
|
||||
}
|
||||
me.oWizardHelper.UpdateWizard();
|
||||
var theMap = { sAttCode: me.sAttCode,
|
||||
@@ -205,7 +259,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
me.StopPendingRequest();
|
||||
|
||||
// Run the query and get the result back directly in HTML
|
||||
me.ajax_request = $.post( 'ajax.render.php', theMap,
|
||||
me.ajax_request = $.post( '../pages/ajax.render.php', theMap,
|
||||
function(data)
|
||||
{
|
||||
$('#ajax_'+me.id).html(data);
|
||||
@@ -214,6 +268,15 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
// Modify the action of the cancel button
|
||||
$('#ac_create_'+me.id+' button.cancel').unbind('click').click( me.CloseCreateObject );
|
||||
me.ajax_request = null;
|
||||
// Adjust the dialog's size to fit into the screen
|
||||
if ($('#ac_create_'+me.id).width() > ($(window).width()-40))
|
||||
{
|
||||
$('#ac_create_'+me.id).width($(window).width()-40);
|
||||
}
|
||||
if ($('#ac_create_'+me.id).height() > ($(window).height()-70))
|
||||
{
|
||||
$('#ac_create_'+me.id).height($(window).height()-70);
|
||||
}
|
||||
},
|
||||
'html'
|
||||
);
|
||||
@@ -232,7 +295,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#label_'+me.id).removeClass('ac_loading');
|
||||
$('#label_'+me.id).removeClass('ac_dlg_loading');
|
||||
}
|
||||
$('#label_'+me.id).focus();
|
||||
$('#ac_create_'+me.id).dialog("destroy");
|
||||
@@ -275,7 +338,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
me.StopPendingRequest();
|
||||
|
||||
// Run the query and get the result back directly in JSON
|
||||
me.ajax_request = $.post( 'ajax.render.php', theMap,
|
||||
me.ajax_request = $.post( '../pages/ajax.render.php', theMap,
|
||||
function(data)
|
||||
{
|
||||
if (me.bSelectMode)
|
||||
@@ -290,7 +353,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
// Put the value corresponding to the newly created object in the autocomplete
|
||||
$('#label_'+me.id).val(data.name);
|
||||
$('#'+me.id).val(data.id);
|
||||
$('#label_'+me.id).removeClass('ac_loading');
|
||||
$('#label_'+me.id).removeClass('ac_dlg_loading');
|
||||
$('#label_'+me.id).focus();
|
||||
}
|
||||
$('#'+me.id).trigger('validate');
|
||||
@@ -301,4 +364,23 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
|
||||
}
|
||||
return false; // do NOT submit the form
|
||||
}
|
||||
|
||||
this.Update = function()
|
||||
{
|
||||
if ($('#'+me.id).attr('disabled'))
|
||||
{
|
||||
$('#v_'+me.id).html('');
|
||||
$('#label_'+me.id).attr('disabled', 'disabled');
|
||||
$('#label_'+me.id).css({'background': 'transparent'});
|
||||
$('#mini_add_'+me.id).hide();
|
||||
$('#mini_search_'+me.id).hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#label_'+me.id).attr('disabled', '');
|
||||
$('#label_'+me.id).css({'background': '#fff url(../images/ac-background.gif) no-repeat right'});
|
||||
$('#mini_add_'+me.id).show();
|
||||
$('#mini_search_'+me.id).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -107,7 +107,7 @@ function ActivateStep(iTargetStep)
|
||||
// if (oObj['m_aCurrValues'][sAttCode] == '')
|
||||
// {
|
||||
// var oJSON = document.getElementById(sJsonFieldId);
|
||||
// $.get('ajax.render.php?class=' + sClass + '&json_obj=' + oJSON.value + '&att_code=' + sAttCode,
|
||||
// $.get('../pages/ajax.render.php?class=' + sClass + '&json_obj=' + oJSON.value + '&att_code=' + sAttCode,
|
||||
// { operation: "default_value" },
|
||||
// function(json_data){
|
||||
// var oObj = ReloadObjectFromServer(json_data);
|
||||
@@ -174,26 +174,33 @@ function ReportFieldValidationStatus(sFieldId, sFormId, bValid)
|
||||
function ValidateField(sFieldId, sPattern, bMandatory, sFormId, nullValue)
|
||||
{
|
||||
var bValid = true;
|
||||
var currentVal = $('#'+sFieldId).val();
|
||||
if ($('#'+sFieldId).attr('disabled'))
|
||||
{
|
||||
bValid = true; // disabled fields are not checked
|
||||
}
|
||||
else
|
||||
{
|
||||
var currentVal = $('#'+sFieldId).val();
|
||||
|
||||
if (currentVal == '$$NULL$$') // Convention to indicate a non-valid value since it may have to be passed as text
|
||||
{
|
||||
bValid = false;
|
||||
}
|
||||
else if (bMandatory && (currentVal == nullValue))
|
||||
{
|
||||
bValid = false;
|
||||
}
|
||||
else if (currentVal == nullValue)
|
||||
{
|
||||
// An empty field is Ok...
|
||||
bValid = true;
|
||||
}
|
||||
else if (sPattern != '')
|
||||
{
|
||||
re = new RegExp(sPattern);
|
||||
//console.log('Validating field: '+sFieldId + ' current value: '+currentVal + ' pattern: '+sPattern );
|
||||
bValid = re.test(currentVal);
|
||||
if (currentVal == '$$NULL$$') // Convention to indicate a non-valid value since it may have to be passed as text
|
||||
{
|
||||
bValid = false;
|
||||
}
|
||||
else if (bMandatory && (currentVal == nullValue))
|
||||
{
|
||||
bValid = false;
|
||||
}
|
||||
else if (currentVal == nullValue)
|
||||
{
|
||||
// An empty field is Ok...
|
||||
bValid = true;
|
||||
}
|
||||
else if (sPattern != '')
|
||||
{
|
||||
re = new RegExp(sPattern);
|
||||
//console.log('Validating field: '+sFieldId + ' current value: '+currentVal + ' pattern: '+sPattern );
|
||||
bValid = re.test(currentVal);
|
||||
}
|
||||
}
|
||||
ReportFieldValidationStatus(sFieldId, sFormId, bValid);
|
||||
//console.log('Form: '+sFormId+' Validating field: '+sFieldId + ' current value: '+currentVal+' pattern: '+sPattern+' result: '+bValid );
|
||||
@@ -292,6 +299,20 @@ function ValidatePasswordField(id, sFormId)
|
||||
return true;
|
||||
}
|
||||
|
||||
// Manage a 'duration' field
|
||||
function UpdateDuration(iId)
|
||||
{
|
||||
var iDays = parseInt($('#'+iId+'_d').val(), 10);
|
||||
var iHours = parseInt($('#'+iId+'_h').val(), 10);
|
||||
var iMinutes = parseInt($('#'+iId+'_m').val(), 10);
|
||||
var iSeconds = parseInt($('#'+iId+'_s').val(), 10);
|
||||
|
||||
var iDuration = (((iDays*24)+ iHours)*60+ iMinutes)*60 + iSeconds;
|
||||
$('#'+iId).val(iDuration);
|
||||
$('#'+iId).trigger('change');
|
||||
return true;
|
||||
}
|
||||
|
||||
// Called when filling an autocomplete field
|
||||
function OnAutoComplete(id, event, data, formatted)
|
||||
{
|
||||
|
||||
@@ -28,7 +28,6 @@ jQuery.fn.popupmenu = function ()
|
||||
if ( (previous_popup == null) || (previous_popup.get(0) != popupmenu.get(0))) // Comparing the DOM objects
|
||||
{
|
||||
// The user clicked in a different menu, let's open it
|
||||
popupmenu.bgiframe();
|
||||
popupmenu.positionBy({ target: $(this),
|
||||
targetPos: 4,
|
||||
elementPos: 0,
|
||||
|
||||
16
js/jquery.qtip-1.0.min.js
vendored
Normal file
16
js/jquery.qtip-1.0.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -96,7 +96,7 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
|
||||
$(sSearchAreaId).block();
|
||||
|
||||
// Run the query and display the results
|
||||
$.post( 'ajax.render.php', theMap,
|
||||
$.post( '../pages/ajax.render.php', theMap,
|
||||
function(data)
|
||||
{
|
||||
$(sSearchAreaId).html(data);
|
||||
@@ -147,7 +147,7 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
|
||||
theMap['operation'] = 'doAddObjects';
|
||||
$('#busy_'+me.iInputId).html(' <img src="../images/indicator.gif"/>');
|
||||
// Run the query and display the results
|
||||
$.post( 'ajax.render.php', theMap,
|
||||
$.post( '../pages/ajax.render.php', theMap,
|
||||
function(data)
|
||||
{
|
||||
//console.log('Data: ' + data);
|
||||
|
||||
85
js/utils.js
85
js/utils.js
@@ -21,7 +21,7 @@ function ReloadTruncatedList(divId, sSerializedFilter, sExtraParams)
|
||||
console.log('Uh,uh, exception !');
|
||||
}
|
||||
}
|
||||
aTruncatedLists[divId] = $.post('ajax.render.php?style=list',
|
||||
aTruncatedLists[divId] = $.post('../pages/ajax.render.php?style=list',
|
||||
{ operation: 'ajax', filter: sSerializedFilter, extra_params: sExtraParams },
|
||||
function(data)
|
||||
{
|
||||
@@ -76,7 +76,7 @@ function ReloadBlock(divId, sStyle, sSerializedFilter, sExtraParams)
|
||||
{
|
||||
$('#'+divId).block();
|
||||
//$('#'+divId).blockUI();
|
||||
$.post('ajax.render.php?style='+sStyle,
|
||||
$.post('../pages/ajax.render.php?style='+sStyle,
|
||||
{ operation: 'ajax', filter: sSerializedFilter, extra_params: sExtraParams },
|
||||
function(data){
|
||||
$('#'+divId).empty();
|
||||
@@ -135,9 +135,10 @@ function ReloadSearchForm(divId, sClassName, sBaseClass, sContext)
|
||||
aSubmit [index ] = { data:oFormEvents.submit[index].data, namespace:oFormEvents.submit[index].namespace, handler: oFormEvents.submit[index].handler};
|
||||
}
|
||||
}
|
||||
sAction = $('#ds_'+divId+' form').attr('action');
|
||||
|
||||
$.post('ajax.render.php?'+sContext,
|
||||
{ operation: 'search_form', className: sClassName, baseClass: sBaseClass, currentId: divId },
|
||||
$.post('../pages/ajax.render.php?'+sContext,
|
||||
{ operation: 'search_form', className: sClassName, baseClass: sBaseClass, currentId: divId, action: sAction },
|
||||
function(data) {
|
||||
oDiv.empty();
|
||||
oDiv.append(data);
|
||||
@@ -182,7 +183,7 @@ function SetUserPreference(sPreferenceCode, sPrefValue, bPersistent)
|
||||
oUserPreferences[sPreferenceCode] = sPrefValue;
|
||||
if (bPersistent && (sPrefValue != sPreviousValue))
|
||||
{
|
||||
ajax_request = $.post('ajax.render.php',
|
||||
ajax_request = $.post('../pages/ajax.render.php',
|
||||
{ operation: 'set_pref', code: sPreferenceCode, value: sPrefValue} ); // Make it persistent
|
||||
}
|
||||
}
|
||||
@@ -211,4 +212,76 @@ function CheckAll(sSelector, bValue)
|
||||
$(sSelector).each( function() {
|
||||
this.checked = value;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggle (enabled/disabled) the specified field of a form
|
||||
*/
|
||||
function ToogleField(value, field_id)
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
$('#'+field_id).removeAttr('disabled');
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#'+field_id).attr('disabled', 'disabled');
|
||||
}
|
||||
$('#'+field_id).trigger('update');
|
||||
$('#'+field_id).trigger('validate');
|
||||
}
|
||||
|
||||
/**
|
||||
* For the fields that cannot be visually disabled, they can be blocked
|
||||
* @return
|
||||
*/
|
||||
function BlockField(field_id, bBlocked)
|
||||
{
|
||||
if (bBlocked)
|
||||
{
|
||||
$('#'+field_id).block({ message: ' ** disabled ** '});
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#'+field_id).unblock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates (enables/disables) a "duration" field
|
||||
*/
|
||||
function ToggleDurationField(field_id)
|
||||
{
|
||||
// Toggle all the subfields that compose the "duration" input
|
||||
aSubFields = new Array('d', 'h', 'm', 's');
|
||||
|
||||
if ($('#'+field_id).attr('disabled'))
|
||||
{
|
||||
for(var i=0; i<aSubFields.length; i++)
|
||||
{
|
||||
$('#'+field_id+'_'+aSubFields[i]).attr('disabled', 'disabled');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for(var i=0; i<aSubFields.length; i++)
|
||||
{
|
||||
$('#'+field_id+'_'+aSubFields[i]).removeAttr('disabled');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* PropagateCheckBox
|
||||
*/
|
||||
function PropagateCheckBox(bCurrValue, aFieldsList, bCheck)
|
||||
{
|
||||
if (bCurrValue == bCheck)
|
||||
{
|
||||
for(var i=0;i<aFieldsList.length;i++)
|
||||
{
|
||||
$('#enable_'+aFieldsList[i]).attr('checked', bCheck);
|
||||
ToogleField(bCheck, aFieldsList[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -42,7 +42,7 @@ function ManageObjects(sTitle, sClass, sId, sExtKeyToRemote)
|
||||
function Manage_LoadSelect(sSelectedId, sFilter)
|
||||
{
|
||||
$('#'+sSelectedId).addClass('loading');
|
||||
$.post('ajax.render.php',
|
||||
$.post('../pages/ajax.render.php',
|
||||
{ operation: 'combo_options', filter: sFilter },
|
||||
function(data){
|
||||
$('#'+sSelectedId).empty();
|
||||
|
||||
@@ -17,7 +17,7 @@ if (!Array.prototype.indexOf) // Emulation of the indexOf function for IE and ol
|
||||
};
|
||||
}
|
||||
|
||||
function WizardHelper(sClass, sFormPrefix)
|
||||
function WizardHelper(sClass, sFormPrefix, sState)
|
||||
{
|
||||
this.m_oData = { 'm_sClass' : '',
|
||||
'm_oFieldsMap': {},
|
||||
@@ -27,7 +27,8 @@ function WizardHelper(sClass, sFormPrefix)
|
||||
'm_oDefaultValue': {},
|
||||
'm_oAllowedValues': {},
|
||||
'm_iFieldsCount' : 0,
|
||||
'm_sFormPrefix' : sFormPrefix
|
||||
'm_sFormPrefix' : sFormPrefix,
|
||||
'm_sState': sState
|
||||
};
|
||||
this.m_oData.m_sClass = sClass;
|
||||
|
||||
@@ -92,10 +93,16 @@ function WizardHelper(sClass, sFormPrefix)
|
||||
// Set the full HTML for the input field
|
||||
for(i=0; i<this.m_oData.m_aAllowedValuesRequested.length; i++)
|
||||
{
|
||||
sAttCode = this.m_oData.m_aAllowedValuesRequested[i];
|
||||
sFieldId = this.m_oData.m_oFieldsMap[sAttCode];
|
||||
var sAttCode = this.m_oData.m_aAllowedValuesRequested[i];
|
||||
var sFieldId = this.m_oData.m_oFieldsMap[sAttCode];
|
||||
var bDisabled = $('#'+sFieldId).attr('disabled');
|
||||
//console.log('Setting #field_'+sFieldId+' to: '+this.m_oData.m_oAllowedValues[sAttCode]);
|
||||
$('#field_'+sFieldId).html(this.m_oData.m_oAllowedValues[sAttCode]);
|
||||
if (bDisabled)
|
||||
{
|
||||
$('#'+sFieldId).attr('disabled', 'disabled');
|
||||
//$('#'+sFieldId).trigger('update'); // Propagate the disable
|
||||
}
|
||||
aRefreshed.push(sFieldId);
|
||||
}
|
||||
// Set the actual value of the input
|
||||
@@ -113,7 +120,7 @@ function WizardHelper(sClass, sFormPrefix)
|
||||
// For each "refreshed" field, asynchronously trigger a change in case there are dependent fields to update
|
||||
for(i=0; i<aRefreshed.length; i++)
|
||||
{
|
||||
var sString = "$('#"+aRefreshed[i]+"').trigger('change');"
|
||||
var sString = "$('#"+aRefreshed[i]+"').trigger('change').trigger('update');"
|
||||
window.setTimeout(sString, 1); // Synchronous 'trigger' does nothing, call it asynchronously
|
||||
}
|
||||
}
|
||||
@@ -133,7 +140,7 @@ function WizardHelper(sClass, sFormPrefix)
|
||||
{
|
||||
//console.log('data sent:', this.ToJSON());
|
||||
//console.log('oWizard:', this);
|
||||
$.post('ajax.render.php',
|
||||
$.post('../pages/ajax.render.php',
|
||||
{ operation: 'wizard_helper', json_obj: this.ToJSON() },
|
||||
function(html){
|
||||
$('#ajax_content').html(html);
|
||||
@@ -149,7 +156,7 @@ function WizardHelper(sClass, sFormPrefix)
|
||||
{
|
||||
//console.log('data sent:', this.ToJSON());
|
||||
//console.log('oWizard:', this);
|
||||
$('#'+divId).load('ajax.render.php?operation=wizard_helper_preview',
|
||||
$('#'+divId).load('../pages/ajax.render.php?operation=wizard_helper_preview',
|
||||
{'json_obj': this.ToJSON()},
|
||||
function(responseText, textStatus, XMLHttpRequest){
|
||||
$('#wizStep'+ G_iCurrentStep).unblock( {fadeOut: 0} );
|
||||
|
||||
@@ -1,45 +1,28 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
// 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: UserExternal
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:UserExternal' => 'Utilisateur externe à iTop',
|
||||
'Class:UserExternal+' => 'Utilisateur authentifié à l\'extérieur d\'iTop',
|
||||
));
|
||||
|
||||
?>
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:UserExternal' => 'Utilisateur externe à iTop',
|
||||
'Class:UserExternal+' => 'Utilisateur authentifié à l\'extérieur d\'iTop',
|
||||
));
|
||||
?>
|
||||
25
modules/authent-external/hu.dict.authent-external.php
Executable file
25
modules/authent-external/hu.dict.authent-external.php
Executable file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
|
||||
'Class:UserExternal' => 'Külső felhasználó',
|
||||
'Class:UserExternal+' => '',
|
||||
));
|
||||
?>
|
||||
47
modules/authent-external/it.dict.authent-external.php
Normal file
47
modules/authent-external/it.dict.authent-external.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
// 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: UserExternal
|
||||
//
|
||||
|
||||
Dict::Add('IT IT', 'Italian', 'Italiano', array(
|
||||
'Class:UserExternal' => 'Esterno utente',
|
||||
'Class:UserExternal+' => 'Utente autenticato al di fuori di iTop',
|
||||
));
|
||||
|
||||
|
||||
|
||||
?>
|
||||
@@ -40,7 +40,7 @@ class UserExternal extends User
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "login",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('login'),
|
||||
"db_table" => "",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
|
||||
@@ -45,14 +45,6 @@ SetupWebPage::AddModule(
|
||||
'datamodel' => array(
|
||||
'model.authent-external.php',
|
||||
),
|
||||
'dictionary' => array(
|
||||
'en.dict.authent-external.php',
|
||||
'fr.dict.authent-external.php',
|
||||
'de.dict.authent-external.php',
|
||||
'ru.dict.authent-external.php',
|
||||
'tr.dict.authent-external.php',
|
||||
'zh.dict.authent-external.php',
|
||||
),
|
||||
'data.struct' => array(
|
||||
//'data.struct.authent-ldap.xml',
|
||||
),
|
||||
|
||||
@@ -1,47 +1,30 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
// 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: UserLDAP
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:UserLDAP' => 'Utilisateur iTop',
|
||||
'Class:UserLDAP+' => 'Utilisateur authentifié par iTop',
|
||||
'Class:UserLDAP/Attribute:password' => 'Mot de passe LDAP',
|
||||
'Class:UserLDAP/Attribute:password+' => '',
|
||||
));
|
||||
|
||||
?>
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:UserLDAP' => 'Utilisateur LDAP',
|
||||
'Class:UserLDAP+' => 'Utilisateur authentifié par un serveur LDAP',
|
||||
'Class:UserLDAP/Attribute:password' => 'Mot de passe LDAP',
|
||||
'Class:UserLDAP/Attribute:password+' => '',
|
||||
));
|
||||
?>
|
||||
27
modules/authent-ldap/hu.dict.authent-ldap.php
Executable file
27
modules/authent-ldap/hu.dict.authent-ldap.php
Executable file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
|
||||
'Class:UserLDAP' => 'LDAP felhasználó',
|
||||
'Class:UserLDAP+' => '',
|
||||
'Class:UserLDAP/Attribute:password' => 'Jelszó',
|
||||
'Class:UserLDAP/Attribute:password+' => '',
|
||||
));
|
||||
?>
|
||||
49
modules/authent-ldap/it.dict.authent-ldap.php
Normal file
49
modules/authent-ldap/it.dict.authent-ldap.php
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
// 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: UserLDAP
|
||||
//
|
||||
|
||||
Dict::Add('IT IT', 'Italian', 'Italiano', array(
|
||||
'Class:UserLDAP' => 'Utente LDAP',
|
||||
'Class:UserLDAP+' => 'Utente autenticato da LDAP',
|
||||
'Class:UserLDAP/Attribute:password' => 'Password',
|
||||
'Class:UserLDAP/Attribute:password+' => 'user authentication string',
|
||||
));
|
||||
|
||||
|
||||
|
||||
?>
|
||||
@@ -35,7 +35,7 @@ class UserLDAP extends UserInternal
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "login",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('login'),
|
||||
"db_table" => "",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
|
||||
@@ -28,14 +28,6 @@ SetupWebPage::AddModule(
|
||||
'datamodel' => array(
|
||||
'model.authent-ldap.php',
|
||||
),
|
||||
'dictionary' => array(
|
||||
'en.dict.authent-ldap.php',
|
||||
'fr.dict.authent-ldap.php',
|
||||
'de.dict.authent-ldap.php',
|
||||
'ru.dict.authent-ldap.php',
|
||||
'tr.dict.authent-ldap.php',
|
||||
'zh.dict.authent-ldap.php',
|
||||
),
|
||||
'data.struct' => array(
|
||||
//'data.struct.authent-ldap.xml',
|
||||
),
|
||||
|
||||
@@ -1,47 +1,30 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
// 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: UserLocal
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:UserLocal' => 'Utilisateur iTop',
|
||||
'Class:UserLocal+' => 'Utilisateur authentifié par iTop',
|
||||
'Class:UserLocal/Attribute:password' => 'Mot de passe',
|
||||
'Class:UserLocal/Attribute:password+' => '',
|
||||
));
|
||||
|
||||
?>
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:UserLocal' => 'Utilisateur iTop',
|
||||
'Class:UserLocal+' => 'Utilisateur authentifié par iTop',
|
||||
'Class:UserLocal/Attribute:password' => 'Mot de passe',
|
||||
'Class:UserLocal/Attribute:password+' => '',
|
||||
));
|
||||
?>
|
||||
27
modules/authent-local/hu.dict.authent-local.php
Executable file
27
modules/authent-local/hu.dict.authent-local.php
Executable file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
|
||||
'Class:UserLocal' => 'iTop felhasználó',
|
||||
'Class:UserLocal+' => '',
|
||||
'Class:UserLocal/Attribute:password' => 'Jelszó',
|
||||
'Class:UserLocal/Attribute:password+' => '',
|
||||
));
|
||||
?>
|
||||
49
modules/authent-local/it.dict.authent-local.php
Normal file
49
modules/authent-local/it.dict.authent-local.php
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
// 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: UserLocal
|
||||
//
|
||||
|
||||
Dict::Add('IT IT', 'Italian', 'Italiano', array(
|
||||
'Class:UserLocal' => 'Utente iTop',
|
||||
'Class:UserLocal+' => 'Utente autenticato da iTop',
|
||||
'Class:UserLocal/Attribute:password' => 'Password',
|
||||
'Class:UserLocal/Attribute:password+' => 'user authentication string',
|
||||
));
|
||||
|
||||
|
||||
|
||||
?>
|
||||
@@ -35,7 +35,7 @@ class UserLocal extends UserInternal
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "login",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('login'),
|
||||
"db_table" => "priv_user_local",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user