Compare commits

...

108 Commits

Author SHA1 Message Date
Timothee
d0d4f11146 N°7662 Allowing indentation and de-indentation 2025-01-21 11:07:10 +01:00
jf-cbd
5ce1788d4a N°7776 remove twig from ajax calls, 3.2 edition 2025-01-20 16:34:46 +01:00
jf-cbd
38fe31c9fc Merge remote-tracking branch 'origin/support/3.1' into support/3.2
# Conflicts:
#	datamodels/2.x/itop-portal-base/portal/src/Controller/UserProfileBrickController.php
#	datamodels/2.x/itop-portal-base/portal/src/Form/ObjectFormManager.php
2025-01-20 16:33:35 +01:00
jf-cbd
ec61b52238 N°7776 remove twig from ajax calls, 3.1 edition 2025-01-20 16:02:26 +01:00
jf-cbd
072596a53b Merge remote-tracking branch 'origin/support/2.7' into support/3.1
# Conflicts:
#	datamodels/2.x/itop-portal-base/portal/src/Form/ObjectFormManager.php
2025-01-20 15:53:34 +01:00
jf-cbd
160bfd714b N°7776 remove twig from ajax calls 2025-01-20 15:41:22 +01:00
Eric Espie
3b51124f1c N°7927 - No context tag available on designer MTP 2025-01-17 10:06:20 +01:00
jf-cbd
19fa836758 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2025-01-16 17:16:31 +01:00
jf-cbd
1c5cb1547f Merge remote-tracking branch 'origin/support/2.7' into support/3.1 2025-01-16 17:15:12 +01:00
jf-cbd
8d58372074 Update unattended installation script documentation 2025-01-16 17:13:26 +01:00
Eric Espie
e98c6637ac N°8108 - EVENT_DB_AFTER_WRITE: $oEventData->Get('changes') missing previous values 2025-01-16 09:31:12 +01:00
odain
7d2a9d0bfc N°8066 - Polishing Webhook Oauth 2025-01-15 17:26:12 +01:00
odain
762d1162ca N°8066 - Polishing Webhook Oauth 2025-01-15 16:59:51 +01:00
odain
95dbe4c859 N°7873 - ci fix remove useless require_once 2025-01-14 07:52:07 +01:00
Benjamin Dalsass
ec6adee9c1 Remove useless require_once and replace it with inheritance 2025-01-13 14:32:06 +01:00
Benjamin Dalsass
baa8bba926 N°8031 - Make all portal bricks use custom templates for all templates
add missing templates
2025-01-13 12:50:58 +01:00
v-dumas
8dc5411717 N°7906 - User Preference: friendlyname, list, search criteria and reconciliation 2025-01-13 12:08:14 +01:00
Benjamin Dalsass
f1d448fd78 N°8031 - Make all portal bricks use custom templates for all templates
add missing templates
2025-01-13 11:53:44 +01:00
odain
a4490e2b5f N°7873 - Portal: Brick visible despite XML security tag allowed profiles 2025-01-13 11:06:27 +01:00
odain
efb7831a5a N°7111 - False link at the end of the setup 2025-01-13 08:30:23 +01:00
Benjamin Dalsass
9fadbb5eb1 N°8031 - Make all portal bricks use custom templates for all templates (#696)
Service implementation
2025-01-13 08:04:49 +01:00
Romain Quetiez
93dba0644d N°5791 - Handle NOT IN and NOT LIKE too 2025-01-10 16:21:12 +01:00
XGUI
ec324bb28e N°7746 - Caselog edition button active even if the user has a read-only access to the object 2025-01-10 11:12:03 +01:00
Eric Espie
dc8f521b12 N°7145 - UI - Init Value DateTime and Date with Day Time (Add default values on mandatory dates) 2025-01-09 11:56:55 +01:00
Eric Espie
bf6277fcd2 N°7145 - UI - Init Value DateTime and Date with Day Time (support raw date values) 2025-01-09 11:22:28 +01:00
Eric Espie
886db5d6ad N°7145 - UI - Init Value DateTime and Date with Day Time (use OQL syntax for default value) 2025-01-09 10:49:35 +01:00
Eric Espie
0e8ddf990c N°7145 - UI - Init Value DateTime and Date with Day Time (Fix Event class) 2025-01-07 13:21:13 +01:00
Eric Espie
346a8eadec N°5791 - Obsolescence condition containing IN makes object creation fail 2025-01-07 11:29:33 +01:00
Eric Espie
6948c594c2 N°7145 - UI - Init Value DateTime and Date with Day Time 2025-01-07 10:18:23 +01:00
Eric Espie
301a7a92a0 N°7145 - UI - Init Value DateTime and Date with Day Time 2025-01-06 16:52:32 +01:00
Eric Espie
73bb80ebea N°7206 - Force DBUpdate() when a transition is asked, and it leads to the same state 2025-01-06 11:31:36 +01:00
Timmy38
1e674d7bdc N°7383 Show data table even when there is no data after filtering (#695) 2025-01-06 11:06:18 +01:00
v-dumas
1225ee1e78 improve test 2025-01-03 17:18:24 +01:00
v-dumas
a91de9fb36 Add helpers for stopwatches manipulation 2025-01-03 17:04:41 +01:00
v-dumas
71b3a415a6 N°7206 - Add tests 2025-01-03 16:17:51 +01:00
Romain Quetiez
b97c7433c8 🎨 N°7633 Cosmetics on unit tests 2025-01-03 11:57:51 +01:00
jf-cbd
11fc958a7b 🐛 N°6284 - Add data-object-key 2024-12-31 15:01:36 +01:00
odain
a151e40b75 Merge branch 'support/3.1' into support/3.2 2024-12-27 11:13:50 +01:00
odain
5780f26817 N°7810: fix merge 2024-12-27 11:13:31 +01:00
odain
9a690861a3 Merge branch 'support/3.1' into support/3.2 2024-12-27 09:24:33 +01:00
odain
343f3286b8 Merge branch 'support/2.7' into support/3.1 2024-12-27 09:08:47 +01:00
Eric Espie
37fc1a5723 N°7810 - security hardening 2024-12-27 09:04:28 +01:00
Eric Espie
7a09b3effc 🐛 Don't display create mailbox if the corresponding class does not exist 2024-12-24 15:05:48 +01:00
Romain Quetiez
4f6d514694 N°8001 - Refactoring: instantiation of an ormDocument moved to... ormDocument 2024-12-20 10:36:25 +01:00
Stephen Abello
8f8b65a71d N°8031 - Add robustness if portal configuration doesn't go through 2024-12-20 10:15:22 +01:00
Timothee
49e72e83fe N°6282 Fix XSS vulnerability in wsdl 2024-12-19 15:34:43 +01:00
Stephen Abello
f0685e33e1 N°8031 - Add robustness and fix SF parameter binding being ambiguous in extensions bricks 2024-12-19 15:14:46 +01:00
Timmy38
42f391472b N°6282 Fix XSS vulnerability in soap (#690)
* N°6282 Fix XSS vulnerability in soap
2024-12-19 11:39:00 +01:00
Eric Espie
30ef2735b6 N°8001 - TriggerOnObjectMention : load of the icon failed 2024-12-18 16:03:39 +01:00
Stephen Abello
bbff0b72d3 N°8031 - Make all portal bricks use custom templates for all templates (#691)
* N°8031 - Make all portal bricks use custom templates for all templates

* Rename parameter following code review

* Add const variables following code review

* Modify method name following code review
2024-12-18 11:09:39 +01:00
jf-cbd
2dffab9ca0 🌐 Update ZH CN dictionaries 2024-12-18 10:39:25 +01:00
jf-cbd
1cbfa4f1b1 🌐 Update ZH CN dictionaries 2024-12-18 10:11:52 +01:00
odain-cbd
5f85757630 N°7633 - Reloads the same user multiple times if it no longer exists (#692)
* N°7633 - Reloads the same user multiple times if it no longer exists

* Update core/userrights.class.inc.php

good catch

Co-authored-by: Thomas Casteleyn <thomas.casteleyn@super-visions.com>

* Update core/userrights.class.inc.php

good catch (again)

Co-authored-by: Thomas Casteleyn <thomas.casteleyn@super-visions.com>

* Update core/userrights.class.inc.php

Co-authored-by: Thomas Casteleyn <thomas.casteleyn@super-visions.com>

* PR feedbacks from Romain

* ci: rename user logins

---------

Co-authored-by: Thomas Casteleyn <thomas.casteleyn@super-visions.com>
2024-12-17 17:27:49 +01:00
v-dumas
56d3ac668c N°8047 - SuperUser profile moved under iTop Community 3.2.1 2024-12-17 16:31:59 +01:00
jf-cbd
0a3b02bf45 🌐 Update ZH CN dictionaries 2024-12-16 18:30:22 +01:00
jf-cbd
74ebbc5fa4 🌐 Update ZH CN dictionaries 2024-12-16 18:19:17 +01:00
Eric Espie
a762b6a2bb Fix failing directory removal 2024-12-16 17:04:33 +01:00
Eric Espie
32ef639ce1 N°7803 - MTP from itophub/designer failing in itop 3.2.0 2024-12-16 16:44:59 +01:00
Purple Grape
8647a76dbf 🌐 Translations - improved translation for zh cn 20241108 (#679)
* improved translation for zh cn
2024-12-16 11:39:26 +01:00
jf-cbd
47cd8bce31 Security hardening 2024-12-16 11:05:16 +01:00
jf-cbd
86c677b2ca Merge remote-tracking branch 'origin/support/3.1' into support/3.2
# Conflicts:
#	datamodels/2.x/itop-portal-base/portal/src/Controller/ObjectController.php
2024-12-16 11:02:37 +01:00
Eric Espie
960129316d N°8050 - Fix regression due to directories filter changes 2024-12-16 10:56:06 +01:00
jf-cbd
1fa50f695d Security hardening 2024-12-16 10:47:06 +01:00
jf-cbd
692cf4f635 Merge branch 'support/2.7' into support/3.1 2024-12-16 10:27:00 +01:00
jf-cbd
95aa444ee6 Security hardening 2024-12-13 16:48:13 +01:00
jf-cbd
f5de808c7c Security hardening (#685)
* security hardening
2024-12-13 15:09:18 +01:00
Eric Espie
fc388313d7 N°8050 - Problems with interface discovery from itop 2024-12-13 10:14:17 +01:00
odain
d544ee5498 N°7750 - ci enhance test 2024-12-13 09:35:35 +01:00
odain
ce187550f6 N°7750 - Fix display regression 2024-12-12 12:21:57 +01:00
Eric Espie
5d15a08824 🥅 Fast setup error display 2024-12-12 09:55:16 +01:00
odain
8135316119 N°7750 - Bug with OQL set as Shortcut 2024-12-11 16:05:15 +01:00
Eric Espie
868c0ae836 N°7997 - Sharing Base incompatible with iTop >= 3.1 (code review) 2024-12-11 15:51:36 +01:00
Eric Espie
d03d4fce5f N°7997 - Sharing Base incompatible with iTop >= 3.1 2024-12-11 13:35:15 +01:00
Eric Espie
aa55c2b30f N°7997 - Sharing Base incompatible with iTop >= 3.1 2024-12-11 13:28:37 +01:00
Eric Espie
9d3b46b919 🥅 Fast setup error display 2024-12-11 11:40:03 +01:00
Eric Espie
01b4dbba71 🥅 Fast setup error display 2024-12-11 11:20:32 +01:00
Eric Espie
72ac4096c1 N°7854 - ⬆️ Bump twig version 2024-12-10 17:08:48 +01:00
Eric Espie
19559b08a7 N°7854 - ⬆️ Bump twig version 2024-12-10 10:52:30 +01:00
Eric Espie
346564ca0e N°7854 - ⬆️ Bump twig version 2024-12-10 10:11:28 +01:00
Eric Espie
1bf53bae2a N°7871 - unable to migrate to itop3.2 if a trigger on object mention without "mentioned filter" exists 2024-12-09 17:05:07 +01:00
Eric Espie
29ce042916 N°7867 - Issue with MTP offline (reset cache in metamodel) 2024-12-09 10:38:50 +01:00
odain
83539d6d4c N°7446 - Make ItopCustomDatamodelTestCase work with modules in production-modules 2024-12-05 11:29:05 +01:00
Eric Espie
e6a7b926f6 N°7852 - Issue on Class groups definition when checking EventNotification class 2024-12-05 11:14:19 +01:00
Eric Espie
b30e053236 N°8020 - Bugs MFA and designer incompatibility 2024-12-03 16:42:27 +01:00
Stephen Abello
afd96a0f49 N°7995 - Allow to redefine portal twig template for all bricks in a portal (#686)
* N°7995 - Allow to redefine portal twig template for all bricks in a portal

* Apply modifications from code review

* Fix variable name

* Apply changes from code review
2024-12-03 10:44:37 +01:00
Eric Espie
a77765ec7b N°8019 - Enrich event with transition information 2024-12-03 10:28:13 +01:00
jf-cbd
64b4b03ea9 Security hardening 2024-12-03 10:26:11 +01:00
jf-cbd
a797878b17 Security hardening 2024-12-03 09:54:31 +01:00
jf-cbd
1fa0f7bdd9 N°8007 - Security hardening 2024-12-02 17:45:39 +01:00
Eric Espie
f718b4173d N°7206 - TriggerOnStateEnter not called when using reassign transition (after review) 2024-12-02 17:28:15 +01:00
Eric Espie
e057c0f081 N°7777 - Click on tab "Last executions" during action creation crashs the form 2024-12-02 17:12:32 +01:00
Eric Espie
5a49fc7654 N°7206 - TriggerOnStateEnter not called when using reassign transition 2024-12-02 14:49:28 +01:00
Stephen Abello
6fca659c9d Fix portal not being able to use $common-* SCSS variables when recompiling stylesheets 2024-12-02 14:06:53 +01:00
Stephen Abello
eacd08f31e Fix SCSS comments type 2024-12-02 14:03:39 +01:00
jf-cbd
5f7d8f6cc0 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-11-29 16:43:13 +01:00
jf-cbd
cbb4281a37 N°7980 - security hardening 2024-11-29 16:40:34 +01:00
odain
d7a8d335d5 N°7446 - Fix in CI environment when class already loaded 2024-11-29 12:22:38 +01:00
odain
bd1d447677 N°7446 - Fix in CI environment 2024-11-29 12:08:16 +01:00
Eric Espie
bb405d5173 N°7429 - Create an MFA extension for iTop - Add support for AttributeClassSet 2024-11-27 14:57:51 +01:00
Benjamin Dalsass
4723fc885c Merge remote-tracking branch 'origin/support/3.1' into support/3.2
# Conflicts:
#	application/dashboard.class.inc.php
2024-11-27 09:55:15 +01:00
Benjamin Dalsass
06dcae1dd1 Merge remote-tracking branch 'origin/support/2.7' into support/3.1 2024-11-27 09:50:57 +01:00
Benjamin Dalsass
e03033ce52 N°7219 - Fatal error following dashboard modification when dashboard title contains an é 2024-11-27 09:40:22 +01:00
Timothee
19eae916f0 N°7792 Do not initialize CAS if already started 2024-11-22 09:59:41 +01:00
Lars Kaltefleiter
596e26a96f 🌐 N°7932 Translations - British English (#677)
* Translation into EN GB
2024-11-18 14:38:53 +01:00
Eric Espie
ef42a49009 Allow extensions to add extra datamodel for tests 2024-11-14 09:27:57 +01:00
Romain Quetiez
51e5f1e7de N°7962 Suppress warnings emitted by the parser/lexer generators and the runtime OQL lexer, with PHP 8.1+ 2024-11-13 15:28:29 +01:00
Timothee
9cffd17e19 N°7704 Fix missing namespace for constant EVENT_DOWNLOAD_DOCUMENT 2024-11-13 14:39:23 +01:00
Benjamin Dalsass
e9f16935b6 N°6613 - Fix user picture pushing invalid data 2024-11-13 13:20:27 +01:00
479 changed files with 27373 additions and 8477 deletions

View File

@@ -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');
?>

View File

@@ -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>',
@@ -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]);
}
/**

View File

@@ -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'}
});

View File

@@ -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>

View File

@@ -2024,8 +2024,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();

View File

@@ -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'>");
}

View File

@@ -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'));
}
/**

View File

@@ -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
View File

@@ -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",

View File

@@ -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);
}
}

View File

@@ -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())));
}

View File

@@ -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');
@@ -6346,9 +6346,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 +6430,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 +9436,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
{

View File

@@ -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())));

View File

@@ -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())));

View File

@@ -850,6 +850,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>

View File

@@ -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
{
}

View File

@@ -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())));
}

View File

@@ -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())));

View File

@@ -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(),
@@ -354,6 +354,8 @@ class HTMLDOMSanitizer extends DOMSanitizer
'font-style',
'height',
'margin',
'margin-left',
'margin-right',
'padding',
'text-align',
'vertical-align',

View File

@@ -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();
}
}
/**

View File

@@ -182,14 +182,14 @@ class PHP_LexerGenerator_Lexer
$this->token = self::COMMENTEND;
return true;
}
if (preg_match('/\G%([a-z]+)/', $this->data, $token, null, $this->N)) {
if (preg_match('/\G%([a-z]+)/', $this->data, $token, 0, $this->N)) {
$this->value = $token[1];
$this->N += strlen($token[1]) + 1;
$this->state = 'DeclarePI';
$this->token = self::PI;
return true;
}
if (preg_match('/\G[a-zA-Z_][a-zA-Z0-9_]*/', $this->data, $token, null, $this->N)) {
if (preg_match('/\G[a-zA-Z_][a-zA-Z0-9_]*/', $this->data, $token, 0, $this->N)) {
$this->value = $token[0];
$this->token = self::PATTERN;
$this->N += strlen($token[0]);
@@ -216,7 +216,7 @@ class PHP_LexerGenerator_Lexer
if ($this->data[$this->N] == '{') {
return $this->lexCode();
}
if (!preg_match("/\G[^\n]+/", $this->data, $token, null, $this->N)) {
if (!preg_match("/\G[^\n]+/", $this->data, $token, 0, $this->N)) {
$this->error('Unexpected end of file');
return false;
}
@@ -242,7 +242,7 @@ class PHP_LexerGenerator_Lexer
if ($this->data[$this->N] == '{') {
return $this->lexCode();
}
if (!preg_match("/\G[^\n]+/", $this->data, $token, null, $this->N)) {
if (!preg_match("/\G[^\n]+/", $this->data, $token, 0, $this->N)) {
$this->error('Unexpected end of file');
return false;
}
@@ -406,7 +406,7 @@ class PHP_LexerGenerator_Lexer
if ($this->data[$this->N] == '\'') {
return $this->lexQuote('\'');
}
if (preg_match('/\G%([a-zA-Z_]+)/', $this->data, $token, null, $this->N)) {
if (preg_match('/\G%([a-zA-Z_]+)/', $this->data, $token, 0, $this->N)) {
$this->value = $token[1];
$this->N += strlen($token[1]) + 1;
$this->state = 'DeclarePIRule';
@@ -419,7 +419,7 @@ class PHP_LexerGenerator_Lexer
if ($this->data[$this->N] == '"') {
return $this->lexQuote();
}
if (preg_match('/\G[a-zA-Z_][a-zA-Z0-9_]*/', $this->data, $token, null, $this->N)) {
if (preg_match('/\G[a-zA-Z_][a-zA-Z0-9_]*/', $this->data, $token, 0, $this->N)) {
$this->value = $token[0];
$this->N += strlen($token[0]);
$this->token = self::SUBPATTERN;

View File

@@ -33,17 +33,19 @@ class PHP_LexerGenerator_ParseryyToken implements ArrayAccess
return $this->_string;
}
function offsetExists($offset)
function offsetExists($offset): bool
{
return isset($this->metadata[$offset]);
}
// Return type mixed is not supported by PHP 7.4, we can remove the following PHP attribute and add the return type once iTop min PHP version is PHP 8.0+
#[\ReturnTypeWillChange]
function offsetGet($offset)
{
return $this->metadata[$offset];
}
function offsetSet($offset, $value)
function offsetSet($offset, $value): void
{
if ($offset === null) {
if (isset($value[0])) {
@@ -66,7 +68,7 @@ class PHP_LexerGenerator_ParseryyToken implements ArrayAccess
}
}
function offsetUnset($offset)
function offsetUnset($offset): void
{
unset($this->metadata[$offset]);
}
@@ -278,7 +280,7 @@ class PHP_LexerGenerator_Parser#line 171 "Parser.php"
$match = false;
foreach ($yy_yymore_patterns[' . $this->token . '] as $index => $rule) {
if (preg_match(\'/\' . $rule . \'/' . $this->patternFlags . '\',
' . $this->input . ', $yymatches, null, ' . $this->counter . ')) {
' . $this->input . ', $yymatches, 0, ' . $this->counter . ')) {
$yymatches = array_filter($yymatches, \'strlen\'); // remove empty sub-patterns
if ($match) {
if (strlen($yymatches[0]) > strlen($match[0][0])) {
@@ -350,7 +352,7 @@ class PHP_LexerGenerator_Parser#line 171 "Parser.php"
$pattern . '\';' . "\n");
fwrite($this->out, '
do {
if (preg_match($yy_global_pattern,' . $this->input . ', $yymatches, null, ' .
if (preg_match($yy_global_pattern,' . $this->input . ', $yymatches, 0, ' .
$this->counter .
')) {
$yysubmatches = $yymatches;
@@ -408,7 +410,7 @@ class PHP_LexerGenerator_Parser#line 171 "Parser.php"
}
$yysubmatches = array();
if (preg_match(\'/\' . $yy_yymore_patterns[' . $this->token . '][1] . \'/' . $this->patternFlags . '\',
' . $this->input . ', $yymatches, null, ' . $this->counter .')) {
' . $this->input . ', $yymatches, 0, ' . $this->counter .')) {
$yysubmatches = $yymatches;
$yymatches = array_filter($yymatches, \'strlen\'); // remove empty sub-patterns
next($yymatches); // skip global match

View File

@@ -187,7 +187,7 @@ require_once 'PHP/LexerGenerator/Exception.php';
$match = false;
foreach ($yy_yymore_patterns[' . $this->token . '] as $index => $rule) {
if (preg_match(\'/\' . $rule . \'/' . $this->patternFlags . '\',
' . $this->input . ', $yymatches, null, ' . $this->counter . ')) {
' . $this->input . ', $yymatches, 0, ' . $this->counter . ')) {
$yymatches = array_filter($yymatches, \'strlen\'); // remove empty sub-patterns
if ($match) {
if (strlen($yymatches[0]) > strlen($match[0][0])) {
@@ -259,7 +259,7 @@ require_once 'PHP/LexerGenerator/Exception.php';
$pattern . '\';' . "\n");
fwrite($this->out, '
do {
if (preg_match($yy_global_pattern,' . $this->input . ', $yymatches, null, ' .
if (preg_match($yy_global_pattern,' . $this->input . ', $yymatches, 0, ' .
$this->counter .
')) {
$yysubmatches = $yymatches;
@@ -317,7 +317,7 @@ require_once 'PHP/LexerGenerator/Exception.php';
}
$yysubmatches = array();
if (preg_match(\'/\' . $yy_yymore_patterns[' . $this->token . '][1] . \'/' . $this->patternFlags . '\',
' . $this->input . ', $yymatches, null, ' . $this->counter .')) {
' . $this->input . ', $yymatches, 0, ' . $this->counter .')) {
$yysubmatches = $yymatches;
$yymatches = array_filter($yymatches, \'strlen\'); // remove empty sub-patterns
next($yymatches); // skip global match

View File

@@ -110,7 +110,7 @@ class PHP_LexerGenerator_Regex_Lexer
$yy_global_pattern = '/\G(\\\\\\\\)|\G([^[\\\\^$.|()?*+{}]+)|\G(\\\\[][{}*.^$|?()+])|\G(\\[)|\G(\\|)|\G(\\\\[frnt]|\\\\x[0-9a-fA-F][0-9a-fA-F]?|\\\\[0-7][0-7][0-7]|\\\\x\\{[0-9a-fA-F]+\\})|\G(\\\\[0-9][0-9])|\G(\\\\[abBGcedDsSwW0C]|\\\\c\\\\)|\G(\\^)|\G(\\\\A)|\G(\\))|\G(\\$)|\G(\\*\\?|\\+\\?|[*?+]|\\{[0-9]+\\}|\\{[0-9]+,\\}|\\{[0-9]+,[0-9]+\\})|\G(\\\\[zZ])|\G(\\(\\?)|\G(\\()|\G(\\.)|\G(\\\\[1-9])|\G(\\\\p\\{\\^?..?\\}|\\\\P\\{..?\\}|\\\\X)|\G(\\\\p\\{C[cfnos]?|L[lmotu]?|M[cen]?|N[dlo]?|P[cdefios]?|S[ckmo]?|Z[lps]?\\})|\G(\\\\p\\{\\^C[cfnos]?|L[lmotu]?|M[cen]?|N[dlo]?|P[cdefios]?|S[ckmo]?|Z[lps]?\\})|\G(\\\\p[CLMNPSZ])|\G(\\\\)/';
do {
if (preg_match($yy_global_pattern,$this->input, $yymatches, null, $this->N)) {
if (preg_match($yy_global_pattern,$this->input, $yymatches, 0, $this->N)) {
$yysubmatches = $yymatches;
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
if (!count($yymatches)) {
@@ -180,7 +180,7 @@ class PHP_LexerGenerator_Regex_Lexer
}
$yysubmatches = array();
if (preg_match('/' . $yy_yymore_patterns[$this->token][1] . '/',
$this->input, $yymatches, null, $this->N)) {
$this->input, $yymatches, 0, $this->N)) {
$yysubmatches = $yymatches;
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
next($yymatches); // skip global match
@@ -360,7 +360,7 @@ class PHP_LexerGenerator_Regex_Lexer
$yy_global_pattern = '/\G(\\^)|\G(\\])|\G(.)/';
do {
if (preg_match($yy_global_pattern,$this->input, $yymatches, null, $this->N)) {
if (preg_match($yy_global_pattern,$this->input, $yymatches, 0, $this->N)) {
$yysubmatches = $yymatches;
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
if (!count($yymatches)) {
@@ -410,7 +410,7 @@ class PHP_LexerGenerator_Regex_Lexer
}
$yysubmatches = array();
if (preg_match('/' . $yy_yymore_patterns[$this->token][1] . '/',
$this->input, $yymatches, null, $this->N)) {
$this->input, $yymatches, 0, $this->N)) {
$yysubmatches = $yymatches;
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
next($yymatches); // skip global match
@@ -497,7 +497,7 @@ class PHP_LexerGenerator_Regex_Lexer
$yy_global_pattern = '/\G(\\\\\\\\)|\G(\\])|\G(\\\\[frnt]|\\\\x[0-9a-fA-F][0-9a-fA-F]?|\\\\[0-7][0-7][0-7]|\\\\x\\{[0-9a-fA-F]+\\})|\G(\\\\[bacedDsSwW0C]|\\\\c\\\\|\\\\x\\{[0-9a-fA-F]+\\}|\\\\[0-7][0-7][0-7]|\\\\x[0-9a-fA-F][0-9a-fA-F]?)|\G(\\\\[0-9][0-9])|\G(\\\\[1-9])|\G(\\\\[]\.\-\^])|\G(-(?!]))|\G([^\-\\\\])|\G(\\\\)|\G(.)/';
do {
if (preg_match($yy_global_pattern,$this->input, $yymatches, null, $this->N)) {
if (preg_match($yy_global_pattern,$this->input, $yymatches, 0, $this->N)) {
$yysubmatches = $yymatches;
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
if (!count($yymatches)) {
@@ -555,7 +555,7 @@ class PHP_LexerGenerator_Regex_Lexer
}
$yysubmatches = array();
if (preg_match('/' . $yy_yymore_patterns[$this->token][1] . '/',
$this->input, $yymatches, null, $this->N)) {
$this->input, $yymatches, 0, $this->N)) {
$yysubmatches = $yymatches;
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
next($yymatches); // skip global match
@@ -678,7 +678,7 @@ class PHP_LexerGenerator_Regex_Lexer
$yy_global_pattern = '/\G(\\\\\\\\)|\G(\\\\\\])|\G(\\\\[bacedDsSwW0C]|\\\\c\\\\|\\\\x\\{[0-9a-fA-F]+\\}|\\\\[0-7][0-7][0-7]|\\\\x[0-9a-fA-F][0-9a-fA-F]?)|\G(\\\\[0-9][0-9])|\G(\\\\[1-9])|\G([^\-\\\\])|\G(\\\\)/';
do {
if (preg_match($yy_global_pattern,$this->input, $yymatches, null, $this->N)) {
if (preg_match($yy_global_pattern,$this->input, $yymatches, 0, $this->N)) {
$yysubmatches = $yymatches;
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
if (!count($yymatches)) {
@@ -732,7 +732,7 @@ class PHP_LexerGenerator_Regex_Lexer
}
$yysubmatches = array();
if (preg_match('/' . $yy_yymore_patterns[$this->token][1] . '/',
$this->input, $yymatches, null, $this->N)) {
$this->input, $yymatches, 0, $this->N)) {
$yysubmatches = $yymatches;
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
next($yymatches); // skip global match
@@ -842,7 +842,7 @@ class PHP_LexerGenerator_Regex_Lexer
$yy_global_pattern = '/\G([imsxUX]+-[imsxUX]+|[imsxUX]+|-[imsxUX]+)|\G(:)|\G(\\))|\G(P<[^>]+>)|\G(<=)|\G(<!)|\G(=)|\G(!)|\G(>)|\G(\\(\\?)|\G(#[^)]+)|\G(R)|\G(.)/';
do {
if (preg_match($yy_global_pattern,$this->input, $yymatches, null, $this->N)) {
if (preg_match($yy_global_pattern,$this->input, $yymatches, 0, $this->N)) {
$yysubmatches = $yymatches;
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
if (!count($yymatches)) {
@@ -902,7 +902,7 @@ class PHP_LexerGenerator_Regex_Lexer
}
$yysubmatches = array();
if (preg_match('/' . $yy_yymore_patterns[$this->token][1] . '/',
$this->input, $yymatches, null, $this->N)) {
$this->input, $yymatches, 0, $this->N)) {
$yysubmatches = $yymatches;
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
next($yymatches); // skip global match

View File

@@ -33,17 +33,19 @@ class PHP_LexerGenerator_Regex_yyToken implements ArrayAccess
return $this->_string;
}
function offsetExists($offset)
function offsetExists($offset): bool
{
return isset($this->metadata[$offset]);
}
// Return type mixed is not supported by PHP 7.4, we can remove the following PHP attribute and add the return type once iTop min PHP version is PHP 8.0+
#[\ReturnTypeWillChange]
function offsetGet($offset)
{
return $this->metadata[$offset];
}
function offsetSet($offset, $value)
function offsetSet($offset, $value): void
{
if ($offset === null) {
if (isset($value[0])) {
@@ -66,7 +68,7 @@ class PHP_LexerGenerator_Regex_yyToken implements ArrayAccess
}
}
function offsetUnset($offset)
function offsetUnset($offset): void
{
unset($this->metadata[$offset]);
}

View File

@@ -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;
}
/**

View File

@@ -235,7 +235,7 @@ class OQLLexerRaw
$match = false;
foreach ($yy_yymore_patterns[$this->token] as $index => $rule) {
if (preg_match('/' . $rule . '/',
$this->data, $yymatches, null, $this->count)) {
$this->data, $yymatches, 0, $this->count)) {
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
if ($match) {
if (strlen($yymatches[0]) > strlen($match[0][0])) {

View File

@@ -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()

View File

@@ -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 '';
@@ -314,7 +380,7 @@ class ormDocument
'document' => $oDocument,
'content_disposition' => $sContentDisposition,
);
EventService::FireEvent(new EventData(EVENT_DOWNLOAD_DOCUMENT, $sClass, $aEventData));
EventService::FireEvent(new EventData(\EVENT_DOWNLOAD_DOCUMENT, $sClass, $aEventData));
$oPage->TrashUnexpectedOutput();
$oPage->SetContentType($oDocument->GetMimeType());
$oPage->SetContentDisposition($sContentDisposition,$oDocument->GetFileName());

View File

@@ -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())));

View File

@@ -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];
}
/**

View File

@@ -1,4 +1,4 @@
/*!
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,4 +1,4 @@
/*!
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,4 +1,4 @@
/*!
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,4 +1,4 @@
/*!
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,4 +1,4 @@
/*!
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,4 +1,4 @@
/*!
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,4 +1,4 @@
/*!
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,4 +1,4 @@
/*!
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,4 +1,4 @@
/*!
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,4 +1,4 @@
/*!
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,4 +1,4 @@
/*!
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -0,0 +1,13 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('EN GB', 'British English', 'British English', array(
'CAS:Error:UserNotAllowed' => 'User not allowed',
'CAS:Login:SignIn' => 'Sign in with CAS',
'CAS:Login:SignInTooltip' => 'Click here to authenticate yourself with the CAS server',
));

View File

@@ -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登录',

View File

@@ -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);
}
}

View File

@@ -0,0 +1,41 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 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>+
//
// Class: UserExternal
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:UserExternal' => 'External user',
'Class:UserExternal+' => 'User authentified outside of '.ITOP_APPLICATION_SHORT,
));

View File

@@ -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.'外部验证身份',

View File

@@ -0,0 +1,42 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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>+
//
// Class: UserLDAP
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:UserLDAP' => 'LDAP user',
'Class:UserLDAP+' => 'User authenticated by LDAP',
'UserLDAP:server' => 'LDAP specifics',
));

View File

@@ -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认证',

View File

@@ -0,0 +1,60 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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>+
//
// Class: UserLocal
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:UserLocal' => ITOP_APPLICATION_SHORT.' user',
'Class:UserLocal+' => 'User authentified by '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:password' => 'Password',
'Class:UserLocal/Attribute:password+' => 'User authentication string',
'Class:UserLocal/Attribute:expiration' => 'Password expiration',
'Class:UserLocal/Attribute:expiration+' => 'Password expiration status (requires an extension to have an effect)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'Can expire',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:never_expire' => 'Never expire',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:force_expire' => 'Expired',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => 'One-time Password',
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.',
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on',
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed',
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.',
'UserLocal:password:expiration' => 'The fields below require an extension',
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User',
));

View File

@@ -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' => '不允许用户为自己设置 "一次性密码" 的失效期限',
]);

View File

@@ -0,0 +1,26 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
'theme:darkmoon' => 'Dark moon',
));

View File

@@ -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' => '暗月',
]);

View File

@@ -0,0 +1,26 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
'theme:fullmoon-high-contrast' => 'Fullmoon (High contrast)',
));

View File

@@ -0,0 +1,26 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
'theme:fullmoon-protanopia-deuteranopia' => 'Fullmoon (Protanopia & Deuteranopia)'
));

View File

@@ -0,0 +1,26 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
'theme:fullmoon-tritanopia' => 'Fullmoon (Tritanopia)',
));

View File

@@ -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);
}

View File

@@ -0,0 +1,96 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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/>
*/
// Database inconsistencies
Dict::Add('EN GB', 'British English', 'British English', array(
// Dictionary entries go here
'Menu:DBToolsMenu' => 'Database integrity',
'DBTools:Class' => 'Class',
'DBTools:Title' => 'Database integrity check',
'DBTools:ErrorsFound' => 'Errors Found',
'DBTools:Indication' => 'Important: after fixing errors in the database you\'ll have to run the analysis again as new inconsistencies will be generated',
'DBTools:Disclaimer' => 'DISCLAIMER: BACKUP YOUR DATABASE BEFORE RUNNING THE FIXES',
'DBTools:Error' => 'Error',
'DBTools:Count' => 'Count',
'DBTools:SQLquery' => 'SQL query',
'DBTools:FixitSQLquery' => 'SQL query To Fix it (indication)',
'DBTools:SQLresult' => 'SQL result',
'DBTools:NoError' => 'The database is OK',
'DBTools:HideIds' => 'Error List',
'DBTools:ShowIds' => 'Detailed view',
'DBTools:ShowReport' => 'Report',
'DBTools:IntegrityCheck' => 'Integrity check',
'DBTools:FetchCheck' => 'Fetch Check (long)',
'DBTools:SelectAnalysisType' => 'Select analysis type',
'DBTools:Analyze' => 'Analyse',
'DBTools:Details' => 'Show Details',
'DBTools:ShowAll' => 'Show All Errors',
'DBTools:Inconsistencies' => 'Database inconsistencies',
'DBTools:DetailedErrorTitle' => '%2$s error(s) in class %1$s: %3$s',
'DBTools:DetailedErrorLimit' => 'List limited to %1$s errors',
'DBAnalyzer-Integrity-OrphanRecord' => 'Orphan record in `%1$s`, it should have its counterpart in table `%2$s`',
'DBAnalyzer-Integrity-InvalidExtKey' => 'Invalid external key %1$s (column: `%2$s.%3$s`)',
'DBAnalyzer-Integrity-MissingExtKey' => 'Missing external key %1$s (column: `%2$s.%3$s`)',
'DBAnalyzer-Integrity-InvalidValue' => 'Invalid value for %1$s (column: `%2$s.%3$s`)',
'DBAnalyzer-Integrity-UsersWithoutProfile' => 'Some user accounts have no profile at all',
'DBAnalyzer-Integrity-HKInvalid' => 'Broken hierarchical key `%1$s`',
'DBAnalyzer-Fetch-Count-Error' => 'Fetch count error in `%1$s`, %2$d entries fetched / %3$d counted',
'DBAnalyzer-Integrity-FinalClass' => 'Field `%2$s`.`%1$s` must have the same value as `%3$s`.`%1$s`',
'DBAnalyzer-Integrity-RootFinalClass' => 'Field `%2$s`.`%1$s` must contain a valid class',
));
// Database Info
Dict::Add('EN GB', 'British English', 'British English', array(
'DBTools:DatabaseInfo' => 'Database Information',
'DBTools:Base' => 'Base',
'DBTools:Size' => 'Size',
));
// Lost attachments
Dict::Add('EN GB', 'British English', 'British English', array(
'DBTools:LostAttachments' => 'Lost attachments',
'DBTools:LostAttachments:Disclaimer' => 'Here you can search your database for lost or misplaced attachments. This is NOT a data recovery tool, it does not retrieve deleted data.',
'DBTools:LostAttachments:Button:Analyze' => 'Analyse',
'DBTools:LostAttachments:Button:Restore' => 'Restore',
'DBTools:LostAttachments:Button:Restore:Confirm' => 'This action cannot be undone, please confirm that you want to restore the selected files.',
'DBTools:LostAttachments:Button:Busy' => 'Please wait...',
'DBTools:LostAttachments:Step:Analyze' => 'First, search for lost/misplaced attachments by analysing the database.',
'DBTools:LostAttachments:Step:AnalyzeResults' => 'Analyse results:',
'DBTools:LostAttachments:Step:AnalyzeResults:None' => 'Great! Every thing seems to be at the right place.',
'DBTools:LostAttachments:Step:AnalyzeResults:Some' => 'Some attachments (%1$d) seem to be misplaced. Take a look at the following list and check the ones you would like to move.',
'DBTools:LostAttachments:Step:AnalyzeResults:Item:Filename' => 'Filename',
'DBTools:LostAttachments:Step:AnalyzeResults:Item:CurrentLocation' => 'Current location',
'DBTools:LostAttachments:Step:AnalyzeResults:Item:TargetLocation' => 'Move to...',
'DBTools:LostAttachments:Step:RestoreResults' => 'Restore results:',
'DBTools:LostAttachments:Step:RestoreResults:Results' => '%1$d/%2$d attachments were restored.',
'DBTools:LostAttachments:StoredAsInlineImage' => 'Stored as inline image',
'DBTools:LostAttachments:History' => 'Attachment "%1$s" restored with DB tools'
));

View File

@@ -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" 已使用数据库工具还原',
));

View File

@@ -0,0 +1,81 @@
<?php
/**
* @copyright Copyright (C) 2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('EN GB', 'British English', 'British English', array(
'Attachments:TabTitle_Count' => 'Attachments (%1$d)',
'Attachments:EmptyTabTitle' => 'Attachments',
'Attachments:FieldsetTitle' => 'Attachments',
'Attachments:DeleteBtn' => 'Delete',
'Attachments:History_File_Added' => 'Attachment %1$s added.',
'Attachments:History_File_Removed' => 'Attachment %1$s removed.',
'Attachments:AddAttachment' => 'Add attachment: ',
'Attachments:UploadNotAllowedOnThisSystem' => 'File upload in NOT allowed on this system.',
'Attachment:Max_Go' => '(Maximum file size: %1$s GB)',
'Attachment:Max_Mo' => '(Maximum file size: %1$s MB)',
'Attachment:Max_Ko' => '(Maximum file size: %1$s KB)',
'Attachments:NoAttachment' => 'No attachment.',
'Attachments:PreviewNotAvailable' => 'Preview not available for this type of attachment.',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s',
'Attachments:Error:UploadedFileEmpty' => 'The received file is empty and cannot be attached.
Either you have pushed an empty file,
or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_SHORT.' server disk is full.',
'Attachments:Render:Icons' => 'Display as icons',
'Attachments:Render:Table' => 'Display as list',
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area',
));
//
// Class: Attachment
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:Attachment' => 'Attachment',
'Class:Attachment+' => '',
'Class:Attachment/Attribute:expire' => 'Expire',
'Class:Attachment/Attribute:expire+' => '',
'Class:Attachment/Attribute:temp_id' => 'Temporary id',
'Class:Attachment/Attribute:temp_id+' => '',
'Class:Attachment/Attribute:item_class' => 'Item class',
'Class:Attachment/Attribute:item_class+' => '',
'Class:Attachment/Attribute:item_id' => 'Item',
'Class:Attachment/Attribute:item_id+' => '',
'Class:Attachment/Attribute:item_org_id' => 'Item organisation',
'Class:Attachment/Attribute:item_org_id+' => '',
'Class:Attachment/Attribute:contents' => 'Contents',
'Class:Attachment/Attribute:contents+' => '',
));
Dict::Add('EN GB', 'British English', 'British English', array(
'Attachments:File:Thumbnail' => 'Icon',
'Attachments:File:Name' => 'File name',
'Attachments:File:Date' => 'Upload date',
'Attachments:File:Uploader' => 'Uploaded by',
'Attachments:File:Size' => 'Size',
'Attachments:File:MimeType' => 'Type',
'Attachments:File:DownloadsCount' => 'Downloads',
));
//
// Class: Attachment
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:Attachment/Attribute:creation_date' => 'Creation date',
'Class:Attachment/Attribute:creation_date+' => '',
'Class:Attachment/Attribute:user_id' => 'User id',
'Class:Attachment/Attribute:user_id+' => '',
'Class:Attachment/Attribute:contact_id' => 'Contact id',
'Class:Attachment/Attribute:contact_id+' => '',
));
//
// Class: TriggerOnAttachmentDownload
//
Dict::Add('EN GB', 'British English', 'British 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',
));

View File

@@ -4,57 +4,83 @@
*
* @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' => '本系统不支持文件上传.',
'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:item_class' => '项目类型',
'Class:Attachment/Attribute:item_class+' => '~~',
'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:user_id' => '用户编号',
'Class:Attachment/Attribute:user_id+' => '~~',
'Class:TriggerOnAttachmentDownload' => '触发器 (于对象附件下载时)',
'Class:TriggerOnAttachmentDownload+' => '触发器于指定类型 [子类型] 对象附件下载时',
'UI:Attachments:DropYourFileHint' => '将文件拖放到此区域的任意位置',
]);
//
// Class: Attachment
//
Dict::Add('ZH CN', 'Chinese', '简体中文', [
'Class:Attachment' => '附件',
'Class:Attachment+' => '',
'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_id' => '项目',
'Class:Attachment/Attribute:item_id+' => '',
'Class:Attachment/Attribute:item_org_id' => '项目组织',
'Class:Attachment/Attribute:item_org_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+' => '触发器于指定类型 [子类型] 对象附件下载时',
]);

View File

@@ -33,7 +33,7 @@ class EventListener implements iEventServiceSetup
public function RegisterEventsAndListeners()
{
EventService::RegisterListener(
EVENT_DOWNLOAD_DOCUMENT,
\EVENT_DOWNLOAD_DOCUMENT,
[$this, 'OnAttachmentDownloadActivateTriggers'],
'Attachment'
);

View File

@@ -0,0 +1,61 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
'bkp-backup-running' => 'A backup is running. Please wait...',
'bkp-restore-running' => 'A restore is running. Please wait...',
'Menu:BackupStatus' => 'Backups',
'bkp-status-title' => 'Backups',
'bkp-status-checks' => 'Settings and checks',
'bkp-mysqldump-ok' => 'mysqldump is present: %1$s',
'bkp-mysqldump-notfound' => 'mysqldump could not be found: %1$s - Please make sure it is installed and in the path, or edit the configuration file to tune mysql_bindir.',
'bkp-mysqldump-issue' => 'mysqldump could not be executed (retcode=%1$d): Please make sure it is installed and in the path, or edit the configuration file to tune mysql_bindir',
'bkp-missing-dir' => 'The target directory <code>%1$s</code> could not be found',
'bkp-free-disk-space' => '<b>%1$s free</b> in <code>%2$s</code>',
'bkp-dir-not-writeable' => '%1$s is not writable',
'bkp-wrong-format-spec' => 'The current specification to format the file names is wrong (%1$s). A default specification will apply: %2$s',
'bkp-name-sample' => 'Backup files are named depending on DB identifiers, date and time. Example: %1$s',
'bkp-week-days' => 'Backups will occur <b>every %1$s at %2$s</b>',
'bkp-retention' => 'At most <b>%1$d backup files will be kept</b> in the target directory.',
'bkp-next-to-delete' => 'Will be deleted when the next backup occurs (see the setting "retention_count")',
'bkp-table-file' => 'File',
'bkp-table-file+' => 'Only files having the extension .zip are considered as being backup files',
'bkp-table-size' => 'Size',
'bkp-table-size+' => '',
'bkp-table-actions' => 'Actions',
'bkp-table-actions+' => '',
'bkp-status-backups-auto' => 'Scheduled backups',
'bkp-status-backups-manual' => 'Manual backups',
'bkp-status-backups-none' => 'No backup yet',
'bkp-next-backup' => 'The next backup will occur on <b>%1$s</b> (%2$s) at %3$s.',
'bkp-next-backup-unknown' => 'The next backup is <b>not scheduled</b> yet.',
'bkp-button-backup-now' => 'Backup now!',
'bkp-button-restore-now' => 'Restore!',
'bkp-confirm-backup' => 'Please confirm that you do request the backup to occur right now.',
'bkp-confirm-restore' => 'Please confirm that you do want to restore the backup %1$s.',
'bkp-wait-backup' => 'Please wait for the backup to complete...',
'bkp-wait-restore' => 'Please wait for the restore to complete...',
'bkp-success-restore' => 'Restore successfully completed.',
));

View File

@@ -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' => '还原成功.',
]);

View File

@@ -0,0 +1,72 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
//////////////////////////////////////////////////////////////////////
// Note: The classes have been grouped by categories: bizmodel
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Classes in 'bizmodel'
//////////////////////////////////////////////////////////////////////
//
//
// Class: lnkFunctionalCIToProviderContract
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:lnkFunctionalCIToProviderContract' => 'Link FunctionalCI / ProviderContract',
'Class:lnkFunctionalCIToProviderContract+' => '',
'Class:lnkFunctionalCIToProviderContract/Name' => '%1$s / %2$s',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => 'Provider contract',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name' => 'Provider contract Name',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id' => 'CI',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name' => 'CI Name',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name+' => '',
));
//
// Class: lnkFunctionalCIToService
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:lnkFunctionalCIToService' => 'Link FunctionalCI / Service',
'Class:lnkFunctionalCIToService+' => '',
'Class:lnkFunctionalCIToService/Name' => '%1$s / %2$s',
'Class:lnkFunctionalCIToService/Attribute:service_id' => 'Service',
'Class:lnkFunctionalCIToService/Attribute:service_id+' => '',
'Class:lnkFunctionalCIToService/Attribute:service_name' => 'Service Name',
'Class:lnkFunctionalCIToService/Attribute:service_name+' => '',
'Class:lnkFunctionalCIToService/Attribute:functionalci_id' => 'CI',
'Class:lnkFunctionalCIToService/Attribute:functionalci_id+' => '',
'Class:lnkFunctionalCIToService/Attribute:functionalci_name' => 'CI Name',
'Class:lnkFunctionalCIToService/Attribute:functionalci_name+' => '',
));
//
// Class: FunctionalCI
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:FunctionalCI/Attribute:providercontracts_list' => 'Provider contracts',
'Class:FunctionalCI/Attribute:providercontracts_list+' => 'All the provider contracts for this configuration item',
'Class:FunctionalCI/Attribute:services_list' => 'Services',
'Class:FunctionalCI/Attribute:services_list+' => 'All the services impacted by this configuration item',
));
//
// Class: Document
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:Document/Attribute:contracts_list' => 'Contracts',
'Class:Document/Attribute:contracts_list+' => 'All the contracts linked to this document',
'Class:Document/Attribute:services_list' => 'Services',
'Class:Document/Attribute:services_list+' => 'All the services linked to this document',
));

View File

@@ -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~~',
]);

View File

@@ -0,0 +1,64 @@
<?php
// Copyright (C) 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/>
/**
* @author Benjamin Planque <benjamin.planque@combodo.com>
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
//////////////////////////////////////////////////////////////////////
// Note: The classes have been grouped by categories: bizmodel
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Classes in 'bizmodel'
//////////////////////////////////////////////////////////////////////
//
//
// Class: lnkFunctionalCIToTicket
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:lnkFunctionalCIToTicket' => 'Link FunctionalCI / Ticket',
'Class:lnkFunctionalCIToTicket+' => '',
'Class:lnkFunctionalCIToTicket/Name' => '%1$s / %2$s',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id' => 'Ticket',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref' => 'Ref',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_title' => 'Ticket title',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_title+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_id' => 'CI',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_id+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_name' => 'CI Name',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_name+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:impact' => 'Impact (text)',
'Class:lnkFunctionalCIToTicket/Attribute:impact+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:impact_code' => 'Impact',
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:manual' => 'Added manually',
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:computed' => 'Computed',
'Class:lnkFunctionalCIToTicket/Attribute:impact_code/Value:not_impacted' => 'Not impacted',
));
//
// Class: FunctionalCI
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:FunctionalCI/Attribute:tickets_list' => 'Tickets',
'Class:FunctionalCI/Attribute:tickets_list+' => 'All the tickets for this configuration item',
));

View File

@@ -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+' => '此配置项包含的所有工单',
]);

View File

@@ -0,0 +1,294 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
'Menu:ChangeManagement' => 'Change management',
'Menu:Change:Overview' => 'Overview',
'Menu:Change:Overview+' => '',
'Menu:NewChange' => 'New change',
'Menu:NewChange+' => 'Create a new change ticket',
'Menu:SearchChanges' => 'Search for changes',
'Menu:SearchChanges+' => 'Search for change tickets',
'Menu:Change:Shortcuts' => 'Shortcuts',
'Menu:Change:Shortcuts+' => '',
'Menu:WaitingAcceptance' => 'Changes awaiting acceptance',
'Menu:WaitingAcceptance+' => '',
'Menu:WaitingApproval' => 'Changes awaiting approval',
'Menu:WaitingApproval+' => '',
'Menu:Changes' => 'Open changes',
'Menu:Changes+' => 'All open changes',
'Menu:MyChanges' => 'Changes assigned to me',
'Menu:MyChanges+' => 'Changes assigned to me (as Agent)',
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => 'Changes by category for the last 7 days',
'UI-ChangeManagementOverview-Last-7-days' => 'Number of changes for the last 7 days',
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => 'Changes by domain for the last 7 days',
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => 'Changes by status for the last 7 days',
'Tickets:Related:OpenChanges' => 'Open changes',
'Tickets:Related:RecentChanges' => 'Recent changes (72h)',
));
// 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('EN GB', 'British English', 'British English', array(
'Class:Change' => 'Change',
'Class:Change+' => '',
'Class:Change/Attribute:status' => 'Status',
'Class:Change/Attribute:status+' => '',
'Class:Change/Attribute:status/Value:new' => 'New',
'Class:Change/Attribute:status/Value:new+' => '',
'Class:Change/Attribute:status/Value:validated' => 'Validated',
'Class:Change/Attribute:status/Value:validated+' => '',
'Class:Change/Attribute:status/Value:rejected' => 'Rejected',
'Class:Change/Attribute:status/Value:rejected+' => '',
'Class:Change/Attribute:status/Value:assigned' => 'Assigned',
'Class:Change/Attribute:status/Value:assigned+' => '',
'Class:Change/Attribute:status/Value:plannedscheduled' => 'Planned and scheduled',
'Class:Change/Attribute:status/Value:plannedscheduled+' => '',
'Class:Change/Attribute:status/Value:approved' => 'Approved',
'Class:Change/Attribute:status/Value:approved+' => '',
'Class:Change/Attribute:status/Value:notapproved' => 'Not approved',
'Class:Change/Attribute:status/Value:notapproved+' => '',
'Class:Change/Attribute:status/Value:implemented' => 'Implemented',
'Class:Change/Attribute:status/Value:implemented+' => '',
'Class:Change/Attribute:status/Value:monitored' => 'Monitored',
'Class:Change/Attribute:status/Value:monitored+' => '',
'Class:Change/Attribute:status/Value:closed' => 'Closed',
'Class:Change/Attribute:status/Value:closed+' => '',
'Class:Change/Attribute:reason' => 'Reject reason',
'Class:Change/Attribute:reason+' => '',
'Class:Change/Attribute:requestor_id' => 'Requestor',
'Class:Change/Attribute:requestor_id+' => '',
'Class:Change/Attribute:requestor_email' => 'Requestor email',
'Class:Change/Attribute:requestor_email+' => '',
'Class:Change/Attribute:creation_date' => 'Creation date',
'Class:Change/Attribute:creation_date+' => '',
'Class:Change/Attribute:impact' => 'Impact',
'Class:Change/Attribute:impact+' => '',
'Class:Change/Attribute:supervisor_group_id' => 'Supervisor team',
'Class:Change/Attribute:supervisor_group_id+' => '',
'Class:Change/Attribute:supervisor_group_name' => 'Supervisor team name',
'Class:Change/Attribute:supervisor_group_name+' => '',
'Class:Change/Attribute:supervisor_id' => 'Supervisor',
'Class:Change/Attribute:supervisor_id+' => '',
'Class:Change/Attribute:supervisor_email' => 'Supervisor email',
'Class:Change/Attribute:supervisor_email+' => '',
'Class:Change/Attribute:manager_group_id' => 'Manager team',
'Class:Change/Attribute:manager_group_id+' => '',
'Class:Change/Attribute:manager_group_name' => 'Manager team name',
'Class:Change/Attribute:manager_group_name+' => '',
'Class:Change/Attribute:manager_id' => 'Manager',
'Class:Change/Attribute:manager_id+' => '',
'Class:Change/Attribute:manager_email' => 'Manager email',
'Class:Change/Attribute:manager_email+' => '',
'Class:Change/Attribute:outage' => 'Outage',
'Class:Change/Attribute:outage+' => '',
'Class:Change/Attribute:outage/Value:no' => 'No',
'Class:Change/Attribute:outage/Value:no+' => '',
'Class:Change/Attribute:outage/Value:yes' => 'Yes',
'Class:Change/Attribute:outage/Value:yes+' => '',
'Class:Change/Attribute:fallback' => 'Fallback plan',
'Class:Change/Attribute:fallback+' => '',
'Class:Change/Attribute:parent_id' => 'Parent change',
'Class:Change/Attribute:parent_id+' => '',
'Class:Change/Attribute:parent_name' => 'Parent change Ref',
'Class:Change/Attribute:parent_name+' => '',
'Class:Change/Attribute:related_request_list' => 'Related requests',
'Class:Change/Attribute:related_request_list+' => 'All the user requests linked to this change',
'Class:Change/Attribute:related_problems_list' => 'Related problems',
'Class:Change/Attribute:related_problems_list+' => 'All the problems linked to this change',
'Class:Change/Attribute:related_incident_list' => 'Related incidents',
'Class:Change/Attribute:related_incident_list+' => 'All the incidents linked to this change',
'Class:Change/Attribute:child_changes_list' => 'Child changes',
'Class:Change/Attribute:child_changes_list+' => 'All the sub changes linked to this change',
'Class:Change/Attribute:parent_id_friendlyname' => 'Parent friendly name',
'Class:Change/Attribute:parent_id_friendlyname+' => '',
'Class:Change/Attribute:parent_id_finalclass_recall' => 'Change type',
'Class:Change/Attribute:parent_id_finalclass_recall+' => '',
'Class:Change/Stimulus:ev_validate' => 'Validate',
'Class:Change/Stimulus:ev_validate+' => '',
'Class:Change/Stimulus:ev_reject' => 'Reject',
'Class:Change/Stimulus:ev_reject+' => '',
'Class:Change/Stimulus:ev_assign' => 'Assign',
'Class:Change/Stimulus:ev_assign+' => '',
'Class:Change/Stimulus:ev_reopen' => 'Reopen',
'Class:Change/Stimulus:ev_reopen+' => '',
'Class:Change/Stimulus:ev_plan' => 'Plan',
'Class:Change/Stimulus:ev_plan+' => '',
'Class:Change/Stimulus:ev_approve' => 'Approve',
'Class:Change/Stimulus:ev_approve+' => '',
'Class:Change/Stimulus:ev_replan' => 'Replan',
'Class:Change/Stimulus:ev_replan+' => '',
'Class:Change/Stimulus:ev_notapprove' => 'Reject',
'Class:Change/Stimulus:ev_notapprove+' => '',
'Class:Change/Stimulus:ev_implement' => 'Implement',
'Class:Change/Stimulus:ev_implement+' => '',
'Class:Change/Stimulus:ev_monitor' => 'Monitor',
'Class:Change/Stimulus:ev_monitor+' => '',
'Class:Change/Stimulus:ev_finish' => 'Finish',
'Class:Change/Stimulus:ev_finish+' => '',
));
//
// Class: RoutineChange
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:RoutineChange' => 'Routine Change',
'Class:RoutineChange+' => '',
'Class:RoutineChange/Stimulus:ev_validate' => 'Validate',
'Class:RoutineChange/Stimulus:ev_validate+' => '',
'Class:RoutineChange/Stimulus:ev_reject' => 'Reject',
'Class:RoutineChange/Stimulus:ev_reject+' => '',
'Class:RoutineChange/Stimulus:ev_assign' => 'Assign',
'Class:RoutineChange/Stimulus:ev_assign+' => '',
'Class:RoutineChange/Stimulus:ev_reopen' => 'Reopen',
'Class:RoutineChange/Stimulus:ev_reopen+' => '',
'Class:RoutineChange/Stimulus:ev_plan' => 'Plan',
'Class:RoutineChange/Stimulus:ev_plan+' => '',
'Class:RoutineChange/Stimulus:ev_approve' => 'Approve',
'Class:RoutineChange/Stimulus:ev_approve+' => '',
'Class:RoutineChange/Stimulus:ev_replan' => 'Replan',
'Class:RoutineChange/Stimulus:ev_replan+' => '',
'Class:RoutineChange/Stimulus:ev_notapprove' => 'Do Not Approve',
'Class:RoutineChange/Stimulus:ev_notapprove+' => '',
'Class:RoutineChange/Stimulus:ev_implement' => 'Implement',
'Class:RoutineChange/Stimulus:ev_implement+' => '',
'Class:RoutineChange/Stimulus:ev_monitor' => 'Monitor',
'Class:RoutineChange/Stimulus:ev_monitor+' => '',
'Class:RoutineChange/Stimulus:ev_finish' => 'Finish',
'Class:RoutineChange/Stimulus:ev_finish+' => '',
));
//
// Class: ApprovedChange
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:ApprovedChange' => 'Approved Changes',
'Class:ApprovedChange+' => '',
'Class:ApprovedChange/Attribute:approval_date' => 'Approval Date',
'Class:ApprovedChange/Attribute:approval_date+' => '',
'Class:ApprovedChange/Attribute:approval_comment' => 'Approval comment',
'Class:ApprovedChange/Attribute:approval_comment+' => '',
'Class:ApprovedChange/Stimulus:ev_validate' => 'Validate',
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
'Class:ApprovedChange/Stimulus:ev_reject' => 'Reject',
'Class:ApprovedChange/Stimulus:ev_reject+' => '',
'Class:ApprovedChange/Stimulus:ev_assign' => 'Assign',
'Class:ApprovedChange/Stimulus:ev_assign+' => '',
'Class:ApprovedChange/Stimulus:ev_reopen' => 'Reopen',
'Class:ApprovedChange/Stimulus:ev_reopen+' => '',
'Class:ApprovedChange/Stimulus:ev_plan' => 'Plan',
'Class:ApprovedChange/Stimulus:ev_plan+' => '',
'Class:ApprovedChange/Stimulus:ev_approve' => 'Approve',
'Class:ApprovedChange/Stimulus:ev_approve+' => '',
'Class:ApprovedChange/Stimulus:ev_replan' => 'Replan',
'Class:ApprovedChange/Stimulus:ev_replan+' => '',
'Class:ApprovedChange/Stimulus:ev_notapprove' => 'Reject approval',
'Class:ApprovedChange/Stimulus:ev_notapprove+' => '',
'Class:ApprovedChange/Stimulus:ev_implement' => 'Implement',
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
'Class:ApprovedChange/Stimulus:ev_monitor' => 'Monitor',
'Class:ApprovedChange/Stimulus:ev_monitor+' => '',
'Class:ApprovedChange/Stimulus:ev_finish' => 'Finish',
'Class:ApprovedChange/Stimulus:ev_finish+' => '',
));
//
// Class: NormalChange
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:NormalChange' => 'Normal Change',
'Class:NormalChange+' => '',
'Class:NormalChange/Attribute:acceptance_date' => 'Acceptance date',
'Class:NormalChange/Attribute:acceptance_date+' => '',
'Class:NormalChange/Attribute:acceptance_comment' => 'Acceptance comment',
'Class:NormalChange/Attribute:acceptance_comment+' => '',
'Class:NormalChange/Stimulus:ev_validate' => 'Validate',
'Class:NormalChange/Stimulus:ev_validate+' => '',
'Class:NormalChange/Stimulus:ev_reject' => 'Reject',
'Class:NormalChange/Stimulus:ev_reject+' => '',
'Class:NormalChange/Stimulus:ev_assign' => 'Assign',
'Class:NormalChange/Stimulus:ev_assign+' => '',
'Class:NormalChange/Stimulus:ev_reopen' => 'Reopen',
'Class:NormalChange/Stimulus:ev_reopen+' => '',
'Class:NormalChange/Stimulus:ev_plan' => 'Plan',
'Class:NormalChange/Stimulus:ev_plan+' => '',
'Class:NormalChange/Stimulus:ev_approve' => 'Approve',
'Class:NormalChange/Stimulus:ev_approve+' => '',
'Class:NormalChange/Stimulus:ev_replan' => 'Replan',
'Class:NormalChange/Stimulus:ev_replan+' => '',
'Class:NormalChange/Stimulus:ev_notapprove' => 'Reject approval',
'Class:NormalChange/Stimulus:ev_notapprove+' => '',
'Class:NormalChange/Stimulus:ev_implement' => 'Implement',
'Class:NormalChange/Stimulus:ev_implement+' => '',
'Class:NormalChange/Stimulus:ev_monitor' => 'Monitor',
'Class:NormalChange/Stimulus:ev_monitor+' => '',
'Class:NormalChange/Stimulus:ev_finish' => 'Finish',
'Class:NormalChange/Stimulus:ev_finish+' => '',
));
//
// Class: EmergencyChange
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:EmergencyChange' => 'Emergency Change',
'Class:EmergencyChange+' => '',
'Class:EmergencyChange/Stimulus:ev_validate' => 'Validate',
'Class:EmergencyChange/Stimulus:ev_validate+' => '',
'Class:EmergencyChange/Stimulus:ev_reject' => 'Reject',
'Class:EmergencyChange/Stimulus:ev_reject+' => '',
'Class:EmergencyChange/Stimulus:ev_assign' => 'Assign',
'Class:EmergencyChange/Stimulus:ev_assign+' => '',
'Class:EmergencyChange/Stimulus:ev_reopen' => 'Reopen',
'Class:EmergencyChange/Stimulus:ev_reopen+' => '',
'Class:EmergencyChange/Stimulus:ev_plan' => 'Plan',
'Class:EmergencyChange/Stimulus:ev_plan+' => '',
'Class:EmergencyChange/Stimulus:ev_approve' => 'Approve',
'Class:EmergencyChange/Stimulus:ev_approve+' => '',
'Class:EmergencyChange/Stimulus:ev_replan' => 'Replan',
'Class:EmergencyChange/Stimulus:ev_replan+' => '',
'Class:EmergencyChange/Stimulus:ev_notapprove' => 'Reject approval',
'Class:EmergencyChange/Stimulus:ev_notapprove+' => '',
'Class:EmergencyChange/Stimulus:ev_implement' => 'Implement',
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
'Class:EmergencyChange/Stimulus:ev_monitor' => 'Monitor',
'Class:EmergencyChange/Stimulus:ev_monitor+' => '',
'Class:EmergencyChange/Stimulus:ev_finish' => 'Finish',
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
));

View File

@@ -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+' => '',
]);

View File

@@ -0,0 +1,140 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
'Menu:ChangeManagement' => 'Change management',
'Menu:Change:Overview' => 'Overview',
'Menu:Change:Overview+' => '',
'Menu:NewChange' => 'New change',
'Menu:NewChange+' => 'Create a new change ticket',
'Menu:SearchChanges' => 'Search for changes',
'Menu:SearchChanges+' => 'Search for change tickets',
'Menu:Change:Shortcuts' => 'Shortcuts',
'Menu:Change:Shortcuts+' => '',
'Menu:WaitingAcceptance' => 'Changes awaiting acceptance',
'Menu:WaitingAcceptance+' => '',
'Menu:WaitingApproval' => 'Changes awaiting approval',
'Menu:WaitingApproval+' => '',
'Menu:Changes' => 'Open changes',
'Menu:Changes+' => 'All open changes',
'Menu:MyChanges' => 'Changes assigned to me',
'Menu:MyChanges+' => 'Changes assigned to me (as Agent)',
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => 'Changes by category for the last 7 days',
'UI-ChangeManagementOverview-Last-7-days' => 'Number of changes for the last 7 days',
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => 'Changes by domain for the last 7 days',
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => 'Changes by status for the last 7 days',
'Tickets:Related:OpenChanges' => 'Open changes',
'Tickets:Related:RecentChanges' => 'Recent changes (72h)',
));
// 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('EN GB', 'British English', 'British English', array(
'Class:Change' => 'Change',
'Class:Change+' => '',
'Class:Change/Attribute:status' => 'Status',
'Class:Change/Attribute:status+' => '',
'Class:Change/Attribute:status/Value:new' => 'New',
'Class:Change/Attribute:status/Value:new+' => '',
'Class:Change/Attribute:status/Value:assigned' => 'Assigned',
'Class:Change/Attribute:status/Value:assigned+' => '',
'Class:Change/Attribute:status/Value:planned' => 'Planned',
'Class:Change/Attribute:status/Value:planned+' => '',
'Class:Change/Attribute:status/Value:rejected' => 'Rejected',
'Class:Change/Attribute:status/Value:rejected+' => '',
'Class:Change/Attribute:status/Value:approved' => 'Approved',
'Class:Change/Attribute:status/Value:approved+' => '',
'Class:Change/Attribute:status/Value:closed' => 'Closed',
'Class:Change/Attribute:status/Value:closed+' => '',
'Class:Change/Attribute:category' => 'Category',
'Class:Change/Attribute:category+' => '',
'Class:Change/Attribute:category/Value:application' => 'application',
'Class:Change/Attribute:category/Value:application+' => 'application',
'Class:Change/Attribute:category/Value:hardware' => 'hardware',
'Class:Change/Attribute:category/Value:hardware+' => 'hardware',
'Class:Change/Attribute:category/Value:network' => 'network',
'Class:Change/Attribute:category/Value:network+' => 'network',
'Class:Change/Attribute:category/Value:other' => 'other',
'Class:Change/Attribute:category/Value:other+' => 'other',
'Class:Change/Attribute:category/Value:software' => 'software',
'Class:Change/Attribute:category/Value:software+' => 'software',
'Class:Change/Attribute:category/Value:system' => 'system',
'Class:Change/Attribute:category/Value:system+' => 'system',
'Class:Change/Attribute:reject_reason' => 'Reject reason',
'Class:Change/Attribute:reject_reason+' => '',
'Class:Change/Attribute:changemanager_id' => 'Change manager',
'Class:Change/Attribute:changemanager_id+' => '',
'Class:Change/Attribute:changemanager_email' => 'Change manager email',
'Class:Change/Attribute:changemanager_email+' => '',
'Class:Change/Attribute:parent_id' => 'Parent change',
'Class:Change/Attribute:parent_id+' => '',
'Class:Change/Attribute:parent_name' => 'Parent change ref',
'Class:Change/Attribute:parent_name+' => '',
'Class:Change/Attribute:creation_date' => 'Creation date',
'Class:Change/Attribute:creation_date+' => '',
'Class:Change/Attribute:approval_date' => 'Approval date',
'Class:Change/Attribute:approval_date+' => '',
'Class:Change/Attribute:fallback_plan' => 'Fallback plan',
'Class:Change/Attribute:fallback_plan+' => '',
'Class:Change/Attribute:related_request_list' => 'Related requests',
'Class:Change/Attribute:related_request_list+' => 'All the user requests linked to this change',
'Class:Change/Attribute:related_incident_list' => 'Related incidents',
'Class:Change/Attribute:related_incident_list+' => 'All the incidents linked to this change',
'Class:Change/Attribute:related_problems_list' => 'Related problems',
'Class:Change/Attribute:related_problems_list+' => 'All the problems linked to this change',
'Class:Change/Attribute:child_changes_list' => 'Child changes',
'Class:Change/Attribute:child_changes_list+' => 'All the sub changes linked to this change',
'Class:Change/Attribute:parent_id_friendlyname' => 'Parent change friendly name',
'Class:Change/Attribute:parent_id_friendlyname+' => '',
'Class:Change/Stimulus:ev_assign' => 'Assign',
'Class:Change/Stimulus:ev_assign+' => '',
'Class:Change/Stimulus:ev_plan' => 'Plan',
'Class:Change/Stimulus:ev_plan+' => '',
'Class:Change/Stimulus:ev_reject' => 'Reject',
'Class:Change/Stimulus:ev_reject+' => '',
'Class:Change/Stimulus:ev_reopen' => 'Reopen',
'Class:Change/Stimulus:ev_reopen+' => '',
'Class:Change/Stimulus:ev_approve' => 'Approve',
'Class:Change/Stimulus:ev_approve+' => '',
'Class:Change/Stimulus:ev_finish' => 'Close',
'Class:Change/Stimulus:ev_finish+' => '',
'Class:Change/Attribute:outage' => 'Outage',
'Class:Change/Attribute:outage+' => '',
'Class:Change/Attribute:outage/Value:no' => 'No',
'Class:Change/Attribute:outage/Value:no+' => '',
'Class:Change/Attribute:outage/Value:yes' => 'Yes',
'Class:Change/Attribute:outage/Value:yes+' => '',
));

View File

@@ -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+' => '',
]);

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,43 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
'Menu:ConfigFileEditor' => 'Plain text editor',
'config-edit-title' => 'Configuration File Editor',
'config-edit-intro' => 'Be very cautious when editing the configuration file.',
'config-apply' => 'Apply',
'config-apply-title' => 'Apply (Ctrl+S)',
'config-cancel' => 'Reset',
'config-saved' => 'Successfully recorded.',
'config-confirm-cancel' => 'Your changes will be lost.',
'config-no-change' => 'No change: the file has been left unchanged.',
'config-reverted' => 'The configuration has been reverted.',
'config-parse-error' => 'Line %2$d: %1$s.<br/>The file has NOT been updated.',
'config-current-line' => 'Editing line: %1$s',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.',
'config-error-transaction' => 'Error: invalid Transaction ID. The configuration was <b>NOT</b> modified.',
'config-error-file-changed' => 'Error: The Configuration file has changed since you opened it and cannot be saved. Refresh and apply your changes again.',
'config-not-allowed-in-demo' => 'Sorry, '.ITOP_APPLICATION_SHORT.' is in <b>demonstration mode</b>: the configuration file cannot be edited.',
'config-interactive-not-allowed' => ITOP_APPLICATION_SHORT." interactive edition of the configuration as been disabled. See <code>'config_editor' => 'disabled'</code> in the configuration file.",
));

View File

@@ -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>.',
]);

View File

@@ -0,0 +1,127 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
'iTopUpdate:UI:PageTitle' => 'Application Upgrade',
'itop-core-update:UI:SelectUpdateFile' => 'Application Upgrade',
'itop-core-update:UI:ConfirmUpdate' => 'Confirm Application Upgrade',
'itop-core-update:UI:UpdateCoreFiles' => 'Application Upgrading',
'iTopUpdate:UI:MaintenanceModeActive' => 'The application is currently under maintenance in read-only mode. You have to run a setup to return to normal mode.',
'itop-core-update:UI:UpdateDone' => 'Application Upgrade',
'itop-core-update/Operation:SelectUpdateFile/Title' => 'Application Upgrade',
'itop-core-update/Operation:ConfirmUpdate/Title' => 'Confirm Application Upgrade',
'itop-core-update/Operation:UpdateCoreFiles/Title' => 'Application Upgrading',
'itop-core-update/Operation:UpdateDone/Title' => 'Application Upgrade Done',
'iTopUpdate:UI:SelectUpdateFile' => 'Select an upgrade file to upload',
'iTopUpdate:UI:CheckUpdate' => 'Verify upgrade file',
'iTopUpdate:UI:ConfirmInstallFile' => 'You are about to install %1$s',
'iTopUpdate:UI:DoUpdate' => 'Upgrade',
'iTopUpdate:UI:CurrentVersion' => 'Current installed version',
'iTopUpdate:UI:NewVersion' => 'Newly installed version',
'iTopUpdate:UI:Back' => 'Back',
'iTopUpdate:UI:Cancel' => 'Cancel',
'iTopUpdate:UI:Continue' => 'Continue',
'iTopUpdate:UI:RunSetup' => 'Run Setup',
'iTopUpdate:UI:WithDBBackup' => 'Database backup',
'iTopUpdate:UI:WithFilesBackup' => 'Application files backup',
'iTopUpdate:UI:WithoutBackup' => 'No backup is planned',
'iTopUpdate:UI:Backup' => 'Backup generated before update',
'iTopUpdate:UI:DoFilesArchive' => 'Archive application files',
'iTopUpdate:UI:UploadArchive' => 'Select a package to upload',
'iTopUpdate:UI:ServerFile' => 'Path of a package already on the server',
'iTopUpdate:UI:WarningReadOnlyDuringUpdate' => 'During the upgrade, the application will be read-only.',
'iTopUpdate:UI:Status' => 'Status',
'iTopUpdate:UI:Action' => 'Update',
'iTopUpdate:UI:Setup' => ITOP_APPLICATION_SHORT.' Setup',
'iTopUpdate:UI:History' => 'Versions History',
'iTopUpdate:UI:Progress' => 'Progress of the upgrade',
'iTopUpdate:UI:DoBackup:Label' => 'Backup files and database',
'iTopUpdate:UI:DoBackup:Warning' => 'Backup is not recommended due to limited available disk space',
'iTopUpdate:UI:DiskFreeSpace' => 'Disk free space',
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.' disk space',
'iTopUpdate:UI:DBDiskSpace' => 'Database disk space',
'iTopUpdate:UI:FileUploadMaxSize' => 'File upload max size',
'iTopUpdate:UI:PostMaxSize' => 'PHP ini value post_max_size: %1$s',
'iTopUpdate:UI:UploadMaxFileSize' => 'PHP ini value upload_max_filesize: %1$s',
'iTopUpdate:UI:CanCoreUpdate:Loading' => 'Checking files',
'iTopUpdate:UI:CanCoreUpdate:Error' => 'Checking files failed (%1$s)',
'iTopUpdate:UI:CanCoreUpdate:ErrorFileNotExist' => 'Checking files failed (File not exist %1$s)',
'iTopUpdate:UI:CanCoreUpdate:Failed' => 'Checking files failed',
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Application can be updated',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Application cannot be updated: %1$s',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Warning: application update can fail: %1$s',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check',
'iTopUpdate:UI:SetupLaunch' => 'Launch '.ITOP_APPLICATION_SHORT.' Setup',
'iTopUpdate:UI:SetupLaunchConfirm' => 'This will launch '.ITOP_APPLICATION_SHORT.' setup, are you sure?',
'iTopUpdate:UI:FastSetupLaunch' => 'Fast Setup',
// Setup Messages
'iTopUpdate:UI:SetupMessage:Ready' => 'Ready to start',
'iTopUpdate:UI:SetupMessage:EnterMaintenance' => 'Entering maintenance mode',
'iTopUpdate:UI:SetupMessage:Backup' => 'Database backup',
'iTopUpdate:UI:SetupMessage:FilesArchive' => 'Archive application files',
'iTopUpdate:UI:SetupMessage:CopyFiles' => 'Copy new version files',
'iTopUpdate:UI:SetupMessage:CheckCompile' => 'Check application upgrade',
'iTopUpdate:UI:SetupMessage:Compile' => 'Upgrade application',
'iTopUpdate:UI:SetupMessage:UpdateDatabase' => 'Upgrade database',
'iTopUpdate:UI:SetupMessage:ExitMaintenance' => 'Exiting maintenance mode',
'iTopUpdate:UI:SetupMessage:UpdateDone' => 'Upgrade completed',
// Errors
'iTopUpdate:Error:MissingFunction' => 'Impossible to start upgrade, missing function',
'iTopUpdate:Error:MissingFile' => 'Missing file: %1$s',
'iTopUpdate:Error:CorruptedFile' => 'File %1$s is corrupted',
'iTopUpdate:Error:BadFileFormat' => 'Upgrade file is not a zip file',
'iTopUpdate:Error:BadFileContent' => 'Upgrade file is not an application archive',
'iTopUpdate:Error:BadItopProduct' => 'Upgrade file is not compatible with your application',
'iTopUpdate:Error:Copy' => 'Error, cannot copy \'%1$s\' to \'%2$s\'',
'iTopUpdate:Error:FileNotFound' => 'File not found',
'iTopUpdate:Error:NoFile' => 'No file provided',
'iTopUpdate:Error:InvalidToken' => 'Invalid token',
'iTopUpdate:Error:UpdateFailed' => 'Upgrade failed',
'iTopUpdate:Error:FileUploadMaxSizeTooSmall' => 'The upload max size seems too small for update. Please change the PHP configuration.',
'iTopUpdate:UI:RestoreArchive' => 'You can restore your application from the archive \'%1$s\'',
'iTopUpdate:UI:RestoreBackup' => 'You can restore the database from \'%1$s\'',
'iTopUpdate:UI:UpdateDone' => 'Upgrade successful',
'Menu:iTopUpdate' => 'Application upgrade',
'Menu:iTopUpdate+' => 'Application upgrade',
// Missing itop entries
'Class:ModuleInstallation/Attribute:installed' => 'Installed on',
'Class:ModuleInstallation/Attribute:name' => 'Name',
'Class:ModuleInstallation/Attribute:version' => 'Version',
'Class:ModuleInstallation/Attribute:comment' => 'Comment',
));

View File

@@ -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' => '备注',
]);

View File

@@ -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);
}
});

View File

@@ -0,0 +1,26 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
// Dictionary entries go here
));

View File

@@ -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
));

View File

@@ -0,0 +1,26 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
// Dictionary entries go here
));

View File

@@ -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
));

View File

@@ -0,0 +1,96 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
'Class:FAQ' => 'FAQ',
'Class:FAQ+' => 'Frequently asked questions',
'Class:FAQ/Attribute:title' => 'Title',
'Class:FAQ/Attribute:title+' => '',
'Class:FAQ/Attribute:summary' => 'Summary',
'Class:FAQ/Attribute:summary+' => '',
'Class:FAQ/Attribute:description' => 'Description',
'Class:FAQ/Attribute:description+' => '',
'Class:FAQ/Attribute:category_id' => 'Category',
'Class:FAQ/Attribute:category_id+' => '',
'Class:FAQ/Attribute:category_name' => 'Category name',
'Class:FAQ/Attribute:category_name+' => '',
'Class:FAQ/Attribute:error_code' => 'Error code',
'Class:FAQ/Attribute:error_code+' => '',
'Class:FAQ/Attribute:key_words' => 'Key words',
'Class:FAQ/Attribute:key_words+' => '',
'Class:FAQ/Attribute:domains' => 'Domains',
));
//
// Class: FAQCategory
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:FAQCategory' => 'FAQ Category',
'Class:FAQCategory+' => 'Category for FAQ',
'Class:FAQCategory/Attribute:name' => 'Name',
'Class:FAQCategory/Attribute:name+' => '',
'Class:FAQCategory/Attribute:faq_list' => 'FAQs',
'Class:FAQCategory/Attribute:faq_list+' => 'All the frequently asked questions related to this category',
));
Dict::Add('EN GB', 'British English', 'British English', array(
'Menu:ProblemManagement' => 'Problem management',
'Menu:ProblemManagement+' => 'Problem management',
'Menu:Problem:Shortcuts' => 'Shortcuts',
'Menu:FAQCategory' => 'FAQ categories',
'Menu:FAQCategory+' => 'All FAQ categories',
'Menu:FAQ' => 'FAQs',
'Menu:FAQ+' => 'All FAQs',
'Brick:Portal:FAQ:Menu' => 'FAQ',
'Brick:Portal:FAQ:Title' => 'Frequently Asked Questions',
'Brick:Portal:FAQ:Title+' => '<p>In a hurry?</p><p>Check out the list of most common questions and (maybe) find the expected answer right away.</p>',
));

View File

@@ -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>',
]);

View File

@@ -0,0 +1,32 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Missing file: %1$s',
'FilesInformation:Error:CorruptedFile' => 'File %1$s is corrupted',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s',
'FilesInformation:Error:CantWriteToFile' => 'Can not write to file %1$s',
));

View File

@@ -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 无法写入',
]);

View File

@@ -0,0 +1,87 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
// Dictionary entries go here
'Menu:iTopHub' => 'iTop Hub',
'Menu:iTopHub:Register' => 'Connect to iTop Hub',
'Menu:iTopHub:Register+' => 'Go to iTop Hub to update your '.ITOP_APPLICATION_SHORT.' instance',
'Menu:iTopHub:Register:Description' => '<p>Get access to your community platform iTop Hub!<br>Find all the content and information you need, manage your instances through personalized tools & install more extensions.<br><br>By connecting to the Hub from this page, you will push information about this '.ITOP_APPLICATION_SHORT.' instance into the Hub.</p>',
'Menu:iTopHub:MyExtensions' => 'Deployed extensions',
'Menu:iTopHub:MyExtensions+' => 'See the list of extensions deployed on this instance of '.ITOP_APPLICATION_SHORT,
'Menu:iTopHub:BrowseExtensions' => 'Get extensions from iTop Hub',
'Menu:iTopHub:BrowseExtensions+' => 'Browse for more extensions on iTop Hub',
'Menu:iTopHub:BrowseExtensions:Description' => '<p>Look into iTop Hubs store, your one stop place to find wonderful iTop extensions !<br>Find the ones that will help you customize and adapt '.ITOP_APPLICATION_SHORT.' to your processes.<br><br>By connecting to the Hub from this page, you will push information about this '.ITOP_APPLICATION_SHORT.' instance into the Hub.</p>',
'iTopHub:GoBtn' => 'Go To iTop Hub',
'iTopHub:CloseBtn' => 'Close',
'iTopHub:GoBtn:Tooltip' => 'Jump to www.itophub.io',
'iTopHub:OpenInNewWindow' => 'Open iTop Hub in a new window',
'iTopHub:AutoSubmit' => 'Don\'t ask me again. Next time, go to iTop Hub automatically.',
'UI:About:RemoteExtensionSource' => 'iTop Hub',
'iTopHub:Explanation' => 'By clicking this button you will be redirected to iTop Hub.',
'iTopHub:BackupFreeDiskSpaceIn' => '%1$s free disk space in %2$s.',
'iTopHub:FailedToCheckFreeDiskSpace' => 'Failed to check free disk space.',
'iTopHub:BackupOk' => 'Backup Ok.',
'iTopHub:BackupFailed' => 'Backup failed!',
'iTopHub:Landing:Status' => 'Deployment status',
'iTopHub:Landing:Install' => 'Deploying extensions...',
'iTopHub:CompiledOK' => 'Compilation successful.',
'iTopHub:ConfigurationSafelyReverted' => 'Error detected during deployment!<br>'.ITOP_APPLICATION_SHORT.' configuration has NOT been modified.',
'iTopHub:FailAuthent' => 'Authentication failed for this action.',
'iTopHub:InstalledExtensions' => 'Extensions deployed on this instance',
'iTopHub:ExtensionCategory:Manual' => 'Extensions deployed manually',
'iTopHub:ExtensionCategory:Manual+' => 'The following extensions have been deployed by copying them manually in the %1$s directory of '.ITOP_APPLICATION_SHORT.':',
'iTopHub:ExtensionCategory:Remote' => 'Extensions deployed from iTop Hub',
'iTopHub:ExtensionCategory:Remote+' => 'The following extensions have been deployed from iTop Hub:',
'iTopHub:NoExtensionInThisCategory' => 'There is no extension in this category',
'iTopHub:NoExtensionInThisCategory+' => 'Browse iTop Hub to find the extensions that will help you customize and adapt '.ITOP_APPLICATION_SHORT.' to your processes !',
'iTopHub:ExtensionNotInstalled' => 'Not installed',
'iTopHub:GetMoreExtensions' => 'Get extensions from iTop Hub...',
'iTopHub:LandingWelcome' => 'Congratulations! The following extensions were downloaded from iTop Hub and deployed into your '.ITOP_APPLICATION_SHORT.'.',
'iTopHub:GoBackToITopBtn' => 'Go Back to '.ITOP_APPLICATION_SHORT,
'iTopHub:Uncompressing' => 'Uncompressing extensions...',
'iTopHub:InstallationWelcome' => 'Installation of the extensions downloaded from iTop Hub',
'iTopHub:DBBackupLabel' => 'Instance backup',
'iTopHub:DBBackupSentence' => 'Do a backup of the database and '.ITOP_APPLICATION_SHORT.' configuration before updating',
'iTopHub:DeployBtn' => 'Deploy !',
'iTopHub:DatabaseBackupProgress' => 'Instance backup...',
'iTopHub:InstallationEffect:Install' => 'Version: %1$s will be installed.',
'iTopHub:InstallationEffect:NoChange' => 'Version: %1$s already installed. Nothing will change.',
'iTopHub:InstallationEffect:Upgrade' => 'Will be <b>upgraded</b> from version %1$s to version %2$s.',
'iTopHub:InstallationEffect:Downgrade' => 'Will be <b>DOWNGRADED</b> from version %1$s to version %2$s.',
'iTopHub:InstallationProgress:DatabaseBackup' => ITOP_APPLICATION_SHORT.' Instance backup...',
'iTopHub:InstallationProgress:ExtensionsInstallation' => 'Installation of the extensions',
'iTopHub:InstallationEffect:MissingDependencies' => 'This extension cannot be installed because of unmet dependencies.',
'iTopHub:InstallationEffect:MissingDependencies_Details' => 'The extension requires the module(s): %1$s',
'iTopHub:InstallationProgress:InstallationSuccessful' => 'Installation successful!',
'iTopHub:InstallationStatus:Installed_Version' => '%1$s version: %2$s.',
'iTopHub:InstallationStatus:Installed' => 'Installed',
'iTopHub:InstallationStatus:Version_NotInstalled' => 'Version %1$s <b>NOT</b> installed.',
));

View File

@@ -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> 安装.',
]);

View File

@@ -0,0 +1,243 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
'Menu:IncidentManagement' => 'Incident Management',
'Menu:IncidentManagement+' => '',
'Menu:Incident:Overview' => 'Overview',
'Menu:Incident:Overview+' => '',
'Menu:NewIncident' => 'New incident',
'Menu:NewIncident+' => 'Create a new incident ticket',
'Menu:SearchIncidents' => 'Search for incidents',
'Menu:SearchIncidents+' => 'Search for incident tickets',
'Menu:Incident:Shortcuts' => 'Shortcuts',
'Menu:Incident:Shortcuts+' => '',
'Menu:Incident:MyIncidents' => 'Incidents assigned to me',
'Menu:Incident:MyIncidents+' => 'Incidents assigned to me (as Agent)',
'Menu:Incident:EscalatedIncidents' => 'Escalated incidents',
'Menu:Incident:EscalatedIncidents+' => '',
'Menu:Incident:OpenIncidents' => 'All open incidents',
'Menu:Incident:OpenIncidents+' => '',
'UI-IncidentManagementOverview-IncidentByPriority-last-14-days' => 'Last 14 days incident per priority',
'UI-IncidentManagementOverview-Last-14-days' => 'Last 14 days number of incidents',
'UI-IncidentManagementOverview-OpenIncidentByStatus' => 'Open incidents by status',
'UI-IncidentManagementOverview-OpenIncidentByAgent' => 'Open incidents by agent',
'UI-IncidentManagementOverview-OpenIncidentByCustomer' => 'Open incidents by customer',
));
// 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('EN GB', 'British English', 'British English', array(
'Class:Incident' => 'Incident',
'Class:Incident+' => '',
'Class:Incident/Attribute:status' => 'Status',
'Class:Incident/Attribute:status+' => '',
'Class:Incident/Attribute:status/Value:new' => 'New',
'Class:Incident/Attribute:status/Value:new+' => '',
'Class:Incident/Attribute:status/Value:escalated_tto' => 'Escalated TTO',
'Class:Incident/Attribute:status/Value:escalated_tto+' => '',
'Class:Incident/Attribute:status/Value:assigned' => 'Assigned',
'Class:Incident/Attribute:status/Value:assigned+' => '',
'Class:Incident/Attribute:status/Value:escalated_ttr' => 'Escalated TTR',
'Class:Incident/Attribute:status/Value:escalated_ttr+' => '',
'Class:Incident/Attribute:status/Value:waiting_for_approval' => 'Waiting for approval',
'Class:Incident/Attribute:status/Value:waiting_for_approval+' => '',
'Class:Incident/Attribute:status/Value:pending' => 'Pending',
'Class:Incident/Attribute:status/Value:pending+' => '',
'Class:Incident/Attribute:status/Value:resolved' => 'Resolved',
'Class:Incident/Attribute:status/Value:resolved+' => '',
'Class:Incident/Attribute:status/Value:closed' => 'Closed',
'Class:Incident/Attribute:status/Value:closed+' => '',
'Class:Incident/Attribute:impact' => 'Impact',
'Class:Incident/Attribute:impact+' => 'Impact is the severity of the incident, how many end users are affected',
'Class:Incident/Attribute:impact/Value:1' => 'A department',
'Class:Incident/Attribute:impact/Value:1+' => '',
'Class:Incident/Attribute:impact/Value:2' => 'A service',
'Class:Incident/Attribute:impact/Value:2+' => '',
'Class:Incident/Attribute:impact/Value:3' => 'A person',
'Class:Incident/Attribute:impact/Value:3+' => '',
'Class:Incident/Attribute:priority' => 'Priority',
'Class:Incident/Attribute:priority+' => 'Order in which tickets need to be handled',
'Class:Incident/Attribute:priority/Value:1' => 'Critical',
'Class:Incident/Attribute:priority/Value:1+' => '',
'Class:Incident/Attribute:priority/Value:2' => 'High',
'Class:Incident/Attribute:priority/Value:2+' => '',
'Class:Incident/Attribute:priority/Value:3' => 'Medium',
'Class:Incident/Attribute:priority/Value:3+' => '',
'Class:Incident/Attribute:priority/Value:4' => 'Low',
'Class:Incident/Attribute:priority/Value:4+' => '',
'Class:Incident/Attribute:urgency' => 'Urgency',
'Class:Incident/Attribute:urgency+' => 'How quickly the fault needs to be resolved',
'Class:Incident/Attribute:urgency/Value:1' => 'Critical',
'Class:Incident/Attribute:urgency/Value:1+' => '',
'Class:Incident/Attribute:urgency/Value:2' => 'High',
'Class:Incident/Attribute:urgency/Value:2+' => '',
'Class:Incident/Attribute:urgency/Value:3' => 'Medium',
'Class:Incident/Attribute:urgency/Value:3+' => '',
'Class:Incident/Attribute:urgency/Value:4' => 'Low',
'Class:Incident/Attribute:urgency/Value:4+' => '',
'Class:Incident/Attribute:origin' => 'Origin',
'Class:Incident/Attribute:origin+' => 'What\'s the trigger of this incident ticket creation',
'Class:Incident/Attribute:origin/Value:in_person' => 'In-person',
'Class:Incident/Attribute:origin/Value:in_person+' => 'Incident created following a face-to-face discussion',
'Class:Incident/Attribute:origin/Value:chat' => 'Chat',
'Class:Incident/Attribute:origin/Value:chat+' => 'Incident created following a ',
'Class:Incident/Attribute:origin/Value:mail' => 'Email',
'Class:Incident/Attribute:origin/Value:mail+' => 'Incident created on an email reception',
'Class:Incident/Attribute:origin/Value:monitoring' => 'Monitoring',
'Class:Incident/Attribute:origin/Value:monitoring+' => 'Incident created on a monitoring alert',
'Class:Incident/Attribute:origin/Value:phone' => 'Phone',
'Class:Incident/Attribute:origin/Value:phone+' => 'Incident created following a telephone call',
'Class:Incident/Attribute:origin/Value:portal' => 'Portal',
'Class:Incident/Attribute:origin/Value:portal+' => 'Incident created on the user portal',
'Class:Incident/Attribute:service_id' => 'Service',
'Class:Incident/Attribute:service_id+' => '',
'Class:Incident/Attribute:service_name' => 'Service name',
'Class:Incident/Attribute:service_name+' => '',
'Class:Incident/Attribute:servicesubcategory_id' => 'Service subcategory',
'Class:Incident/Attribute:servicesubcategory_id+' => '',
'Class:Incident/Attribute:servicesubcategory_name' => 'Service subcategory name',
'Class:Incident/Attribute:servicesubcategory_name+' => '',
'Class:Incident/Attribute:escalation_flag' => 'Hot Flag',
'Class:Incident/Attribute:escalation_flag+' => '',
'Class:Incident/Attribute:escalation_flag/Value:no' => 'No',
'Class:Incident/Attribute:escalation_flag/Value:no+' => '',
'Class:Incident/Attribute:escalation_flag/Value:yes' => 'Yes',
'Class:Incident/Attribute:escalation_flag/Value:yes+' => '',
'Class:Incident/Attribute:escalation_reason' => 'Hot reason',
'Class:Incident/Attribute:escalation_reason+' => '',
'Class:Incident/Attribute:assignment_date' => 'Assignment date',
'Class:Incident/Attribute:assignment_date+' => '',
'Class:Incident/Attribute:resolution_date' => 'Resolution date',
'Class:Incident/Attribute:resolution_date+' => '',
'Class:Incident/Attribute:last_pending_date' => 'Last pending date',
'Class:Incident/Attribute:last_pending_date+' => '',
'Class:Incident/Attribute:cumulatedpending' => 'Cumulated pending',
'Class:Incident/Attribute:cumulatedpending+' => '',
'Class:Incident/Attribute:tto' => 'TTO',
'Class:Incident/Attribute:tto+' => 'Time To Own',
'Class:Incident/Attribute:ttr' => 'TTR',
'Class:Incident/Attribute:ttr+' => 'Time To Resolve',
'Class:Incident/Attribute:tto_escalation_deadline' => 'TTO Deadline',
'Class:Incident/Attribute:tto_escalation_deadline+' => '',
'Class:Incident/Attribute:sla_tto_passed' => 'SLA tto passed',
'Class:Incident/Attribute:sla_tto_passed+' => '',
'Class:Incident/Attribute:sla_tto_over' => 'SLA tto over',
'Class:Incident/Attribute:sla_tto_over+' => '',
'Class:Incident/Attribute:ttr_escalation_deadline' => 'TTR Deadline',
'Class:Incident/Attribute:ttr_escalation_deadline+' => '',
'Class:Incident/Attribute:sla_ttr_passed' => 'SLA ttr passed',
'Class:Incident/Attribute:sla_ttr_passed+' => '',
'Class:Incident/Attribute:sla_ttr_over' => 'SLA ttr over',
'Class:Incident/Attribute:sla_ttr_over+' => '',
'Class:Incident/Attribute:time_spent' => 'Resolution delay',
'Class:Incident/Attribute:time_spent+' => '',
'Class:Incident/Attribute:resolution_code' => 'Resolution code',
'Class:Incident/Attribute:resolution_code+' => 'What was done to resolve the incident?',
'Class:Incident/Attribute:resolution_code/Value:assistance' => 'Assistance',
'Class:Incident/Attribute:resolution_code/Value:assistance+' => '',
'Class:Incident/Attribute:resolution_code/Value:bug fixed' => 'Bug fixed',
'Class:Incident/Attribute:resolution_code/Value:bug fixed+' => '',
'Class:Incident/Attribute:resolution_code/Value:hardware repair' => 'Hardware repair',
'Class:Incident/Attribute:resolution_code/Value:hardware repair+' => '',
'Class:Incident/Attribute:resolution_code/Value:other' => 'Other',
'Class:Incident/Attribute:resolution_code/Value:other+' => '',
'Class:Incident/Attribute:resolution_code/Value:software patch' => 'Software patch',
'Class:Incident/Attribute:resolution_code/Value:software patch+' => '',
'Class:Incident/Attribute:resolution_code/Value:system update' => 'System update',
'Class:Incident/Attribute:resolution_code/Value:system update+' => '',
'Class:Incident/Attribute:resolution_code/Value:training' => 'Training',
'Class:Incident/Attribute:resolution_code/Value:training+' => '',
'Class:Incident/Attribute:solution' => 'Solution',
'Class:Incident/Attribute:solution+' => '',
'Class:Incident/Attribute:pending_reason' => 'Pending reason',
'Class:Incident/Attribute:pending_reason+' => '',
'Class:Incident/Attribute:parent_incident_id' => 'Parent incident',
'Class:Incident/Attribute:parent_incident_id+' => '',
'Class:Incident/Attribute:parent_incident_ref' => 'Parent incident ref',
'Class:Incident/Attribute:parent_incident_ref+' => '',
'Class:Incident/Attribute:parent_change_id' => 'Parent change',
'Class:Incident/Attribute:parent_change_id+' => '',
'Class:Incident/Attribute:parent_change_ref' => 'Parent change ref',
'Class:Incident/Attribute:parent_change_ref+' => '',
'Class:Incident/Attribute:parent_problem_id' => 'Parent problem id',
'Class:Incident/Attribute:parent_problem_id+' => '',
'Class:Incident/Attribute:parent_problem_ref' => 'Parent problem ref',
'Class:Incident/Attribute:parent_problem_ref+' => '',
'Class:Incident/Attribute:related_request_list' => 'Child requests',
'Class:Incident/Attribute:related_request_list+' => '',
'Class:Incident/Attribute:child_incidents_list' => 'Child incidents',
'Class:Incident/Attribute:child_incidents_list+' => 'All the child incidents related to this incident',
'Class:Incident/Attribute:public_log' => 'Public log',
'Class:Incident/Attribute:public_log+' => '',
'Class:Incident/Attribute:user_satisfaction' => 'User satisfaction',
'Class:Incident/Attribute:user_satisfaction+' => '',
'Class:Incident/Attribute:user_satisfaction/Value:1' => 'Very satisfied',
'Class:Incident/Attribute:user_satisfaction/Value:1+' => '',
'Class:Incident/Attribute:user_satisfaction/Value:2' => 'Fairly satisfied',
'Class:Incident/Attribute:user_satisfaction/Value:2+' => '',
'Class:Incident/Attribute:user_satisfaction/Value:3' => 'Rather Dissatisfied',
'Class:Incident/Attribute:user_satisfaction/Value:3+' => '',
'Class:Incident/Attribute:user_satisfaction/Value:4' => 'Very Dissatisfied',
'Class:Incident/Attribute:user_satisfaction/Value:4+' => '',
'Class:Incident/Attribute:user_comment' => 'User comment',
'Class:Incident/Attribute:user_comment+' => '',
'Class:Incident/Attribute:parent_incident_id_friendlyname' => 'parent_incident_id_friendlyname',
'Class:Incident/Attribute:parent_incident_id_friendlyname+' => '',
'Class:Incident/Stimulus:ev_assign' => 'Assign',
'Class:Incident/Stimulus:ev_assign+' => '',
'Class:Incident/Stimulus:ev_reassign' => 'Re-assign',
'Class:Incident/Stimulus:ev_reassign+' => '',
'Class:Incident/Stimulus:ev_pending' => 'Pending',
'Class:Incident/Stimulus:ev_pending+' => '',
'Class:Incident/Stimulus:ev_timeout' => 'Timeout',
'Class:Incident/Stimulus:ev_timeout+' => '',
'Class:Incident/Stimulus:ev_autoresolve' => 'Automatic resolve',
'Class:Incident/Stimulus:ev_autoresolve+' => '',
'Class:Incident/Stimulus:ev_autoclose' => 'Automatic close',
'Class:Incident/Stimulus:ev_autoclose+' => '',
'Class:Incident/Stimulus:ev_resolve' => 'Mark as resolved',
'Class:Incident/Stimulus:ev_resolve+' => '',
'Class:Incident/Stimulus:ev_close' => 'Close this request',
'Class:Incident/Stimulus:ev_close+' => '',
'Class:Incident/Stimulus:ev_reopen' => 'Re-open',
'Class:Incident/Stimulus:ev_reopen+' => '',
'Class:Incident/Error:CannotAssignParentIncidentIdToSelf' => 'Cannot assign the Parent incident to the incident itself',
'Class:Incident/Method:ResolveChildTickets' => 'ResolveChildTickets',
'Class:Incident/Method:ResolveChildTickets+' => 'Cascade the resolution to child ticket (ev_autoresolve), and align the following characteristics: service, team, agent, resolution info.',
'Tickets:Related:OpenIncidents' => 'Open incidents',
));

View File

@@ -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' => '打开的事件 (按状态)',
]);

View File

@@ -0,0 +1,148 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://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('EN GB', 'British English', 'British English', array(
'Class:KnownError' => 'Known Error',
'Class:KnownError+' => 'Error documented for a known issue',
'Class:KnownError/Attribute:name' => 'Name',
'Class:KnownError/Attribute:name+' => '',
'Class:KnownError/Attribute:org_id' => 'Customer',
'Class:KnownError/Attribute:org_id+' => '',
'Class:KnownError/Attribute:cust_name' => 'Customer Name',
'Class:KnownError/Attribute:cust_name+' => '',
'Class:KnownError/Attribute:problem_id' => 'Related Problem',
'Class:KnownError/Attribute:problem_id+' => '',
'Class:KnownError/Attribute:problem_ref' => 'Related Problem Ref',
'Class:KnownError/Attribute:problem_ref+' => '',
'Class:KnownError/Attribute:symptom' => 'Symptom',
'Class:KnownError/Attribute:symptom+' => '',
'Class:KnownError/Attribute:root_cause' => 'Root Cause',
'Class:KnownError/Attribute:root_cause+' => '',
'Class:KnownError/Attribute:workaround' => 'Work around',
'Class:KnownError/Attribute:workaround+' => '',
'Class:KnownError/Attribute:solution' => 'Solution',
'Class:KnownError/Attribute:solution+' => '',
'Class:KnownError/Attribute:error_code' => 'Error Code',
'Class:KnownError/Attribute:error_code+' => '',
'Class:KnownError/Attribute:domain' => 'Domain',
'Class:KnownError/Attribute:domain+' => '',
'Class:KnownError/Attribute:domain/Value:Application' => 'Application',
'Class:KnownError/Attribute:domain/Value:Application+' => 'Application',
'Class:KnownError/Attribute:domain/Value:Desktop' => 'Desktop',
'Class:KnownError/Attribute:domain/Value:Desktop+' => 'Desktop',
'Class:KnownError/Attribute:domain/Value:Network' => 'Network',
'Class:KnownError/Attribute:domain/Value:Network+' => 'Network',
'Class:KnownError/Attribute:domain/Value:Server' => 'Server',
'Class:KnownError/Attribute:domain/Value:Server+' => 'Server',
'Class:KnownError/Attribute:vendor' => 'Vendor',
'Class:KnownError/Attribute:vendor+' => '',
'Class:KnownError/Attribute:model' => 'Model',
'Class:KnownError/Attribute:model+' => '',
'Class:KnownError/Attribute:version' => 'Version',
'Class:KnownError/Attribute:version+' => '',
'Class:KnownError/Attribute:ci_list' => 'CIs',
'Class:KnownError/Attribute:ci_list+' => 'All the configuration items that are related to this known error',
'Class:KnownError/Attribute:document_list' => 'Documents',
'Class:KnownError/Attribute:document_list+' => 'All the documents linked to this known error',
));
//
// Class: lnkErrorToFunctionalCI
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:lnkErrorToFunctionalCI' => 'Link Error / FunctionalCI',
'Class:lnkErrorToFunctionalCI+' => 'Infra related to a known error',
'Class:lnkErrorToFunctionalCI/Name' => '%1$s / %2$s',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id' => 'CI',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name' => 'CI name',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:error_id' => 'Error',
'Class:lnkErrorToFunctionalCI/Attribute:error_id+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:error_name' => 'Error name',
'Class:lnkErrorToFunctionalCI/Attribute:error_name+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:reason' => 'Reason',
'Class:lnkErrorToFunctionalCI/Attribute:reason+' => '',
));
//
// Class: lnkDocumentToError
//
Dict::Add('EN GB', 'British English', 'British English', array(
'Class:lnkDocumentToError' => 'Link Documents / Errors',
'Class:lnkDocumentToError+' => 'A link between a document and a known error',
'Class:lnkDocumentToError/Name' => '%1$s / %2$s',
'Class:lnkDocumentToError/Attribute:document_id' => 'Document',
'Class:lnkDocumentToError/Attribute:document_id+' => '',
'Class:lnkDocumentToError/Attribute:document_name' => 'Document Name',
'Class:lnkDocumentToError/Attribute:document_name+' => '',
'Class:lnkDocumentToError/Attribute:error_id' => 'Error',
'Class:lnkDocumentToError/Attribute:error_id+' => '',
'Class:lnkDocumentToError/Attribute:error_name' => 'Error name',
'Class:lnkDocumentToError/Attribute:error_name+' => '',
'Class:lnkDocumentToError/Attribute:link_type' => 'link_type',
'Class:lnkDocumentToError/Attribute:link_type+' => '',
));
Dict::Add('EN GB', 'British English', 'British English', array(
'Menu:ProblemManagement' => 'Problem Management',
'Menu:ProblemManagement+' => 'Problem Management',
'Menu:Problem:Shortcuts' => 'Shortcuts',
'Menu:NewError' => 'New known error',
'Menu:NewError+' => 'Creation of a new known error',
'Menu:SearchError' => 'Search for known errors',
'Menu:SearchError+' => 'Search for known errors',
'Menu:Problem:KnownErrors' => 'All known errors',
'Menu:Problem:KnownErrors+' => 'All known errors',
));

View File

@@ -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+' => '所有已知错误',
]);

View File

@@ -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>

View File

@@ -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~~',

View File

@@ -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~~',

View File

@@ -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.',

View File

@@ -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',

View File

@@ -0,0 +1,125 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('EN GB', 'British English', 'British English', [
'Menu:CreateMailbox' => 'Create a mailbox...',
'Menu:OAuthClient' => 'OAuth Mail Access',
'Menu:OAuthClient+' => '',
'Menu:GenerateTokens' => 'Generate access token...',
'Menu:RegenerateTokens' => 'Regenerate access token...',
'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation',
'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP',
'itop-oauth-client:TestSMTP' => 'Email send test',
'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s',
'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client',
'itop-oauth-client:Message:RegenerateToken' => 'Regenerate access token to take into account the changes',
'itop-oauth-client:Message:TokenCreated' => 'Access token created',
'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated',
'itop-oauth-client:Message:TokenError' => 'Access token not generated due to server error',
'OAuthClient:Name/UseForSMTPMustBeUnique' => 'The combination Login (%1$s) and Use for SMTP (%2$s) has already been used for OAuth Client',
'OAuthClient:baseinfo' => 'Base Information',
'OAuthClient:scope' => 'Scope',
]);
//
// Class: OAuthClient
//
Dict::Add('EN GB', 'British English', 'British English', [
'Class:OAuthClient' => 'OAuth Mail Access',
'Class:OAuthClient/Attribute:provider' => 'Provider',
'Class:OAuthClient/Attribute:provider+' => '',
'Class:OAuthClient/Attribute:name' => 'Login',
'Class:OAuthClient/Attribute:name+' => 'In general, this is your email address',
'Class:OAuthClient/Attribute:status' => 'Status',
'Class:OAuthClient/Attribute:status+' => 'After creation, use the action “Generate access token” to be able to use this OAuth client.',
'Class:OAuthClient/Attribute:status/Value:active' => 'Access token generated',
'Class:OAuthClient/Attribute:status/Value:inactive' => 'No Access token',
'Class:OAuthClient/Attribute:description' => 'Description',
'Class:OAuthClient/Attribute:description+' => '',
'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',
'Class:OAuthClient/Attribute:client_secret+' => 'Another long string of characters provided by your OAuth2 provider',
'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token',
'Class:OAuthClient/Attribute:refresh_token+' => '',
'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration',
'Class:OAuthClient/Attribute:refresh_token_expiration+' => '',
'Class:OAuthClient/Attribute:token' => 'Access token',
'Class:OAuthClient/Attribute:token+' => '',
'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration',
'Class:OAuthClient/Attribute:token_expiration+' => '',
'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url',
'Class:OAuthClient/Attribute:redirect_url+' => <<<EOF
This url must be copied in the OAuth2 configuration of the provider
Erase the field to recalculate default value
EOF
,
'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list',
'Class:OAuthClient/Attribute:mailbox_list+' => '',
]);
//
// Class: OAuthClientAzure
//
Dict::Add('EN GB', 'British English', 'British English', array(
'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',
'Class:OAuthClientAzure/Attribute:scope/Value:SMTP' => 'SMTP',
'Class:OAuthClientAzure/Attribute:scope/Value:SMTP+' => '',
'Class:OAuthClientAzure/Attribute:scope/Value:IMAP' => 'IMAP',
'Class:OAuthClientAzure/Attribute:scope/Value:IMAP+' => '',
'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:used_scope' => 'Used scope',
'Class:OAuthClientAzure/Attribute:used_scope+' => '',
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple' => 'Simple',
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple+' => '',
'Class:OAuthClientAzure/Attribute:used_scope/Value:advanced' => 'Advanced',
'Class:OAuthClientAzure/Attribute:used_scope/Value:advanced+' => '',
'Class:OAuthClientAzure/Attribute:used_for_smtp' => 'Used for SMTP',
'Class:OAuthClientAzure/Attribute:used_for_smtp+' => 'At least one OAuth client must have this flag to “Yes”, if you want iTop to use it for sending mails.',
'Class:OAuthClientAzure/Attribute:used_for_smtp/Value:yes' => 'Yes',
'Class:OAuthClientAzure/Attribute:used_for_smtp/Value:no' => 'No',
'Class:OAuthClientAzure/Attribute:tenant' => 'Tenant',
'Class:OAuthClientAzure/Attribute:tenant+' => 'Tenant ID of the configured application. For multi-tenant application, use "common".',
));
//
// Class: OAuthClientGoogle
//
Dict::Add('EN GB', 'British English', 'British English', array(
'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',
'Class:OAuthClientGoogle/Attribute:scope/Value:SMTP' => 'SMTP',
'Class:OAuthClientGoogle/Attribute:scope/Value:SMTP+' => '',
'Class:OAuthClientGoogle/Attribute:scope/Value:IMAP' => 'IMAP',
'Class:OAuthClientGoogle/Attribute:scope/Value:IMAP+' => '',
'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:used_scope' => 'Used scope',
'Class:OAuthClientGoogle/Attribute:used_scope+' => '',
'Class:OAuthClientGoogle/Attribute:used_scope/Value:simple' => 'Simple',
'Class:OAuthClientGoogle/Attribute:used_scope/Value:simple+' => '',
'Class:OAuthClientGoogle/Attribute:used_scope/Value:advanced' => 'Advanced',
'Class:OAuthClientGoogle/Attribute:used_scope/Value:advanced+' => '',
'Class:OAuthClientGoogle/Attribute:used_for_smtp' => 'Used for SMTP',
'Class:OAuthClientGoogle/Attribute:used_for_smtp+' => 'At least one OAuth client must have this flag to “Yes”, if you want iTop to use it for sending mails.',
'Class:OAuthClientGoogle/Attribute:used_for_smtp/Value:yes' => 'Yes',
'Class:OAuthClientGoogle/Attribute:used_for_smtp/Value:no' => 'No',
));

View File

@@ -5,10 +5,10 @@
* @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', [
'Class:OAuthClient' => 'Cliente OAuth',
'Class:OAuthClient' => 'OAuth Mail Access~~',
'Class:OAuthClient/Attribute:client_id' => 'Id Cliente',
'Class:OAuthClient/Attribute:client_id+' => 'Una cadena larga de caracteres proporcionada por su proveedor de OAuth2',
'Class:OAuthClient/Attribute:client_secret' => 'Secreto del Cliente',
@@ -82,7 +82,7 @@ Borre el campo para recalcular el valor predeterminado',
'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)',
'Menu:CreateMailbox' => 'Crear un buzón...',
'Menu:GenerateTokens' => 'Generar token de acceso...',
'Menu:OAuthClient' => 'Cliente OAuth',
'Menu:OAuthClient' => 'OAuth Mail Access~~',
'Menu:OAuthClient+' => 'Cliente OAuth',
'Menu:RegenerateTokens' => 'Regenerar token de acceso...',
'OAuthClient:Name/UseForSMTPMustBeUnique' => 'La combinación Inicio de sesión (%1$s) y Uso para SMTP (%2$s) ya se ha utilizado para el Cliente OAuth',

Some files were not shown because too many files have changed in this diff Show More