mirror of
https://github.com/Combodo/iTop.git
synced 2026-05-23 01:02:16 +02:00
Compare commits
152 Commits
issue/7746
...
feature/37
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c1bfaa4a8 | ||
|
|
2f54f0a253 | ||
|
|
27022ed93a | ||
|
|
e7b87128b1 | ||
|
|
19fa836758 | ||
|
|
1c5cb1547f | ||
|
|
8d58372074 | ||
|
|
e98c6637ac | ||
|
|
7d2a9d0bfc | ||
|
|
762d1162ca | ||
|
|
d0bdde30ad | ||
|
|
95dbe4c859 | ||
|
|
3fe8b6c696 | ||
|
|
ec6adee9c1 | ||
|
|
baa8bba926 | ||
|
|
8dc5411717 | ||
|
|
6539687f16 | ||
|
|
f1d448fd78 | ||
|
|
a4490e2b5f | ||
|
|
e0b12144cb | ||
|
|
efb7831a5a | ||
|
|
9fadbb5eb1 | ||
|
|
93dba0644d | ||
|
|
ec324bb28e | ||
|
|
dc8f521b12 | ||
|
|
bf6277fcd2 | ||
|
|
886db5d6ad | ||
|
|
79a46581ef | ||
|
|
0e8ddf990c | ||
|
|
346a8eadec | ||
|
|
6948c594c2 | ||
|
|
301a7a92a0 | ||
|
|
73bb80ebea | ||
|
|
1e674d7bdc | ||
|
|
1225ee1e78 | ||
|
|
a91de9fb36 | ||
|
|
71b3a415a6 | ||
|
|
b97c7433c8 | ||
|
|
5a59d16c99 | ||
|
|
11fc958a7b | ||
|
|
a63a3d3d9c | ||
|
|
a151e40b75 | ||
|
|
5780f26817 | ||
|
|
ed6e4f612a | ||
|
|
9a690861a3 | ||
|
|
343f3286b8 | ||
|
|
37fc1a5723 | ||
|
|
16279233e0 | ||
|
|
7a09b3effc | ||
|
|
4f6d514694 | ||
|
|
07964cc404 | ||
|
|
8f8b65a71d | ||
|
|
49e72e83fe | ||
|
|
ea5473ad77 | ||
|
|
f0685e33e1 | ||
|
|
2a888cf5af | ||
|
|
42f391472b | ||
|
|
30ef2735b6 | ||
|
|
548131482a | ||
|
|
bbff0b72d3 | ||
|
|
5ac6c84813 | ||
|
|
0c3a35fc43 | ||
|
|
2dffab9ca0 | ||
|
|
881dbd3c01 | ||
|
|
1cbfa4f1b1 | ||
|
|
81887f480a | ||
|
|
d25bf4ef66 | ||
|
|
5f85757630 | ||
|
|
90f58721b1 | ||
|
|
56d3ac668c | ||
|
|
b20b4b7e82 | ||
|
|
eeabad895d | ||
|
|
9fdf183851 | ||
|
|
0a3b02bf45 | ||
|
|
74ebbc5fa4 | ||
|
|
a762b6a2bb | ||
|
|
32ef639ce1 | ||
|
|
8647a76dbf | ||
|
|
96414dcc98 | ||
|
|
47cd8bce31 | ||
|
|
86c677b2ca | ||
|
|
960129316d | ||
|
|
1fa50f695d | ||
|
|
6ab19d29b9 | ||
|
|
692cf4f635 | ||
|
|
95aa444ee6 | ||
|
|
f5de808c7c | ||
|
|
5c5c5d769f | ||
|
|
fc388313d7 | ||
|
|
d544ee5498 | ||
|
|
ecce0a3376 | ||
|
|
ce187550f6 | ||
|
|
f8e761abe0 | ||
|
|
d3a9e30178 | ||
|
|
5d15a08824 | ||
|
|
0fd2cf85a2 | ||
|
|
8135316119 | ||
|
|
868c0ae836 | ||
|
|
d03d4fce5f | ||
|
|
aa55c2b30f | ||
|
|
9d3b46b919 | ||
|
|
01b4dbba71 | ||
|
|
72ac4096c1 | ||
|
|
19559b08a7 | ||
|
|
346564ca0e | ||
|
|
a64fed66a3 | ||
|
|
261106fa9d | ||
|
|
1556b95653 | ||
|
|
1bf53bae2a | ||
|
|
324cb5eb6c | ||
|
|
eedbf3d266 | ||
|
|
3b197692ec | ||
|
|
29ce042916 | ||
|
|
83539d6d4c | ||
|
|
e6a7b926f6 | ||
|
|
b30e053236 | ||
|
|
ecfc26f1ec | ||
|
|
afd96a0f49 | ||
|
|
a34baf840a | ||
|
|
6f9bd9bae5 | ||
|
|
a77765ec7b | ||
|
|
64b4b03ea9 | ||
|
|
c32b2f9dfe | ||
|
|
a797878b17 | ||
|
|
a1860c82fb | ||
|
|
1fa0f7bdd9 | ||
|
|
f718b4173d | ||
|
|
e057c0f081 | ||
|
|
5a49fc7654 | ||
|
|
6fca659c9d | ||
|
|
eacd08f31e | ||
|
|
d47d65df10 | ||
|
|
5f7d8f6cc0 | ||
|
|
cbb4281a37 | ||
|
|
b42297ad84 | ||
|
|
6cb1cf7b7e | ||
|
|
d7a8d335d5 | ||
|
|
a65dd1c27c | ||
|
|
bd1d447677 | ||
|
|
d85d611642 | ||
|
|
6a00786535 | ||
|
|
6490fe93a1 | ||
|
|
642a13ad0d | ||
|
|
e1bfe9a3b6 | ||
|
|
af8ff9b29f | ||
|
|
bb405d5173 | ||
|
|
fcfdac2844 | ||
|
|
4723fc885c | ||
|
|
06dcae1dd1 | ||
|
|
e03033ce52 | ||
|
|
19eae916f0 | ||
|
|
ce68e270c3 |
@@ -825,49 +825,38 @@ class UserRightsProfile extends UserRightsAddOnAPI
|
||||
{
|
||||
// We are protected by GetSelectFilter: the object set contains objects allowed or shared for reading
|
||||
// We have to answer NO for objects shared for reading purposes
|
||||
if (self::HasSharing())
|
||||
{
|
||||
$aClassProps = SharedObject::GetSharedClassProperties($sClass);
|
||||
if ($aClassProps)
|
||||
{
|
||||
// This class is shared, GetSelectFilter may allow some objects for read only
|
||||
// But currently we are checking wether the objects might be written...
|
||||
// Let's exclude the objects based on the relevant criteria
|
||||
if (self::HasSharing() && SharedObject::GetSharedClassProperties($sClass)) {
|
||||
// This class is shared, GetSelectFilter may allow some objects for read only
|
||||
// But currently we are checking whether the objects might be written...
|
||||
// Let's exclude the objects based on the relevant criteria
|
||||
|
||||
$sOrgAttCode = self::GetOwnerOrganizationAttCode($sClass);
|
||||
if (!is_null($sOrgAttCode))
|
||||
{
|
||||
$aUserOrgs = $this->GetUserOrgs($oUser, $sClass);
|
||||
if (!is_null($aUserOrgs) && count($aUserOrgs) > 0)
|
||||
{
|
||||
$iCountNO = 0;
|
||||
$iCountYES = 0;
|
||||
$oInstanceSet->Rewind();
|
||||
while($oObject = $oInstanceSet->Fetch())
|
||||
{
|
||||
$iOrg = $oObject->Get($sOrgAttCode);
|
||||
if (in_array($iOrg, $aUserOrgs))
|
||||
{
|
||||
$iCountYES++;
|
||||
}
|
||||
else
|
||||
{
|
||||
$iCountNO++;
|
||||
}
|
||||
}
|
||||
if ($iCountNO == 0)
|
||||
{
|
||||
$iPermission = UR_ALLOWED_YES;
|
||||
}
|
||||
elseif ($iCountYES == 0)
|
||||
{
|
||||
$iPermission = UR_ALLOWED_NO;
|
||||
}
|
||||
else
|
||||
{
|
||||
$iPermission = UR_ALLOWED_DEPENDS;
|
||||
// Use $oInstanceSet only if sClass is the main class
|
||||
if (!is_a($oInstanceSet->GetClass(), $sClass, true)) {
|
||||
/** @var \DBObjectSet $oInstanceSet */
|
||||
throw new CoreException(__FUNCTION__.': Expecting object set to be of class '.$sClass.' but it is of class '.$oInstanceSet->GetClass(), ['OQL_Query' => $oInstanceSet->GetFilter()->ToOQL(), 'classes' => $oInstanceSet->GetSelectedClasses()]);
|
||||
}
|
||||
$sOrgAttCode = self::GetOwnerOrganizationAttCode($sClass);
|
||||
if (!is_null($sOrgAttCode)) {
|
||||
$aUserOrgs = $this->GetUserOrgs($oUser, $sClass);
|
||||
if (!is_null($aUserOrgs) && count($aUserOrgs) > 0) {
|
||||
$iCountNO = 0;
|
||||
$iCountYES = 0;
|
||||
$oInstanceSet->Rewind();
|
||||
while ($oObject = $oInstanceSet->Fetch()) {
|
||||
$iOrg = $oObject->Get($sOrgAttCode);
|
||||
if (in_array($iOrg, $aUserOrgs)) {
|
||||
$iCountYES++;
|
||||
} else {
|
||||
$iCountNO++;
|
||||
}
|
||||
}
|
||||
if ($iCountNO == 0) {
|
||||
$iPermission = UR_ALLOWED_YES;
|
||||
} elseif ($iCountYES == 0) {
|
||||
$iPermission = UR_ALLOWED_NO;
|
||||
} else {
|
||||
$iPermission = UR_ALLOWED_DEPENDS;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -982,4 +971,3 @@ class UserRightsProfile extends UserRightsAddOnAPI
|
||||
|
||||
UserRights::SelectModule('UserRightsProfile');
|
||||
|
||||
?>
|
||||
|
||||
@@ -399,25 +399,25 @@ class URP_ActionGrant extends UserRightsBaseClass
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "addon/userrights",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "profileid",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_urp_grant_actions",
|
||||
"db_key_field" => "id",
|
||||
"category" => "addon/userrights",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "profileid",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_urp_grant_actions",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
//MetaModel::Init_InheritAttributes();
|
||||
|
||||
// Common to all grant classes (could be factorized by class inheritence, but this has to be benchmarked)
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass"=>"URP_Profiles", "jointype"=> "", "allowed_values"=>null, "sql"=>"profileid", "is_null_allowed"=>false, "on_target_delete"=>DEL_SILENT, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("profile", array("allowed_values"=>null, "extkey_attcode"=> 'profileid', "target_attcode"=>"name")));
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("class", array("class_category"=>"", "more_values"=>"", "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass" => "URP_Profiles", "jointype" => "", "allowed_values" => null, "sql" => "profileid", "is_null_allowed" => false, "on_target_delete" => DEL_SILENT, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("profile", array("allowed_values" => null, "extkey_attcode" => 'profileid', "target_attcode" => "name")));
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("class", array("class_category" => "", "more_values" => "", "sql" => "class", "default_value" => null, "is_null_allowed" => false, "depends_on" => array(), "class_exclusion_list" => null)));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values" => new ValueSetEnum('yes,no'), "sql" => "permission", "default_value" => "yes", "is_null_allowed" => false, "depends_on" => array())));
|
||||
|
||||
MetaModel::Init_AddAttribute(new AttributeString("action", array("allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("action", array("allowed_values" => null, "sql" => "action", "default_value" => "", "is_null_allowed" => false, "depends_on" => array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('profileid', 'class', 'permission', 'action')); // Attributes to be displayed for the complete details
|
||||
@@ -435,25 +435,25 @@ class URP_StimulusGrant extends UserRightsBaseClass
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "addon/userrights",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "profileid",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_urp_grant_stimulus",
|
||||
"db_key_field" => "id",
|
||||
"category" => "addon/userrights",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "profileid",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_urp_grant_stimulus",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
//MetaModel::Init_InheritAttributes();
|
||||
|
||||
// Common to all grant classes (could be factorized by class inheritence, but this has to be benchmarked)
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass"=>"URP_Profiles", "jointype"=> "", "allowed_values"=>null, "sql"=>"profileid", "is_null_allowed"=>false, "on_target_delete"=>DEL_SILENT, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("profile", array("allowed_values"=>null, "extkey_attcode"=> 'profileid', "target_attcode"=>"name")));
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("class", array("class_category"=>"", "more_values"=>"", "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass" => "URP_Profiles", "jointype" => "", "allowed_values" => null, "sql" => "profileid", "is_null_allowed" => false, "on_target_delete" => DEL_SILENT, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("profile", array("allowed_values" => null, "extkey_attcode" => 'profileid', "target_attcode" => "name")));
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("class", array("class_category" => "", "more_values" => "", "sql" => "class", "default_value" => null, "is_null_allowed" => false, "depends_on" => array(), "class_exclusion_list" => null)));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values" => new ValueSetEnum('yes,no'), "sql" => "permission", "default_value" => "yes", "is_null_allowed" => false, "depends_on" => array())));
|
||||
|
||||
MetaModel::Init_AddAttribute(new AttributeString("stimulus", array("allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("stimulus", array("allowed_values" => null, "sql" => "action", "default_value" => "", "is_null_allowed" => false, "depends_on" => array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('profileid', 'class', 'permission', 'stimulus')); // Attributes to be displayed for the complete details
|
||||
|
||||
@@ -402,7 +402,7 @@ class URP_ClassProjection extends UserRightsBaseClass
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("dimensionid", array("targetclass"=>"URP_Dimensions", "jointype"=> "", "allowed_values"=>null, "sql"=>"dimensionid", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("dimension", array("allowed_values"=>null, "extkey_attcode"=> 'dimensionid', "target_attcode"=>"name")));
|
||||
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("class", array("class_category"=>"", "more_values"=>"", "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("class", array("class_category" => "", "more_values" => "", "sql" => "class", "default_value" => null, "is_null_allowed" => false, "depends_on" => array(), "class_exclusion_list" => null)));
|
||||
|
||||
MetaModel::Init_AddAttribute(new AttributeString("value", array("allowed_values"=>null, "sql"=>"value", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("attribute", array("allowed_values"=>null, "sql"=>"attribute", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
@@ -459,25 +459,25 @@ class URP_ActionGrant extends UserRightsBaseClass
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "addon/userrights",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "profileid",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_urp_grant_actions",
|
||||
"db_key_field" => "id",
|
||||
"category" => "addon/userrights",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "profileid",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_urp_grant_actions",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
//MetaModel::Init_InheritAttributes();
|
||||
|
||||
// Common to all grant classes (could be factorized by class inheritence, but this has to be benchmarked)
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass"=>"URP_Profiles", "jointype"=> "", "allowed_values"=>null, "sql"=>"profileid", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("profile", array("allowed_values"=>null, "extkey_attcode"=> 'profileid', "target_attcode"=>"name")));
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("class", array("class_category"=>"", "more_values"=>"", "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass" => "URP_Profiles", "jointype" => "", "allowed_values" => null, "sql" => "profileid", "is_null_allowed" => false, "on_target_delete" => DEL_MANUAL, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("profile", array("allowed_values" => null, "extkey_attcode" => 'profileid', "target_attcode" => "name")));
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("class", array("class_category" => "", "more_values" => "", "sql" => "class", "default_value" => null, "is_null_allowed" => false, "depends_on" => array(), "class_exclusion_list" => null)));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values" => new ValueSetEnum('yes,no'), "sql" => "permission", "default_value" => "yes", "is_null_allowed" => false, "depends_on" => array())));
|
||||
|
||||
MetaModel::Init_AddAttribute(new AttributeString("action", array("allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("action", array("allowed_values" => null, "sql" => "action", "default_value" => "", "is_null_allowed" => false, "depends_on" => array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('profileid', 'class', 'permission', 'action')); // Attributes to be displayed for the complete details
|
||||
@@ -495,25 +495,25 @@ class URP_StimulusGrant extends UserRightsBaseClass
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "addon/userrights",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "profileid",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_urp_grant_stimulus",
|
||||
"db_key_field" => "id",
|
||||
"category" => "addon/userrights",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "profileid",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_urp_grant_stimulus",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
//MetaModel::Init_InheritAttributes();
|
||||
|
||||
// Common to all grant classes (could be factorized by class inheritence, but this has to be benchmarked)
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass"=>"URP_Profiles", "jointype"=> "", "allowed_values"=>null, "sql"=>"profileid", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("profile", array("allowed_values"=>null, "extkey_attcode"=> 'profileid', "target_attcode"=>"name")));
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("class", array("class_category"=>"", "more_values"=>"", "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass" => "URP_Profiles", "jointype" => "", "allowed_values" => null, "sql" => "profileid", "is_null_allowed" => false, "on_target_delete" => DEL_MANUAL, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("profile", array("allowed_values" => null, "extkey_attcode" => 'profileid', "target_attcode" => "name")));
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("class", array("class_category" => "", "more_values" => "", "sql" => "class", "default_value" => null, "is_null_allowed" => false, "depends_on" => array(), "class_exclusion_list" => null)));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values" => new ValueSetEnum('yes,no'), "sql" => "permission", "default_value" => "yes", "is_null_allowed" => false, "depends_on" => array())));
|
||||
|
||||
MetaModel::Init_AddAttribute(new AttributeString("stimulus", array("allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("stimulus", array("allowed_values" => null, "sql" => "action", "default_value" => "", "is_null_allowed" => false, "depends_on" => array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('profileid', 'class', 'permission', 'stimulus')); // Attributes to be displayed for the complete details
|
||||
|
||||
@@ -698,10 +698,10 @@ HTML
|
||||
$sLinkedClass = $oAttDef->GetLinkedClass();
|
||||
|
||||
// Filter out links pointing to obsolete objects (if relevant)
|
||||
$oOrmLinkSet = $this->Get($sAttCode);
|
||||
$oLinkSet = $oOrmLinkSet->ToDBObjectSet(utils::ShowObsoleteData());
|
||||
$oOrmLinkSet = $this->Get($sAttCode);
|
||||
$oLinkSet = $oOrmLinkSet->ToDBObjectSet(utils::ShowObsoleteData());
|
||||
$iCount = $oLinkSet->Count();
|
||||
|
||||
$iCount = $oLinkSet->Count();
|
||||
if ($this->IsNew()) {
|
||||
$iFlags = $this->GetInitialStateAttributeFlags($sAttCode);
|
||||
} else {
|
||||
@@ -766,9 +766,9 @@ HTML
|
||||
$oPage->add($sHTMLValue);
|
||||
} else {
|
||||
if ($oAttDef->IsIndirect()) {
|
||||
$oBlockLinkSetViewTable = new BlockIndirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly);
|
||||
$oBlockLinkSetViewTable = new BlockIndirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly, $iCount);
|
||||
} else {
|
||||
$oBlockLinkSetViewTable = new BlockDirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly);
|
||||
$oBlockLinkSetViewTable = new BlockDirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly, $iCount);
|
||||
}
|
||||
$oPage->AddUiBlock($oBlockLinkSetViewTable);
|
||||
}
|
||||
@@ -3439,8 +3439,18 @@ EOF
|
||||
}
|
||||
$sInputType = '';
|
||||
$sInputId = 'att_'.$iFieldIndex;
|
||||
$value = $this->Get($sAttCode);
|
||||
$sDisplayValue = $this->GetEditValue($sAttCode);
|
||||
if ($oAttDef instanceof AttributeDateTime && !$oAttDef->IsNullAllowed() && $value === $oAttDef->GetNullValue()) {
|
||||
$value = $oAttDef->GetDefaultValue($this);
|
||||
if ($value !== $oAttDef->GetNullValue()) {
|
||||
// Set default date
|
||||
$this->Set($sAttCode, $value);
|
||||
$sDisplayValue = $this->GetEditValue($sAttCode);
|
||||
}
|
||||
}
|
||||
$sHTMLValue = cmdbAbstractObject::GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef,
|
||||
$this->Get($sAttCode), $this->GetEditValue($sAttCode), $sInputId, '', $iExpectCode,
|
||||
$value, $sDisplayValue, $sInputId, '', $iExpectCode,
|
||||
$aArgs, true, $sInputType);
|
||||
$aAttrib = array(
|
||||
'label' => '<span>'.$oAttDef->GetLabel().'</span>',
|
||||
@@ -5190,7 +5200,7 @@ HTML
|
||||
$aKeys = array_keys($aValues[$sAttCode]);
|
||||
$currValue = $aKeys[0]; // The only value is the first key
|
||||
if ($oAttDef->GetEditClass() == 'LinkedSet') {
|
||||
$oOrmLinkSet = $oDummyObj->Get($sAttCode);
|
||||
$oOrmLinkSet = $oDummyObj->Get($sAttCode);
|
||||
LinkSetDataTransformer::StringToOrmLinkSet($aValues[$sAttCode][$currValue]['edit_value'], $oOrmLinkSet);
|
||||
|
||||
} else {
|
||||
@@ -5244,7 +5254,7 @@ HTML
|
||||
}
|
||||
$oDummyObj->Set($sAttCode, $oTagSet);
|
||||
} else if ($oAttDef->GetEditClass() == 'LinkedSet') {
|
||||
$oOrmLinkSet = $oDummyObj->Get($sAttCode);
|
||||
$oOrmLinkSet = $oDummyObj->Get($sAttCode);
|
||||
foreach ($aMultiValues as $key => $sValue) {
|
||||
LinkSetDataTransformer::StringToOrmLinkSet($sValue['edit_value'], $oOrmLinkSet);
|
||||
}
|
||||
@@ -5923,14 +5933,14 @@ JS
|
||||
*
|
||||
* @since 3.1.0
|
||||
*/
|
||||
final protected function FireEventCheckToWrite(): void
|
||||
final protected function FireEventCheckToWrite(?string $sStimulusBeingApplied): void
|
||||
{
|
||||
$this->FireEvent(EVENT_DB_CHECK_TO_WRITE, ['is_new' => $this->IsNew()]);
|
||||
$this->FireEvent(EVENT_DB_CHECK_TO_WRITE, ['is_new' => $this->IsNew(), 'stimulus_applied' => $sStimulusBeingApplied]);
|
||||
}
|
||||
|
||||
final protected function FireEventBeforeWrite()
|
||||
final protected function FireEventBeforeWrite(?string $sStimulusBeingApplied)
|
||||
{
|
||||
$this->FireEvent(EVENT_DB_BEFORE_WRITE, ['is_new' => $this->IsNew()]);
|
||||
$this->FireEvent(EVENT_DB_BEFORE_WRITE, ['is_new' => $this->IsNew(), 'stimulus_applied' => $sStimulusBeingApplied]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -5942,11 +5952,11 @@ JS
|
||||
* @throws \CoreException
|
||||
* @since 3.1.0
|
||||
*/
|
||||
final protected function FireEventAfterWrite(array $aChanges, bool $bIsNew): void
|
||||
final protected function FireEventAfterWrite(array $aChanges, bool $bIsNew, ?string $sStimulusBeingApplied): void
|
||||
{
|
||||
$this->NotifyAttachedObjectsOnLinkClassModification();
|
||||
$this->RemoveObjectAwaitingEventDbLinksChanged(get_class($this), $this->GetKey());
|
||||
$this->FireEvent(EVENT_DB_AFTER_WRITE, ['is_new' => $bIsNew, 'changes' => $aChanges]);
|
||||
$this->FireEvent(EVENT_DB_AFTER_WRITE, ['is_new' => $bIsNew, 'changes' => $aChanges, 'stimulus_applied' => $sStimulusBeingApplied]);
|
||||
}
|
||||
|
||||
//////////////
|
||||
@@ -6179,9 +6189,9 @@ JS
|
||||
* @inheritDoc
|
||||
* @throws \CoreException
|
||||
*/
|
||||
final protected function FireEventComputeValues(): void
|
||||
final protected function FireEventComputeValues(?string $sStimulusBeingApplied): void
|
||||
{
|
||||
$this->FireEvent(EVENT_DB_COMPUTE_VALUES);
|
||||
$this->FireEvent(EVENT_DB_COMPUTE_VALUES, ['is_new' => $this->IsNew(), 'stimulus_applied' => $sStimulusBeingApplied]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -296,21 +296,21 @@ abstract class Dashboard
|
||||
public function FromParams($aParams)
|
||||
{
|
||||
$this->sLayoutClass = $aParams['layout_class'];
|
||||
if (!is_subclass_of($this->sLayoutClass,DashboardLayout::class)) {
|
||||
throw new InvalidParameterException('Invalid parameter layout_class "'.$aParams['layout_class'].'"');
|
||||
}
|
||||
$this->sTitle = $aParams['title'];
|
||||
$this->bAutoReload = $aParams['auto_reload'] == 'true';
|
||||
$this->iAutoReloadSec = max(MetaModel::GetConfig()->Get('min_reload_interval'), (int) $aParams['auto_reload_sec']);
|
||||
|
||||
foreach($aParams['cells'] as $aCell)
|
||||
{
|
||||
foreach($aParams['cells'] as $aCell) {
|
||||
$aCellDashlets = array();
|
||||
foreach($aCell as $aDashletParams)
|
||||
{
|
||||
foreach($aCell as $aDashletParams) {
|
||||
$sDashletClass = $aDashletParams['dashlet_class'];
|
||||
$sId = $aDashletParams['dashlet_id'];
|
||||
/** @var \Dashlet $oNewDashlet */
|
||||
$oNewDashlet = new $sDashletClass($this->oMetaModel, $sId);
|
||||
if (isset($aDashletParams['dashlet_type']))
|
||||
{
|
||||
if (isset($aDashletParams['dashlet_type'])) {
|
||||
$oNewDashlet->SetDashletType($aDashletParams['dashlet_type']);
|
||||
}
|
||||
$oForm = $oNewDashlet->GetForm();
|
||||
@@ -1266,13 +1266,12 @@ EOF
|
||||
$sOkButtonLabel = Dict::S('UI:Button:Save');
|
||||
$sCancelButtonLabel = Dict::S('UI:Button:Cancel');
|
||||
|
||||
$sId = utils::HtmlEntities($this->sId);
|
||||
$sLayoutClass = utils::HtmlEntities($this->sLayoutClass);
|
||||
$sId = json_encode($this->sId);
|
||||
$sLayoutClass = json_encode($this->sLayoutClass);
|
||||
$sAutoReload = $this->bAutoReload ? 'true' : 'false';
|
||||
$sAutoReloadSec = (string) $this->iAutoReloadSec;
|
||||
$sTitle = utils::HtmlEntities($this->sTitle);
|
||||
$sFile = utils::HtmlEntities($this->GetDefinitionFile());
|
||||
$sFileForJS = json_encode($this->GetDefinitionFile());
|
||||
$sTitle = json_encode($this->sTitle);
|
||||
$sFile = json_encode($this->GetDefinitionFile());
|
||||
$sUrl = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php';
|
||||
$sReloadURL = $this->GetReloadURL();
|
||||
|
||||
@@ -1328,15 +1327,15 @@ $('#dashboard_editor').dialog({
|
||||
});
|
||||
|
||||
$('#dashboard_editor .ui-layout-center').runtimedashboard({
|
||||
dashboard_id: '$sId',
|
||||
layout_class: '$sLayoutClass',
|
||||
title: '$sTitle',
|
||||
dashboard_id: $sId,
|
||||
layout_class: $sLayoutClass,
|
||||
title: $sTitle,
|
||||
auto_reload: $sAutoReload,
|
||||
auto_reload_sec: $sAutoReloadSec,
|
||||
submit_to: '$sUrl',
|
||||
submit_parameters: {operation: 'save_dashboard', file: {$sFileForJS}, extra_params: $sJSExtraParams, reload_url: '$sReloadURL'},
|
||||
submit_parameters: {operation: 'save_dashboard', file: $sFile, extra_params: $sJSExtraParams, reload_url: '$sReloadURL'},
|
||||
render_to: '$sUrl',
|
||||
render_parameters: {operation: 'render_dashboard', file: {$sFileForJS}, extra_params: $sJSExtraParams, reload_url: '$sReloadURL'},
|
||||
render_parameters: {operation: 'render_dashboard', file: $sFile, extra_params: $sJSExtraParams, reload_url: '$sReloadURL'},
|
||||
new_dashlet_parameters: {operation: 'new_dashlet'}
|
||||
});
|
||||
|
||||
|
||||
@@ -238,6 +238,10 @@ The object can be modified.]]></description>
|
||||
<description>Creation flag</description>
|
||||
<type>boolean</type>
|
||||
</event_datum>
|
||||
<event_datum id="stimulus_applied">
|
||||
<description>Life cycle stimulus applied (null if not within a transition)</description>
|
||||
<type>string</type>
|
||||
</event_datum>
|
||||
<event_datum id="debug_info">
|
||||
<description>Debug string</description>
|
||||
<type>string</type>
|
||||
@@ -263,6 +267,10 @@ Call $this->AddCheckWarning($sWarningMessage) to display a warning.
|
||||
<description>Creation flag</description>
|
||||
<type>boolean</type>
|
||||
</event_datum>
|
||||
<event_datum id="stimulus_applied">
|
||||
<description>Life cycle stimulus applied (null if not within a transition)</description>
|
||||
<type>string</type>
|
||||
</event_datum>
|
||||
<event_datum id="debug_info">
|
||||
<description>Debug string</description>
|
||||
<type>string</type>
|
||||
@@ -290,6 +298,10 @@ The modifications can be propagated to other objects.]]></description>
|
||||
<description><![CDATA[For updates, the list of changes done during this operation]]></description>
|
||||
<type>array</type>
|
||||
</event_datum>
|
||||
<event_datum id="stimulus_applied">
|
||||
<description>Life cycle stimulus applied (null if not within a transition)</description>
|
||||
<type>string</type>
|
||||
</event_datum>
|
||||
<event_datum id="debug_info">
|
||||
<description>Debug string</description>
|
||||
<type>string</type>
|
||||
@@ -420,6 +432,14 @@ The only action allowed is to deny transitions with $this->DenyTransition($sTran
|
||||
<description>The object inserted</description>
|
||||
<type>DBObject</type>
|
||||
</event_datum>
|
||||
<event_datum id="is_new">
|
||||
<description>Creation flag</description>
|
||||
<type>boolean</type>
|
||||
</event_datum>
|
||||
<event_datum id="stimulus_applied">
|
||||
<description>Life cycle stimulus applied (null if not within a transition)</description>
|
||||
<type>string</type>
|
||||
</event_datum>
|
||||
<event_datum id="debug_info">
|
||||
<description>Debug string</description>
|
||||
<type>string</type>
|
||||
|
||||
@@ -263,6 +263,8 @@ class DisplayBlock
|
||||
/** param for export.php */
|
||||
'refresh_action',
|
||||
/**to add refresh button in datatable*/
|
||||
'object_count',
|
||||
/** int number of objects in list */
|
||||
], DataTableUIBlockFactory::GetAllowedParams()),
|
||||
static::ENUM_STYLE_LIST_SEARCH => array_merge([
|
||||
'update_history',
|
||||
@@ -1860,7 +1862,11 @@ class MenuBlock extends DisplayBlock
|
||||
$aSelectedClasses = $this->GetFilter()->GetSelectedClasses();
|
||||
$bIsForLinkset = isset($aExtraParams['target_attr']);
|
||||
$oSet = new CMDBObjectSet($this->GetFilter());
|
||||
$iSetCount = $oSet->Count();
|
||||
if(isset($aExtraParams['object_count'])){
|
||||
$iSetCount = $aExtraParams['object_count'];
|
||||
} else {
|
||||
$iSetCount = $oSet->Count();
|
||||
}
|
||||
/** @var string $sRefreshAction JS snippet to run when clicking on the refresh button of the menu */
|
||||
$sRefreshAction = $aExtraParams['refresh_action'] ?? '';
|
||||
$bIsCreationInModal = isset($aExtraParams['creation_in_modal']) && $aExtraParams['creation_in_modal'] === true;
|
||||
@@ -2024,8 +2030,8 @@ class MenuBlock extends DisplayBlock
|
||||
$sSelectedClassName = MetaModel::GetName($sSelectedClass);
|
||||
|
||||
// Check rights on class
|
||||
$bIsBulkModifyAllowed = (!MetaModel::IsAbstract($sSelectedClass)) && UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_MODIFY, $oSet) && ($oReflectionClass->IsSubclassOf('cmdbAbstractObject'));
|
||||
$bIsBulkDeleteAllowed = (bool) UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_DELETE, $sSelectedClass);
|
||||
$bIsBulkModifyAllowed = (!MetaModel::IsAbstract($sSelectedClass)) && UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_MODIFY) && ($oReflectionClass->IsSubclassOf('cmdbAbstractObject'));
|
||||
$bIsBulkDeleteAllowed = (bool) UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_DELETE);
|
||||
|
||||
// Refine filter on selected class so bullk actions occur on the right class
|
||||
$oSelectedClassFilter = $this->GetFilter()->DeepClone();
|
||||
|
||||
@@ -36,29 +36,30 @@ class InputOutputTask extends cmdbAbstractObject
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "application",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "name",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_iotask",
|
||||
"db_key_field" => "id",
|
||||
"category" => "application",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "name",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_iotask",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values"=>null, "sql"=>"name", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("category", array("allowed_values"=>new ValueSetEnum('Input, Ouput'), "sql"=>"category", "default_value"=>"Input", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("source_type", array("allowed_values"=>new ValueSetEnum('File, Database, Web Service'), "sql"=>"source_type", "default_value"=>"File", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("source_subtype", array("allowed_values"=>new ValueSetEnum('Oracle, MySQL, Postgress, MSSQL, SOAP, HTTP-Get, HTTP-Post, XML/RPC, CSV, XML, Excel'), "sql"=>"source_subtype", "default_value"=>"CSV", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("source_path", array("allowed_values"=>null, "sql"=>"source_path", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("objects_class", array("class_category"=>"", "more_values"=>"", "sql"=>"objects_class", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("test_mode", array("allowed_values"=>new ValueSetEnum('Yes,No'), "sql"=>"test_mode", "default_value"=>'No', "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("verbose_mode", array("allowed_values"=>new ValueSetEnum('Yes,No'), "sql"=>"verbose_mode", "default_value" => 'No', "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("options", array("allowed_values"=>new ValueSetEnum('Full, Update Only, Creation Only'), "sql"=>"options", "default_value"=> 'Full', "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values" => null, "sql" => "name", "default_value" => "", "is_null_allowed" => false, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("description", array("allowed_values" => null, "sql" => "description", "default_value" => "", "is_null_allowed" => true, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("category", array("allowed_values" => new ValueSetEnum('Input, Ouput'), "sql" => "category", "default_value" => "Input", "is_null_allowed" => false, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("source_type", array("allowed_values" => new ValueSetEnum('File, Database, Web Service'), "sql" => "source_type", "default_value" => "File", "is_null_allowed" => false, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("source_subtype",
|
||||
array("allowed_values" => new ValueSetEnum('Oracle, MySQL, Postgress, MSSQL, SOAP, HTTP-Get, HTTP-Post, XML/RPC, CSV, XML, Excel'), "sql" => "source_subtype", "default_value" => "CSV", "is_null_allowed" => false, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("source_path", array("allowed_values" => null, "sql" => "source_path", "default_value" => "", "is_null_allowed" => false, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("objects_class", array("class_category" => "", "more_values" => "", "sql" => "objects_class", "default_value" => null, "is_null_allowed" => true, "depends_on" => array(), "class_exclusion_list" => null)));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("test_mode", array("allowed_values" => new ValueSetEnum('Yes,No'), "sql" => "test_mode", "default_value" => 'No', "is_null_allowed" => false, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("verbose_mode", array("allowed_values" => new ValueSetEnum('Yes,No'), "sql" => "verbose_mode", "default_value" => 'No', "is_null_allowed" => false, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("options", array("allowed_values" => new ValueSetEnum('Full, Update Only, Creation Only'), "sql" => "options", "default_value" => 'Full', "is_null_allowed" => true, "depends_on" => array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('name', 'description', 'category', 'objects_class', 'source_type', 'source_subtype', 'source_path' , 'options', 'test_mode', 'verbose_mode')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('details', array('name', 'description', 'category', 'objects_class', 'source_type', 'source_subtype', 'source_path', 'options', 'test_mode', 'verbose_mode')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('description', 'category', 'objects_class', 'source_type', 'source_subtype', 'options')); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
MetaModel::Init_SetZListItems('standard_search', array('name', 'category', 'objects_class', 'source_type', 'source_subtype')); // Criteria of the std search form
|
||||
|
||||
@@ -1159,11 +1159,11 @@ class OQLMenuNode extends MenuNode
|
||||
{
|
||||
$sUsageId = utils::GetSafeId($sUsageId);
|
||||
$oSearch = DBObjectSearch::FromOQL($sOql);
|
||||
$sClass= $oSearch->GetClass();
|
||||
$sClass= $oSearch->GetClass();
|
||||
$sIcon = MetaModel::GetClassIcon($sClass, false);
|
||||
if ($bSearchPane) {
|
||||
$aParams = array_merge(['open' => $bSearchOpen, 'table_id' => $sUsageId, 'submit_on_load' => false], $aExtraParams);
|
||||
$oBlock = new DisplayBlock($oSearch, 'search', false /* Asynchronous */, $aParams);
|
||||
$oBlock = new DisplayBlock($oSearch, DisplayBlock::ENUM_STYLE_SEARCH, false /* Asynchronous */, $aParams);
|
||||
$oBlock->Display($oPage, 0);
|
||||
$oPage->add("<div class='sf_results_area ibo-add-margin-top-250' data-target='search_results'>");
|
||||
}
|
||||
|
||||
@@ -73,15 +73,42 @@ class ThemeHandler
|
||||
*/
|
||||
public static function GetApplicationThemeId(): string
|
||||
{
|
||||
$sThemeId = null;
|
||||
try {
|
||||
$sThemeId = utils::GetConfig()->Get('backoffice_default_theme');
|
||||
//environment type from config.php
|
||||
$sEnvType = MetaModel::GetConfig()->Get('local_branding');
|
||||
//environment type from config.php
|
||||
if (utils::IsNotNullOrEmptyString($sEnvType)) {
|
||||
$sWorkingPath = APPROOT.'env-'.utils::GetCurrentEnvironment().'/';
|
||||
$aThemeParameters = json_decode(@file_get_contents($sWorkingPath.'branding/themes.json'), true);
|
||||
if ( isset($aThemeParameters[$sEnvType]) ) {
|
||||
if (isset($aThemeParameters[$sEnvType]['allowed_theme'])) {
|
||||
$aThemeId = $aThemeParameters[$sEnvType]['allowed_theme'];
|
||||
if (in_array($sThemeId, $aThemeId) == false) {
|
||||
$sThemeId = null;
|
||||
}
|
||||
}
|
||||
if (is_null($sThemeId)) {
|
||||
//environment type from config.php
|
||||
if (isset($aThemeParameters[$sEnvType]['default_theme'])) {
|
||||
$sThemeId = $aThemeParameters[$sEnvType]['default_theme'];
|
||||
} else {
|
||||
$aDefaultTheme = ThemeHandler::GetDefaultThemeInformation();
|
||||
$sThemeId = $aDefaultTheme['name'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (is_null($sThemeId)) {
|
||||
$sThemeId = utils::GetConfig()->Get('backoffice_default_theme');
|
||||
}
|
||||
}
|
||||
catch (CoreException $oCompileException) {
|
||||
// Fallback on our default theme in case the config. is not available yet
|
||||
$aDefaultTheme = ThemeHandler::GetDefaultThemeInformation();
|
||||
$sThemeId = $aDefaultTheme['name'];
|
||||
}
|
||||
|
||||
IssueLog::Error("GetApplicationThemeId: ".$sThemeId);
|
||||
return $sThemeId;
|
||||
}
|
||||
|
||||
@@ -101,11 +128,24 @@ class ThemeHandler
|
||||
catch (Exception $oException) {
|
||||
// Do nothing, already handled by $sThemeId null by default
|
||||
}
|
||||
$sEnvType = MetaModel::GetConfig()->Get('local_branding');
|
||||
//environment type from config.php
|
||||
if (utils::IsNotNullOrEmptyString($sEnvType)) {
|
||||
$sWorkingPath = APPROOT.'env-'.utils::GetCurrentEnvironment().'/';
|
||||
$aThemeParameters = json_decode(@file_get_contents($sWorkingPath.'branding/themes.json'), true);
|
||||
if (isset($aThemeParameters[$sEnvType]) && isset($aThemeParameters[$sEnvType]['allowed_theme'])) {
|
||||
$aThemeId = $aThemeParameters[$sEnvType]['allowed_theme'];
|
||||
if ( in_array($sThemeId,$aThemeId) == false) {
|
||||
$sThemeId = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback on the app. theme
|
||||
if (is_null($sThemeId)) {
|
||||
$sThemeId = static::GetApplicationThemeId();
|
||||
}
|
||||
IssueLog::Error("GetCurrentUserThemeId: ".$sThemeId);
|
||||
|
||||
return $sThemeId;
|
||||
}
|
||||
@@ -142,6 +182,25 @@ class ThemeHandler
|
||||
}
|
||||
asort($aThemes);
|
||||
|
||||
$sEnvType = MetaModel::GetConfig()->Get('local_branding');
|
||||
if (!utils::IsNullOrEmptyString($sEnvType)) {
|
||||
$sWorkingPath = APPROOT . 'env-' . utils::GetCurrentEnvironment() . '/';
|
||||
$aThemeParameters = json_decode(@file_get_contents($sWorkingPath . 'branding/themes.json'), true);
|
||||
//environment type from config.php
|
||||
if (isset($aThemeParameters[$sEnvType])) {
|
||||
$aThemeId = $aThemeParameters[$sEnvType]['allowed_theme'];
|
||||
$aAvailableThemes = [];
|
||||
foreach ($aThemeId as $sThemeId) {
|
||||
if (isset($aThemes[$sThemeId])) {
|
||||
$aAvailableThemes[$sThemeId] = $aThemes[$sThemeId];
|
||||
}
|
||||
}
|
||||
if (count($aAvailableThemes) > 0) {
|
||||
$aThemes = $aAvailableThemes;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $aThemes;
|
||||
}
|
||||
|
||||
|
||||
@@ -249,9 +249,9 @@ class appUserPreferences extends DBObject
|
||||
(
|
||||
"category" => "gui",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "userid",
|
||||
"name_attcode" => "login",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array("userid"),
|
||||
"reconc_keys" => array("userid","login"),
|
||||
"db_table" => "priv_app_preferences",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
@@ -260,8 +260,10 @@ class appUserPreferences extends DBObject
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("userid", array("targetclass"=>"User", "allowed_values"=>null, "sql"=>"userid", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributePropertySet("preferences", array("allowed_values"=>null, "sql"=>"preferences", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_SetZListItems('list', array('preferences',));
|
||||
MetaModel::Init_SetZListItems('default_search', array('userid'));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("org_id", array("allowed_values" => null, "extkey_attcode" => 'userid', "target_attcode" => "org_id")));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("login", array("allowed_values" => null, "extkey_attcode" => 'userid', "target_attcode" => "login")));
|
||||
MetaModel::Init_SetZListItems('list', array('org_id','preferences'));
|
||||
MetaModel::Init_SetZListItems('default_search', array('userid','login','org_id'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -180,6 +180,7 @@ class utils
|
||||
*/
|
||||
private static $sAbsoluteUrlAppRootCache = null;
|
||||
|
||||
|
||||
protected static function LoadParamFile($sParamFile)
|
||||
{
|
||||
if (!file_exists($sParamFile)) {
|
||||
@@ -1451,9 +1452,12 @@ class utils
|
||||
* @return string A path to a folder into which any module can store cache data
|
||||
* The corresponding folder is created or cleaned upon code compilation
|
||||
*/
|
||||
public static function GetCachePath()
|
||||
public static function GetCachePath(string $sEnvironment = null): string
|
||||
{
|
||||
return static::GetDataPath().'cache-'.MetaModel::GetEnvironment().'/';
|
||||
if (is_null($sEnvironment)) {
|
||||
$sEnvironment = MetaModel::GetEnvironment();
|
||||
}
|
||||
return static::GetDataPath()."cache-$sEnvironment/";
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2390,53 +2394,75 @@ SQL;
|
||||
return $bRet;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $sPath
|
||||
*
|
||||
* @return false|\ormDocument
|
||||
* @throws \Exception
|
||||
*
|
||||
* @deprecated 3.2.1 use utils::GetDocumentFromSelfURL instead
|
||||
*/
|
||||
public static function IsSelfURL($sPath)
|
||||
{
|
||||
return self::GetDocumentFromSelfURL($sPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the given URL is a link to download a document/image on the CURRENT iTop
|
||||
* In such a case we can read the content of the file directly in the database (if the users rights allow) and return the ormDocument
|
||||
*
|
||||
* @Since 3.2.1 a local URL is transformed into a local file to read
|
||||
*
|
||||
* @param string $sPath
|
||||
* @return false|ormDocument
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function IsSelfURL($sPath)
|
||||
public static function GetDocumentFromSelfURL(string $sPath)
|
||||
{
|
||||
$result = false;
|
||||
$sPageUrl = utils::GetAbsoluteUrlAppRoot().'pages/ajax.document.php';
|
||||
if (substr($sPath, 0, strlen($sPageUrl)) == $sPageUrl)
|
||||
{
|
||||
if (utils::StartsWith($sPath, $sPageUrl)) {
|
||||
// If the URL is an URL pointing to this instance of iTop, then
|
||||
// extract the "query" part of the URL and analyze it
|
||||
$sQuery = parse_url($sPath, PHP_URL_QUERY);
|
||||
if ($sQuery !== null)
|
||||
{
|
||||
if ($sQuery !== null) {
|
||||
$aParams = array();
|
||||
foreach(explode('&', $sQuery) as $sChunk)
|
||||
{
|
||||
foreach (explode('&', $sQuery) as $sChunk) {
|
||||
$aParts = explode('=', $sChunk ?? '');
|
||||
if (count($aParts) != 2) continue;
|
||||
if (count($aParts) != 2) {
|
||||
continue;
|
||||
}
|
||||
$aParams[$aParts[0]] = urldecode($aParts[1]);
|
||||
}
|
||||
$result = array_key_exists('operation', $aParams) && array_key_exists('class', $aParams) && array_key_exists('id', $aParams) && array_key_exists('field', $aParams) && ($aParams['operation'] == 'download_document');
|
||||
if ($result)
|
||||
{
|
||||
if ($result) {
|
||||
// This is a 'download_document' operation, let's retrieve the document directly from the database
|
||||
$sClass = $aParams['class'];
|
||||
$iKey = $aParams['id'];
|
||||
$sAttCode = $aParams['field'];
|
||||
|
||||
$oObj = MetaModel::GetObject($sClass, $iKey, false /* must exist */); // Users rights apply here !!
|
||||
if ($oObj)
|
||||
{
|
||||
if ($oObj) {
|
||||
/**
|
||||
* @var ormDocument $result
|
||||
*/
|
||||
$result = clone $oObj->Get($sAttCode);
|
||||
return $result;
|
||||
return clone $oObj->Get($sAttCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new Exception('Invalid URL. This iTop URL is not pointing to a valid Document/Image.');
|
||||
}
|
||||
return $result;
|
||||
|
||||
if (utils::StartsWith($sPath, utils::GetAbsoluteUrlAppRoot())) {
|
||||
$sFilePath = utils::LocalPath(APPROOT.substr($sPath, strlen(utils::GetAbsoluteUrlAppRoot())));
|
||||
if (false === $sFilePath) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$sFilePath = APPROOT.$sFilePath;
|
||||
return ormDocument::FromFile($sFilePath);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2444,68 +2470,28 @@ SQL;
|
||||
* - an URL pointing to a blob (image/document) on the current iTop server
|
||||
* - an http(s) URL
|
||||
* - the local file system (but only if you are an administrator)
|
||||
* @param string $sPath
|
||||
*
|
||||
* @param string|null $sPath
|
||||
* @return ormDocument|null
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function FileGetContentsAndMIMEType($sPath)
|
||||
{
|
||||
$oUploadedDoc = null;
|
||||
$aKnownExtensions = array(
|
||||
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
|
||||
'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
|
||||
'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
|
||||
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
||||
'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
|
||||
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||||
'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
|
||||
'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
|
||||
'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
|
||||
'jpg' => 'image/jpeg',
|
||||
'jpeg' => 'image/jpeg',
|
||||
'gif' => 'image/gif',
|
||||
'png' => 'image/png',
|
||||
'pdf' => 'application/pdf',
|
||||
'doc' => 'application/msword',
|
||||
'dot' => 'application/msword',
|
||||
'xls' => 'application/vnd.ms-excel',
|
||||
'ppt' => 'application/vnd.ms-powerpoint',
|
||||
'vsd' => 'application/x-visio',
|
||||
'vdx' => 'application/visio.drawing',
|
||||
'odt' => 'application/vnd.oasis.opendocument.text',
|
||||
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
|
||||
'odp' => 'application/vnd.oasis.opendocument.presentation',
|
||||
'zip' => 'application/zip',
|
||||
'txt' => 'text/plain',
|
||||
'htm' => 'text/html',
|
||||
'html' => 'text/html',
|
||||
'exe' => 'application/octet-stream',
|
||||
);
|
||||
|
||||
$sData = null;
|
||||
$sMimeType = 'text/plain'; // Default MIME Type: treat the file as a bunch a characters...
|
||||
$sFileName = 'uploaded-file'; // Default name for downloaded-files
|
||||
$sExtension = '.txt'; // Default file extension in case we don't know the MIME Type
|
||||
|
||||
if(empty($sPath))
|
||||
{
|
||||
if (utils::IsNullOrEmptyString($sPath)) {
|
||||
// Empty path (NULL or '') means that there is no input, making an empty document.
|
||||
$oUploadedDoc = new ormDocument('', '', '');
|
||||
return new ormDocument('', '', '');
|
||||
}
|
||||
elseif (static::IsURL($sPath))
|
||||
{
|
||||
if ($oUploadedDoc = static::IsSelfURL($sPath))
|
||||
{
|
||||
// Nothing more to do, we've got it !!
|
||||
|
||||
if (static::IsURL($sPath)) {
|
||||
$oUploadedDoc = static::GetDocumentFromSelfURL($sPath);
|
||||
if ($oUploadedDoc) {
|
||||
return $oUploadedDoc;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Remote file, let's use the HTTP headers to find the MIME Type
|
||||
$sData = @file_get_contents($sPath);
|
||||
if ($sData === false)
|
||||
{
|
||||
IssueLog::Error(<<<TXT
|
||||
|
||||
// Remote file, let's use the HTTP headers to find the MIME Type
|
||||
$sData = @file_get_contents($sPath);
|
||||
if ($sData === false) {
|
||||
IssueLog::Error(<<<TXT
|
||||
Failed to load the file from URL. This can happen for multiple reasons:
|
||||
- Invalid URL
|
||||
- URL using HTTPS with an untrusted certificate on the remote server
|
||||
@@ -2514,54 +2500,40 @@ TXT
|
||||
, LogChannels::CORE, [
|
||||
'URL' => $sPath,
|
||||
]);
|
||||
throw new Exception("Failed to load the file from the URL '$sPath'.");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isset($http_response_header))
|
||||
{
|
||||
$aHeaders = static::ParseHeaders($http_response_header);
|
||||
$sMimeType = array_key_exists('Content-Type', $aHeaders) ? strtolower($aHeaders['Content-Type']) : 'application/x-octet-stream';
|
||||
// Compute the file extension from the MIME Type
|
||||
foreach ($aKnownExtensions as $sExtValue => $sMime) {
|
||||
if ($sMime === $sMimeType) {
|
||||
$sExtension = '.'.$sExtValue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
$sPathName = pathinfo($sPath, PATHINFO_FILENAME);
|
||||
if (utils::IsNotNullOrEmptyString($sPathName)) {
|
||||
$sFileName = $sPathName;
|
||||
}
|
||||
$sFileName .= $sExtension;
|
||||
}
|
||||
$oUploadedDoc = new ormDocument($sData, $sMimeType, $sFileName);
|
||||
throw new Exception("Failed to load the file from the URL '$sPath'.");
|
||||
}
|
||||
}
|
||||
else if (UserRights::IsAdministrator())
|
||||
{
|
||||
// Only administrators are allowed to read local files
|
||||
$sData = @file_get_contents($sPath);
|
||||
if ($sData === false)
|
||||
{
|
||||
throw new Exception("Failed to load the file '$sPath'. The file does not exist or the current process is not allowed to access it.");
|
||||
}
|
||||
$sExtension = strtolower(pathinfo($sPath, PATHINFO_EXTENSION));
|
||||
$sFileName = basename($sPath);
|
||||
|
||||
if (array_key_exists($sExtension, $aKnownExtensions))
|
||||
{
|
||||
$sMimeType = $aKnownExtensions[$sExtension];
|
||||
$sMimeType = 'text/plain'; // Default MIME Type: treat the file as a bunch a characters...
|
||||
$sFileName = 'uploaded-file'; // Default name for downloaded-files
|
||||
$sExtension = '.txt'; // Default file extension in case we don't know the MIME Type
|
||||
|
||||
if (isset($http_response_header)) {
|
||||
$aHeaders = static::ParseHeaders($http_response_header);
|
||||
$sMimeType = array_key_exists('Content-Type', $aHeaders) ? strtolower($aHeaders['Content-Type']) : 'application/x-octet-stream';
|
||||
// Compute the file extension from the MIME Type
|
||||
foreach (ormDocument::GetKnownExtensions() as $sExtValue => $sMime) {
|
||||
if ($sMime === $sMimeType) {
|
||||
$sExtension = '.'.$sExtValue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (extension_loaded('fileinfo'))
|
||||
{
|
||||
$finfo = new finfo(FILEINFO_MIME);
|
||||
$sMimeType = $finfo->file($sPath);
|
||||
$sPathName = pathinfo($sPath, PATHINFO_FILENAME);
|
||||
if (utils::IsNotNullOrEmptyString($sPathName)) {
|
||||
$sFileName = $sPathName;
|
||||
}
|
||||
$oUploadedDoc = new ormDocument($sData, $sMimeType, $sFileName);
|
||||
$sFileName .= $sExtension;
|
||||
|
||||
return new ormDocument($sData, $sMimeType, $sFileName);
|
||||
}
|
||||
return $oUploadedDoc;
|
||||
|
||||
// Local file
|
||||
if (UserRights::IsAdministrator()) {
|
||||
// Only administrators are allowed to read local files
|
||||
return ormDocument::FromFile($sPath);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
protected static function ParseHeaders($aHeaders)
|
||||
@@ -3132,29 +3104,13 @@ TXT
|
||||
* @throws \Exception
|
||||
* @since 3.0.0
|
||||
*/
|
||||
public static function GetMentionedObjectsFromText(string $sText, string $sFormat = self::ENUM_TEXT_FORMAT_HTML): array
|
||||
public static function GetMentionedObjectsFromText(string $sText): array
|
||||
{
|
||||
// First transform text so it can be parsed
|
||||
switch ($sFormat) {
|
||||
case static::ENUM_TEXT_FORMAT_HTML:
|
||||
$sText = static::HtmlToText($sText);
|
||||
break;
|
||||
$aMentionedObjects = [];
|
||||
$aMentionMatches = [];
|
||||
$sText = html_entity_decode($sText);
|
||||
|
||||
default:
|
||||
// Don't transform it
|
||||
break;
|
||||
}
|
||||
|
||||
// Then parse text to find objects
|
||||
$aMentionedObjects = array();
|
||||
$aMentionMatches = array();
|
||||
|
||||
// Note: As the sanitizer (or CKEditor autocomplete plugin? 🤔) removes data-* attributes from the hyperlink,
|
||||
// - we can't use the following (simpler) regexp that only checks data attributes on hyperlinks, which would have worked for hyperlinks pointing to any GUIs: '/<a\s*([^>]*)data-object-class="([^"]*)"\s*data-object-id="([^"]*)">/i'
|
||||
// - instead we use a regexp to match the following pattern '[Some object label](<APP_ROOT_URL>...&class=<OBJECT_CLASS>&id=<OBJECT_ID>...)' which only works for the backoffice
|
||||
// If we change the sanitizer, we might want to switch to the other regexp as it's universal and easier to read
|
||||
$sAppRootUrlForRegExp = addcslashes(utils::GetAbsoluteUrlAppRoot(), '/&');
|
||||
preg_match_all("/\[([^\]]*)\]\({$sAppRootUrlForRegExp}[^\)]*\&class=([^\)\&]*)\&id=([\d]*)[^\)]*\)/i", $sText, $aMentionMatches);
|
||||
preg_match_all('/<a\s*([^>]*)data-object-class="([^"]*)"\s*data-object-key="([^"]*)"/i', $sText, $aMentionMatches);
|
||||
|
||||
foreach ($aMentionMatches[0] as $iMatchIdx => $sCompleteMatch) {
|
||||
$sMatchedClass = $aMentionMatches[2][$iMatchIdx];
|
||||
|
||||
102
composer.lock
generated
102
composer.lock
generated
@@ -3929,6 +3929,82 @@
|
||||
],
|
||||
"time": "2023-01-26T09:26:14+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php81",
|
||||
"version": "v1.31.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php81.git",
|
||||
"reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
|
||||
"reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.2"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"thanks": {
|
||||
"url": "https://github.com/symfony/polyfill",
|
||||
"name": "symfony/polyfill"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Php81\\": ""
|
||||
},
|
||||
"classmap": [
|
||||
"Resources/stubs"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolas Grekas",
|
||||
"email": "p@tchwork.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "https://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
|
||||
"homepage": "https://symfony.com",
|
||||
"keywords": [
|
||||
"compatibility",
|
||||
"polyfill",
|
||||
"portable",
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-09T11:45:10+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php83",
|
||||
"version": "v1.28.0",
|
||||
@@ -4976,30 +5052,38 @@
|
||||
},
|
||||
{
|
||||
"name": "twig/twig",
|
||||
"version": "v3.8.0",
|
||||
"version": "v3.16.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/twigphp/Twig.git",
|
||||
"reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d"
|
||||
"reference": "475ad2dc97d65d8631393e721e7e44fb544f0561"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d",
|
||||
"reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d",
|
||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/475ad2dc97d65d8631393e721e7e44fb544f0561",
|
||||
"reference": "475ad2dc97d65d8631393e721e7e44fb544f0561",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.2.5",
|
||||
"php": ">=8.0.2",
|
||||
"symfony/deprecation-contracts": "^2.5|^3",
|
||||
"symfony/polyfill-ctype": "^1.8",
|
||||
"symfony/polyfill-mbstring": "^1.3",
|
||||
"symfony/polyfill-php80": "^1.22"
|
||||
"symfony/polyfill-php81": "^1.29"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpstan/phpstan": "^2.0",
|
||||
"psr/container": "^1.0|^2.0",
|
||||
"symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0"
|
||||
"symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"files": [
|
||||
"src/Resources/core.php",
|
||||
"src/Resources/debug.php",
|
||||
"src/Resources/escaper.php",
|
||||
"src/Resources/string_loader.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"Twig\\": "src/"
|
||||
}
|
||||
@@ -5032,7 +5116,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/twigphp/Twig/issues",
|
||||
"source": "https://github.com/twigphp/Twig/tree/v3.8.0"
|
||||
"source": "https://github.com/twigphp/Twig/tree/v3.16.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -5044,7 +5128,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2023-11-21T18:54:41+00:00"
|
||||
"time": "2024-11-29T08:27:05+00:00"
|
||||
},
|
||||
{
|
||||
"name": "webmozart/assert",
|
||||
|
||||
@@ -181,7 +181,7 @@ abstract class Action extends cmdbAbstractObject
|
||||
{
|
||||
parent::DisplayBareRelations($oPage, false);
|
||||
|
||||
if ($oPage instanceof iTopWebPage) {
|
||||
if ($oPage instanceof iTopWebPage && !$this->IsNew()) {
|
||||
$this->GenerateLastExecutionsTab($oPage, $bEditMode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ abstract class AsyncTask extends DBObject
|
||||
// The value is set from null to planned in the setup program
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("status", array("allowed_values"=>new ValueSetEnum('planned,running,idle,error'), "sql"=>"status", "default_value"=>"planned", "is_null_allowed"=>true, "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("created", array("allowed_values"=>null, "sql"=>"created", "default_value"=>"NOW()", "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())));
|
||||
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())));
|
||||
@@ -489,7 +489,7 @@ class AsyncSendNewsroom extends AsyncTask {
|
||||
MetaModel::Init_AddAttribute(new AttributeInteger("object_id", array("allowed_values"=>null, "sql"=>"object_id", "default_value"=>null, "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("object_class", array("allowed_values"=>null, "sql"=>"object_class", "default_value"=>null, "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeText("url", array("allowed_values"=>null, "sql"=>"url", "default_value"=>null, "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeDateTime("date", array("allowed_values"=>null, "sql"=>"date", "default_value"=>null, "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeDateTime("date", array("allowed_values"=>null, "sql"=>"date", "default_value"=>'NOW()', "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1715,8 +1715,8 @@ class AttributeLinkedSet extends AttributeDefinition
|
||||
public function GetEditMode()
|
||||
{
|
||||
return $this->GetOptional('edit_mode', LINKSET_EDITMODE_ACTIONS);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int see LINKSET_EDITWHEN_* constants
|
||||
* @since 3.1.1 3.2.0 N°6385
|
||||
@@ -1758,7 +1758,7 @@ class AttributeLinkedSet extends AttributeDefinition
|
||||
{
|
||||
return $this->GetOptional('with_php_computation', false);
|
||||
}
|
||||
|
||||
|
||||
public function GetLinkedClass()
|
||||
{
|
||||
return $this->Get('linked_class');
|
||||
@@ -3793,7 +3793,7 @@ class AttributeClass extends AttributeString
|
||||
|
||||
public static function ListExpectedParams()
|
||||
{
|
||||
return array_merge(parent::ListExpectedParams(), array("class_category", "more_values"));
|
||||
return array_merge(parent::ListExpectedParams(), array('class_category', 'more_values'));
|
||||
}
|
||||
|
||||
public function __construct($sCode, $aParams)
|
||||
@@ -3819,10 +3819,35 @@ class AttributeClass extends AttributeString
|
||||
return $sDefault;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $aArgs
|
||||
* @param string $sContains
|
||||
*
|
||||
* @return array|null
|
||||
* @throws \CoreException
|
||||
*/
|
||||
public function GetAllowedValues($aArgs = array(), $sContains = '')
|
||||
{
|
||||
$oValSetDef = $this->GetValuesDef();
|
||||
if (!$oValSetDef) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$aListClass = $oValSetDef->GetValues($aArgs, $sContains);
|
||||
/* @since 3.3.0 remove elements in class_exclusion_list*/
|
||||
$sClassExclusionList = $this->GetOptional('class_exclusion_list',null);
|
||||
if (!empty($sClassExclusionList)) {
|
||||
foreach (explode(',', $sClassExclusionList) as $sClassName) {
|
||||
unset($aListClass[trim($sClassName)]);
|
||||
}
|
||||
}
|
||||
|
||||
return $aListClass;
|
||||
}
|
||||
|
||||
public function GetAsHTML($sValue, $oHostObject = null, $bLocalize = true)
|
||||
{
|
||||
if (empty($sValue))
|
||||
{
|
||||
if (empty($sValue)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
@@ -6346,9 +6371,6 @@ class AttributeDateTime extends AttributeDBField
|
||||
|
||||
$oFormField = parent::MakeFormField($oObject, $oFormField);
|
||||
|
||||
// After call to the parent as it sets the current value
|
||||
$oFormField->SetCurrentValue($this->GetFormat()->Format($oObject->Get($this->GetCode())));
|
||||
|
||||
return $oFormField;
|
||||
}
|
||||
|
||||
@@ -6433,8 +6455,14 @@ class AttributeDateTime extends AttributeDBField
|
||||
|
||||
public function GetDefaultValue(DBObject $oHostObject = null)
|
||||
{
|
||||
if (!$this->IsNullAllowed()) {
|
||||
return date($this->GetInternalFormat());
|
||||
$sDefaultValue = $this->Get('default_value');
|
||||
if (utils::IsNotNullOrEmptyString($sDefaultValue)) {
|
||||
try {
|
||||
$oDate = new DateTimeImmutable($sDefaultValue);
|
||||
} catch (Exception $e) {
|
||||
$oDate = new DateTimeImmutable(Expression::FromOQL($sDefaultValue)->Evaluate([]));
|
||||
}
|
||||
return $oDate->format($this->GetInternalFormat());
|
||||
}
|
||||
return $this->GetNullValue();
|
||||
}
|
||||
@@ -9433,8 +9461,13 @@ class AttributeStopWatch extends AttributeDefinition
|
||||
case 'deadline':
|
||||
if ($value)
|
||||
{
|
||||
$sDate = date(AttributeDateTime::GetInternalFormat(), $value);
|
||||
$sRet = AttributeDeadline::FormatDeadline($sDate);
|
||||
if (is_int($value))
|
||||
{
|
||||
$sDate = date(AttributeDateTime::GetInternalFormat(), $value);
|
||||
$sRet = AttributeDeadline::FormatDeadline($sDate);
|
||||
} else {
|
||||
$sRet = $value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -70,7 +70,7 @@ class BulkExportResult extends DBObject
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
|
||||
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("created", array("allowed_values"=>null, "sql"=>"created", "default_value"=>"NOW()", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeInteger("user_id", array("allowed_values"=>null, "sql"=>"user_id", "default_value"=>0, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeInteger("chunk_size", array("allowed_values"=>null, "sql"=>"chunk_size", "default_value"=>0, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("format", array("allowed_values"=>null, "sql"=>"format", "default_value"=>'', "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
|
||||
@@ -33,7 +33,7 @@ class CMDBChange extends DBObject
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
//MetaModel::Init_InheritAttributes();
|
||||
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 AttributeDateTime("date", array("allowed_values"=>null, "sql"=>"date", "default_value"=>"NOW()", "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 AttributeExternalKey("user_id", array("allowed_values"=>null, "sql"=>"user_id", "targetclass"=>"User", "is_null_allowed"=>true, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("origin", array("allowed_values"=>new ValueSetEnum(implode(',', [CMDBChangeOrigin::INTERACTIVE, CMDBChangeOrigin::CSV_INTERACTIVE, CMDBChangeOrigin::CSV_IMPORT, CMDBChangeOrigin::WEBSERVICE_SOAP, CMDBChangeOrigin::WEBSERVICE_REST, CMDBChangeOrigin::SYNCHRO_DATA_SOURCE, CMDBChangeOrigin::EMAIL_PROCESSING, CMDBChangeOrigin::CUSTOM_EXTENSION])), "sql"=>"origin", "default_value"=>CMDBChangeOrigin::INTERACTIVE, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
|
||||
@@ -185,7 +185,7 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'temporary_object.garbage_interval' => [
|
||||
'temporary_object.garbage_interval' => [
|
||||
'type' => 'integer',
|
||||
'description' => 'Seconds between garbage collections',
|
||||
'default' => 60,
|
||||
@@ -193,7 +193,7 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'app_env_label' => [
|
||||
'app_env_label' => [
|
||||
'type' => 'string',
|
||||
'description' => 'Label displayed to describe the current application environment, defaults to the environment name (e.g. "production")',
|
||||
'default' => '',
|
||||
@@ -201,7 +201,7 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'app_root_url' => [
|
||||
'app_root_url' => [
|
||||
'type' => 'string',
|
||||
'description' => 'Root URL used for navigating within the application, or from an email to the application (you can put $SERVER_NAME$ as a placeholder for the server\'s name)',
|
||||
'default' => '',
|
||||
@@ -209,7 +209,15 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
],
|
||||
'app_icon_url' => [
|
||||
'local_branding' => [
|
||||
'type' => 'string',
|
||||
'description' => 'type of branding. useful for put different logo depending environment',
|
||||
'default' => null,
|
||||
'value' => null,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'app_icon_url' => [
|
||||
'type' => 'string',
|
||||
'description' => 'Hyperlink to redirect the user when clicking on the application icon (in the main window, or login/logoff pages)',
|
||||
'default' => 'http://www.combodo.com/itop',
|
||||
@@ -217,50 +225,50 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'db_host' => [
|
||||
'db_host' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
],
|
||||
'db_user' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'db_user' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
],
|
||||
'db_pwd' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'db_pwd' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
],
|
||||
'db_name' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'db_name' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
],
|
||||
'db_subname' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'db_subname' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
],
|
||||
'db_tls.enabled' => [
|
||||
'type' => 'bool',
|
||||
'description' => 'If true then the connection to the DB will be encrypted',
|
||||
'default' => false,
|
||||
'value' => false,
|
||||
'source_of_value' => '',
|
||||
'db_tls.enabled' => [
|
||||
'type' => 'bool',
|
||||
'description' => 'If true then the connection to the DB will be encrypted',
|
||||
'default' => false,
|
||||
'value' => false,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'db_tls.ca' => [
|
||||
'db_tls.ca' => [
|
||||
'type' => 'string',
|
||||
'description' => 'Path to certificate authority file for SSL',
|
||||
'default' => null,
|
||||
@@ -268,7 +276,7 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'db_core_transactions_enabled' => [
|
||||
'db_core_transactions_enabled' => [
|
||||
'type' => 'bool',
|
||||
'description' => 'If true, CRUD transactions in iTop core will be enabled',
|
||||
'default' => true,
|
||||
@@ -1436,6 +1444,14 @@ class Config
|
||||
'quick_create.max_history_results' => [
|
||||
'type' => 'integer',
|
||||
'description' => 'Max. number of elements in the history',
|
||||
'default' => 5,
|
||||
'value' => 5,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'quick_create.max_popular_results' => [
|
||||
'type' => 'integer',
|
||||
'description' => 'Max. number of elements in the popular classes section',
|
||||
'default' => 10,
|
||||
'value' => 10,
|
||||
'source_of_value' => '',
|
||||
@@ -1880,6 +1896,7 @@ class Config
|
||||
*/
|
||||
public function Get($sPropCode)
|
||||
{
|
||||
|
||||
return $this->m_aSettings[$sPropCode]['value'];
|
||||
}
|
||||
|
||||
|
||||
@@ -355,14 +355,30 @@
|
||||
}
|
||||
}
|
||||
|
||||
if ($bIsAsync === true) {
|
||||
AsyncSendNewsroom::AddToQueue($this->GetKey(), $oTrigger->GetKey(), $aRecipientsIds, $sMessage, $sTitle, $sUrl, $iObjectId, $sObjectClass);
|
||||
} else {
|
||||
foreach ($aRecipientsIds as $iRecipientId) {
|
||||
$oEvent = Combodo\iTop\Service\Notification\Event\EventNotificationNewsroomService::MakeEventFromAction($this, $iRecipientId, $oTrigger->GetKey(), $sMessage, $sTitle, $sUrl, $iObjectId, $sObjectClass);
|
||||
$oEvent->DBInsertNoReload();
|
||||
}
|
||||
}
|
||||
try {
|
||||
if ($bIsAsync === true) {
|
||||
AsyncSendNewsroom::AddToQueue($this->GetKey(), $oTrigger->GetKey(), $aRecipientsIds, $sMessage, $sTitle, $sUrl, $iObjectId, $sObjectClass);
|
||||
} else {
|
||||
foreach ($aRecipientsIds as $iRecipientId) {
|
||||
$oEvent = Combodo\iTop\Service\Notification\Event\EventNotificationNewsroomService::MakeEventFromAction($this, $iRecipientId, $oTrigger->GetKey(), $sMessage, $sTitle, $sUrl, $iObjectId, $sObjectClass);
|
||||
$oEvent->DBInsertNoReload();
|
||||
}
|
||||
}
|
||||
} catch (CoreCannotSaveObjectException $e) {
|
||||
ExceptionLog::LogException($e);
|
||||
foreach($aRecipientsIds as $iRecipientId) {
|
||||
$oEvent = Combodo\iTop\Service\Notification\Event\EventNotificationNewsroomService::MakeEventFromAction($this,
|
||||
$iRecipientId,
|
||||
$oTrigger->GetKey(),
|
||||
Dict::S('Core:EventNotificationNewsroom:ErrorOnDBInsert'),
|
||||
Dict::S('Core:EventNotificationNewsroom:ErrorNotificationNotSent'),
|
||||
$sUrl,
|
||||
$iObjectId,
|
||||
$sObjectClass
|
||||
);
|
||||
$oEvent->DBInsertNoReload();
|
||||
}
|
||||
}
|
||||
|
||||
$this->SetNotificationLanguage($sPreviousLanguage, $aPreviousPluginProperties['language_code'] ?? null);
|
||||
}
|
||||
@@ -850,6 +866,18 @@
|
||||
<field id="language" xsi:type="AttributeApplicationLanguage"/>
|
||||
</fields>
|
||||
</class>
|
||||
<class id="Event" _delta="define">
|
||||
<!-- Generated by toolkit/export-class-to-meta.php -->
|
||||
<parent>DBObject</parent>
|
||||
<properties>
|
||||
<category>core/cmdb,view_in_gui</category>
|
||||
</properties>
|
||||
<fields>
|
||||
<field id="message" xsi:type="AttributeText"/>
|
||||
<field id="date" xsi:type="AttributeDateTime"/>
|
||||
<field id="userinfo" xsi:type="AttributeString"/>
|
||||
</fields>
|
||||
</class>
|
||||
<class id="EventNotification" _delta="define">
|
||||
<!-- Generated by toolkit/export-class-to-meta.php -->
|
||||
<parent>Event</parent>
|
||||
@@ -996,6 +1024,12 @@
|
||||
<type>string</type>
|
||||
<default/>
|
||||
</property>
|
||||
<property id="class_exclusion_list">
|
||||
<php_param>class_exclusion_list</php_param>
|
||||
<mandatory>false</mandatory>
|
||||
<type>string</type>
|
||||
<default/>
|
||||
</property>
|
||||
<property id="min_up">
|
||||
<php_param>min_up</php_param>
|
||||
<mandatory>true</mandatory>
|
||||
|
||||
@@ -212,6 +212,8 @@ abstract class DBObject implements iDisplay
|
||||
private $aEventListeners = [];
|
||||
private array $aAllowedTransitions = [];
|
||||
|
||||
private ?string $sStimulusBeingApplied = null;
|
||||
|
||||
/**
|
||||
* DBObject constructor.
|
||||
*
|
||||
@@ -1206,7 +1208,7 @@ abstract class DBObject implements iDisplay
|
||||
if ($aCallInfo["function"] != "ComputeValues") continue;
|
||||
return; //skip!
|
||||
}
|
||||
$this->FireEventComputeValues();
|
||||
$this->FireEventComputeValues($this->sStimulusBeingApplied);
|
||||
$oKPI = new ExecutionKPI();
|
||||
$this->ComputeValues();
|
||||
$oKPI->ComputeStatsForExtension($this, 'ComputeValues');
|
||||
@@ -2130,7 +2132,7 @@ abstract class DBObject implements iDisplay
|
||||
|
||||
return "Bad type";
|
||||
}
|
||||
elseif (($oAtt instanceof AttributeClassAttCodeSet) || ($oAtt instanceof AttributeEnumSet))
|
||||
elseif ($oAtt instanceof AttributeSet)
|
||||
{
|
||||
if (is_string($toCheck))
|
||||
{
|
||||
@@ -2669,7 +2671,7 @@ abstract class DBObject implements iDisplay
|
||||
|
||||
// Ultimate check - ensure DB integrity
|
||||
$this->SetReadOnly('No modification allowed during CheckToCreate');
|
||||
$this->FireEventCheckToWrite();
|
||||
$this->FireEventCheckToWrite($this->sStimulusBeingApplied);
|
||||
$this->SetReadWrite();
|
||||
|
||||
$oKPI = new ExecutionKPI();
|
||||
@@ -2865,6 +2867,14 @@ abstract class DBObject implements iDisplay
|
||||
protected function ListChangedValues(array $aProposal)
|
||||
{
|
||||
$aDelta = array();
|
||||
$sClass = get_class($this);
|
||||
if (MetaModel::HasLifecycle($sClass) && utils::IsNotNullOrEmptyString($this->sStimulusBeingApplied)) {
|
||||
$sStateAttCode = MetaModel::GetStateAttributeCode($sClass);
|
||||
if (!in_array($sStateAttCode, $aProposal)) {
|
||||
// Same state but the transition was asked, act as if the state was changed
|
||||
$aDelta[$sStateAttCode] = $this->m_aCurrValues[$sStateAttCode];
|
||||
}
|
||||
}
|
||||
foreach ($aProposal as $sAtt => $proposedValue)
|
||||
{
|
||||
if (!array_key_exists($sAtt, $this->m_aOrigValues))
|
||||
@@ -3398,7 +3408,7 @@ abstract class DBObject implements iDisplay
|
||||
$this->OnInsert();
|
||||
$oKPI->ComputeStatsForExtension($this, 'OnInsert');
|
||||
|
||||
$this->FireEventBeforeWrite();
|
||||
$this->FireEventBeforeWrite(null);
|
||||
|
||||
// If not automatically computed, then check that the key is given by the caller
|
||||
if (!MetaModel::IsAutoIncrementKey($sRootClass)) {
|
||||
@@ -3533,7 +3543,7 @@ abstract class DBObject implements iDisplay
|
||||
*/
|
||||
protected function PostInsertActions(): void
|
||||
{
|
||||
$this->FireEventAfterWrite([], true);
|
||||
$this->FireEventAfterWrite([], true, null);
|
||||
$oKPI = new ExecutionKPI();
|
||||
$this->AfterInsert();
|
||||
$oKPI->ComputeStatsForExtension($this, 'AfterInsert');
|
||||
@@ -3641,7 +3651,7 @@ abstract class DBObject implements iDisplay
|
||||
$this->OnUpdate();
|
||||
$oKPI->ComputeStatsForExtension($this, 'OnUpdate');
|
||||
|
||||
$this->FireEventBeforeWrite();
|
||||
$this->FireEventBeforeWrite($this->sStimulusBeingApplied);
|
||||
|
||||
// Freeze the changes at this point
|
||||
$this->InitPreviousValuesForUpdatedAttributes();
|
||||
@@ -3809,7 +3819,7 @@ abstract class DBObject implements iDisplay
|
||||
}
|
||||
|
||||
try {
|
||||
$this->PostUpdateActions($aChanges, $sClass);
|
||||
$this->PostUpdateActions($this->m_aPreviousValuesForUpdatedAttributes, $sClass);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$this->LogCRUDExit(__METHOD__, 'Error: '.$e->getMessage());
|
||||
@@ -3852,7 +3862,7 @@ abstract class DBObject implements iDisplay
|
||||
*/
|
||||
protected function PostUpdateActions(array $aChanges): void
|
||||
{
|
||||
$this->FireEventAfterWrite($aChanges, false);
|
||||
$this->FireEventAfterWrite($aChanges, false, $this->sStimulusBeingApplied);
|
||||
$oKPI = new ExecutionKPI();
|
||||
$this->AfterUpdate();
|
||||
$oKPI->ComputeStatsForExtension($this, 'AfterUpdate');
|
||||
@@ -3864,39 +3874,38 @@ abstract class DBObject implements iDisplay
|
||||
$this->ActivateOnObjectUpdateTriggersForTargetObjects();
|
||||
|
||||
$sClass = get_class($this);
|
||||
if (MetaModel::HasLifecycle($sClass))
|
||||
if (utils::IsNotNullOrEmptyString($this->sStimulusBeingApplied))
|
||||
{
|
||||
$this->sStimulusBeingApplied = null;
|
||||
$sStateAttCode = MetaModel::GetStateAttributeCode($sClass);
|
||||
if (isset($this->m_aPreviousValuesForUpdatedAttributes[$sStateAttCode])) {
|
||||
$sPreviousState = $this->m_aPreviousValuesForUpdatedAttributes[$sStateAttCode];
|
||||
// Change state triggers...
|
||||
$aParams = array(
|
||||
'class_list' => MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL),
|
||||
'previous_state' => $sPreviousState,
|
||||
'new_state' => $this->Get($sStateAttCode),
|
||||
);
|
||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL('SELECT TriggerOnStateLeave AS t WHERE t.target_class IN (:class_list) AND t.state=:previous_state'), array(), $aParams);
|
||||
while ($oTrigger = $oSet->Fetch()) {
|
||||
/** @var \TriggerOnStateLeave $oTrigger */
|
||||
try {
|
||||
$oTrigger->DoActivate($this->ToArgs('this'));
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$oTrigger->LogException($e, $this);
|
||||
utils::EnrichRaisedException($oTrigger, $e);
|
||||
}
|
||||
$sPreviousState = $this->m_aPreviousValuesForUpdatedAttributes[$sStateAttCode];
|
||||
// Change state triggers...
|
||||
$aParams = array(
|
||||
'class_list' => MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL),
|
||||
'previous_state' => $sPreviousState,
|
||||
'new_state' => $this->Get($sStateAttCode),
|
||||
);
|
||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL('SELECT TriggerOnStateLeave AS t WHERE t.target_class IN (:class_list) AND t.state=:previous_state'), array(), $aParams);
|
||||
while ($oTrigger = $oSet->Fetch()) {
|
||||
/** @var \TriggerOnStateLeave $oTrigger */
|
||||
try {
|
||||
$oTrigger->DoActivate($this->ToArgs('this'));
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$oTrigger->LogException($e, $this);
|
||||
utils::EnrichRaisedException($oTrigger, $e);
|
||||
}
|
||||
}
|
||||
|
||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL('SELECT TriggerOnStateEnter AS t WHERE t.target_class IN (:class_list) AND t.state=:new_state'), array(), $aParams);
|
||||
while ($oTrigger = $oSet->Fetch()) {
|
||||
/** @var \TriggerOnStateEnter $oTrigger */
|
||||
try {
|
||||
$oTrigger->DoActivate($this->ToArgs('this'));
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$oTrigger->LogException($e, $this);
|
||||
utils::EnrichRaisedException($oTrigger, $e);
|
||||
}
|
||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL('SELECT TriggerOnStateEnter AS t WHERE t.target_class IN (:class_list) AND t.state=:new_state'), array(), $aParams);
|
||||
while ($oTrigger = $oSet->Fetch()) {
|
||||
/** @var \TriggerOnStateEnter $oTrigger */
|
||||
try {
|
||||
$oTrigger->DoActivate($this->ToArgs('this'));
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$oTrigger->LogException($e, $this);
|
||||
utils::EnrichRaisedException($oTrigger, $e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4024,7 +4033,7 @@ abstract class DBObject implements iDisplay
|
||||
foreach ($aUpdatedLogAttCodes as $sAttCode) {
|
||||
/** @var \ormCaseLog $oUpdatedCaseLog */
|
||||
$oUpdatedCaseLog = $this->Get($sAttCode);
|
||||
$aMentionedObjects = array_merge_recursive($aMentionedObjects, utils::GetMentionedObjectsFromText($oUpdatedCaseLog->GetModifiedEntry()));
|
||||
$aMentionedObjects = array_merge_recursive($aMentionedObjects, utils::GetMentionedObjectsFromText($oUpdatedCaseLog->GetModifiedEntry(ormCaseLog::ENUM_FORMAT_HTML)));
|
||||
}
|
||||
|
||||
// 3 - Trigger for those objects
|
||||
@@ -4603,6 +4612,7 @@ abstract class DBObject implements iDisplay
|
||||
}
|
||||
if ($bSuccess)
|
||||
{
|
||||
$this->sStimulusBeingApplied = $sStimulusCode;
|
||||
// Stop watches
|
||||
foreach(MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef)
|
||||
{
|
||||
@@ -6617,7 +6627,7 @@ abstract class DBObject implements iDisplay
|
||||
* @return void
|
||||
* @since 3.1.0
|
||||
*/
|
||||
protected function FireEventCheckToWrite(): void
|
||||
protected function FireEventCheckToWrite(?string $sStimulusBeingApplied): void
|
||||
{
|
||||
}
|
||||
|
||||
@@ -6625,7 +6635,7 @@ abstract class DBObject implements iDisplay
|
||||
* @return void
|
||||
* @since 3.1.0
|
||||
*/
|
||||
protected function FireEventBeforeWrite()
|
||||
protected function FireEventBeforeWrite(?string $sStimulusBeingApplied)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -6635,7 +6645,7 @@ abstract class DBObject implements iDisplay
|
||||
* @return void
|
||||
* @since 3.1.0
|
||||
*/
|
||||
protected function FireEventAfterWrite(array $aChanges, bool $bIsNew): void
|
||||
protected function FireEventAfterWrite(array $aChanges, bool $bIsNew, ?string $sStimulusBeingApplied): void
|
||||
{
|
||||
}
|
||||
|
||||
@@ -6673,7 +6683,7 @@ abstract class DBObject implements iDisplay
|
||||
* @return void
|
||||
* @since 3.1.0
|
||||
*/
|
||||
protected function FireEventComputeValues(): void
|
||||
protected function FireEventComputeValues(?string $sStimulusBeingApplied): void
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ class DBProperty extends DBObject
|
||||
MetaModel::Init_AddAttribute(new AttributeString("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("value", array("allowed_values"=>null, "sql"=>"value", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
|
||||
MetaModel::Init_AddAttribute(new AttributeDateTime("change_date", array("allowed_values"=>null, "sql"=>"change_date", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeDateTime("change_date", array("allowed_values"=>null, "sql"=>"change_date", "default_value"=>"NOW()", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("change_comment", array("allowed_values"=>null, "sql"=>"change_comment", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ class Event extends DBObject implements iDisplay
|
||||
MetaModel::Init_Params($aParams);
|
||||
//MetaModel::Init_InheritAttributes();
|
||||
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 AttributeDateTime("date", array("allowed_values"=>null, "sql"=>"date", "default_value"=>"NOW()", "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())));
|
||||
|
||||
|
||||
@@ -278,7 +278,7 @@ class HTMLDOMSanitizer extends DOMSanitizer
|
||||
protected static $aTagsWhiteList = array(
|
||||
'html' => array(),
|
||||
'body' => array(),
|
||||
'a' => array('href', 'name', 'style', 'class', 'target', 'title', 'data-role', 'data-object-class', 'data-object-id'),
|
||||
'a' => array('href', 'name', 'style', 'class', 'target', 'title', 'data-role', 'data-object-class', 'data-object-id', 'data-object-key'),
|
||||
'p' => array('style', 'class'),
|
||||
'blockquote' => array('style', 'class'),
|
||||
'br' => array(),
|
||||
|
||||
@@ -7112,7 +7112,7 @@ abstract class MetaModel
|
||||
if ($iKey < 0) {
|
||||
return "$sTargetClass: $iKey (invalid value)";
|
||||
}
|
||||
$oObj = self::GetObject($sTargetClass, $iKey, false);
|
||||
$oObj = self::GetObject($sTargetClass, $iKey, false);
|
||||
if (is_null($oObj)) {
|
||||
// Whatever we are looking for, the root class is the key to search for
|
||||
$sRootClass = self::GetRootClass($sTargetClass);
|
||||
@@ -7532,8 +7532,41 @@ abstract class MetaModel
|
||||
return $aEntries;
|
||||
}
|
||||
|
||||
public static function ResetAllCaches($sEnvironment = null)
|
||||
{
|
||||
if (is_null($sEnvironment)) {
|
||||
$sEnvironment = MetaModel::GetEnvironment();
|
||||
}
|
||||
|
||||
$sEnvironmentId = md5(APPROOT).'-'.$sEnvironment;
|
||||
$sAppIdentity = 'itop-'.$sEnvironmentId;
|
||||
require_once(APPROOT.'/core/dict.class.inc.php');
|
||||
Dict::ResetCache($sAppIdentity);
|
||||
|
||||
if (function_exists('apc_delete')) {
|
||||
foreach (self::GetCacheEntries($sEnvironmentId) as $sKey => $aAPCInfo) {
|
||||
$sAPCKey = $aAPCInfo['info'];
|
||||
apc_delete($sAPCKey);
|
||||
}
|
||||
}
|
||||
|
||||
require_once(APPROOT.'core/userrights.class.inc.php');
|
||||
UserRights::FlushPrivileges();
|
||||
|
||||
// Reset the opcache since otherwise the PHP "model" files may still be cached !!
|
||||
if (function_exists('opcache_reset')) {
|
||||
// Zend opcode cache
|
||||
opcache_reset();
|
||||
}
|
||||
|
||||
require_once(APPROOT.'setup/setuputils.class.inc.php');
|
||||
SetupUtils::rrmdir(utils::GetCachePath($sEnvironment));
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @param string $sEnvironmentId
|
||||
* @deprecated 3.2.1
|
||||
*/
|
||||
public static function ResetCache($sEnvironmentId = null)
|
||||
{
|
||||
@@ -7557,6 +7590,13 @@ abstract class MetaModel
|
||||
|
||||
require_once(APPROOT.'core/userrights.class.inc.php');
|
||||
UserRights::FlushPrivileges();
|
||||
|
||||
// Reset the opcache since otherwise the PHP "model" files may still be cached !!
|
||||
if (function_exists('opcache_reset'))
|
||||
{
|
||||
// Zend opcode cache
|
||||
opcache_reset();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -575,6 +575,15 @@ class BinaryExpression extends Expression
|
||||
case 'LIKE':
|
||||
$sType = 'like';
|
||||
break;
|
||||
case 'NOT LIKE':
|
||||
$sType = 'notlike';
|
||||
break;
|
||||
case 'IN':
|
||||
$sType = 'in';
|
||||
break;
|
||||
case 'NOT IN':
|
||||
$sType = 'notin';
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Operator '$sOperator' not yet supported");
|
||||
}
|
||||
@@ -639,7 +648,26 @@ class BinaryExpression extends Expression
|
||||
case 'like':
|
||||
$sEscaped = preg_quote($mRight, '/');
|
||||
$sEscaped = str_replace(array('%', '_', '\\\\.*', '\\\\.'), array('.*', '.', '%', '_'), $sEscaped);
|
||||
$result = (int) preg_match("/$sEscaped/i", $mLeft);
|
||||
$pregRes = preg_match("/$sEscaped/i", $mLeft);
|
||||
if ($pregRes === false) {
|
||||
throw new Exception("Error in regular expression '$sEscaped'");
|
||||
}
|
||||
$result = ($pregRes === 1);
|
||||
break;
|
||||
case 'notlike':
|
||||
$sEscaped = preg_quote($mRight, '/');
|
||||
$sEscaped = str_replace(array('%', '_', '\\\\.*', '\\\\.'), array('.*', '.', '%', '_'), $sEscaped);
|
||||
$pregRes = preg_match("/$sEscaped/i", $mLeft);
|
||||
if ($pregRes === false) {
|
||||
throw new Exception("Error in regular expression '$sEscaped'");
|
||||
}
|
||||
$result = ($pregRes !== 1);
|
||||
break;
|
||||
case 'in':
|
||||
$result = in_array($mLeft, $mRight);
|
||||
break;
|
||||
case 'notin':
|
||||
$result = !in_array($mLeft, $mRight);
|
||||
break;
|
||||
}
|
||||
return $result;
|
||||
@@ -2250,7 +2278,12 @@ class ListExpression extends Expression
|
||||
*/
|
||||
public function Evaluate(array $aArgs)
|
||||
{
|
||||
throw new Exception('list expression not yet supported');
|
||||
//throw new Exception('list expression not yet supported');
|
||||
$aResult = [];
|
||||
foreach ($this->m_aExpressions as $oExpressions) {
|
||||
$aResult[] = $oExpressions->Evaluate($aArgs);
|
||||
}
|
||||
return $aResult;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -71,28 +71,24 @@ class_list(A) ::= class_list(L) COMA class_name(X). {
|
||||
where_statement(A) ::= WHERE condition(C). { A = C;}
|
||||
where_statement(A) ::= . { A = null;}
|
||||
|
||||
join_statement(A) ::= join_item(J) join_statement(S). {
|
||||
join_statement(A) ::= join_statement(S) JOIN join_item(J). {
|
||||
// insert the join statement on top of the existing list
|
||||
array_unshift(S, J);
|
||||
array_push(S, J);
|
||||
// and return the updated array
|
||||
A = S;
|
||||
}
|
||||
join_statement(A) ::= join_item(J). {
|
||||
A = Array(J);
|
||||
}
|
||||
join_statement(A) ::= . { A = null;}
|
||||
join_statement(A) ::= . { A = [];}
|
||||
|
||||
join_item(A) ::= JOIN class_name(X) AS_ALIAS class_name(Y) ON join_condition(C).
|
||||
join_item(A) ::= class_name(X) AS_ALIAS class_name(Y) ON join_condition(C).
|
||||
{
|
||||
// create an array with one single item
|
||||
A = new OqlJoinSpec(X, Y, C);
|
||||
}
|
||||
join_item(A) ::= JOIN class_name(X) ON join_condition(C).
|
||||
join_item(A) ::= class_name(X) ON join_condition(C).
|
||||
{
|
||||
// create an array with one single item
|
||||
A = new OqlJoinSpec(X, X, C);
|
||||
}
|
||||
|
||||
join_condition(A) ::= field_id(X) EQ field_id(Y). { A = new BinaryOqlExpression(X, '=', Y); }
|
||||
join_condition(A) ::= field_id(X) BELOW field_id(Y). { A = new BinaryOqlExpression(X, 'BELOW', Y); }
|
||||
join_condition(A) ::= field_id(X) BELOW_STRICT field_id(Y). { A = new BinaryOqlExpression(X, 'BELOW_STRICT', Y); }
|
||||
|
||||
@@ -36,7 +36,13 @@ class UnknownClassOqlException extends OqlNormalizeException
|
||||
{
|
||||
public function __construct($sInput, OqlName $oName, $aExpecting = null)
|
||||
{
|
||||
parent::__construct('Unknown class', $sInput, $oName, $aExpecting);
|
||||
$aAllowedClasses = [];
|
||||
foreach ($aExpecting as $sClass) {
|
||||
if (UserRights::IsActionAllowed($sClass, UR_ACTION_READ)) {
|
||||
$aAllowedClasses[] = $sClass;
|
||||
}
|
||||
}
|
||||
parent::__construct('Unknown class', $sInput, $oName, $aAllowedClasses);
|
||||
}
|
||||
|
||||
public function GetUserFriendlyDescription()
|
||||
|
||||
@@ -48,6 +48,42 @@ class ormDocument
|
||||
* @since 3.1.0
|
||||
*/
|
||||
public const DEFAULT_DOWNLOADS_COUNT = 0;
|
||||
private static $aKnownExtensions = [
|
||||
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
|
||||
'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
|
||||
'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
|
||||
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
||||
'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
|
||||
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||||
'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
|
||||
'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
|
||||
'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
|
||||
'jpg' => 'image/jpeg',
|
||||
'jpeg' => 'image/jpeg',
|
||||
'gif' => 'image/gif',
|
||||
'png' => 'image/png',
|
||||
'pdf' => 'application/pdf',
|
||||
'doc' => 'application/msword',
|
||||
'dot' => 'application/msword',
|
||||
'xls' => 'application/vnd.ms-excel',
|
||||
'ppt' => 'application/vnd.ms-powerpoint',
|
||||
'vsd' => 'application/x-visio',
|
||||
'vdx' => 'application/visio.drawing',
|
||||
'odt' => 'application/vnd.oasis.opendocument.text',
|
||||
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
|
||||
'odp' => 'application/vnd.oasis.opendocument.presentation',
|
||||
'zip' => 'application/zip',
|
||||
'txt' => 'text/plain',
|
||||
'htm' => 'text/html',
|
||||
'html' => 'text/html',
|
||||
'exe' => 'application/octet-stream',
|
||||
];
|
||||
|
||||
public static function GetKnownExtensions(): array
|
||||
{
|
||||
return self::$aKnownExtensions;
|
||||
}
|
||||
|
||||
protected $m_data;
|
||||
protected $m_sMimeType;
|
||||
@@ -76,6 +112,36 @@ class ormDocument
|
||||
$this->m_iDownloadsCount = $iDownloadsCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $sPath Absolute path of the document to read
|
||||
*
|
||||
* @return \ormDocument
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function FromFile(string $sPath): ormDocument
|
||||
{
|
||||
$sPath = utils::RealPath($sPath, APPROOT);
|
||||
if (false === $sPath) {
|
||||
throw new Exception("Failed to load the file '$sPath'. The file does not exist or the current process is not allowed to access it.");
|
||||
}
|
||||
$sData = @file_get_contents($sPath);
|
||||
if (false === $sData) {
|
||||
throw new Exception("Failed to load the file '$sPath'. The file does not exist or the current process is not allowed to access it.");
|
||||
}
|
||||
$sExtension = strtolower(pathinfo($sPath, PATHINFO_EXTENSION));
|
||||
$sFileName = basename($sPath);
|
||||
|
||||
$sMimeType = 'text/plain';
|
||||
if (array_key_exists($sExtension, ormDocument::$aKnownExtensions)) {
|
||||
$sMimeType = ormDocument::$aKnownExtensions[$sExtension];
|
||||
} else if (extension_loaded('fileinfo')) {
|
||||
$fInfo = new finfo(FILEINFO_MIME);
|
||||
$sMimeType = $fInfo->file($sPath);
|
||||
}
|
||||
|
||||
return new ormDocument($sData, $sMimeType, $sFileName);
|
||||
}
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
if($this->IsEmpty()) return '';
|
||||
|
||||
@@ -42,8 +42,8 @@ class iTopOwnershipToken extends DBObject
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_InheritAttributes();
|
||||
MetaModel::Init_AddAttribute(new AttributeDateTime("acquired", array("allowed_values"=>null, "sql"=>'acquired', "default_value"=>'', "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeDateTime("last_seen", array("allowed_values"=>null, "sql"=>'last_seen', "default_value"=>'', "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeDateTime("acquired", array("allowed_values"=>null, "sql"=>'acquired', "default_value"=>'NOW()', "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeDateTime("last_seen", array("allowed_values"=>null, "sql"=>'last_seen', "default_value"=>'NOW()', "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("obj_class", array("allowed_values"=>null, "sql"=>'obj_class', "default_value"=>'', "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeInteger("obj_key", array("allowed_values"=>null, "sql"=>'obj_key', "default_value"=>'', "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeString("token", array("allowed_values"=>null, "sql"=>'token', "default_value"=>'', "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
*/
|
||||
|
||||
use Combodo\iTop\Application\UI\Base\Component\Alert\AlertUIBlockFactory;
|
||||
|
||||
/**
|
||||
* A user defined trigger, to customize the application
|
||||
* A trigger will activate an action
|
||||
@@ -170,19 +172,20 @@ abstract class TriggerOnObject extends Trigger
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "grant_by_profile,core/cmdb",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"category" => "grant_by_profile,core/cmdb",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"complementary_name_attcode" => ['finalclass', 'complement'],
|
||||
"state_attcode" => "",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => ['description'],
|
||||
"db_table" => "priv_trigger_onobject",
|
||||
"db_key_field" => "id",
|
||||
"db_table" => "priv_trigger_onobject",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_InheritAttributes();
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("target_class", array("class_category" => "bizmodel", "more_values" => "User,UserExternal,UserInternal,UserLDAP,UserLocal", "sql" => "target_class", "default_value" => null, "is_null_allowed" => false, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("target_class",
|
||||
array("class_category" => "bizmodel", "more_values" => "User,UserExternal,UserInternal,UserLDAP,UserLocal", "sql" => "target_class", "default_value" => null, "is_null_allowed" => false, "depends_on" => array(), "class_exclusion_list" => "Attachment")));
|
||||
MetaModel::Init_AddAttribute(new AttributeOQL("filter", array("allowed_values" => null, "sql" => "filter", "default_value" => null, "is_null_allowed" => true, "depends_on" => array())));
|
||||
|
||||
// Display lists
|
||||
@@ -270,6 +273,36 @@ abstract class TriggerOnObject extends Trigger
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* if the target class is Attachment, then the trigger is read-only
|
||||
* @param $sAttCode
|
||||
* @param $aReasons
|
||||
* @param $sTargetState
|
||||
* @return int
|
||||
* @throws ArchivedObjectException
|
||||
* @throws CoreException
|
||||
*/
|
||||
public function GetAttributeFlags($sAttCode, &$aReasons = array(), $sTargetState='')
|
||||
{
|
||||
// Force the computed field to be read-only, preventing it to be written
|
||||
if ($this->Get('target_class') == 'Attachment' ) {
|
||||
return OPT_ATT_READONLY;
|
||||
}
|
||||
return parent::GetAttributeFlags($sAttCode, $aReasons, $sTargetState);
|
||||
}
|
||||
|
||||
|
||||
public function DisplayBareHeader(WebPage $oPage, $bEditMode = false)
|
||||
{
|
||||
$aHeaderBlocks = parent::DisplayBareHeader($oPage, $bEditMode);
|
||||
if ($this->Get('target_class') == 'Attachment' ) {
|
||||
$oPage->AddUiBlock(AlertUIBlockFactory::MakeForWarning('', Dict::S('Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage')));
|
||||
$oPage->add_ready_script("$('#UIMenuModify').hide();");
|
||||
}
|
||||
|
||||
return $aHeaderBlocks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Activate trigger based on attribute list given instead of changed attributes
|
||||
*
|
||||
@@ -529,6 +562,7 @@ class TriggerOnObjectCreate extends TriggerOnObject
|
||||
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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1921,50 +1921,45 @@ class UserRights
|
||||
*/
|
||||
protected static function FindUser($sLogin, $sAuthentication = 'any', $bAllowDisabledUsers = false)
|
||||
{
|
||||
if ($sAuthentication == 'any')
|
||||
{
|
||||
$oUser = self::FindUser($sLogin, 'internal');
|
||||
if ($oUser == null)
|
||||
{
|
||||
$oUser = self::FindUser($sLogin, 'external');
|
||||
if ($sAuthentication === 'any') {
|
||||
$oUser = self::FindUser($sLogin, 'internal', $bAllowDisabledUsers);
|
||||
if ($oUser !== null) {
|
||||
return $oUser;
|
||||
}
|
||||
|
||||
return self::FindUser($sLogin, 'external', $bAllowDisabledUsers);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!isset(self::$m_aCacheUsers))
|
||||
{
|
||||
self::$m_aCacheUsers = array('internal' => array(), 'external' => array());
|
||||
}
|
||||
|
||||
if (!isset(self::$m_aCacheUsers[$sAuthentication][$sLogin]))
|
||||
{
|
||||
switch($sAuthentication)
|
||||
{
|
||||
case 'external':
|
||||
$sBaseClass = 'UserExternal';
|
||||
break;
|
||||
|
||||
case 'internal':
|
||||
$sBaseClass = 'UserInternal';
|
||||
break;
|
||||
|
||||
default:
|
||||
echo "<p>sAuthentication = $sAuthentication</p>\n";
|
||||
assert(false); // should never happen
|
||||
}
|
||||
$oSearch = DBObjectSearch::FromOQL("SELECT $sBaseClass WHERE login = :login");
|
||||
$oSearch->AllowAllData();
|
||||
if (!$bAllowDisabledUsers)
|
||||
{
|
||||
$oSearch->AddCondition('status', 'enabled');
|
||||
}
|
||||
$oSet = new DBObjectSet($oSearch, array(), array('login' => $sLogin));
|
||||
$oUser = $oSet->fetch();
|
||||
self::$m_aCacheUsers[$sAuthentication][$sLogin] = $oUser;
|
||||
}
|
||||
$oUser = self::$m_aCacheUsers[$sAuthentication][$sLogin];
|
||||
if (!isset(self::$m_aCacheUsers)) {
|
||||
self::$m_aCacheUsers = [ 'internal' => [], 'external' => [] ];
|
||||
}
|
||||
return $oUser;
|
||||
|
||||
if (! isset(self::$m_aCacheUsers[$sAuthentication]) || ! array_key_exists($sLogin, self::$m_aCacheUsers[$sAuthentication])) {
|
||||
switch($sAuthentication) {
|
||||
case 'external':
|
||||
$sBaseClass = 'UserExternal';
|
||||
break;
|
||||
|
||||
case 'internal':
|
||||
$sBaseClass = 'UserInternal';
|
||||
break;
|
||||
|
||||
default:
|
||||
echo "<p>sAuthentication = $sAuthentication</p>\n";
|
||||
assert(false); // should never happen
|
||||
}
|
||||
$oSearch = DBObjectSearch::FromOQL("SELECT $sBaseClass WHERE login = :login");
|
||||
$oSearch->AllowAllData();
|
||||
if (!$bAllowDisabledUsers) {
|
||||
$oSearch->AddCondition('status', 'enabled');
|
||||
}
|
||||
$oSet = new DBObjectSet($oSearch, array(), array('login' => $sLogin));
|
||||
$oUser = $oSet->fetch();
|
||||
|
||||
self::$m_aCacheUsers[$sAuthentication][$sLogin] = $oUser;
|
||||
}
|
||||
|
||||
return self::$m_aCacheUsers[$sAuthentication][$sLogin];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*!
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*!
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*!
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*!
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*!
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*!
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
2
css/backoffice/vendors/ckeditor/_all.scss
vendored
2
css/backoffice/vendors/ckeditor/_all.scss
vendored
@@ -1,4 +1,4 @@
|
||||
/*!
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*!
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*!
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/*!
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
/* SCSS variables */
|
||||
$common-has-description--content: "?" !default;
|
||||
$common-has-description--content: "\1F6C8" !default;
|
||||
$common-has-description--padding-left: $common-spacing-200 !default;
|
||||
$common-has-description--color: $common-color-grey-600 !default;
|
||||
$common-has-description--font-size: 0.7em !default; /* Font size is em on purpose as we want it to be proportional to its context */
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*!
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
@@ -4,11 +4,8 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'CAS:Error:UserNotAllowed' => '用户被禁止登录',
|
||||
'CAS:Login:SignIn' => '使用CAS登录',
|
||||
|
||||
@@ -160,8 +160,7 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
|
||||
private static function InitCASClient()
|
||||
{
|
||||
$bCASDebug = Config::Get('cas_debug');
|
||||
if ($bCASDebug)
|
||||
{
|
||||
if ($bCASDebug) {
|
||||
phpCAS::setLogger(new CASLogger(APPROOT.'log/cas.log'));
|
||||
}
|
||||
|
||||
@@ -171,18 +170,17 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
|
||||
$iCASPort = Config::Get('cas_port');
|
||||
$sCASContext = Config::Get('cas_context');
|
||||
$sServiceBaseURL = Config::Get('service_base_url', self::GetServiceBaseURL());
|
||||
phpCAS::client($sCASVersion, $sCASHost, $iCASPort, $sCASContext, $sServiceBaseURL, false /* session already started */);
|
||||
if (!phpCAS::isInitialized()) {
|
||||
phpCAS::client($sCASVersion, $sCASHost, $iCASPort, $sCASContext, $sServiceBaseURL, false /* session already started */);
|
||||
}
|
||||
$sCASCACertPath = Config::Get('cas_server_ca_cert_path');
|
||||
if (empty($sCASCACertPath))
|
||||
{
|
||||
if (empty($sCASCACertPath)) {
|
||||
// If no certificate authority is provided, do not attempt to validate
|
||||
// the server's certificate
|
||||
// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION.
|
||||
// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL!
|
||||
phpCAS::setNoCasServerValidation();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
phpCAS::setCasServerCACert($sCASCACertPath);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,12 +4,39 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @author Robert Deng <denglx@gmail.com>
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// 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('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserExternal' => '外部用户',
|
||||
'Class:UserExternal+' => '用户在'.ITOP_APPLICATION_SHORT.'外部验证身份',
|
||||
|
||||
@@ -4,12 +4,38 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @author Robert Deng <denglx@gmail.com>
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// 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('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserLDAP' => 'LDAP用户',
|
||||
'Class:UserLDAP+' => '用户身份由LDAP认证',
|
||||
|
||||
@@ -4,15 +4,44 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @author Robert Deng <denglx@gmail.com>
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// 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('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserLocal' => ITOP_APPLICATION_SHORT.' 用户',
|
||||
'Class:UserLocal+' => '用户由'.ITOP_APPLICATION_SHORT.'验证身份',
|
||||
'Class:UserLocal/Attribute:password' => '密码',
|
||||
'Class:UserLocal/Attribute:password+' => '用于验证用户身份的字符串',
|
||||
|
||||
'Class:UserLocal/Attribute:expiration' => '密码过期',
|
||||
'Class:UserLocal/Attribute:expiration+' => '密码过期状态 (需要一个扩展才能生效)',
|
||||
'Class:UserLocal/Attribute:expiration/Value:can_expire' => '允许过期',
|
||||
@@ -23,11 +52,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => '一次性密码',
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '用户不允许修改密码.',
|
||||
'Class:UserLocal/Attribute:password' => '密码',
|
||||
'Class:UserLocal/Attribute:password+' => '用于验证用户身份的字符串',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => '密码更新',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => '上次修改密码的时间',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => '不允许用户为自己设置 "一次性密码" 的失效期限',
|
||||
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => '密码必须至少8个字符, 包含大小写, 数字和特殊字符.',
|
||||
'UserLocal:password:expiration' => '下面的区域需要插件扩展',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => '不允许用户为自己设置 "一次性密码" 的失效期限',
|
||||
]);
|
||||
|
||||
@@ -4,11 +4,23 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'theme:darkmoon' => '暗月',
|
||||
]);
|
||||
|
||||
@@ -170,7 +170,7 @@ class DatabaseAnalyzer
|
||||
$this->CheckHK($sClass, $sAttCode, $aErrorsAndFixes);
|
||||
}
|
||||
}
|
||||
elseif ($oAttDef->IsDirectField() && !($oAttDef instanceof AttributeTagSet))
|
||||
elseif ($oAttDef->IsDirectField() && !($oAttDef instanceof AttributeSet))
|
||||
{
|
||||
$this->CheckAllowedValues($sClass, $sAttCode, $oAttDef, $sTable, $sKeyField, $aErrorsAndFixes);
|
||||
}
|
||||
|
||||
@@ -4,63 +4,93 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'DBAnalyzer-Fetch-Count-Error' => '读取计数出错于 `%1$s`, %2$d个记录已读取 / %3$d已',
|
||||
'DBAnalyzer-Integrity-FinalClass' => '字段 `%2$s`.`%1$s` 必须是相同的值, 而不是 `%3$s`.`%1$s`',
|
||||
'DBAnalyzer-Integrity-HKInvalid' => '损坏的层级链 `%1$s`',
|
||||
'DBAnalyzer-Integrity-InvalidExtKey' => '无效的外键%1$s (列: `%2$s.%3$s`)',
|
||||
'DBAnalyzer-Integrity-InvalidValue' => '无效的值%1$s (列: `%2$s.%3$s`)',
|
||||
'DBAnalyzer-Integrity-MissingExtKey' => '外键丢失%1$s (列: `%2$s.%3$s`)',
|
||||
'DBAnalyzer-Integrity-OrphanRecord' => '孤立记录位于 `%1$s`, 其应该有副本位于表 `%2$s`',
|
||||
'DBAnalyzer-Integrity-RootFinalClass' => '字段 `%2$s`.`%1$s` 必须包含一个有效的类型',
|
||||
'DBAnalyzer-Integrity-UsersWithoutProfile' => '一些用户账号没有角色',
|
||||
'DBTools:Analyze' => '分析',
|
||||
'DBTools:Base' => '数据库',
|
||||
|
||||
// Database inconsistencies
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
|
||||
// Dictionary entries go here
|
||||
'Menu:DBToolsMenu' => '数据库工具',
|
||||
'DBTools:Class' => '类型',
|
||||
'DBTools:Count' => '个数',
|
||||
'DBTools:DatabaseInfo' => '数据库信息',
|
||||
'DBTools:DetailedErrorLimit' => '列表限制为%1$s错误',
|
||||
'DBTools:DetailedErrorTitle' => '%2$s个错误在类型%1$s: %3$s',
|
||||
'DBTools:Details' => '显示详情',
|
||||
'DBTools:Title' => '数据库维护工具',
|
||||
'DBTools:ErrorsFound' => '发现错误',
|
||||
'DBTools:Indication' => '重要: 修复数据库错误后, 可能会出现新的不一致, 您必须重新运行一次分析.',
|
||||
'DBTools:Disclaimer' => '免责申明: 在应用修复之前, 应先备份数据库',
|
||||
'DBTools:Error' => '错误',
|
||||
'DBTools:ErrorsFound' => '发现错误',
|
||||
'DBTools:FetchCheck' => '提取检查 (耗时长)',
|
||||
'DBTools:FixitSQLquery' => '修复问题的SQL查询 (指示)',
|
||||
'DBTools:HideIds' => '错误列表',
|
||||
'DBTools:Inconsistencies' => '数据库不一致',
|
||||
'DBTools:Indication' => '重要: 修复数据库错误后, 可能会出现新的不一致, 您必须重新运行一次分析.',
|
||||
'DBTools:IntegrityCheck' => '完整性检查',
|
||||
'DBTools:LostAttachments' => '附件缺失',
|
||||
'DBTools:LostAttachments:Button:Analyze' => '分析',
|
||||
'DBTools:LostAttachments:Button:Busy' => '请稍后...',
|
||||
'DBTools:LostAttachments:Button:Restore' => '还原',
|
||||
'DBTools:LostAttachments:Button:Restore:Confirm' => '此操作无法回退, 请确认是否继续还原.',
|
||||
'DBTools:LostAttachments:Disclaimer' => '可以在此搜索数据库中丢失或错放的附件. 这不是数据恢复工具, 其无法恢复已删除的数据.',
|
||||
'DBTools:LostAttachments:History' => '附件 "%1$s" 已使用数据库工具还原',
|
||||
'DBTools:LostAttachments:Step:Analyze' => '首先, 通过分析数据库来搜索丢失或误挪动的附件.',
|
||||
'DBTools:LostAttachments:Step:AnalyzeResults' => '分析结果:',
|
||||
'DBTools:LostAttachments:Step:AnalyzeResults:Item:CurrentLocation' => '当前位置',
|
||||
'DBTools:LostAttachments:Step:AnalyzeResults:Item:Filename' => '文件名',
|
||||
'DBTools:LostAttachments:Step:AnalyzeResults:Item:TargetLocation' => '移动到...',
|
||||
'DBTools:LostAttachments:Step:AnalyzeResults:None' => '非常好! 所有附件都是正常的.',
|
||||
'DBTools:LostAttachments:Step:AnalyzeResults:Some' => '某些附件 (%1$d) 看起来放错了位置. 请检查下面的列表并选择要挪动的文件.',
|
||||
'DBTools:LostAttachments:Step:RestoreResults' => '还原结果:',
|
||||
'DBTools:LostAttachments:Step:RestoreResults:Results' => '%1$d/%2$d的附件被还原.',
|
||||
'DBTools:LostAttachments:StoredAsInlineImage' => '存储为内嵌图像',
|
||||
'DBTools:NoError' => '数据库正确',
|
||||
'DBTools:Count' => '个数',
|
||||
'DBTools:SQLquery' => 'SQL查询',
|
||||
'DBTools:FixitSQLquery' => '修复问题的SQL查询 (指示)',
|
||||
'DBTools:SQLresult' => 'SQL结果',
|
||||
'DBTools:SelectAnalysisType' => '请选择分析类型',
|
||||
'DBTools:ShowAll' => '显示所有错误',
|
||||
'DBTools:NoError' => '数据库正确',
|
||||
'DBTools:HideIds' => '错误列表',
|
||||
'DBTools:ShowIds' => '详细视图',
|
||||
'DBTools:ShowReport' => '报告',
|
||||
'DBTools:IntegrityCheck' => '完整性检查',
|
||||
'DBTools:FetchCheck' => '提取检查 (耗时长)',
|
||||
'DBTools:SelectAnalysisType' => '请选择分析类型',
|
||||
|
||||
'DBTools:Analyze' => '分析',
|
||||
'DBTools:Details' => '显示详情',
|
||||
'DBTools:ShowAll' => '显示所有错误',
|
||||
|
||||
'DBTools:Inconsistencies' => '数据库不一致',
|
||||
'DBTools:DetailedErrorTitle' => '%2$s个错误在类型%1$s: %3$s',
|
||||
'DBTools:DetailedErrorLimit' => '列表限制为%1$s错误',
|
||||
|
||||
'DBAnalyzer-Integrity-OrphanRecord' => '孤立记录位于 `%1$s`, 其应该有副本位于表 `%2$s`',
|
||||
'DBAnalyzer-Integrity-InvalidExtKey' => '无效的外键%1$s (列: `%2$s.%3$s`)',
|
||||
'DBAnalyzer-Integrity-MissingExtKey' => '外键丢失%1$s (列: `%2$s.%3$s`)',
|
||||
'DBAnalyzer-Integrity-InvalidValue' => '无效的值%1$s (列: `%2$s.%3$s`)',
|
||||
'DBAnalyzer-Integrity-UsersWithoutProfile' => '一些用户账号没有角色',
|
||||
'DBAnalyzer-Integrity-HKInvalid' => '损坏的层级链 `%1$s`',
|
||||
'DBAnalyzer-Fetch-Count-Error' => '读取计数出错于 `%1$s`, %2$d个记录已读取 / %3$d已',
|
||||
'DBAnalyzer-Integrity-FinalClass' => '字段 `%2$s`.`%1$s` 必须是相同的值, 而不是 `%3$s`.`%1$s`',
|
||||
'DBAnalyzer-Integrity-RootFinalClass' => '字段 `%2$s`.`%1$s` 必须包含一个有效的类型',
|
||||
));
|
||||
|
||||
// Database Info
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
|
||||
'DBTools:DatabaseInfo' => '数据库信息',
|
||||
'DBTools:Base' => '数据库',
|
||||
'DBTools:Size' => '大小',
|
||||
'DBTools:Title' => '数据库维护工具',
|
||||
'Menu:DBToolsMenu' => '数据库工具',
|
||||
]);
|
||||
));
|
||||
|
||||
// Lost attachments
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
|
||||
'DBTools:LostAttachments' => '附件缺失',
|
||||
'DBTools:LostAttachments:Disclaimer' => '可以在此搜索数据库中丢失或错放的附件. 这不是数据恢复工具, 其无法恢复已删除的数据.',
|
||||
|
||||
'DBTools:LostAttachments:Button:Analyze' => '分析',
|
||||
'DBTools:LostAttachments:Button:Restore' => '还原',
|
||||
'DBTools:LostAttachments:Button:Restore:Confirm' => '此操作无法回退, 请确认是否继续还原.',
|
||||
'DBTools:LostAttachments:Button:Busy' => '请稍候...',
|
||||
|
||||
'DBTools:LostAttachments:Step:Analyze' => '首先, 通过分析数据库来搜索丢失或误挪动的附件.',
|
||||
|
||||
'DBTools:LostAttachments:Step:AnalyzeResults' => '分析结果:',
|
||||
'DBTools:LostAttachments:Step:AnalyzeResults:None' => '非常好! 所有附件都是正常的.',
|
||||
'DBTools:LostAttachments:Step:AnalyzeResults:Some' => '某些附件 (%1$d) 看起来放错了位置. 请检查下面的列表并选择要挪动的文件.',
|
||||
'DBTools:LostAttachments:Step:AnalyzeResults:Item:Filename' => '文件名',
|
||||
'DBTools:LostAttachments:Step:AnalyzeResults:Item:CurrentLocation' => '当前位置',
|
||||
'DBTools:LostAttachments:Step:AnalyzeResults:Item:TargetLocation' => '移动到...',
|
||||
|
||||
'DBTools:LostAttachments:Step:RestoreResults' => '还原结果:',
|
||||
'DBTools:LostAttachments:Step:RestoreResults:Results' => '%1$d/%2$d的附件被还原.',
|
||||
|
||||
'DBTools:LostAttachments:StoredAsInlineImage' => '存储为内嵌图像',
|
||||
'DBTools:LostAttachments:History' => '附件 "%1$s" 已使用数据库工具还原',
|
||||
));
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @author Lukáš Dvořák <lukas.dvorak@itopportal.cz>
|
||||
@@ -58,7 +58,14 @@ nebe se zeptejte'.ITOP_APPLICATION_SHORT.' správce '.ITOP_APPLICATION_SHORT.' z
|
||||
'Class:Attachment/Attribute:temp_id+' => '~~',
|
||||
'Class:Attachment/Attribute:user_id' => 'Jméno uživatele',
|
||||
'Class:Attachment/Attribute:user_id+' => '~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @author Erik Bøg <erik@boegmoeller.dk>
|
||||
@@ -57,7 +57,14 @@ or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_S
|
||||
'Class:Attachment/Attribute:temp_id+' => '~~',
|
||||
'Class:Attachment/Attribute:user_id' => 'User id~~',
|
||||
'Class:Attachment/Attribute:user_id+' => '~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @author ITOMIG GmbH <martin.raenker@itomig.de>
|
||||
@@ -57,7 +57,14 @@ oder melden Sie dem '.ITOP_APPLICATION_SHORT.' Administrator diesen Fehler, weil
|
||||
'Class:Attachment/Attribute:temp_id+' => '',
|
||||
'Class:Attachment/Attribute:user_id' => 'Benutzer ID',
|
||||
'Class:Attachment/Attribute:user_id+' => '',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (beim Herunterladen eines Attachment eines Objekts)',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger für das Herunterladen des Attachments der angegebenen Klasse oder einer Unterklasse',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (beim Herunterladen eines Attachment eines Objekts)',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger für das Herunterladen des Attachments der angegebenen Klasse oder einer Unterklasse',
|
||||
'UI:Attachments:DropYourFileHint' => 'Dateien in diesem Bereich ablegen...',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -89,6 +89,13 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger',
|
||||
));
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
* @author Miguel Turrubiates <miguel_tf@yahoo.com>
|
||||
* @notas Utilizar codificación UTF-8 para mostrar acentos y otros caracteres especiales
|
||||
* @notas Utilizar codificación UTF-8 para mostrar acentos y otros caracteres especiales
|
||||
*/
|
||||
Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
|
||||
'Attachment:Max_Go' => '(Tamaño Máximo de Archivo: %1$s Gb)',
|
||||
@@ -57,4 +57,11 @@ o pregunte al administador de iTop si el servidor que ha quedado sin espacio en
|
||||
'Class:TriggerOnAttachmentDownload' => 'Disparador (al descargar el archivo adjunto del objeto)',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Disparador al descargar el archivo adjunto del objeto de [una clase secundaria de] la clase dada',
|
||||
'UI:Attachments:DropYourFileHint' => 'Arrastre los archivos en cualquier lugar de esta área',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
@@ -56,7 +56,14 @@ Soit demandez à votre administrateur système s\'il reste de la place disque di
|
||||
'Class:Attachment/Attribute:temp_id+' => '',
|
||||
'Class:Attachment/Attribute:user_id' => 'Utilisateur',
|
||||
'Class:Attachment/Attribute:user_id+' => '',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Déclencheur sur le téléchargement d\'une pièce jointe d\'un objet',
|
||||
'Class:TriggerOnAttachmentDownload+' => '',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Déclencheur sur le téléchargement d\'une pièce jointe d\'un objet',
|
||||
'Class:TriggerOnAttachmentDownload+' => '',
|
||||
'UI:Attachments:DropYourFileHint' => 'Déposez vos fichiers dans cet espace',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Déclencheur sur la création d\'une pièce jointe',
|
||||
'Class:TriggerOnAttachmentCreate+' => '',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Ajoute le fichier dans l\'email',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'Si coché, le fichier sera automatiquement attaché à l\'email quand l\'action email est lancée',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Déclencheur sur la suppression d\'une pièce jointe',
|
||||
'Class:TriggerOnAttachmentDelete+' => '',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Les Triggers sur les objets ne sont pas autorisés sur la classe Attachement. Veuillez utiliser les triggers spécifiques pour cette classe',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
@@ -54,7 +54,14 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [
|
||||
'Class:Attachment/Attribute:temp_id+' => '~~',
|
||||
'Class:Attachment/Attribute:user_id' => 'Felhasználó',
|
||||
'Class:Attachment/Attribute:user_id+' => '~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'UI:Attachments:DropYourFileHint' => 'Húzza a fájlokat erre a területre',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
@@ -59,4 +59,11 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (al download di un allegato dell\'oggetto)',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger al download di un allegato di un oggetto di [una sottoclasse di] la classe data',
|
||||
'UI:Attachments:DropYourFileHint' => 'Rilascia i file ovunque in quest\'area',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
@@ -56,7 +56,14 @@ or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_S
|
||||
'Class:Attachment/Attribute:temp_id+' => '~~',
|
||||
'Class:Attachment/Attribute:user_id' => 'User id~~',
|
||||
'Class:Attachment/Attribute:user_id+' => '~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -62,4 +62,11 @@ of vraag de iTop administrator om de opslagruimte van de iTop-server na te kijke
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (Bij het downloaden van een bijlage)',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger bij het downloaden van een bijlage van een object van de opgegeven klasse (of subklasse ervan)',
|
||||
'UI:Attachments:DropYourFileHint' => 'Sleep bestanden in dit gebied',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (Bij het toevoegen van een bijlage)',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger bij het toevoegen van een bijlage aan een object van de opgegeven klasse (of subklasse ervan)',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Bestand toevoegen in e-mail',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+'=> 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (Bij het verwijderen van een bijlage)',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger bij het verwijderen van een bijlage van een object van de opgegeven klasse (of subklasse ervan)',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
@@ -59,4 +59,11 @@ lub zapytaj administratora '.ITOP_APPLICATION_SHORT.', czy dysk serwera '.ITOP_A
|
||||
'Class:TriggerOnAttachmentDownload' => 'Wyzwalacz (po pobraniu załącznika obiektu)',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Wyzwalacz po pobraniu załącznika obiektu [klasy podrzędnej] danej klasy',
|
||||
'UI:Attachments:DropYourFileHint' => 'Upuść pliki w dowolnym miejscu w tym obszarze',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
@@ -56,7 +56,14 @@ ou entre em contato com o seu administrador do '.ITOP_APPLICATION_SHORT.' pois o
|
||||
'Class:Attachment/Attribute:temp_id+' => '',
|
||||
'Class:Attachment/Attribute:user_id' => 'Identificador do usuário',
|
||||
'Class:Attachment/Attribute:user_id+' => '',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'UI:Attachments:DropYourFileHint' => 'Solte arquivos em qualquer lugar nesta área',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @author Vladimir Kunin <v.b.kunin@gmail.com>
|
||||
@@ -57,7 +57,14 @@ or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_S
|
||||
'Class:Attachment/Attribute:temp_id+' => '',
|
||||
'Class:Attachment/Attribute:user_id' => 'Пользователь',
|
||||
'Class:Attachment/Attribute:user_id+' => '',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
@@ -59,4 +59,11 @@ or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_S
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
@@ -56,7 +56,14 @@ or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_S
|
||||
'Class:Attachment/Attribute:temp_id+' => '~~',
|
||||
'Class:Attachment/Attribute:user_id' => 'User id~~',
|
||||
'Class:Attachment/Attribute:user_id+' => '~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
@@ -4,57 +4,90 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Attachments:TabTitle_Count' => '附件 (%1$d)',
|
||||
'Attachments:EmptyTabTitle' => '附件',
|
||||
'Attachments:FieldsetTitle' => '附件',
|
||||
'Attachments:DeleteBtn' => '删除',
|
||||
'Attachments:History_File_Added' => '附件%1$s已添加.',
|
||||
'Attachments:History_File_Removed' => '附件%1$s已移除.',
|
||||
'Attachments:AddAttachment' => '添加附件: ',
|
||||
'Attachments:UploadNotAllowedOnThisSystem' => '本系统不支持文件上传.',
|
||||
'Attachment:Max_Go' => '(最大文件尺寸: %1$s GB)',
|
||||
'Attachment:Max_Ko' => '(最大文件尺寸: %1$s KB)',
|
||||
'Attachment:Max_Mo' => '(最大文件尺寸: %1$s MB)',
|
||||
'Attachments:AddAttachment' => '添加附件: ',
|
||||
'Attachments:DeleteBtn' => '删除',
|
||||
'Attachments:EmptyTabTitle' => '附件',
|
||||
'Attachments:Error:FileTooLarge' => '上传的文件过大. %1$s',
|
||||
'Attachments:Error:UploadedFileEmpty' => '收到的文件为空, 无法添加. 可能是因为您发送的是空文件,或者咨询'.ITOP_APPLICATION_SHORT.'管理员服务器磁盘是否已满.',
|
||||
'Attachments:FieldsetTitle' => '附件',
|
||||
'Attachments:File:Date' => '上传日期',
|
||||
'Attachments:File:DownloadsCount' => '下载',
|
||||
'Attachments:File:MimeType' => '类型',
|
||||
'Attachments:File:Name' => '文件名',
|
||||
'Attachments:File:Size' => '大小',
|
||||
'Attachments:File:Thumbnail' => '图标',
|
||||
'Attachments:File:Uploader' => '上传者',
|
||||
'Attachments:History_File_Added' => '附件%1$s已添加.',
|
||||
'Attachments:History_File_Removed' => '附件%1$s已移除.',
|
||||
'Attachments:NoAttachment' => '没有附件. ',
|
||||
'Attachments:PreviewNotAvailable' => '此附件类型不支持预览.',
|
||||
'Attachments:Error:FileTooLarge' => '上传的文件过大. %1$s',
|
||||
'Attachments:Error:UploadedFileEmpty' => '收到的文件为空, 无法添加.
|
||||
可能是因为您发送的是空文件,
|
||||
或者咨询 '.ITOP_APPLICATION_SHORT.' 管理员,检查 '.ITOP_APPLICATION_SHORT.' 服务器硬盘是否满了.',
|
||||
'Attachments:Render:Icons' => '显示为图标',
|
||||
'Attachments:Render:Table' => '显示为列表',
|
||||
'Attachments:TabTitle_Count' => '附件 (%1$d)',
|
||||
'Attachments:UploadNotAllowedOnThisSystem' => '本系统不支持文件上传.',
|
||||
'UI:Attachments:DropYourFileHint' => '将文件拖放到此区域的任意位置',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: Attachment
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Attachment' => '附件',
|
||||
'Class:Attachment+' => '',
|
||||
'Class:Attachment/Attribute:contact_id' => '联系人编号',
|
||||
'Class:Attachment/Attribute:contact_id+' => '~~',
|
||||
'Class:Attachment/Attribute:contents' => '内容',
|
||||
'Class:Attachment/Attribute:contents+' => '',
|
||||
'Class:Attachment/Attribute:creation_date' => '创建日期',
|
||||
'Class:Attachment/Attribute:creation_date+' => '~~',
|
||||
'Class:Attachment/Attribute:expire' => '过期',
|
||||
'Class:Attachment/Attribute:expire+' => '~~',
|
||||
'Class:Attachment/Attribute:expire+' => '',
|
||||
'Class:Attachment/Attribute:temp_id' => '临时编号',
|
||||
'Class:Attachment/Attribute:temp_id+' => '',
|
||||
'Class:Attachment/Attribute:item_class' => '项目类型',
|
||||
'Class:Attachment/Attribute:item_class+' => '~~',
|
||||
'Class:Attachment/Attribute:item_class+' => '',
|
||||
'Class:Attachment/Attribute:item_id' => '项目',
|
||||
'Class:Attachment/Attribute:item_id+' => '~~',
|
||||
'Class:Attachment/Attribute:item_id+' => '',
|
||||
'Class:Attachment/Attribute:item_org_id' => '项目组织',
|
||||
'Class:Attachment/Attribute:item_org_id+' => '',
|
||||
'Class:Attachment/Attribute:temp_id' => '临时编号',
|
||||
'Class:Attachment/Attribute:temp_id+' => '~~',
|
||||
'Class:Attachment/Attribute:contents' => '内容',
|
||||
'Class:Attachment/Attribute:contents+' => '',
|
||||
]);
|
||||
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Attachments:File:Thumbnail' => '图标',
|
||||
'Attachments:File:Name' => '文件名',
|
||||
'Attachments:File:Date' => '上传日期',
|
||||
'Attachments:File:Uploader' => '上传者',
|
||||
'Attachments:File:Size' => '大小',
|
||||
'Attachments:File:MimeType' => '类型',
|
||||
'Attachments:File:DownloadsCount' => '下载',
|
||||
]);
|
||||
//
|
||||
// Class: Attachment
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Attachment/Attribute:creation_date' => '创建日期',
|
||||
'Class:Attachment/Attribute:creation_date+' => '~~',
|
||||
'Class:Attachment/Attribute:user_id' => '用户编号',
|
||||
'Class:Attachment/Attribute:user_id+' => '~~',
|
||||
'Class:Attachment/Attribute:contact_id' => '联系人编号',
|
||||
'Class:Attachment/Attribute:contact_id+' => '~~',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: TriggerOnAttachmentDownload
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:TriggerOnAttachmentDownload' => '触发器 (于对象附件下载时)',
|
||||
'Class:TriggerOnAttachmentDownload+' => '触发器于指定类型 [子类型] 对象附件下载时',
|
||||
'UI:Attachments:DropYourFileHint' => '将文件拖放到此区域的任意位置',
|
||||
]);
|
||||
|
||||
@@ -349,9 +349,7 @@ class AttachmentPlugIn implements iApplicationUIExtension, iApplicationObjectExt
|
||||
{
|
||||
$oAttachment->DBDelete();
|
||||
// temporary attachment removed, don't even mention it in the history
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
$oAttachment->SetItem($oObject);
|
||||
$oAttachment->Set('temp_id', '');
|
||||
$oAttachment->DBUpdate();
|
||||
@@ -771,39 +769,6 @@ class CMDBChangeOpAttachmentRemoved extends CMDBChangeOp
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class TriggerOnAttachmentDownload
|
||||
*
|
||||
* @since 3.1.0
|
||||
*/
|
||||
class TriggerOnAttachmentDownload extends TriggerOnAttributeBlobDownload
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @throws \CoreException
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function Init()
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "grant_by_profile,core/cmdb,application",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"complementary_name_attcode" => ['finalclass', 'complement'],
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => ['description'],
|
||||
"db_table" => "priv_trigger_onattdownload",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
"display_template" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_InheritAttributes();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class AttachmentsHelper
|
||||
{
|
||||
/**
|
||||
|
||||
@@ -38,6 +38,9 @@ SetupWebPage::AddModule(
|
||||
'datamodel' => array(
|
||||
'vendor/autoload.php',
|
||||
'main.itop-attachments.php',
|
||||
'src/Trigger/TriggerOnAttachmentCreate.php',
|
||||
'src/Trigger/TriggerOnAttachmentDelete.php',
|
||||
'src/Trigger/TriggerOnAttachmentDownload.php',
|
||||
'renderers.itop-attachments.php',
|
||||
),
|
||||
'webservice' => array(
|
||||
|
||||
@@ -10,6 +10,7 @@ namespace Combodo\iTop\Attachments\Hook;
|
||||
use Combodo\iTop\Service\Events\EventData;
|
||||
use Combodo\iTop\Service\Events\EventService;
|
||||
use Combodo\iTop\Service\Events\iEventServiceSetup;
|
||||
use DBObject;
|
||||
use DBObjectSearch;
|
||||
use DBObjectSet;
|
||||
use Exception;
|
||||
@@ -18,6 +19,8 @@ use LogChannels;
|
||||
use MetaModel;
|
||||
use ormDocument;
|
||||
use TriggerOnAttachmentDownload;
|
||||
use TriggerOnAttachmentCreate;
|
||||
use TriggerOnAttachmentDelete;
|
||||
|
||||
/**
|
||||
* Class EventListener
|
||||
@@ -37,6 +40,14 @@ class EventListener implements iEventServiceSetup
|
||||
[$this, 'OnAttachmentDownloadActivateTriggers'],
|
||||
'Attachment'
|
||||
);
|
||||
EventService::RegisterListener(
|
||||
\EVENT_ADD_ATTACHMENT_TO_OBJECT,
|
||||
[$this, 'OnAttachmentAddedActivateTriggers']
|
||||
);
|
||||
EventService::RegisterListener(
|
||||
\EVENT_REMOVE_ATTACHMENT_FROM_OBJECT,
|
||||
[$this, 'OnAttachmentRemovedActivateTriggers']
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -59,7 +70,77 @@ class EventListener implements iEventServiceSetup
|
||||
/** @var \ormDocument $oDocument */
|
||||
$oDocument = $oEventData->Get('document');
|
||||
|
||||
$sTriggerClass = TriggerOnAttachmentDownload::class;
|
||||
$this->OnAttachmentActivateTriggers(
|
||||
$oHostObj,
|
||||
$oAttachment,
|
||||
$oDocument,
|
||||
TriggerOnAttachmentDownload::class
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback when an Attachment is added: Activate corresponding triggers
|
||||
*
|
||||
* @param \Combodo\iTop\Service\Events\EventData $oEventData
|
||||
*
|
||||
* @return void
|
||||
* @throws \CoreException
|
||||
*/
|
||||
public function OnAttachmentAddedActivateTriggers(EventData $oEventData): void
|
||||
{
|
||||
/** @var DBObject $oAttachment */
|
||||
$oAttachment = $oEventData->Get('attachment');
|
||||
/** @var DBObject $oHostObj */
|
||||
$oHostObj = $oEventData->Get('object');
|
||||
/** @var ormDocument $oDocument */
|
||||
$oDocument = $oAttachment->Get('contents');
|
||||
|
||||
$this->OnAttachmentActivateTriggers(
|
||||
$oHostObj,
|
||||
$oAttachment,
|
||||
$oDocument,
|
||||
\TriggerOnAttachmentCreate::class
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback when an Attachment is removed: Activate corresponding triggers
|
||||
*
|
||||
* @param \Combodo\iTop\Service\Events\EventData $oEventData
|
||||
*
|
||||
* @return void
|
||||
* @throws \CoreException
|
||||
*/
|
||||
public function OnAttachmentRemovedActivateTriggers(EventData $oEventData): void
|
||||
{
|
||||
/** @var DBObject $oAttachment */
|
||||
$oAttachment = $oEventData->Get('attachment');
|
||||
/** @var DBObject $oHostObj */
|
||||
$oHostObj = $oEventData->Get('object');
|
||||
/** @var ormDocument $oDocument */
|
||||
$oDocument = $oAttachment->Get('contents');
|
||||
|
||||
$this->OnAttachmentActivateTriggers(
|
||||
$oHostObj,
|
||||
$oAttachment,
|
||||
$oDocument,
|
||||
\TriggerOnAttachmentDelete::class
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback when an Attachment downloaded, added or removed: Activate corresponding triggers
|
||||
*
|
||||
* @param DBObject $oHostObj
|
||||
* @param DBObject $oAttachment
|
||||
* @param ormDocument $oDocument
|
||||
* @param string $sTriggerClass
|
||||
*
|
||||
* @return void
|
||||
* @throws \CoreException
|
||||
*/
|
||||
protected function OnAttachmentActivateTriggers(DBObject $oHostObj, DBObject $oAttachment, ormDocument $oDocument, string $sTriggerClass): void
|
||||
{
|
||||
$aTriggerContextArgs = [
|
||||
'this->object()' => $oHostObj,
|
||||
'attachment->object()' => $oAttachment,
|
||||
@@ -75,7 +156,11 @@ class EventListener implements iEventServiceSetup
|
||||
/** @var \Trigger $oTrigger */
|
||||
while ($oTrigger = $oTriggerSet->Fetch()) {
|
||||
try {
|
||||
$oTrigger->DoActivate($aTriggerContextArgs);
|
||||
$aContextArgs = $aTriggerContextArgs;
|
||||
if ($oTrigger->Get('file_in_email')) {
|
||||
$aContextArgs['attachments'] = [$oDocument];
|
||||
}
|
||||
$oTrigger->DoActivate($aContextArgs);
|
||||
} catch (Exception $oException) {
|
||||
IssueLog::Error('Exception occurred during trigger activation in '.EventListener::class.'::'.__METHOD__, LogChannels::NOTIFICATIONS, [
|
||||
'trigger_class' => get_class($oTrigger),
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2023 Combodo SARL
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Class TriggerOnAttachmentCreate
|
||||
*
|
||||
* @since 3.3.0
|
||||
*/
|
||||
class TriggerOnAttachmentCreate extends TriggerOnObject
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @throws \CoreException
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function Init()
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "grant_by_profile,core/cmdb,application",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"complementary_name_attcode" => ['finalclass', 'complement'],
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => ['description'],
|
||||
"db_table" => "priv_trigger_onattcreate",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
"display_template" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_InheritAttributes();
|
||||
MetaModel::Init_AddAttribute(new AttributeBoolean("file_in_email", array("sql"=>'file_in_email', "is_null_allowed"=>false, "default_value"=>'true', "allowed_values"=>null, "depends_on"=>array(), "always_load_in_tables"=>false)));
|
||||
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('description', 'context', 'filter', 'action_list', 'target_class', 'file_in_email')); // 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('description', 'target_class')); // Criteria of the std search form
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2023 Combodo SARL
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Class TriggerOnAttachmentCreate
|
||||
*
|
||||
* @since 3.3.0
|
||||
*/
|
||||
class TriggerOnAttachmentDelete extends TriggerOnObject
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @throws \CoreException
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function Init()
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "grant_by_profile,core/cmdb,application",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"complementary_name_attcode" => ['finalclass', 'complement'],
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => ['description'],
|
||||
"db_table" => "priv_trigger_onattdelete",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
"display_template" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_InheritAttributes();
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('description', 'context', 'filter', 'action_list', 'target_class')); // 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('description', 'target_class')); // Criteria of the std search form
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Class TriggerOnAttachmentDownload
|
||||
*
|
||||
* @since 3.1.0
|
||||
*/
|
||||
class TriggerOnAttachmentDownload extends TriggerOnAttributeBlobDownload
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @throws \CoreException
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function Init()
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "grant_by_profile,core/cmdb,application",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"complementary_name_attcode" => ['finalclass', 'complement'],
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => ['description'],
|
||||
"db_table" => "priv_trigger_onattdownload",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
"display_template" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_InheritAttributes();
|
||||
}
|
||||
}
|
||||
@@ -4,44 +4,58 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:BackupStatus' => '定时备份',
|
||||
'bkp-backup-running' => '备份正在进行, 请稍后...',
|
||||
'bkp-button-backup-now' => '立即备份!',
|
||||
'bkp-button-restore-now' => '还原!',
|
||||
'bkp-confirm-backup' => '请确认是否立即开始备份.',
|
||||
'bkp-confirm-restore' => '请确认要还原的备份文件是 %1$s.',
|
||||
'bkp-dir-not-writeable' => '%1$s没有写入权限',
|
||||
'bkp-free-disk-space' => '<b>%1$s可用空间</b>位于<code>%2$s</code>',
|
||||
'bkp-missing-dir' => '目标目录<code>%1$s</code>找不到',
|
||||
'bkp-mysqldump-issue' => 'mysqldump无法运行 (retcode=%1$d): 请确认它安装在正确的路径, 或者调整'.ITOP_APPLICATION_SHORT.'配置文件的参数mysql_bindir',
|
||||
'bkp-mysqldump-notfound' => 'mysqldump找不到: %1$s - 请确认它安装在正确的路径, 或者调整'.ITOP_APPLICATION_SHORT.'配置文件的参数mysql_bindir.',
|
||||
'bkp-mysqldump-ok' => '已找到mysqldump : %1$s',
|
||||
'bkp-name-sample' => '备份文件将以数据库名, 日期和时间进行命名. 例如: %1$s',
|
||||
'bkp-next-backup' => '下一次备份将发生在<b>%1$s</b> (%2$s) 的%3$s',
|
||||
'bkp-next-backup-unknown' => '下一次备份<b>尚未被计划</b>.',
|
||||
'bkp-next-to-delete' => '当下一次备份时将被删除 (参阅设置 "retention_count")',
|
||||
|
||||
'bkp-backup-running' => '备份正在进行, 请稍候...',
|
||||
'bkp-restore-running' => '还原正在进行, 请稍等...',
|
||||
'bkp-retention' => '最多<b>%1$d份备份文件</b>在目标目录.',
|
||||
'bkp-status-backups-auto' => '定时备份',
|
||||
'bkp-status-backups-manual' => '手动备份',
|
||||
'bkp-status-backups-none' => '尚未开始备份',
|
||||
'bkp-status-checks' => '设置与检查',
|
||||
|
||||
'Menu:BackupStatus' => '定时备份',
|
||||
'bkp-status-title' => '定时备份',
|
||||
'bkp-success-restore' => '还原成功.',
|
||||
'bkp-table-actions' => '操作',
|
||||
'bkp-table-actions+' => '',
|
||||
'bkp-status-checks' => '设置与检查',
|
||||
'bkp-mysqldump-ok' => '已找到 mysqldump : %1$s',
|
||||
'bkp-mysqldump-notfound' => 'mysqldump找不到: %1$s - 请确认它安装在正确的路径, 或者调整'.ITOP_APPLICATION_SHORT.'配置文件的参数mysql_bindir.',
|
||||
'bkp-mysqldump-issue' => 'mysqldump无法运行 (retcode=%1$d): 请确认它安装在正确的路径, 或者调整'.ITOP_APPLICATION_SHORT.'配置文件的参数mysql_bindir',
|
||||
'bkp-missing-dir' => '目标目录<code>%1$s</code>找不到',
|
||||
'bkp-free-disk-space' => '<b>%1$s可用空间</b>位于<code>%2$s</code>',
|
||||
'bkp-dir-not-writeable' => '%1$s没有写入权限',
|
||||
'bkp-wrong-format-spec' => '当前文件名格式错误 (%1$s). 默认格式应该是: %2$s',
|
||||
'bkp-name-sample' => '备份文件将以数据库名, 日期和时间进行命名. 例如: %1$s',
|
||||
'bkp-week-days' => '在每个<b>%1$s的%2$s</b>进行备份',
|
||||
'bkp-retention' => '最多<b>%1$d份备份文件</b>在目标目录.',
|
||||
'bkp-next-to-delete' => '当下一次备份时将被删除 (参阅设置 "retention_count")',
|
||||
'bkp-table-file' => '文件',
|
||||
'bkp-table-file+' => '只有扩展名是.zip的文件才被认为是备份文件',
|
||||
'bkp-table-size' => '大小',
|
||||
'bkp-table-size+' => '',
|
||||
'bkp-table-actions' => '操作',
|
||||
'bkp-table-actions+' => '',
|
||||
'bkp-status-backups-auto' => '定时备份',
|
||||
'bkp-status-backups-manual' => '手动备份',
|
||||
'bkp-status-backups-none' => '尚未开始备份',
|
||||
'bkp-next-backup' => '下一次备份将发生在<b>%1$s</b> (%2$s) 的%3$s',
|
||||
'bkp-next-backup-unknown' => '下一次备份<b>尚未被计划</b>.',
|
||||
'bkp-button-backup-now' => '立即备份!',
|
||||
'bkp-button-restore-now' => '还原!',
|
||||
'bkp-confirm-backup' => '请确认是否立即开始备份.',
|
||||
'bkp-confirm-restore' => '请确认要还原的备份文件是 %1$s.',
|
||||
'bkp-wait-backup' => '请等待备份完成...',
|
||||
'bkp-wait-restore' => '请等待还原完成...',
|
||||
'bkp-week-days' => '在每个<b>%1$s的%2$s</b>进行备份',
|
||||
'bkp-wrong-format-spec' => '当前文件名格式错误 (%1$s). 默认格式应该是: %2$s',
|
||||
'bkp-success-restore' => '还原成功.',
|
||||
]);
|
||||
|
||||
@@ -1,44 +1,86 @@
|
||||
<?php
|
||||
// Copyright (C) 2010-2024 Combodo SAS
|
||||
//
|
||||
// This file is part of iTop.
|
||||
//
|
||||
// iTop is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// iTop is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @author Benjamin Planque <benjamin.planque@combodo.com>
|
||||
*
|
||||
*/
|
||||
*/
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Note: The classes have been grouped by categories: bizmodel
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Classes in 'bizmodel'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
//
|
||||
// Class: lnkFunctionalCIToProviderContract
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkFunctionalCIToProviderContract' => '关联功能配置项/供应商合同',
|
||||
'Class:lnkFunctionalCIToProviderContract+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Name' => '%1$s / %2$s',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => '供应商合同',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name' => '供应商合同名称',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id' => '配置项',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name' => '配置项名称',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: lnkFunctionalCIToService
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkFunctionalCIToService' => '关联 功能配置项/服务',
|
||||
'Class:lnkFunctionalCIToService+' => '',
|
||||
'Class:lnkFunctionalCIToService/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_id' => '服务',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_id+' => '',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_name' => '服务名称',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_name+' => '',
|
||||
'Class:lnkFunctionalCIToService/Attribute:functionalci_id' => '配置项',
|
||||
'Class:lnkFunctionalCIToService/Attribute:functionalci_id+' => '',
|
||||
'Class:lnkFunctionalCIToService/Attribute:functionalci_name' => '配置项名称',
|
||||
'Class:lnkFunctionalCIToService/Attribute:functionalci_name+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: FunctionalCI
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:FunctionalCI/Attribute:providercontracts_list' => '供应商合同',
|
||||
'Class:FunctionalCI/Attribute:providercontracts_list+' => '此配置项的所有供应商合同',
|
||||
'Class:FunctionalCI/Attribute:services_list' => '服务',
|
||||
'Class:FunctionalCI/Attribute:services_list+' => '此配置项影响的所有服务',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: Document
|
||||
//
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Document/Attribute:contracts_list' => '合同',
|
||||
'Class:Document/Attribute:contracts_list+' => '此文档关联的所有合同',
|
||||
'Class:Document/Attribute:services_list' => '服务',
|
||||
'Class:Document/Attribute:services_list+' => '此文档关联的所有服务',
|
||||
'Class:FunctionalCI/Attribute:providercontracts_list' => '供应商合同',
|
||||
'Class:FunctionalCI/Attribute:providercontracts_list+' => '此配置项的所有供应商合同',
|
||||
'Class:FunctionalCI/Attribute:services_list' => '服务',
|
||||
'Class:FunctionalCI/Attribute:services_list+' => '此配置项影响的所有服务',
|
||||
'Class:lnkFunctionalCIToProviderContract' => '关联功能配置项/供应商合同',
|
||||
'Class:lnkFunctionalCIToProviderContract+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id' => '配置项',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name' => '配置项名称',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => '供应商合同',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name' => '供应商合同名称',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkFunctionalCIToService' => '关联功能配置项/服务',
|
||||
'Class:lnkFunctionalCIToService+' => '',
|
||||
'Class:lnkFunctionalCIToService/Attribute:functionalci_id' => '配置项',
|
||||
'Class:lnkFunctionalCIToService/Attribute:functionalci_id+' => '',
|
||||
'Class:lnkFunctionalCIToService/Attribute:functionalci_name' => '配置项名称',
|
||||
'Class:lnkFunctionalCIToService/Attribute:functionalci_name+' => '',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_id' => '服务',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_id+' => '',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_name' => '服务名称',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_name+' => '',
|
||||
'Class:lnkFunctionalCIToService/Name' => '%1$s / %2$s~~',
|
||||
]);
|
||||
|
||||
@@ -1,20 +1,48 @@
|
||||
<?php
|
||||
// Copyright (C) 2010-2024 Combodo SAS
|
||||
//
|
||||
// This file is part of iTop.
|
||||
//
|
||||
// iTop is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// iTop is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @author Benjamin Planque <benjamin.planque@combodo.com>
|
||||
*
|
||||
*/
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Note: The classes have been grouped by categories: bizmodel
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Classes in 'bizmodel'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
//
|
||||
// Class: lnkFunctionalCIToTicket
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:FunctionalCI/Attribute:tickets_list' => '工单',
|
||||
'Class:FunctionalCI/Attribute:tickets_list+' => '此配置项包含的所有工单',
|
||||
'Class:lnkFunctionalCIToTicket' => '关联功能配置项/工单',
|
||||
'Class:lnkFunctionalCIToTicket' => '关联 功能配置项/工单',
|
||||
'Class:lnkFunctionalCIToTicket+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Name' => '%1$s / %2$s',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id' => '工单',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref' => '工单编号',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_title' => '工单标题',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_title+' => '~~',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_id' => '配置项',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_id+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_name' => '配置项名称',
|
||||
@@ -22,14 +50,15 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:impact' => '影响 (文本)',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:impact+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:impact_code' => '影响',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:computed' => '自动添加',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:manual' => '手动添加',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:computed' => '自动添加',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:not_impacted' => '不通知',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id' => '工单',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref' => '工单编号',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_title' => '工单标题',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_title+' => '~~',
|
||||
'Class:lnkFunctionalCIToTicket/Name' => '%1$s / %2$s~~',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: FunctionalCI
|
||||
//
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:FunctionalCI/Attribute:tickets_list' => '工单',
|
||||
'Class:FunctionalCI/Attribute:tickets_list+' => '此配置项包含的所有工单',
|
||||
]);
|
||||
|
||||
@@ -4,233 +4,291 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ChangeManagement' => '变更管理',
|
||||
'Menu:Change:Overview' => '概况',
|
||||
'Menu:Change:Overview+' => '',
|
||||
'Menu:NewChange' => '新建变更',
|
||||
'Menu:NewChange+' => '新建变更',
|
||||
'Menu:SearchChanges' => '搜索变更',
|
||||
'Menu:SearchChanges+' => '搜索变更',
|
||||
'Menu:Change:Shortcuts' => '快捷方式',
|
||||
'Menu:Change:Shortcuts+' => '',
|
||||
'Menu:WaitingAcceptance' => '等待审核的变更',
|
||||
'Menu:WaitingAcceptance+' => '',
|
||||
'Menu:WaitingApproval' => '等待批准的变更',
|
||||
'Menu:WaitingApproval+' => '',
|
||||
'Menu:Changes' => '所有打开的变更',
|
||||
'Menu:Changes+' => '所有打开的变更',
|
||||
'Menu:MyChanges' => '分配给我的变更',
|
||||
'Menu:MyChanges+' => '分配给我的变更 (作为办理人)',
|
||||
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => '最近一周的变更 (按类型)',
|
||||
'UI-ChangeManagementOverview-Last-7-days' => '最近一周的变更 (按数量)',
|
||||
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => '最近一周的变更 (按范围)',
|
||||
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => '最近一周的变更 (按状态)',
|
||||
'Tickets:Related:OpenChanges' => '打开的变更',
|
||||
'Tickets:Related:RecentChanges' => '最近的变更 (72小时)',
|
||||
]);
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>
|
||||
// Class:<class_name>/Attribute:<attribute_code>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
|
||||
//
|
||||
// Class: Change
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ApprovedChange' => '已批准的变更',
|
||||
'Class:ApprovedChange+' => '',
|
||||
'Class:ApprovedChange/Attribute:approval_comment' => '批准说明',
|
||||
'Class:ApprovedChange/Attribute:approval_comment+' => '',
|
||||
'Class:ApprovedChange/Attribute:approval_date' => '批准日期',
|
||||
'Class:ApprovedChange/Attribute:approval_date+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_approve' => '批准',
|
||||
'Class:ApprovedChange/Stimulus:ev_approve+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_assign' => '分配',
|
||||
'Class:ApprovedChange/Stimulus:ev_assign+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_finish' => '完成',
|
||||
'Class:ApprovedChange/Stimulus:ev_finish+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_implement' => '实施',
|
||||
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_monitor' => '验收',
|
||||
'Class:ApprovedChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:ApprovedChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_plan' => '计划',
|
||||
'Class:ApprovedChange/Stimulus:ev_plan+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_reject' => '驳回',
|
||||
'Class:ApprovedChange/Stimulus:ev_reject+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:ApprovedChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:ApprovedChange/Stimulus:ev_replan+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_validate' => '同意',
|
||||
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
|
||||
'Class:Change' => '变更',
|
||||
'Class:Change+' => '',
|
||||
'Class:Change/Attribute:child_changes_list' => '子变更',
|
||||
'Class:Change/Attribute:child_changes_list+' => '此变更相关的字变更',
|
||||
'Class:Change/Attribute:creation_date' => '创建时间',
|
||||
'Class:Change/Attribute:creation_date+' => '',
|
||||
'Class:Change/Attribute:fallback' => '回滚计划',
|
||||
'Class:Change/Attribute:fallback+' => '',
|
||||
'Class:Change/Attribute:impact' => '影响',
|
||||
'Class:Change/Attribute:impact+' => '',
|
||||
'Class:Change/Attribute:manager_email' => '邮箱',
|
||||
'Class:Change/Attribute:manager_email+' => '',
|
||||
'Class:Change/Attribute:manager_group_id' => '管理团队',
|
||||
'Class:Change/Attribute:manager_group_id+' => '',
|
||||
'Class:Change/Attribute:manager_group_name' => '管理团队名称',
|
||||
'Class:Change/Attribute:manager_group_name+' => '',
|
||||
'Class:Change/Attribute:manager_id' => '经理',
|
||||
'Class:Change/Attribute:manager_id+' => '',
|
||||
'Class:Change/Attribute:outage' => '停机',
|
||||
'Class:Change/Attribute:outage+' => '',
|
||||
'Class:Change/Attribute:outage/Value:no' => '否',
|
||||
'Class:Change/Attribute:outage/Value:no+' => '',
|
||||
'Class:Change/Attribute:outage/Value:yes' => '是',
|
||||
'Class:Change/Attribute:outage/Value:yes+' => '',
|
||||
'Class:Change/Attribute:parent_id' => '父级变更',
|
||||
'Class:Change/Attribute:parent_id+' => '',
|
||||
'Class:Change/Attribute:parent_id_finalclass_recall' => '变更类型',
|
||||
'Class:Change/Attribute:parent_id_finalclass_recall+' => '',
|
||||
'Class:Change/Attribute:parent_id_friendlyname' => '父级变更昵称',
|
||||
'Class:Change/Attribute:parent_id_friendlyname+' => '',
|
||||
'Class:Change/Attribute:parent_name' => '变更编号',
|
||||
'Class:Change/Attribute:parent_name+' => '',
|
||||
'Class:Change/Attribute:reason' => '驳回原因',
|
||||
'Class:Change/Attribute:reason+' => '',
|
||||
'Class:Change/Attribute:related_incident_list' => '相关事件',
|
||||
'Class:Change/Attribute:related_incident_list+' => '此变更相关的所有事件',
|
||||
'Class:Change/Attribute:related_problems_list' => '相关问题',
|
||||
'Class:Change/Attribute:related_problems_list+' => '此变更相关的所有问题',
|
||||
'Class:Change/Attribute:related_request_list' => '相关需求',
|
||||
'Class:Change/Attribute:related_request_list+' => '此变更相关的所有用户需求',
|
||||
'Class:Change/Attribute:requestor_email' => '邮箱',
|
||||
'Class:Change/Attribute:requestor_email+' => '',
|
||||
'Class:Change/Attribute:requestor_id' => '发起人',
|
||||
'Class:Change/Attribute:requestor_id+' => '',
|
||||
'Class:Change/Attribute:status' => '状态',
|
||||
'Class:Change/Attribute:status+' => '',
|
||||
'Class:Change/Attribute:status/Value:approved' => '已批准',
|
||||
'Class:Change/Attribute:status/Value:approved+' => '',
|
||||
'Class:Change/Attribute:status/Value:new' => '新建',
|
||||
'Class:Change/Attribute:status/Value:new+' => '',
|
||||
'Class:Change/Attribute:status/Value:validated' => '已确认',
|
||||
'Class:Change/Attribute:status/Value:validated+' => '',
|
||||
'Class:Change/Attribute:status/Value:rejected' => '已驳回',
|
||||
'Class:Change/Attribute:status/Value:rejected+' => '',
|
||||
'Class:Change/Attribute:status/Value:assigned' => '已分配',
|
||||
'Class:Change/Attribute:status/Value:assigned+' => '',
|
||||
'Class:Change/Attribute:status/Value:closed' => '已关闭',
|
||||
'Class:Change/Attribute:status/Value:closed+' => '',
|
||||
'Class:Change/Attribute:status/Value:plannedscheduled' => '已计划和安排',
|
||||
'Class:Change/Attribute:status/Value:plannedscheduled+' => '',
|
||||
'Class:Change/Attribute:status/Value:approved' => '已批准',
|
||||
'Class:Change/Attribute:status/Value:approved+' => '',
|
||||
'Class:Change/Attribute:status/Value:notapproved' => '未批准',
|
||||
'Class:Change/Attribute:status/Value:notapproved+' => '',
|
||||
'Class:Change/Attribute:status/Value:implemented' => '已实施',
|
||||
'Class:Change/Attribute:status/Value:implemented+' => '',
|
||||
'Class:Change/Attribute:status/Value:monitored' => '已验收',
|
||||
'Class:Change/Attribute:status/Value:monitored+' => '',
|
||||
'Class:Change/Attribute:status/Value:new' => '新建',
|
||||
'Class:Change/Attribute:status/Value:new+' => '',
|
||||
'Class:Change/Attribute:status/Value:notapproved' => '未批准',
|
||||
'Class:Change/Attribute:status/Value:notapproved+' => '',
|
||||
'Class:Change/Attribute:status/Value:plannedscheduled' => '已计划和安排',
|
||||
'Class:Change/Attribute:status/Value:plannedscheduled+' => '',
|
||||
'Class:Change/Attribute:status/Value:rejected' => '已驳回',
|
||||
'Class:Change/Attribute:status/Value:rejected+' => '',
|
||||
'Class:Change/Attribute:status/Value:validated' => '已确认',
|
||||
'Class:Change/Attribute:status/Value:validated+' => '',
|
||||
'Class:Change/Attribute:supervisor_email' => '邮箱',
|
||||
'Class:Change/Attribute:supervisor_email+' => '',
|
||||
'Class:Change/Attribute:status/Value:closed' => '已关闭',
|
||||
'Class:Change/Attribute:status/Value:closed+' => '',
|
||||
'Class:Change/Attribute:reason' => '驳回原因',
|
||||
'Class:Change/Attribute:reason+' => '',
|
||||
'Class:Change/Attribute:requestor_id' => '发起人',
|
||||
'Class:Change/Attribute:requestor_id+' => '',
|
||||
'Class:Change/Attribute:requestor_email' => '邮箱',
|
||||
'Class:Change/Attribute:requestor_email+' => '',
|
||||
'Class:Change/Attribute:creation_date' => '创建时间',
|
||||
'Class:Change/Attribute:creation_date+' => '',
|
||||
'Class:Change/Attribute:impact' => '影响',
|
||||
'Class:Change/Attribute:impact+' => '',
|
||||
'Class:Change/Attribute:supervisor_group_id' => '监督团队',
|
||||
'Class:Change/Attribute:supervisor_group_id+' => '',
|
||||
'Class:Change/Attribute:supervisor_group_name' => '监督团队名称',
|
||||
'Class:Change/Attribute:supervisor_group_name+' => '',
|
||||
'Class:Change/Attribute:supervisor_id' => '监督人',
|
||||
'Class:Change/Attribute:supervisor_id+' => '',
|
||||
'Class:Change/Stimulus:ev_approve' => '批准',
|
||||
'Class:Change/Stimulus:ev_approve+' => '',
|
||||
'Class:Change/Attribute:supervisor_email' => '邮箱',
|
||||
'Class:Change/Attribute:supervisor_email+' => '',
|
||||
'Class:Change/Attribute:manager_group_id' => '管理团队',
|
||||
'Class:Change/Attribute:manager_group_id+' => '',
|
||||
'Class:Change/Attribute:manager_group_name' => '管理团队名称',
|
||||
'Class:Change/Attribute:manager_group_name+' => '',
|
||||
'Class:Change/Attribute:manager_id' => '经理',
|
||||
'Class:Change/Attribute:manager_id+' => '',
|
||||
'Class:Change/Attribute:manager_email' => '邮箱',
|
||||
'Class:Change/Attribute:manager_email+' => '',
|
||||
'Class:Change/Attribute:outage' => '停机',
|
||||
'Class:Change/Attribute:outage+' => '',
|
||||
'Class:Change/Attribute:outage/Value:no' => '否',
|
||||
'Class:Change/Attribute:outage/Value:no+' => '',
|
||||
'Class:Change/Attribute:outage/Value:yes' => '是',
|
||||
'Class:Change/Attribute:outage/Value:yes+' => '',
|
||||
'Class:Change/Attribute:fallback' => '回滚计划',
|
||||
'Class:Change/Attribute:fallback+' => '',
|
||||
'Class:Change/Attribute:parent_id' => '父级变更',
|
||||
'Class:Change/Attribute:parent_id+' => '',
|
||||
'Class:Change/Attribute:parent_name' => '变更编号',
|
||||
'Class:Change/Attribute:parent_name+' => '',
|
||||
'Class:Change/Attribute:related_request_list' => '相关需求',
|
||||
'Class:Change/Attribute:related_request_list+' => '此变更相关的所有用户需求',
|
||||
'Class:Change/Attribute:related_problems_list' => '相关问题',
|
||||
'Class:Change/Attribute:related_problems_list+' => '此变更相关的所有问题',
|
||||
'Class:Change/Attribute:related_incident_list' => '相关事件',
|
||||
'Class:Change/Attribute:related_incident_list+' => '此变更相关的所有事件',
|
||||
'Class:Change/Attribute:child_changes_list' => '子变更',
|
||||
'Class:Change/Attribute:child_changes_list+' => '此变更相关的字变更',
|
||||
'Class:Change/Attribute:parent_id_friendlyname' => '父级变更昵称',
|
||||
'Class:Change/Attribute:parent_id_friendlyname+' => '',
|
||||
'Class:Change/Attribute:parent_id_finalclass_recall' => '变更类型',
|
||||
'Class:Change/Attribute:parent_id_finalclass_recall+' => '',
|
||||
'Class:Change/Stimulus:ev_validate' => '同意',
|
||||
'Class:Change/Stimulus:ev_validate+' => '',
|
||||
'Class:Change/Stimulus:ev_reject' => '驳回',
|
||||
'Class:Change/Stimulus:ev_reject+' => '',
|
||||
'Class:Change/Stimulus:ev_assign' => '分配',
|
||||
'Class:Change/Stimulus:ev_assign+' => '',
|
||||
'Class:Change/Stimulus:ev_finish' => '完成',
|
||||
'Class:Change/Stimulus:ev_finish+' => '',
|
||||
'Class:Change/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:Change/Stimulus:ev_reopen+' => '',
|
||||
'Class:Change/Stimulus:ev_plan' => '计划',
|
||||
'Class:Change/Stimulus:ev_plan+' => '',
|
||||
'Class:Change/Stimulus:ev_approve' => '批准',
|
||||
'Class:Change/Stimulus:ev_approve+' => '',
|
||||
'Class:Change/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:Change/Stimulus:ev_replan+' => '',
|
||||
'Class:Change/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:Change/Stimulus:ev_notapprove+' => '',
|
||||
'Class:Change/Stimulus:ev_implement' => '实施',
|
||||
'Class:Change/Stimulus:ev_implement+' => '',
|
||||
'Class:Change/Stimulus:ev_monitor' => '验收',
|
||||
'Class:Change/Stimulus:ev_monitor+' => '',
|
||||
'Class:Change/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:Change/Stimulus:ev_notapprove+' => '',
|
||||
'Class:Change/Stimulus:ev_plan' => '计划',
|
||||
'Class:Change/Stimulus:ev_plan+' => '',
|
||||
'Class:Change/Stimulus:ev_reject' => '驳回',
|
||||
'Class:Change/Stimulus:ev_reject+' => '',
|
||||
'Class:Change/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:Change/Stimulus:ev_reopen+' => '',
|
||||
'Class:Change/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:Change/Stimulus:ev_replan+' => '',
|
||||
'Class:Change/Stimulus:ev_validate' => '同意',
|
||||
'Class:Change/Stimulus:ev_validate+' => '',
|
||||
'Class:EmergencyChange' => '紧急变更',
|
||||
'Class:EmergencyChange+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_approve' => '批准',
|
||||
'Class:EmergencyChange/Stimulus:ev_approve+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_assign' => '分配',
|
||||
'Class:EmergencyChange/Stimulus:ev_assign+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_finish' => '完成',
|
||||
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_implement' => '实施',
|
||||
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_monitor' => '验收',
|
||||
'Class:EmergencyChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:EmergencyChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_plan' => '计划',
|
||||
'Class:EmergencyChange/Stimulus:ev_plan+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_reject' => '驳回',
|
||||
'Class:EmergencyChange/Stimulus:ev_reject+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:EmergencyChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:EmergencyChange/Stimulus:ev_replan+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_validate' => '同意',
|
||||
'Class:EmergencyChange/Stimulus:ev_validate+' => '',
|
||||
'Class:NormalChange' => '正常变更',
|
||||
'Class:NormalChange+' => '',
|
||||
'Class:NormalChange/Attribute:acceptance_comment' => '审核说明',
|
||||
'Class:NormalChange/Attribute:acceptance_comment+' => '',
|
||||
'Class:NormalChange/Attribute:acceptance_date' => '审核日期',
|
||||
'Class:NormalChange/Attribute:acceptance_date+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_approve' => '批准',
|
||||
'Class:NormalChange/Stimulus:ev_approve+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_assign' => '分配',
|
||||
'Class:NormalChange/Stimulus:ev_assign+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_finish' => '完成',
|
||||
'Class:NormalChange/Stimulus:ev_finish+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_implement' => '实施',
|
||||
'Class:NormalChange/Stimulus:ev_implement+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_monitor' => '验收',
|
||||
'Class:NormalChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:NormalChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_plan' => '计划',
|
||||
'Class:NormalChange/Stimulus:ev_plan+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_reject' => '驳回',
|
||||
'Class:NormalChange/Stimulus:ev_reject+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:NormalChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:NormalChange/Stimulus:ev_replan+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_validate' => '同意',
|
||||
'Class:NormalChange/Stimulus:ev_validate+' => '',
|
||||
'Class:Change/Stimulus:ev_finish' => '完成',
|
||||
'Class:Change/Stimulus:ev_finish+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: RoutineChange
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:RoutineChange' => '例行变更',
|
||||
'Class:RoutineChange+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_approve' => '批准',
|
||||
'Class:RoutineChange/Stimulus:ev_approve+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_validate' => '同意',
|
||||
'Class:RoutineChange/Stimulus:ev_validate+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_reject' => '驳回',
|
||||
'Class:RoutineChange/Stimulus:ev_reject+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_assign' => '分配',
|
||||
'Class:RoutineChange/Stimulus:ev_assign+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_finish' => '完成',
|
||||
'Class:RoutineChange/Stimulus:ev_finish+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:RoutineChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_plan' => '计划',
|
||||
'Class:RoutineChange/Stimulus:ev_plan+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_approve' => '批准',
|
||||
'Class:RoutineChange/Stimulus:ev_approve+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:RoutineChange/Stimulus:ev_replan+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:RoutineChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_implement' => '实施',
|
||||
'Class:RoutineChange/Stimulus:ev_implement+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_monitor' => '验收',
|
||||
'Class:RoutineChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:RoutineChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_plan' => '计划',
|
||||
'Class:RoutineChange/Stimulus:ev_plan+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_reject' => '驳回',
|
||||
'Class:RoutineChange/Stimulus:ev_reject+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:RoutineChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:RoutineChange/Stimulus:ev_replan+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_validate' => '同意',
|
||||
'Class:RoutineChange/Stimulus:ev_validate+' => '',
|
||||
'Menu:Change:Overview' => '概况',
|
||||
'Menu:Change:Overview+' => '',
|
||||
'Menu:Change:Shortcuts' => '快捷方式',
|
||||
'Menu:Change:Shortcuts+' => '',
|
||||
'Menu:ChangeManagement' => '变更管理',
|
||||
'Menu:Changes' => '所有打开的变更',
|
||||
'Menu:Changes+' => '所有打开的变更',
|
||||
'Menu:MyChanges' => '分配给我的变更',
|
||||
'Menu:MyChanges+' => '分配给我的变更 (作为办理人)',
|
||||
'Menu:NewChange' => '新建变更',
|
||||
'Menu:NewChange+' => '新建变更',
|
||||
'Menu:SearchChanges' => '搜索变更',
|
||||
'Menu:SearchChanges+' => '搜索变更',
|
||||
'Menu:WaitingAcceptance' => '等待审核的变更',
|
||||
'Menu:WaitingAcceptance+' => '',
|
||||
'Menu:WaitingApproval' => '等待批准的变更',
|
||||
'Menu:WaitingApproval+' => '',
|
||||
'Tickets:Related:OpenChanges' => '打开的变更',
|
||||
'Tickets:Related:RecentChanges' => '最近的变更 (72小时)',
|
||||
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => '最近一周的变更 (按类型)',
|
||||
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => '最近一周的变更 (按范围)',
|
||||
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => '最近一周的变更 (按状态)',
|
||||
'UI-ChangeManagementOverview-Last-7-days' => '最近一周的变更 (按数量)',
|
||||
'Class:RoutineChange/Stimulus:ev_finish' => '完成',
|
||||
'Class:RoutineChange/Stimulus:ev_finish+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: ApprovedChange
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ApprovedChange' => '已批准的变更',
|
||||
'Class:ApprovedChange+' => '',
|
||||
'Class:ApprovedChange/Attribute:approval_date' => '批准日期',
|
||||
'Class:ApprovedChange/Attribute:approval_date+' => '',
|
||||
'Class:ApprovedChange/Attribute:approval_comment' => '批准说明',
|
||||
'Class:ApprovedChange/Attribute:approval_comment+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_validate' => '同意',
|
||||
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_reject' => '驳回',
|
||||
'Class:ApprovedChange/Stimulus:ev_reject+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_assign' => '分配',
|
||||
'Class:ApprovedChange/Stimulus:ev_assign+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:ApprovedChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_plan' => '计划',
|
||||
'Class:ApprovedChange/Stimulus:ev_plan+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_approve' => '批准',
|
||||
'Class:ApprovedChange/Stimulus:ev_approve+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:ApprovedChange/Stimulus:ev_replan+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:ApprovedChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_implement' => '实施',
|
||||
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_monitor' => '验收',
|
||||
'Class:ApprovedChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_finish' => '完成',
|
||||
'Class:ApprovedChange/Stimulus:ev_finish+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: NormalChange
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:NormalChange' => '正常变更',
|
||||
'Class:NormalChange+' => '',
|
||||
'Class:NormalChange/Attribute:acceptance_date' => '审核日期',
|
||||
'Class:NormalChange/Attribute:acceptance_date+' => '',
|
||||
'Class:NormalChange/Attribute:acceptance_comment' => '审核说明',
|
||||
'Class:NormalChange/Attribute:acceptance_comment+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_validate' => '同意',
|
||||
'Class:NormalChange/Stimulus:ev_validate+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_reject' => '驳回',
|
||||
'Class:NormalChange/Stimulus:ev_reject+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_assign' => '分配',
|
||||
'Class:NormalChange/Stimulus:ev_assign+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:NormalChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_plan' => '计划',
|
||||
'Class:NormalChange/Stimulus:ev_plan+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_approve' => '批准',
|
||||
'Class:NormalChange/Stimulus:ev_approve+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:NormalChange/Stimulus:ev_replan+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:NormalChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_implement' => '实施',
|
||||
'Class:NormalChange/Stimulus:ev_implement+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_monitor' => '验收',
|
||||
'Class:NormalChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_finish' => '完成',
|
||||
'Class:NormalChange/Stimulus:ev_finish+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: EmergencyChange
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:EmergencyChange' => '紧急变更',
|
||||
'Class:EmergencyChange+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_validate' => '同意',
|
||||
'Class:EmergencyChange/Stimulus:ev_validate+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_reject' => '驳回',
|
||||
'Class:EmergencyChange/Stimulus:ev_reject+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_assign' => '分配',
|
||||
'Class:EmergencyChange/Stimulus:ev_assign+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:EmergencyChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_plan' => '计划',
|
||||
'Class:EmergencyChange/Stimulus:ev_plan+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_approve' => '批准',
|
||||
'Class:EmergencyChange/Stimulus:ev_approve+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_replan' => '重新计划',
|
||||
'Class:EmergencyChange/Stimulus:ev_replan+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_notapprove' => '不批准',
|
||||
'Class:EmergencyChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_implement' => '实施',
|
||||
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_monitor' => '验收',
|
||||
'Class:EmergencyChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_finish' => '完成',
|
||||
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
|
||||
]);
|
||||
|
||||
@@ -4,16 +4,81 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ChangeManagement' => '变更管理',
|
||||
'Menu:Change:Overview' => '概况',
|
||||
'Menu:Change:Overview+' => '',
|
||||
'Menu:NewChange' => '新建变更',
|
||||
'Menu:NewChange+' => '新建变更',
|
||||
'Menu:SearchChanges' => '搜索变更',
|
||||
'Menu:SearchChanges+' => '搜索变更',
|
||||
'Menu:Change:Shortcuts' => '快捷方式',
|
||||
'Menu:Change:Shortcuts+' => '',
|
||||
'Menu:WaitingAcceptance' => '等待审核的变更',
|
||||
'Menu:WaitingAcceptance+' => '',
|
||||
'Menu:WaitingApproval' => '等待批准的变更',
|
||||
'Menu:WaitingApproval+' => '',
|
||||
'Menu:Changes' => '所有打开的变更',
|
||||
'Menu:Changes+' => '所有打开的变更',
|
||||
'Menu:MyChanges' => '分配给我的变更',
|
||||
'Menu:MyChanges+' => '分配给我的变更 (作为办理人)',
|
||||
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => '最近一周的变更 (按类型)',
|
||||
'UI-ChangeManagementOverview-Last-7-days' => '最近一周的变更 (按数量)',
|
||||
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => '最近一周的变更 (按范围)',
|
||||
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => '最近一周的变更 (按状态)',
|
||||
'Tickets:Related:OpenChanges' => '打开的变更',
|
||||
'Tickets:Related:RecentChanges' => '最近的变更 (72小时)',
|
||||
]);
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>
|
||||
// Class:<class_name>/Attribute:<attribute_code>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
|
||||
//
|
||||
// Class: Change
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Change' => '变更',
|
||||
'Class:Change+' => '',
|
||||
'Class:Change/Attribute:approval_date' => '审批日期',
|
||||
'Class:Change/Attribute:approval_date+' => '',
|
||||
'Class:Change/Attribute:status' => '状态',
|
||||
'Class:Change/Attribute:status+' => '',
|
||||
'Class:Change/Attribute:status/Value:new' => '新建',
|
||||
'Class:Change/Attribute:status/Value:new+' => '',
|
||||
'Class:Change/Attribute:status/Value:assigned' => '已分配',
|
||||
'Class:Change/Attribute:status/Value:assigned+' => '',
|
||||
'Class:Change/Attribute:status/Value:planned' => '已计划',
|
||||
'Class:Change/Attribute:status/Value:planned+' => '',
|
||||
'Class:Change/Attribute:status/Value:rejected' => '已驳回',
|
||||
'Class:Change/Attribute:status/Value:rejected+' => '',
|
||||
'Class:Change/Attribute:status/Value:approved' => '已批准',
|
||||
'Class:Change/Attribute:status/Value:approved+' => '',
|
||||
'Class:Change/Attribute:status/Value:closed' => '已关闭',
|
||||
'Class:Change/Attribute:status/Value:closed+' => '',
|
||||
'Class:Change/Attribute:category' => '类型',
|
||||
'Class:Change/Attribute:category+' => '',
|
||||
'Class:Change/Attribute:category/Value:application' => '应用',
|
||||
@@ -28,83 +93,48 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Change/Attribute:category/Value:software+' => '软件',
|
||||
'Class:Change/Attribute:category/Value:system' => '系统',
|
||||
'Class:Change/Attribute:category/Value:system+' => '系统',
|
||||
'Class:Change/Attribute:changemanager_email' => '邮箱',
|
||||
'Class:Change/Attribute:changemanager_email+' => '',
|
||||
'Class:Change/Attribute:changemanager_id' => '变更经理',
|
||||
'Class:Change/Attribute:changemanager_id+' => '',
|
||||
'Class:Change/Attribute:child_changes_list' => '子变更',
|
||||
'Class:Change/Attribute:child_changes_list+' => '此变更相关的所有子变更',
|
||||
'Class:Change/Attribute:creation_date' => '创建日期',
|
||||
'Class:Change/Attribute:creation_date+' => '',
|
||||
'Class:Change/Attribute:fallback_plan' => '回滚计划',
|
||||
'Class:Change/Attribute:fallback_plan+' => '',
|
||||
'Class:Change/Attribute:outage' => '停机',
|
||||
'Class:Change/Attribute:outage+' => '',
|
||||
'Class:Change/Attribute:outage/Value:no' => '否',
|
||||
'Class:Change/Attribute:outage/Value:no+' => '',
|
||||
'Class:Change/Attribute:outage/Value:yes' => '是',
|
||||
'Class:Change/Attribute:outage/Value:yes+' => '',
|
||||
'Class:Change/Attribute:parent_id' => '父级变更',
|
||||
'Class:Change/Attribute:parent_id+' => '',
|
||||
'Class:Change/Attribute:parent_id_friendlyname' => '父级变更昵称',
|
||||
'Class:Change/Attribute:parent_id_friendlyname+' => '',
|
||||
'Class:Change/Attribute:parent_name' => '变更编号',
|
||||
'Class:Change/Attribute:parent_name+' => '',
|
||||
'Class:Change/Attribute:reject_reason' => '驳回原因',
|
||||
'Class:Change/Attribute:reject_reason+' => '',
|
||||
'Class:Change/Attribute:changemanager_id' => '变更经理',
|
||||
'Class:Change/Attribute:changemanager_id+' => '',
|
||||
'Class:Change/Attribute:changemanager_email' => '邮箱',
|
||||
'Class:Change/Attribute:changemanager_email+' => '',
|
||||
'Class:Change/Attribute:parent_id' => '父级变更',
|
||||
'Class:Change/Attribute:parent_id+' => '',
|
||||
'Class:Change/Attribute:parent_name' => '变更编号',
|
||||
'Class:Change/Attribute:parent_name+' => '',
|
||||
'Class:Change/Attribute:creation_date' => '创建日期',
|
||||
'Class:Change/Attribute:creation_date+' => '',
|
||||
'Class:Change/Attribute:approval_date' => '审批日期',
|
||||
'Class:Change/Attribute:approval_date+' => '',
|
||||
'Class:Change/Attribute:fallback_plan' => '回滚计划',
|
||||
'Class:Change/Attribute:fallback_plan+' => '',
|
||||
'Class:Change/Attribute:related_request_list' => '相关需求',
|
||||
'Class:Change/Attribute:related_request_list+' => '此变更相关的所有用户需求',
|
||||
'Class:Change/Attribute:related_incident_list' => '相关事件',
|
||||
'Class:Change/Attribute:related_incident_list+' => '此变更相关的所有事件',
|
||||
'Class:Change/Attribute:related_problems_list' => '相关问题',
|
||||
'Class:Change/Attribute:related_problems_list+' => '此变更相关的所有问题',
|
||||
'Class:Change/Attribute:related_request_list' => '相关需求',
|
||||
'Class:Change/Attribute:related_request_list+' => '此变更相关的所有用户需求',
|
||||
'Class:Change/Attribute:status' => '状态',
|
||||
'Class:Change/Attribute:status+' => '',
|
||||
'Class:Change/Attribute:status/Value:approved' => '已批准',
|
||||
'Class:Change/Attribute:status/Value:approved+' => '',
|
||||
'Class:Change/Attribute:status/Value:assigned' => '已分配',
|
||||
'Class:Change/Attribute:status/Value:assigned+' => '',
|
||||
'Class:Change/Attribute:status/Value:closed' => '已关闭',
|
||||
'Class:Change/Attribute:status/Value:closed+' => '',
|
||||
'Class:Change/Attribute:status/Value:new' => '新建',
|
||||
'Class:Change/Attribute:status/Value:new+' => '',
|
||||
'Class:Change/Attribute:status/Value:planned' => '已计划',
|
||||
'Class:Change/Attribute:status/Value:planned+' => '',
|
||||
'Class:Change/Attribute:status/Value:rejected' => '已驳回',
|
||||
'Class:Change/Attribute:status/Value:rejected+' => '',
|
||||
'Class:Change/Stimulus:ev_approve' => '批准',
|
||||
'Class:Change/Stimulus:ev_approve+' => '',
|
||||
'Class:Change/Attribute:child_changes_list' => '子变更',
|
||||
'Class:Change/Attribute:child_changes_list+' => '此变更相关的所有子变更',
|
||||
'Class:Change/Attribute:parent_id_friendlyname' => '父级变更昵称',
|
||||
'Class:Change/Attribute:parent_id_friendlyname+' => '',
|
||||
'Class:Change/Stimulus:ev_assign' => '分配',
|
||||
'Class:Change/Stimulus:ev_assign+' => '',
|
||||
'Class:Change/Stimulus:ev_finish' => '关闭',
|
||||
'Class:Change/Stimulus:ev_finish+' => '',
|
||||
'Class:Change/Stimulus:ev_plan' => '计划',
|
||||
'Class:Change/Stimulus:ev_plan+' => '',
|
||||
'Class:Change/Stimulus:ev_reject' => '驳回',
|
||||
'Class:Change/Stimulus:ev_reject+' => '',
|
||||
'Class:Change/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:Change/Stimulus:ev_reopen+' => '',
|
||||
'Menu:Change:Overview' => '概况',
|
||||
'Menu:Change:Overview+' => '',
|
||||
'Menu:Change:Shortcuts' => '快捷方式',
|
||||
'Menu:Change:Shortcuts+' => '',
|
||||
'Menu:ChangeManagement' => '变更管理',
|
||||
'Menu:Changes' => '所有打开的变更',
|
||||
'Menu:Changes+' => '所有打开的变更',
|
||||
'Menu:MyChanges' => '分配给我的变更',
|
||||
'Menu:MyChanges+' => '分配给我的变更 (作为办理人)',
|
||||
'Menu:NewChange' => '新建变更',
|
||||
'Menu:NewChange+' => '新建变更',
|
||||
'Menu:SearchChanges' => '搜索变更',
|
||||
'Menu:SearchChanges+' => '搜索变更',
|
||||
'Menu:WaitingAcceptance' => '等待审核的变更',
|
||||
'Menu:WaitingAcceptance+' => '',
|
||||
'Menu:WaitingApproval' => '等待批准的变更',
|
||||
'Menu:WaitingApproval+' => '',
|
||||
'Tickets:Related:OpenChanges' => '打开的变更',
|
||||
'Tickets:Related:RecentChanges' => '最近的变更 (72小时)',
|
||||
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => '最近一周的变更 (按类型)',
|
||||
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => '最近一周的变更 (按范围)',
|
||||
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => '最近一周的变更 (按状态)',
|
||||
'UI-ChangeManagementOverview-Last-7-days' => '最近一周的变更 (按数量)',
|
||||
'Class:Change/Stimulus:ev_approve' => '批准',
|
||||
'Class:Change/Stimulus:ev_approve+' => '',
|
||||
'Class:Change/Stimulus:ev_finish' => '关闭',
|
||||
'Class:Change/Stimulus:ev_finish+' => '',
|
||||
'Class:Change/Attribute:outage' => '停机',
|
||||
'Class:Change/Attribute:outage+' => '',
|
||||
'Class:Change/Attribute:outage/Value:no' => '否',
|
||||
'Class:Change/Attribute:outage/Value:no+' => '',
|
||||
'Class:Change/Attribute:outage/Value:yes' => '是',
|
||||
'Class:Change/Attribute:outage/Value:yes+' => '',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<class id="FunctionalCI" _delta="define">
|
||||
<parent>cmdbAbstractObject</parent>
|
||||
<properties>
|
||||
<category>bizmodel,searchable</category>
|
||||
<category>bizmodel,searchable,popular</category>
|
||||
<abstract>true</abstract>
|
||||
<key_type>autoincrement</key_type>
|
||||
<db_table>functionalci</db_table>
|
||||
|
||||
@@ -28,13 +28,13 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:ApplicationSolution/Attribute:status/Value:inactive+' => 'inattivo',
|
||||
'Class:Brand' => 'Marca',
|
||||
'Class:Brand+' => '~~',
|
||||
'Class:Brand/Attribute:physicaldevices_list' => 'Dispositivi Fisici',
|
||||
'Class:Brand/Attribute:physicaldevices_list' => 'Dispositivi fisici',
|
||||
'Class:Brand/Attribute:physicaldevices_list+' => 'Tutti i dispositivi fisici corrispondenti a questa marca',
|
||||
'Class:Brand/UniquenessRule:name' => 'Questa marca esiste già',
|
||||
'Class:Brand/UniquenessRule:name+' => 'Il nome deve essere univoco',
|
||||
'Class:BusinessProcess' => 'Processi Aziendali',
|
||||
'Class:BusinessProcess' => 'Processi aziendali',
|
||||
'Class:BusinessProcess+' => '',
|
||||
'Class:BusinessProcess/Attribute:applicationsolutions_list' => 'Soluzioni Applicative',
|
||||
'Class:BusinessProcess/Attribute:applicationsolutions_list' => 'Soluzioni applicative',
|
||||
'Class:BusinessProcess/Attribute:applicationsolutions_list+' => 'Tutte le soluzioni applicative che influenzano questo processo aziendale',
|
||||
'Class:BusinessProcess/Attribute:status' => 'Stato',
|
||||
'Class:BusinessProcess/Attribute:status+' => '~~',
|
||||
@@ -44,9 +44,9 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:BusinessProcess/Attribute:status/Value:inactive+' => 'inattivo',
|
||||
'Class:ConnectableCI' => 'CI collegabile',
|
||||
'Class:ConnectableCI+' => 'CI fisico',
|
||||
'Class:ConnectableCI/Attribute:networkdevice_list' => 'Dispositivi di Rete',
|
||||
'Class:ConnectableCI/Attribute:networkdevice_list' => 'Dispositivi di rete',
|
||||
'Class:ConnectableCI/Attribute:networkdevice_list+' => 'Tutti i dispositivi di rete collegati a questo dispositivo',
|
||||
'Class:ConnectableCI/Attribute:physicalinterface_list' => 'Interfacce di Rete',
|
||||
'Class:ConnectableCI/Attribute:physicalinterface_list' => 'Interfacce di rete',
|
||||
'Class:ConnectableCI/Attribute:physicalinterface_list+' => 'Tutte le interfacce di rete fisiche',
|
||||
'Class:ConnectableCI/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:DBServer' => 'Database',
|
||||
@@ -105,7 +105,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:Enclosure/ComplementaryName' => '%1$s - %2$s - %3$s',
|
||||
'Class:Farm' => 'Farm',
|
||||
'Class:Farm+' => '~~',
|
||||
'Class:Farm/Attribute:hypervisor_list' => 'Hypervisors',
|
||||
'Class:Farm/Attribute:hypervisor_list' => 'Hypervisor',
|
||||
'Class:Farm/Attribute:hypervisor_list+' => 'Tutti gli hypervisor che compongono questa farm',
|
||||
'Class:Farm/Attribute:redundancy' => 'Alta disponibilità',
|
||||
'Class:Farm/Attribute:redundancy/count' => 'La farm è attiva se almeno %1$s hypervisor è(sono) attivo(i)',
|
||||
@@ -149,7 +149,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:FunctionalCI/Attribute:name+' => '',
|
||||
'Class:FunctionalCI/Attribute:org_id' => 'Organizzazione proprietaria',
|
||||
'Class:FunctionalCI/Attribute:org_id+' => '',
|
||||
'Class:FunctionalCI/Attribute:organization_name' => 'Nome Organizzazione',
|
||||
'Class:FunctionalCI/Attribute:organization_name' => 'Nome organizzazione',
|
||||
'Class:FunctionalCI/Attribute:organization_name+' => 'Nome comune',
|
||||
'Class:FunctionalCI/Attribute:softwares_list' => 'Software',
|
||||
'Class:FunctionalCI/Attribute:softwares_list+' => 'Tutti i software installati su questo elemento di configurazione',
|
||||
@@ -157,7 +157,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:FunctionalCI/Tab:OpenedTickets+' => 'Ticket attivi che stanno influenzando questa CI funzionale',
|
||||
'Class:Group' => 'Gruppo',
|
||||
'Class:Group+' => '',
|
||||
'Class:Group/Attribute:ci_list' => 'Elementi di Configurazione Collegati',
|
||||
'Class:Group/Attribute:ci_list' => 'Elementi di configurazione collegati',
|
||||
'Class:Group/Attribute:ci_list+' => 'Tutti gli elementi di configurazione collegati a questo gruppo',
|
||||
'Class:Group/Attribute:description' => 'Descrizione',
|
||||
'Class:Group/Attribute:description+' => '',
|
||||
@@ -165,13 +165,13 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:Group/Attribute:name+' => '',
|
||||
'Class:Group/Attribute:org_id' => 'Organizzazione',
|
||||
'Class:Group/Attribute:org_id+' => '',
|
||||
'Class:Group/Attribute:owner_name' => 'Nome del Proprietario',
|
||||
'Class:Group/Attribute:owner_name+' => 'Cognome del Proprietario',
|
||||
'Class:Group/Attribute:parent_id' => 'Gruppo Padre',
|
||||
'Class:Group/Attribute:owner_name' => 'Nome del proprietario',
|
||||
'Class:Group/Attribute:owner_name+' => 'Cognome del proprietario',
|
||||
'Class:Group/Attribute:parent_id' => 'Gruppo padre',
|
||||
'Class:Group/Attribute:parent_id+' => '',
|
||||
'Class:Group/Attribute:parent_id_friendlyname' => 'Nome del Gruppo Padre',
|
||||
'Class:Group/Attribute:parent_id_friendlyname' => 'Nome del gruppo padre',
|
||||
'Class:Group/Attribute:parent_id_friendlyname+' => '~~',
|
||||
'Class:Group/Attribute:parent_name' => 'Nome del Gruppo Padre',
|
||||
'Class:Group/Attribute:parent_name' => 'Nome del gruppo padre',
|
||||
'Class:Group/Attribute:parent_name+' => '',
|
||||
'Class:Group/Attribute:status' => 'Stato',
|
||||
'Class:Group/Attribute:status+' => '',
|
||||
@@ -198,7 +198,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:IOSVersion+' => '~~',
|
||||
'Class:IOSVersion/Attribute:brand_id' => 'Marca',
|
||||
'Class:IOSVersion/Attribute:brand_id+' => '~~',
|
||||
'Class:IOSVersion/Attribute:brand_name' => 'Nome della Marca',
|
||||
'Class:IOSVersion/Attribute:brand_name' => 'Nome della marca',
|
||||
'Class:IOSVersion/Attribute:brand_name+' => '~~',
|
||||
'Class:IPInterface' => 'Interfaccia IP',
|
||||
'Class:IPInterface+' => '~~',
|
||||
@@ -244,7 +244,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:Licence/Attribute:start_date+' => '~~',
|
||||
'Class:Licence/Attribute:usage_limit' => 'Limiti d\'uso',
|
||||
'Class:Licence/Attribute:usage_limit+' => '',
|
||||
'Class:LogicalInterface' => 'Interfaccia Logica',
|
||||
'Class:LogicalInterface' => 'Interfaccia logica',
|
||||
'Class:LogicalInterface+' => '~~',
|
||||
'Class:LogicalInterface/Attribute:virtualmachine_id' => 'Macchina Virtuale',
|
||||
'Class:LogicalInterface/Attribute:virtualmachine_id+' => '~~',
|
||||
@@ -264,9 +264,9 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:LogicalVolume/Attribute:servers_list+' => 'Tutti i server che utilizzano questo volume',
|
||||
'Class:LogicalVolume/Attribute:size' => 'Dimensione',
|
||||
'Class:LogicalVolume/Attribute:size+' => '~~',
|
||||
'Class:LogicalVolume/Attribute:storagesystem_id' => 'Sistema di Archiviazione',
|
||||
'Class:LogicalVolume/Attribute:storagesystem_id' => 'Sistema di archiviazione',
|
||||
'Class:LogicalVolume/Attribute:storagesystem_id+' => '~~',
|
||||
'Class:LogicalVolume/Attribute:storagesystem_name' => 'Nome del Sistema di Archiviazione',
|
||||
'Class:LogicalVolume/Attribute:storagesystem_name' => 'Nome del sistema di archiviazione',
|
||||
'Class:LogicalVolume/Attribute:storagesystem_name+' => '~~',
|
||||
'Class:LogicalVolume/Attribute:virtualdevices_list' => 'Dispositivi Virtuali',
|
||||
'Class:LogicalVolume/Attribute:virtualdevices_list+' => 'Tutti i dispositivi virtuali che utilizzano questo volume',
|
||||
@@ -296,8 +296,8 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:Model/Attribute/type/Value:PC+' => 'PC',
|
||||
'Class:Model/Attribute/type/Value:PDU' => 'PDU',
|
||||
'Class:Model/Attribute/type/Value:PDU+' => 'PDU',
|
||||
'Class:Model/Attribute/type/Value:Peripheral' => 'Periferico',
|
||||
'Class:Model/Attribute/type/Value:Peripheral+' => 'Periferico',
|
||||
'Class:Model/Attribute/type/Value:Peripheral' => 'Periferica',
|
||||
'Class:Model/Attribute/type/Value:Peripheral+' => 'Periferica',
|
||||
'Class:Model/Attribute/type/Value:Phone' => 'Telefono',
|
||||
'Class:Model/Attribute/type/Value:Phone+' => 'Telefono',
|
||||
'Class:Model/Attribute/type/Value:Printer' => 'Stampante',
|
||||
@@ -332,30 +332,30 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:Model/Attribute:type/Value:MobilePhone+' => 'Telefono mobile',
|
||||
'Class:Model/Attribute:type/Value:NAS' => 'NAS',
|
||||
'Class:Model/Attribute:type/Value:NAS+' => 'NAS~~',
|
||||
'Class:Model/Attribute:type/Value:NetworkDevice' => 'Network Device~~',
|
||||
'Class:Model/Attribute:type/Value:NetworkDevice+' => 'Network Device~~',
|
||||
'Class:Model/Attribute:type/Value:NetworkDevice' => 'Dispositivo di rete',
|
||||
'Class:Model/Attribute:type/Value:NetworkDevice+' => 'Dispositivo di rete',
|
||||
'Class:Model/Attribute:type/Value:PC' => 'PC~~',
|
||||
'Class:Model/Attribute:type/Value:PC+' => 'PC~~',
|
||||
'Class:Model/Attribute:type/Value:PDU' => 'PDU~~',
|
||||
'Class:Model/Attribute:type/Value:PDU+' => 'PDU~~',
|
||||
'Class:Model/Attribute:type/Value:Peripheral' => 'Peripheral~~',
|
||||
'Class:Model/Attribute:type/Value:Peripheral+' => 'Peripheral~~',
|
||||
'Class:Model/Attribute:type/Value:Phone' => 'Telephone~~',
|
||||
'Class:Model/Attribute:type/Value:Phone+' => 'Telephone~~',
|
||||
'Class:Model/Attribute:type/Value:Phone' => 'Telefono',
|
||||
'Class:Model/Attribute:type/Value:Phone+' => 'Telefono',
|
||||
'Class:Model/Attribute:type/Value:PowerSource' => 'Sorgente di alimentazione',
|
||||
'Class:Model/Attribute:type/Value:PowerSource+' => 'Sorgente di alimentazione',
|
||||
'Class:Model/Attribute:type/Value:Printer' => 'Printer~~',
|
||||
'Class:Model/Attribute:type/Value:Printer+' => 'Printer~~',
|
||||
'Class:Model/Attribute:type/Value:Rack' => 'Rack~~',
|
||||
'Class:Model/Attribute:type/Value:Rack+' => 'Rack~~',
|
||||
'Class:Model/Attribute:type/Value:SANSwitch' => 'SAN switch~~',
|
||||
'Class:Model/Attribute:type/Value:SANSwitch+' => 'SAN switch~~',
|
||||
'Class:Model/Attribute:type/Value:Server' => 'Server~~',
|
||||
'Class:Model/Attribute:type/Value:Server+' => 'Server~~',
|
||||
'Class:Model/Attribute:type/Value:Printer' => 'Stampante',
|
||||
'Class:Model/Attribute:type/Value:Printer+' => 'Stampante',
|
||||
'Class:Model/Attribute:type/Value:Rack' => 'Rack',
|
||||
'Class:Model/Attribute:type/Value:Rack+' => 'Rack',
|
||||
'Class:Model/Attribute:type/Value:SANSwitch' => 'SAN switch',
|
||||
'Class:Model/Attribute:type/Value:SANSwitch+' => 'SAN switch',
|
||||
'Class:Model/Attribute:type/Value:Server' => 'Server',
|
||||
'Class:Model/Attribute:type/Value:Server+' => 'Server',
|
||||
'Class:Model/Attribute:type/Value:StorageSystem' => 'Storage System~~',
|
||||
'Class:Model/Attribute:type/Value:StorageSystem+' => 'Storage System~~',
|
||||
'Class:Model/Attribute:type/Value:Tablet' => 'Tablet~~',
|
||||
'Class:Model/Attribute:type/Value:Tablet+' => 'Tablet~~',
|
||||
'Class:Model/Attribute:type/Value:Tablet' => 'Tablet',
|
||||
'Class:Model/Attribute:type/Value:Tablet+' => 'Tablet',
|
||||
'Class:Model/Attribute:type/Value:TapeLibrary' => 'Tape Library~~',
|
||||
'Class:Model/Attribute:type/Value:TapeLibrary+' => 'Tape Library~~',
|
||||
'Class:Model/ComplementaryName' => '%1$s - %2$s',
|
||||
@@ -363,7 +363,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:Model/UniquenessRule:name_brand+' => 'Il nome deve essere univoco nella marca',
|
||||
'Class:NAS' => 'NAS',
|
||||
'Class:NAS+' => '~~',
|
||||
'Class:NAS/Attribute:nasfilesystem_list' => 'File System',
|
||||
'Class:NAS/Attribute:nasfilesystem_list' => 'File system',
|
||||
'Class:NAS/Attribute:nasfilesystem_list+' => 'Tutti i file system in questo NAS',
|
||||
'Class:NAS/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:NASFileSystem' => 'File System NAS',
|
||||
@@ -516,7 +516,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:PhysicalDevice/Attribute:status/Value:stock' => 'magazzino',
|
||||
'Class:PhysicalDevice/Attribute:status/Value:stock+' => 'magazzino',
|
||||
'Class:PhysicalDevice/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:PhysicalInterface' => 'Interfaccia Fisica',
|
||||
'Class:PhysicalInterface' => 'Interfaccia fisica',
|
||||
'Class:PhysicalInterface+' => '~~',
|
||||
'Class:PhysicalInterface/Attribute:connectableci_id' => 'Dispositivo',
|
||||
'Class:PhysicalInterface/Attribute:connectableci_id+' => '~~',
|
||||
@@ -682,7 +682,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:Tape/Attribute:tapelibrary_id+' => '~~',
|
||||
'Class:Tape/Attribute:tapelibrary_name' => 'Nome della libreria di nastri',
|
||||
'Class:Tape/Attribute:tapelibrary_name+' => '~~',
|
||||
'Class:TapeLibrary' => 'Libreria di Nastri',
|
||||
'Class:TapeLibrary' => 'Libreria di nastri',
|
||||
'Class:TapeLibrary+' => '~~',
|
||||
'Class:TapeLibrary/Attribute:tapes_list' => 'Nastri',
|
||||
'Class:TapeLibrary/Attribute:tapes_list+' => 'Tutti i nastri nella libreria di nastri',
|
||||
@@ -705,7 +705,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:VLAN/Attribute:subnets_list+' => '~~',
|
||||
'Class:VLAN/Attribute:vlan_tag' => 'VLAN Tag',
|
||||
'Class:VLAN/Attribute:vlan_tag+' => '~~',
|
||||
'Class:VirtualDevice' => 'Dispositivo Virtuale',
|
||||
'Class:VirtualDevice' => 'Dispositivo virtuale',
|
||||
'Class:VirtualDevice+' => '~~',
|
||||
'Class:VirtualDevice/Attribute:logicalvolumes_list' => 'Volumi Logici',
|
||||
'Class:VirtualDevice/Attribute:logicalvolumes_list+' => 'Tutti i volumi logici utilizzati da questo dispositivo',
|
||||
@@ -721,33 +721,33 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:VirtualDevice/Attribute:status/Value:stock+' => 'In Stock',
|
||||
'Class:VirtualHost' => 'Host Virtuale',
|
||||
'Class:VirtualHost+' => '~~',
|
||||
'Class:VirtualHost/Attribute:virtualmachine_list' => 'Macchine Virtuali',
|
||||
'Class:VirtualHost/Attribute:virtualmachine_list' => 'Macchine virtuali',
|
||||
'Class:VirtualHost/Attribute:virtualmachine_list+' => 'Tutte le macchine virtuali ospitate da questo host',
|
||||
'Class:VirtualMachine' => 'Macchina Virtuale',
|
||||
'Class:VirtualMachine' => 'Macchina virtuale',
|
||||
'Class:VirtualMachine+' => '~~',
|
||||
'Class:VirtualMachine/Attribute:cpu' => 'CPU',
|
||||
'Class:VirtualMachine/Attribute:cpu+' => '~~',
|
||||
'Class:VirtualMachine/Attribute:logicalinterface_list' => 'Interfacce di Rete Logiche',
|
||||
'Class:VirtualMachine/Attribute:logicalinterface_list' => 'Interfacce di rete logiche',
|
||||
'Class:VirtualMachine/Attribute:logicalinterface_list+' => 'Tutte le interfacce di rete logiche',
|
||||
'Class:VirtualMachine/Attribute:managementip' => 'IP di Gestione',
|
||||
'Class:VirtualMachine/Attribute:managementip' => 'IP di gestione',
|
||||
'Class:VirtualMachine/Attribute:managementip+' => '~~',
|
||||
'Class:VirtualMachine/Attribute:osfamily_id' => 'Famiglia del Sistema Operativo',
|
||||
'Class:VirtualMachine/Attribute:osfamily_id' => 'Famiglia del sistema operativo',
|
||||
'Class:VirtualMachine/Attribute:osfamily_id+' => '~~',
|
||||
'Class:VirtualMachine/Attribute:osfamily_name' => 'Nome della Famiglia del Sistema Operativo',
|
||||
'Class:VirtualMachine/Attribute:osfamily_name' => 'Nome della famiglia del sistema operativo',
|
||||
'Class:VirtualMachine/Attribute:osfamily_name+' => '~~',
|
||||
'Class:VirtualMachine/Attribute:oslicence_id' => 'Licenza del Sistema Operativo',
|
||||
'Class:VirtualMachine/Attribute:oslicence_id+' => '~~',
|
||||
'Class:VirtualMachine/Attribute:oslicence_name' => 'Nome della Licenza del Sistema Operativo',
|
||||
'Class:VirtualMachine/Attribute:oslicence_name' => 'Nome della licenza del sistema operativo',
|
||||
'Class:VirtualMachine/Attribute:oslicence_name+' => '~~',
|
||||
'Class:VirtualMachine/Attribute:osversion_id' => 'Versione del Sistema Operativo',
|
||||
'Class:VirtualMachine/Attribute:osversion_id' => 'Versione del sistema operativo',
|
||||
'Class:VirtualMachine/Attribute:osversion_id+' => '~~',
|
||||
'Class:VirtualMachine/Attribute:osversion_name' => 'Nome della Versione del Sistema Operativo',
|
||||
'Class:VirtualMachine/Attribute:osversion_name' => 'Nome della versione del sistema operativo',
|
||||
'Class:VirtualMachine/Attribute:osversion_name+' => '~~',
|
||||
'Class:VirtualMachine/Attribute:ram' => 'RAM',
|
||||
'Class:VirtualMachine/Attribute:ram+' => '~~',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_id' => 'Host Virtuale',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_id' => 'Host virtuale',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_id+' => '~~',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_name' => 'Nome Host Virtuale',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_name' => 'Nome host virtuale',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_name+' => '~~',
|
||||
'Class:VirtualMachine/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:WebApplication' => 'Web Application',
|
||||
@@ -756,12 +756,12 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:WebApplication/Attribute:url+' => '~~',
|
||||
'Class:WebApplication/Attribute:webserver_id' => 'Web server',
|
||||
'Class:WebApplication/Attribute:webserver_id+' => '~~',
|
||||
'Class:WebApplication/Attribute:webserver_name' => 'Nome del server Web',
|
||||
'Class:WebApplication/Attribute:webserver_name' => 'Nome del web server',
|
||||
'Class:WebApplication/Attribute:webserver_name+' => '~~',
|
||||
'Class:WebApplication/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:WebServer' => 'Server Web',
|
||||
'Class:WebServer' => 'Web server',
|
||||
'Class:WebServer+' => '~~',
|
||||
'Class:WebServer/Attribute:webapp_list' => 'Applicazioni Web',
|
||||
'Class:WebServer/Attribute:webapp_list' => 'Applicazioni web',
|
||||
'Class:WebServer/Attribute:webapp_list+' => 'Tutte le applicazioni web disponibili su questo server web',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess' => 'Collega Soluzione Applicativa / Processo Aziendale',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess+' => '~~',
|
||||
@@ -774,15 +774,15 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:lnkApplicationSolutionToBusinessProcess/Attribute:businessprocess_name' => 'Nome Processo Aziendale',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess/Attribute:businessprocess_name+' => '~~',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess/Name' => '%1$s / %2$s',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI' => 'Collega Soluzione Applicativa / CI Funzionale',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI' => 'Collega soluzione applicativa / CI funzionale',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI+' => '~~',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_id' => 'Soluzione Applicativa',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_id' => 'Soluzione applicativa',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_id+' => '~~',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_name' => 'Nome Soluzione Applicativa',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_name' => 'Nome soluzione applicativa',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_name+' => '~~',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:functionalci_id' => 'CI Funzionale',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:functionalci_id' => 'CI funzionale',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:functionalci_id+' => '~~',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:functionalci_name' => 'Nome CI Funzionale',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:functionalci_name' => 'Nome CI funzionale',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:functionalci_name+' => '~~',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkConnectableCIToNetworkDevice' => 'Collega CI collegabile / Dispositivo di rete',
|
||||
@@ -812,20 +812,20 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:lnkContactToFunctionalCI/Attribute:contact_id+' => '~~',
|
||||
'Class:lnkContactToFunctionalCI/Attribute:contact_name' => 'Nome Contatto',
|
||||
'Class:lnkContactToFunctionalCI/Attribute:contact_name+' => '~~',
|
||||
'Class:lnkContactToFunctionalCI/Attribute:functionalci_id' => 'Functionalci',
|
||||
'Class:lnkContactToFunctionalCI/Attribute:functionalci_id' => 'CI funzionale',
|
||||
'Class:lnkContactToFunctionalCI/Attribute:functionalci_id+' => '~~',
|
||||
'Class:lnkContactToFunctionalCI/Attribute:functionalci_name' => 'Nome Functionalci',
|
||||
'Class:lnkContactToFunctionalCI/Attribute:functionalci_name' => 'Nome CI funzionale',
|
||||
'Class:lnkContactToFunctionalCI/Attribute:functionalci_name+' => '~~',
|
||||
'Class:lnkContactToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToFunctionalCI' => 'Collegamento Documento / FunctionalCI',
|
||||
'Class:lnkDocumentToFunctionalCI' => 'Collegamento Documento / CI funzionale',
|
||||
'Class:lnkDocumentToFunctionalCI+' => '~~',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:document_id' => 'Documento',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:document_id+' => '~~',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:document_name' => 'Nome documento',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:document_name+' => '~~',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_id' => 'FunctionalCI',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_id' => 'CI funzionale',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_id+' => '~~',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_name' => 'Nome FunctionalCI',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_name' => 'Nome CI funzionale',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_name+' => '~~',
|
||||
'Class:lnkDocumentToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToLicence' => 'Link Documento/Licenza',
|
||||
@@ -839,37 +839,37 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:lnkDocumentToLicence/Attribute:licence_name' => 'Nome licenza',
|
||||
'Class:lnkDocumentToLicence/Attribute:licence_name+' => '~~',
|
||||
'Class:lnkDocumentToLicence/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToPatch' => 'Collegamento Documento / Patch',
|
||||
'Class:lnkDocumentToPatch' => 'Collegamento documento / patch',
|
||||
'Class:lnkDocumentToPatch+' => '~~',
|
||||
'Class:lnkDocumentToPatch/Attribute:document_id' => 'Documento',
|
||||
'Class:lnkDocumentToPatch/Attribute:document_id+' => '~~',
|
||||
'Class:lnkDocumentToPatch/Attribute:document_name' => 'Nome del Documento',
|
||||
'Class:lnkDocumentToPatch/Attribute:document_name' => 'Nome del documento',
|
||||
'Class:lnkDocumentToPatch/Attribute:document_name+' => '~~',
|
||||
'Class:lnkDocumentToPatch/Attribute:patch_id' => 'Patch',
|
||||
'Class:lnkDocumentToPatch/Attribute:patch_id+' => '~~',
|
||||
'Class:lnkDocumentToPatch/Attribute:patch_name' => 'Nome della Patch',
|
||||
'Class:lnkDocumentToPatch/Attribute:patch_name' => 'Nome della patch',
|
||||
'Class:lnkDocumentToPatch/Attribute:patch_name+' => '~~',
|
||||
'Class:lnkDocumentToPatch/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToSoftware' => 'Collegamento Documento / Software',
|
||||
'Class:lnkDocumentToSoftware' => 'Collegamento documento / software',
|
||||
'Class:lnkDocumentToSoftware+' => '~~',
|
||||
'Class:lnkDocumentToSoftware/Attribute:document_id' => 'Documento',
|
||||
'Class:lnkDocumentToSoftware/Attribute:document_id+' => '~~',
|
||||
'Class:lnkDocumentToSoftware/Attribute:document_name' => 'Nome del Documento',
|
||||
'Class:lnkDocumentToSoftware/Attribute:document_name' => 'Nome del documento',
|
||||
'Class:lnkDocumentToSoftware/Attribute:document_name+' => '~~',
|
||||
'Class:lnkDocumentToSoftware/Attribute:software_id' => 'Software',
|
||||
'Class:lnkDocumentToSoftware/Attribute:software_id+' => '~~',
|
||||
'Class:lnkDocumentToSoftware/Attribute:software_name' => 'Nome del Software',
|
||||
'Class:lnkDocumentToSoftware/Attribute:software_name' => 'Nome del software',
|
||||
'Class:lnkDocumentToSoftware/Attribute:software_name+' => '~~',
|
||||
'Class:lnkDocumentToSoftware/Name' => '%1$s / %2$s',
|
||||
'Class:lnkFunctionalCIToOSPatch' => 'Collegamento CI Funzionale / Patch OS',
|
||||
'Class:lnkFunctionalCIToOSPatch' => 'Collegamento CI funzionale / patch OS',
|
||||
'Class:lnkFunctionalCIToOSPatch+' => '~~',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:functionalci_id' => 'CI Funzionale',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:functionalci_id' => 'CI funzionale',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:functionalci_id+' => '~~',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:functionalci_name' => 'Nome del CI Funzionale',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:functionalci_name' => 'Nome del CI funzionale',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:functionalci_name+' => '~~',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_id' => 'Patch OS',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_id+' => '~~',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_name' => 'Nome della Patch OS',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_name' => 'Nome della patch OS',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_name+' => '~~',
|
||||
'Class:lnkFunctionalCIToOSPatch/Name' => '%1$s / %2$s',
|
||||
'Class:lnkGroupToCI' => 'Gruppo / CI',
|
||||
@@ -880,20 +880,20 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:lnkGroupToCI/Attribute:ci_name+' => '',
|
||||
'Class:lnkGroupToCI/Attribute:group_id' => 'Gruppo',
|
||||
'Class:lnkGroupToCI/Attribute:group_id+' => '',
|
||||
'Class:lnkGroupToCI/Attribute:group_name' => 'Nome del Gruppo',
|
||||
'Class:lnkGroupToCI/Attribute:group_name' => 'Nome del gruppo',
|
||||
'Class:lnkGroupToCI/Attribute:group_name+' => '',
|
||||
'Class:lnkGroupToCI/Attribute:reason' => 'Motivo',
|
||||
'Class:lnkGroupToCI/Attribute:reason+' => '',
|
||||
'Class:lnkGroupToCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkPhysicalInterfaceToVLAN' => 'Collegamento Interfaccia Fisica / VLAN',
|
||||
'Class:lnkPhysicalInterfaceToVLAN' => 'Collegamento interfaccia fisica / VLAN',
|
||||
'Class:lnkPhysicalInterfaceToVLAN+' => '~~',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_device_id' => 'Dispositivo',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_device_id+' => '~~',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_device_name' => 'Nome del Dispositivo',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_device_name' => 'Nome del dispositivo',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_device_name+' => '~~',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_id' => 'Interfaccia Fisica',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_id' => 'Interfaccia fisica',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_id+' => '~~',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_name' => 'Nome Interfaccia Fisica',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_name' => 'Nome interfaccia fisica',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_name+' => '~~',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_id' => 'VLAN',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_id+' => '~~',
|
||||
@@ -904,13 +904,13 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:lnkSanToDatacenterDevice+' => '~~',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_id' => 'Dispositivo',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_id+' => '~~',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_name' => 'Nome del Dispositivo',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_name' => 'Nome del dispositivo',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_name+' => '~~',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_port' => 'Porta Dispositivo FC',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_port' => 'Porta dispositivo FC',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:datacenterdevice_port+' => '~~',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_id' => 'SAN Switch',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_id' => 'SAN switch',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_id+' => '~~',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_name' => 'Nome SAN Switch',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_name' => 'Nome SAN switch',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_name+' => '~~',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_port' => 'Porta SAN FC',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_port+' => '~~',
|
||||
@@ -919,24 +919,24 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:lnkServerToVolume+' => '~~',
|
||||
'Class:lnkServerToVolume/Attribute:server_id' => 'Server',
|
||||
'Class:lnkServerToVolume/Attribute:server_id+' => '~~',
|
||||
'Class:lnkServerToVolume/Attribute:server_name' => 'Nome del Server',
|
||||
'Class:lnkServerToVolume/Attribute:server_name' => 'Nome del server',
|
||||
'Class:lnkServerToVolume/Attribute:server_name+' => '~~',
|
||||
'Class:lnkServerToVolume/Attribute:size_used' => 'Dimensione utilizzata',
|
||||
'Class:lnkServerToVolume/Attribute:size_used+' => '~~',
|
||||
'Class:lnkServerToVolume/Attribute:volume_id' => 'Volume',
|
||||
'Class:lnkServerToVolume/Attribute:volume_id+' => '~~',
|
||||
'Class:lnkServerToVolume/Attribute:volume_name' => 'Nome del Volume',
|
||||
'Class:lnkServerToVolume/Attribute:volume_name' => 'Nome del volume',
|
||||
'Class:lnkServerToVolume/Attribute:volume_name+' => '~~',
|
||||
'Class:lnkServerToVolume/Name' => '%1$s / %2$s',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch' => 'Collegamento Istanzia Software / Patch Software',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch' => 'Collegamento istanza software / patch software',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch+' => '~~',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwareinstance_id' => 'Istanza Software',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwareinstance_id' => 'Istanza software',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwareinstance_id+' => '~~',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwareinstance_name' => 'Nome dell\'Istanza Software',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwareinstance_name' => 'Nome dell\'istanza software',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwareinstance_name+' => '~~',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_id' => 'Patch Software',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_id' => 'Patch software',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_id+' => '~~',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_name' => 'Nome della Patch Software',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_name' => 'Nome della patch software',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_name+' => '~~',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Name' => '%1$s / %2$s',
|
||||
'Class:lnkSubnetToVLAN' => 'Link Subnet / VLAN',
|
||||
@@ -945,70 +945,70 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:lnkSubnetToVLAN/Attribute:subnet_id+' => '~~',
|
||||
'Class:lnkSubnetToVLAN/Attribute:subnet_ip' => 'Subnet IP',
|
||||
'Class:lnkSubnetToVLAN/Attribute:subnet_ip+' => '~~',
|
||||
'Class:lnkSubnetToVLAN/Attribute:subnet_name' => 'Nome Subnet',
|
||||
'Class:lnkSubnetToVLAN/Attribute:subnet_name' => 'Nome subnet',
|
||||
'Class:lnkSubnetToVLAN/Attribute:subnet_name+' => '~~',
|
||||
'Class:lnkSubnetToVLAN/Attribute:vlan_id' => 'VLAN',
|
||||
'Class:lnkSubnetToVLAN/Attribute:vlan_id+' => '~~',
|
||||
'Class:lnkSubnetToVLAN/Attribute:vlan_tag' => 'VLAN Tag',
|
||||
'Class:lnkSubnetToVLAN/Attribute:vlan_tag' => 'VLAN tag',
|
||||
'Class:lnkSubnetToVLAN/Attribute:vlan_tag+' => '~~',
|
||||
'Class:lnkSubnetToVLAN/Name' => '%1$s / %2$s',
|
||||
'Class:lnkVirtualDeviceToVolume' => 'Collegamento Dispositivo Virtuale / Volume',
|
||||
'Class:lnkVirtualDeviceToVolume' => 'Collegamento dispositivo virtuale / volume',
|
||||
'Class:lnkVirtualDeviceToVolume+' => '~~',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:size_used' => 'Dimensione utilizzata',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:size_used+' => '~~',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:virtualdevice_id' => 'Dispositivo Virtuale',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:virtualdevice_id' => 'Dispositivo virtuale',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:virtualdevice_id+' => '~~',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:virtualdevice_name' => 'Nome del Dispositivo Virtuale',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:virtualdevice_name' => 'Nome del dispositivo virtuale',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:virtualdevice_name+' => '~~',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_id' => 'Volume',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_id+' => '~~',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_name' => 'Nome del Volume',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_name' => 'Nome del volume',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_name+' => '~~',
|
||||
'Class:lnkVirtualDeviceToVolume/Name' => '%1$s / %2$s',
|
||||
'Menu:Application' => 'Applicazioni',
|
||||
'Menu:Application+' => 'Tutte le applicazioni',
|
||||
'Menu:ApplicationInstance' => 'Installazioni Applicazioni',
|
||||
'Menu:ApplicationInstance+' => 'Applicazioni e Server di Database',
|
||||
'Menu:ApplicationSolution' => 'Soluzioni Applicative',
|
||||
'Menu:ApplicationSolution+' => 'Tutte le Soluzioni Applicative',
|
||||
'Menu:BusinessProcess' => 'Processi Aziendali',
|
||||
'Menu:BusinessProcess+' => 'Tutti i Processi Aziendali',
|
||||
'Menu:ApplicationInstance' => 'Installazioni applicazioni',
|
||||
'Menu:ApplicationInstance+' => 'Applicazioni e server di database',
|
||||
'Menu:ApplicationSolution' => 'Soluzioni applicative',
|
||||
'Menu:ApplicationSolution+' => 'Tutte le soluzioni applicative',
|
||||
'Menu:BusinessProcess' => 'Processi aziendali',
|
||||
'Menu:BusinessProcess+' => 'Tutti i processi aziendali',
|
||||
'Menu:ConfigManagement:AllDevices' => 'Infrastrutture',
|
||||
'Menu:ConfigManagement:Devices' => 'Dispositivi',
|
||||
'Menu:ConfigManagement:EndUsers' => 'Dispositivi utente finale',
|
||||
'Menu:ConfigManagement:Misc' => 'Varie',
|
||||
'Menu:ConfigManagement:SWAndApps' => 'Software e Applicazioni',
|
||||
'Menu:ConfigManagement:SWAndApps' => 'Software e applicazioni',
|
||||
'Menu:ConfigManagement:virtualization' => 'Virtualizzazione',
|
||||
'Menu:ConfigManagementHardware' => 'Gestione Hardware',
|
||||
'Menu:ConfigManagementSoftware' => 'Gestione del Software',
|
||||
'Menu:ConfigManagementHardware' => 'Gestione hardware',
|
||||
'Menu:ConfigManagementSoftware' => 'Gestione software',
|
||||
'Menu:DBServer' => 'Server di Database',
|
||||
'Menu:DBServer+' => 'Server di Database',
|
||||
'Menu:Group' => 'Gruppi CI',
|
||||
'Menu:Group+' => 'Gruppi CI',
|
||||
'Menu:Licence' => 'Licenze',
|
||||
'Menu:Licence+' => 'Tutte le Licenze',
|
||||
'Menu:MobilePhone' => 'Telefoni Cellulari',
|
||||
'Menu:MobilePhone+' => 'Tutti i Telefoni Cellulari',
|
||||
'Menu:NetworkDevice' => 'Dispositivi di Rete',
|
||||
'Menu:NetworkDevice+' => 'Tutti i Dispositivi di Rete',
|
||||
'Menu:Licence+' => 'Tutte le licenze',
|
||||
'Menu:MobilePhone' => 'Telefoni cellulari',
|
||||
'Menu:MobilePhone+' => 'Tutti i telefoni cellulari',
|
||||
'Menu:NetworkDevice' => 'Dispositivi di rete',
|
||||
'Menu:NetworkDevice+' => 'Tutti i dispositivi di rete',
|
||||
'Menu:NewCI' => 'Nuovo CI',
|
||||
'Menu:NewCI+' => 'Nuovo CI',
|
||||
'Menu:OSVersion' => 'Versioni OS',
|
||||
'Menu:OSVersion+' => '~~',
|
||||
'Menu:PC' => 'Personal Computers',
|
||||
'Menu:PC+' => 'Tutti i Personal Computers',
|
||||
'Menu:PC' => 'Personal Computer',
|
||||
'Menu:PC+' => 'Tutti i Personal Computer',
|
||||
'Menu:Patch' => 'Patch',
|
||||
'Menu:Patch+' => 'Tutte le Patch',
|
||||
'Menu:Patch+' => 'Tutte le patch',
|
||||
'Menu:Printer' => 'Stampanti',
|
||||
'Menu:Printer+' => 'Tutte le Stampanti',
|
||||
'Menu:Printer+' => 'Tutte le stampanti',
|
||||
'Menu:SearchCIs' => 'Ricerca CI',
|
||||
'Menu:SearchCIs+' => 'Ricerca CI',
|
||||
'Menu:Server' => 'Server',
|
||||
'Menu:Server+' => 'Tutti i Server',
|
||||
'Menu:Software' => 'Catalogo Software',
|
||||
'Menu:Software+' => 'Catalogo Software',
|
||||
'Menu:Server+' => 'Tutti i server',
|
||||
'Menu:Software' => 'Catalogo software',
|
||||
'Menu:Software+' => 'Catalogo software',
|
||||
'Menu:Subnet' => 'Subnet',
|
||||
'Menu:Subnet+' => 'Tutte le Subnet',
|
||||
'Menu:Subnet+' => 'Tutte le subnet',
|
||||
'Relation:depends on/Description' => 'Elementi di questo elemento dipende da',
|
||||
'Relation:depends on/DownStream' => 'Dipende da...',
|
||||
'Relation:depends on/UpStream' => 'Impatto...',
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -17,9 +17,9 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'config-confirm-cancel' => 'Le tue modifiche andranno perse.',
|
||||
'config-current-line' => 'Modifica linea: %1$s',
|
||||
'config-edit-intro' => 'Prestare molta attenzione durante la modifica del file di configurazione.',
|
||||
'config-edit-title' => 'Editor del File di Configurazione',
|
||||
'config-error-file-changed' => 'Errore: Il file di Configurazione è stato modificato da quando lo hai aperto e non può essere salvato. Aggiorna e applica nuovamente le tue modifiche.',
|
||||
'config-error-transaction' => 'Errore: ID di Transazione non valido. La configurazione <b>NON</b> è stata modificata.',
|
||||
'config-edit-title' => 'Modifica file di configurazione',
|
||||
'config-error-file-changed' => 'Errore: il file di configurazione è stato modificato da quando lo hai aperto e non può essere salvato. Aggiorna e applica nuovamente le tue modifiche.',
|
||||
'config-error-transaction' => 'Errore: ID transazione non valido. La configurazione <b>NON</b> è stata modificata.',
|
||||
'config-interactive-not-allowed' => 'La modifica interattiva della configurazione di '.ITOP_APPLICATION_SHORT.' è stata disabilitata. Vedere <code>\'config_editor\' => \'disabled\'</code> nel file di configurazione.',
|
||||
'config-no-change' => 'Nessun cambiamento: il file è rimasto invariato.',
|
||||
'config-not-allowed-in-demo' => 'Spiacente, '.ITOP_APPLICATION_SHORT.' è in <b>modalità dimostrativa</b>: il file di configurazione non può essere modificato.',
|
||||
|
||||
@@ -4,27 +4,40 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
'Menu:ConfigEditor' => '编辑配置文件',
|
||||
'config-edit-title' => '配置文件编辑器',
|
||||
'config-edit-intro' => '编辑配置文件时请务必格外小心.',
|
||||
'config-apply' => '应用',
|
||||
'config-apply-title' => '应用 (Ctrl+S)',
|
||||
'config-cancel' => '重置',
|
||||
'config-confirm-cancel' => '您的修改将被丢弃.',
|
||||
'config-current-line' => '正在编辑第%1$s行',
|
||||
'config-edit-intro' => '编辑配置文件时请务必格外小心.',
|
||||
'config-edit-title' => '配置文件编辑器',
|
||||
'config-error-file-changed' => '错误: 配置文件在您打开以后已被更改, 无法保存. 请刷新并再次保存.',
|
||||
'config-error-transaction' => '错误: 无效的事务编号. 配置<b>没有</b>被更新.',
|
||||
'config-interactive-not-allowed' => ITOP_APPLICATION_SHORT.'交互式配置编辑器已禁用. 请在配置文件中查看 <code>\'config_editor\' => \'disabled\'</code>.',
|
||||
'config-no-change' => '没有变化: 配置文件将保持不变.',
|
||||
'config-not-allowed-in-demo' => '抱歉, '.ITOP_APPLICATION_SHORT.'处于<b>演示模式</b>: 不能编辑配置文件.',
|
||||
'config-parse-error' => '第%2$d行: %1$s.<br/>配置文件尚未更新.',
|
||||
'config-reverted' => '配置文件已恢复.',
|
||||
'config-saved' => '保存成功.',
|
||||
'config-confirm-cancel' => '您的修改将被丢弃.',
|
||||
'config-no-change' => '没有变化: 配置文件将保持不变.',
|
||||
'config-reverted' => '配置文件已恢复.',
|
||||
'config-parse-error' => '第%2$d行: %1$s.<br/>配置文件尚未更新.',
|
||||
'config-current-line' => '正在编辑第%1$s行',
|
||||
'config-saved-warning-db-password' => '保存成功, 但因为数据库密码中包含不支持的字符, 配置文件备份不会成功.',
|
||||
'config-error-transaction' => '错误: 无效的事务编号. 配置<b>没有</b>被更新.',
|
||||
'config-error-file-changed' => '错误: 配置文件在您打开以后已被更改, 无法保存. 请刷新并再次保存.',
|
||||
'config-not-allowed-in-demo' => '抱歉, '.ITOP_APPLICATION_SHORT.'处于<b>演示模式</b>: 不能编辑配置文件.',
|
||||
'config-interactive-not-allowed' => ITOP_APPLICATION_SHORT.'交互式配置编辑器已禁用. 请在配置文件中查看 <code>\'config_editor\' => \'disabled\'</code>.',
|
||||
]);
|
||||
|
||||
@@ -4,94 +4,123 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ModuleInstallation/Attribute:comment' => '备注',
|
||||
'Class:ModuleInstallation/Attribute:installed' => '安装时间',
|
||||
'Class:ModuleInstallation/Attribute:name' => '名称',
|
||||
'Class:ModuleInstallation/Attribute:version' => '版本',
|
||||
'Menu:iTopUpdate' => '应用升级',
|
||||
'Menu:iTopUpdate+' => '应用升级',
|
||||
'iTopUpdate:Error:BadFileContent' => '升级文件不是程序升级包',
|
||||
'iTopUpdate:Error:BadFileFormat' => '上传的不是zip格式的文件',
|
||||
'iTopUpdate:Error:BadItopProduct' => '升级文件与您的系统不兼容',
|
||||
'iTopUpdate:Error:Copy' => '错误, 无法复制 \'%1$s\' 到 \'%2$s\'',
|
||||
'iTopUpdate:Error:CorruptedFile' => '文件%1$s已损坏',
|
||||
'iTopUpdate:Error:FileNotFound' => '文件找不到',
|
||||
'iTopUpdate:Error:FileUploadMaxSizeTooSmall' => '上传上限太小. 请调整PHP配置.',
|
||||
'iTopUpdate:Error:InvalidToken' => '无效的token',
|
||||
'iTopUpdate:Error:MissingFile' => '缺少文件: %1$s',
|
||||
'iTopUpdate:Error:MissingFunction' => '无法开始升级, 功能缺失',
|
||||
'iTopUpdate:Error:NoFile' => '没有提供文件',
|
||||
'iTopUpdate:Error:UpdateFailed' => '升级失败',
|
||||
'iTopUpdate:UI:Action' => '升级',
|
||||
'iTopUpdate:UI:Back' => '返回',
|
||||
'iTopUpdate:UI:Backup' => '升级之前执行备份',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Error' => '文件系统检查失败 (%1$s)',
|
||||
'iTopUpdate:UI:CanCoreUpdate:ErrorFileNotExist' => '文件系统检查失败 (%1$s文件不存在)',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Failed' => '文件系统检查失败',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Loading' => '正在文件系统',
|
||||
'iTopUpdate:UI:CanCoreUpdate:No' => '应用无法升级: %1$s',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Warning' => '警告: 应用升级可能失败: %1$s',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Yes' => '应用无法升级',
|
||||
'iTopUpdate:UI:Cancel' => '取消',
|
||||
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>检测到一些文件被修改</b>, 无法进行局部升级.</br>请按照<a target="_blank" href="%2$s">指南</a>一步步操作以手动升级系统. 您必须使用<a href="%1$s">安装</a>已升级应用.',
|
||||
'iTopUpdate:UI:CheckInProgress' => '完整性检查中, 请稍后',
|
||||
'iTopUpdate:UI:CheckUpdate' => '校验升级文件',
|
||||
'iTopUpdate:UI:ConfirmInstallFile' => '即将安装%1$s',
|
||||
'iTopUpdate:UI:Continue' => '继续',
|
||||
'iTopUpdate:UI:CurrentVersion' => '当前版本',
|
||||
'iTopUpdate:UI:DBDiskSpace' => '数据库的磁盘空间',
|
||||
'iTopUpdate:UI:DiskFreeSpace' => '磁盘剩余空间',
|
||||
'iTopUpdate:UI:DoBackup:Label' => '备份文件和数据库',
|
||||
'iTopUpdate:UI:DoBackup:Warning' => '由于磁盘空间不足, 不建议备份',
|
||||
'iTopUpdate:UI:DoFilesArchive' => '打包应用文件',
|
||||
'iTopUpdate:UI:DoUpdate' => '升级',
|
||||
'iTopUpdate:UI:FileUploadMaxSize' => '文件上传大小上限',
|
||||
'iTopUpdate:UI:History' => '版本历史',
|
||||
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.'的磁盘空间',
|
||||
'iTopUpdate:UI:MaintenanceModeActive' => '此应用当前维护中, 不允许任何用户访问. 必须运行安装或恢复归档来使其处于正常模式.',
|
||||
'iTopUpdate:UI:NewVersion' => '新安装的版本',
|
||||
'iTopUpdate:UI:PageTitle' => '应用升级',
|
||||
'iTopUpdate:UI:PostMaxSize' => 'PHP ini值post_max_size: %1$s',
|
||||
'iTopUpdate:UI:Progress' => '升级进度',
|
||||
'iTopUpdate:UI:RestoreArchive' => '您可以从归档文件 \'%1$s\' 还原应用程序',
|
||||
'iTopUpdate:UI:RestoreBackup' => '您可以从 \'%1$s\' 还原数据库',
|
||||
'iTopUpdate:UI:RunSetup' => '运行向导',
|
||||
'itop-core-update:UI:SelectUpdateFile' => '应用升级',
|
||||
'itop-core-update:UI:ConfirmUpdate' => ' 升级',
|
||||
'itop-core-update:UI:UpdateCoreFiles' => '应用升级',
|
||||
'iTopUpdate:UI:MaintenanceModeActive' => '此应用当前维护中, 不允许任何用户访问. 必须运行安装或恢复归档来使其处于正常模式.',
|
||||
'itop-core-update:UI:UpdateDone' => '应用升级',
|
||||
|
||||
'itop-core-update/Operation:SelectUpdateFile/Title' => '应用升级',
|
||||
'itop-core-update/Operation:ConfirmUpdate/Title' => '请确认升级应用',
|
||||
'itop-core-update/Operation:UpdateCoreFiles/Title' => '应用正在升级',
|
||||
'itop-core-update/Operation:UpdateDone/Title' => '应用升级完毕',
|
||||
|
||||
'iTopUpdate:UI:SelectUpdateFile' => '请选择要上传的升级文件',
|
||||
'iTopUpdate:UI:ServerFile' => '服务器上的软件包路径已存在',
|
||||
'iTopUpdate:UI:Setup' => ITOP_APPLICATION_SHORT.'安装',
|
||||
'iTopUpdate:UI:SetupLaunch' => '启动'.ITOP_APPLICATION_SHORT.'安装',
|
||||
'iTopUpdate:UI:SetupLaunchConfirm' => '将启动'.ITOP_APPLICATION_SHORT.'安装, 确定吗?',
|
||||
'iTopUpdate:UI:FastSetupLaunch' => 'Fast Setup~~',
|
||||
'iTopUpdate:UI:SetupMessage:Backup' => '数据库备份',
|
||||
'iTopUpdate:UI:SetupMessage:CheckCompile' => '检查更新',
|
||||
'iTopUpdate:UI:SetupMessage:Compile' => '升级应用程序和数据库',
|
||||
'iTopUpdate:UI:SetupMessage:CopyFiles' => '复制新文件',
|
||||
'iTopUpdate:UI:SetupMessage:EnterMaintenance' => '正在进入维护模式',
|
||||
'iTopUpdate:UI:SetupMessage:ExitMaintenance' => '正在退出维护模式',
|
||||
'iTopUpdate:UI:SetupMessage:FilesArchive' => '打包应用文件',
|
||||
'iTopUpdate:UI:SetupMessage:Ready' => '准备开始',
|
||||
'iTopUpdate:UI:SetupMessage:UpdateDatabase' => '升级数据库',
|
||||
'iTopUpdate:UI:SetupMessage:UpdateDone' => '升级完成',
|
||||
'iTopUpdate:UI:Status' => '状态',
|
||||
'iTopUpdate:UI:UpdateDone' => '升级成功',
|
||||
'iTopUpdate:UI:UploadArchive' => '请选择要上传的软件包',
|
||||
'iTopUpdate:UI:UploadMaxFileSize' => 'PHP ini值upload_max_filesize: %1$s',
|
||||
'iTopUpdate:UI:WarningReadOnlyDuringUpdate' => '升级期间, 应用会变成只读状态.',
|
||||
'iTopUpdate:UI:CheckUpdate' => '校验升级文件',
|
||||
'iTopUpdate:UI:ConfirmInstallFile' => '即将安装 %1$s',
|
||||
'iTopUpdate:UI:DoUpdate' => '升级',
|
||||
'iTopUpdate:UI:CurrentVersion' => '当前版本',
|
||||
'iTopUpdate:UI:NewVersion' => '新安装的版本',
|
||||
'iTopUpdate:UI:Back' => '返回',
|
||||
'iTopUpdate:UI:Cancel' => '取消',
|
||||
'iTopUpdate:UI:Continue' => '继续',
|
||||
'iTopUpdate:UI:RunSetup' => '运行向导',
|
||||
'iTopUpdate:UI:WithDBBackup' => '数据库备份',
|
||||
'iTopUpdate:UI:WithFilesBackup' => '应用文件备份',
|
||||
'iTopUpdate:UI:WithoutBackup' => '无需备份',
|
||||
'itop-core-update/Operation:ConfirmUpdate/Title' => '请确认升级应用',
|
||||
'itop-core-update/Operation:SelectUpdateFile/Title' => '应用升级',
|
||||
'itop-core-update/Operation:UpdateCoreFiles/Title' => '应用正在升级',
|
||||
'itop-core-update/Operation:UpdateDone/Title' => '应用升级完毕',
|
||||
'itop-core-update:UI:ConfirmUpdate' => ' 升级',
|
||||
'itop-core-update:UI:SelectUpdateFile' => '应用升级',
|
||||
'itop-core-update:UI:UpdateCoreFiles' => '应用升级',
|
||||
'itop-core-update:UI:UpdateDone' => '应用升级',
|
||||
'iTopUpdate:UI:Backup' => '升级之前执行备份',
|
||||
'iTopUpdate:UI:DoFilesArchive' => '打包应用文件',
|
||||
'iTopUpdate:UI:UploadArchive' => '请选择要上传的软件包',
|
||||
'iTopUpdate:UI:ServerFile' => '服务器上的软件包路径已存在',
|
||||
'iTopUpdate:UI:WarningReadOnlyDuringUpdate' => '升级期间, 应用会变成只读状态.',
|
||||
|
||||
'iTopUpdate:UI:Status' => '状态',
|
||||
'iTopUpdate:UI:Action' => '升级',
|
||||
'iTopUpdate:UI:Setup' => ITOP_APPLICATION_SHORT.'安装',
|
||||
'iTopUpdate:UI:History' => '版本历史',
|
||||
'iTopUpdate:UI:Progress' => '升级进度',
|
||||
|
||||
'iTopUpdate:UI:DoBackup:Label' => '备份文件和数据库',
|
||||
'iTopUpdate:UI:DoBackup:Warning' => '由于磁盘空间不足, 不建议备份',
|
||||
|
||||
'iTopUpdate:UI:DiskFreeSpace' => '磁盘剩余空间',
|
||||
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.'的磁盘空间',
|
||||
'iTopUpdate:UI:DBDiskSpace' => '数据库的磁盘空间',
|
||||
'iTopUpdate:UI:FileUploadMaxSize' => '文件上传大小上限',
|
||||
|
||||
'iTopUpdate:UI:PostMaxSize' => 'PHP ini值post_max_size: %1$s',
|
||||
'iTopUpdate:UI:UploadMaxFileSize' => 'PHP ini 值 upload_max_filesize: %1$s',
|
||||
|
||||
'iTopUpdate:UI:CanCoreUpdate:Loading' => '正在检查文件',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Error' => '文件检查失败 (%1$s)',
|
||||
'iTopUpdate:UI:CanCoreUpdate:ErrorFileNotExist' => '文件检查失败 (%1$s 文件不存在)',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Failed' => '文件检查失败',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Yes' => '应用可以升级',
|
||||
'iTopUpdate:UI:CanCoreUpdate:No' => '应用无法升级: %1$s',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Warning' => '警告: 应用升级可能失败: %1$s',
|
||||
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>检测到一些文件被修改</b>, 无法进行局部升级.</br>请按照<a target="_blank" href="%2$s">指南</a>一步步操作以手动升级系统. 您必须使用<a href="%1$s">安装</a>已升级应用.',
|
||||
'iTopUpdate:UI:CheckInProgress' => '完整性检查中, 请稍候',
|
||||
|
||||
|
||||
|
||||
'iTopUpdate:UI:SetupLaunch' => '启动'.ITOP_APPLICATION_SHORT.'安装',
|
||||
'iTopUpdate:UI:SetupLaunchConfirm' => '将启动'.ITOP_APPLICATION_SHORT.'安装, 确定吗?',
|
||||
|
||||
// Setup Messages
|
||||
'iTopUpdate:UI:SetupMessage:Ready' => '准备开始',
|
||||
'iTopUpdate:UI:SetupMessage:EnterMaintenance' => '正在进入维护模式',
|
||||
'iTopUpdate:UI:SetupMessage:Backup' => '数据库备份',
|
||||
'iTopUpdate:UI:SetupMessage:FilesArchive' => '打包应用文件',
|
||||
'iTopUpdate:UI:SetupMessage:CopyFiles' => '复制新文件',
|
||||
'iTopUpdate:UI:SetupMessage:CheckCompile' => '检查更新',
|
||||
'iTopUpdate:UI:SetupMessage:Compile' => '升级应用程序和数据库',
|
||||
'iTopUpdate:UI:SetupMessage:UpdateDatabase' => '升级数据库',
|
||||
'iTopUpdate:UI:SetupMessage:ExitMaintenance' => '正在退出维护模式',
|
||||
'iTopUpdate:UI:SetupMessage:UpdateDone' => '升级完成',
|
||||
|
||||
// Errors
|
||||
'iTopUpdate:Error:MissingFunction' => '无法开始升级, 功能缺失',
|
||||
'iTopUpdate:Error:MissingFile' => '缺少文件: %1$s',
|
||||
'iTopUpdate:Error:CorruptedFile' => '文件 %1$s 已损坏',
|
||||
'iTopUpdate:Error:BadFileFormat' => '升级包不是 zip 格式',
|
||||
'iTopUpdate:Error:BadFileContent' => '文件不是程序升级包',
|
||||
'iTopUpdate:Error:BadItopProduct' => '升级包与您的系统不兼容',
|
||||
'iTopUpdate:Error:Copy' => '错误, 无法复制 \'%1$s\' 到 \'%2$s\'',
|
||||
'iTopUpdate:Error:FileNotFound' => '文件找不到',
|
||||
'iTopUpdate:Error:NoFile' => '没有提供文件',
|
||||
'iTopUpdate:Error:InvalidToken' => '无效的 token',
|
||||
'iTopUpdate:Error:UpdateFailed' => '升级失败',
|
||||
'iTopUpdate:Error:FileUploadMaxSizeTooSmall' => '上传上限太小. 请调整 PHP 配置.',
|
||||
|
||||
'iTopUpdate:UI:RestoreArchive' => '您可以从归档文件 \'%1$s\' 还原应用程序',
|
||||
'iTopUpdate:UI:RestoreBackup' => '您可以从 \'%1$s\' 还原数据库',
|
||||
'iTopUpdate:UI:UpdateDone' => '升级成功',
|
||||
'Menu:iTopUpdate' => '应用升级',
|
||||
'Menu:iTopUpdate+' => '应用升级',
|
||||
|
||||
// Missing itop entries
|
||||
'Class:ModuleInstallation/Attribute:installed' => '安装时间',
|
||||
'Class:ModuleInstallation/Attribute:name' => '名称',
|
||||
'Class:ModuleInstallation/Attribute:version' => '版本',
|
||||
'Class:ModuleInstallation/Attribute:comment' => '备注',
|
||||
]);
|
||||
|
||||
|
||||
|
||||
@@ -120,6 +120,8 @@ $("#launch-fast-setup").on("click", function(e) {
|
||||
var oMessage = $("#fast-setup-alert");
|
||||
var oContent = $("#fast-setup-content");
|
||||
oMessage.removeClass("ibo-is-hidden");
|
||||
oMessage.removeClass("ibo-is-failure");
|
||||
oMessage.removeClass("ibo-is-success");
|
||||
oMessage.addClass("ibo-is-information");
|
||||
oContent.html("{{ 'iTopUpdate:UI:SetupMessage:Compile'|dict_s }}");
|
||||
|
||||
@@ -134,20 +136,29 @@ $("#launch-fast-setup").on("click", function(e) {
|
||||
route: "core_update_ajax.rebuild_toolkit_environment"
|
||||
},
|
||||
dataType: "json",
|
||||
complete: function(jqXHR, textStatus) {
|
||||
$("#fast-setup-wait").addClass("ibo-is-hidden");
|
||||
$("#launch-fast-setup").prop("disabled", false);
|
||||
fast_setup_wait.addClass("ibo-is-hidden");
|
||||
},
|
||||
success: function (data) {
|
||||
oMessage.removeClass("ibo-is-information");
|
||||
|
||||
if (data.bStatus) {
|
||||
oMessage.removeClass("ibo-is-failure");
|
||||
oMessage.addClass("ibo-is-success");
|
||||
oContent.html("{{ 'iTopUpdate:UI:SetupMessage:UpdateDone'|dict_s }}");
|
||||
} else {
|
||||
oMessage.removeClass("ibo-is-success");
|
||||
oMessage.addClass("ibo-is-failure");
|
||||
oContent.html(data.sError);
|
||||
}
|
||||
|
||||
$("#fast-setup-wait").addClass("ibo-is-hidden");
|
||||
$("#launch-fast-setup").prop("disabled", false);
|
||||
fast_setup_wait.addClass("ibo-is-hidden");
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown) {
|
||||
oMessage.removeClass("ibo-is-information");
|
||||
oMessage.removeClass("ibo-is-success");
|
||||
oMessage.addClass("ibo-is-failure");
|
||||
oContent.html(textStatus + ' ' + errorThrown);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
|
||||
// Dictionary entries go here
|
||||
));
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
|
||||
// Dictionary entries go here
|
||||
));
|
||||
|
||||
@@ -4,43 +4,93 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>
|
||||
// Class:<class_name>/Attribute:<attribute_code>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Classes in 'bizmodel'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>
|
||||
// Class:<class_name>/Attribute:<attribute_code>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: FAQ
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Brick:Portal:FAQ:Menu' => 'FAQ',
|
||||
'Brick:Portal:FAQ:Title' => 'FAQ',
|
||||
'Brick:Portal:FAQ:Title+' => '<p>需要帮助?</p><p>查阅列表中的常见问题, 或许可以立即找到令您满意的答案.</p>',
|
||||
'Class:FAQ' => 'FAQ',
|
||||
'Class:FAQ+' => 'FAQ',
|
||||
'Class:FAQ+' => '常见问题',
|
||||
'Class:FAQ/Attribute:title' => '标题',
|
||||
'Class:FAQ/Attribute:title+' => '',
|
||||
'Class:FAQ/Attribute:summary' => '概要',
|
||||
'Class:FAQ/Attribute:summary+' => '',
|
||||
'Class:FAQ/Attribute:description' => '描述',
|
||||
'Class:FAQ/Attribute:description+' => '',
|
||||
'Class:FAQ/Attribute:category_id' => '类别',
|
||||
'Class:FAQ/Attribute:category_id+' => '',
|
||||
'Class:FAQ/Attribute:category_name' => '类别名称',
|
||||
'Class:FAQ/Attribute:category_name+' => '',
|
||||
'Class:FAQ/Attribute:description' => '描述',
|
||||
'Class:FAQ/Attribute:description+' => '',
|
||||
'Class:FAQ/Attribute:domains' => '范围',
|
||||
'Class:FAQ/Attribute:error_code' => '错误编码',
|
||||
'Class:FAQ/Attribute:error_code+' => '',
|
||||
'Class:FAQ/Attribute:key_words' => '关键字',
|
||||
'Class:FAQ/Attribute:key_words+' => '',
|
||||
'Class:FAQ/Attribute:summary' => '概要',
|
||||
'Class:FAQ/Attribute:summary+' => '',
|
||||
'Class:FAQ/Attribute:title' => '标题',
|
||||
'Class:FAQ/Attribute:title+' => '',
|
||||
'Class:FAQCategory' => 'FAQ类别',
|
||||
'Class:FAQCategory+' => 'FAQ类别',
|
||||
'Class:FAQCategory/Attribute:faq_list' => 'FAQ',
|
||||
'Class:FAQCategory/Attribute:faq_list+' => '此类别FAQ相关的所有常见问题',
|
||||
'Class:FAQ/Attribute:domains' => '范围',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: FAQCategory
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:FAQCategory' => 'FAQ 类别',
|
||||
'Class:FAQCategory+' => 'FAQ 类别',
|
||||
'Class:FAQCategory/Attribute:name' => '名称',
|
||||
'Class:FAQCategory/Attribute:name+' => '',
|
||||
'Menu:FAQ' => 'FAQ',
|
||||
'Menu:FAQ+' => '所有FAQ',
|
||||
'Menu:FAQCategory' => 'FAQ类别',
|
||||
'Menu:FAQCategory+' => '所有FAQ类别',
|
||||
'Menu:Problem:Shortcuts' => '快捷方式',
|
||||
'Class:FAQCategory/Attribute:faq_list' => 'FAQ',
|
||||
'Class:FAQCategory/Attribute:faq_list+' => '此类别 FAQ 相关的所有常见问题',
|
||||
]);
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ProblemManagement' => '问题管理',
|
||||
'Menu:ProblemManagement+' => '问题管理',
|
||||
'Menu:Problem:Shortcuts' => '快捷方式',
|
||||
'Menu:FAQCategory' => 'FAQ 类别',
|
||||
'Menu:FAQCategory+' => '所有 FAQ 类别',
|
||||
'Menu:FAQ' => 'FAQ',
|
||||
'Menu:FAQ+' => '所有 FAQ',
|
||||
'Brick:Portal:FAQ:Menu' => 'FAQ',
|
||||
'Brick:Portal:FAQ:Title' => '常见问题',
|
||||
'Brick:Portal:FAQ:Title+' => '<p>需要帮助?</p><p>查阅列表中的常见问题, 或许可以立即找到令您满意的答案.</p>',
|
||||
]);
|
||||
|
||||
@@ -4,14 +4,29 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'FilesInformation:Error:CantWriteToFile' => '文件%1$s无法写入',
|
||||
'FilesInformation:Error:CorruptedFile' => '文件%1$s已损坏',
|
||||
'FilesInformation:Error:ListCorruptedFile' => '已损坏的文件: %1$s',
|
||||
// Errors
|
||||
'FilesInformation:Error:MissingFile' => '文件丢失: %1$s',
|
||||
'FilesInformation:Error:CorruptedFile' => '文件 %1$s 已损坏',
|
||||
'FilesInformation:Error:ListCorruptedFile' => '已损坏的文件: %1$s',
|
||||
'FilesInformation:Error:CantWriteToFile' => '文件 %1$s 无法写入',
|
||||
]);
|
||||
|
||||
|
||||
|
||||
@@ -4,64 +4,84 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
// Dictionary entries go here
|
||||
'Menu:iTopHub' => 'iTop Hub',
|
||||
'Menu:iTopHub:Register' => '进入iTop Hub',
|
||||
'Menu:iTopHub:Register+' => '进入iTop Hub 更新您的组件',
|
||||
'Menu:iTopHub:Register:Description' => '<p>进入iTop Hub社区平台!</br>寻找您想要的内容和信息, 管理本机扩展或安装新的扩展.</br><br/>通过这个页面连接到iTop Hub, 本机的信息也会被推送到iTop Hub上.</p>',
|
||||
'Menu:iTopHub:MyExtensions' => '已安装的扩展',
|
||||
'Menu:iTopHub:MyExtensions+' => '查看本机已安装的扩展',
|
||||
'Menu:iTopHub:BrowseExtensions' => '从iTop Hub获取扩展',
|
||||
'Menu:iTopHub:BrowseExtensions+' => '去iTop Hub浏览更多的扩展',
|
||||
'Menu:iTopHub:BrowseExtensions:Description' => '<p>进入iTop Hub商店, 一站式查找各种iTop扩展的地方 !</br>寻找符合您要求的扩展.</br><br/>通过这个页面连接到iTop Hub, 本机的信息也会被推送到iTop Hub上.</p>',
|
||||
'Menu:iTopHub:MyExtensions' => '已安装的扩展',
|
||||
'Menu:iTopHub:MyExtensions+' => '查看本机已安装的扩展',
|
||||
'Menu:iTopHub:Register' => '进入iTop Hub',
|
||||
'Menu:iTopHub:Register+' => '进入iTop Hub更新您的组件',
|
||||
'Menu:iTopHub:Register:Description' => '<p>进入iTop Hub社区平台!</br>寻找您想要的内容和信息, 管理本机扩展或安装新的扩展.</br><br/>通过这个页面连接到iTop Hub, 本机的信息也会被推送到iTop Hub上.</p>',
|
||||
'UI:About:RemoteExtensionSource' => 'iTop Hub',
|
||||
'iTopHub:AutoSubmit' => '不再询问. 下次自动进入iTop Hub.',
|
||||
'iTopHub:BackupFailed' => '备份失败!',
|
||||
'iTopHub:BackupFreeDiskSpaceIn' => '%1$s可用磁盘空间位于%2$s.',
|
||||
'iTopHub:BackupOk' => '备份成功.',
|
||||
'iTopHub:GoBtn' => '进入 iTop Hub',
|
||||
'iTopHub:CloseBtn' => '关闭',
|
||||
'iTopHub:GoBtn:Tooltip' => '跳到 www.itophub.io',
|
||||
'iTopHub:OpenInNewWindow' => '从新窗口打开iTop Hub',
|
||||
'iTopHub:AutoSubmit' => '不再询问. 下次自动进入iTop Hub.',
|
||||
'UI:About:RemoteExtensionSource' => 'iTop Hub',
|
||||
'iTopHub:Explanation' => '点击这个按钮您将被引导至iTop Hub.',
|
||||
|
||||
'iTopHub:BackupFreeDiskSpaceIn' => '%1$s 可用磁盘空间位于 %2$s.',
|
||||
'iTopHub:FailedToCheckFreeDiskSpace' => '检查可用磁盘空间失败.',
|
||||
'iTopHub:BackupOk' => '备份成功.',
|
||||
'iTopHub:BackupFailed' => '备份失败!',
|
||||
'iTopHub:Landing:Status' => '部署状态',
|
||||
'iTopHub:Landing:Install' => '扩展安装进行中...',
|
||||
'iTopHub:CompiledOK' => '编译成功.',
|
||||
'iTopHub:ConfigurationSafelyReverted' => '安装时发生错误!<br/>系统配置将不会改变.',
|
||||
'iTopHub:FailAuthent' => '认证失败.',
|
||||
|
||||
'iTopHub:InstalledExtensions' => '本机已安装的扩展',
|
||||
'iTopHub:ExtensionCategory:Manual' => '手动安装的扩展',
|
||||
'iTopHub:ExtensionCategory:Manual+' => '下列已安装的扩展是手动将文件放置到 %1$s 目录的:',
|
||||
'iTopHub:ExtensionCategory:Remote' => '从 iTop Hub 安装的扩展',
|
||||
'iTopHub:ExtensionCategory:Remote+' => '下列已安装的扩展是来自 iTop Hub:',
|
||||
'iTopHub:NoExtensionInThisCategory' => '尚未安装扩展',
|
||||
'iTopHub:NoExtensionInThisCategory+' => '浏览 iTop Hub, 去寻找符合您喜欢的扩展吧.',
|
||||
'iTopHub:ExtensionNotInstalled' => '未安装',
|
||||
'iTopHub:GetMoreExtensions' => '从 iTop Hub 获取扩展...',
|
||||
|
||||
'iTopHub:LandingWelcome' => '恭喜! 下列来自 iTop Hub 的扩展已被下载并安装到本机.',
|
||||
'iTopHub:GoBackToITopBtn' => '返回'.ITOP_APPLICATION_SHORT,
|
||||
'iTopHub:Uncompressing' => '扩展解压中...',
|
||||
'iTopHub:InstallationWelcome' => '安装来自 iTop Hub 的扩展',
|
||||
'iTopHub:DBBackupLabel' => '本机备份',
|
||||
'iTopHub:DBBackupSentence' => '在升级之前,备份数据库和'.ITOP_APPLICATION_SHORT.'配置文件',
|
||||
'iTopHub:DatabaseBackupProgress' => '本机备份...',
|
||||
'iTopHub:DeployBtn' => '安装!',
|
||||
'iTopHub:Explanation' => '点击这个按钮您将被引导至iTop Hub.',
|
||||
'iTopHub:ExtensionCategory:Manual' => '手动安装的扩展',
|
||||
'iTopHub:ExtensionCategory:Manual+' => '下列已安装的扩展是手动将文件放置到%1$s目录的:',
|
||||
'iTopHub:ExtensionCategory:Remote' => '从iTop Hub安装的扩展',
|
||||
'iTopHub:ExtensionCategory:Remote+' => '下列已安装的扩展是来自iTop Hub:',
|
||||
'iTopHub:ExtensionNotInstalled' => '未安装',
|
||||
'iTopHub:FailAuthent' => '认证失败.',
|
||||
'iTopHub:FailedToCheckFreeDiskSpace' => '检查可用磁盘空间失败.',
|
||||
'iTopHub:GetMoreExtensions' => '从iTop Hub获取扩展...',
|
||||
'iTopHub:GoBackToITopBtn' => '返回'.ITOP_APPLICATION_SHORT,
|
||||
'iTopHub:GoBtn' => '进入iTop Hub',
|
||||
'iTopHub:GoBtn:Tooltip' => '跳到www.itophub.io',
|
||||
'iTopHub:InstallationEffect:Downgrade' => '将从版本%1$s<b>降级</b>到版本%2$s.',
|
||||
'iTopHub:InstallationEffect:Install' => '版本: %1$s将被安装.',
|
||||
'iTopHub:DatabaseBackupProgress' => '实例备份...',
|
||||
|
||||
'iTopHub:InstallationEffect:Install' => '版本: %1$s 将被安装.',
|
||||
'iTopHub:InstallationEffect:NoChange' => '版本: %1$s 已安装. 保持不变.',
|
||||
'iTopHub:InstallationEffect:Upgrade' => '将从版本 %1$s <b>升级</b>到版本 %2$s.',
|
||||
'iTopHub:InstallationEffect:Downgrade' => '将从版本 %1$s <b>降级</b>到版本 %2$s.',
|
||||
'iTopHub:InstallationProgress:DatabaseBackup' => ITOP_APPLICATION_SHORT.'实例备份...',
|
||||
'iTopHub:InstallationProgress:ExtensionsInstallation' => '安装扩展',
|
||||
'iTopHub:InstallationEffect:MissingDependencies' => '扩展无法安装, 因为未知的依赖.',
|
||||
'iTopHub:InstallationEffect:MissingDependencies_Details' => '此扩展依赖模块: %1$s',
|
||||
'iTopHub:InstallationEffect:NoChange' => '版本: %1$s已安装. 保持不变.',
|
||||
'iTopHub:InstallationEffect:Upgrade' => '将从版本%1$s<b>升级</b>到版本%2$s.',
|
||||
'iTopHub:InstallationProgress:DatabaseBackup' => ITOP_APPLICATION_SHORT.'本机备份...',
|
||||
'iTopHub:InstallationProgress:ExtensionsInstallation' => '安装扩展',
|
||||
'iTopHub:InstallationProgress:InstallationSuccessful' => '安装成功!',
|
||||
|
||||
'iTopHub:InstallationStatus:Installed_Version' => '%1$s 版本: %2$s.',
|
||||
'iTopHub:InstallationStatus:Installed' => '已安装',
|
||||
'iTopHub:InstallationStatus:Installed_Version' => '%1$s版本: %2$s.',
|
||||
'iTopHub:InstallationStatus:Version_NotInstalled' => '版本%1$s<b>未</b>安装.',
|
||||
'iTopHub:InstallationWelcome' => '安装来自iTop Hub的扩展',
|
||||
'iTopHub:InstalledExtensions' => '本机已安装的扩展',
|
||||
'iTopHub:Landing:Install' => '扩展安装进行中...',
|
||||
'iTopHub:Landing:Status' => '安装状态',
|
||||
'iTopHub:LandingWelcome' => '恭喜! 下列来自iTop Hub的扩展已被下载并安装到本机.',
|
||||
'iTopHub:NoExtensionInThisCategory' => '尚未安装扩展',
|
||||
'iTopHub:NoExtensionInThisCategory+' => '浏览iTop Hub, 去寻找符合您喜欢的扩展吧.',
|
||||
'iTopHub:OpenInNewWindow' => '从新窗口打开iTop Hub',
|
||||
'iTopHub:Uncompressing' => '扩展解压中...',
|
||||
'iTopHub:InstallationStatus:Version_NotInstalled' => '版本 %1$s <b>未被</b> 安装.',
|
||||
]);
|
||||
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:Incident/Attribute:origin/Value:portal' => 'Portale',
|
||||
'Class:Incident/Attribute:origin/Value:portal+' => 'Portale',
|
||||
'Class:Incident/Attribute:parent_change_id' => 'Richiesta evoluzione padre',
|
||||
'Class:Incident/Attribute:parent_change_id+' => 'Richeista figlia',
|
||||
'Class:Incident/Attribute:parent_change_id+' => 'Richiesta figlia',
|
||||
'Class:Incident/Attribute:parent_change_ref' => 'ref evoluzione',
|
||||
'Class:Incident/Attribute:parent_change_ref+' => 'Log Pubblico',
|
||||
'Class:Incident/Attribute:parent_incident_id' => 'Incidente Padre',
|
||||
@@ -197,7 +197,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Menu:Incident:Overview+' => 'Overview',
|
||||
'Menu:Incident:Shortcuts' => 'Scorciatoie',
|
||||
'Menu:Incident:Shortcuts+' => '~~',
|
||||
'Menu:IncidentManagement' => 'Getione incidente',
|
||||
'Menu:IncidentManagement' => 'Gestione incidente',
|
||||
'Menu:IncidentManagement+' => 'Gestione incidente',
|
||||
'Menu:NewIncident' => 'Nuovo incidente',
|
||||
'Menu:NewIncident+' => 'Creare un nuovo ticket ',
|
||||
|
||||
@@ -4,70 +4,93 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:IncidentManagement' => '事件管理',
|
||||
'Menu:IncidentManagement+' => '事件管理',
|
||||
'Menu:Incident:Overview' => '概况',
|
||||
'Menu:Incident:Overview+' => '概况',
|
||||
'Menu:NewIncident' => '新建事件',
|
||||
'Menu:NewIncident+' => '新建事件工单',
|
||||
'Menu:SearchIncidents' => '搜索事件',
|
||||
'Menu:SearchIncidents+' => '搜索事件',
|
||||
'Menu:Incident:Shortcuts' => '快捷方式',
|
||||
'Menu:Incident:Shortcuts+' => '',
|
||||
'Menu:Incident:MyIncidents' => '分配给我的事件',
|
||||
'Menu:Incident:MyIncidents+' => '分配给我的事件',
|
||||
'Menu:Incident:EscalatedIncidents' => '已升级的事件',
|
||||
'Menu:Incident:EscalatedIncidents+' => '已升级的事件',
|
||||
'Menu:Incident:OpenIncidents' => '所有打开的事件',
|
||||
'Menu:Incident:OpenIncidents+' => '所有打开的事件',
|
||||
'UI-IncidentManagementOverview-IncidentByPriority-last-14-days' => '最近两周的事件 (按优先级)',
|
||||
'UI-IncidentManagementOverview-Last-14-days' => '最近两周的事件 (按数量)',
|
||||
'UI-IncidentManagementOverview-OpenIncidentByStatus' => '打开的事件 (按状态)',
|
||||
'UI-IncidentManagementOverview-OpenIncidentByAgent' => '打开的事件 (按办理人)',
|
||||
'UI-IncidentManagementOverview-OpenIncidentByCustomer' => '打开的事件 (按客户)',
|
||||
]);
|
||||
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>
|
||||
// Class:<class_name>/Attribute:<attribute_code>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: Incident
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Incident' => '事件',
|
||||
'Class:Incident+' => '',
|
||||
'Class:Incident/Attribute:assignment_date' => '分配日期',
|
||||
'Class:Incident/Attribute:assignment_date+' => '',
|
||||
'Class:Incident/Attribute:child_incidents_list' => '子事件',
|
||||
'Class:Incident/Attribute:child_incidents_list+' => '此事件相关的所有衍生事件',
|
||||
'Class:Incident/Attribute:cumulatedpending' => '累计待定',
|
||||
'Class:Incident/Attribute:cumulatedpending+' => '',
|
||||
'Class:Incident/Attribute:escalation_flag' => '是否升级',
|
||||
'Class:Incident/Attribute:escalation_flag+' => '',
|
||||
'Class:Incident/Attribute:escalation_flag/Value:no' => '否',
|
||||
'Class:Incident/Attribute:escalation_flag/Value:no+' => '否',
|
||||
'Class:Incident/Attribute:escalation_flag/Value:yes' => '是',
|
||||
'Class:Incident/Attribute:escalation_flag/Value:yes+' => '是',
|
||||
'Class:Incident/Attribute:escalation_reason' => '升级原因',
|
||||
'Class:Incident/Attribute:escalation_reason+' => '',
|
||||
'Class:Incident/Attribute:status' => '状态',
|
||||
'Class:Incident/Attribute:status+' => '',
|
||||
'Class:Incident/Attribute:status/Value:new' => '新建',
|
||||
'Class:Incident/Attribute:status/Value:new+' => '',
|
||||
'Class:Incident/Attribute:status/Value:escalated_tto' => '已升级TTO',
|
||||
'Class:Incident/Attribute:status/Value:escalated_tto+' => '',
|
||||
'Class:Incident/Attribute:status/Value:assigned' => '已分配',
|
||||
'Class:Incident/Attribute:status/Value:assigned+' => '',
|
||||
'Class:Incident/Attribute:status/Value:escalated_ttr' => '已升级TTR',
|
||||
'Class:Incident/Attribute:status/Value:escalated_ttr+' => '',
|
||||
'Class:Incident/Attribute:status/Value:waiting_for_approval' => '等待批准',
|
||||
'Class:Incident/Attribute:status/Value:waiting_for_approval+' => '',
|
||||
'Class:Incident/Attribute:status/Value:pending' => '待定',
|
||||
'Class:Incident/Attribute:status/Value:pending+' => '',
|
||||
'Class:Incident/Attribute:status/Value:resolved' => '已解决',
|
||||
'Class:Incident/Attribute:status/Value:resolved+' => '',
|
||||
'Class:Incident/Attribute:status/Value:closed' => '已关闭',
|
||||
'Class:Incident/Attribute:status/Value:closed+' => '',
|
||||
'Class:Incident/Attribute:impact' => '影响范围',
|
||||
'Class:Incident/Attribute:impact+' => '',
|
||||
'Class:Incident/Attribute:impact+' => '事件的影响范围,多少用户受影响',
|
||||
'Class:Incident/Attribute:impact/Value:1' => '部门',
|
||||
'Class:Incident/Attribute:impact/Value:1+' => '',
|
||||
'Class:Incident/Attribute:impact/Value:2' => '服务',
|
||||
'Class:Incident/Attribute:impact/Value:2+' => '',
|
||||
'Class:Incident/Attribute:impact/Value:3' => '个体',
|
||||
'Class:Incident/Attribute:impact/Value:3+' => '',
|
||||
'Class:Incident/Attribute:last_pending_date' => '最近待定日期',
|
||||
'Class:Incident/Attribute:last_pending_date+' => '',
|
||||
'Class:Incident/Attribute:origin' => '来源',
|
||||
'Class:Incident/Attribute:origin+' => '',
|
||||
'Class:Incident/Attribute:origin/Value:chat' => '聊天工具',
|
||||
'Class:Incident/Attribute:origin/Value:chat+' => '创建于聊天工具沟通后的事件',
|
||||
'Class:Incident/Attribute:origin/Value:in_person' => '当面',
|
||||
'Class:Incident/Attribute:origin/Value:in_person+' => '创建于当面沟通后的事件',
|
||||
'Class:Incident/Attribute:origin/Value:mail' => '邮件',
|
||||
'Class:Incident/Attribute:origin/Value:mail+' => '邮件',
|
||||
'Class:Incident/Attribute:origin/Value:monitoring' => '监控',
|
||||
'Class:Incident/Attribute:origin/Value:monitoring+' => '监控',
|
||||
'Class:Incident/Attribute:origin/Value:phone' => '电话',
|
||||
'Class:Incident/Attribute:origin/Value:phone+' => '电话',
|
||||
'Class:Incident/Attribute:origin/Value:portal' => '门户',
|
||||
'Class:Incident/Attribute:origin/Value:portal+' => '门户',
|
||||
'Class:Incident/Attribute:parent_change_id' => '父级变更',
|
||||
'Class:Incident/Attribute:parent_change_id+' => '',
|
||||
'Class:Incident/Attribute:parent_change_ref' => '变更编号',
|
||||
'Class:Incident/Attribute:parent_change_ref+' => '',
|
||||
'Class:Incident/Attribute:parent_incident_id' => '父级事件',
|
||||
'Class:Incident/Attribute:parent_incident_id+' => '',
|
||||
'Class:Incident/Attribute:parent_incident_id_friendlyname' => '父级事件名称',
|
||||
'Class:Incident/Attribute:parent_incident_id_friendlyname+' => '',
|
||||
'Class:Incident/Attribute:parent_incident_ref' => '事件编号',
|
||||
'Class:Incident/Attribute:parent_incident_ref+' => '',
|
||||
'Class:Incident/Attribute:parent_problem_id' => '父级问题',
|
||||
'Class:Incident/Attribute:parent_problem_id+' => '~~',
|
||||
'Class:Incident/Attribute:parent_problem_ref' => '父级问题编号',
|
||||
'Class:Incident/Attribute:parent_problem_ref+' => '~~',
|
||||
'Class:Incident/Attribute:pending_reason' => '待定原因',
|
||||
'Class:Incident/Attribute:pending_reason+' => '',
|
||||
'Class:Incident/Attribute:priority' => '优先级',
|
||||
'Class:Incident/Attribute:priority+' => '',
|
||||
'Class:Incident/Attribute:priority+' => '哪个工单应该优先处理',
|
||||
'Class:Incident/Attribute:priority/Value:1' => '紧急',
|
||||
'Class:Incident/Attribute:priority/Value:1+' => '紧急',
|
||||
'Class:Incident/Attribute:priority/Value:2' => '高',
|
||||
@@ -76,10 +99,72 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Incident/Attribute:priority/Value:3+' => '中',
|
||||
'Class:Incident/Attribute:priority/Value:4' => '低',
|
||||
'Class:Incident/Attribute:priority/Value:4+' => '低',
|
||||
'Class:Incident/Attribute:public_log' => '评论',
|
||||
'Class:Incident/Attribute:public_log+' => '',
|
||||
'Class:Incident/Attribute:related_request_list' => '相关需求',
|
||||
'Class:Incident/Attribute:related_request_list+' => '此事件相关的所有需求',
|
||||
'Class:Incident/Attribute:urgency' => '紧急度',
|
||||
'Class:Incident/Attribute:urgency+' => '问题应该多快解决',
|
||||
'Class:Incident/Attribute:urgency/Value:1' => '紧急',
|
||||
'Class:Incident/Attribute:urgency/Value:1+' => '紧急',
|
||||
'Class:Incident/Attribute:urgency/Value:2' => '高',
|
||||
'Class:Incident/Attribute:urgency/Value:2+' => '高',
|
||||
'Class:Incident/Attribute:urgency/Value:3' => '中',
|
||||
'Class:Incident/Attribute:urgency/Value:3+' => '中',
|
||||
'Class:Incident/Attribute:urgency/Value:4' => '低',
|
||||
'Class:Incident/Attribute:urgency/Value:4+' => '低',
|
||||
'Class:Incident/Attribute:origin' => '来源',
|
||||
'Class:Incident/Attribute:origin+' => '事件工单由谁发起或触发的',
|
||||
'Class:Incident/Attribute:origin/Value:in_person' => '当面',
|
||||
'Class:Incident/Attribute:origin/Value:in_person+' => '创建于当面沟通后的事件',
|
||||
'Class:Incident/Attribute:origin/Value:chat' => '聊天工具',
|
||||
'Class:Incident/Attribute:origin/Value:chat+' => '创建于聊天工具沟通后的事件',
|
||||
'Class:Incident/Attribute:origin/Value:mail' => '邮件',
|
||||
'Class:Incident/Attribute:origin/Value:mail+' => '邮件',
|
||||
'Class:Incident/Attribute:origin/Value:monitoring' => '监控',
|
||||
'Class:Incident/Attribute:origin/Value:monitoring+' => '监控',
|
||||
'Class:Incident/Attribute:origin/Value:phone' => '电话',
|
||||
'Class:Incident/Attribute:origin/Value:phone+' => '电话',
|
||||
'Class:Incident/Attribute:origin/Value:portal' => '门户',
|
||||
'Class:Incident/Attribute:origin/Value:portal+' => '门户',
|
||||
'Class:Incident/Attribute:service_id' => '服务',
|
||||
'Class:Incident/Attribute:service_id+' => '',
|
||||
'Class:Incident/Attribute:service_name' => '服务名称',
|
||||
'Class:Incident/Attribute:service_name+' => '',
|
||||
'Class:Incident/Attribute:servicesubcategory_id' => '子服务',
|
||||
'Class:Incident/Attribute:servicesubcategory_id+' => '',
|
||||
'Class:Incident/Attribute:servicesubcategory_name' => '子服务名称',
|
||||
'Class:Incident/Attribute:servicesubcategory_name+' => '',
|
||||
'Class:Incident/Attribute:escalation_flag' => '是否升级',
|
||||
'Class:Incident/Attribute:escalation_flag+' => '',
|
||||
'Class:Incident/Attribute:escalation_flag/Value:no' => '否',
|
||||
'Class:Incident/Attribute:escalation_flag/Value:no+' => '否',
|
||||
'Class:Incident/Attribute:escalation_flag/Value:yes' => '是',
|
||||
'Class:Incident/Attribute:escalation_flag/Value:yes+' => '是',
|
||||
'Class:Incident/Attribute:escalation_reason' => '升级原因',
|
||||
'Class:Incident/Attribute:escalation_reason+' => '',
|
||||
'Class:Incident/Attribute:assignment_date' => '分配日期',
|
||||
'Class:Incident/Attribute:assignment_date+' => '',
|
||||
'Class:Incident/Attribute:resolution_date' => '解决日期',
|
||||
'Class:Incident/Attribute:resolution_date+' => '',
|
||||
'Class:Incident/Attribute:last_pending_date' => '最近待定日期',
|
||||
'Class:Incident/Attribute:last_pending_date+' => '',
|
||||
'Class:Incident/Attribute:cumulatedpending' => '累计待定',
|
||||
'Class:Incident/Attribute:cumulatedpending+' => '',
|
||||
'Class:Incident/Attribute:tto' => 'TTO',
|
||||
'Class:Incident/Attribute:tto+' => '响应时间',
|
||||
'Class:Incident/Attribute:ttr' => 'TTR',
|
||||
'Class:Incident/Attribute:ttr+' => '解决时限',
|
||||
'Class:Incident/Attribute:tto_escalation_deadline' => 'TTO截止日期',
|
||||
'Class:Incident/Attribute:tto_escalation_deadline+' => '',
|
||||
'Class:Incident/Attribute:sla_tto_passed' => 'SLA TTO合格',
|
||||
'Class:Incident/Attribute:sla_tto_passed+' => '',
|
||||
'Class:Incident/Attribute:sla_tto_over' => 'SLA TTO超时',
|
||||
'Class:Incident/Attribute:sla_tto_over+' => '',
|
||||
'Class:Incident/Attribute:ttr_escalation_deadline' => 'TTR截止日期',
|
||||
'Class:Incident/Attribute:ttr_escalation_deadline+' => '',
|
||||
'Class:Incident/Attribute:sla_ttr_passed' => 'SLA TTR合格',
|
||||
'Class:Incident/Attribute:sla_ttr_passed+' => '',
|
||||
'Class:Incident/Attribute:sla_ttr_over' => 'SLA TTR超时',
|
||||
'Class:Incident/Attribute:sla_ttr_over+' => '',
|
||||
'Class:Incident/Attribute:time_spent' => '耗时',
|
||||
'Class:Incident/Attribute:time_spent+' => '',
|
||||
'Class:Incident/Attribute:resolution_code' => '解决方式',
|
||||
'Class:Incident/Attribute:resolution_code+' => '',
|
||||
'Class:Incident/Attribute:resolution_code/Value:assistance' => '外部支持',
|
||||
@@ -96,66 +181,28 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Incident/Attribute:resolution_code/Value:system update+' => '系统更新',
|
||||
'Class:Incident/Attribute:resolution_code/Value:training' => '培训',
|
||||
'Class:Incident/Attribute:resolution_code/Value:training+' => '培训',
|
||||
'Class:Incident/Attribute:resolution_date' => '解决日期',
|
||||
'Class:Incident/Attribute:resolution_date+' => '',
|
||||
'Class:Incident/Attribute:service_id' => '服务',
|
||||
'Class:Incident/Attribute:service_id+' => '',
|
||||
'Class:Incident/Attribute:service_name' => '服务名称',
|
||||
'Class:Incident/Attribute:service_name+' => '',
|
||||
'Class:Incident/Attribute:servicesubcategory_id' => '子服务',
|
||||
'Class:Incident/Attribute:servicesubcategory_id+' => '',
|
||||
'Class:Incident/Attribute:servicesubcategory_name' => '子服务名称',
|
||||
'Class:Incident/Attribute:servicesubcategory_name+' => '',
|
||||
'Class:Incident/Attribute:sla_tto_over' => 'SLA TTO超时',
|
||||
'Class:Incident/Attribute:sla_tto_over+' => '',
|
||||
'Class:Incident/Attribute:sla_tto_passed' => 'SLA TTO合格',
|
||||
'Class:Incident/Attribute:sla_tto_passed+' => '',
|
||||
'Class:Incident/Attribute:sla_ttr_over' => 'SLA TTR超时',
|
||||
'Class:Incident/Attribute:sla_ttr_over+' => '',
|
||||
'Class:Incident/Attribute:sla_ttr_passed' => 'SLA TTR合格',
|
||||
'Class:Incident/Attribute:sla_ttr_passed+' => '',
|
||||
'Class:Incident/Attribute:solution' => '解决方案',
|
||||
'Class:Incident/Attribute:solution+' => '',
|
||||
'Class:Incident/Attribute:status' => '状态',
|
||||
'Class:Incident/Attribute:status+' => '',
|
||||
'Class:Incident/Attribute:status/Value:assigned' => '已分配',
|
||||
'Class:Incident/Attribute:status/Value:assigned+' => '',
|
||||
'Class:Incident/Attribute:status/Value:closed' => '已关闭',
|
||||
'Class:Incident/Attribute:status/Value:closed+' => '',
|
||||
'Class:Incident/Attribute:status/Value:escalated_tto' => '已升级TTO',
|
||||
'Class:Incident/Attribute:status/Value:escalated_tto+' => '',
|
||||
'Class:Incident/Attribute:status/Value:escalated_ttr' => '已升级TTR',
|
||||
'Class:Incident/Attribute:status/Value:escalated_ttr+' => '',
|
||||
'Class:Incident/Attribute:status/Value:new' => '新建',
|
||||
'Class:Incident/Attribute:status/Value:new+' => '',
|
||||
'Class:Incident/Attribute:status/Value:pending' => '待定',
|
||||
'Class:Incident/Attribute:status/Value:pending+' => '',
|
||||
'Class:Incident/Attribute:status/Value:resolved' => '已解决',
|
||||
'Class:Incident/Attribute:status/Value:resolved+' => '',
|
||||
'Class:Incident/Attribute:status/Value:waiting_for_approval' => '等待批准',
|
||||
'Class:Incident/Attribute:status/Value:waiting_for_approval+' => '',
|
||||
'Class:Incident/Attribute:time_spent' => '耗时',
|
||||
'Class:Incident/Attribute:time_spent+' => '',
|
||||
'Class:Incident/Attribute:tto' => 'TTO',
|
||||
'Class:Incident/Attribute:tto+' => '响应时间',
|
||||
'Class:Incident/Attribute:tto_escalation_deadline' => 'TTO截止日期',
|
||||
'Class:Incident/Attribute:tto_escalation_deadline+' => '',
|
||||
'Class:Incident/Attribute:ttr' => 'TTR',
|
||||
'Class:Incident/Attribute:ttr+' => '解决时限',
|
||||
'Class:Incident/Attribute:ttr_escalation_deadline' => 'TTR截止日期',
|
||||
'Class:Incident/Attribute:ttr_escalation_deadline+' => '',
|
||||
'Class:Incident/Attribute:urgency' => '紧急度',
|
||||
'Class:Incident/Attribute:urgency+' => '',
|
||||
'Class:Incident/Attribute:urgency/Value:1' => '紧急',
|
||||
'Class:Incident/Attribute:urgency/Value:1+' => '紧急',
|
||||
'Class:Incident/Attribute:urgency/Value:2' => '高',
|
||||
'Class:Incident/Attribute:urgency/Value:2+' => '高',
|
||||
'Class:Incident/Attribute:urgency/Value:3' => '中',
|
||||
'Class:Incident/Attribute:urgency/Value:3+' => '中',
|
||||
'Class:Incident/Attribute:urgency/Value:4' => '低',
|
||||
'Class:Incident/Attribute:urgency/Value:4+' => '低',
|
||||
'Class:Incident/Attribute:user_comment' => '用户评论',
|
||||
'Class:Incident/Attribute:user_comment+' => '',
|
||||
'Class:Incident/Attribute:pending_reason' => '待定原因',
|
||||
'Class:Incident/Attribute:pending_reason+' => '',
|
||||
'Class:Incident/Attribute:parent_incident_id' => '父级事件',
|
||||
'Class:Incident/Attribute:parent_incident_id+' => '',
|
||||
'Class:Incident/Attribute:parent_incident_ref' => '事件编号',
|
||||
'Class:Incident/Attribute:parent_incident_ref+' => '',
|
||||
'Class:Incident/Attribute:parent_change_id' => '父级变更',
|
||||
'Class:Incident/Attribute:parent_change_id+' => '',
|
||||
'Class:Incident/Attribute:parent_change_ref' => '变更编号',
|
||||
'Class:Incident/Attribute:parent_change_ref+' => '',
|
||||
'Class:Incident/Attribute:parent_problem_id' => '父级问题',
|
||||
'Class:Incident/Attribute:parent_problem_id+' => '~~',
|
||||
'Class:Incident/Attribute:parent_problem_ref' => '父级问题编号',
|
||||
'Class:Incident/Attribute:parent_problem_ref+' => '~~',
|
||||
'Class:Incident/Attribute:related_request_list' => '相关需求',
|
||||
'Class:Incident/Attribute:related_request_list+' => '此事件相关的所有需求',
|
||||
'Class:Incident/Attribute:child_incidents_list' => '子事件',
|
||||
'Class:Incident/Attribute:child_incidents_list+' => '此事件相关的所有衍生事件',
|
||||
'Class:Incident/Attribute:public_log' => '评论',
|
||||
'Class:Incident/Attribute:public_log+' => '',
|
||||
'Class:Incident/Attribute:user_satisfaction' => '用户满意度',
|
||||
'Class:Incident/Attribute:user_satisfaction+' => '',
|
||||
'Class:Incident/Attribute:user_satisfaction/Value:1' => '非常满意',
|
||||
@@ -166,47 +213,31 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Incident/Attribute:user_satisfaction/Value:3+' => '不满意',
|
||||
'Class:Incident/Attribute:user_satisfaction/Value:4' => '非常不满意',
|
||||
'Class:Incident/Attribute:user_satisfaction/Value:4+' => '非常不满意',
|
||||
'Class:Incident/Error:CannotAssignParentIncidentIdToSelf' => '无法分配父级事件给自己',
|
||||
'Class:Incident/Method:ResolveChildTickets' => '解决子工单',
|
||||
'Class:Incident/Method:ResolveChildTickets+' => '递归解决子工单 (自动解决), 并调整相关字段与父级工单保持一致: 服务, 团队, 办理人, 解决方案',
|
||||
'Class:Incident/Attribute:user_comment' => '用户评论',
|
||||
'Class:Incident/Attribute:user_comment+' => '',
|
||||
'Class:Incident/Attribute:parent_incident_id_friendlyname' => '父级事件名称',
|
||||
'Class:Incident/Attribute:parent_incident_id_friendlyname+' => '',
|
||||
'Class:Incident/Stimulus:ev_assign' => '分配',
|
||||
'Class:Incident/Stimulus:ev_assign+' => '',
|
||||
'Class:Incident/Stimulus:ev_autoclose' => '自动关闭',
|
||||
'Class:Incident/Stimulus:ev_autoclose+' => '',
|
||||
'Class:Incident/Stimulus:ev_autoresolve' => '自动解决',
|
||||
'Class:Incident/Stimulus:ev_autoresolve+' => '',
|
||||
'Class:Incident/Stimulus:ev_close' => '关闭',
|
||||
'Class:Incident/Stimulus:ev_close+' => '',
|
||||
'Class:Incident/Stimulus:ev_pending' => '待定',
|
||||
'Class:Incident/Stimulus:ev_pending+' => '',
|
||||
'Class:Incident/Stimulus:ev_reassign' => '重新分配',
|
||||
'Class:Incident/Stimulus:ev_reassign+' => '',
|
||||
'Class:Incident/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:Incident/Stimulus:ev_reopen+' => '',
|
||||
'Class:Incident/Stimulus:ev_resolve' => '标记为已解决',
|
||||
'Class:Incident/Stimulus:ev_resolve+' => '',
|
||||
'Class:Incident/Stimulus:ev_pending' => '待定',
|
||||
'Class:Incident/Stimulus:ev_pending+' => '',
|
||||
'Class:Incident/Stimulus:ev_timeout' => '超时',
|
||||
'Class:Incident/Stimulus:ev_timeout+' => '',
|
||||
'Menu:Incident:EscalatedIncidents' => '已升级的事件',
|
||||
'Menu:Incident:EscalatedIncidents+' => '已升级的事件',
|
||||
'Menu:Incident:MyIncidents' => '分配给我的事件',
|
||||
'Menu:Incident:MyIncidents+' => '分配给我的事件',
|
||||
'Menu:Incident:OpenIncidents' => '所有打开的事件',
|
||||
'Menu:Incident:OpenIncidents+' => '所有打开的事件',
|
||||
'Menu:Incident:Overview' => '概况',
|
||||
'Menu:Incident:Overview+' => '概况',
|
||||
'Menu:Incident:Shortcuts' => '快捷方式',
|
||||
'Menu:Incident:Shortcuts+' => '',
|
||||
'Menu:IncidentManagement' => '事件管理',
|
||||
'Menu:IncidentManagement+' => '事件管理',
|
||||
'Menu:NewIncident' => '新建事件',
|
||||
'Menu:NewIncident+' => '新建事件',
|
||||
'Menu:SearchIncidents' => '搜索事件',
|
||||
'Menu:SearchIncidents+' => '搜索事件',
|
||||
'Class:Incident/Stimulus:ev_autoresolve' => '自动解决',
|
||||
'Class:Incident/Stimulus:ev_autoresolve+' => '',
|
||||
'Class:Incident/Stimulus:ev_autoclose' => '自动关闭',
|
||||
'Class:Incident/Stimulus:ev_autoclose+' => '',
|
||||
'Class:Incident/Stimulus:ev_resolve' => '标记为已解决',
|
||||
'Class:Incident/Stimulus:ev_resolve+' => '',
|
||||
'Class:Incident/Stimulus:ev_close' => '关闭',
|
||||
'Class:Incident/Stimulus:ev_close+' => '',
|
||||
'Class:Incident/Stimulus:ev_reopen' => '重新打开',
|
||||
'Class:Incident/Stimulus:ev_reopen+' => '',
|
||||
'Class:Incident/Error:CannotAssignParentIncidentIdToSelf' => '无法分配父级事件给自己',
|
||||
|
||||
'Class:Incident/Method:ResolveChildTickets' => '解决子工单',
|
||||
'Class:Incident/Method:ResolveChildTickets+' => '递归解决子工单 (自动解决), 并调整相关字段与父级工单保持一致: 服务, 团队, 办理人, 解决方案',
|
||||
'Tickets:Related:OpenIncidents' => '打开的事件',
|
||||
'UI-IncidentManagementOverview-IncidentByPriority-last-14-days' => '最近两周的事件 (按优先级)',
|
||||
'UI-IncidentManagementOverview-Last-14-days' => '最近两周的事件 (按数量)',
|
||||
'UI-IncidentManagementOverview-OpenIncidentByAgent' => '打开的事件 (按办理人)',
|
||||
'UI-IncidentManagementOverview-OpenIncidentByCustomer' => '打开的事件 (按客户)',
|
||||
'UI-IncidentManagementOverview-OpenIncidentByStatus' => '打开的事件 (按状态)',
|
||||
]);
|
||||
|
||||
@@ -42,7 +42,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:KnownError/Attribute:problem_ref+' => '',
|
||||
'Class:KnownError/Attribute:root_cause' => 'Causa principale',
|
||||
'Class:KnownError/Attribute:root_cause+' => '',
|
||||
'Class:KnownError/Attribute:solution' => 'Solutione',
|
||||
'Class:KnownError/Attribute:solution' => 'Soluzione',
|
||||
'Class:KnownError/Attribute:solution+' => '',
|
||||
'Class:KnownError/Attribute:symptom' => 'Sintomo',
|
||||
'Class:KnownError/Attribute:symptom+' => '',
|
||||
@@ -60,16 +60,16 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:lnkDocumentToError/Attribute:document_name+' => '~~',
|
||||
'Class:lnkDocumentToError/Attribute:error_id' => 'Errore',
|
||||
'Class:lnkDocumentToError/Attribute:error_id+' => '~~',
|
||||
'Class:lnkDocumentToError/Attribute:error_name' => 'Nome Errore',
|
||||
'Class:lnkDocumentToError/Attribute:error_name' => 'Nome errore',
|
||||
'Class:lnkDocumentToError/Attribute:error_name+' => '~~',
|
||||
'Class:lnkDocumentToError/Attribute:link_type' => 'link_type',
|
||||
'Class:lnkDocumentToError/Attribute:link_type+' => '~~',
|
||||
'Class:lnkDocumentToError/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkErrorToFunctionalCI' => 'Link Errore /CIFunzionale',
|
||||
'Class:lnkErrorToFunctionalCI+' => 'Infra impattata dal errore conosciuto',
|
||||
'Class:lnkErrorToFunctionalCI+' => 'Infra impattata dall\'errore conosciuto',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_id' => 'Errore',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_id+' => '~~',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_name' => 'Nome Errore',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_name' => 'Nome errore',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_name+' => '~~',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id' => 'CI',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id+' => '~~',
|
||||
@@ -79,12 +79,12 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:reason+' => '~~',
|
||||
'Class:lnkErrorToFunctionalCI/Name' => '%1$s / %2$s~~',
|
||||
'Menu:NewError' => 'Nuovo errore conosciuto',
|
||||
'Menu:NewError+' => 'Creazione di un Nuovo Errore Conosciuto',
|
||||
'Menu:NewError+' => 'Creazione di un nuovo errore conosciuto',
|
||||
'Menu:Problem:KnownErrors' => 'Tutti gli errori conosciuti',
|
||||
'Menu:Problem:KnownErrors+' => 'Tutti gli errori conosciuti',
|
||||
'Menu:Problem:Shortcuts' => 'Scorciatoia',
|
||||
'Menu:ProblemManagement' => 'Gestione dei Problemi',
|
||||
'Menu:ProblemManagement+' => 'Gestione dei Problemi',
|
||||
'Menu:SearchError' => 'Ricerca per Errori Conosciuti',
|
||||
'Menu:SearchError+' => 'Ricerca per Errori Conosciuti',
|
||||
'Menu:ProblemManagement' => 'Gestione dei problemi',
|
||||
'Menu:ProblemManagement+' => 'Gestione dei problemi',
|
||||
'Menu:SearchError' => 'Ricerca per errori conosciuti',
|
||||
'Menu:SearchError+' => 'Ricerca per errori conosciuti',
|
||||
]);
|
||||
|
||||
@@ -4,20 +4,75 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* iTop is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>
|
||||
// Class:<class_name>/Attribute:<attribute_code>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Classes in 'bizmodel'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>
|
||||
// Class:<class_name>/Attribute:<attribute_code>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: KnownError
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:KnownError' => '已知错误',
|
||||
'Class:KnownError+' => '记录一个已知错误',
|
||||
'Class:KnownError/Attribute:ci_list' => '配置项',
|
||||
'Class:KnownError/Attribute:ci_list+' => '此已知错误相关的所有配置项',
|
||||
'Class:KnownError/Attribute:name' => '名称',
|
||||
'Class:KnownError/Attribute:name+' => '',
|
||||
'Class:KnownError/Attribute:org_id' => '客户',
|
||||
'Class:KnownError/Attribute:org_id+' => '',
|
||||
'Class:KnownError/Attribute:cust_name' => '客户名称',
|
||||
'Class:KnownError/Attribute:cust_name+' => '',
|
||||
'Class:KnownError/Attribute:document_list' => '文档',
|
||||
'Class:KnownError/Attribute:document_list+' => '此已知错误相关的所有文档',
|
||||
'Class:KnownError/Attribute:problem_id' => '相关问题',
|
||||
'Class:KnownError/Attribute:problem_id+' => '',
|
||||
'Class:KnownError/Attribute:problem_ref' => '问题编号',
|
||||
'Class:KnownError/Attribute:problem_ref+' => '',
|
||||
'Class:KnownError/Attribute:symptom' => '现象',
|
||||
'Class:KnownError/Attribute:symptom+' => '',
|
||||
'Class:KnownError/Attribute:root_cause' => '问题根源',
|
||||
'Class:KnownError/Attribute:root_cause+' => '',
|
||||
'Class:KnownError/Attribute:workaround' => '解决过程',
|
||||
'Class:KnownError/Attribute:workaround+' => '',
|
||||
'Class:KnownError/Attribute:solution' => '解决方案',
|
||||
'Class:KnownError/Attribute:solution+' => '',
|
||||
'Class:KnownError/Attribute:error_code' => '错误编码',
|
||||
'Class:KnownError/Attribute:error_code+' => '',
|
||||
'Class:KnownError/Attribute:domain' => '类型',
|
||||
'Class:KnownError/Attribute:domain+' => '',
|
||||
'Class:KnownError/Attribute:domain/Value:Application' => '应用',
|
||||
@@ -28,32 +83,46 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:KnownError/Attribute:domain/Value:Network+' => '网络',
|
||||
'Class:KnownError/Attribute:domain/Value:Server' => '服务器',
|
||||
'Class:KnownError/Attribute:domain/Value:Server+' => '服务器',
|
||||
'Class:KnownError/Attribute:error_code' => '错误编码',
|
||||
'Class:KnownError/Attribute:error_code+' => '',
|
||||
'Class:KnownError/Attribute:model' => '型号',
|
||||
'Class:KnownError/Attribute:model+' => '',
|
||||
'Class:KnownError/Attribute:name' => '名称',
|
||||
'Class:KnownError/Attribute:name+' => '',
|
||||
'Class:KnownError/Attribute:org_id' => '客户',
|
||||
'Class:KnownError/Attribute:org_id+' => '',
|
||||
'Class:KnownError/Attribute:problem_id' => '相关问题',
|
||||
'Class:KnownError/Attribute:problem_id+' => '',
|
||||
'Class:KnownError/Attribute:problem_ref' => '问题编号',
|
||||
'Class:KnownError/Attribute:problem_ref+' => '',
|
||||
'Class:KnownError/Attribute:root_cause' => '问题根源',
|
||||
'Class:KnownError/Attribute:root_cause+' => '',
|
||||
'Class:KnownError/Attribute:solution' => '解决方案',
|
||||
'Class:KnownError/Attribute:solution+' => '',
|
||||
'Class:KnownError/Attribute:symptom' => '现象',
|
||||
'Class:KnownError/Attribute:symptom+' => '',
|
||||
'Class:KnownError/Attribute:vendor' => '厂商',
|
||||
'Class:KnownError/Attribute:vendor+' => '',
|
||||
'Class:KnownError/Attribute:model' => '型号',
|
||||
'Class:KnownError/Attribute:model+' => '',
|
||||
'Class:KnownError/Attribute:version' => '版本',
|
||||
'Class:KnownError/Attribute:version+' => '',
|
||||
'Class:KnownError/Attribute:workaround' => '解决过程',
|
||||
'Class:KnownError/Attribute:workaround+' => '',
|
||||
'Class:KnownError/Attribute:ci_list' => '配置项',
|
||||
'Class:KnownError/Attribute:ci_list+' => '此已知错误相关的所有配置项',
|
||||
'Class:KnownError/Attribute:document_list' => '文档',
|
||||
'Class:KnownError/Attribute:document_list+' => '此已知错误相关的所有文档',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: lnkErrorToFunctionalCI
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkErrorToFunctionalCI' => '关联已知问题/功能配置项',
|
||||
'Class:lnkErrorToFunctionalCI+' => '已知问题和功能配置项之间的关联',
|
||||
'Class:lnkErrorToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id' => '配置项',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id+' => '',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name' => '配置项名称',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name+' => '',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_id' => '已知问题',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_id+' => '',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_name' => '已知问题名称',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_name+' => '',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:reason' => '原因',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:reason+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: lnkDocumentToError
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToError' => '关联文档/已知问题',
|
||||
'Class:lnkDocumentToError+' => '文档和已知问题之间的关联',
|
||||
'Class:lnkDocumentToError/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToError/Attribute:document_id' => '文档',
|
||||
'Class:lnkDocumentToError/Attribute:document_id+' => '',
|
||||
'Class:lnkDocumentToError/Attribute:document_name' => '文档名称',
|
||||
@@ -64,27 +133,16 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToError/Attribute:error_name+' => '',
|
||||
'Class:lnkDocumentToError/Attribute:link_type' => '关联类型',
|
||||
'Class:lnkDocumentToError/Attribute:link_type+' => '',
|
||||
'Class:lnkDocumentToError/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkErrorToFunctionalCI' => '关联已知问题/功能配置项',
|
||||
'Class:lnkErrorToFunctionalCI+' => '已知问题和功能配置项之间的关联',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_id' => '已知问题',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_id+' => '',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_name' => '已知问题名称',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:error_name+' => '',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id' => '配置项',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id+' => '',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name' => '配置项名称',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name+' => '',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:reason' => '原因',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:reason+' => '',
|
||||
'Class:lnkErrorToFunctionalCI/Name' => '%1$s / %2$s~~',
|
||||
'Menu:NewError' => '新建已知问题',
|
||||
'Menu:NewError+' => '新建已知问题',
|
||||
'Menu:Problem:KnownErrors' => '所有已知错误',
|
||||
'Menu:Problem:KnownErrors+' => '所有已知错误',
|
||||
'Menu:Problem:Shortcuts' => '快捷方式',
|
||||
]);
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:ProblemManagement' => '问题管理',
|
||||
'Menu:ProblemManagement+' => '问题管理',
|
||||
'Menu:Problem:Shortcuts' => '快捷方式',
|
||||
'Menu:NewError' => '新建已知问题',
|
||||
'Menu:NewError+' => '新建已知问题',
|
||||
'Menu:SearchError' => '搜索已知问题',
|
||||
'Menu:SearchError+' => '搜索已知问题',
|
||||
'Menu:Problem:KnownErrors' => '所有已知错误',
|
||||
'Menu:Problem:KnownErrors+' => '所有已知错误',
|
||||
]);
|
||||
|
||||
@@ -952,5 +952,22 @@ HTML
|
||||
</classes>
|
||||
</group>
|
||||
</groups>
|
||||
<profiles>
|
||||
<profile id="117" _delta="if_exists">
|
||||
<!-- SuperUser -->
|
||||
<groups>
|
||||
<group id="OauthConnection">
|
||||
<actions>
|
||||
<action id="action:read">allow</action>
|
||||
<action id="action:write">allow</action>
|
||||
<action id="action:delete">allow</action>
|
||||
<action id="action:bulk read">allow</action>
|
||||
<action id="action:bulk write">allow</action>
|
||||
<action id="action:bulk delete">allow</action>
|
||||
</actions>
|
||||
</group>
|
||||
</groups>
|
||||
</profile>
|
||||
</profiles>
|
||||
</user_rights>
|
||||
</itop_design>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
*
|
||||
*/
|
||||
Dict::Add('CS CZ', 'Czech', 'Čeština', [
|
||||
'Class:OAuthClient' => 'OAuth Client~~',
|
||||
'Class:OAuthClient' => 'OAuth Mail Access~~',
|
||||
'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
|
||||
'Class:OAuthClient/Attribute:client_id+' => 'A long string of characters provided by your OAuth2 provider~~',
|
||||
'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
|
||||
@@ -40,7 +40,7 @@ Erase the field to recalculate default value~~',
|
||||
'Class:OAuthClient/Attribute:token+' => '~~',
|
||||
'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
|
||||
'Class:OAuthClient/Attribute:token_expiration+' => '~~',
|
||||
'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
|
||||
'Class:OAuthClientAzure' => 'OAuth Mail Access for Microsoft Azure~~',
|
||||
'Class:OAuthClientAzure/Attribute:advanced_scope' => 'Advanced scope~~',
|
||||
'Class:OAuthClientAzure/Attribute:advanced_scope+' => 'As soon as you enter something here it takes precedence over the “Scope” selection which is then ignored~~',
|
||||
'Class:OAuthClientAzure/Attribute:scope' => 'Scope~~',
|
||||
@@ -62,7 +62,7 @@ Erase the field to recalculate default value~~',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple' => 'Simple~~',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple+' => '~~',
|
||||
'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
|
||||
'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
|
||||
'Class:OAuthClientGoogle' => 'OAuth Mail Access for Google~~',
|
||||
'Class:OAuthClientGoogle/Attribute:advanced_scope' => 'Advanced scope~~',
|
||||
'Class:OAuthClientGoogle/Attribute:advanced_scope+' => 'As soon as you enter something here it takes precedence over the “Scope” selection which is then ignored~~',
|
||||
'Class:OAuthClientGoogle/Attribute:scope' => 'Scope~~',
|
||||
@@ -84,7 +84,7 @@ Erase the field to recalculate default value~~',
|
||||
'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
|
||||
'Menu:CreateMailbox' => 'Create a mailbox...~~',
|
||||
'Menu:GenerateTokens' => 'Generate access token...~~',
|
||||
'Menu:OAuthClient' => 'OAuth client~~',
|
||||
'Menu:OAuthClient' => 'OAuth Mail Access~~',
|
||||
'Menu:OAuthClient+' => '~~',
|
||||
'Menu:RegenerateTokens' => 'Regenerate access token...~~',
|
||||
'OAuthClient:Name/UseForSMTPMustBeUnique' => 'The combination Login (%1$s) and Use for SMTP (%2$s) has already been used for OAuth Client~~',
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
*
|
||||
*/
|
||||
Dict::Add('DA DA', 'Danish', 'Dansk', [
|
||||
'Class:OAuthClient' => 'OAuth Client~~',
|
||||
'Class:OAuthClient' => 'OAuth Mail Access~~',
|
||||
'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
|
||||
'Class:OAuthClient/Attribute:client_id+' => 'A long string of characters provided by your OAuth2 provider~~',
|
||||
'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
|
||||
@@ -40,7 +40,7 @@ Erase the field to recalculate default value~~',
|
||||
'Class:OAuthClient/Attribute:token+' => '~~',
|
||||
'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
|
||||
'Class:OAuthClient/Attribute:token_expiration+' => '~~',
|
||||
'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
|
||||
'Class:OAuthClientAzure' => 'OAuth Mail Access for Microsoft Azure~~',
|
||||
'Class:OAuthClientAzure/Attribute:advanced_scope' => 'Advanced scope~~',
|
||||
'Class:OAuthClientAzure/Attribute:advanced_scope+' => 'As soon as you enter something here it takes precedence over the “Scope” selection which is then ignored~~',
|
||||
'Class:OAuthClientAzure/Attribute:scope' => 'Scope~~',
|
||||
@@ -62,7 +62,7 @@ Erase the field to recalculate default value~~',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple' => 'Simple~~',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple+' => '~~',
|
||||
'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
|
||||
'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
|
||||
'Class:OAuthClientGoogle' => 'OAuth Mail Access for Google~~',
|
||||
'Class:OAuthClientGoogle/Attribute:advanced_scope' => 'Advanced scope~~',
|
||||
'Class:OAuthClientGoogle/Attribute:advanced_scope+' => 'As soon as you enter something here it takes precedence over the “Scope” selection which is then ignored~~',
|
||||
'Class:OAuthClientGoogle/Attribute:scope' => 'Scope~~',
|
||||
@@ -84,7 +84,7 @@ Erase the field to recalculate default value~~',
|
||||
'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
|
||||
'Menu:CreateMailbox' => 'Create a mailbox...~~',
|
||||
'Menu:GenerateTokens' => 'Generate access token...~~',
|
||||
'Menu:OAuthClient' => 'OAuth client~~',
|
||||
'Menu:OAuthClient' => 'OAuth Mail Access~~',
|
||||
'Menu:OAuthClient+' => '~~',
|
||||
'Menu:RegenerateTokens' => 'Regenerate access token...~~',
|
||||
'OAuthClient:Name/UseForSMTPMustBeUnique' => 'The combination Login (%1$s) and Use for SMTP (%2$s) has already been used for OAuth Client~~',
|
||||
|
||||
@@ -4,13 +4,13 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', [
|
||||
'Class:OAuthClient' => 'OAuth-Client',
|
||||
'Class:OAuthClient' => 'Mailpostfach-OAuth-Client',
|
||||
'Class:OAuthClient/Attribute:client_id' => 'Client ID',
|
||||
'Class:OAuthClient/Attribute:client_id+' => 'Eine lange Zeichenfolge, die durch den oAuth2-Provider bereitgestellt wird',
|
||||
'Class:OAuthClient/Attribute:client_secret' => 'Client Secret',
|
||||
@@ -40,7 +40,7 @@ Löschen Sie das Feld, um den Standardwert neu zu berechnen.',
|
||||
'Class:OAuthClient/Attribute:token+' => '',
|
||||
'Class:OAuthClient/Attribute:token_expiration' => 'Zugriffstoken Ablaufszeitpunkt',
|
||||
'Class:OAuthClient/Attribute:token_expiration+' => '',
|
||||
'Class:OAuthClientAzure' => 'OAuth-Client für Microsoft Azure',
|
||||
'Class:OAuthClientAzure' => 'Mailpostfach-OAuth-Client für Microsoft Azure',
|
||||
'Class:OAuthClientAzure/Attribute:advanced_scope' => 'Erweiterter Scope',
|
||||
'Class:OAuthClientAzure/Attribute:advanced_scope+' => 'Sobald Sie hier etwas eingeben, hat es Vorrang vor der Auswahl im Feld "Scope", die dann ignoriert wird.',
|
||||
'Class:OAuthClientAzure/Attribute:scope' => 'Scope',
|
||||
@@ -62,7 +62,7 @@ Löschen Sie das Feld, um den Standardwert neu zu berechnen.',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple' => 'Einfach',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple+' => '',
|
||||
'Class:OAuthClientAzure/Name' => '%1$s (%2$s)',
|
||||
'Class:OAuthClientGoogle' => 'OAuth-Client für Google',
|
||||
'Class:OAuthClientGoogle' => 'Mailpostfach-OAuth-Client für Google',
|
||||
'Class:OAuthClientGoogle/Attribute:advanced_scope' => 'Erweiterter Scope',
|
||||
'Class:OAuthClientGoogle/Attribute:advanced_scope+' => 'Sobald Sie hier etwas eingeben, hat es Vorrang vor der Auswahl im Feld "Scope", die dann ignoriert wird.',
|
||||
'Class:OAuthClientGoogle/Attribute:scope' => 'Scope',
|
||||
@@ -84,7 +84,7 @@ Löschen Sie das Feld, um den Standardwert neu zu berechnen.',
|
||||
'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)',
|
||||
'Menu:CreateMailbox' => 'Mailpostfach erstellen...',
|
||||
'Menu:GenerateTokens' => 'Zugriffstoken generieren...',
|
||||
'Menu:OAuthClient' => 'OAuth-Client',
|
||||
'Menu:OAuthClient' => 'Mailpostfach-OAuth-Client',
|
||||
'Menu:OAuthClient+' => '',
|
||||
'Menu:RegenerateTokens' => 'Zugriffstoken neu generieren...',
|
||||
'OAuthClient:Name/UseForSMTPMustBeUnique' => 'Die Kombination aus "Login" (%1$s) und "Verwendung für SMTP" (%2$s) existiert bereits.',
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Menu:CreateMailbox' => 'Create a mailbox...',
|
||||
'Menu:OAuthClient' => 'OAuth client',
|
||||
'Menu:OAuthClient+' => '',
|
||||
'Menu:OAuthClient' => 'OAuth Mail Access',
|
||||
'Menu:OAuthClient+' => 'Oauth for email access',
|
||||
'Menu:GenerateTokens' => 'Generate access token...',
|
||||
'Menu:RegenerateTokens' => 'Regenerate access token...',
|
||||
|
||||
@@ -35,7 +35,7 @@ Dict::Add('EN US', 'English', 'English', [
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:OAuthClient' => 'OAuth Client',
|
||||
'Class:OAuthClient' => 'OAuth Mail Access',
|
||||
'Class:OAuthClient/Attribute:provider' => 'Provider',
|
||||
'Class:OAuthClient/Attribute:provider+' => '',
|
||||
'Class:OAuthClient/Attribute:name' => 'Login',
|
||||
@@ -73,7 +73,7 @@ EOF
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure',
|
||||
'Class:OAuthClientAzure' => 'OAuth Mail Access for Microsoft Azure',
|
||||
'Class:OAuthClientAzure/Name' => '%1$s (%2$s)',
|
||||
'Class:OAuthClientAzure/Attribute:scope' => 'Scope',
|
||||
'Class:OAuthClientAzure/Attribute:scope+' => 'Usually default selection is appropriate',
|
||||
@@ -102,7 +102,7 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:OAuthClientGoogle' => 'OAuth client for Google',
|
||||
'Class:OAuthClientGoogle' => 'OAuth Mail Access for Google',
|
||||
'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)',
|
||||
'Class:OAuthClientGoogle/Attribute:scope' => 'Scope',
|
||||
'Class:OAuthClientGoogle/Attribute:scope+' => 'Usually default selection is appropriate',
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user