mirror of
https://github.com/Combodo/iTop.git
synced 2026-08-11 08:18:18 +02:00
Compare commits
73 Commits
faf/faf-da
...
feature/96
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80fc5324a3 | ||
|
|
1d30795223 | ||
|
|
32de12dae9 | ||
|
|
09224c2db8 | ||
|
|
18c9fcce83 | ||
|
|
7129571047 | ||
|
|
b88d564075 | ||
|
|
fd553b86dd | ||
|
|
d7625d9650 | ||
|
|
893a1d7f71 | ||
|
|
fda1d3dd16 | ||
|
|
61464fc819 | ||
|
|
c281677768 | ||
|
|
e280251623 | ||
|
|
f657308137 | ||
|
|
4596404666 | ||
|
|
64394099f7 | ||
|
|
67e2899a60 | ||
|
|
8d75531d95 | ||
|
|
1e023e5431 | ||
|
|
e2a1c3e79e | ||
|
|
c7570d62c1 | ||
|
|
a30ed63a62 | ||
|
|
dd77124b07 | ||
|
|
9bfe0430f5 | ||
|
|
3fe91ed0b4 | ||
|
|
ccb9633226 | ||
|
|
82b50dc6cd | ||
|
|
d3451f8c30 | ||
|
|
b5c8a98695 | ||
|
|
1403914572 | ||
|
|
b976471a0d | ||
|
|
fa66a09104 | ||
|
|
47981f78e3 | ||
|
|
476ec75a2e | ||
|
|
10c000ddfe | ||
|
|
7e55b9ccfc | ||
|
|
5bb288ffca | ||
|
|
56d7e40f4c | ||
|
|
e0dc1fa571 | ||
|
|
d6466c0bd6 | ||
|
|
eb16e6cbc8 | ||
|
|
42007ffd95 | ||
|
|
6329c157e8 | ||
|
|
9ee0548767 | ||
|
|
620a6b9a51 | ||
|
|
968c56745a | ||
|
|
04a5e5463a | ||
|
|
006dd3d6c2 | ||
|
|
a808e89c30 | ||
|
|
c6e50a0ed7 | ||
|
|
d88687527e | ||
|
|
2cc071b07a | ||
|
|
76a410e00d | ||
|
|
c68887c2bc | ||
|
|
837b433622 | ||
|
|
52fca750b0 | ||
|
|
a5c14e4870 | ||
|
|
0e72b090ee | ||
|
|
d1aedee245 | ||
|
|
1b70b4bf70 | ||
|
|
41f51a2c0c | ||
|
|
73ede13443 | ||
|
|
40dd72ef82 | ||
|
|
c8aea56171 | ||
|
|
041437cbeb | ||
|
|
85d50f31bd | ||
|
|
5715e0484f | ||
|
|
109fdfa06b | ||
|
|
3c301affb3 | ||
|
|
147fae7f8c | ||
|
|
a5aa8c279f | ||
|
|
04f91ab4a2 |
@@ -2,13 +2,17 @@
|
||||
|
||||
```mermaid
|
||||
%%{init: { 'logLevel': 'debug', 'theme': 'base', 'themeVariables': {
|
||||
'git0': 'lawngreen',
|
||||
'git3': 'dodgerblue',
|
||||
'git4': 'grey',
|
||||
'git5': 'grey',
|
||||
'git6': 'grey',
|
||||
'git7': 'grey',
|
||||
'git8': 'grey'
|
||||
'git0': '#7ccf00',
|
||||
'git1': '#7ccf00',
|
||||
'git2': '#99a1af',
|
||||
'git3': '#99a1af',
|
||||
'git4': '#99a1af',
|
||||
'git5': '#99a1af',
|
||||
'git6': '#99a1af',
|
||||
'git7': '#99a1af',
|
||||
'git8': '#99a1af',
|
||||
'git9': '#99a1af',
|
||||
'git10': '#99a1af'
|
||||
}, 'gitGraph': {'showBranches': true,'mainBranchName': 'develop','rotateCommitLabel': true}} }%%
|
||||
gitGraph
|
||||
commit id: "2016-07-06" tag: "2.3.0" type: HIGHLIGHT
|
||||
@@ -106,6 +110,11 @@ gitGraph
|
||||
commit id: "2025-09-25" tag: "2.7.13"
|
||||
checkout support/3.2
|
||||
commit id: "2026-04-27 " tag: "3.2.3"
|
||||
checkout support/3.2.3
|
||||
commit id: "2026-05-25 " tag: "3.2.3-1"
|
||||
commit id: "2026-07-17 " tag: "3.2.3-2"
|
||||
checkout develop
|
||||
commit id: "2026-07-23" tag: "3.3.0-beta1"
|
||||
```
|
||||
|
||||
To learn more, check the [iTop community versions history on the official wiki](https://www.itophub.io/wiki/page?id=latest:release:start).
|
||||
|
||||
@@ -582,7 +582,9 @@ class UserRightsProfile extends UserRightsAddOnAPI
|
||||
*/
|
||||
public function ListProfiles($oUser)
|
||||
{
|
||||
if (count($oUser->ListChanges()) === 0) { // backward compatibility
|
||||
if (!array_key_exists('profile_list', $oUser->ListChanges())) {
|
||||
// Profiles list is not modified on the $oUser object, we can use DBObjectSearch with `all data` capabilities
|
||||
// Note: This is the default behavior
|
||||
$aRet = [];
|
||||
$oSearch = new DBObjectSearch('URP_UserProfile');
|
||||
$oSearch->AllowAllData();
|
||||
@@ -595,6 +597,8 @@ class UserRightsProfile extends UserRightsAddOnAPI
|
||||
|
||||
return $aRet;
|
||||
} else {
|
||||
// Profiles list must be computed with memory changes.
|
||||
// Note: this is a bit tricky because the user object may have been modified in memory (e.g. a profile added or removed) and we need to take that into account
|
||||
$aRet = [];
|
||||
$oProfilesSet = $oUser->Get('profile_list');
|
||||
foreach ($oProfilesSet as $oUserProfile) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Implement this interface to add sass file (SCSS) to the backoffice pages.
|
||||
* Implement this interface to add sass files (SCSS) to the backoffice pages.
|
||||
* example: return "css/setup.scss"
|
||||
*
|
||||
* @api
|
||||
@@ -11,9 +11,9 @@
|
||||
interface iBackofficeSassExtension
|
||||
{
|
||||
/**
|
||||
* @return string
|
||||
* @see \iTopWebPage::$a_styles
|
||||
* @return array An array of relative paths (from loaded import paths) to the files to compile and include
|
||||
* @see \iTopWebPage::$a_linked_stylesheets
|
||||
* @api
|
||||
*/
|
||||
public function GetSass(): string;
|
||||
public function GetSassRelPaths(): array;
|
||||
}
|
||||
|
||||
@@ -1046,7 +1046,7 @@ HTML
|
||||
// Add extra data for markup generation
|
||||
// - Attribute code and AttributeDef. class
|
||||
$val['attcode'] = $sAttCode;
|
||||
$val['atttype'] = $oAttDef->GetType();
|
||||
$val['atttype'] = $oAttDef->GetTypeShortClassName();
|
||||
$val['attlabel'] = $sAttLabel;
|
||||
$val['attflags'] = ($bEditMode) ? $this->GetFormAttributeFlags($sAttCode) : OPT_ATT_READONLY;
|
||||
|
||||
@@ -1535,190 +1535,6 @@ HTML
|
||||
return $sHtml;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param WebPage $oPage
|
||||
* @param \CMDBObjectSet $oSet
|
||||
* @param array $aParams
|
||||
*
|
||||
* @throws \Exception
|
||||
* only used in old and deprecated export.php
|
||||
*
|
||||
* @internal Only to be used by `/webservices/export.php` : this is a legacy method that produces wrong HTML (no TR on table body rows)
|
||||
*/
|
||||
public static function DisplaySetAsHTMLSpreadsheet(WebPage $oPage, CMDBObjectSet $oSet, $aParams = [])
|
||||
{
|
||||
$oPage->add(self::GetSetAsHTMLSpreadsheet($oSet, $aParams));
|
||||
}
|
||||
|
||||
/**
|
||||
* Spreadsheet output: designed for end users doing some reporting
|
||||
* Then the ids are excluded and replaced by the corresponding friendlyname
|
||||
*
|
||||
* @param \DBObjectSet $oSet
|
||||
* @param array $aParams
|
||||
*
|
||||
* @return string
|
||||
* @throws \CoreException
|
||||
* @throws \CoreUnexpectedValue
|
||||
* @throws \MissingQueryArgument
|
||||
* @throws \MySQLException
|
||||
* @throws \MySQLHasGoneAwayException
|
||||
* @throws \Exception
|
||||
*
|
||||
* @internal Only to be used by `/webservices/export.php` : this is a legacy method that produces wrong HTML (no TR on table body rows)
|
||||
*/
|
||||
public static function GetSetAsHTMLSpreadsheet(DBObjectSet $oSet, $aParams = [])
|
||||
{
|
||||
$aFields = null;
|
||||
if (isset($aParams['fields']) && (strlen($aParams['fields']) > 0)) {
|
||||
$aFields = explode(',', $aParams['fields']);
|
||||
}
|
||||
|
||||
$bFieldsAdvanced = false;
|
||||
if (isset($aParams['fields_advanced'])) {
|
||||
$bFieldsAdvanced = (bool)$aParams['fields_advanced'];
|
||||
}
|
||||
|
||||
$bLocalize = true;
|
||||
if (isset($aParams['localize_values'])) {
|
||||
$bLocalize = (bool)$aParams['localize_values'];
|
||||
}
|
||||
|
||||
$aList = [];
|
||||
|
||||
$aClasses = $oSet->GetFilter()->GetSelectedClasses();
|
||||
$aAuthorizedClasses = [];
|
||||
foreach ($aClasses as $sAlias => $sClassName) {
|
||||
if (UserRights::IsActionAllowed($sClassName, UR_ACTION_READ, $oSet) != UR_ALLOWED_NO) {
|
||||
$aAuthorizedClasses[$sAlias] = $sClassName;
|
||||
}
|
||||
}
|
||||
$aHeader = [];
|
||||
foreach ($aAuthorizedClasses as $sAlias => $sClassName) {
|
||||
$aList[$sAlias] = [];
|
||||
|
||||
foreach (MetaModel::ListAttributeDefs($sClassName) as $sAttCode => $oAttDef) {
|
||||
if (is_null($aFields) || (count($aFields) == 0)) {
|
||||
// Standard list of attributes (no link sets)
|
||||
if ($oAttDef->IsScalar() && ($oAttDef->IsWritable() || $oAttDef->IsExternalField())) {
|
||||
$sAttCodeEx = $oAttDef->IsExternalField() ? $oAttDef->GetKeyAttCode().'->'.$oAttDef->GetExtAttCode() : $sAttCode;
|
||||
|
||||
$aList[$sAlias][$sAttCodeEx] = $oAttDef;
|
||||
|
||||
if ($bFieldsAdvanced && $oAttDef->IsExternalKey(EXTKEY_RELATIVE)) {
|
||||
$sRemoteClass = $oAttDef->GetTargetClass();
|
||||
foreach (MetaModel::GetReconcKeys($sRemoteClass) as $sRemoteAttCode) {
|
||||
$aList[$sAlias][$sAttCode.'->'.$sRemoteAttCode] = MetaModel::GetAttributeDef(
|
||||
$sRemoteClass,
|
||||
$sRemoteAttCode
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// User defined list of attributes
|
||||
if (in_array($sAttCode, $aFields) || in_array($sAlias.'.'.$sAttCode, $aFields)) {
|
||||
$aList[$sAlias][$sAttCode] = $oAttDef;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Replace external key by the corresponding friendly name (if not already in the list)
|
||||
foreach ($aList[$sAlias] as $sAttCode => $oAttDef) {
|
||||
if ($oAttDef->IsExternalKey()) {
|
||||
unset($aList[$sAlias][$sAttCode]);
|
||||
$sFriendlyNameAttCode = $sAttCode.'_friendlyname';
|
||||
if (!array_key_exists(
|
||||
$sFriendlyNameAttCode,
|
||||
$aList[$sAlias]
|
||||
) && MetaModel::IsValidAttCode($sClassName, $sFriendlyNameAttCode)) {
|
||||
$oFriendlyNameAtt = MetaModel::GetAttributeDef($sClassName, $sFriendlyNameAttCode);
|
||||
$aList[$sAlias][$sFriendlyNameAttCode] = $oFriendlyNameAtt;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($aList[$sAlias] as $sAttCodeEx => $oAttDef) {
|
||||
$sColLabel = $bLocalize ? MetaModel::GetLabel($sClassName, $sAttCodeEx) : $sAttCodeEx;
|
||||
|
||||
$oFinalAttDef = $oAttDef->GetFinalAttDef();
|
||||
if (get_class($oFinalAttDef) == 'AttributeDateTime') {
|
||||
$aHeader[] = $sColLabel.' ('.Dict::S('UI:SplitDateTime-Date').')';
|
||||
$aHeader[] = $sColLabel.' ('.Dict::S('UI:SplitDateTime-Time').')';
|
||||
} else {
|
||||
$aHeader[] = $sColLabel;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$sHtml = "<table border=\"1\">\n";
|
||||
$sHtml .= "<tr>\n";
|
||||
$sHtml .= "<td>".implode("</td><td>", $aHeader)."</td>\n";
|
||||
$sHtml .= "</tr>\n";
|
||||
$oSet->Seek(0);
|
||||
while ($aObjects = $oSet->FetchAssoc()) {
|
||||
$aRow = [];
|
||||
foreach ($aAuthorizedClasses as $sAlias => $sClassName) {
|
||||
$oObj = $aObjects[$sAlias];
|
||||
foreach ($aList[$sAlias] as $sAttCodeEx => $oAttDef) {
|
||||
if (is_null($oObj)) {
|
||||
$aRow[] = '<td></td>';
|
||||
} else {
|
||||
$oFinalAttDef = $oAttDef->GetFinalAttDef();
|
||||
if (get_class($oFinalAttDef) == 'AttributeDateTime') {
|
||||
$sDate = $oObj->Get($sAttCodeEx);
|
||||
if ($sDate === null) {
|
||||
$aRow[] = '<td></td>';
|
||||
$aRow[] = '<td></td>';
|
||||
} else {
|
||||
$iDate = AttributeDateTime::GetAsUnixSeconds($sDate);
|
||||
$aRow[] = '<td>'.date(
|
||||
'Y-m-d',
|
||||
$iDate
|
||||
).'</td>'; // Format kept as-is for 100% backward compatibility of the exports
|
||||
$aRow[] = '<td>'.date(
|
||||
'H:i:s',
|
||||
$iDate
|
||||
).'</td>'; // Format kept as-is for 100% backward compatibility of the exports
|
||||
}
|
||||
} else {
|
||||
if ($oAttDef instanceof AttributeCaseLog) {
|
||||
$rawValue = $oObj->Get($sAttCodeEx);
|
||||
$outputValue = str_replace(
|
||||
"\n",
|
||||
"<br/>",
|
||||
utils::EscapeHtml($rawValue->__toString())
|
||||
);
|
||||
// Trick for Excel: treat the content as text even if it begins with an equal sign
|
||||
$aRow[] = '<td x:str>'.$outputValue.'</td>';
|
||||
} else {
|
||||
$rawValue = $oObj->Get($sAttCodeEx);
|
||||
// Due to custom formatting rules, empty friendlynames may be rendered as non-empty strings
|
||||
// let's fix this and make sure we render an empty string if the key == 0
|
||||
if ($oAttDef instanceof AttributeExternalField && $oAttDef->IsFriendlyName()) {
|
||||
$sKeyAttCode = $oAttDef->GetKeyAttCode();
|
||||
if ($oObj->Get($sKeyAttCode) == 0) {
|
||||
$rawValue = '';
|
||||
}
|
||||
}
|
||||
if ($bLocalize) {
|
||||
$outputValue = utils::EscapeHtml($oFinalAttDef->GetEditValue($rawValue));
|
||||
} else {
|
||||
$outputValue = utils::EscapeHtml($rawValue);
|
||||
}
|
||||
$aRow[] = '<td>'.$outputValue.'</td>';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$sHtml .= implode("\n", $aRow);
|
||||
$sHtml .= "</tr>\n";
|
||||
}
|
||||
$sHtml .= "</table>\n";
|
||||
|
||||
return $sHtml;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param WebPage $oPage
|
||||
* @param \CMDBObjectSet $oSet
|
||||
@@ -4507,7 +4323,7 @@ HTML;
|
||||
|
||||
$oDivField = FieldUIBlockFactory::MakeLarge("");
|
||||
// UIContentBlockUIBlockFactory::MakeStandard(null,["field_container field_large"]);
|
||||
$oDivField->AddDataAttribute("attribute-type", $oAttDef->GetType());
|
||||
$oDivField->AddDataAttribute("attribute-type", $oAttDef->GetTypeShortClassName());
|
||||
$oDivField->AddDataAttribute("attribute-label", $sAttMetaDataLabel);
|
||||
$oDivField->AddDataAttribute("attribute-flag-hidden", false);
|
||||
$oDivField->AddDataAttribute("attribute-flag-read-only", false);
|
||||
@@ -5368,7 +5184,6 @@ JS
|
||||
/**
|
||||
* @param array $aChanges
|
||||
* @param bool $bIsNew
|
||||
* @param string|null $sStimulusBeingApplied
|
||||
*
|
||||
* @return void
|
||||
* @throws \ArchivedObjectException
|
||||
@@ -5382,20 +5197,6 @@ JS
|
||||
$this->FireEvent(EVENT_DB_AFTER_WRITE, ['is_new' => $bIsNew, 'changes' => $aChanges, 'stimulus_applied' => $sStimulusBeingApplied, 'cmdb_change' => self::GetCurrentChange()]);
|
||||
}
|
||||
|
||||
//////////////
|
||||
/// READ
|
||||
///
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @throws \CoreException
|
||||
* @since 3.3.0
|
||||
*/
|
||||
final public function FireEventReadDetails(string $sExportType): void
|
||||
{
|
||||
$this->FireEvent(EVENT_DATA_EXPORT, ['export_type' => $sExportType]);
|
||||
}
|
||||
|
||||
//////////////
|
||||
/// DELETE
|
||||
///
|
||||
|
||||
@@ -501,7 +501,7 @@ EOF
|
||||
*/
|
||||
public function Render($oPage, $bEditMode = false, $aExtraParams = [], $bCanEdit = true)
|
||||
{
|
||||
$aExtraParams['dashboard_div_id'] = utils::Sanitize($aExtraParams['dashboard_div_id'] ?? null, $this->GetId(), utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER);
|
||||
$aExtraParams['dashboard_div_id'] = utils::Sanitize($aExtraParams['dashboard_div_id'] ?? $this->GetId(), $this->GetId(), utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER);
|
||||
|
||||
/** @var \DashboardLayoutMultiCol $oLayout */
|
||||
$oLayout = new $this->sLayoutClass();
|
||||
|
||||
@@ -519,31 +519,6 @@ Call $this->AddInitialAttributeFlags($sAttCode, $iFlags) for all the initial att
|
||||
</event_datum>
|
||||
</event_data>
|
||||
</event>
|
||||
<event id="EVENT_DATA_EXPORT" _delta="define">
|
||||
<name>Object details read from outside iTop</name>
|
||||
<description><![CDATA[An object details has been read during an export]]></description>
|
||||
<sources>
|
||||
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
|
||||
</sources>
|
||||
<event_data>
|
||||
<event_datum id="object">
|
||||
<description>The object unarchived</description>
|
||||
<type>DBObject</type>
|
||||
</event_datum>
|
||||
<event_datum id="attributes">
|
||||
<description>Attribute codes exposed (empty means potentially all attributes)</description>
|
||||
<type>array</type>
|
||||
</event_datum>
|
||||
<event_datum id="export_type">
|
||||
<description>Type of export</description>
|
||||
<type>string</type>
|
||||
</event_datum>
|
||||
<event_datum id="debug_info">
|
||||
<description>Debug string</description>
|
||||
<type>string</type>
|
||||
</event_datum>
|
||||
</event_data>
|
||||
</event>
|
||||
<event id="EVENT_DOWNLOAD_DOCUMENT" _delta="define">
|
||||
<name>Document downloaded</name>
|
||||
<description><![CDATA[A document has been downloaded from the GUI]]></description>
|
||||
|
||||
@@ -1707,7 +1707,7 @@ JS
|
||||
$oBlock->bAdvancedMode = utils::ReadParam('advanced', false);
|
||||
|
||||
$oBlock->sCsvFile = strtolower($this->m_oFilter->GetClass()).'.csv';
|
||||
$oBlock->sDownloadLink = utils::GetAbsoluteUrlAppRoot().'webservices/export.php?expression='.urlencode($this->m_oFilter->ToOQL(true)).'&format=csv&filename='.urlencode($oBlock->sCsvFile);
|
||||
$oBlock->sDownloadLink = utils::GetAbsoluteUrlAppRoot().'webservices/export-v2.php?expression='.urlencode($this->m_oFilter->ToOQL(true)).'&format=csv&filename='.urlencode($oBlock->sCsvFile);
|
||||
$oBlock->sLinkToToggle = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search'.$oAppContext->GetForLink(true).'&filter='.rawurlencode($this->m_oFilter->serialize()).'&format=csv';
|
||||
// Pass the parameters via POST, since expression may be very long
|
||||
$aParamsToPost = [
|
||||
@@ -1724,7 +1724,7 @@ JS
|
||||
$oBlock->sLinkToToggle = $oBlock->sLinkToToggle.'&advanced=1';
|
||||
$oBlock->sChecked = '';
|
||||
}
|
||||
$oBlock->sAjaxLink = utils::GetAbsoluteUrlAppRoot().'webservices/export.php';
|
||||
$oBlock->sAjaxLink = utils::GetAbsoluteUrlAppRoot().'webservices/export-v2.php';
|
||||
|
||||
$oBlock->sCharsetNotice = false;
|
||||
$oBlock->sJsonParams = json_encode($aParamsToPost);
|
||||
|
||||
@@ -334,14 +334,12 @@ EOF
|
||||
while ($aRow = $oSet->FetchAssoc()) {
|
||||
set_time_limit(intval($iLoopTimeLimit));
|
||||
$aData = [];
|
||||
$aExportedObjects = [];
|
||||
foreach ($this->aStatusInfo['fields'] as $aFieldSpec) {
|
||||
foreach ($this->aStatusInfo['fields'] as $iCol => $aFieldSpec) {
|
||||
$sAlias = $aFieldSpec['sAlias'];
|
||||
$sAttCode = $aFieldSpec['sAttCode'];
|
||||
|
||||
$sField = '';
|
||||
$oObj = $aRow[$sAlias];
|
||||
$aExportedObjects[] = $oObj;
|
||||
if ($oObj != null) {
|
||||
switch ($sAttCode) {
|
||||
case 'id':
|
||||
@@ -368,13 +366,7 @@ EOF
|
||||
}
|
||||
$sData .= implode($this->aStatusInfo['separator'], $aData)."\n";
|
||||
$iCount++;
|
||||
|
||||
$aExportedObjects = array_unique($aExportedObjects);
|
||||
foreach ($aExportedObjects as $oExportedObject) {
|
||||
$oExportedObject->FireEventReadDetails(get_class($this));
|
||||
}
|
||||
}
|
||||
|
||||
// Restore original date & time formats
|
||||
AttributeDateTime::SetFormat($oPrevDateTimeFormat);
|
||||
AttributeDate::SetFormat($oPrevDateFormat);
|
||||
|
||||
@@ -730,13 +730,8 @@ abstract class DBObject implements iDisplay
|
||||
public function SetTrim($sAttCode, $sValue)
|
||||
{
|
||||
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
|
||||
$iMaxSize = $oAttDef->GetMaxSize();
|
||||
$sLength = mb_strlen($sValue);
|
||||
if ($iMaxSize && ($sLength > $iMaxSize)) {
|
||||
$sMessage = " -truncated ($sLength chars)";
|
||||
$sValue = mb_substr($sValue, 0, $iMaxSize - mb_strlen($sMessage)).$sMessage;
|
||||
}
|
||||
$this->Set($sAttCode, $sValue);
|
||||
|
||||
$this->Set($sAttCode, $oAttDef->TrimValue($sValue));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2038,7 +2033,7 @@ abstract class DBObject implements iDisplay
|
||||
}
|
||||
}
|
||||
if (!is_null($iMaxSize = $oAtt->GetMaxSize())) {
|
||||
$iLen = mb_strlen($toCheck);
|
||||
$iLen = $oAtt->GetSize($toCheck);
|
||||
if ($iLen > $iMaxSize) {
|
||||
return "String too long (found $iLen, limited to $iMaxSize)";
|
||||
}
|
||||
@@ -6247,9 +6242,7 @@ abstract class DBObject implements iDisplay
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $aChanges
|
||||
* @param bool $bIsNew
|
||||
* @param string|null $sStimulusBeingApplied
|
||||
*
|
||||
* @return void
|
||||
* @since 3.1.0
|
||||
@@ -6258,18 +6251,6 @@ abstract class DBObject implements iDisplay
|
||||
{
|
||||
}
|
||||
|
||||
//////////////
|
||||
/// READ
|
||||
///
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @since 3.3.0
|
||||
*/
|
||||
public function FireEventReadDetails(string $sExportType): void
|
||||
{
|
||||
}
|
||||
|
||||
//////////////
|
||||
/// DELETE
|
||||
///
|
||||
|
||||
@@ -288,13 +288,11 @@ EOF
|
||||
while ($aRow = $oSet->FetchAssoc()) {
|
||||
set_time_limit(intval($iLoopTimeLimit));
|
||||
$aData = [];
|
||||
$aExportedObjects = [];
|
||||
foreach ($this->aStatusInfo['fields'] as $iCol => $aFieldSpec) {
|
||||
$sAlias = $aFieldSpec['sAlias'];
|
||||
$sAttCode = $aFieldSpec['sAttCode'];
|
||||
|
||||
$oObj = $aRow[$sAlias];
|
||||
$aExportedObjects[] = $oObj;
|
||||
$sField = '';
|
||||
if ($oObj) {
|
||||
$sField = $this->GetValue($oObj, $sAttCode);
|
||||
@@ -303,11 +301,6 @@ EOF
|
||||
}
|
||||
fwrite($hFile, json_encode($aData)."\n");
|
||||
$iCount++;
|
||||
|
||||
$aExportedObjects = array_unique($aExportedObjects);
|
||||
foreach ($aExportedObjects as $oExportedObject) {
|
||||
$oExportedObject->FireEventReadDetails(get_class($this));
|
||||
}
|
||||
}
|
||||
set_time_limit(intval($iPreviousTimeLimit));
|
||||
$this->aStatusInfo['position'] += $this->iChunkSize;
|
||||
|
||||
@@ -139,7 +139,6 @@ class HTMLBulkExport extends TabularBulkExport
|
||||
} else {
|
||||
$sData .= "<tr>";
|
||||
}
|
||||
$aExportedObjects = [];
|
||||
foreach ($this->aStatusInfo['fields'] as $iCol => $aFieldSpec) {
|
||||
$sAlias = $aFieldSpec['sAlias'];
|
||||
$sAttCode = $aFieldSpec['sAttCode'];
|
||||
@@ -148,18 +147,12 @@ class HTMLBulkExport extends TabularBulkExport
|
||||
$sField = '';
|
||||
if ($oObj) {
|
||||
$sField = $this->GetValue($oObj, $sAttCode);
|
||||
$aExportedObjects[] = $oObj;
|
||||
}
|
||||
$sValue = ($sField === '') ? ' ' : $sField;
|
||||
$sData .= "<td>$sValue</td>";
|
||||
}
|
||||
$sData .= "</tr>";
|
||||
$iCount++;
|
||||
|
||||
$aExportedObjects = array_unique($aExportedObjects);
|
||||
foreach ($aExportedObjects as $oExportedObject) {
|
||||
$oExportedObject->FireEventReadDetails(get_class($this));
|
||||
}
|
||||
}
|
||||
set_time_limit(intval($iPreviousTimeLimit));
|
||||
$this->aStatusInfo['position'] += $this->iChunkSize;
|
||||
|
||||
@@ -625,7 +625,6 @@ class CoreServices implements iRestServiceProvider, iRestInputSanitizer
|
||||
}
|
||||
|
||||
while ($oObject = $oObjectSet->Fetch()) {
|
||||
$oObject->FireEventReadDetails(get_class($this));
|
||||
$oResult->AddObject(0, '', $oObject, $aShowFields, RestUtils::HasRequestedExtendedOutput($sShowFields));
|
||||
}
|
||||
$oResult->message = "Found: ".$oObjectSet->Count();
|
||||
@@ -700,7 +699,6 @@ class CoreServices implements iRestServiceProvider, iRestInputSanitizer
|
||||
if ($oElement instanceof RelationObjectNode) {
|
||||
$oObject = $oElement->GetProperty('object');
|
||||
if ($oObject) {
|
||||
$oObject->FireEventReadDetails(get_class($this));
|
||||
if ($bEnableRedundancy && $sDirection == 'down') {
|
||||
// Add only the "reached" objects
|
||||
if ($oElement->GetProperty('is_reached')) {
|
||||
|
||||
@@ -233,6 +233,7 @@ EOF
|
||||
public function GetNextChunk(&$aStatus)
|
||||
{
|
||||
$sRetCode = 'run';
|
||||
$iPercentage = 0;
|
||||
|
||||
$oSet = new DBObjectSet($this->oSearch);
|
||||
$oSet->SetLimit($this->iChunkSize, $this->aStatusInfo['position']);
|
||||
@@ -253,8 +254,7 @@ EOF
|
||||
set_time_limit(intval($iLoopTimeLimit));
|
||||
|
||||
$sData .= "<tr>";
|
||||
$aExportedObjects = [];
|
||||
foreach ($this->aStatusInfo['fields'] as $aFieldSpec) {
|
||||
foreach ($this->aStatusInfo['fields'] as $iCol => $aFieldSpec) {
|
||||
$sAlias = $aFieldSpec['sAlias'];
|
||||
$sAttCode = $aFieldSpec['sAttCode'];
|
||||
|
||||
@@ -265,7 +265,7 @@ EOF
|
||||
$sData .= "<td x:str></td>";
|
||||
continue;
|
||||
}
|
||||
$aExportedObjects[] = $oObj;
|
||||
|
||||
switch ($sAttCode) {
|
||||
case 'id':
|
||||
$sField = $oObj->GetKey();
|
||||
@@ -322,11 +322,6 @@ EOF
|
||||
}
|
||||
$sData .= "</tr>";
|
||||
$iCount++;
|
||||
|
||||
$aExportedObjects = array_unique($aExportedObjects);
|
||||
foreach ($aExportedObjects as $oExportedObject) {
|
||||
$oExportedObject->FireEventReadDetails(get_class($this));
|
||||
}
|
||||
}
|
||||
set_time_limit(intval($iPreviousTimeLimit));
|
||||
$this->aStatusInfo['position'] += $this->iChunkSize;
|
||||
|
||||
@@ -135,11 +135,6 @@ abstract class Trigger extends cmdbAbstractObject
|
||||
if ($oAction->IsActive()) {
|
||||
$oKPI = new ExecutionKPI();
|
||||
$aContextArgs['action->object()'] = $oAction;
|
||||
if (array_key_exists('this->object()', $aContextArgs)) {
|
||||
/** @var \DBObject $oObject */
|
||||
$oObject = $aContextArgs['this->object()'];
|
||||
$oObject->FireEventReadDetails(get_class($oAction));
|
||||
}
|
||||
$oAction->DoExecute($this, $aContextArgs);
|
||||
$oKPI->ComputeStatsForExtension($oAction, 'DoExecute');
|
||||
}
|
||||
|
||||
@@ -144,7 +144,6 @@ class XMLBulkExport extends BulkExport
|
||||
if (count($aAuthorizedClasses) > 1) {
|
||||
$sData .= "<Row>\n";
|
||||
}
|
||||
$aExportedObjects = [];
|
||||
foreach ($aAuthorizedClasses as $sAlias => $sClassName) {
|
||||
$oObj = $aObjects[$sAlias];
|
||||
if (is_null($oObj)) {
|
||||
@@ -152,7 +151,6 @@ class XMLBulkExport extends BulkExport
|
||||
} else {
|
||||
$sClassName = get_class($oObj);
|
||||
$sData .= "<$sClassName alias=\"$sAlias\" id=\"".$oObj->GetKey()."\">\n";
|
||||
$aExportedObjects[] = $oObj;
|
||||
}
|
||||
foreach ($aClass2Attributes[$sAlias] as $sAttCode => $oAttDef) {
|
||||
if (is_null($oObj)) {
|
||||
@@ -168,11 +166,6 @@ class XMLBulkExport extends BulkExport
|
||||
$sData .= "</Row>\n";
|
||||
}
|
||||
$iCount++;
|
||||
|
||||
$aExportedObjects = array_unique($aExportedObjects);
|
||||
foreach ($aExportedObjects as $oExportedObject) {
|
||||
$oExportedObject->FireEventReadDetails(get_class($this));
|
||||
}
|
||||
}
|
||||
|
||||
set_time_limit(intval($iPreviousTimeLimit));
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
$ibo-user-rights--padding-x: $ibo-spacing-400 !default;
|
||||
$ibo-user-rights--padding-y: $ibo-spacing-200 !default;
|
||||
$ibo-user-rights--padding-y: $ibo-spacing-100 !default;
|
||||
$ibo-user-rights--border-radius: $ibo-border-radius-400 !default;
|
||||
|
||||
$ibo-user-rights--is-success--background-color: $ibo-color-success-100 !default;
|
||||
@@ -18,6 +18,8 @@ $ibo-user-rights--is-failure--border-color: $ibo-color-danger-500 !default;
|
||||
$ibo-user-rights--is-failure--border: 1px solid $ibo-user-rights--is-failure--border-color !default;
|
||||
|
||||
.ibo-user-rights {
|
||||
display: inline-flex;
|
||||
align-items: baseline;
|
||||
padding: $ibo-user-rights--padding-y $ibo-user-rights--padding-x;
|
||||
border-radius: $ibo-user-rights--border-radius;
|
||||
&.ibo-is-success {
|
||||
|
||||
@@ -8,70 +8,74 @@
|
||||
padding-bottom: 14px;
|
||||
}
|
||||
|
||||
.help-text{
|
||||
padding: 1px 5px;
|
||||
background-color: #d7e3f8;
|
||||
border: 1px solid #c6e7f5;
|
||||
border-radius: 5px;
|
||||
margin: 5px 0;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.form-error ul{
|
||||
padding: 1px 5px;
|
||||
background-color: #f8d7da;
|
||||
border: 1px solid #f5c6cb;
|
||||
border-radius: 5px;
|
||||
margin: 5px 0;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.subform{
|
||||
background-color: #efefef;
|
||||
border-radius: 5px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.form-buttons{
|
||||
margin: 20px 0;
|
||||
}
|
||||
|
||||
.form select{
|
||||
padding: 0;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.form select option{
|
||||
height: 30px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.turbo-refreshing{
|
||||
opacity: .5;
|
||||
}
|
||||
|
||||
.ibo-field legend{
|
||||
margin-top: 24px;
|
||||
}
|
||||
|
||||
collection-entry-element {
|
||||
margin-top: 8px;
|
||||
display: block;
|
||||
padding: 10px 10px;
|
||||
background-color: #f5f5f5;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.ts-control{
|
||||
height: auto;
|
||||
min-height: 30px;
|
||||
}
|
||||
|
||||
.ibo-form-actions > .ibo-button > span{
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.ibo-form textarea{
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
// WIP SDK Forms
|
||||
//form[is="itop-form-element"] {
|
||||
//
|
||||
// .help-text{
|
||||
// padding: 1px 5px;
|
||||
// background-color: #d7e3f8;
|
||||
// border: 1px solid #c6e7f5;
|
||||
// border-radius: 5px;
|
||||
// margin: 5px 0;
|
||||
// font-size: 0.9em;
|
||||
// }
|
||||
//
|
||||
// .form-error ul{
|
||||
// padding: 1px 5px;
|
||||
// background-color: #f8d7da;
|
||||
// border: 1px solid #f5c6cb;
|
||||
// border-radius: 5px;
|
||||
// margin: 5px 0;
|
||||
// font-size: 0.9em;
|
||||
// }
|
||||
//
|
||||
// .subform{
|
||||
// background-color: #efefef;
|
||||
// border-radius: 5px;
|
||||
// padding: 10px;
|
||||
// }
|
||||
//
|
||||
// .form-buttons{
|
||||
// margin: 20px 0;
|
||||
// }
|
||||
//
|
||||
// .form select{
|
||||
// padding: 0;
|
||||
// overflow-y: auto;
|
||||
// }
|
||||
//
|
||||
// .form select option{
|
||||
// height: 30px;
|
||||
// display: flex;
|
||||
// align-items: center;
|
||||
// }
|
||||
//
|
||||
// .turbo-refreshing{
|
||||
// opacity: .5;
|
||||
// }
|
||||
//
|
||||
// .ibo-field legend{
|
||||
// margin-top: 24px;
|
||||
// }
|
||||
//
|
||||
// collection-entry-element {
|
||||
// margin-top: 8px;
|
||||
// display: block;
|
||||
// padding: 10px 10px;
|
||||
// background-color: #f5f5f5;
|
||||
// border-radius: 5px;
|
||||
// }
|
||||
// .ts-control{
|
||||
// height: auto;
|
||||
// min-height: 30px;
|
||||
// }
|
||||
//
|
||||
// .ibo-form-actions > .ibo-button > span{
|
||||
// margin-right: 5px;
|
||||
// }
|
||||
//
|
||||
// .ibo-form textarea{
|
||||
// resize: vertical;
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
||||
@@ -70,7 +70,7 @@ $ibo-vendors-ckeditor--ck-mentions--item--padding-y: $ibo-spacing-200 !default;
|
||||
}
|
||||
}
|
||||
|
||||
.ck-editor__editable_inline:not(.ck-comment__input *) {
|
||||
.ck-editor__editable_inline:not(.ck-comment__input *), .ck-source-editing-area {
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
@@ -84,11 +84,6 @@ $ibo-vendors-ckeditor--ck-mentions--item--padding-y: $ibo-spacing-200 !default;
|
||||
}
|
||||
}
|
||||
|
||||
// N°7552 Allow source editing area to be scrollable in full screen
|
||||
.ck-maximize_editor_main .ck-source-editing-area textarea{
|
||||
overflow: auto !important;
|
||||
}
|
||||
|
||||
/* Mentions */
|
||||
.ck-mentions {
|
||||
.ck-button {
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -6,8 +6,9 @@
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'CAS:Error:UserNotAllowed' => '用户被禁止登录',
|
||||
'CAS:Login:SignIn' => '使用CAS登录',
|
||||
'CAS:Login:SignInTooltip' => '点击这里使用CAS服务器认证',
|
||||
'CAS:Login:SignIn' => '使用 CAS 登录',
|
||||
'CAS:Login:SignInTooltip' => '点击这里使用 CAS 服务器认证',
|
||||
]);
|
||||
|
||||
@@ -5,10 +5,8 @@
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @author Robert Deng <denglx@gmail.com>
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
@@ -23,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -32,9 +31,11 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: UserExternal
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserExternal' => '外部用户',
|
||||
'Class:UserExternal+' => '用户在'.ITOP_APPLICATION_SHORT.'外部验证身份',
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:UserLDAP' => 'Пользователь LDAP',
|
||||
'Class:UserLDAP+' => 'Пользователь, аутентифицируемый через LDAP',
|
||||
'UserLDAP:server' => 'LDAP specifics~~',
|
||||
'UserLDAP:server' => 'Особенности LDAP',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -22,6 +22,6 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
|
||||
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
|
||||
'Class:UserLDAP/Attribute:ldap_server' => 'Сервер LDAP',
|
||||
'Class:UserLDAP/Attribute:ldap_server+' => '',
|
||||
]);
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
* @author Robert Deng <denglx@gmail.com>
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
@@ -22,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -31,13 +31,15 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: UserLDAP
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserLDAP' => 'LDAP用户',
|
||||
'Class:UserLDAP+' => '用户身份由LDAP认证',
|
||||
'UserLDAP:server' => 'LDAP详情',
|
||||
'Class:UserLDAP' => 'LDAP 用户',
|
||||
'Class:UserLDAP+' => '用户身份由 LDAP 认证',
|
||||
'UserLDAP:server' => 'LDAP 详情',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -45,6 +47,6 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
|
||||
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
|
||||
'Class:UserLDAP/Attribute:ldap_server' => 'LDAP 服务器',
|
||||
'Class:UserLDAP/Attribute:ldap_server+' => '',
|
||||
]);
|
||||
|
||||
@@ -24,11 +24,11 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
|
||||
'Class:UserLocal/Attribute:expiration/Value:force_expire' => 'Истёкший',
|
||||
'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:expiration/Value:otp_expire' => 'Одноразовый пароль',
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Пароль не может быть изменён пользователем.',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Дата изменения пароля',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Когда пароль был изменен в последний раз',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Пароль должен содержать не менее 12 символов и включать прописные, строчные, числовые и специальные символы.',
|
||||
'UserLocal:password:expiration' => 'Поля требуют наличия доп. расширения',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Установка срока действия пароля "Одноразовый пароль" для своей собственной учётной записи не разрешена',
|
||||
]);
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
* @author Robert Deng <denglx@gmail.com>
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
* iTop is free software; you can redistribute it and/or modify
|
||||
@@ -22,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
@@ -31,16 +31,19 @@
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: UserLocal
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserLocal' => ITOP_APPLICATION_SHORT.' 用户',
|
||||
'Class:UserLocal+' => '用户由'.ITOP_APPLICATION_SHORT.'验证身份',
|
||||
'Class:UserLocal/Attribute:password' => '密码',
|
||||
'Class:UserLocal/Attribute:password+' => '用于验证用户身份的字符串',
|
||||
'Class:UserLocal/Attribute:expiration' => '密码过期',
|
||||
'Class:UserLocal/Attribute:expiration+' => '密码过期状态 (需要一个扩展才能生效)',
|
||||
|
||||
'Class:UserLocal/Attribute:expiration' => '密码过期时间',
|
||||
'Class:UserLocal/Attribute:expiration+' => '密码过期状态 (需要扩展才能生效)',
|
||||
'Class:UserLocal/Attribute:expiration/Value:can_expire' => '允许过期',
|
||||
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
|
||||
'Class:UserLocal/Attribute:expiration/Value:never_expire' => '永不过期',
|
||||
@@ -49,8 +52,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => '一次性密码',
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '用户不允许修改密码.',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => '密码更新',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => '密码更新时间',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => '上次修改密码的时间',
|
||||
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => '密码必须至少12个字符, 包含大小写, 数字和特殊字符.',
|
||||
'UserLocal:password:expiration' => '下面的区域需要插件扩展',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => '不允许用户为自己设置 "一次性密码" 的失效期限',
|
||||
|
||||
@@ -11,5 +11,5 @@
|
||||
*
|
||||
*/
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'theme:darkmoon' => 'Dark moon~~',
|
||||
'theme:darkmoon' => 'Тёмная луна',
|
||||
]);
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'theme:darkmoon' => 'Dark moon',
|
||||
]);
|
||||
|
||||
@@ -23,5 +23,5 @@
|
||||
*/
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'theme:fullmoon-high-contrast' => 'Fullmoon (High contrast)~~',
|
||||
'theme:fullmoon-high-contrast' => 'Fullmoon (высокая контрастность)',
|
||||
]);
|
||||
|
||||
@@ -23,5 +23,5 @@
|
||||
*/
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'theme:fullmoon-protanopia-deuteranopia' => 'Fullmoon (Protanopia & Deuteranopia)~~',
|
||||
'theme:fullmoon-protanopia-deuteranopia' => 'Fullmoon (протанопия и дейтеранопия)',
|
||||
]);
|
||||
|
||||
@@ -23,5 +23,5 @@
|
||||
*/
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'theme:fullmoon-tritanopia' => 'Fullmoon (Tritanopia)~~',
|
||||
'theme:fullmoon-tritanopia' => 'Fullmoon (тританопия)',
|
||||
]);
|
||||
|
||||
@@ -20,6 +20,7 @@ Dict::Add('EN US', 'English', 'English', [
|
||||
|
||||
'DataFeatureRemoval:Features:Title' => 'Extensions',
|
||||
'DataFeatureRemoval:Result:Title' => 'Modification requested',
|
||||
'DataFeatureRemoval:NoResult:Title' => 'No modification requested',
|
||||
'DataFeatureRemoval:Execution:Title' => 'Deletion Executions',
|
||||
'DataFeatureRemoval:Analysis:Title' => 'Analysis result',
|
||||
'DataFeatureRemoval:Analysis:Subtitle' => 'Review all elements requiring attention',
|
||||
@@ -39,6 +40,14 @@ Dict::Add('EN US', 'English', 'English', [
|
||||
'DataFeatureRemoval:CleanupComplete:Title' => 'All clear.',
|
||||
'DataFeatureRemoval:CompilComplete' => 'Compilation successful. No Cleanup needed. You can proceed to setup.',
|
||||
|
||||
'DataFeatureRemoval:Compile:InProgress' => 'Compilation in progress...',
|
||||
'DataFeatureRemoval:Compile:Success' => 'Compilation successful',
|
||||
'DataFeatureRemoval:Compile:Error' => 'Compilation error',
|
||||
|
||||
'DataFeatureRemoval:RunAudit:InProgress' => 'Analysis in progress...',
|
||||
'DataFeatureRemoval:RunAudit:Success' => 'Analysis completed',
|
||||
'DataFeatureRemoval:RunAudit:Error' => 'Error during analysis',
|
||||
|
||||
'UI:Button:Analyze' => 'Analyze',
|
||||
'UI:Button:ModifyChoices' => 'Change my selection',
|
||||
'UI:Button:AnalyzeAndSetup' => 'Analyze and go to setup',
|
||||
|
||||
@@ -20,6 +20,7 @@ Dict::Add('FR FR', 'French', 'Français', [
|
||||
|
||||
'DataFeatureRemoval:Features:Title' => 'Extensions',
|
||||
'DataFeatureRemoval:Result:Title' => 'Modification demandée',
|
||||
'DataFeatureRemoval:NoResult:Title' => 'Aucune modification demandée',
|
||||
'DataFeatureRemoval:Execution:Title' => 'Suppressions',
|
||||
'DataFeatureRemoval:Analysis:Title' => 'Résultat de l’analyse',
|
||||
'DataFeatureRemoval:Analysis:Subtitle' => 'Vérifier les éléments à nettoyer',
|
||||
@@ -39,6 +40,14 @@ Dict::Add('FR FR', 'French', 'Français', [
|
||||
'DataFeatureRemoval:CleanupComplete:Title' => 'All clear.',
|
||||
'DataFeatureRemoval:CompilComplete' => 'Compilation successful. No Cleanup needed. You can proceed to setup.',
|
||||
|
||||
'DataFeatureRemoval:Compile:InProgress' => 'Compilation en cours...',
|
||||
'DataFeatureRemoval:Compile:Success' => 'Compilation terminée',
|
||||
'DataFeatureRemoval:Compile:Error' => 'Erreur lors de la compilation',
|
||||
|
||||
'DataFeatureRemoval:RunAudit:InProgress' => 'Analyse en cours...',
|
||||
'DataFeatureRemoval:RunAudit:Success' => 'Analyse terminée',
|
||||
'DataFeatureRemoval:RunAudit:Error' => 'Erreur lors de l\'analyse',
|
||||
|
||||
'UI:Button:Analyze' => 'Analyser',
|
||||
'UI:Button:ModifyChoices' => 'Modifier la sélection',
|
||||
'UI:Button:AnalyzeAndSetup' => 'Analyser et ouvrir l’assistant de configuration',
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2025 Combodo SARL
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*/
|
||||
/**
|
||||
* @author Vladimir Kunin <v.b.kunin@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Menu:DataFeatureRemovalMenu' => 'Управление расширениями',
|
||||
'combodo-data-feature-removal/Operation:Main/Title' => 'Управление расширениями',
|
||||
|
||||
'DataFeatureRemoval:Main:Title' => 'Управление расширениями',
|
||||
'DataFeatureRemoval:Main:SubTitle' => 'Включение и отключение расширений, установленных в вашем iTop',
|
||||
'DataFeatureRemoval:Failure:Title' => 'Ошибки пробного удаления расширений',
|
||||
'DataFeatureRemoval:Helper:Title' => 'Проверьте, есть ли данные или зависимости, мешающие добавить/удалить расширение.',
|
||||
|
||||
'DataFeatureRemoval:Features:Title' => 'Расширения',
|
||||
'DataFeatureRemoval:Result:Title' => 'Запрошено изменение',
|
||||
'DataFeatureRemoval:NoResult:Title' => 'Изменений не запрошено',
|
||||
'DataFeatureRemoval:Execution:Title' => 'Выполнения удаления',
|
||||
'DataFeatureRemoval:Analysis:Title' => 'Результат анализа',
|
||||
'DataFeatureRemoval:Analysis:Subtitle' => 'Просмотрите все элементы, требующие внимания',
|
||||
'DataFeatureRemoval:Analysis:SubTitle' => 'Элементов для очистки перед продолжением: %1$s',
|
||||
|
||||
'DataFeatureRemoval:DeletionPlan:Title' => 'План удаления данных',
|
||||
'DataFeatureRemoval:DeletionPlan:SubTitle' => 'Строк для очистки перед продолжением: %1$s',
|
||||
'DataFeatureRemoval:DoDeletion:Title' => 'Выполнить удаление',
|
||||
'DataFeatureRemoval:DoDeletion:SubTitle' => 'Удалить все записи из базы данных',
|
||||
'DataFeatureRemoval:DeletionPlan:Error:Issues' => 'Некоторые объекты нужно удалить вручную перед очисткой',
|
||||
|
||||
'DataFeatureRemoval:Table:Analysis:ClassName' => 'Элемент для удаления',
|
||||
'DataFeatureRemoval:Table:Analysis:FeatureName' => 'Название расширения',
|
||||
'DataFeatureRemoval:Table:Analysis:Module' => 'Название модуля',
|
||||
'DataFeatureRemoval:Table:Analysis:Occurrence' => 'Количество',
|
||||
|
||||
'DataFeatureRemoval:CleanupComplete:Title' => 'Всё чисто.',
|
||||
'DataFeatureRemoval:CompilComplete' => 'Компиляция выполнена успешно. Очистка не требуется. Можно переходить к установке.',
|
||||
|
||||
'DataFeatureRemoval:Compile:InProgress' => 'Идёт компиляция...',
|
||||
'DataFeatureRemoval:Compile:Success' => 'Компиляция выполнена успешно',
|
||||
'DataFeatureRemoval:Compile:Error' => 'Ошибка компиляции',
|
||||
|
||||
'DataFeatureRemoval:RunAudit:InProgress' => 'Идёт анализ...',
|
||||
'DataFeatureRemoval:RunAudit:Success' => 'Анализ завершён',
|
||||
'DataFeatureRemoval:RunAudit:Error' => 'Ошибка при анализе',
|
||||
|
||||
'UI:Button:Analyze' => 'Анализировать',
|
||||
'UI:Button:ModifyChoices' => 'Изменить выбор',
|
||||
'UI:Button:AnalyzeAndSetup' => 'Анализировать и перейти к установке',
|
||||
'UI:Button:PlanDeletion' => 'Продолжить удаление',
|
||||
'UI:Button:DoDeletion' => 'Продолжить удаление',
|
||||
'UI:Button:BackToMain' => 'Изменить выбор',
|
||||
'UI:Button:Setup' => 'Запустить установку',
|
||||
|
||||
'UI:Action:ForceUninstall' => 'Принудительно удалить',
|
||||
'UI:Action:MoreInfo' => 'Подробнее',
|
||||
|
||||
'DataFeatureRemoval:Table:Empty' => 'Нет данных для удаления',
|
||||
|
||||
'DataFeatureRemoval:Column:Class' => 'Класс',
|
||||
'DataFeatureRemoval:Column:DeleteCount' => 'Записей к удалению',
|
||||
'DataFeatureRemoval:Column:UpdateCount' => 'Записей к обновлению',
|
||||
'DataFeatureRemoval:Column:IssueCount' => 'Найдено проблем, мешающих автоматической очистке',
|
||||
|
||||
'DataFeatureRemoval:Column:DeletedCount' => 'Удалено записей',
|
||||
'DataFeatureRemoval:Column:UpdatedCount' => 'Обновлено записей',
|
||||
]);
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2025 Combodo SARL
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:DataFeatureRemovalMenu' => '扩展管理',
|
||||
'combodo-data-feature-removal/Operation:Main/Title' => '扩展管理',
|
||||
|
||||
'DataFeatureRemoval:Main:Title' => '扩展管理',
|
||||
'DataFeatureRemoval:Main:SubTitle' => '切换安装在您的 iTop 上的扩展',
|
||||
'DataFeatureRemoval:Failure:Title' => '扩展预删除错误',
|
||||
'DataFeatureRemoval:Helper:Title' => '分析是否有任何数据或依赖关系阻止您添加/删除扩展。',
|
||||
|
||||
'DataFeatureRemoval:Features:Title' => '扩展',
|
||||
'DataFeatureRemoval:Result:Title' => '请求的修改',
|
||||
'DataFeatureRemoval:Execution:Title' => '删除执行',
|
||||
'DataFeatureRemoval:Analysis:Title' => '分析结果',
|
||||
'DataFeatureRemoval:Analysis:Subtitle' => '审查所有需要关注的元素',
|
||||
'DataFeatureRemoval:Analysis:SubTitle' => '%1$s 个元素需要在继续之前清理',
|
||||
|
||||
'DataFeatureRemoval:DeletionPlan:Title' => '数据删除计划',
|
||||
'DataFeatureRemoval:DeletionPlan:SubTitle' => '%1$s 行需要在继续之前清理',
|
||||
'DataFeatureRemoval:DoDeletion:Title' => '执行删除',
|
||||
'DataFeatureRemoval:DoDeletion:SubTitle' => '从数据库中删除所有条目',
|
||||
'DataFeatureRemoval:DeletionPlan:Error:Issues' => '某些对象必须在清理前手动删除',
|
||||
|
||||
'DataFeatureRemoval:Table:Analysis:ClassName' => '要删除的元素',
|
||||
'DataFeatureRemoval:Table:Analysis:FeatureName' => '扩展名称',
|
||||
'DataFeatureRemoval:Table:Analysis:Module' => '模块名称',
|
||||
'DataFeatureRemoval:Table:Analysis:Occurrence' => '出现次数',
|
||||
|
||||
'DataFeatureRemoval:CleanupComplete:Title' => '全部清除.',
|
||||
'DataFeatureRemoval:CompilComplete' => '编译成功. 无需清理. 您可以继续进行设置.',
|
||||
|
||||
'UI:Button:Analyze' => '分析',
|
||||
'UI:Button:ModifyChoices' => '改变我的选择',
|
||||
'UI:Button:AnalyzeAndSetup' => '分析并进入设置',
|
||||
'UI:Button:PlanDeletion' => '继续删除',
|
||||
'UI:Button:DoDeletion' => '继续删除',
|
||||
'UI:Button:BackToMain' => '改变我的选择',
|
||||
'UI:Button:Setup' => '运行安装向导',
|
||||
|
||||
'UI:Action:ForceUninstall' => '强制卸载',
|
||||
'UI:Action:MoreInfo' => '更多信息',
|
||||
|
||||
'DataFeatureRemoval:Table:Empty' => '没有数据需要删除',
|
||||
|
||||
'DataFeatureRemoval:Column:Class' => '类',
|
||||
'DataFeatureRemoval:Column:DeleteCount' => '待删除的条目',
|
||||
'DataFeatureRemoval:Column:UpdateCount' => '待更新的条目',
|
||||
'DataFeatureRemoval:Column:IssueCount' => '发现阻止自动清理的问题',
|
||||
|
||||
'DataFeatureRemoval:Column:DeletedCount' => '已删除的条目',
|
||||
'DataFeatureRemoval:Column:UpdatedCount' => '已更新的条目',
|
||||
]);
|
||||
@@ -47,7 +47,11 @@ class DataFeatureRemovalController extends Controller
|
||||
$aParams = [];
|
||||
|
||||
SetupUtils::EraseSetupToken();
|
||||
(new SessionParameters(SetupUtils::SESSION_PARAMETERS_NAME))->Erase();
|
||||
$oParameters = new SessionParameters(SetupUtils::SESSION_PARAMETERS_NAME);
|
||||
$oParameters->Erase();
|
||||
Session::Unset('aDeletionExecutionSummary');
|
||||
Session::Set('bForceCompilation', true);
|
||||
$oParameters->SetParameter('return_application', 'DataFeatureRemoval');
|
||||
|
||||
$this->AddAnalyzeParams();
|
||||
$aParams['sTransactionId'] = utils::GetNewTransactionId();
|
||||
@@ -60,7 +64,6 @@ class DataFeatureRemovalController extends Controller
|
||||
$aParams['sSetupUrl'] = utils::GetAbsoluteUrlAppRoot().'setup';
|
||||
$aParams['iCount'] = $this->iCount;
|
||||
|
||||
Session::Set('bForceCompilation', true);
|
||||
$this->AddLinkedStylesheet(utils::GetAbsoluteUrlModulesRoot().DataFeatureRemovalHelper::MODULE_NAME.'/assets/css/DataFeatureRemoval.css');
|
||||
$this->AddLinkedScript(utils::GetAbsoluteUrlModulesRoot().DataFeatureRemovalHelper::MODULE_NAME.'/assets/js/DataFeatureRemoval.js');
|
||||
$this->DisplayPage($aParams);
|
||||
@@ -94,7 +97,7 @@ class DataFeatureRemovalController extends Controller
|
||||
}
|
||||
|
||||
// Display changed extensions
|
||||
$aHiddenInputNames = [
|
||||
$aSetupParameterNames = [
|
||||
'selected_extensions' => '[]',
|
||||
'selected_modules' => '[]',
|
||||
'display_choices' => '',
|
||||
@@ -108,95 +111,38 @@ class DataFeatureRemovalController extends Controller
|
||||
'target_env' => ITOP_DEFAULT_ENV,
|
||||
];
|
||||
|
||||
$aHiddenInputs = [];
|
||||
foreach ($aHiddenInputNames as $sInputName => $defaultValue) {
|
||||
$aHiddenInputs[$sInputName] = utils::ReadPostedParam($sInputName, $defaultValue, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
||||
$oParameters = new SessionParameters(SetupUtils::SESSION_PARAMETERS_NAME);
|
||||
foreach ($aSetupParameterNames as $sInputName => $defaultValue) {
|
||||
$oParameters->SetParameter($sInputName, $oParameters->GetParameter($sInputName, $defaultValue));
|
||||
}
|
||||
$aParams['aHiddenInputs'] = $aHiddenInputs;
|
||||
|
||||
$aAddedExtensions = json_decode($aHiddenInputs['added_extensions'], true);
|
||||
|
||||
$aRemovedExtensions = json_decode($aHiddenInputs['removed_extensions'], true);
|
||||
if ("[]" === $aHiddenInputs['selected_modules']) {
|
||||
$aAddedExtensions = json_decode($oParameters->GetParameter('added_extensions', '[]'), true);
|
||||
$aRemovedExtensions = json_decode($oParameters->GetParameter('removed_extensions', '[]'), true);
|
||||
if ('[]' === $oParameters->GetParameter('selected_modules', '[]')) {
|
||||
//it does not come from setup
|
||||
// we get extensions from 1st screen uiblocks
|
||||
$this->ReadExtensionsDiff();
|
||||
$aHiddenInputs['force-uninstall'] = $this->bForcedUninstallation ? 'on' : '';
|
||||
$oParameters->SetParameter('force-uninstall', $this->bForcedUninstallation ? 'on' : '');
|
||||
$aAddedExtensions = $this->aExtensionsToCheck['to_be_installed'];
|
||||
$aHiddenInputs['added_extensions'] = $this->ConvertIntoSetupFormat($aAddedExtensions);
|
||||
$oParameters->SetParameter('added_extensions', $this->ConvertIntoSetupFormat($aAddedExtensions));
|
||||
|
||||
$aRemovedExtensions = $this->aExtensionsToCheck['to_be_removed'];
|
||||
$aHiddenInputs['removed_extensions'] = $this->ConvertIntoSetupFormat($aRemovedExtensions);
|
||||
$oParameters->SetParameter('removed_extensions', $this->ConvertIntoSetupFormat($aRemovedExtensions));
|
||||
|
||||
$aExtensionsNotUninstallable = $this->aExtensionsToCheck['extensions_not_uninstallable'];
|
||||
$aHiddenInputs['extensions_not_uninstallable'] = $this->ConvertIntoSetupFormat($aExtensionsNotUninstallable);
|
||||
$oParameters->SetParameter('extensions_not_uninstallable', $this->ConvertIntoSetupFormat($aExtensionsNotUninstallable));
|
||||
}
|
||||
|
||||
$aParams['aAddedExtensions'] = $aAddedExtensions;
|
||||
$aParams['aRemovedExtensions'] = $aRemovedExtensions;
|
||||
|
||||
DataFeatureRemovalLog::Debug(__METHOD__.' Extensions given in parameter', null, [
|
||||
'added_extensions' => $aAddedExtensions,
|
||||
'removed_extensions' => $aRemovedExtensions]);
|
||||
|
||||
$aParams['sTransactionId'] = utils::GetNewTransactionId();
|
||||
$aParams['iColumnCount'] = $this->iColumnCount;
|
||||
$aParams['aAvailableExtensions'] = $this->SplitArrayIntoColumns($this->GetExtensionsDiff($aAddedExtensions, $aRemovedExtensions), $this->iColumnCount);
|
||||
|
||||
//to make setup redirection work, we need to pass complex data structures to setup wizards (ie extension/module lists)
|
||||
$sSourceEnv = MetaModel::GetEnvironment();
|
||||
$this->oRuntimeEnvironment = new RunTimeEnvironment($sSourceEnv, false);
|
||||
|
||||
if ('[]' === $aHiddenInputs['selected_modules']) {
|
||||
$oConfig = MetaModel::GetConfig();
|
||||
$aSelectedExtensions = DataFeatureRemoverExtensionService::GetInstance()->GetExtensionMap()->GetSelectedExtensions($oConfig, array_keys($aAddedExtensions), array_keys($aRemovedExtensions));
|
||||
$aHiddenInputs['selected_extensions'] = $this->ConvertIntoSetupFormat($aSelectedExtensions);
|
||||
|
||||
$aSelectedModules = []; // keep it to compile method
|
||||
} else {
|
||||
$aSelectedExtensions = json_decode($aHiddenInputs['selected_extensions'], true);
|
||||
$aSelectedModules = json_decode($aHiddenInputs['selected_modules'], true);
|
||||
}
|
||||
|
||||
try {
|
||||
$this->Compile($aSelectedExtensions, array_keys($aRemovedExtensions), $aSelectedModules);
|
||||
$aHiddenInputs['selected_modules'] = $this->ConvertIntoSetupFormat($aSelectedModules);
|
||||
} catch (CoreException $e) {
|
||||
$aParams['DataFeatureRemovalErrorMessage'] = $e->getHtmlDesc();
|
||||
$this->DisplayPage($aParams, 'AnalysisResult');
|
||||
return;
|
||||
} catch (Exception $e) {
|
||||
$aParams['DataFeatureRemovalErrorMessage'] = $e->getMessage();
|
||||
$this->DisplayPage($aParams, 'AnalysisResult');
|
||||
return;
|
||||
}
|
||||
|
||||
$oSetupAudit = new SetupAudit($sSourceEnv);
|
||||
$aGetRemovedClasses = array_keys($oSetupAudit->RunDataAudit());
|
||||
DataFeatureRemovalLog::Debug(__METHOD__, null, ['aGetRemovedClasses' => $aGetRemovedClasses]);
|
||||
|
||||
$aParams['aClasses'] = $aGetRemovedClasses;
|
||||
|
||||
new ContextTag(ContextTag::TAG_SETUP);
|
||||
$aParams['sLaunchSetupUrl'] = utils::GetAbsoluteUrlAppRoot().'setup/wizard.php';
|
||||
$aParams['aSetupParams'] = [
|
||||
"_class" => "WizStepLandingBeforeAudit",
|
||||
"operation" => "next",
|
||||
];
|
||||
|
||||
foreach ($aHiddenInputs as $sInputName => $sInputValue) {
|
||||
$aParams['aSetupParams'][$sInputName] = $sInputValue;
|
||||
}
|
||||
|
||||
[$aParams['aDeletionPlanSummary'], $aParams['iQueryCount'], $aParams['bDeletionPossible']] = $this->GetDeletionPlanSummaryTable($aGetRemovedClasses);
|
||||
[$aParams['aDeletionExecutionSummary'], $aParams['bHasDeletionExecution']] = $this->GetExecutionSummaryTable();
|
||||
$aParams['bDeletionNeeded'] = ($aParams['iQueryCount'] > 0);
|
||||
Session::Set('aDeletionExecutionSummary', serialize($this->aDeletionExecutionSummary));
|
||||
|
||||
if (!$aParams['bDeletionNeeded']) {
|
||||
// Erase session setup parameters
|
||||
SetupUtils::CreateSetupToken();
|
||||
}
|
||||
$aAvailableExtensions = $this->GetExtensionsDiff($aAddedExtensions, $aRemovedExtensions);
|
||||
$aParams['aAvailableExtensionsCount'] = count($aAvailableExtensions);
|
||||
$aParams['aAvailableExtensions'] = $this->SplitArrayIntoColumns($aAvailableExtensions, $this->iColumnCount);
|
||||
$aParams['sAjaxURL'] = utils::GetAbsoluteUrlModulePage(DataFeatureRemovalHelper::MODULE_NAME, 'index.php');
|
||||
|
||||
$this->DisplayPage($aParams, 'AnalysisResult');
|
||||
}
|
||||
@@ -204,55 +150,124 @@ class DataFeatureRemovalController extends Controller
|
||||
private function ConvertIntoSetupFormat(array $aData): string
|
||||
{
|
||||
$aNewData = [];
|
||||
foreach ($aData as $k => $sVal) {
|
||||
$aNewData[] = sprintf('"%s":"%s"', $k, $sVal);
|
||||
foreach ($aData as $sCode => $sLabel) {
|
||||
$aNewData[] = sprintf('"%s":"%s"', $sCode, $sLabel);
|
||||
}
|
||||
|
||||
return "{".implode(',', $aNewData)."}";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $aSelectedExtensions
|
||||
* @param array $aRemovedExtensions
|
||||
* @param array $aSelectedModules
|
||||
*
|
||||
* @return void
|
||||
* @throws \ConfigException
|
||||
* @throws \CoreException
|
||||
*/
|
||||
private function Compile(array $aSelectedExtensions, array $aRemovedExtensions, array &$aSelectedModules): void
|
||||
public function OperationAjaxCompile(): void
|
||||
{
|
||||
$aParams = [];
|
||||
//to make setup redirection work, we need to pass complex data structures to setup wizards (ie extension/module lists)
|
||||
$sSourceEnv = MetaModel::GetEnvironment();
|
||||
$sBuildDir = APPROOT."/env-$sSourceEnv-build";
|
||||
if (! is_dir($sBuildDir)) {
|
||||
SetupUtils::builddir($sBuildDir);
|
||||
}
|
||||
$bIsDirEmpty = count(scandir($sBuildDir)) === 2;
|
||||
$bForceCompilation = Session::Get('bForceCompilation', false);
|
||||
$oRuntimeEnvironment = new RunTimeEnvironment($sSourceEnv, false);
|
||||
|
||||
$oConfig = MetaModel::GetConfig();
|
||||
if ($bIsDirEmpty || $bForceCompilation) {
|
||||
Session::Unset('bForceCompilation');
|
||||
$this->oRuntimeEnvironment->CopySetupFiles();
|
||||
$oParameters = new SessionParameters(SetupUtils::SESSION_PARAMETERS_NAME);
|
||||
$aSelectedModules = json_decode($oParameters->GetParameter('selected_modules', '[]'), true);
|
||||
$aSelectedExtensions = json_decode($oParameters->GetParameter('selected_extensions', '[]'), true);
|
||||
$aAddedExtensions = json_decode($oParameters->GetParameter('added_extensions', '[]'), true);
|
||||
$aRemovedExtensions = json_decode($oParameters->GetParameter('removed_extensions', '[]'), true);
|
||||
|
||||
try {
|
||||
$this->ValidateTransactionId();
|
||||
|
||||
$oConfig = MetaModel::GetConfig();
|
||||
if (count($aSelectedModules) === 0) {
|
||||
$aSelectedModules = $this->oRuntimeEnvironment->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions);
|
||||
$aSelectedExtensions = DataFeatureRemoverExtensionService::GetInstance()->GetExtensionMap()->GetSelectedExtensions($oConfig, array_keys($aAddedExtensions), array_keys($aRemovedExtensions));
|
||||
$oParameters->SetParameter('selected_extensions', $this->ConvertIntoSetupFormat($aSelectedExtensions));
|
||||
}
|
||||
DataFeatureRemovalLog::Debug(
|
||||
__METHOD__,
|
||||
null,
|
||||
['sSourceEnv' => $sSourceEnv, 'sBuildDir' => $sBuildDir, 'bIsDirEmpty' => $bIsDirEmpty, glob("$sBuildDir/*")]
|
||||
);
|
||||
$this->oRuntimeEnvironment->DoCompile($aSelectedExtensions, $aRemovedExtensions, $aSelectedModules, MFCompiler::CanUseSymbolicLinks());
|
||||
} else {
|
||||
if (count($aSelectedModules) === 0) {
|
||||
$aSelectedModules = $this->oRuntimeEnvironment->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions);
|
||||
|
||||
$sBuildDir = APPROOT."/env-$sSourceEnv-build";
|
||||
if (! is_dir($sBuildDir)) {
|
||||
SetupUtils::builddir($sBuildDir);
|
||||
}
|
||||
$bIsDirEmpty = count(scandir($sBuildDir)) === 2;
|
||||
$bForceCompilation = Session::Get('bForceCompilation', false);
|
||||
if ($bIsDirEmpty || $bForceCompilation) {
|
||||
$oRuntimeEnvironment->CopySetupFiles();
|
||||
if (count($aSelectedModules) === 0) {
|
||||
$aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions);
|
||||
}
|
||||
|
||||
DataFeatureRemovalLog::Debug(
|
||||
__METHOD__,
|
||||
null,
|
||||
['sSourceEnv' => $sSourceEnv, 'sBuildDir' => $sBuildDir, 'bIsDirEmpty' => $bIsDirEmpty, glob("$sBuildDir/*")]
|
||||
);
|
||||
$oRuntimeEnvironment->DoCompile($aSelectedExtensions, $aRemovedExtensions, $aSelectedModules, MFCompiler::CanUseSymbolicLinks());
|
||||
Session::Unset('bForceCompilation');
|
||||
} else {
|
||||
if (count($aSelectedModules) === 0) {
|
||||
$aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions);
|
||||
}
|
||||
}
|
||||
} catch (CoreException $e) {
|
||||
$aParams['error_message'] = $e->getHtmlDesc();
|
||||
} catch (Exception $e) {
|
||||
$aParams['error_message'] = $e->getMessage();
|
||||
}
|
||||
|
||||
$aParams['success_message'] = Dict::S('DataFeatureRemoval:Compile:Success');
|
||||
$aParams['transaction_id'] = utils::GetNewTransactionId();
|
||||
|
||||
$oParameters->SetParameter('selected_modules', json_encode($aSelectedModules));
|
||||
$this->DisplayJSONPage($aParams);
|
||||
}
|
||||
|
||||
public function OperationAjaxRunAudit(): void
|
||||
{
|
||||
$oParameters = new SessionParameters(SetupUtils::SESSION_PARAMETERS_NAME);
|
||||
$aParams = [];
|
||||
$aPageParams = [];
|
||||
try {
|
||||
$this->ValidateTransactionId();
|
||||
|
||||
$sSourceEnv = MetaModel::GetEnvironment();
|
||||
$oSetupAudit = new SetupAudit($sSourceEnv);
|
||||
$aRemovedClasses = array_keys($oSetupAudit->RunDataAudit());
|
||||
$oParameters->SetParameter('classes', $aRemovedClasses);
|
||||
|
||||
new ContextTag(ContextTag::TAG_SETUP);
|
||||
$aPageParams['sLaunchSetupUrl'] = utils::GetAbsoluteUrlAppRoot().'setup/wizard.php';
|
||||
$aPageParams['aSetupParams'] = [
|
||||
"_class" => "WizStepLandingBeforeAudit",
|
||||
"operation" => "next",
|
||||
];
|
||||
$aPageParams['sTransactionId'] = utils::GetNewTransactionId();
|
||||
|
||||
$aDeletionPlanSummaryEntities = $this->GetDeletionPlanSummaryEntities($aRemovedClasses);
|
||||
[$aPageParams['aDeletionPlanSummary'], $aPageParams['iQueryCount'], $aPageParams['bDeletionPossible']] = $this->GetDeletionPlanSummaryTable($aDeletionPlanSummaryEntities);
|
||||
[$aPageParams['aDeletionExecutionSummary'], $aPageParams['bHasDeletionExecution']] = $this->GetExecutionSummaryTable();
|
||||
$aPageParams['bDeletionNeeded'] = ($aPageParams['iQueryCount'] > 0);
|
||||
|
||||
if (!$aPageParams['bDeletionNeeded']) {
|
||||
// Erase session setup parameters
|
||||
SetupUtils::CreateSetupToken();
|
||||
}
|
||||
|
||||
$this->DisplayAjaxPage($aPageParams, 'AjaxRunAudit');
|
||||
return;
|
||||
} catch (CoreException $e) {
|
||||
$aParams['error_message'] = $e->getHtmlDesc();
|
||||
} catch (Exception $e) {
|
||||
$aParams['error_message'] = $e->getMessage();
|
||||
}
|
||||
|
||||
$this->DisplayJSONPage($aParams);
|
||||
}
|
||||
|
||||
private function GetExecutionSummaryTable(): array
|
||||
{
|
||||
$sName = 'ExcutionSummary';
|
||||
$sName = 'ExecutionSummary';
|
||||
|
||||
$this->aDeletionExecutionSummary = unserialize(Session::Get('aDeletionExecutionSummary') ?? serialize([]));
|
||||
|
||||
$aTableData = [];
|
||||
if (count($this->aDeletionExecutionSummary) === 0) {
|
||||
@@ -278,11 +293,15 @@ class DataFeatureRemovalController extends Controller
|
||||
|
||||
}
|
||||
|
||||
private function GetDeletionPlanSummaryTable(array $aRemovedClasses): array
|
||||
private function GetDeletionPlanSummaryEntities(array $aRemovedClasses): array
|
||||
{
|
||||
$oDataCleanupService = new StaticDeletionPlan();
|
||||
return $oDataCleanupService->GetCleanupSummary($aRemovedClasses);
|
||||
}
|
||||
|
||||
private function GetDeletionPlanSummaryTable(array $aDeletionPlanSummaryEntities): array
|
||||
{
|
||||
$sName = 'DeletionPlanSummary';
|
||||
$oDataCleanupService = new StaticDeletionPlan();
|
||||
$aDeletionPlanSummaryEntities = $oDataCleanupService->GetCleanupSummary($aRemovedClasses);
|
||||
$aColumns = ['Class', 'Delete Count' , 'Update Count', 'Issue Count'];
|
||||
$aRows = [];
|
||||
$iQueryCount = 0;
|
||||
@@ -305,9 +324,10 @@ class DataFeatureRemovalController extends Controller
|
||||
{
|
||||
$this->ValidateTransactionId();
|
||||
|
||||
$this->aDeletionExecutionSummary = unserialize(Session::Get('aDeletionExecutionSummary'));
|
||||
$this->aDeletionExecutionSummary = unserialize(Session::Get('aDeletionExecutionSummary') ?? serialize([]));
|
||||
Session::Unset('aDeletionExecutionSummary');
|
||||
$aClasses = utils::ReadPostedParam('classes', null, utils::ENUM_SANITIZATION_FILTER_CLASS);
|
||||
$oParameters = new SessionParameters(SetupUtils::SESSION_PARAMETERS_NAME);
|
||||
$aClasses = $oParameters->GetParameter('classes', []);
|
||||
|
||||
$oDataCleanupService = new DataCleanupService();
|
||||
$aDeletionExecutionSummary = $oDataCleanupService->ExecuteCleanup($aClasses);
|
||||
@@ -322,6 +342,7 @@ class DataFeatureRemovalController extends Controller
|
||||
$oSummary->iTotalUpdateCount += $oExecutionSummary->iUpdateCount;
|
||||
}
|
||||
|
||||
Session::Set('aDeletionExecutionSummary', serialize($this->aDeletionExecutionSummary));
|
||||
$this->OperationAnalysisResult();
|
||||
}
|
||||
|
||||
@@ -347,7 +368,7 @@ class DataFeatureRemovalController extends Controller
|
||||
'uninstallable' => $oExtension->CanBeUninstalled(),
|
||||
'remote' => $oExtension->IsRemote(),
|
||||
'missing' => $oExtension->bRemovedFromDisk,
|
||||
'cannot-be-installed' => $oExtension->HasDependencyIssue(),
|
||||
'dependency_issue' => $oExtension->HasDependencyIssue(),
|
||||
],
|
||||
|
||||
];
|
||||
@@ -415,12 +436,11 @@ class DataFeatureRemovalController extends Controller
|
||||
|
||||
/**
|
||||
* Read extensions selected from posted parameters
|
||||
* @return int Number of extensions to be added or removed
|
||||
*/
|
||||
public function ReadExtensionsDiff(): int
|
||||
public function ReadExtensionsDiff(): void
|
||||
{
|
||||
if (!is_null($this->aExtensionsToCheck)) {
|
||||
return count($this->aExtensionsToCheck['to_be_installed']) + count($this->aExtensionsToCheck['to_be_removed']);
|
||||
return;
|
||||
}
|
||||
|
||||
$aAvailableExtensions = $this->GetAvailableExtensions();
|
||||
@@ -442,7 +462,7 @@ class DataFeatureRemovalController extends Controller
|
||||
if (! $this->bForcedUninstallation && $aExtensionData['extra_flags']['uninstallable']) {
|
||||
$this->bForcedUninstallation = true;
|
||||
}
|
||||
if (false === $aExtensionData['extra_flags']['uninstallable']) {
|
||||
if (false === $aExtensionData['extra_flags']['uninstallable'] || true === $aExtensionData['extra_flags']['remote']) {
|
||||
$this->aExtensionsToCheck['extensions_not_uninstallable'][] = $sCode;
|
||||
}
|
||||
} elseif (!$aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] === 'on') {
|
||||
@@ -451,7 +471,6 @@ class DataFeatureRemovalController extends Controller
|
||||
$this->aExtensionsToCheck['to_be_installed'][$sCode] = $sLabel;
|
||||
}
|
||||
}
|
||||
return count($this->aExtensionsToCheck['to_be_installed']) + count($this->aExtensionsToCheck['to_be_removed']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -134,10 +134,6 @@ class DataCleanupService
|
||||
/** @var DBObject $oDependentObj */
|
||||
while ($oDependentObj = $oSet->Fetch()) {
|
||||
$iDeletePropagationOption = $oExtKeyAttDef->GetDeletionPropagationOption();
|
||||
if ($iDeletePropagationOption == DEL_MANUAL) {
|
||||
$this->oObjectService->SetIssue(get_class($oDependentObj));
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($oExtKeyAttDef->IsNullAllowed()) {
|
||||
// Optional external key, list to reset
|
||||
@@ -152,6 +148,12 @@ class DataCleanupService
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// Mandatory external key
|
||||
if ($iDeletePropagationOption == DEL_MANUAL) {
|
||||
// Cannot be deleted automatically, must be handled manually
|
||||
$this->oObjectService->SetIssue(get_class($oDependentObj));
|
||||
continue;
|
||||
}
|
||||
// Propagate deletion only if not visited
|
||||
if ($this->IsVisited($oDependentObj)) {
|
||||
continue;
|
||||
|
||||
@@ -59,9 +59,11 @@ class StaticDeletionPlan
|
||||
{
|
||||
foreach ($aClasses as $sClass) {
|
||||
$oDeletionPlanItem = $this->GetInitialClassDeletionPlan($sClass);
|
||||
$oDeletionPlanEntity = new DeletionPlanEntity();
|
||||
$oDeletionPlanEntity->oDelete->Merge($oDeletionPlanItem);
|
||||
$this->aDeletionPlan[$sClass] = $oDeletionPlanEntity;
|
||||
// N°9831 Do not overwrite existing entity as it may already exist for this class if a previously processed class references it (issues/updates already accumulated must be kept)
|
||||
if (false === array_key_exists($sClass, $this->aDeletionPlan)) {
|
||||
$this->aDeletionPlan[$sClass] = new DeletionPlanEntity();
|
||||
}
|
||||
$this->aDeletionPlan[$sClass]->oDelete->Merge($oDeletionPlanItem);
|
||||
|
||||
$this->DeletionPlanForReferencingClasses($sClass);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
{# @copyright Copyright (C) 2010-2026 Combodo SARL #}
|
||||
{# @license http://opensource.org/licenses/AGPL-3.0 #}
|
||||
|
||||
{% if bDeletionNeeded %}
|
||||
{% UIFieldSet Standard {sLegend:'DataFeatureRemoval:DeletionPlan:Title'|dict_s} %}
|
||||
{% UIDataTable ForForm { sRef:'aDeletionPlanSummary', aColumns:aDeletionPlanSummary.Columns, aData:aDeletionPlanSummary.Data} %}{% EndUIDataTable %}
|
||||
{% EndUIFieldSet %}
|
||||
{% if bDeletionPossible %}
|
||||
{% UIForm Standard {} %}
|
||||
{% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %}
|
||||
{% UIInput ForHidden { sName:'operation', sValue:'DoDeletion'} %}
|
||||
{% UIToolbar ForButton {} %}
|
||||
{% UIButton ForPrimaryAction {sLabel:'UI:Button:DoDeletion'|dict_s, sName:'btn_deletion', sId:'btn_deletion', bIsSubmit:true} %}
|
||||
{% EndUIToolbar %}
|
||||
{% EndUIForm %}
|
||||
{% else %}
|
||||
{% UIAlert ForFailure { sTitle: '', sContent: 'DataFeatureRemoval:DeletionPlan:Error:Issues'|dict_s } %}{% EndUIAlert %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% UIAlert ForSuccess { sTitle:'DataFeatureRemoval:CleanupComplete:Title'|dict_s, sContent:'DataFeatureRemoval:CompilComplete'|dict_s } %}{% EndUIAlert %}
|
||||
|
||||
{% UIForm Standard {sId:'launch-setup-form', Action:sLaunchSetupUrl, EncType: 'application/x-www-form-urlencoded'} %}
|
||||
{% for sKey, sValue in aSetupParams %}
|
||||
{% UIInput ForHidden { sName:sKey, sValue:sValue } %}
|
||||
{% endfor %}
|
||||
{% UIButton ForPrimaryAction {sLabel:'UI:Button:Setup'|dict_s, sName:'btn_setup', sId:'btn_setup', bIsSubmit:true} %}
|
||||
{% EndUIForm %}
|
||||
{% endif %}
|
||||
|
||||
{% if bHasDeletionExecution %}
|
||||
{% UIFieldSet Standard {sLegend:'DataFeatureRemoval:Execution:Title'|dict_s} %}
|
||||
{% UIDataTable ForForm { sRef:'aDeletionExecutionSummary', aColumns:aDeletionExecutionSummary.Columns, aData:aDeletionExecutionSummary.Data} %}{% EndUIDataTable %}
|
||||
{% EndUIFieldSet %}
|
||||
{% endif %}
|
||||
@@ -1,15 +1,31 @@
|
||||
{# @copyright Copyright (C) 2010-2026 Combodo SARL #}
|
||||
{# @license http://opensource.org/licenses/AGPL-3.0 #}
|
||||
|
||||
|
||||
|
||||
{% UIPanel ForInformation { sTitle:'DataFeatureRemoval:Analysis:Title'|dict_s, sSubTitle: 'DataFeatureRemoval:Analysis:Subtitle'|dict_s} %}
|
||||
{% if null != DataFeatureRemovalErrorMessage %}
|
||||
<div id="feature_removal_error_msg_div" style="display:block">
|
||||
{% UIAlert ForFailure { sTitle:'DataFeatureRemoval:Failure:Title'|dict_s, sId: 'feature_removal_error_msg', sContent:DataFeatureRemovalErrorMessage } %}
|
||||
{% EndUIAlert %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% UIAlert ForInformation { sTitle: '', sId: 'ajax_compile_in_progress_msg', AddCSSClasses: ['ibo-is-hidden', 'ibo-is-html-content'] } %}
|
||||
{{ 'DataFeatureRemoval:Compile:InProgress'|dict_s }}
|
||||
{% UISpinner Standard { } %}
|
||||
{% EndUIAlert %}
|
||||
{% UIAlert ForSuccess { sTitle:'success', sId: 'ajax_compile_success_msg', AddCSSClasses: ['ibo-is-hidden', 'ibo-is-html-content'] } %}{% EndUIAlert %}
|
||||
{% UIAlert ForFailure { sTitle:'error', sId: 'ajax_compile_error_msg', AddCSSClasses: ['ibo-is-hidden', 'ibo-is-html-content'] } %}{% EndUIAlert %}
|
||||
|
||||
{% UIAlert ForInformation { sTitle: '', sId: 'ajax_run_audit_in_progress_msg', AddCSSClasses: ['ibo-is-hidden', 'ibo-is-html-content'] } %}
|
||||
{{ 'DataFeatureRemoval:RunAudit:InProgress'|dict_s }}
|
||||
{% UISpinner Standard { } %}
|
||||
{% EndUIAlert %}
|
||||
{% UIAlert ForSuccess { sTitle:'DataFeatureRemoval:RunAudit:Success'|dict_s, sId: 'ajax_run_audit_success_msg', AddCSSClasses: ['ibo-is-hidden', 'ibo-is-html-content'] } %}{% EndUIAlert %}
|
||||
{% UIAlert ForFailure { sTitle:'error', sId: 'ajax_run_audit_error_msg', AddCSSClasses: ['ibo-is-hidden', 'ibo-is-html-content'] } %}{% EndUIAlert %}
|
||||
|
||||
{% if aAvailableExtensionsCount == 0 %}
|
||||
{% UITitle Neutral { sTitle:'DataFeatureRemoval:NoResult:Title'|dict_s, iLevel:2 } %}{% EndUITitle %}
|
||||
{% else %}
|
||||
{% UIPanel Neutral { sTitle:'DataFeatureRemoval:Result:Title'|dict_s, sSubTitle: '' } %}
|
||||
{% UIMultiColumn Standard {} %}
|
||||
{% for iColumnIndex in 0..iColumnCount-1 %}
|
||||
@@ -25,68 +41,10 @@
|
||||
{% endfor %}
|
||||
{% EndUIMultiColumn %}
|
||||
{% EndUIPanel %}
|
||||
{% else %}
|
||||
{% UIPanel Neutral { sTitle:'DataFeatureRemoval:Result:Title'|dict_s, sSubTitle: '' } %}
|
||||
{% UIMultiColumn Standard {} %}
|
||||
{% for iColumnIndex in 0..iColumnCount-1 %}
|
||||
{% UIColumn Standard {} %}
|
||||
{% for aExtension in aAvailableExtensions[iColumnIndex] %}
|
||||
{% if aExtension['installed'] %}
|
||||
{% UIExtensionDetails Installed { sCode : aExtension['code'], sLabel : aExtension['label'], sDescription : aExtension['description'], aMetaData : [aExtension['version'], aExtension['source']], aExtraFlags : aExtension['extra_flags']} %}{% EndUIExtensionDetails %}
|
||||
{% else %}
|
||||
{% UIExtensionDetails NotInstalled { sCode : aExtension['code'], sLabel : aExtension['label'], sDescription : aExtension['description'], aMetaData : [aExtension['version'], aExtension['source']], aExtraFlags : aExtension['extra_flags']} %}{% EndUIExtensionDetails %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% EndUIColumn %}
|
||||
{% endfor %}
|
||||
{% EndUIMultiColumn %}
|
||||
{% EndUIPanel %}
|
||||
|
||||
{% if bDeletionNeeded %}
|
||||
{% UIFieldSet Standard {sLegend:'DataFeatureRemoval:DeletionPlan:Title'|dict_s} %}
|
||||
{% UIDataTable ForForm { sRef:'aDeletionPlanSummary', aColumns:aDeletionPlanSummary.Columns, aData:aDeletionPlanSummary.Data} %}{% EndUIDataTable %}
|
||||
{% EndUIFieldSet %}
|
||||
{% if bDeletionPossible %}
|
||||
{% UIForm Standard {} %}
|
||||
{% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %}
|
||||
{% UIInput ForHidden { sName:'operation', sValue:'DoDeletion'} %}
|
||||
{% for sKey, sClass in aClasses %}
|
||||
{% UIInput ForHidden { sName:"classes[" ~ sKey ~ "]", sValue:sClass } %}
|
||||
{% endfor %}
|
||||
{% for sCode, sLabel in aAddedExtensions %}
|
||||
{% UIInput ForHidden { sName:"aAddedExtensions[" ~ sCode ~ "]", sValue:sLabel } %}
|
||||
{% endfor %}
|
||||
{% for sCode, sLabel in aRemovedExtensions %}
|
||||
{% UIInput ForHidden { sName:"aRemovedExtensions[" ~ sCode ~ "]", sValue:sLabel } %}
|
||||
{% endfor %}
|
||||
{% for sInputName, sValue in aHiddenInputs %}
|
||||
{% UIInput ForHidden { sName:sInputName, sValue:sValue } %}
|
||||
{% endfor %}
|
||||
{% UIToolbar ForButton {} %}
|
||||
{% UIButton ForPrimaryAction {sLabel:'UI:Button:DoDeletion'|dict_s, sName:'btn_deletion', sId:'btn_deletion', bIsSubmit:true} %}
|
||||
{% EndUIToolbar %}
|
||||
{% EndUIForm %}
|
||||
{% else %}
|
||||
{% UIAlert ForFailure { sContent: 'DataFeatureRemoval:DeletionPlan:Error:Issues'|dict_s } %}{% EndUIAlert %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% UIAlert ForSuccess { sTitle:'DataFeatureRemoval:CleanupComplete:Title'|dict_s, sContent:'DataFeatureRemoval:CompilComplete'|dict_s, sId:value } %}{% EndUIAlert %}
|
||||
|
||||
{% UIForm Standard {'sId':'launch-setup-form', Action:sLaunchSetupUrl, 'EncType': 'application/x-www-form-urlencoded'} %}
|
||||
{% for sKey, sValue in aSetupParams %}
|
||||
{% UIInput ForHidden { sName:sKey, sValue:sValue } %}
|
||||
{% endfor %}
|
||||
{% UIButton ForPrimaryAction {sLabel:'UI:Button:Setup'|dict_s, sName:'btn_setup', sId:'btn_setup', bIsSubmit:true} %}
|
||||
{% EndUIForm %}
|
||||
{% endif %}
|
||||
|
||||
{% if bHasDeletionExecution %}
|
||||
{% UIFieldSet Standard {sLegend:'DataFeatureRemoval:Execution:Title'|dict_s} %}
|
||||
{% UIDataTable ForForm { sRef:'aDeletionExecutionSummary', aColumns:aDeletionExecutionSummary.Columns, aData:aDeletionExecutionSummary.Data} %}{% EndUIDataTable %}
|
||||
{% EndUIFieldSet %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<div id="ajax_run_audit" class="ibo-block"></div>
|
||||
|
||||
{% UIForm Standard {} %}
|
||||
{% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %}
|
||||
{% UIInput ForHidden { sName:'operation', sValue:'Main'} %}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
{# @copyright Copyright (C) 2010-2026 Combodo SARL #}
|
||||
{# @license http://opensource.org/licenses/AGPL-3.0 #}
|
||||
|
||||
function ajax_run_audit(sTransactionId) {
|
||||
$('#ajax_run_audit_in_progress_msg').removeClass('ibo-is-hidden');
|
||||
$.post(
|
||||
'{{ sAjaxURL|raw }}',
|
||||
{ operation: 'ajax_run_audit', transaction_id: sTransactionId },
|
||||
function (data) {
|
||||
$('#ajax_run_audit_in_progress_msg').addClass('ibo-is-hidden');
|
||||
|
||||
if (data.error_message) {
|
||||
$('#ajax_run_audit_error_msg .ibo-alert--title').html(data.error_message);
|
||||
$('#ajax_run_audit_error_msg').removeClass('ibo-is-hidden');
|
||||
} else {
|
||||
$('#ajax_run_audit_success_msg').removeClass('ibo-is-hidden');
|
||||
$('#ajax_run_audit').html(data);
|
||||
}
|
||||
}
|
||||
)
|
||||
.fail(function() {
|
||||
$('#ajax_run_audit_in_progress_msg').addClass('ibo-is-hidden');
|
||||
$('#ajax_run_audit_error_msg .ibo-alert--title').html('{{ 'DataFeatureRemoval:RunAudit:Error'|dict_s }}');
|
||||
$('#ajax_run_audit_error_msg').removeClass('ibo-is-hidden');
|
||||
});
|
||||
}
|
||||
|
||||
function ajax_compile() {
|
||||
$('#ajax_compile_in_progress_msg').removeClass('ibo-is-hidden');
|
||||
|
||||
$.post(
|
||||
'{{ sAjaxURL|raw }}',
|
||||
{ operation: 'ajax_compile', transaction_id: '{{ sTransactionId }}' },
|
||||
function (data) {
|
||||
$('#ajax_compile_in_progress_msg').addClass('ibo-is-hidden');
|
||||
|
||||
if (data.error_message) {
|
||||
$('#ajax_compile_error_msg .ibo-alert--title').html(data.error_message);
|
||||
$('#ajax_compile_error_msg').removeClass('ibo-is-hidden');
|
||||
} else {
|
||||
$('#ajax_compile_success_msg .ibo-alert--title').html(data.success_message);
|
||||
$('#ajax_compile_success_msg').removeClass('ibo-is-hidden');
|
||||
|
||||
ajax_run_audit(data.transaction_id);
|
||||
}
|
||||
},
|
||||
'json'
|
||||
)
|
||||
.fail(function() {
|
||||
$('#ajax_compile_in_progress_msg').addClass('ibo-is-hidden');
|
||||
$('#ajax_compile_error_msg .ibo-alert--title').html('{{ 'DataFeatureRemoval:Compile:Error'|dict_s }}');
|
||||
$('#ajax_compile_error_msg').removeClass('ibo-is-hidden');
|
||||
});
|
||||
}
|
||||
|
||||
ajax_compile();
|
||||
@@ -5,7 +5,6 @@
|
||||
{% UIForm Standard {} %}
|
||||
{% UIInput ForHidden {sName:'operation', sValue:'AnalysisResult'} %}
|
||||
{% UIInput ForHidden {sName:'transaction_id', sValue:sTransactionId} %}
|
||||
{% UIInput ForHidden {sName:'return_application', sValue:'itop'} %}
|
||||
|
||||
{% UIPanel Neutral { sTitle:'DataFeatureRemoval:Features:Title'|dict_s, sSubTitle: '' } %}
|
||||
{% UIMultiColumn Standard {} %}
|
||||
|
||||
@@ -16,8 +16,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'DBTools:Class' => 'Класс',
|
||||
'DBTools:Title' => 'Инструменты обслуживания базы данных',
|
||||
'DBTools:ErrorsFound' => 'Найденные ошибки',
|
||||
'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:Indication' => 'Важно: после исправления ошибок в базе данных нужно будет запустить анализ заново, так как появятся новые несоответствия',
|
||||
'DBTools:Disclaimer' => 'ВНИМАНИЕ: СДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ БАЗЫ ДАННЫХ ПЕРЕД ЗАПУСКОМ ИСПРАВЛЕНИЙ',
|
||||
'DBTools:Error' => 'Ошибка',
|
||||
'DBTools:Count' => 'Количество',
|
||||
'DBTools:SQLquery' => 'SQL-запрос',
|
||||
@@ -28,23 +28,23 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'DBTools:ShowIds' => 'Подробный вид',
|
||||
'DBTools:ShowReport' => 'Отчёт',
|
||||
'DBTools:IntegrityCheck' => 'Проверка целостности',
|
||||
'DBTools:FetchCheck' => 'Fetch Check (long)~~',
|
||||
'DBTools:SelectAnalysisType' => 'Select analysis type~~',
|
||||
'DBTools:FetchCheck' => 'Проверка выборки (долго)',
|
||||
'DBTools:SelectAnalysisType' => 'Выберите тип анализа',
|
||||
'DBTools:Analyze' => 'Анализировать',
|
||||
'DBTools:Details' => 'Показать подробности',
|
||||
'DBTools:ShowAll' => 'Показать все ошибки',
|
||||
'DBTools:Inconsistencies' => 'Несоответствия базы данных',
|
||||
'DBTools:DetailedErrorTitle' => '%2$s error(s) in class %1$s: %3$s~~',
|
||||
'DBTools:DetailedErrorLimit' => 'List limited to %1$s errors~~',
|
||||
'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' => '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~~',
|
||||
'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
|
||||
|
||||
@@ -33,10 +33,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'DBTools:Disclaimer' => '免责申明: 在应用修复之前, 应先备份数据库',
|
||||
'DBTools:Error' => '错误',
|
||||
'DBTools:Count' => '个数',
|
||||
'DBTools:SQLquery' => 'SQL查询',
|
||||
'DBTools:FixitSQLquery' => '修复问题的SQL查询 (指示)',
|
||||
'DBTools:SQLresult' => 'SQL结果',
|
||||
'DBTools:NoError' => '数据库正确',
|
||||
'DBTools:SQLquery' => 'SQL 查询',
|
||||
'DBTools:FixitSQLquery' => '用于修复问题的 SQL 查询(说明)',
|
||||
'DBTools:SQLresult' => 'SQL 结果',
|
||||
'DBTools:NoError' => '数据库 OK',
|
||||
'DBTools:HideIds' => '错误列表',
|
||||
'DBTools:ShowIds' => '详细视图',
|
||||
'DBTools:ShowReport' => '报告',
|
||||
@@ -73,7 +73,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
// Lost attachments
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'DBTools:LostAttachments' => '附件缺失',
|
||||
'DBTools:LostAttachments:Disclaimer' => '可以在此搜索数据库中丢失或错放的附件. 这不是数据恢复工具, 其无法恢复已删除的数据.',
|
||||
'DBTools:LostAttachments:Disclaimer' => '可以在此搜索数据库中丢失或错放的附件. 请注意, 这不是数据恢复工具, 无法恢复已删除的数据.',
|
||||
|
||||
'DBTools:LostAttachments:Button:Analyze' => '分析',
|
||||
'DBTools:LostAttachments:Button:Restore' => '还原',
|
||||
|
||||
@@ -26,12 +26,12 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Attachments:NoAttachment' => 'Нет вложений.',
|
||||
'Attachments:PreviewNotAvailable' => 'Предварительный просмотр не доступен для этого типа вложений.',
|
||||
'Attachments:Error:FileTooLarge' => 'Файл слишком велик для загрузки. %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~~',
|
||||
'Attachments:Error:UploadedFileEmpty' => 'Полученный файл пуст и не может быть прикреплён.
|
||||
Либо вы загрузили пустой файл,
|
||||
либо обратитесь к администратору '.ITOP_APPLICATION_SHORT.' — возможно, диск сервера '.ITOP_APPLICATION_SHORT.' переполнен.',
|
||||
'Attachments:Render:Icons' => 'Отображать как иконки',
|
||||
'Attachments:Render:Table' => 'Отображать как список',
|
||||
'UI:Attachments:DropYourFileHint' => 'Перетащите файлы в любое место этой области',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -62,7 +62,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Attachments:File:Uploader' => 'Пользователь',
|
||||
'Attachments:File:Size' => 'Размер',
|
||||
'Attachments:File:MimeType' => 'Тип',
|
||||
'Attachments:File:DownloadsCount' => 'Downloads~~',
|
||||
'Attachments:File:DownloadsCount' => 'Скачиваний',
|
||||
]);
|
||||
//
|
||||
// Class: Attachment
|
||||
@@ -82,15 +82,15 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
|
||||
'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
|
||||
'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
|
||||
'Class:TriggerOnAttachmentDownload' => 'Триггер (на скачивание вложения объекта)',
|
||||
'Class:TriggerOnAttachmentDownload+' => 'Триггер на скачивание вложения объекта заданного класса (или его дочернего класса)',
|
||||
'Class:TriggerOnAttachmentCreate' => 'Триггер (на создание вложения объекта)',
|
||||
'Class:TriggerOnAttachmentCreate+' => 'Триггер на создание вложения объекта',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Добавлять файл в email',
|
||||
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'Если отмечено, файл будет автоматически прикреплён к письму при срабатывании действия email',
|
||||
'Class:TriggerOnAttachmentDelete' => 'Триггер (на удаление вложения объекта)',
|
||||
'Class:TriggerOnAttachmentDelete+' => 'Триггер на удаление вложения объекта',
|
||||
'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Добавлять удалённый файл в email',
|
||||
'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'Если отмечено, удалённый файл будет автоматически прикреплён к письму при срабатывании действия email',
|
||||
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Триггер на объект не допускается для класса Attachment. Используйте специальный триггер',
|
||||
]);
|
||||
|
||||
@@ -20,7 +20,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'bkp-mysqldump-ok' => 'Утилита mysqldump найдена: %1$s',
|
||||
'bkp-mysqldump-notfound' => 'Утилиту mysqldump найти не удалось: %1$s - пожалуйста, убедитесь в том, что она установлена, и путь до директории с бинарными файлами добавлен в PATH, либо измените параметр mysql_bindir в файле конфигурации.',
|
||||
'bkp-mysqldump-issue' => 'Утилита mysqldump на может быть запущена (retcode=%1$d) Пожалуйста, убедитесь в том, что она установлена, и путь до директории с бинарными файлами добавлен в PATH, либо измените параметр mysql_bindir в файле конфигурации.',
|
||||
'bkp-missing-dir' => 'The target directory <code>%1$s</code> could not be found~~',
|
||||
'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',
|
||||
@@ -38,7 +38,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'bkp-status-backups-manual' => 'Резервное копирование вручную',
|
||||
'bkp-status-backups-none' => 'Резервных копий ещё нет',
|
||||
'bkp-next-backup' => 'Следующее резервное копирование будет выполняться в <b>%1$s</b> (%2$s) в %3$s',
|
||||
'bkp-next-backup-unknown' => 'The next backup is <b>not scheduled</b> yet.~~',
|
||||
'bkp-next-backup-unknown' => 'Следующее резервное копирование пока <b>не запланировано</b>.',
|
||||
'bkp-button-backup-now' => 'Запустить сейчас!',
|
||||
'bkp-button-restore-now' => 'Восстановить!',
|
||||
'bkp-confirm-backup' => 'Пожалуйста, подтвердите, что вы хотите выполнить резервное копирование прямо сейчас.',
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkFunctionalCIToProviderContract' => 'Связь Функциональная КЕ/Договор с поставщиком',
|
||||
'Class:lnkFunctionalCIToProviderContract+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkFunctionalCIToProviderContract/Name' => '%1$s / %2$s',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => 'Договор с поставщиком',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id+' => '',
|
||||
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name' => 'Договор с поставщиком',
|
||||
@@ -32,7 +32,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkFunctionalCIToService' => 'Связь Функциональная КЕ/Услуга',
|
||||
'Class:lnkFunctionalCIToService+' => '',
|
||||
'Class:lnkFunctionalCIToService/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkFunctionalCIToService/Name' => '%1$s / %2$s',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_id' => 'Услуга',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_id+' => '',
|
||||
'Class:lnkFunctionalCIToService/Attribute:service_name' => 'Услуга',
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkFunctionalCIToTicket' => 'Связь Функциональная КЕ/Тикет',
|
||||
'Class:lnkFunctionalCIToTicket+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkFunctionalCIToTicket/Name' => '%1$s / %2$s',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id' => 'Тикет',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id+' => '',
|
||||
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref' => 'Тикет',
|
||||
|
||||
@@ -27,24 +27,24 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:Change:Overview' => '概况',
|
||||
'Menu:Change:Overview+' => '',
|
||||
'Menu:NewChange' => '新建变更',
|
||||
'Menu:NewChange+' => '新建变更',
|
||||
'Menu:NewChange+' => '新建变更工单',
|
||||
'Menu:SearchChanges' => '搜索变更',
|
||||
'Menu:SearchChanges+' => '搜索变更',
|
||||
'Menu:Change:Shortcuts' => '快捷方式',
|
||||
'Menu:Change:Shortcuts+' => 'Shortcuts to predefined sets of Changes~~',
|
||||
'Menu:SearchChanges+' => '搜索变更工单',
|
||||
'Menu:Change:Shortcuts' => '变更',
|
||||
'Menu:Change:Shortcuts+' => '快速访问预定义的变更数据',
|
||||
'Menu:WaitingAcceptance' => '等待审核的变更',
|
||||
'Menu:WaitingAcceptance+' => '',
|
||||
'Menu:WaitingApproval' => '等待批准的变更',
|
||||
'Menu:WaitingApproval+' => 'Changes in planned status~~',
|
||||
'Menu:Changes' => '所有打开的变更',
|
||||
'Menu:Changes+' => '所有打开的变更',
|
||||
'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:OpenChanges' => '待处理的变更',
|
||||
'Tickets:Related:RecentChanges' => '最近的变更 (72小时)',
|
||||
]);
|
||||
|
||||
@@ -132,7 +132,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'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:child_changes_list+' => '此变更相关的子变更',
|
||||
'Class:Change/Attribute:parent_id_friendlyname' => '父级变更昵称',
|
||||
'Class:Change/Attribute:parent_id_friendlyname+' => '',
|
||||
'Class:Change/Attribute:parent_id_finalclass_recall' => '变更类型',
|
||||
|
||||
@@ -26,15 +26,15 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:Change:Overview' => '概况',
|
||||
'Menu:Change:Overview+' => '',
|
||||
'Menu:NewChange' => '新建变更',
|
||||
'Menu:NewChange+' => '新建变更',
|
||||
'Menu:NewChange+' => '新建变更工单',
|
||||
'Menu:SearchChanges' => '搜索变更',
|
||||
'Menu:SearchChanges+' => '搜索变更',
|
||||
'Menu:Change:Shortcuts' => '快捷方式',
|
||||
'Menu:Change:Shortcuts+' => 'Shortcuts to predefined sets of Changes~~',
|
||||
'Menu:SearchChanges+' => '搜索变更工单',
|
||||
'Menu:Change:Shortcuts' => '变更',
|
||||
'Menu:Change:Shortcuts+' => '快速访问预定义的变更数据',
|
||||
'Menu:WaitingAcceptance' => '等待审核的变更',
|
||||
'Menu:WaitingAcceptance+' => '',
|
||||
'Menu:WaitingApproval' => '等待批准的变更',
|
||||
'Menu:WaitingApproval+' => 'Changes in planned status~~',
|
||||
'Menu:WaitingApproval+' => '处于计划状态的变更',
|
||||
'Menu:Changes' => '所有打开的变更',
|
||||
'Menu:Changes+' => '所有打开的变更',
|
||||
'Menu:MyChanges' => '分配给我的变更',
|
||||
@@ -43,7 +43,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI-ChangeManagementOverview-Last-7-days' => '最近一周的变更 (按数量)',
|
||||
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => '最近一周的变更 (按范围)',
|
||||
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => '最近一周的变更 (按状态)',
|
||||
'Tickets:Related:OpenChanges' => '打开的变更',
|
||||
'Tickets:Related:OpenChanges' => '待处理的变更',
|
||||
'Tickets:Related:RecentChanges' => '最近的变更 (72小时)',
|
||||
]);
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<end_of_warranty></end_of_warranty>
|
||||
<rack_id>0</rack_id>
|
||||
<enclosure_id>0</enclosure_id>
|
||||
<nb_u></nb_u>
|
||||
<nb_u>2</nb_u>
|
||||
<managementip></managementip>
|
||||
<powerA_id>0</powerA_id>
|
||||
<powerB_id>0</powerB_id>
|
||||
@@ -40,9 +40,9 @@
|
||||
<asset_number></asset_number>
|
||||
<purchase_date></purchase_date>
|
||||
<end_of_warranty></end_of_warranty>
|
||||
<rack_id>0</rack_id>
|
||||
<rack_id></rack_id>
|
||||
<enclosure_id>0</enclosure_id>
|
||||
<nb_u></nb_u>
|
||||
<nb_u>1</nb_u>
|
||||
<managementip></managementip>
|
||||
<powerA_id>0</powerA_id>
|
||||
<powerB_id>0</powerB_id>
|
||||
@@ -59,16 +59,16 @@
|
||||
<business_criticity>low</business_criticity>
|
||||
<move2production></move2production>
|
||||
<serialnumber></serialnumber>
|
||||
<location_id>0</location_id>
|
||||
<location_id>2</location_id>
|
||||
<status>production</status>
|
||||
<brand_id>1</brand_id>
|
||||
<model_id>4</model_id>
|
||||
<asset_number></asset_number>
|
||||
<purchase_date></purchase_date>
|
||||
<end_of_warranty></end_of_warranty>
|
||||
<rack_id>0</rack_id>
|
||||
<rack_id></rack_id>
|
||||
<enclosure_id>0</enclosure_id>
|
||||
<nb_u></nb_u>
|
||||
<nb_u>2</nb_u>
|
||||
<managementip></managementip>
|
||||
<powerA_id>0</powerA_id>
|
||||
<powerB_id>0</powerB_id>
|
||||
@@ -85,16 +85,16 @@
|
||||
<business_criticity>low</business_criticity>
|
||||
<move2production></move2production>
|
||||
<serialnumber>US3215687014</serialnumber>
|
||||
<location_id>0</location_id>
|
||||
<location_id>2</location_id>
|
||||
<status>production</status>
|
||||
<brand_id>1</brand_id>
|
||||
<model_id>4</model_id>
|
||||
<asset_number></asset_number>
|
||||
<purchase_date>2021-07-30</purchase_date>
|
||||
<end_of_warranty>2025-07-29</end_of_warranty>
|
||||
<rack_id>0</rack_id>
|
||||
<rack_id></rack_id>
|
||||
<enclosure_id>0</enclosure_id>
|
||||
<nb_u></nb_u>
|
||||
<nb_u>2</nb_u>
|
||||
<managementip>10.10.24.2</managementip>
|
||||
<powerA_id>0</powerA_id>
|
||||
<powerB_id>0</powerB_id>
|
||||
|
||||
@@ -494,8 +494,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:ApplicationSolution/Attribute:functionalcis_list+' => 'Alle configuratie-items die deze applicatie-oplossing tot stand brengen',
|
||||
'Class:ApplicationSolution/Attribute:businessprocess_list' => 'Bedrijfsprocessen',
|
||||
'Class:ApplicationSolution/Attribute:businessprocess_list+' => 'Alle bedrijfsprocessen die afhankelijk zijn van deze applicatie-oplossing',
|
||||
'Class:ApplicationSolution/Attribute:logo' => 'Logo~~',
|
||||
'Class:ApplicationSolution/Attribute:logo+' => 'Used as object icon when displayed within impact analysis graphs~~',
|
||||
'Class:ApplicationSolution/Attribute:logo' => 'Logo',
|
||||
'Class:ApplicationSolution/Attribute:logo+' => 'Wordt gebruikt als objectpictogram bij weergave in impactanalyse.',
|
||||
'Class:ApplicationSolution/Attribute:status' => 'Status',
|
||||
'Class:ApplicationSolution/Attribute:status+' => '',
|
||||
'Class:ApplicationSolution/Attribute:status/Value:active' => 'Actief',
|
||||
@@ -517,8 +517,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:BusinessProcess+' => '',
|
||||
'Class:BusinessProcess/Attribute:applicationsolutions_list' => 'Applicatie-oplossing',
|
||||
'Class:BusinessProcess/Attribute:applicationsolutions_list+' => 'Alle applicatie-oplossingen die impact hebben op dit bedrijfsproces',
|
||||
'Class:BusinessProcess/Attribute:logo' => 'Logo~~',
|
||||
'Class:BusinessProcess/Attribute:logo+' => 'Used as object icon when displayed within impact analysis graphs~~',
|
||||
'Class:BusinessProcess/Attribute:logo' => 'Logo',
|
||||
'Class:BusinessProcess/Attribute:logo+' => 'Wordt gebruikt als objectpictogram bij weergave in impactanalyse.',
|
||||
'Class:BusinessProcess/Attribute:status' => 'Status',
|
||||
'Class:BusinessProcess/Attribute:status+' => '',
|
||||
'Class:BusinessProcess/Attribute:status/Value:active' => 'Actief',
|
||||
@@ -615,8 +615,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:MiddlewareInstance' => 'Middleware-instantie',
|
||||
'Class:MiddlewareInstance+' => '',
|
||||
'Class:MiddlewareInstance/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:MiddlewareInstance/Attribute:logo' => 'Logo~~',
|
||||
'Class:MiddlewareInstance/Attribute:logo+' => 'Used as object icon when displayed within impact analysis graphs~~',
|
||||
'Class:MiddlewareInstance/Attribute:logo' => 'Logo',
|
||||
'Class:MiddlewareInstance/Attribute:logo+' => 'Wordt gebruikt als objectpictogram bij weergave in impactanalyse.',
|
||||
'Class:MiddlewareInstance/Attribute:middleware_id' => 'Middleware',
|
||||
'Class:MiddlewareInstance/Attribute:middleware_id+' => '',
|
||||
'Class:MiddlewareInstance/Attribute:middleware_name' => 'Naam middleware',
|
||||
@@ -649,8 +649,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:WebApplication/Attribute:webserver_id+' => '',
|
||||
'Class:WebApplication/Attribute:webserver_name' => 'Naam webserver',
|
||||
'Class:WebApplication/Attribute:webserver_name+' => '',
|
||||
'Class:WebApplication/Attribute:logo' => 'Logo~~',
|
||||
'Class:WebApplication/Attribute:logo+' => 'Used as object icon when displayed within impact analysis graphs~~',
|
||||
'Class:WebApplication/Attribute:logo' => 'Logo',
|
||||
'Class:WebApplication/Attribute:logo+' => 'Wordt gebruikt als objectpictogram bij weergave in impactanalyse.',
|
||||
'Class:WebApplication/Attribute:url' => 'Link (URL)',
|
||||
'Class:WebApplication/Attribute:url+' => '',
|
||||
]);
|
||||
@@ -848,7 +848,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
|
||||
Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:Tape' => 'Tape',
|
||||
'Class:Tape+' => 'A Tape (or cartridge) within '.ITOP_APPLICATION_SHORT.' is a removable piece of storage part of a Tape Library~~',
|
||||
'Class:Tape+' => 'Een Tape (of cartridge) binnen '.ITOP_APPLICATION_SHORT.' is een verwijderbaar opslagonderdeel van een tapebibliotheek.',
|
||||
'Class:Tape/Attribute:name' => 'Naam',
|
||||
'Class:Tape/Attribute:name+' => '',
|
||||
'Class:Tape/Attribute:description' => 'Omschrijving',
|
||||
@@ -898,8 +898,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:Software/Attribute:version+' => '',
|
||||
'Class:Software/Attribute:documents_list' => 'Documenten',
|
||||
'Class:Software/Attribute:documents_list+' => 'Alle documenten gelinkt aan deze software',
|
||||
'Class:Software/Attribute:logo' => 'Logo~~',
|
||||
'Class:Software/Attribute:logo+' => 'Used as icon for all Software Instance objects using this Software, when displayed within impact analysis graphs~~',
|
||||
'Class:Software/Attribute:logo' => 'Logo',
|
||||
'Class:Software/Attribute:logo+' => 'Wordt gebruikt als pictogram voor alle software-instanties die deze software gebruiken, wanneer deze worden weergegeven in impactanalyses.',
|
||||
'Class:Software/Attribute:type' => 'Type',
|
||||
'Class:Software/Attribute:type+' => '',
|
||||
'Class:Software/Attribute:type/Value:DBServer' => 'Databaseserver',
|
||||
@@ -1015,7 +1015,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:OSLicence/Attribute:osversion_id' => 'Versie besturingssysteem',
|
||||
'Class:OSLicence/Attribute:osversion_id+' => '',
|
||||
'Class:OSLicence/Attribute:osfamily_id' => 'Soort besturingssysteem',
|
||||
'Class:OSLicence/Attribute:osfamily_id+' => '~~',
|
||||
'Class:OSLicence/Attribute:osfamily_id+' => '',
|
||||
'Class:OSLicence/Attribute:osversion_name' => 'Naam versie bestandssysteem',
|
||||
'Class:OSLicence/Attribute:osversion_name+' => '',
|
||||
'Class:OSLicence/Attribute:virtualmachines_list' => 'Virtuele machines',
|
||||
@@ -1069,8 +1069,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:OSVersion/Attribute:osfamily_id+' => '',
|
||||
'Class:OSVersion/Attribute:osfamily_name' => 'Naam soort besturingssysteem',
|
||||
'Class:OSVersion/Attribute:osfamily_name+' => '',
|
||||
'Class:OSVersion/UniquenessRule:name_osfamily+' => 'Name must be unique in the OS family~~',
|
||||
'Class:OSVersion/UniquenessRule:name_osfamily' => 'this OS version already exists within the OS family~~',
|
||||
'Class:OSVersion/UniquenessRule:name_osfamily+' => 'Naam moet uniek zijn binnen de soort besturingssysteem',
|
||||
'Class:OSVersion/UniquenessRule:name_osfamily' => 'Deze versie van het besturingssysteem bestaat al binnen de soort besturingssysteem',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -1080,8 +1080,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:OSFamily' => 'Soort Besturingssysteem',
|
||||
'Class:OSFamily+' => '',
|
||||
'Class:OSFamily/UniquenessRule:name+' => 'Name must be unique~~',
|
||||
'Class:OSFamily/UniquenessRule:name' => 'this OS family already exists~~',
|
||||
'Class:OSFamily/UniquenessRule:name+' => 'Naam moet uniek zijn',
|
||||
'Class:OSFamily/UniquenessRule:name' => 'Deze soort besturingssysteem bestaat al',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -1091,12 +1091,12 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:Brand' => 'Merk',
|
||||
'Class:Brand+' => '',
|
||||
'Class:Brand/Attribute:logo' => 'Logo~~',
|
||||
'Class:Brand/Attribute:logo+' => '~~',
|
||||
'Class:Brand/Attribute:logo' => 'Logo',
|
||||
'Class:Brand/Attribute:logo+' => '',
|
||||
'Class:Brand/Attribute:physicaldevices_list' => 'Fysieke apparaten',
|
||||
'Class:Brand/Attribute:physicaldevices_list+' => 'Alle fysieke apparaten van dit merk',
|
||||
'Class:Brand/UniquenessRule:name+' => 'De naam van het merk moet uniek zijn',
|
||||
'Class:Brand/UniquenessRule:name' => 'De naam van het merk bestaat al',
|
||||
'Class:Brand/UniquenessRule:name' => 'Dit merk bestaat al',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -1111,8 +1111,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:Model/Attribute:brand_id+' => '',
|
||||
'Class:Model/Attribute:brand_name' => 'Naam merk',
|
||||
'Class:Model/Attribute:brand_name+' => '',
|
||||
'Class:Model/Attribute:picture' => 'Picture~~',
|
||||
'Class:Model/Attribute:picture+' => '~~',
|
||||
'Class:Model/Attribute:picture' => 'Afbeelding',
|
||||
'Class:Model/Attribute:picture+' => '',
|
||||
'Class:Model/Attribute:type' => 'Soort apparaat',
|
||||
'Class:Model/Attribute:type+' => '',
|
||||
'Class:Model/Attribute:type/Value:PowerSource' => 'Stroombron',
|
||||
@@ -1164,8 +1164,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:NetworkDeviceType' => 'Soort netwerkapparaat',
|
||||
'Class:NetworkDeviceType+' => '',
|
||||
'Class:NetworkDeviceType/Attribute:logo' => 'Logo~~',
|
||||
'Class:NetworkDeviceType/Attribute:logo+' => 'Used as icon for all Network Device of this type, when displayed in console (details, summary card and impact analysis graphs)~~',
|
||||
'Class:NetworkDeviceType/Attribute:logo' => 'Logo',
|
||||
'Class:NetworkDeviceType/Attribute:logo+' => 'Wordt gebruikt als pictogram voor alle netwerkapparaten van dit type wanneer deze in de console worden weergegeven (details, overzichtskaart en impactanalyse).',
|
||||
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list' => 'Netwerkapparaten',
|
||||
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list+' => 'Alle netwerkapparaten van deze soort',
|
||||
]);
|
||||
@@ -1181,8 +1181,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:IOSVersion/Attribute:brand_id+' => '',
|
||||
'Class:IOSVersion/Attribute:brand_name' => 'Naam merk',
|
||||
'Class:IOSVersion/Attribute:brand_name+' => '',
|
||||
'Class:IOSVersion/UniquenessRule:name_brand+' => 'Name must be unique in the brand~~',
|
||||
'Class:IOSVersion/UniquenessRule:name_brand' => 'this IOS version already exists for this brand~~',
|
||||
'Class:IOSVersion/UniquenessRule:name_brand+' => 'Naam moet uniek zijn binnen het merk',
|
||||
'Class:IOSVersion/UniquenessRule:name_brand' => 'Deze IOS versie bestaat al binnen dit merk',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -1550,13 +1550,13 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
// Add translation for Fieldsets
|
||||
|
||||
Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'ConfigMgmt:baseinfo' => 'General~~',
|
||||
'ConfigMgmt:moreinfo' => 'CI specifics~~',
|
||||
'Storage:moreinfo' => 'Storage specifics~~',
|
||||
'ConfigMgmt:otherinfo' => 'Description~~',
|
||||
'ConfigMgmt:dates' => 'Dates~~',
|
||||
'Software:moreinfo' => 'Software specifics~~',
|
||||
'Phone:moreinfo' => 'Phone specifics~~',
|
||||
'ConfigMgmt:baseinfo' => 'Globale informatie',
|
||||
'ConfigMgmt:moreinfo' => 'CI specifieke informatie',
|
||||
'Storage:moreinfo' => 'Opslaginformatie',
|
||||
'ConfigMgmt:otherinfo' => 'Andere informatie',
|
||||
'ConfigMgmt:dates' => 'Datums',
|
||||
'Software:moreinfo' => 'Software informatie',
|
||||
'Phone:moreinfo' => 'Telefoon informatie',
|
||||
'Server:baseinfo' => 'Globale informatie',
|
||||
'Server:Date' => 'Datum',
|
||||
'Server:moreinfo' => 'Meer informatie',
|
||||
@@ -1645,8 +1645,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
//
|
||||
|
||||
Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:PhysicalInterface/Attribute:org_id' => 'Organization~~',
|
||||
'Class:PhysicalInterface/Attribute:org_id+' => '~~',
|
||||
'Class:PhysicalInterface/Attribute:location_id' => 'Location~~',
|
||||
'Class:PhysicalInterface/Attribute:location_id+' => '~~',
|
||||
'Class:PhysicalInterface/Attribute:org_id' => 'Organisatie',
|
||||
'Class:PhysicalInterface/Attribute:org_id+' => '',
|
||||
'Class:PhysicalInterface/Attribute:location_id' => 'Locatie',
|
||||
'Class:PhysicalInterface/Attribute:location_id+' => '',
|
||||
]);
|
||||
|
||||
@@ -20,9 +20,9 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Relation:depends on/Description' => 'Элементы, от которых зависит',
|
||||
'Relation:depends on/DownStream' => 'Зависит от...',
|
||||
'Relation:depends on/UpStream' => 'Влияет на...',
|
||||
'Relation:impacts/LoadData' => 'Load data~~',
|
||||
'Relation:impacts/NoFilteredData' => 'please select objects and load data~~',
|
||||
'Relation:impacts/FilteredData' => 'Filtered data~~',
|
||||
'Relation:impacts/LoadData' => 'Загрузить данные',
|
||||
'Relation:impacts/NoFilteredData' => 'выберите объекты и загрузите данные',
|
||||
'Relation:impacts/FilteredData' => 'Отфильтрованные данные',
|
||||
]);
|
||||
|
||||
// Dictionnay conventions
|
||||
@@ -69,7 +69,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkContactToFunctionalCI' => 'Связь Контакт/Функциональная КЕ',
|
||||
'Class:lnkContactToFunctionalCI+' => '',
|
||||
'Class:lnkContactToFunctionalCI/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkContactToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkContactToFunctionalCI/Attribute:functionalci_id' => 'Функциональная КЕ',
|
||||
'Class:lnkContactToFunctionalCI/Attribute:functionalci_id+' => '',
|
||||
'Class:lnkContactToFunctionalCI/Attribute:functionalci_name' => 'Функциональная КЕ',
|
||||
@@ -116,7 +116,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:FunctionalCI/Attribute:finalclass' => 'Тип',
|
||||
'Class:FunctionalCI/Attribute:finalclass+' => '',
|
||||
'Class:FunctionalCI/Tab:OpenedTickets' => 'Активные тикеты',
|
||||
'Class:FunctionalCI/Tab:OpenedTickets+' => 'Active Tickets which are impacting this functional CI~~',
|
||||
'Class:FunctionalCI/Tab:OpenedTickets+' => 'Активные тикеты, затрагивающие эту функциональную КЕ',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -126,7 +126,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:PhysicalDevice' => 'Физические устройства',
|
||||
'Class:PhysicalDevice+' => '',
|
||||
'Class:PhysicalDevice/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:PhysicalDevice/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:PhysicalDevice/Attribute:serialnumber' => 'Серийный номер',
|
||||
'Class:PhysicalDevice/Attribute:serialnumber+' => '',
|
||||
'Class:PhysicalDevice/Attribute:location_id' => 'Расположение',
|
||||
@@ -166,7 +166,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Rack' => 'Стойка',
|
||||
'Class:Rack+' => '',
|
||||
'Class:Rack/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:Rack/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:Rack/Attribute:nb_u' => 'Высота (U)',
|
||||
'Class:Rack/Attribute:nb_u+' => 'Количество юнитов',
|
||||
'Class:Rack/Attribute:device_list' => 'Устройства',
|
||||
@@ -233,7 +233,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:ConnectableCI' => 'Подключаемые КЕ',
|
||||
'Class:ConnectableCI+' => 'Подключаемые КЕ',
|
||||
'Class:ConnectableCI/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:ConnectableCI/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:ConnectableCI/Attribute:networkdevice_list' => 'Сетевые устройства',
|
||||
'Class:ConnectableCI/Attribute:networkdevice_list+' => 'Связанные сетевые устройства',
|
||||
'Class:ConnectableCI/Attribute:physicalinterface_list' => 'Сетевые интерфейсы',
|
||||
@@ -247,7 +247,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:DatacenterDevice' => 'Устройства дата-центра',
|
||||
'Class:DatacenterDevice+' => 'Устройства дата-центра',
|
||||
'Class:DatacenterDevice/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:DatacenterDevice/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:DatacenterDevice/Attribute:rack_id' => 'Стойка',
|
||||
'Class:DatacenterDevice/Attribute:rack_id+' => '',
|
||||
'Class:DatacenterDevice/Attribute:rack_name' => 'Стойка',
|
||||
@@ -285,7 +285,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:NetworkDevice' => 'Сетевое устройство',
|
||||
'Class:NetworkDevice+' => 'Сетевое устройство',
|
||||
'Class:NetworkDevice/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:NetworkDevice/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:NetworkDevice/Attribute:networkdevicetype_id' => 'Тип устройства',
|
||||
'Class:NetworkDevice/Attribute:networkdevicetype_id+' => '',
|
||||
'Class:NetworkDevice/Attribute:networkdevicetype_name' => 'Тип устройства',
|
||||
@@ -307,7 +307,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Server' => 'Сервер',
|
||||
'Class:Server+' => 'Сервер',
|
||||
'Class:Server/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:Server/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:Server/Attribute:osfamily_id' => 'Семейство ОС',
|
||||
'Class:Server/Attribute:osfamily_id+' => 'Семейство операционной системы',
|
||||
'Class:Server/Attribute:osfamily_name' => 'Семейство ОС',
|
||||
@@ -335,7 +335,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:StorageSystem' => 'Система хранения',
|
||||
'Class:StorageSystem+' => 'Система хранения',
|
||||
'Class:StorageSystem/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:StorageSystem/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:StorageSystem/Attribute:logicalvolume_list' => 'Логические тома',
|
||||
'Class:StorageSystem/Attribute:logicalvolume_list+' => 'Логические тома',
|
||||
]);
|
||||
@@ -347,7 +347,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:SANSwitch' => 'SAN коммутатор',
|
||||
'Class:SANSwitch+' => 'SAN коммутатор',
|
||||
'Class:SANSwitch/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:SANSwitch/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:SANSwitch/Attribute:datacenterdevice_list' => 'Устройства',
|
||||
'Class:SANSwitch/Attribute:datacenterdevice_list+' => 'Подключенные устройства',
|
||||
]);
|
||||
@@ -359,7 +359,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:TapeLibrary' => 'Ленточная библиотека',
|
||||
'Class:TapeLibrary+' => 'Ленточная библиотека',
|
||||
'Class:TapeLibrary/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:TapeLibrary/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:TapeLibrary/Attribute:tapes_list' => 'Ленты',
|
||||
'Class:TapeLibrary/Attribute:tapes_list+' => 'Ленты',
|
||||
]);
|
||||
@@ -371,7 +371,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:NAS' => 'Сетевое хранилище',
|
||||
'Class:NAS+' => 'Сетевое хранилище',
|
||||
'Class:NAS/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:NAS/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:NAS/Attribute:nasfilesystem_list' => 'Файловые системы',
|
||||
'Class:NAS/Attribute:nasfilesystem_list+' => 'Файловые системы',
|
||||
]);
|
||||
@@ -383,7 +383,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:PC' => 'Персональный компьютер',
|
||||
'Class:PC+' => 'Персональный компьютер',
|
||||
'Class:PC/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:PC/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:PC/Attribute:osfamily_id' => 'Семейство ОС',
|
||||
'Class:PC/Attribute:osfamily_id+' => 'Семейство операционной системы',
|
||||
'Class:PC/Attribute:osfamily_name' => 'Семейство ОС',
|
||||
@@ -411,7 +411,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Printer' => 'Принтер',
|
||||
'Class:Printer+' => 'Принтер',
|
||||
'Class:Printer/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:Printer/ComplementaryName' => '%1$s - %2$s',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -421,7 +421,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:PowerConnection' => 'Электропитание',
|
||||
'Class:PowerConnection+' => 'Подключения электропитания',
|
||||
'Class:PowerConnection/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:PowerConnection/ComplementaryName' => '%1$s - %2$s',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -431,7 +431,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:PowerSource' => 'Источник электропитания',
|
||||
'Class:PowerSource+' => 'Источник электропитания',
|
||||
'Class:PowerSource/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:PowerSource/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:PowerSource/Attribute:pdus_list' => 'Распределители',
|
||||
'Class:PowerSource/Attribute:pdus_list+' => 'Распределители электропитания (PDU)',
|
||||
]);
|
||||
@@ -443,7 +443,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:PDU' => 'Распределитель ЭП',
|
||||
'Class:PDU+' => 'Распределитель электропитания',
|
||||
'Class:PDU/ComplementaryName' => '%1$s - %2$s - %3$s - %4$s~~',
|
||||
'Class:PDU/ComplementaryName' => '%1$s - %2$s - %3$s - %4$s',
|
||||
'Class:PDU/Attribute:rack_id' => 'Стойка',
|
||||
'Class:PDU/Attribute:rack_id+' => '',
|
||||
'Class:PDU/Attribute:rack_name' => 'Стойка',
|
||||
@@ -461,7 +461,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Peripheral' => 'Периферийное устройство',
|
||||
'Class:Peripheral+' => 'Периферийное устройство',
|
||||
'Class:Peripheral/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:Peripheral/ComplementaryName' => '%1$s - %2$s',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -471,7 +471,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Enclosure' => 'Крейт',
|
||||
'Class:Enclosure+' => 'Крейт, шасси и т.п.',
|
||||
'Class:Enclosure/ComplementaryName' => '%1$s - %2$s - %3$s~~',
|
||||
'Class:Enclosure/ComplementaryName' => '%1$s - %2$s - %3$s',
|
||||
'Class:Enclosure/Attribute:rack_id' => 'Стойка',
|
||||
'Class:Enclosure/Attribute:rack_id+' => '',
|
||||
'Class:Enclosure/Attribute:rack_name' => 'Стойка',
|
||||
@@ -493,8 +493,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:ApplicationSolution/Attribute:functionalcis_list+' => 'Конфигурационные единицы в составе прикладного решения',
|
||||
'Class:ApplicationSolution/Attribute:businessprocess_list' => 'Бизнес-процессы',
|
||||
'Class:ApplicationSolution/Attribute:businessprocess_list+' => 'Бизнес-процессы, зависящие от прикладного решения',
|
||||
'Class:ApplicationSolution/Attribute:logo' => 'Logo~~',
|
||||
'Class:ApplicationSolution/Attribute:logo+' => 'Used as object icon when displayed within impact analysis graphs~~',
|
||||
'Class:ApplicationSolution/Attribute:logo' => 'Логотип',
|
||||
'Class:ApplicationSolution/Attribute:logo+' => 'Используется как иконка объекта на графах анализа влияния',
|
||||
'Class:ApplicationSolution/Attribute:status' => 'Статус',
|
||||
'Class:ApplicationSolution/Attribute:status+' => '',
|
||||
'Class:ApplicationSolution/Attribute:status/Value:active' => 'Активный',
|
||||
@@ -516,8 +516,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:BusinessProcess+' => '',
|
||||
'Class:BusinessProcess/Attribute:applicationsolutions_list' => 'Прикладные решения',
|
||||
'Class:BusinessProcess/Attribute:applicationsolutions_list+' => 'Прикладные решения, влияющие на бизнес-процесс',
|
||||
'Class:BusinessProcess/Attribute:logo' => 'Logo~~',
|
||||
'Class:BusinessProcess/Attribute:logo+' => 'Used as object icon when displayed within impact analysis graphs~~',
|
||||
'Class:BusinessProcess/Attribute:logo' => 'Логотип',
|
||||
'Class:BusinessProcess/Attribute:logo+' => 'Используется как иконка объекта на графах анализа влияния',
|
||||
'Class:BusinessProcess/Attribute:status' => 'Статус',
|
||||
'Class:BusinessProcess/Attribute:status+' => '',
|
||||
'Class:BusinessProcess/Attribute:status/Value:active' => 'Активный',
|
||||
@@ -613,9 +613,9 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:MiddlewareInstance' => 'Экземпляр промежуточного ПО',
|
||||
'Class:MiddlewareInstance+' => 'Экземпляр промежуточного ПО',
|
||||
'Class:MiddlewareInstance/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:MiddlewareInstance/Attribute:logo' => 'Logo~~',
|
||||
'Class:MiddlewareInstance/Attribute:logo+' => 'Used as object icon when displayed within impact analysis graphs~~',
|
||||
'Class:MiddlewareInstance/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:MiddlewareInstance/Attribute:logo' => 'Логотип',
|
||||
'Class:MiddlewareInstance/Attribute:logo+' => 'Используется как иконка объекта на графах анализа влияния',
|
||||
'Class:MiddlewareInstance/Attribute:middleware_id' => 'Промежуточное ПО',
|
||||
'Class:MiddlewareInstance/Attribute:middleware_id+' => '',
|
||||
'Class:MiddlewareInstance/Attribute:middleware_name' => 'Промежуточное ПО',
|
||||
@@ -629,7 +629,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:DatabaseSchema' => 'Схема базы данных',
|
||||
'Class:DatabaseSchema+' => 'Схема базы данных',
|
||||
'Class:DatabaseSchema/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:DatabaseSchema/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:DatabaseSchema/Attribute:dbserver_id' => 'Сервер БД',
|
||||
'Class:DatabaseSchema/Attribute:dbserver_id+' => '',
|
||||
'Class:DatabaseSchema/Attribute:dbserver_name' => 'Сервер БД',
|
||||
@@ -643,13 +643,13 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:WebApplication' => 'Веб-приложение',
|
||||
'Class:WebApplication+' => 'Веб-приложение',
|
||||
'Class:WebApplication/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:WebApplication/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:WebApplication/Attribute:webserver_id' => 'Веб-сервер',
|
||||
'Class:WebApplication/Attribute:webserver_id+' => '',
|
||||
'Class:WebApplication/Attribute:webserver_name' => 'Веб-сервер',
|
||||
'Class:WebApplication/Attribute:webserver_name+' => '',
|
||||
'Class:WebApplication/Attribute:logo' => 'Logo~~',
|
||||
'Class:WebApplication/Attribute:logo+' => 'Used as object icon when displayed within impact analysis graphs~~',
|
||||
'Class:WebApplication/Attribute:logo' => 'Логотип',
|
||||
'Class:WebApplication/Attribute:logo+' => 'Используется как иконка объекта на графах анализа влияния',
|
||||
'Class:WebApplication/Attribute:url' => 'URL',
|
||||
'Class:WebApplication/Attribute:url+' => '',
|
||||
]);
|
||||
@@ -725,7 +725,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:VirtualMachine' => 'Виртуальная машина',
|
||||
'Class:VirtualMachine+' => 'Виртуальная машина',
|
||||
'Class:VirtualMachine/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:VirtualMachine/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_id' => 'Виртуальный хост',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_id+' => '',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_name' => 'Виртуальный хост',
|
||||
@@ -786,7 +786,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkServerToVolume' => 'Связь Сервер/Том',
|
||||
'Class:lnkServerToVolume+' => 'Связь Сервер/Том',
|
||||
'Class:lnkServerToVolume/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkServerToVolume/Name' => '%1$s / %2$s',
|
||||
'Class:lnkServerToVolume/Attribute:volume_id' => 'Том',
|
||||
'Class:lnkServerToVolume/Attribute:volume_id+' => '',
|
||||
'Class:lnkServerToVolume/Attribute:volume_name' => 'Том',
|
||||
@@ -806,7 +806,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkVirtualDeviceToVolume' => 'Связь Виртуальное устройство/Том',
|
||||
'Class:lnkVirtualDeviceToVolume+' => 'Связь Виртуальное устройство/Том',
|
||||
'Class:lnkVirtualDeviceToVolume/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkVirtualDeviceToVolume/Name' => '%1$s / %2$s',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_id' => 'Том',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_id+' => '',
|
||||
'Class:lnkVirtualDeviceToVolume/Attribute:volume_name' => 'Том',
|
||||
@@ -826,7 +826,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkSanToDatacenterDevice' => 'Связь SAN коммутатор/Устройство дата-центра',
|
||||
'Class:lnkSanToDatacenterDevice+' => 'Связь SAN коммутатор/Устройство дата-центра',
|
||||
'Class:lnkSanToDatacenterDevice/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkSanToDatacenterDevice/Name' => '%1$s / %2$s',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_id' => 'SAN коммутатор',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_id+' => '',
|
||||
'Class:lnkSanToDatacenterDevice/Attribute:san_name' => 'SAN коммутатор',
|
||||
@@ -847,7 +847,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Tape' => 'Лента',
|
||||
'Class:Tape+' => 'A Tape (or cartridge) within '.ITOP_APPLICATION_SHORT.' is a removable piece of storage part of a Tape Library~~',
|
||||
'Class:Tape+' => 'Лента (или картридж) в '.ITOP_APPLICATION_SHORT.' — съёмный носитель, являющийся частью ленточной библиотеки',
|
||||
'Class:Tape/Attribute:name' => 'Название',
|
||||
'Class:Tape/Attribute:name+' => '',
|
||||
'Class:Tape/Attribute:description' => 'Описание',
|
||||
@@ -888,7 +888,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Software' => 'Программное обеспечение',
|
||||
'Class:Software+' => 'Программное обеспечение',
|
||||
'Class:Software/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:Software/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:Software/Attribute:name' => 'Название',
|
||||
'Class:Software/Attribute:name+' => '',
|
||||
'Class:Software/Attribute:vendor' => 'Вендор',
|
||||
@@ -897,8 +897,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Software/Attribute:version+' => '',
|
||||
'Class:Software/Attribute:documents_list' => 'Документы',
|
||||
'Class:Software/Attribute:documents_list+' => 'Все документы, связанные с этим ПО',
|
||||
'Class:Software/Attribute:logo' => 'Logo~~',
|
||||
'Class:Software/Attribute:logo+' => 'Used as icon for all Software Instance objects using this Software, when displayed within impact analysis graphs~~',
|
||||
'Class:Software/Attribute:logo' => 'Логотип',
|
||||
'Class:Software/Attribute:logo+' => 'Используется как иконка для всех экземпляров ПО, использующих это ПО, на графах анализа влияния',
|
||||
'Class:Software/Attribute:type' => 'Тип',
|
||||
'Class:Software/Attribute:type+' => '',
|
||||
'Class:Software/Attribute:type/Value:DBServer' => 'Сервер БД',
|
||||
@@ -947,7 +947,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:OSPatch/Attribute:functionalcis_list+' => 'Все системы, где установлен этот патч',
|
||||
'Class:OSPatch/Attribute:osversion_id' => 'Версия ОС',
|
||||
'Class:OSPatch/Attribute:osversion_id+' => '',
|
||||
'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~',
|
||||
'Class:OSPatch/Attribute:osfamily_id' => 'Семейство ОС',
|
||||
'Class:OSPatch/Attribute:osfamily_id+' => '',
|
||||
'Class:OSPatch/Attribute:osversion_name' => 'Версия ОС',
|
||||
'Class:OSPatch/Attribute:osversion_name+' => '',
|
||||
@@ -1010,11 +1010,11 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:OSLicence' => 'Лицензия ОС',
|
||||
'Class:OSLicence+' => 'Лицензия ОС',
|
||||
'Class:OSLicence/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:OSLicence/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:OSLicence/Attribute:osversion_id' => 'Версия ОС',
|
||||
'Class:OSLicence/Attribute:osversion_id+' => '',
|
||||
'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~',
|
||||
'Class:OSLicence/Attribute:osfamily_id+' => '~~',
|
||||
'Class:OSLicence/Attribute:osfamily_id' => 'Семейство ОС',
|
||||
'Class:OSLicence/Attribute:osfamily_id+' => '',
|
||||
'Class:OSLicence/Attribute:osversion_name' => 'Версия ОС',
|
||||
'Class:OSLicence/Attribute:osversion_name+' => '',
|
||||
'Class:OSLicence/Attribute:virtualmachines_list' => 'Виртуальные машины',
|
||||
@@ -1030,7 +1030,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:SoftwareLicence' => 'Лицензия ПО',
|
||||
'Class:SoftwareLicence+' => 'Лицензия ПО',
|
||||
'Class:SoftwareLicence/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:SoftwareLicence/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:SoftwareLicence/Attribute:software_id' => 'ПО',
|
||||
'Class:SoftwareLicence/Attribute:software_id+' => '',
|
||||
'Class:SoftwareLicence/Attribute:software_name' => 'ПО',
|
||||
@@ -1046,7 +1046,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkDocumentToLicence' => 'Связь Документ/Лицензия',
|
||||
'Class:lnkDocumentToLicence+' => '',
|
||||
'Class:lnkDocumentToLicence/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkDocumentToLicence/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToLicence/Attribute:licence_id' => 'Лицензия',
|
||||
'Class:lnkDocumentToLicence/Attribute:licence_id+' => '',
|
||||
'Class:lnkDocumentToLicence/Attribute:licence_name' => 'Лицензия',
|
||||
@@ -1068,8 +1068,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:OSVersion/Attribute:osfamily_id+' => '',
|
||||
'Class:OSVersion/Attribute:osfamily_name' => 'Семейство ОС',
|
||||
'Class:OSVersion/Attribute:osfamily_name+' => '',
|
||||
'Class:OSVersion/UniquenessRule:name_osfamily+' => 'Name must be unique in the OS family~~',
|
||||
'Class:OSVersion/UniquenessRule:name_osfamily' => 'this OS version already exists within the OS family~~',
|
||||
'Class:OSVersion/UniquenessRule:name_osfamily+' => 'Название должно быть уникальным в рамках семейства ОС',
|
||||
'Class:OSVersion/UniquenessRule:name_osfamily' => 'такая версия ОС уже существует в этом семействе ОС',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -1079,8 +1079,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:OSFamily' => 'Семейство ОС',
|
||||
'Class:OSFamily+' => '',
|
||||
'Class:OSFamily/UniquenessRule:name+' => 'Name must be unique~~',
|
||||
'Class:OSFamily/UniquenessRule:name' => 'this OS family already exists~~',
|
||||
'Class:OSFamily/UniquenessRule:name+' => 'Название должно быть уникальным',
|
||||
'Class:OSFamily/UniquenessRule:name' => 'такое семейство ОС уже существует',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -1090,8 +1090,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Brand' => 'Бренд',
|
||||
'Class:Brand+' => '',
|
||||
'Class:Brand/Attribute:logo' => 'Logo~~',
|
||||
'Class:Brand/Attribute:logo+' => '~~',
|
||||
'Class:Brand/Attribute:logo' => 'Логотип',
|
||||
'Class:Brand/Attribute:logo+' => '',
|
||||
'Class:Brand/Attribute:physicaldevices_list' => 'Устройства',
|
||||
'Class:Brand/Attribute:physicaldevices_list+' => 'Все устройства этого бренда',
|
||||
'Class:Brand/UniquenessRule:name+' => 'Название должно быть уникальным',
|
||||
@@ -1105,13 +1105,13 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Model' => 'Модель',
|
||||
'Class:Model+' => '',
|
||||
'Class:Model/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:Model/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:Model/Attribute:brand_id' => 'Бренд',
|
||||
'Class:Model/Attribute:brand_id+' => '',
|
||||
'Class:Model/Attribute:brand_name' => 'Бренд',
|
||||
'Class:Model/Attribute:brand_name+' => '',
|
||||
'Class:Model/Attribute:picture' => 'Picture~~',
|
||||
'Class:Model/Attribute:picture+' => '~~',
|
||||
'Class:Model/Attribute:picture' => 'Изображение',
|
||||
'Class:Model/Attribute:picture+' => '',
|
||||
'Class:Model/Attribute:type' => 'Тип устройства',
|
||||
'Class:Model/Attribute:type+' => '',
|
||||
'Class:Model/Attribute:type/Value:PowerSource' => 'Источник электропитания',
|
||||
@@ -1163,8 +1163,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:NetworkDeviceType' => 'Тип сетевого устройства',
|
||||
'Class:NetworkDeviceType+' => '',
|
||||
'Class:NetworkDeviceType/Attribute:logo' => 'Logo~~',
|
||||
'Class:NetworkDeviceType/Attribute:logo+' => 'Used as icon for all Network Device of this type, when displayed in console (details, summary card and impact analysis graphs)~~',
|
||||
'Class:NetworkDeviceType/Attribute:logo' => 'Логотип',
|
||||
'Class:NetworkDeviceType/Attribute:logo+' => 'Используется как иконка для всех сетевых устройств этого типа в консоли (детали, карточка сводки и графы анализа влияния)',
|
||||
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list' => 'Устройства',
|
||||
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list+' => 'Все сетевые устройства этого типа',
|
||||
]);
|
||||
@@ -1180,8 +1180,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:IOSVersion/Attribute:brand_id+' => '',
|
||||
'Class:IOSVersion/Attribute:brand_name' => 'Бренд',
|
||||
'Class:IOSVersion/Attribute:brand_name+' => '',
|
||||
'Class:IOSVersion/UniquenessRule:name_brand+' => 'Name must be unique in the brand~~',
|
||||
'Class:IOSVersion/UniquenessRule:name_brand' => 'this IOS version already exists for this brand~~',
|
||||
'Class:IOSVersion/UniquenessRule:name_brand+' => 'Название должно быть уникальным в рамках бренда',
|
||||
'Class:IOSVersion/UniquenessRule:name_brand' => 'такая версия IOS уже существует для этого бренда',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -1191,7 +1191,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkDocumentToPatch' => 'Связь Документ/Патч',
|
||||
'Class:lnkDocumentToPatch+' => '',
|
||||
'Class:lnkDocumentToPatch/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkDocumentToPatch/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToPatch/Attribute:patch_id' => 'Патч',
|
||||
'Class:lnkDocumentToPatch/Attribute:patch_id+' => '',
|
||||
'Class:lnkDocumentToPatch/Attribute:patch_name' => 'Патч',
|
||||
@@ -1209,7 +1209,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch' => 'Связь Экземпляр ПО/Патч ПО',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch+' => '',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Name' => '%1$s / %2$s',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_id' => 'Патч ПО',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_id+' => '',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_name' => 'Патч ПО',
|
||||
@@ -1227,7 +1227,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkFunctionalCIToOSPatch' => 'Связь Функциональная КЕ/Патч ОС',
|
||||
'Class:lnkFunctionalCIToOSPatch+' => '',
|
||||
'Class:lnkFunctionalCIToOSPatch/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkFunctionalCIToOSPatch/Name' => '%1$s / %2$s',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_id' => 'Патч ОС',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_id+' => '',
|
||||
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_name' => 'Патч ОС',
|
||||
@@ -1245,7 +1245,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkDocumentToSoftware' => 'Связь Документ/ПО',
|
||||
'Class:lnkDocumentToSoftware+' => '',
|
||||
'Class:lnkDocumentToSoftware/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkDocumentToSoftware/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToSoftware/Attribute:software_id' => 'ПО',
|
||||
'Class:lnkDocumentToSoftware/Attribute:software_id+' => '',
|
||||
'Class:lnkDocumentToSoftware/Attribute:software_name' => 'ПО',
|
||||
@@ -1263,8 +1263,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Subnet' => 'Подсеть',
|
||||
'Class:Subnet+' => '',
|
||||
'Class:Subnet/Name' => '%1$s/%2$s~~',
|
||||
'Class:Subnet/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:Subnet/Name' => '%1$s/%2$s',
|
||||
'Class:Subnet/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:Subnet/Attribute:description' => 'Описание',
|
||||
'Class:Subnet/Attribute:description+' => '',
|
||||
'Class:Subnet/Attribute:subnet_name' => 'Имя подсети',
|
||||
@@ -1309,7 +1309,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkSubnetToVLAN' => 'Связь Подсеть/VLAN',
|
||||
'Class:lnkSubnetToVLAN+' => '',
|
||||
'Class:lnkSubnetToVLAN/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkSubnetToVLAN/Name' => '%1$s / %2$s',
|
||||
'Class:lnkSubnetToVLAN/Attribute:subnet_id' => 'Подсеть',
|
||||
'Class:lnkSubnetToVLAN/Attribute:subnet_id+' => '',
|
||||
'Class:lnkSubnetToVLAN/Attribute:subnet_ip' => 'IP-адрес подсети',
|
||||
@@ -1363,7 +1363,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:PhysicalInterface' => 'Физический интерфейс',
|
||||
'Class:PhysicalInterface+' => '',
|
||||
'Class:PhysicalInterface/Name' => '%2$s %1$s~~',
|
||||
'Class:PhysicalInterface/Name' => '%2$s %1$s',
|
||||
'Class:PhysicalInterface/Attribute:connectableci_id' => 'Устройства',
|
||||
'Class:PhysicalInterface/Attribute:connectableci_id+' => '',
|
||||
'Class:PhysicalInterface/Attribute:connectableci_name' => 'Устройства',
|
||||
@@ -1379,7 +1379,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkPhysicalInterfaceToVLAN' => 'Связь Физический интерфейс/VLAN',
|
||||
'Class:lnkPhysicalInterfaceToVLAN+' => '',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Name' => '%1$s %2$s / %3$s~~',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Name' => '%1$s %2$s / %3$s',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_id' => 'Физический интерфейс',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_id+' => '',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_name' => 'Физический интерфейс',
|
||||
@@ -1433,7 +1433,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkConnectableCIToNetworkDevice' => 'Связь Подключаемая КЕ/Сетевое устройство',
|
||||
'Class:lnkConnectableCIToNetworkDevice+' => '',
|
||||
'Class:lnkConnectableCIToNetworkDevice/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkConnectableCIToNetworkDevice/Name' => '%1$s / %2$s',
|
||||
'Class:lnkConnectableCIToNetworkDevice/Attribute:networkdevice_id' => 'Сетевое устройство',
|
||||
'Class:lnkConnectableCIToNetworkDevice/Attribute:networkdevice_id+' => '',
|
||||
'Class:lnkConnectableCIToNetworkDevice/Attribute:networkdevice_name' => 'Сетевое устройство',
|
||||
@@ -1461,7 +1461,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkApplicationSolutionToFunctionalCI' => 'Связь Прикладное решение/Функциональная КЕ',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI+' => '',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_id' => 'Прикладное решение',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_id+' => '',
|
||||
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_name' => 'Прикладное решение',
|
||||
@@ -1479,7 +1479,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkApplicationSolutionToBusinessProcess' => 'Связь Прикладное решение/Бизнес-процесс',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess+' => '',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess/Name' => '%1$s / %2$s',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess/Attribute:businessprocess_id' => 'Бизнес-процесс',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess/Attribute:businessprocess_id+' => '',
|
||||
'Class:lnkApplicationSolutionToBusinessProcess/Attribute:businessprocess_name' => 'Бизнес-процесс',
|
||||
@@ -1497,7 +1497,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Group' => 'Группа',
|
||||
'Class:Group+' => '',
|
||||
'Class:Group/ComplementaryName' => '%1$s - %2$s~~',
|
||||
'Class:Group/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:Group/Attribute:name' => 'Название',
|
||||
'Class:Group/Attribute:name+' => '',
|
||||
'Class:Group/Attribute:status' => 'Статус',
|
||||
@@ -1533,7 +1533,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkGroupToCI' => 'Связь Группа/КЕ',
|
||||
'Class:lnkGroupToCI+' => '',
|
||||
'Class:lnkGroupToCI/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkGroupToCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkGroupToCI/Attribute:group_id' => 'Группа',
|
||||
'Class:lnkGroupToCI/Attribute:group_id+' => '',
|
||||
'Class:lnkGroupToCI/Attribute:group_name' => 'Группа',
|
||||
@@ -1549,20 +1549,20 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
// Add translation for Fieldsets
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'ConfigMgmt:baseinfo' => 'General~~',
|
||||
'ConfigMgmt:moreinfo' => 'CI specifics~~',
|
||||
'Storage:moreinfo' => 'Storage specifics~~',
|
||||
'ConfigMgmt:otherinfo' => 'Description~~',
|
||||
'ConfigMgmt:dates' => 'Dates~~',
|
||||
'Software:moreinfo' => 'Software specifics~~',
|
||||
'Phone:moreinfo' => 'Phone specifics~~',
|
||||
'ConfigMgmt:baseinfo' => 'Общее',
|
||||
'ConfigMgmt:moreinfo' => 'Особенности КЕ',
|
||||
'Storage:moreinfo' => 'Особенности системы хранения',
|
||||
'ConfigMgmt:otherinfo' => 'Описание',
|
||||
'ConfigMgmt:dates' => 'Даты',
|
||||
'Software:moreinfo' => 'Особенности ПО',
|
||||
'Phone:moreinfo' => 'Особенности телефона',
|
||||
'Server:baseinfo' => 'Основное',
|
||||
'Server:Date' => 'Даты',
|
||||
'Server:moreinfo' => 'Спецификация',
|
||||
'Server:otherinfo' => 'Дополнительно',
|
||||
'Server:power' => 'Электропитание',
|
||||
'Class:Subnet/Tab:IPUsage' => 'Использование IP-адресов',
|
||||
'Class:Subnet/Tab:IPUsage+' => 'Which IP within this Subnet is used or not~~',
|
||||
'Class:Subnet/Tab:IPUsage+' => 'Какие IP в этой подсети используются, а какие нет',
|
||||
'Class:Subnet/Tab:IPUsage-explain' => 'Интерфейсы с IP-адресом в диапазоне: <em>%1$s</em> - <em>%2$s</em>',
|
||||
'Class:Subnet/Tab:FreeIPs' => 'Свободные IP-адреса',
|
||||
'Class:Subnet/Tab:FreeIPs-count' => 'Свободных IP-адресов: %1$s',
|
||||
@@ -1577,7 +1577,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkDocumentToFunctionalCI' => 'Связь Документ/Функциональная КЕ',
|
||||
'Class:lnkDocumentToFunctionalCI+' => '',
|
||||
'Class:lnkDocumentToFunctionalCI/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkDocumentToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_id' => 'Функциональная КЕ',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_id+' => '',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_name' => 'Функциональная КЕ',
|
||||
@@ -1644,8 +1644,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:PhysicalInterface/Attribute:org_id' => 'Organization~~',
|
||||
'Class:PhysicalInterface/Attribute:org_id+' => '~~',
|
||||
'Class:PhysicalInterface/Attribute:location_id' => 'Location~~',
|
||||
'Class:PhysicalInterface/Attribute:location_id+' => '~~',
|
||||
'Class:PhysicalInterface/Attribute:org_id' => 'Организация',
|
||||
'Class:PhysicalInterface/Attribute:org_id+' => '',
|
||||
'Class:PhysicalInterface/Attribute:location_id' => 'Местоположение',
|
||||
'Class:PhysicalInterface/Attribute:location_id+' => '',
|
||||
]);
|
||||
|
||||
@@ -30,11 +30,11 @@
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Relation:impacts/Description' => '被影响的元素',
|
||||
'Relation:impacts/DownStream' => '影响...',
|
||||
'Relation:impacts/DownStream+' => '被影响的元素',
|
||||
'Relation:impacts/DownStream+' => '受影响的元素',
|
||||
'Relation:impacts/UpStream' => '依赖于...',
|
||||
'Relation:impacts/UpStream+' => '此元素依赖的元素...',
|
||||
'Relation:impacts/UpStream+' => '被影响的元素...',
|
||||
// Legacy entries
|
||||
'Relation:depends on/Description' => '此元素依赖的元素...',
|
||||
'Relation:depends on/Description' => '被影响的元素...',
|
||||
'Relation:depends on/DownStream' => '依赖于...',
|
||||
'Relation:depends on/UpStream' => '影响...',
|
||||
'Relation:impacts/LoadData' => '加载数据',
|
||||
@@ -129,7 +129,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:PhysicalDevice/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:PhysicalDevice/Attribute:serialnumber' => '序列号',
|
||||
'Class:PhysicalDevice/Attribute:serialnumber+' => '',
|
||||
'Class:PhysicalDevice/Attribute:location_id' => '地点',
|
||||
'Class:PhysicalDevice/Attribute:location_id' => '位置',
|
||||
'Class:PhysicalDevice/Attribute:location_id+' => '',
|
||||
'Class:PhysicalDevice/Attribute:location_name' => '名称',
|
||||
'Class:PhysicalDevice/Attribute:location_name+' => '',
|
||||
@@ -183,7 +183,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:TelephonyCI' => '通讯项',
|
||||
'Class:TelephonyCI+' => '',
|
||||
'Class:TelephonyCI+' => '通信设备的抽象类',
|
||||
'Class:TelephonyCI/Attribute:phonenumber' => '电话号码',
|
||||
'Class:TelephonyCI/Attribute:phonenumber+' => '',
|
||||
]);
|
||||
@@ -206,7 +206,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:MobilePhone+' => '终端用户设备.无线电话',
|
||||
'Class:MobilePhone/Attribute:imei' => 'IMEI',
|
||||
'Class:MobilePhone/Attribute:imei+' => '',
|
||||
'Class:MobilePhone/Attribute:hw_pin' => '硬件 PIN 码',
|
||||
'Class:MobilePhone/Attribute:hw_pin' => '硬件PIN码',
|
||||
'Class:MobilePhone/Attribute:hw_pin+' => '',
|
||||
]);
|
||||
|
||||
@@ -216,7 +216,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:IPPhone' => 'IP 电话',
|
||||
'Class:IPPhone+' => '用于电话的物理设备,连接到网络',
|
||||
'Class:IPPhone+' => '用于联网打电话的物理设备',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -262,13 +262,13 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:DatacenterDevice/Attribute:nb_u+' => '',
|
||||
'Class:DatacenterDevice/Attribute:managementip' => '管理IP',
|
||||
'Class:DatacenterDevice/Attribute:managementip+' => '',
|
||||
'Class:DatacenterDevice/Attribute:powerA_id' => '主电源',
|
||||
'Class:DatacenterDevice/Attribute:powerA_id' => '电源A',
|
||||
'Class:DatacenterDevice/Attribute:powerA_id+' => '',
|
||||
'Class:DatacenterDevice/Attribute:powerA_name' => '主电源名称',
|
||||
'Class:DatacenterDevice/Attribute:powerA_name' => '电源A名称',
|
||||
'Class:DatacenterDevice/Attribute:powerA_name+' => '',
|
||||
'Class:DatacenterDevice/Attribute:powerB_id' => '备电源',
|
||||
'Class:DatacenterDevice/Attribute:powerB_id' => '电源B',
|
||||
'Class:DatacenterDevice/Attribute:powerB_id+' => '',
|
||||
'Class:DatacenterDevice/Attribute:powerB_name' => '备电源名称',
|
||||
'Class:DatacenterDevice/Attribute:powerB_name' => '电源B名称',
|
||||
'Class:DatacenterDevice/Attribute:powerB_name+' => '',
|
||||
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list' => '光口',
|
||||
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list+' => '此设备的所有光纤接口',
|
||||
@@ -295,12 +295,12 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:NetworkDevice/Attribute:networkdevicetype_name+' => '',
|
||||
'Class:NetworkDevice/Attribute:connectablecis_list' => '设备',
|
||||
'Class:NetworkDevice/Attribute:connectablecis_list+' => '连接到此网络设备的所有设备',
|
||||
'Class:NetworkDevice/Attribute:iosversion_id' => 'IOS版本',
|
||||
'Class:NetworkDevice/Attribute:iosversion_id' => 'IOS 版本',
|
||||
'Class:NetworkDevice/Attribute:iosversion_id+' => '',
|
||||
'Class:NetworkDevice/Attribute:iosversion_name' => 'IOS版本名称',
|
||||
'Class:NetworkDevice/Attribute:iosversion_name' => 'IOS 版本名称',
|
||||
'Class:NetworkDevice/Attribute:iosversion_name+' => '',
|
||||
'Class:NetworkDevice/Attribute:ios_end_of_support' => 'IOS过保时间',
|
||||
'Class:NetworkDevice/Attribute:ios_end_of_support+' => '厂家不再为该IOS版本提供修复的时间.',
|
||||
'Class:NetworkDevice/Attribute:ios_end_of_support' => 'IOS 过保日期',
|
||||
'Class:NetworkDevice/Attribute:ios_end_of_support+' => '厂商不再为该IOS版本提供修复的时间.',
|
||||
'Class:NetworkDevice/Attribute:ram' => '内存',
|
||||
'Class:NetworkDevice/Attribute:ram+' => '',
|
||||
]);
|
||||
@@ -321,8 +321,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Server/Attribute:osversion_id+' => '',
|
||||
'Class:Server/Attribute:osversion_name' => 'OS 版本名称',
|
||||
'Class:Server/Attribute:osversion_name+' => '',
|
||||
'Class:Server/Attribute:os_end_of_support' => 'OS 过保时间',
|
||||
'Class:Server/Attribute:os_end_of_support+' => '厂商不再为该操作系统版本提供补丁的时间.',
|
||||
'Class:Server/Attribute:os_end_of_support' => 'OS 过保日期',
|
||||
'Class:Server/Attribute:os_end_of_support+' => '厂商不再为该操作系统版本提供补丁的日期.',
|
||||
'Class:Server/Attribute:oslicence_id' => 'OS 许可证',
|
||||
'Class:Server/Attribute:oslicence_id+' => '',
|
||||
'Class:Server/Attribute:oslicence_name' => 'OS 许可证名称',
|
||||
@@ -332,7 +332,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Server/Attribute:ram' => '内存',
|
||||
'Class:Server/Attribute:ram+' => '',
|
||||
'Class:Server/Attribute:logicalvolumes_list' => '逻辑卷',
|
||||
'Class:Server/Attribute:logicalvolumes_list+' => '连接到此服务器的所有逻辑卷',
|
||||
'Class:Server/Attribute:logicalvolumes_list+' => '连接到此物理机的所有逻辑卷',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -341,7 +341,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:StorageSystem' => '存储系统',
|
||||
'Class:StorageSystem+' => '存储系统可以使用光纤或以太网连接. 存储系统以逻辑卷为单位进行管理.',
|
||||
'Class:StorageSystem+' => '存储系统通常使用光纤或以太网, 以逻辑卷为单位进行管理.',
|
||||
'Class:StorageSystem/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:StorageSystem/Attribute:logicalvolume_list' => '逻辑卷',
|
||||
'Class:StorageSystem/Attribute:logicalvolume_list+' => '此存储系统包含的所有逻辑卷',
|
||||
@@ -399,8 +399,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:PC/Attribute:osversion_id+' => '',
|
||||
'Class:PC/Attribute:osversion_name' => 'OS 版本名称',
|
||||
'Class:PC/Attribute:osversion_name+' => '',
|
||||
'Class:PC/Attribute:os_end_of_support' => 'OS 过保时间',
|
||||
'Class:PC/Attribute:os_end_of_support+' => '厂商不再为该操作系统版本提供补丁的时间.',
|
||||
'Class:PC/Attribute:os_end_of_support' => 'OS 过保日期',
|
||||
'Class:PC/Attribute:os_end_of_support+' => '厂商不再为该操作系统版本提供补丁的日期.',
|
||||
'Class:PC/Attribute:cpu' => 'CPU',
|
||||
'Class:PC/Attribute:cpu+' => '',
|
||||
'Class:PC/Attribute:ram' => '内存',
|
||||
@@ -439,7 +439,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:PowerSource' => '电源',
|
||||
'Class:PowerSource+' => '物理电源连接. 用于记录数据中心的任何类型的电源 (主电源入口, 断路器…) ,但不是 PDU.',
|
||||
'Class:PowerSource+' => '物理电源连接. 用于描述数据中心的任何类型的电源 (主电源入口, 断路器…) ,但不是 PDU.',
|
||||
'Class:PowerSource/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:PowerSource/Attribute:pdus_list' => 'PDU',
|
||||
'Class:PowerSource/Attribute:pdus_list+' => '使用此电源的所有 PDU',
|
||||
@@ -451,7 +451,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:PDU' => 'PDU',
|
||||
'Class:PDU+' => '电力供应连接. PDU (Power Distribution Unit) 是一种配备了多个输出的电力分配设备,特别是为数据中心内的服务器机架和网络设备机架供电.',
|
||||
'Class:PDU+' => '供电线路. PDU (Power Distribution Unit) 是一种配备了多个输出的电力分配设备,特别是为数据中心内的服务器机架和网络设备机架供电.',
|
||||
'Class:PDU/ComplementaryName' => '%1$s - %2$s - %3$s - %4$s',
|
||||
'Class:PDU/Attribute:rack_id' => '机架',
|
||||
'Class:PDU/Attribute:rack_id+' => '',
|
||||
@@ -498,7 +498,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ApplicationSolution' => '应用方案',
|
||||
'Class:ApplicationSolution+' => '应用方案描述了复杂应用是如何由多个基本组件之间组装(或依赖)的. 应用方案的主要信息是其关系列表.',
|
||||
'Class:ApplicationSolution+' => '应用方案描述了复杂应用是如何由多个基本组件组装的. 应用方案的主要信息是组件之间的依赖关系列表.',
|
||||
'Class:ApplicationSolution/Attribute:functionalcis_list' => '配置项',
|
||||
'Class:ApplicationSolution/Attribute:functionalcis_list+' => '此应用方案包含的所有配置项',
|
||||
'Class:ApplicationSolution/Attribute:businessprocess_list' => '业务流程',
|
||||
@@ -523,7 +523,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:BusinessProcess' => '业务流程',
|
||||
'Class:BusinessProcess+' => '业务流程用于描述运营过程中的高级流程或重要应用. 它与应用方案非常类似, 但是为了描述更高层次的应用或整个组织的流程.',
|
||||
'Class:BusinessProcess+' => '业务流程描述了运营过程中的高级流程或重要应用. 它与应用方案非常类似, 但是用于描述更高层次的应用或整个组织的流程.',
|
||||
'Class:BusinessProcess/Attribute:applicationsolutions_list' => '应用方案',
|
||||
'Class:BusinessProcess/Attribute:applicationsolutions_list+' => '影响此业务流程的所有应用方案',
|
||||
'Class:BusinessProcess/Attribute:logo' => 'Logo',
|
||||
@@ -551,7 +551,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Software/Attribute:version' => '版本',
|
||||
'Class:Software/Attribute:version+' => '',
|
||||
'Class:Software/Attribute:end_of_support' => '过保日期',
|
||||
'Class:Software/Attribute:end_of_support+' => '厂家提供的最后一个支持日期,此后不再提供此软件版本的补丁.',
|
||||
'Class:Software/Attribute:end_of_support+' => '厂商提供的最后支持日期,此后不再提供此软件版本的补丁.',
|
||||
'Class:Software/Attribute:documents_list' => '文档',
|
||||
'Class:Software/Attribute:documents_list+' => '此软件相关的所有文档',
|
||||
'Class:Software/Attribute:logo' => 'Logo',
|
||||
@@ -591,7 +591,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:SoftwareInstance/Attribute:software_id+' => '',
|
||||
'Class:SoftwareInstance/Attribute:software_name' => '软件名称',
|
||||
'Class:SoftwareInstance/Attribute:software_name+' => '',
|
||||
'Class:SoftwareInstance/Attribute:software_end_of_support' => '软件过保时间',
|
||||
'Class:SoftwareInstance/Attribute:software_end_of_support' => '软件过保日期',
|
||||
'Class:SoftwareInstance/Attribute:software_end_of_support+' => '厂商为此软件版本提供补丁的最后日期.',
|
||||
'Class:SoftwareInstance/Attribute:softwarelicence_id' => '软件许可证',
|
||||
'Class:SoftwareInstance/Attribute:softwarelicence_id+' => '',
|
||||
@@ -625,8 +625,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:DBServer' => 'DB 服务器',
|
||||
'Class:DBServer+' => '提供数据库服务的软件实例 (例如: MySQL 8.0, Oracle, SQL Server, DB2…), 通常安装在特定系统(PC, 物理机或虚拟机)上.',
|
||||
'Class:DBServer/Attribute:dbschema_list' => '数据库架构',
|
||||
'Class:DBServer/Attribute:dbschema_list+' => '此数据库服务器上的所有数据库架构',
|
||||
'Class:DBServer/Attribute:dbschema_list' => '数据库模式',
|
||||
'Class:DBServer/Attribute:dbschema_list+' => '此数据库服务器上的所有数据库模式',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -679,7 +679,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:DatabaseSchema' => '数据库架构',
|
||||
'Class:DatabaseSchema' => '数据库模式',
|
||||
'Class:DatabaseSchema+' => 'DB 服务器上运行的逻辑数据库实例.',
|
||||
'Class:DatabaseSchema/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:DatabaseSchema/Attribute:dbserver_id' => 'DB 服务器',
|
||||
@@ -712,7 +712,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:VirtualDevice' => '虚拟设备',
|
||||
'Class:VirtualDevice+' => '用于服务器虚拟化的抽象类 (宿主机和虚拟机).',
|
||||
'Class:VirtualDevice+' => '用于服务器虚拟化的抽象类 (虚拟化主机和虚拟机).',
|
||||
'Class:VirtualDevice/Attribute:status' => '状态',
|
||||
'Class:VirtualDevice/Attribute:status+' => '',
|
||||
'Class:VirtualDevice/Attribute:status/Value:implementation' => '生效',
|
||||
@@ -732,10 +732,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:VirtualHost' => '宿主机',
|
||||
'Class:VirtualHost' => '虚拟化主机',
|
||||
'Class:VirtualHost+' => '对虚拟设备(虚拟机监视器, 集群,...)的抽象, 用于托管虚拟机.',
|
||||
'Class:VirtualHost/Attribute:virtualmachine_list' => '虚拟机',
|
||||
'Class:VirtualHost/Attribute:virtualmachine_list+' => '此宿主机托管的所有虚拟机',
|
||||
'Class:VirtualHost/Attribute:virtualmachine_list+' => '此虚拟化主机托管的所有虚拟机',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -778,7 +778,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:VirtualMachine' => '虚拟机',
|
||||
'Class:VirtualMachine+' => '与物理机类似的虚拟设备,它既可以托管在 Hypervisor 上,也可以托管在集群上.',
|
||||
'Class:VirtualMachine/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_id' => '宿主机',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_id' => '虚拟化主机',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_id+' => '',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_name' => '名称',
|
||||
'Class:VirtualMachine/Attribute:virtualhost_name+' => '',
|
||||
@@ -1061,7 +1061,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToLicence' => '链接 文档/许可证',
|
||||
'Class:lnkDocumentToLicence+' => 'Link used when a Document is applicable to a License.~~',
|
||||
'Class:lnkDocumentToLicence+' => '此链接用于当某个文档适用于某个许可证时.',
|
||||
'Class:lnkDocumentToLicence/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToLicence/Attribute:licence_id' => '许可证',
|
||||
'Class:lnkDocumentToLicence/Attribute:licence_id+' => '',
|
||||
@@ -1085,9 +1085,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:OSVersion/Attribute:osfamily_name' => '名称',
|
||||
'Class:OSVersion/Attribute:osfamily_name+' => '',
|
||||
'Class:OSVersion/Attribute:end_of_support' => '过保日期',
|
||||
'Class:OSVersion/Attribute:end_of_support+' => 'The date after which the editor ceases to provide patches for this OS version.~~',
|
||||
'Class:OSVersion/Attribute:end_of_support+' => '厂商停止为此 OS 版本提供补丁的截止日期.',
|
||||
'Class:OSVersion/Attribute:ospatches_list' => 'OS 补丁',
|
||||
'Class:OSVersion/Attribute:ospatches_list+' => 'All the OS patches for this OS version~~',
|
||||
'Class:OSVersion/Attribute:ospatches_list+' => '此 OS 版本的所有补丁',
|
||||
'Class:OSVersion/UniquenessRule:name_osfamily+' => 'OS 家族的名称必须唯一',
|
||||
'Class:OSVersion/UniquenessRule:name_osfamily' => '此 OS 版本已在 OS 家族中存在',
|
||||
]);
|
||||
@@ -1222,7 +1222,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToPatch' => '链接 文档/补丁',
|
||||
'Class:lnkDocumentToPatch+' => 'Link used when a Document is applicable to a Patch.~~',
|
||||
'Class:lnkDocumentToPatch+' => '此链接用于当某个文档适用于某个补丁时.',
|
||||
'Class:lnkDocumentToPatch/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToPatch/Attribute:patch_id' => '补丁',
|
||||
'Class:lnkDocumentToPatch/Attribute:patch_id+' => '',
|
||||
@@ -1240,7 +1240,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch' => '链接 软件实例/软件补丁',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch+' => 'This link indicates that a software patch has been applied to a software instance.~~',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch+' => '此链接表示某个软件补丁已应用于软件实例.',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Name' => '%1$s / %2$s',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_id' => '软件补丁',
|
||||
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_id+' => '',
|
||||
@@ -1276,7 +1276,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToSoftware' => '链接 文档/软件',
|
||||
'Class:lnkDocumentToSoftware+' => 'Link used when a Document is applicable to Software.~~',
|
||||
'Class:lnkDocumentToSoftware+' => '此链接用于当某个文档适用于某个软件时.',
|
||||
'Class:lnkDocumentToSoftware/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToSoftware/Attribute:software_id' => '软件',
|
||||
'Class:lnkDocumentToSoftware/Attribute:software_id+' => '',
|
||||
@@ -1415,7 +1415,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkPhysicalInterfaceToVLAN' => '链接 物理网卡/VLAN',
|
||||
'Class:lnkPhysicalInterfaceToVLAN+' => 'This link indicates when a network interface is part of a VLAN (虚拟局域网).',
|
||||
'Class:lnkPhysicalInterfaceToVLAN+' => '此链接表示物理网卡是否属于某个VLAN (虚拟局域网).',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Name' => '%1$s %2$s / %3$s',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_id' => '物理网卡',
|
||||
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_id+' => '',
|
||||
@@ -1450,7 +1450,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:FiberChannelInterface' => '光口',
|
||||
'Class:FiberChannelInterface+' => '主要用于存储系统的一种高速网络接口.',
|
||||
'Class:FiberChannelInterface+' => '一种主要用于存储系统的高速网络接口.',
|
||||
'Class:FiberChannelInterface/Attribute:speed' => '速率',
|
||||
'Class:FiberChannelInterface/Attribute:speed+' => '',
|
||||
'Class:FiberChannelInterface/Attribute:topology' => '拓扑',
|
||||
@@ -1469,7 +1469,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkConnectableCIToNetworkDevice' => '链接 可连接项/网络设备',
|
||||
'Class:lnkConnectableCIToNetworkDevice+' => 'Defines on which network equipment a device is connected.~~',
|
||||
'Class:lnkConnectableCIToNetworkDevice+' => '定义设备连接到哪些网络设备.',
|
||||
'Class:lnkConnectableCIToNetworkDevice/Name' => '%1$s / %2$s',
|
||||
'Class:lnkConnectableCIToNetworkDevice/Attribute:networkdevice_id' => '网络设备',
|
||||
'Class:lnkConnectableCIToNetworkDevice/Attribute:networkdevice_id+' => '',
|
||||
@@ -1569,7 +1569,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkGroupToCI' => '链接 配置组/配置项',
|
||||
'Class:lnkGroupToCI+' => 'This link indicates when a Functional CI is part of a Group.~~',
|
||||
'Class:lnkGroupToCI+' => '此链接表示某个功能配置项属于某个配置组.',
|
||||
'Class:lnkGroupToCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkGroupToCI/Attribute:group_id' => '组',
|
||||
'Class:lnkGroupToCI/Attribute:group_id+' => '',
|
||||
@@ -1589,7 +1589,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:lnkDocumentToFunctionalCI' => '链接 文档/功能配置项',
|
||||
'Class:lnkDocumentToFunctionalCI+' => 'Link used when a Document is applicable to a Functional CI.~~',
|
||||
'Class:lnkDocumentToFunctionalCI+' => '此链接用于当某个文档适用于某个功能配置项时.',
|
||||
'Class:lnkDocumentToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_id' => '功能配置项',
|
||||
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_id+' => '',
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
*
|
||||
*/
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Menu:ConfigFileEditor' => 'Plain text editor~~',
|
||||
'Menu:ConfigFileEditor' => 'Текстовый редактор',
|
||||
'itop-config/Operation:Edit/Title' => 'Редактор файла конфигурации',
|
||||
'config-edit-intro' => 'Будьте очень осторожны при редактировании файла конфигурации. В частности, отредактированы могут быть только глобальная конфигурация и настройки модулей.',
|
||||
'Menu:ConfigEditor' => 'Основные настройки',
|
||||
@@ -26,8 +26,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'config-parse-error' => 'Строка %2$d: %1$s.<br/>Файл не был обновлен.',
|
||||
'config-current-line' => 'Редактируемая строка: %1$s',
|
||||
'config-saved-warning-db-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.~~',
|
||||
'config-error-transaction' => 'Ошибка: недопустимый ID транзакции. Конфигурация <b>НЕ</b> была изменена.',
|
||||
'config-error-file-changed' => 'Ошибка: файл конфигурации изменился с момента открытия, сохранение невозможно. Обновите страницу и примените изменения заново.',
|
||||
'config-not-allowed-in-demo' => 'Извините, '.ITOP_APPLICATION_SHORT.' работает в <b>демонстрационном режиме</b>: файл конфигурации нельзя редактировать.',
|
||||
'config-interactive-not-allowed' => ITOP_APPLICATION_SHORT.': интерактивное редактирование конфигурации отключено. См. <code>\'config_editor\' => \'disabled\'</code> в файле конфигурации.',
|
||||
]);
|
||||
|
||||
@@ -0,0 +1,177 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2013 XXXXX
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
/**
|
||||
* @author Vladimir Kunin <v.b.kunin@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
//
|
||||
// Fieldsets for Container classes
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Container:baseinfo' => 'Общее',
|
||||
'Container:moreinfo' => 'Особенности контейнеризации',
|
||||
'Container:otherinfo' => 'Даты и описание',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Image
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:ContainerImage/Name' => '%1$s %2$s',
|
||||
'Class:ContainerImage/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:ContainerImage' => 'Образ контейнера',
|
||||
'Class:ContainerImage+' => 'Образ ПО, готового к запуску в контейнере',
|
||||
'Class:ContainerImage/Attribute:name' => 'Название',
|
||||
'Class:ContainerImage/Attribute:name+' => '',
|
||||
'Class:ContainerImage/Attribute:version' => 'Версия',
|
||||
'Class:ContainerImage/Attribute:version+' => '',
|
||||
'Class:ContainerImage/Attribute:description' => 'Описание',
|
||||
'Class:ContainerImage/Attribute:description+' => '',
|
||||
'Class:ContainerImage/Attribute:publisher' => 'Издатель',
|
||||
'Class:ContainerImage/Attribute:publisher+' => 'Издатель образа, например php, nginx и т. д.',
|
||||
'Class:ContainerImage/Attribute:image' => 'Образ',
|
||||
'Class:ContainerImage/Attribute:image+' => 'Подробная информация для получения образа на соответствующей платформе хостинга',
|
||||
'Class:ContainerImage/Attribute:type_id' => 'Тип',
|
||||
'Class:ContainerImage/Attribute:type_id+' => 'Тип образа',
|
||||
'Class:ContainerImage/Attribute:software_id' => 'ПО',
|
||||
'Class:ContainerImage/Attribute:software_id+' => '',
|
||||
'Class:ContainerImage/Attribute:containerapplications_list' => 'Контейнерные приложения',
|
||||
'Class:ContainerImage/Attribute:containerapplications_list+' => 'Приложения, для которых используется этот образ',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Application
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:ContainerApplication/Name' => '%1$s',
|
||||
'Class:ContainerApplication/ComplementaryName' => '%1$s',
|
||||
'Class:ContainerApplication' => 'Контейнерное приложение',
|
||||
'Class:ContainerApplication+' => 'Приложение, развёрнутое на платформе контейнеризации',
|
||||
'Class:ContainerApplication/Attribute:descriptor' => 'Файл развёртывания',
|
||||
'Class:ContainerApplication/Attribute:descriptor+' => 'Файл, описывающий развёртывание приложения на платформе контейнеризации (например, Docker Compose, Helm Chart и т. д.)',
|
||||
'Class:ContainerApplication/Attribute:containervirtualhost_id' => 'Хост контейнеров',
|
||||
'Class:ContainerApplication/Attribute:containervirtualhost_id+' => 'Платформа контейнеризации, на которой выполняется приложение',
|
||||
'Class:ContainerApplication/Attribute:logo' => 'Логотип',
|
||||
'Class:ContainerApplication/Attribute:logo+' => 'Используется как иконка объекта на графах анализа влияния',
|
||||
'Class:ContainerApplication/Attribute:containertype_id' => 'Тип контейнеризации',
|
||||
'Class:ContainerApplication/Attribute:containertype_id+' => 'Технология, используемая для контейнеризации',
|
||||
'Class:ContainerApplication/Attribute:containerimages_list' => 'Образы контейнеров',
|
||||
'Class:ContainerApplication/Attribute:containerimages_list+' => 'Образы ПО, используемые для сборки контейнерного приложения',
|
||||
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: lnkContainerApplicationToImage
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkContainerApplicationToImage' => 'Связь Контейнерное приложение / Образ',
|
||||
'Class:lnkContainerApplicationToImage+' => '',
|
||||
'Class:lnkContainerApplicationToImage/Name' => '%1$s / %2$s',
|
||||
'Class:lnkContainerApplicationToImage/Name+' => '',
|
||||
'Class:lnkContainerApplicationToImage/Attribute:containerapplication_id' => 'Контейнерное приложение',
|
||||
'Class:lnkContainerApplicationToImage/Attribute:containerapplication_id+' => 'Приложение, использующее этот образ',
|
||||
'Class:lnkContainerApplicationToImage/Attribute:containerimage_id' => 'Образ контейнера',
|
||||
'Class:lnkContainerApplicationToImage/Attribute:containerimage_id+' => 'Образ ПО, используемый для сборки контейнерного приложения',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Virtual Host
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:ContainerVirtualHost/Name' => '%1$s',
|
||||
'Class:ContainerVirtualHost/ComplementaryName' => '',
|
||||
'Class:ContainerVirtualHost' => 'Платформа контейнеризации',
|
||||
'Class:ContainerVirtualHost+' => 'Платформа, на которой приложения выполняются в виде контейнеров',
|
||||
'Class:ContainerVirtualHost/Attribute:containertype_id' => 'Тип контейнеризации',
|
||||
'Class:ContainerVirtualHost/Attribute:containertype_id+' => 'Технология, обеспечивающая контейнеризацию',
|
||||
'Class:ContainerVirtualHost/Attribute:status' => 'Статус',
|
||||
'Class:ContainerVirtualHost/Attribute:status+' => 'Статус платформы контейнеризации',
|
||||
'Class:ContainerVirtualHost/Attribute:containerapplications_list' => 'Приложения',
|
||||
'Class:ContainerVirtualHost/Attribute:containerapplications_list+' => 'Приложения, выполняющиеся в этом контейнерном окружении',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Host
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:ContainerHost/Name' => '%1$s',
|
||||
'Class:ContainerHost/ComplementaryName' => '%1$s-%2$s',
|
||||
'Class:ContainerHost' => 'Хост контейнеров',
|
||||
'Class:ContainerHost+' => 'Хост, выделенный под контейнеры. Базовый элемент платформы контейнеризации',
|
||||
'Class:ContainerHost/Attribute:containercluster_id' => 'Кластер контейнеров',
|
||||
'Class:ContainerHost/Attribute:containercluster_id+' => '',
|
||||
'Class:ContainerHost/Attribute:role' => 'Роль',
|
||||
'Class:ContainerHost/Attribute:role+' => 'Роль хоста в кластере: master или worker. Standalone, если хост не входит в кластер.',
|
||||
'Class:ContainerHost/Attribute:system_id' => 'Система',
|
||||
'Class:ContainerHost/Attribute:system_id+' => 'Системой может быть сервер, виртуальная машина, облако и т. д.',
|
||||
'Class:ContainerHost/Attribute:role/Value:master' => 'Мастер',
|
||||
'Class:ContainerHost/Attribute:role/Value:worker' => 'Воркер',
|
||||
'Class:ContainerHost/Attribute:role/Value:standalone' => 'Автономный',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Cluster
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:ContainerCluster/Name' => '%1$s',
|
||||
'Class:ContainerCluster/ComplementaryName' => '',
|
||||
'Class:ContainerCluster' => 'Кластер контейнеров',
|
||||
'Class:ContainerCluster+' => 'Платформа контейнеризации, состоящая из кластера хостов контейнеров',
|
||||
'Class:ContainerCluster/Attribute:redundancy' => 'Конфигурация резервирования',
|
||||
'Class:ContainerCluster/Attribute:redundancy/disabled' => 'Кластер в работе, если все его хосты в работе',
|
||||
'Class:ContainerCluster/Attribute:redundancy/count' => 'Кластер в работе, если по крайней мере %1$s хост(-ов) в работе',
|
||||
'Class:ContainerCluster/Attribute:redundancy/percent' => 'Кластер в работе, если по крайней мере %1$s %% хостов в работе',
|
||||
'Class:ContainerCluster/Attribute:containerhosts_list' => 'Хосты контейнеров',
|
||||
'Class:ContainerCluster/Attribute:containerhosts_list+' => 'Хосты, входящие в этот кластер',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Type
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:ContainerType/Name' => '%1$s',
|
||||
'Class:ContainerType/ComplementaryName' => '',
|
||||
'Class:ContainerType' => 'Тип контейнеризации',
|
||||
'Class:ContainerType+' => 'Технология, обеспечивающая контейнеризацию',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Type
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:ContainerImageType/Name' => '%1$s',
|
||||
'Class:ContainerImageType/ComplementaryName' => '',
|
||||
'Class:ContainerImageType' => 'Тип образа контейнера',
|
||||
'Class:ContainerImageType+' => 'Типология образов контейнеров',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Cloud, Server and Virtual Machine
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Cloud/Attribute:containerhosts_list' => 'Хосты контейнеров',
|
||||
'Class:Cloud/Attribute:containerhosts_list+' => 'Список хостов контейнеров, работающих в этом облаке',
|
||||
'Class:Server/Attribute:containerhosts_list' => 'Хосты контейнеров',
|
||||
'Class:Server/Attribute:containerhosts_list+' => 'Список хостов контейнеров, работающих на этом сервере',
|
||||
'Class:VirtualMachine/Attribute:containerhosts_list' => 'Хосты контейнеров',
|
||||
'Class:VirtualMachine/Attribute:containerhosts_list+' => 'Список хостов контейнеров, работающих на этой виртуальной машине',
|
||||
'Class:Software/Attribute:containerimages_list' => 'Образы контейнеров',
|
||||
'Class:Software/Attribute:containerimages_list+' => 'Список образов контейнеров, использующих это ПО',
|
||||
]);
|
||||
@@ -105,7 +105,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ContainerHost/Name' => '%1$s',
|
||||
'Class:ContainerHost/ComplementaryName' => '%1$s-%2$s',
|
||||
'Class:ContainerHost' => '容器宿主机',
|
||||
'Class:ContainerHost' => '容器化主机',
|
||||
'Class:ContainerHost+' => '托管容器的宿主机. 它是容器平台的基本元素',
|
||||
'Class:ContainerHost/Attribute:containercluster_id' => '容器集群',
|
||||
'Class:ContainerHost/Attribute:containercluster_id+' => '',
|
||||
@@ -126,12 +126,12 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:ContainerCluster/Name' => '%1$s',
|
||||
'Class:ContainerCluster/ComplementaryName' => '',
|
||||
'Class:ContainerCluster' => '容器集群',
|
||||
'Class:ContainerCluster+' => '由一组容器宿主机组成的容器平台',
|
||||
'Class:ContainerCluster+' => '由一组容器化主机组成的容器平台',
|
||||
'Class:ContainerCluster/Attribute:redundancy' => '冗余配置',
|
||||
'Class:ContainerCluster/Attribute:redundancy/disabled' => '当所有主机都在运行时, 集群才是正常的',
|
||||
'Class:ContainerCluster/Attribute:redundancy/count' => '当至少 %1$s 个主机在运行时, 集群才是正常的',
|
||||
'Class:ContainerCluster/Attribute:redundancy/percent' => '当至少 %1$s %% 的在主机运行时,集群才是正常的',
|
||||
'Class:ContainerCluster/Attribute:containerhosts_list' => '容器宿主机',
|
||||
'Class:ContainerCluster/Attribute:containerhosts_list' => '容器化主机',
|
||||
'Class:ContainerCluster/Attribute:containerhosts_list+' => '此集群的主机',
|
||||
]);
|
||||
|
||||
@@ -162,12 +162,12 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
//
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:Cloud/Attribute:containerhosts_list' => '容器宿主机',
|
||||
'Class:Cloud/Attribute:containerhosts_list+' => '运行在此云平台上的容器宿主机列表',
|
||||
'Class:Server/Attribute:containerhosts_list' => '容器宿主机',
|
||||
'Class:Server/Attribute:containerhosts_list+' => '运行在此物理机上的容器宿主机列表',
|
||||
'Class:VirtualMachine/Attribute:containerhosts_list' => '容器宿主机',
|
||||
'Class:VirtualMachine/Attribute:containerhosts_list+' => '运行在此虚拟机上的容器宿主机列表',
|
||||
'Class:Cloud/Attribute:containerhosts_list' => '容器化主机',
|
||||
'Class:Cloud/Attribute:containerhosts_list+' => '运行在此云平台上的容器化主机列表',
|
||||
'Class:Server/Attribute:containerhosts_list' => '容器化主机',
|
||||
'Class:Server/Attribute:containerhosts_list+' => '运行在此物理机上的容器化主机列表',
|
||||
'Class:VirtualMachine/Attribute:containerhosts_list' => '容器化主机',
|
||||
'Class:VirtualMachine/Attribute:containerhosts_list+' => '运行在此虚拟机上的容器化主机列表',
|
||||
'Class:Software/Attribute:containerimages_list' => '容器镜像',
|
||||
'Class:Software/Attribute:containerimages_list+' => '运行此软件的容器镜像列表',
|
||||
]);
|
||||
|
||||
@@ -42,7 +42,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'iTopUpdate:UI:WarningReadOnlyDuringUpdate' => 'Во время обновления приложение будет доступно только для чтения.',
|
||||
'iTopUpdate:UI:Status' => 'Статус',
|
||||
'iTopUpdate:UI:Action' => 'Обновление',
|
||||
'iTopUpdate:UI:Setup' => ITOP_APPLICATION_SHORT.' Setup~~',
|
||||
'iTopUpdate:UI:Setup' => 'Установка '.ITOP_APPLICATION_SHORT.'',
|
||||
'iTopUpdate:UI:History' => 'История версий',
|
||||
'iTopUpdate:UI:Progress' => 'Ход обновления',
|
||||
'iTopUpdate:UI:Backup:Label' => 'Создать резервную копию базы данных',
|
||||
@@ -59,12 +59,12 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'iTopUpdate:UI:CanCoreUpdate:Failed' => 'Ошибка проверки файловой системы',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Приложение может быть обновлено',
|
||||
'iTopUpdate:UI:CanCoreUpdate:No' => 'Приложение не может быть обновлено: %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~~',
|
||||
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Внимание: обновление приложения может завершиться неудачей: %1$s',
|
||||
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Обнаружены изменённые файлы</b>, частичное обновление невозможно.</br>Следуйте <a target="_blank" href="%2$s">инструкции</a>, чтобы обновить iTop вручную. Для обновления приложения нужно использовать <a href="%1$s">установщик</a>.',
|
||||
'iTopUpdate:UI:CheckInProgress' => 'Пожалуйста, подождите, идёт проверка целостности',
|
||||
'iTopUpdate:UI:SetupLaunch' => 'Запустить установщик '.ITOP_APPLICATION_SHORT.'',
|
||||
'iTopUpdate:UI:SetupLaunchConfirm' => 'Это запустит установщик '.ITOP_APPLICATION_SHORT.', вы уверены?',
|
||||
'iTopUpdate:UI:FastSetupLaunch' => 'Быстрая установка',
|
||||
'iTopUpdate:UI:SetupMessage:Ready' => 'Всё готово к началу',
|
||||
'iTopUpdate:UI:SetupMessage:EnterMaintenance' => 'Переход в режим технического обслуживания',
|
||||
'iTopUpdate:UI:SetupMessage:Backup' => 'Резервное копирование базы данных',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<Rack alias="Rack" id="1">
|
||||
<Rack alias="Rack" id="15">
|
||||
<name>Rack1</name>
|
||||
<description></description>
|
||||
<org_id>2</org_id>
|
||||
@@ -14,6 +14,6 @@
|
||||
<asset_number></asset_number>
|
||||
<purchase_date></purchase_date>
|
||||
<end_of_warranty></end_of_warranty>
|
||||
<nb_u></nb_u>
|
||||
<nb_u>12</nb_u>
|
||||
</Rack>
|
||||
</Set>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<TagSetFieldDataFor_FAQ__domains id="1">
|
||||
<code>software</code>
|
||||
<label>Software 💾</label>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains id="2">
|
||||
<code>hardware</code>
|
||||
<label>Hardware 💻</label>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains id="3">
|
||||
<code>server</code>
|
||||
<label>Server 🏢</label>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains id="4">
|
||||
<code>mobile</code>
|
||||
<label>Mobile 📱</label>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains id="5">
|
||||
<code>network</code>
|
||||
<label>Network ☁️</label>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
</Set>
|
||||
82
datamodels/2.x/itop-faq-light/data/data.sample.faq.de_de.xml
Normal file
82
datamodels/2.x/itop-faq-light/data/data.sample.faq.de_de.xml
Normal file
@@ -0,0 +1,82 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<FAQ alias="FAQ" id="6">
|
||||
<title>💻 Anfrage für IT-Ausrüstung</title>
|
||||
<summary>So beantragen Sie IT-Ausrüstung</summary>
|
||||
<description><h4><strong>📌 Zweck</strong></h4><p>Dieser Ablauf beschreibt die Schritte zur Beantragung von IT-Ausrüstung wie Laptops, Monitore, Peripheriegeräte oder Softwarelizenzen. Alle Anfragen müssen über die freigegebenen Kanäle eingereicht werden, damit Nachverfolgung, Genehmigung und Bereitstellung sichergestellt sind.</p><hr><h4><strong>👥 Geltungsbereich</strong></h4><p>Gilt für alle Mitarbeitenden, externen Kräfte und Abteilungen, die IT-Ausrüstung für ihre Arbeit benötigen.</p><hr><h4><strong>✅ Schritt 1: Bedarf klären</strong></h4><ul><li>Prüfen Sie, ob die Ausrüstung für Rolle oder Projekt erforderlich ist.</li><li>Prüfen Sie die Verfügbarkeit im IT-Bestand.</li><li>Stellen Sie sicher, dass die Anfrage den IT-Richtlinien entspricht.</li></ul><hr><h4><strong>📝 Schritt 2: Anfrage einreichen</strong></h4><ol><li>Öffnen Sie das IT-Anfrageportal und füllen Sie das Formular vollständig aus.</li><li>Geben Sie Name, Abteilung, Gerätetyp, Menge, Begründung und gewünschtes Lieferdatum an.</li><li>Alternativ senden Sie eine E-Mail an it-requests@[yourorganization].com.</li></ol><hr><h4><strong>🔍 Schritt 3: Genehmigung</strong></h4><p>Die Führungskraft prüft geschäftlichen Bedarf und Budget. Danach validiert das IT-Team Kompatibilität, Verfügbarkeit und Sicherheitsvorgaben. Bei hohen Kosten kann zusätzlich eine Finanzfreigabe erforderlich sein.</p><hr><h4><strong>📦 Schritt 4: Bereitstellung</strong></h4><p>Lagerware wird nach Freigabe zeitnah ausgeliefert. Bei Sonderbestellungen informiert die IT über die Lieferzeit und übernimmt bei Bedarf die Ersteinrichtung.</p><hr><h4><strong>🔄 Rückgabe und Ersatz</strong></h4><p>Defekte oder nicht mehr benötigte Geräte werden über eine Rückgabeanfrage an die IT gemeldet und zurückgeführt.</p></description>
|
||||
<category_id>7</category_id>
|
||||
<error_code></error_code>
|
||||
<key_words>PC, Phone, Laptop, Desktop</key_words>
|
||||
<domains><Set>
|
||||
<Tag>hardware</Tag><Tag>process</Tag></Set>
|
||||
</domains>
|
||||
</FAQ>
|
||||
<FAQ alias="FAQ" id="8">
|
||||
<title>📌 Urlaubsverwaltung</title>
|
||||
<summary></summary>
|
||||
<description><h4><strong>❓ Wie beantrage ich Urlaub?</strong></h4><p>Sie können Urlaub über das interne HR-Portal oder per E-Mail an Ihre Führungskraft und HR beantragen. Geben Sie Name, Zeitraum und Urlaubsart an.</p><hr><h4><strong>⏳ Welche Fristen gelten?</strong></h4><ul><li>Regulärer Urlaub möglichst frühzeitig, idealerweise mindestens 15 Tage vorher.</li><li>Sonderurlaub so schnell wie möglich ankündigen.</li><li>Krankheit oder Unfall am selben Tag melden.</li></ul><hr><h4><strong>📅 Wie viele Urlaubstage habe ich?</strong></h4><p>Der Anspruch richtet sich nach Vertrag und lokaler Gesetzgebung. Ihr aktueller Saldo ist im HR-Portal sichtbar.</p><hr><h4><strong>🔄 Kann ich Urlaub ändern oder stornieren?</strong></h4><p>Ja, je nach Unternehmensrichtlinie und mit Zustimmung der Führungskraft. Änderungen sollten frühzeitig gemeldet werden.</p><hr><h4><strong>🆘 An wen wende ich mich bei Problemen?</strong></h4><p>Bei technischen Problemen kontaktieren Sie den IT-Support, bei Fragen zu Rechten und Saldo das HR-Team.</p></description>
|
||||
<category_id>4</category_id>
|
||||
<error_code></error_code>
|
||||
<key_words>Leave</key_words>
|
||||
<domains><Set>
|
||||
<Tag>process</Tag></Set>
|
||||
</domains>
|
||||
</FAQ>
|
||||
<FAQ alias="FAQ" id="1">
|
||||
<title>🖨️ Fehlerdiagnose bei Druckern</title>
|
||||
<summary>Fragenkatalog zur Analyse von Druckproblemen</summary>
|
||||
<description><h2>❓ Fragen zur Fehlersuche</h2><p><strong>Druckermarke bekannt?</strong> HP, IBM, Epson oder andere.</p><hr><p><strong>Ist der Drucker mit Strom versorgt?</strong> Ja oder Nein.</p><hr><p><strong>Ist der Drucker eingeschaltet?</strong> Ja oder Nein.</p><hr><p><strong>Ist Papier eingelegt?</strong> Ja oder Nein.</p><hr><p><strong>Gibt es Meldungen zum Tintenstand oder andere Warnungen?</strong> Falls ja, welche?</p><hr><p><strong>Wurde bereits ein Neustart versucht?</strong> Ja oder Nein.</p></description>
|
||||
<category_id>3</category_id>
|
||||
<error_code></error_code>
|
||||
<key_words>printer</key_words>
|
||||
<domains><Set>
|
||||
<Tag>printer</Tag><Tag>process</Tag></Set>
|
||||
</domains>
|
||||
</FAQ>
|
||||
<FAQ alias="FAQ" id="4">
|
||||
<title>📶 Fehlerdiagnose für WLAN-Verbindung</title>
|
||||
<summary>Fragenkatalog zur Analyse von WLAN-Problemen</summary>
|
||||
<description><h2>🔍 Grundprüfungen</h2><p>Ist WLAN am Gerät aktiviert, ist das Symbol sichtbar und funktionieren andere Geräte im selben Netzwerk?</p><hr><h2>🌐 Netzwerkspezifische Prüfungen</h2><p>Ist der Router eingeschaltet, sind die LEDs normal, ist die SSID sichtbar und wurde das richtige Passwort verwendet?</p><hr><h2>💻 Gerätespezifische Prüfungen</h2><p>Wurde das Gerät neu gestartet, das WLAN neu verbunden und die Entfernung zum Router geprüft?</p><hr><h2>🛠️ Erweiterte Schritte</h2><p>Treiber aktualisieren, Störquellen prüfen, Routerkanal anpassen und bei Bedarf Router zurücksetzen.</p></description>
|
||||
<category_id>6</category_id>
|
||||
<error_code></error_code>
|
||||
<key_words></key_words>
|
||||
<domains><Set>
|
||||
<Tag>network</Tag></Set>
|
||||
</domains>
|
||||
</FAQ>
|
||||
<FAQ alias="FAQ" id="2">
|
||||
<title>🖥️ Fehlerdiagnose für Windows-Verbindung</title>
|
||||
<summary>Fragenkatalog zur Analyse von Windows-Verbindungsproblemen</summary>
|
||||
<description><h2>🔍 Allgemeine Prüfungen</h2><p>Besteht eine Internetverbindung, ist das WLAN- oder Ethernet-Symbol sichtbar und funktionieren andere Geräte im selben Netzwerk?</p><hr><h2>🌐 Netzwerkspezifische Prüfungen</h2><p>Prüfen Sie Flugmodus, Router-Neustart, korrektes Passwort und ggf. den Einfluss eines VPN.</p><hr><h2>🔗 Windows-spezifische Prüfungen</h2><p>Computer neu starten, Windows-Updates prüfen, Netzwerktreiber aktualisieren und die integrierte Problembehandlung ausführen.</p><hr><h2>🛠️ Erweiterte Schritte</h2><p>Netzwerk zurücksetzen, Sicherheitssoftware prüfen und testweise ein anderes Netzwerk verwenden.</p></description>
|
||||
<category_id>5</category_id>
|
||||
<error_code></error_code>
|
||||
<key_words>windows connection</key_words>
|
||||
<domains><Set>
|
||||
<Tag>software</Tag></Set>
|
||||
</domains>
|
||||
</FAQ>
|
||||
<FAQ alias="FAQ" id="7">
|
||||
<title>🖨️🔄 Drucker-Firmware aktualisieren</title>
|
||||
<summary></summary>
|
||||
<description><h2>📌 Vorbereitung</h2><p>Benötigt werden ein Computer im selben Netzwerk, die passende Firmware-Datei und eine stabile Verbindung. Der Drucker darf während des Updates nicht ausgeschaltet werden.</p><hr><h2>🔍 Modell und Version ermitteln</h2><p>Prüfen Sie das exakte Modell und notieren Sie die aktuell installierte Firmware-Version.</p><hr><h2>📥 Firmware herunterladen</h2><p>Laden Sie die aktuelle Version von der offiziellen Herstellerseite und prüfen Sie die Kompatibilität für Modell und Region.</p><hr><h2>🔄 Update durchführen</h2><p>Das Update kann über Hersteller-Software, Druckermenü oder per USB erfolgen. Folgen Sie den Schritten des Herstellers und unterbrechen Sie den Vorgang nicht.</p><hr><h2>✅ Nachkontrolle</h2><p>Drucker neu starten, Testseite drucken und Funktionen wie Drucken, Scannen und Netzwerk prüfen.</p><hr><h2>🚨 Fehlerbehebung</h2><p>Bei Fehlern Verbindung prüfen, neu starten und bei Bedarf den Herstellersupport kontaktieren.</p></description>
|
||||
<category_id>3</category_id>
|
||||
<category_id_friendlyname>Printer</category_id_friendlyname>
|
||||
<category_name>Printer</category_name>
|
||||
<error_code></error_code>
|
||||
<key_words>printer, firmware</key_words>
|
||||
<domains><Set>
|
||||
<Tag>printer</Tag></Set>
|
||||
</domains>
|
||||
</FAQ>
|
||||
<FAQ alias="FAQ" id="5">
|
||||
<title>💙💻 Fehlerdiagnose bei Windows-Bluescreen</title>
|
||||
<summary>Fragenkatalog zur Analyse von Windows-Bluescreen-Problemen</summary>
|
||||
<description><h2>🔍 Erste Prüfungen</h2><p>Tritt der Bluescreen wiederholt auf, bei einem bestimmten Schritt oder zufällig? Notieren Sie den angezeigten Fehlercode.</p><hr><h2>🛠️ Basismaßnahmen</h2><p>Neustart durchführen, Windows aktualisieren, externe Geräte trennen und einen Malware-Scan starten.</p><hr><h2>🖥️ Erweiterte Prüfungen</h2><p>Ereignisanzeige prüfen, Treiber aktualisieren sowie Systemprüfungen wie SFC, DISM, RAM- und Datenträgertests ausführen.</p><hr><h2>🔄 Wiederherstellungsoptionen</h2><p>Abgesicherten Modus testen, Systemwiederherstellung verwenden und falls nötig Windows zurücksetzen oder neu installieren.</p></description>
|
||||
<category_id>5</category_id>
|
||||
<error_code></error_code>
|
||||
<key_words>Blue Screen, Windows</key_words>
|
||||
<domains><Set>
|
||||
</Set>
|
||||
</domains>
|
||||
</FAQ>
|
||||
</Set>
|
||||
82
datamodels/2.x/itop-faq-light/data/data.sample.faq.en_us.xml
Normal file
82
datamodels/2.x/itop-faq-light/data/data.sample.faq.en_us.xml
Normal file
File diff suppressed because one or more lines are too long
82
datamodels/2.x/itop-faq-light/data/data.sample.faq.fr_fr.xml
Normal file
82
datamodels/2.x/itop-faq-light/data/data.sample.faq.fr_fr.xml
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<FAQCategory alias="FAQCategory" id="1">
|
||||
<name>Konfiguration</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="2">
|
||||
<name>Datenbank</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="4">
|
||||
<name>Personalwesen</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="6">
|
||||
<name>Netzwerk</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="7">
|
||||
<name>PC</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="3">
|
||||
<name>Drucker</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="5">
|
||||
<name>Windows</name>
|
||||
</FAQCategory>
|
||||
</Set>
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<FAQCategory alias="FAQCategory" id="1">
|
||||
<name>Configuration</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="2">
|
||||
<name>Database</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="4">
|
||||
<name>Human resources</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="6">
|
||||
<name>Network</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="7">
|
||||
<name>PC</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="3">
|
||||
<name>Printer</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="5">
|
||||
<name>Windows</name>
|
||||
</FAQCategory>
|
||||
</Set>
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<FAQCategory alias="FAQCategory" id="1">
|
||||
<name>Configuration</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="2">
|
||||
<name>Base de données</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="4">
|
||||
<name>Ressources humaines</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="6">
|
||||
<name>Réseau</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="7">
|
||||
<name>PC</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="3">
|
||||
<name>Imprimante</name>
|
||||
</FAQCategory>
|
||||
<FAQCategory alias="FAQCategory" id="5">
|
||||
<name>Windows</name>
|
||||
</FAQCategory>
|
||||
</Set>
|
||||
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="2">
|
||||
<code>hardware</code>
|
||||
<label>Hardware 💻</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="4">
|
||||
<code>mobile</code>
|
||||
<label>Mobil 📱</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="5">
|
||||
<code>network</code>
|
||||
<label>Netzwerk ☁️</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="6">
|
||||
<code>printer</code>
|
||||
<label>Drucker 🖨️</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="7">
|
||||
<code>process</code>
|
||||
<label>Prozess ⚙️</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="3">
|
||||
<code>server</code>
|
||||
<label>Server 🏢</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="1">
|
||||
<code>software</code>
|
||||
<label>Software 💾</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
</Set>
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="2">
|
||||
<code>hardware</code>
|
||||
<label>Hardware 💻</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="4">
|
||||
<code>mobile</code>
|
||||
<label>Mobile 📱</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="5">
|
||||
<code>network</code>
|
||||
<label>Network ☁️</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="6">
|
||||
<code>printer</code>
|
||||
<label>Printer 🖨️</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="7">
|
||||
<code>process</code>
|
||||
<label>Process ⚙️</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="3">
|
||||
<code>server</code>
|
||||
<label>Server 🏢</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="1">
|
||||
<code>software</code>
|
||||
<label>Software 💾</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
</Set>
|
||||
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="2">
|
||||
<code>hardware</code>
|
||||
<label>Matériel 💻</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="4">
|
||||
<code>mobile</code>
|
||||
<label>Mobile 📱</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="5">
|
||||
<code>network</code>
|
||||
<label>Réseau ☁️</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="6">
|
||||
<code>printer</code>
|
||||
<label>Imprimante 🖨️</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="7">
|
||||
<code>process</code>
|
||||
<label>Processus ⚙️</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="3">
|
||||
<code>server</code>
|
||||
<label>Serveur 🏢</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
<TagSetFieldDataFor_FAQ__domains alias="TagSetFieldDataFor_FAQ__domains" id="1">
|
||||
<code>software</code>
|
||||
<label>Logiciel 💾</label>
|
||||
<description></description>
|
||||
</TagSetFieldDataFor_FAQ__domains>
|
||||
</Set>
|
||||
@@ -45,7 +45,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
]);
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Menu:ProblemManagement' => 'Управление проблемами',
|
||||
'Menu:ProblemManagement+' => 'An ITIL process that identifies root causes of incidents, documents Known Errors and FAQs, in order to reduce helpdesk workload~~',
|
||||
'Menu:ProblemManagement+' => 'Процесс ITIL, который выявляет первопричины инцидентов, документирует известные ошибки и FAQ, чтобы снизить нагрузку на службу поддержки',
|
||||
'Menu:Problem:Shortcuts' => 'Ярлыки',
|
||||
'Menu:FAQCategory' => 'Категории FAQ',
|
||||
'Menu:FAQCategory+' => 'Категории FAQ',
|
||||
|
||||
@@ -56,7 +56,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:FAQ+' => '常见问题',
|
||||
'Class:FAQ/Attribute:title' => '标题',
|
||||
'Class:FAQ/Attribute:title+' => '',
|
||||
'Class:FAQ/Attribute:summary' => '概要',
|
||||
'Class:FAQ/Attribute:summary' => '摘要',
|
||||
'Class:FAQ/Attribute:summary+' => '',
|
||||
'Class:FAQ/Attribute:description' => '描述',
|
||||
'Class:FAQ/Attribute:description+' => '',
|
||||
@@ -68,7 +68,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:FAQ/Attribute:error_code+' => '',
|
||||
'Class:FAQ/Attribute:key_words' => '关键字',
|
||||
'Class:FAQ/Attribute:key_words+' => '',
|
||||
'Class:FAQ/Attribute:domains' => '范围',
|
||||
'Class:FAQ/Attribute:domains' => '领域',
|
||||
]);
|
||||
|
||||
//
|
||||
|
||||
@@ -27,7 +27,9 @@ SetupWebPage::AddModule(
|
||||
//'data.struct.itop-knownerror-mgmt.xml',
|
||||
],
|
||||
'data.sample' => [
|
||||
'data/data.sample.faq-domains.xml',
|
||||
'data/data.sample.faqdomain.en_us.xml',
|
||||
'data/data.sample.faqcategory.en_us.xml',
|
||||
'data/data.sample.faq.en_us.xml',
|
||||
],
|
||||
|
||||
// Documentation
|
||||
|
||||
@@ -14,6 +14,6 @@
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'FilesInformation:Error:MissingFile' => 'Файл %1$s отсутствует',
|
||||
'FilesInformation:Error:CorruptedFile' => 'Файл %1$s повреждён',
|
||||
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s ~~',
|
||||
'FilesInformation:Error:ListCorruptedFile' => 'Повреждённые файлы: %1$s ',
|
||||
'FilesInformation:Error:CantWriteToFile' => 'Невозможно выполнить запись в файл %1$s',
|
||||
]);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
* @license https://opensource.org/licenses/AGPL-3.0
|
||||
*
|
||||
* This file is part of iTop.
|
||||
*
|
||||
@@ -21,6 +21,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
// Errors
|
||||
'FilesInformation:Error:MissingFile' => '文件丢失: %1$s',
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<DataFlowProtocol alias="DataFlowProtocol" id="1">
|
||||
<name>HTTP</name>
|
||||
</DataFlowProtocol>
|
||||
<DataFlowProtocol alias="DataFlowProtocol" id="2">
|
||||
<name>HTTPS</name>
|
||||
</DataFlowProtocol>
|
||||
<DataFlowProtocol alias="DataFlowProtocol" id="3">
|
||||
<name>FTP</name>
|
||||
</DataFlowProtocol>
|
||||
<DataFlowProtocol alias="DataFlowProtocol" id="4">
|
||||
<name>SFTP</name>
|
||||
</DataFlowProtocol>
|
||||
<DataFlowProtocol alias="DataFlowProtocol" id="5">
|
||||
<name>AS2</name>
|
||||
</DataFlowProtocol>
|
||||
<DataFlowProtocol alias="DataFlowProtocol" id="6">
|
||||
<name>X.400</name>
|
||||
</DataFlowProtocol>
|
||||
<DataFlowProtocol alias="DataFlowProtocol" id="7">
|
||||
<name>FTPS</name>
|
||||
</DataFlowProtocol>
|
||||
</Set>
|
||||
@@ -1,24 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<DataFlowType alias="DataFlowType" id="1">
|
||||
<name>HTTP</name>
|
||||
<name>REST API</name>
|
||||
</DataFlowType>
|
||||
<DataFlowType alias="DataFlowType" id="2">
|
||||
<name>HTTPS</name>
|
||||
<name>KAFKA</name>
|
||||
</DataFlowType>
|
||||
<DataFlowType alias="DataFlowType" id="3">
|
||||
<name>FTP</name>
|
||||
<name>JSON</name>
|
||||
</DataFlowType>
|
||||
<DataFlowType alias="DataFlowType" id="4">
|
||||
<name>SFTP</name>
|
||||
<name>XML</name>
|
||||
</DataFlowType>
|
||||
<DataFlowType alias="DataFlowType" id="5">
|
||||
<name>AS2</name>
|
||||
</DataFlowType>
|
||||
<DataFlowType alias="DataFlowType" id="6">
|
||||
<name>X.400</name>
|
||||
</DataFlowType>
|
||||
<DataFlowType alias="DataFlowType" id="7">
|
||||
<name>FTPS</name>
|
||||
<name>CSV</name>
|
||||
</DataFlowType>
|
||||
</Set>
|
||||
@@ -97,6 +97,31 @@
|
||||
<on_target_delete>DEL_MANUAL</on_target_delete>
|
||||
<tracking_level>all</tracking_level>
|
||||
</field>
|
||||
<field id="dataflowprotocol_id" xsi:type="AttributeExternalKey">
|
||||
<sql>dataflowprotocol_id</sql>
|
||||
<filter/>
|
||||
<dependencies/>
|
||||
<is_null_allowed>true</is_null_allowed>
|
||||
<target_class>DataFlowProtocol</target_class>
|
||||
<on_target_delete>DEL_MANUAL</on_target_delete>
|
||||
<tracking_level>all</tracking_level>
|
||||
</field>
|
||||
<field id="documentation_url" xsi:type="AttributeURL">
|
||||
<sql>documentation_url</sql>
|
||||
<default_value/>
|
||||
<target>_blank</target>
|
||||
<dependencies/>
|
||||
<validation_pattern/>
|
||||
<is_null_allowed>true</is_null_allowed>
|
||||
<tracking_level>all</tracking_level>
|
||||
</field>
|
||||
<field id="last_change_date" xsi:type="AttributeDate">
|
||||
<sql>last_change_date</sql>
|
||||
<default_value/>
|
||||
<dependencies/>
|
||||
<is_null_allowed>true</is_null_allowed>
|
||||
<tracking_level>all</tracking_level>
|
||||
</field>
|
||||
<field id="status" xsi:type="AttributeEnum">
|
||||
<sql>status</sql>
|
||||
<values>
|
||||
@@ -266,9 +291,12 @@
|
||||
<item id="dataflowtype_id">
|
||||
<rank>50</rank>
|
||||
</item>
|
||||
<item id="execution_frequency">
|
||||
<item id="dataflowprotocol_id">
|
||||
<rank>60</rank>
|
||||
</item>
|
||||
<item id="execution_frequency">
|
||||
<rank>70</rank>
|
||||
</item>
|
||||
</items>
|
||||
<rank>20</rank>
|
||||
</item>
|
||||
@@ -282,6 +310,9 @@
|
||||
<item id="move2production">
|
||||
<rank>10</rank>
|
||||
</item>
|
||||
<item id="last_change_date">
|
||||
<rank>20</rank>
|
||||
</item>
|
||||
</items>
|
||||
<rank>10</rank>
|
||||
</item>
|
||||
@@ -290,9 +321,12 @@
|
||||
<item id="description">
|
||||
<rank>10</rank>
|
||||
</item>
|
||||
<item id="groups_list">
|
||||
<item id="documentation_url">
|
||||
<rank>20</rank>
|
||||
</item>
|
||||
<item id="groups_list">
|
||||
<rank>30</rank>
|
||||
</item>
|
||||
</items>
|
||||
<rank>20</rank>
|
||||
</item>
|
||||
@@ -422,6 +456,60 @@
|
||||
</details>
|
||||
</presentation>
|
||||
</class>
|
||||
<class id="DataFlowProtocol" _delta="define">
|
||||
<parent>Typology</parent>
|
||||
<properties>
|
||||
<category>bizmodel,searchable</category>
|
||||
<abstract>false</abstract>
|
||||
<db_table>dataflowprotocol</db_table>
|
||||
<naming>
|
||||
<attributes>
|
||||
<attribute id="name"/>
|
||||
</attributes>
|
||||
</naming>
|
||||
<reconciliation>
|
||||
<attributes>
|
||||
<attribute id="name"/>
|
||||
<attribute id="finalclass"/>
|
||||
</attributes>
|
||||
</reconciliation>
|
||||
<uniqueness_rules>
|
||||
<rule id="name">
|
||||
<attributes>
|
||||
<attribute id="name"/>
|
||||
</attributes>
|
||||
<filter><![CDATA[]]></filter>
|
||||
<disabled>false</disabled>
|
||||
<is_blocking>true</is_blocking>
|
||||
</rule>
|
||||
</uniqueness_rules>
|
||||
</properties>
|
||||
<fields/>
|
||||
<methods/>
|
||||
<presentation>
|
||||
<list>
|
||||
<items>
|
||||
<item id="finalclass">
|
||||
<rank>10</rank>
|
||||
</item>
|
||||
</items>
|
||||
</list>
|
||||
<search>
|
||||
<items>
|
||||
<item id="name">
|
||||
<rank>10</rank>
|
||||
</item>
|
||||
</items>
|
||||
</search>
|
||||
<details>
|
||||
<items>
|
||||
<item id="name">
|
||||
<rank>10</rank>
|
||||
</item>
|
||||
</items>
|
||||
</details>
|
||||
</presentation>
|
||||
</class>
|
||||
<class id="FunctionalCI" _delta="must_exist">
|
||||
<fields>
|
||||
<field id="dataflows" xsi:type="AttributeDashboard" _delta="define">
|
||||
@@ -628,6 +716,10 @@
|
||||
<rank>23</rank>
|
||||
<class>DataFlowType</class>
|
||||
</dashlet>
|
||||
<dashlet id="DataFlowProtocol" xsi:type="DashletBadge" _delta="define">
|
||||
<rank>24</rank>
|
||||
<class>DataFlowProtocol</class>
|
||||
</dashlet>
|
||||
</dashlets>
|
||||
</cell>
|
||||
</cells>
|
||||
|
||||
@@ -45,7 +45,13 @@ Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:no' => 'no',
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:no+' => 'If the flow stops, the destination is not impacted',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id' => 'Flow type',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id+' => 'Typology of Flow.',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id+' => 'Values defined in a typology of Data Flow Type',
|
||||
'Class:DataFlow/Attribute:dataflowprotocol_id' => 'Flow protocol',
|
||||
'Class:DataFlow/Attribute:dataflowprotocol_id+' => 'Values defined in a typology of Data Flow Protocol',
|
||||
'Class:DataFlow/Attribute:documentation_url' => 'Documentation URL',
|
||||
'Class:DataFlow/Attribute:documentation_url+' => 'URL to the documentation of the data flow',
|
||||
'Class:DataFlow/Attribute:last_change_date' => 'Last change date',
|
||||
'Class:DataFlow/Attribute:last_change_date+' => 'Last time the software or configuration of the Data Flow was updated',
|
||||
'Class:DataFlow/Attribute:status' => 'Status',
|
||||
'Class:DataFlow/Attribute:status+' => '',
|
||||
'Class:DataFlow/Attribute:status/Value:active' => 'active',
|
||||
@@ -74,18 +80,7 @@ Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:DataFlowType' => 'Data Flow Type',
|
||||
'Class:DataFlowType+' => 'Typology of Data Flow',
|
||||
|
||||
/*
|
||||
'Class:DataFlow/Attribute:source_id_friendlyname' => 'source_id_friendlyname',
|
||||
'Class:DataFlow/Attribute:source_id_friendlyname+' => 'Full name',
|
||||
'Class:DataFlow/Attribute:source_id_finalclass_recall' => 'source_id->CI sub-class',
|
||||
'Class:DataFlow/Attribute:source_id_finalclass_recall+' => 'Name of the final class',
|
||||
'Class:DataFlow/Attribute:source_id_obsolescence_flag' => 'source_id->Obsolete',
|
||||
'Class:DataFlow/Attribute:source_id_obsolescence_flag+' => 'Computed dynamically on other attributes',
|
||||
'Class:DataFlow/Attribute:destination_id_friendlyname' => 'destination_id_friendlyname',
|
||||
'Class:DataFlow/Attribute:destination_id_friendlyname+' => 'Full name',
|
||||
'Class:DataFlow/Attribute:destination_id_finalclass_recall' => 'destination_id->CI sub-class',
|
||||
'Class:DataFlow/Attribute:destination_id_finalclass_recall+' => 'Name of the final class',
|
||||
'Class:DataFlow/Attribute:destination_id_obsolescence_flag' => 'destination_id->Obsolete',
|
||||
'Class:DataFlow/Attribute:destination_id_obsolescence_flag+' => 'Computed dynamically on other attributes',
|
||||
*/
|
||||
'Class:DataFlowProtocol' => 'Data Flow Protocol',
|
||||
'Class:DataFlowProtocol+' => 'Typology of Data Flow Protocol',
|
||||
|
||||
]);
|
||||
|
||||
@@ -44,10 +44,16 @@ Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:yes+' => 'Si le flux s\'arrête, le destinataire est impacté',
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:no' => 'non',
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:no+' => 'Si le flux s\'arrête, le destinataire n\'est pas impacté',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id' => 'Type de flux',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id+' => 'Typologie du flux',
|
||||
'Class:DataFlow/Attribute:status' => 'Etat',
|
||||
'Class:DataFlow/Attribute:status+' => '',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id' => 'Type du flux',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id+' => 'Ces valeurs sont gérées dans une typologie',
|
||||
'Class:DataFlow/Attribute:dataflowprotocol_id' => 'Protocole',
|
||||
'Class:DataFlow/Attribute:dataflowprotocol_id+' => 'Protocole utilisé par le flux. Ces valeurs sont gérées dans une typologie',
|
||||
'Class:DataFlow/Attribute:documentation_url' => 'Lien vers la documentation',
|
||||
'Class:DataFlow/Attribute:documentation_url+' => 'URL vers la documentation du flux de données',
|
||||
'Class:DataFlow/Attribute:last_change_date' => 'Dernière mise à jour',
|
||||
'Class:DataFlow/Attribute:last_change_date+' => 'Date de la dernière mise à jour du logiciel ou de la configuration du flux de données',
|
||||
'Class:DataFlow/Attribute:status' => 'Etat',
|
||||
'Class:DataFlow/Attribute:status+' => '',
|
||||
'Class:DataFlow/Attribute:status/Value:active' => 'actif',
|
||||
'Class:DataFlow/Attribute:status/Value:inactive' => 'inactif',
|
||||
'Class:DataFlow/Attribute:execution_frequency' => 'Fréquence d\'exécution',
|
||||
@@ -66,26 +72,15 @@ Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:monthly+' => '',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:yearly' => 'annuelle',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:yearly+' => '',
|
||||
'Class:DataFlow/Attribute:documents_list+' => 'Eg: technical specifications, runbooks, etc.',
|
||||
'Class:DataFlow/Attribute:contacts_list+' => 'Eg: flow owner, technical support, etc.',
|
||||
'Class:DataFlow/Attribute:documents_list+' => 'Ex: spécifications techniques, runbooks, etc.',
|
||||
'Class:DataFlow/Attribute:contacts_list+' => 'Ex: propriétaire du flux, support technique, etc.',
|
||||
'Class:DataFlow/Error:CheckSource' => 'La source d\'un flux de données ne peut pas être un flux de données elle-même. Choisissez un autre CI source que %1$s',
|
||||
'Class:DataFlow/Error:CheckDestination' => 'La destination d\'un flux de données ne peut pas être un flux de données elle-même. Choisissez un autre CI destination que %1$s',
|
||||
|
||||
'Class:DataFlowType' => 'Type de flux',
|
||||
'Class:DataFlowType+' => 'Typologie des flux de données',
|
||||
|
||||
/*
|
||||
'Class:DataFlow/Attribute:source_id_friendlyname' => 'source_id_friendlyname',
|
||||
'Class:DataFlow/Attribute:source_id_friendlyname+' => 'Nom complet',
|
||||
'Class:DataFlow/Attribute:source_id_finalclass_recall' => 'source_id->CI sub-class',
|
||||
'Class:DataFlow/Attribute:source_id_finalclass_recall+' => 'Classe finale',
|
||||
'Class:DataFlow/Attribute:source_id_obsolescence_flag' => 'source_id->Obsolete',
|
||||
'Class:DataFlow/Attribute:source_id_obsolescence_flag+' => 'Computed dynamically on other attributes',
|
||||
'Class:DataFlow/Attribute:destination_id_friendlyname' => 'destination_id_friendlyname',
|
||||
'Class:DataFlow/Attribute:destination_id_friendlyname+' => 'Nom complet',
|
||||
'Class:DataFlow/Attribute:destination_id_finalclass_recall' => 'destination_id->CI sub-class',
|
||||
'Class:DataFlow/Attribute:destination_id_finalclass_recall+' => 'Classe finale',
|
||||
'Class:DataFlow/Attribute:destination_id_obsolescence_flag' => 'destination_id->Obsolete',
|
||||
'Class:DataFlow/Attribute:destination_id_obsolescence_flag+' => 'Computed dynamically on other attributes',
|
||||
*/
|
||||
'Class:DataFlowProtocol' => 'Protocole de flux',
|
||||
'Class:DataFlowProtocol+' => 'Typologie des protocoles de flux',
|
||||
|
||||
]);
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Module combodo-flow-map
|
||||
*
|
||||
* @copyright Copyright (C) 2026 XXXXX
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
|
||||
'Relation:dataflows/Description' => 'Gegevensstromen tussen CIs',
|
||||
'Relation:dataflows/DownStream' => 'Uitgaande stromen...',
|
||||
'Relation:dataflows/DownStream+' => 'Uitgaande gegevensstromen van',
|
||||
'Relation:dataflows/UpStream' => 'Inkomende stromen...',
|
||||
'Relation:dataflows/UpStream+' => 'Inkomende gegevensstromen van',
|
||||
|
||||
'Class:FunctionalCI/Attribute:dataflows' => 'Gegevensstromen',
|
||||
'Class:FunctionalCI/Attribute:dataflows+' => 'Gegevensstromen waarbij dit object de bron of de bestemming is.',
|
||||
'FunctionalCI:DataFlow:Title' => 'Gegevensstromen',
|
||||
'FunctionalCI:DataFlow:Inbound' => 'Inkomende stromen',
|
||||
'FunctionalCI:DataFlow:Outbound' => 'Uitgaande stromen',
|
||||
|
||||
'DataFlow:moreinfo' => 'Gegevensstroom informatie',
|
||||
|
||||
'Class:DataFlow' => 'Gegevensstroom',
|
||||
'Class:DataFlow+' => 'Bijvoorbeeld voor de gegevensstroom in een applicatie.',
|
||||
'Class:DataFlow/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:DataFlow/Attribute:name' => 'Naam',
|
||||
'Class:DataFlow/Attribute:name+' => 'Identificeer de gegevensstroom',
|
||||
'Class:DataFlow/Attribute:source_id' => 'Bron',
|
||||
'Class:DataFlow/Attribute:source_id+' => 'Bron CI van de gegevensstroom',
|
||||
'Class:DataFlow/Attribute:source_impact' => 'Impact van de bron?',
|
||||
'Class:DataFlow/Attribute:source_impact+' => 'Heeft de bron invloed op de gegevensstroom?',
|
||||
'Class:DataFlow/Attribute:source_impact/Value:yes' => 'Ja',
|
||||
'Class:DataFlow/Attribute:source_impact/Value:yes+' => 'Als de bron uitvalt, wordt de gegevensstroom beïnvloed.',
|
||||
'Class:DataFlow/Attribute:source_impact/Value:no' => 'Nee',
|
||||
'Class:DataFlow/Attribute:source_impact/Value:no+' => 'Als de bron uitvalt, wordt de gegevensstroom niet beïnvloed.',
|
||||
'Class:DataFlow/Attribute:destination_id' => 'Bestemming',
|
||||
'Class:DataFlow/Attribute:destination_id+' => 'Bestemmings CI van de gegevensstroom',
|
||||
'Class:DataFlow/Attribute:destination_impact' => 'Bestemming geïmpacteerd?',
|
||||
'Class:DataFlow/Attribute:destination_impact+' => 'Wordt de bestemming beïnvloed door de gegevensstroom?',
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:yes' => 'Ja',
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:yes+' => 'Als de gegevensstroom stopt, heeft dat gevolgen voor de bestemming.',
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:no' => 'Nee',
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:no+' => 'Als de gegevensstroom stopt, heeft dit geen gevolgen voor de bestemming.',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id' => 'Type',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id+' => 'Values defined in a typology of Data Flow Type~~',
|
||||
'Class:DataFlow/Attribute:dataflowprotocol_id' => 'Flowprotocol',
|
||||
'Class:DataFlow/Attribute:dataflowprotocol_id+' => 'Values defined in a typology of Data Flow Protocol~~',
|
||||
'Class:DataFlow/Attribute:documentation_url' => 'Documentatie-URL',
|
||||
'Class:DataFlow/Attribute:documentation_url+' => 'URL naar de documentatie van de gegevensstroom',
|
||||
'Class:DataFlow/Attribute:last_change_date' => 'Datum laatste wijziging',
|
||||
'Class:DataFlow/Attribute:last_change_date+' => 'Datum van de laatste wijziging van de software of configuratie van de gegevensstroom',
|
||||
'Class:DataFlow/Attribute:status' => 'Status',
|
||||
'Class:DataFlow/Attribute:status+' => '',
|
||||
'Class:DataFlow/Attribute:status/Value:active' => 'Actief',
|
||||
'Class:DataFlow/Attribute:status/Value:inactive' => 'Inactief',
|
||||
'Class:DataFlow/Attribute:execution_frequency' => 'Uitvoeringsfrequentie',
|
||||
'Class:DataFlow/Attribute:execution_frequency+' => 'Hoe vaak de gegevensstroom wordt uitgevoerd.',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:realtime' => 'Realtime',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:realtime+' => '',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:ondemand' => 'Op aanvraag',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:ondemand+' => 'Spontaan, niet gepland',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:hourly' => 'Ieder uur',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:hourly+' => '',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:daily' => 'Dagelijks',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:daily+' => '',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:weekly' => 'Wekelijks',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:weekly+' => '',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:monthly' => 'Maandelijks',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:monthly+' => '',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:yearly' => 'Jaarlijks',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:yearly+' => '',
|
||||
'Class:DataFlow/Attribute:documents_list+' => 'Bv: Technische specificaties, runbooks, enz.',
|
||||
'Class:DataFlow/Attribute:contacts_list+' => 'Bv: Proceseigenaar, technische ondersteuning, enz.',
|
||||
'Class:DataFlow/Error:CheckSource' => 'De bron van een gegevensstroom mag niet zelf een gegevensstroom zijn. Kies een andere bron-CI dan %1$s',
|
||||
'Class:DataFlow/Error:CheckDestination' => 'De bestemming van een dataflow mag niet zelf een gegevensstroom zijn. Kies een andere bestemmings-CI dan %1$s',
|
||||
|
||||
'Class:DataFlowType' => 'Soort gegevensstroom',
|
||||
'Class:DataFlowType+' => '',
|
||||
|
||||
'Class:DataFlowProtocol' => 'Gegevensstroomprotocol',
|
||||
'Class:DataFlowProtocol+' => 'Typologie van gegevensstroomprotocol',
|
||||
|
||||
]);
|
||||
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Module combodo-flow-map
|
||||
*
|
||||
* @copyright Copyright (C) 2013 XXXXX
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
/**
|
||||
* @author Vladimir Kunin <v.b.kunin@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
|
||||
'Relation:dataflows/Description' => 'Потоки данных между КЕ',
|
||||
'Relation:dataflows/DownStream' => 'Исходящие потоки...',
|
||||
'Relation:dataflows/DownStream+' => 'Карта исходящих потоков от',
|
||||
'Relation:dataflows/UpStream' => 'Входящие потоки...',
|
||||
'Relation:dataflows/UpStream+' => 'Карта входящих потоков к',
|
||||
|
||||
'Class:FunctionalCI/Attribute:dataflows' => 'Потоки данных',
|
||||
'Class:FunctionalCI/Attribute:dataflows+' => 'Потоки данных, для которых этот объект является источником или назначением',
|
||||
'FunctionalCI:DataFlow:Title' => 'Потоки данных',
|
||||
'FunctionalCI:DataFlow:Inbound' => 'Входящие потоки',
|
||||
'FunctionalCI:DataFlow:Outbound' => 'Исходящие потоки',
|
||||
|
||||
'DataFlow:moreinfo' => 'Особенности потока',
|
||||
|
||||
'Class:DataFlow' => 'Поток',
|
||||
'Class:DataFlow+' => 'Например, для потока приложения',
|
||||
'Class:DataFlow/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:DataFlow/Attribute:name' => 'Название',
|
||||
'Class:DataFlow/Attribute:name+' => 'Идентифицирует передаваемый поток данных',
|
||||
'Class:DataFlow/Attribute:source_id' => 'Источник',
|
||||
'Class:DataFlow/Attribute:source_id+' => 'КЕ-источник потока',
|
||||
'Class:DataFlow/Attribute:source_impact' => 'Источник влияет?',
|
||||
'Class:DataFlow/Attribute:source_impact+' => 'Влияет ли источник на поток?',
|
||||
'Class:DataFlow/Attribute:source_impact/Value:yes' => 'да',
|
||||
'Class:DataFlow/Attribute:source_impact/Value:yes+' => 'Если источник выходит из строя, поток нарушается',
|
||||
'Class:DataFlow/Attribute:source_impact/Value:no' => 'нет',
|
||||
'Class:DataFlow/Attribute:source_impact/Value:no+' => 'Если источник выходит из строя, поток не нарушается',
|
||||
'Class:DataFlow/Attribute:destination_id' => 'Назначение',
|
||||
'Class:DataFlow/Attribute:destination_id+' => 'КЕ-назначение потока',
|
||||
'Class:DataFlow/Attribute:destination_impact' => 'Назначение подвержено влиянию',
|
||||
'Class:DataFlow/Attribute:destination_impact+' => 'Подвержено ли назначение влиянию потока?',
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:yes' => 'да',
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:yes+' => 'Если поток останавливается, назначение подвержено влиянию',
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:no' => 'нет',
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:no+' => 'Если поток останавливается, назначение не подвержено влиянию',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id' => 'Тип потока',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id+' => 'Values defined in a typology of Data Flow Type~~',
|
||||
'Class:DataFlow/Attribute:dataflowprotocol_id' => 'Протокол потока',
|
||||
'Class:DataFlow/Attribute:dataflowprotocol_id+' => 'Values defined in a typology of Data Flow Protocol~~',
|
||||
'Class:DataFlow/Attribute:documentation_url' => 'Ссылка на документацию',
|
||||
'Class:DataFlow/Attribute:documentation_url+' => 'Ссылка на документацию потока данных',
|
||||
'Class:DataFlow/Attribute:last_change_date' => 'Дата последнего изменения',
|
||||
'Class:DataFlow/Attribute:last_change_date+' => 'Дата последнего изменения программного обеспечения или конфигурации потока данных',
|
||||
'Class:DataFlow/Attribute:status' => 'Статус',
|
||||
'Class:DataFlow/Attribute:status+' => '',
|
||||
'Class:DataFlow/Attribute:status/Value:active' => 'активен',
|
||||
'Class:DataFlow/Attribute:status/Value:inactive' => 'неактивен',
|
||||
'Class:DataFlow/Attribute:execution_frequency' => 'Периодичность выполнения',
|
||||
'Class:DataFlow/Attribute:execution_frequency+' => 'Как часто выполняется поток данных',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:realtime' => 'в реальном времени',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:realtime+' => '',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:ondemand' => 'по запросу',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:ondemand+' => 'по требованию, без расписания',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:hourly' => 'ежечасно',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:hourly+' => '',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:daily' => 'ежедневно',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:daily+' => '',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:weekly' => 'еженедельно',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:weekly+' => '',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:monthly' => 'ежемесячно',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:monthly+' => '',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:yearly' => 'ежегодно',
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:yearly+' => '',
|
||||
'Class:DataFlow/Attribute:documents_list+' => 'Например: технические спецификации, регламенты и т. д.',
|
||||
'Class:DataFlow/Attribute:contacts_list+' => 'Например: владелец потока, техническая поддержка и т. д.',
|
||||
'Class:DataFlow/Error:CheckSource' => 'Источником потока данных не может быть другой поток данных. Выберите другую КЕ-источник, отличную от %1$s',
|
||||
'Class:DataFlow/Error:CheckDestination' => 'Назначением потока данных не может быть другой поток данных. Выберите другую КЕ-назначение, отличную от %1$s',
|
||||
|
||||
'Class:DataFlowType' => 'Тип потока данных',
|
||||
'Class:DataFlowType+' => 'Типология потоков данных',
|
||||
|
||||
'Class:DataFlowProtocol' => 'Протокол потока данных',
|
||||
'Class:DataFlowProtocol+' => 'Типология протоколов потоков данных',
|
||||
|
||||
]);
|
||||
@@ -9,11 +9,11 @@
|
||||
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
'Relation:dataflows/Description' => 'DataFlows between CIs~~',
|
||||
'Relation:dataflows/DownStream' => 'Outbound flows...',
|
||||
'Relation:dataflows/DownStream+' => 'Outbound flows map from',
|
||||
'Relation:dataflows/UpStream' => 'Inbound flows...',
|
||||
'Relation:dataflows/UpStream+' => 'Inbound flows map to',
|
||||
'Relation:dataflows/Description' => '配置项之间的数据流',
|
||||
'Relation:dataflows/DownStream' => '出站数据流...',
|
||||
'Relation:dataflows/DownStream+' => '出站数据流图,源自',
|
||||
'Relation:dataflows/UpStream' => '入站数据流...',
|
||||
'Relation:dataflows/UpStream+' => '入站数据流图,指向',
|
||||
|
||||
'Class:FunctionalCI/Attribute:dataflows' => '数据流',
|
||||
'Class:FunctionalCI/Attribute:dataflows+' => '该对象作为源或目标的数据流',
|
||||
@@ -24,7 +24,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'DataFlow:moreinfo' => '数据流详情',
|
||||
|
||||
'Class:DataFlow' => '数据流',
|
||||
'Class:DataFlow+' => 'For application flow for example~~',
|
||||
'Class:DataFlow+' => '例如应用数据流',
|
||||
'Class:DataFlow/Name' => '%1$s',
|
||||
'Class:DataFlow/Attribute:name' => '名称',
|
||||
'Class:DataFlow/Attribute:name+' => '已传输的数据',
|
||||
@@ -45,7 +45,13 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:no' => '否',
|
||||
'Class:DataFlow/Attribute:destination_impact/Value:no+' => '如果数据流停止,目标不受影响',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id' => '数据流类型',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id+' => '数据流的分类',
|
||||
'Class:DataFlow/Attribute:dataflowtype_id+' => 'Values defined in a typology of Data Flow Type~~',
|
||||
'Class:DataFlow/Attribute:dataflowprotocol_id' => '数据流协议',
|
||||
'Class:DataFlow/Attribute:dataflowprotocol_id+' => 'Values defined in a typology of Data Flow Protocol~~',
|
||||
'Class:DataFlow/Attribute:documentation_url' => '文档链接',
|
||||
'Class:DataFlow/Attribute:documentation_url+' => '数据流文档链接',
|
||||
'Class:DataFlow/Attribute:last_change_date' => '最后修改日期',
|
||||
'Class:DataFlow/Attribute:last_change_date+' => '数据流软件或配置的最后修改时间',
|
||||
'Class:DataFlow/Attribute:status' => '状态',
|
||||
'Class:DataFlow/Attribute:status+' => '',
|
||||
'Class:DataFlow/Attribute:status/Value:active' => '启用',
|
||||
@@ -68,24 +74,13 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:DataFlow/Attribute:execution_frequency/Value:yearly+' => '',
|
||||
'Class:DataFlow/Attribute:documents_list+' => '例如: 技术规范, 操作手册等.',
|
||||
'Class:DataFlow/Attribute:contacts_list+' => '例如: 数据流所有者, 技术支持等.',
|
||||
'Class:DataFlow/Error:CheckSource' => 'The source of a data flow cannot be a data flow itself. Choose another source CI than %1$s~~',
|
||||
'Class:DataFlow/Error:CheckDestination' => 'The destination of a data flow cannot be a data flow itself. Choose another destination CI than %1$s~~',
|
||||
'Class:DataFlow/Error:CheckSource' => '数据流的源头不能是数据流本身。请选择一个不同的源配置项,而不是 %1$s',
|
||||
'Class:DataFlow/Error:CheckDestination' => '数据流的目标不能是数据流本身。请选择一个不同的目标配置项,而不是 %1$s',
|
||||
|
||||
'Class:DataFlowType' => '数据流类型',
|
||||
'Class:DataFlowType+' => '数据流的分类',
|
||||
|
||||
/*
|
||||
'Class:DataFlow/Attribute:source_id_friendlyname' => 'source_id_friendlyname',
|
||||
'Class:DataFlow/Attribute:source_id_friendlyname+' => 'Full name',
|
||||
'Class:DataFlow/Attribute:source_id_finalclass_recall' => 'source_id->CI sub-class',
|
||||
'Class:DataFlow/Attribute:source_id_finalclass_recall+' => 'Name of the final class',
|
||||
'Class:DataFlow/Attribute:source_id_obsolescence_flag' => 'source_id->Obsolete',
|
||||
'Class:DataFlow/Attribute:source_id_obsolescence_flag+' => 'Computed dynamically on other attributes',
|
||||
'Class:DataFlow/Attribute:destination_id_friendlyname' => 'destination_id_friendlyname',
|
||||
'Class:DataFlow/Attribute:destination_id_friendlyname+' => 'Full name',
|
||||
'Class:DataFlow/Attribute:destination_id_finalclass_recall' => 'destination_id->CI sub-class',
|
||||
'Class:DataFlow/Attribute:destination_id_finalclass_recall+' => 'Name of the final class',
|
||||
'Class:DataFlow/Attribute:destination_id_obsolescence_flag' => 'destination_id->Obsolete',
|
||||
'Class:DataFlow/Attribute:destination_id_obsolescence_flag+' => 'Computed dynamically on other attributes',
|
||||
*/
|
||||
'Class:DataFlowProtocol' => '数据流协议',
|
||||
'Class:DataFlowProtocol+' => '数据流协议的分类',
|
||||
|
||||
]);
|
||||
|
||||
@@ -31,7 +31,8 @@ SetupWebPage::AddModule(
|
||||
|
||||
],
|
||||
'data.struct' => [
|
||||
'data/data.itop-flow-map.en_us.xml',
|
||||
'data/data.itop-dataflowtype.xml',
|
||||
'data/data.itop-dataflowprotocol.xml',
|
||||
],
|
||||
'data.sample' => [
|
||||
// add your sample data XML files here,
|
||||
|
||||
@@ -15,55 +15,55 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Menu:iTopHub' => 'iTop Hub',
|
||||
'Menu:iTopHub:Register' => 'Подключение к iTop Hub',
|
||||
'Menu:iTopHub:Register+' => 'Перейдите в iTop Hub, чтобы обновить ваш экземпляр '.ITOP_APPLICATION_SHORT,
|
||||
'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:Register:Description' => '<p>Получите доступ к вашей платформе сообщества iTop Hub!<br>Найдите весь необходимый контент и информацию, управляйте своими инстансами через персонализированные инструменты и устанавливайте дополнительные расширения.<br><br>Подключившись к Hub с этой страницы, вы отправите информацию об этом инстансе '.ITOP_APPLICATION_SHORT.' в Hub.</p>',
|
||||
'Menu:iTopHub:MyExtensions' => 'Установленные расширения',
|
||||
'Menu:iTopHub:MyExtensions+' => 'Расширения, развернутые на данном экземпляре '.ITOP_APPLICATION_SHORT,
|
||||
'Menu:iTopHub:BrowseExtensions' => 'Получить расширения из iTop Hub',
|
||||
'Menu:iTopHub:BrowseExtensions+' => 'Найдите дополнительные расширения на iTop Hub',
|
||||
'Menu:iTopHub:BrowseExtensions:Description' => '<p>Look into iTop Hub’s 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.~~',
|
||||
'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>Конфигурация '.ITOP_APPLICATION_SHORT.' НЕ была изменена.',
|
||||
'iTopHub:FailAuthent' => 'Не удалось выполнить аутентификацию для этого действия.',
|
||||
'iTopHub:InstalledExtensions' => 'Расширения, развёрнутые в этом инстансе',
|
||||
'iTopHub:ExtensionCategory:Manual' => 'Расширения, развёрнутые вручную',
|
||||
'iTopHub:ExtensionCategory:Manual+' => 'Следующие расширения были развёрнуты вручную копированием в каталог %1$s '.ITOP_APPLICATION_SHORT.':',
|
||||
'iTopHub:ExtensionCategory:Remote' => 'Расширения, развёрнутые из iTop Hub',
|
||||
'iTopHub:ExtensionCategory:Remote+' => 'Следующие расширения были развёрнуты из iTop Hub:',
|
||||
'iTopHub:NoExtensionInThisCategory' => 'В этой категории нет расширений',
|
||||
'iTopHub:NoExtensionInThisCategory+' => 'Просмотрите iTop Hub, чтобы найти расширения, которые помогут настроить и адаптировать '.ITOP_APPLICATION_SHORT.' под ваши процессы!',
|
||||
'iTopHub:ExtensionNotInstalled' => 'Не установлено',
|
||||
'iTopHub:GetMoreExtensions' => 'Получить расширения из iTop Hub…',
|
||||
'iTopHub:LandingWelcome' => 'Поздравляем! Следующие расширения были загружены из iTop Hub и развёрнуты в вашем '.ITOP_APPLICATION_SHORT.'.',
|
||||
'iTopHub:GoBackToITopBtn' => 'Вернуться в '.ITOP_APPLICATION_SHORT.'',
|
||||
'iTopHub:Uncompressing' => 'Распаковка расширений…',
|
||||
'iTopHub:InstallationWelcome' => 'Установка расширений, загруженных из iTop Hub',
|
||||
'iTopHub:DBBackupLabel' => 'Резервная копия инстанса',
|
||||
'iTopHub:DBBackupSentence' => 'Сделайте резервную копию базы данных и конфигурации '.ITOP_APPLICATION_SHORT.' перед обновлением',
|
||||
'iTopHub:DeployBtn' => 'Развернуть!',
|
||||
'iTopHub:DatabaseBackupProgress' => 'Резервное копирование инстанса…',
|
||||
'iTopHub:InstallationEffect:Install' => 'Версия %1$s будет установлена.',
|
||||
'iTopHub:InstallationEffect:NoChange' => 'Версия %1$s уже установлена. Ничего не изменится.',
|
||||
'iTopHub:InstallationEffect:Upgrade' => 'Будет <b>обновлено</b> с версии %1$s до версии %2$s.',
|
||||
'iTopHub:InstallationEffect:Downgrade' => 'Версия будет <b>ПОНИЖЕНА</b> с %1$s до %2$s.',
|
||||
'iTopHub:InstallationProgress:DatabaseBackup' => 'Резервное копирование инстанса '.ITOP_APPLICATION_SHORT.'…',
|
||||
'iTopHub:InstallationProgress:ExtensionsInstallation' => 'Установка расширений',
|
||||
'iTopHub:InstallationEffect:MissingDependencies' => 'Это расширение нельзя установить из-за невыполненных зависимостей.',
|
||||
'iTopHub:InstallationEffect:MissingDependencies_Details' => 'Расширению требуются модули: %1$s',
|
||||
'iTopHub:InstallationProgress:InstallationSuccessful' => 'Установка выполнена успешно!',
|
||||
'iTopHub:InstallationStatus:Installed_Version' => '%1$s версия: %2$s.',
|
||||
'iTopHub:InstallationStatus:Installed' => 'Установлено',
|
||||
'iTopHub:InstallationStatus:Version_NotInstalled' => 'Версия %1$s <b>НЕ</b> установлена.',
|
||||
]);
|
||||
|
||||
@@ -20,7 +20,7 @@ function DisplayStatus(WebPage $oPage)
|
||||
if (is_dir($sPath)) {
|
||||
$aExtraDirs[] = $sPath; // Also read the extra downloaded-modules directory
|
||||
}
|
||||
$oExtensionsMap = iTopExtensionsMap::GetExtensionsMap(ITOP_DEFAULT_ENV);
|
||||
$oExtensionsMap = iTopExtensionsMap::GetExtensionsMap(ITOP_DEFAULT_ENV, $aExtraDirs);
|
||||
$oExtensionsMap->LoadChoicesFromDatabase(MetaModel::GetConfig());
|
||||
|
||||
foreach ($oExtensionsMap->GetAllExtensions() as $oExtension) {
|
||||
@@ -154,7 +154,7 @@ function DoInstall(WebPage $oPage)
|
||||
if (is_dir($sPath)) {
|
||||
$aExtraDirs[] = $sPath; // Also read the extra downloaded-modules directory
|
||||
}
|
||||
$oExtensionsMap = iTopExtensionsMap::GetExtensionsMap(ITOP_DEFAULT_ENV);
|
||||
$oExtensionsMap = iTopExtensionsMap::GetExtensionsMap(ITOP_DEFAULT_ENV, $aExtraDirs);
|
||||
$oExtensionsMap->LoadChoicesFromDatabase(MetaModel::GetConfig());
|
||||
|
||||
foreach ($oExtensionsMap->GetAllExtensions() as $oExtension) {
|
||||
|
||||
@@ -25,6 +25,7 @@ require_once(APPROOT.'core/mutex.class.inc.php');
|
||||
require_once(APPROOT.'core/dict.class.inc.php');
|
||||
require_once(APPROOT.'setup/xmldataloader.class.inc.php');
|
||||
require_once(__DIR__.'/../setup/hubruntimeenvironment.class.inc.php');
|
||||
require_once(__DIR__.'/../Model/DBBackupWithErrorReporting.php');
|
||||
|
||||
class HubController
|
||||
{
|
||||
@@ -125,15 +126,21 @@ class HubController
|
||||
// First step: prepare the datamodel, if it fails, roll-back
|
||||
$aSelectedExtensionDirs = utils::ReadParam('extension_dirs', [], false, utils::ENUM_SANITIZATION_FILTER_MODULE_CODE);
|
||||
|
||||
$oRuntimeEnv = new HubRunTimeEnvironment('production', false); // use a temp environment: production-build
|
||||
$oRuntimeEnv = new HubRunTimeEnvironment(ITOP_DEFAULT_ENV, false); // use a temp environment: production-build
|
||||
$oRuntimeEnv->MoveSelectedExtensions(APPROOT.'/data/downloaded-extensions/', $aSelectedExtensionDirs);
|
||||
|
||||
$oConfig = new Config(APPCONF.'production/'.ITOP_CONFIG_FILE);
|
||||
$oExtensionMap = iTopExtensionsMap::GetExtensionsMap($oRuntimeEnv->GetBuildEnv());
|
||||
$aPreviousRemoteExtensions = $oExtensionMap->GetExtensionsFromDir(APPROOT.'data/'.$oRuntimeEnv->GetFinalEnv().'-modules/') ?: [];
|
||||
$aCurrentRemoteExtensions = $oExtensionMap->GetExtensionsFromDir(APPROOT.'data/'.$oRuntimeEnv->GetBuildEnv().'-modules/') ?: [];
|
||||
$aAddedExtensions = array_diff($aCurrentRemoteExtensions, $aPreviousRemoteExtensions);
|
||||
|
||||
$sBuildConfigFile = APPCONF.ITOP_DEFAULT_ENV.'/'.ITOP_CONFIG_FILE;
|
||||
$oConfig = new Config($sBuildConfigFile);
|
||||
if ($oConfig->Get('demo_mode')) {
|
||||
throw new Exception('Sorry the installation of extensions is not allowed in demo mode');
|
||||
}
|
||||
|
||||
$oRuntimeEnv->CompileFrom('production'); // WARNING symlinks does not seem to be compatible with manual Commit
|
||||
$oRuntimeEnv->CompileFrom(ITOP_DEFAULT_ENV, aAddedExtensions: array_keys($aAddedExtensions)); // WARNING symlinks does not seem to be compatible with manual Commit
|
||||
$oRuntimeEnv->UpdateIncludes($oConfig);
|
||||
|
||||
$oRuntimeEnv->InitDataModel($oConfig, true /* model only */);
|
||||
|
||||
@@ -24,8 +24,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Menu:Incident:Shortcuts+' => 'Ярлыки',
|
||||
'Menu:Incident:MyIncidents' => 'Назначенные мне',
|
||||
'Menu:Incident:MyIncidents+' => 'Инциденты, назначенные мне (в качестве агента)',
|
||||
'Menu:Incident:MySupportIncidents' => 'Reported by me~~',
|
||||
'Menu:Incident:MySupportIncidents+' => 'Non closed incidents where I am the caller~~',
|
||||
'Menu:Incident:MySupportIncidents' => 'Заявленные мной',
|
||||
'Menu:Incident:MySupportIncidents+' => 'Незакрытые инциденты, в которых я являюсь инициатором',
|
||||
'Menu:Incident:EscalatedIncidents' => 'Эскалированные',
|
||||
'Menu:Incident:EscalatedIncidents+' => 'Эскалированные инциденты',
|
||||
'Menu:Incident:OpenIncidents' => 'Открытые',
|
||||
@@ -102,10 +102,10 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Incident/Attribute:urgency/Value:4+' => 'Низкая',
|
||||
'Class:Incident/Attribute:origin' => 'Источник',
|
||||
'Class:Incident/Attribute:origin+' => '',
|
||||
'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: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' => 'Мониторинг',
|
||||
@@ -142,10 +142,10 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:Incident/Attribute:tto+' => '',
|
||||
'Class:Incident/Attribute:ttr' => 'TTR',
|
||||
'Class:Incident/Attribute:ttr+' => '',
|
||||
'Class:Incident/Attribute:tto_time_spent' => 'TTO time spent~~',
|
||||
'Class:Incident/Attribute:tto_time_spent+' => '~~',
|
||||
'Class:Incident/Attribute:ttr_time_spent' => 'TTR time spent~~',
|
||||
'Class:Incident/Attribute:ttr_time_spent+' => '~~',
|
||||
'Class:Incident/Attribute:tto_time_spent' => 'Затрачено времени (TTO)',
|
||||
'Class:Incident/Attribute:tto_time_spent+' => '',
|
||||
'Class:Incident/Attribute:ttr_time_spent' => 'Затрачено времени (TTR)',
|
||||
'Class:Incident/Attribute:ttr_time_spent+' => '',
|
||||
'Class:Incident/Attribute:tto_escalation_deadline' => 'Срок TTO',
|
||||
'Class:Incident/Attribute:tto_escalation_deadline+' => 'Крайний срок назаначения агента (принятия в работу) по текущему SLA',
|
||||
'Class:Incident/Attribute:sla_tto_passed' => 'SLA TTO пропущено',
|
||||
|
||||
@@ -35,17 +35,19 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Menu:Incident:Shortcuts+' => '',
|
||||
'Menu:Incident:MyIncidents' => '分配给我的事件',
|
||||
'Menu:Incident:MyIncidents+' => '分配给我的事件',
|
||||
'Menu:Incident:MySupportIncidents' => 'Reported by me~~',
|
||||
'Menu:Incident:MySupportIncidents+' => 'Non closed incidents where I am the caller~~',
|
||||
'Menu:Incident:MySupportIncidents' => '由我报告的事件',
|
||||
'Menu:Incident:MySupportIncidents+' => '由我发起且尚未关闭的的事件',
|
||||
'Menu:Incident:EscalatedIncidents' => '已升级的事件',
|
||||
'Menu:Incident:EscalatedIncidents+' => '已升级的事件',
|
||||
'Menu:Incident:OpenIncidents' => '所有打开的事件',
|
||||
'Menu:Incident:OpenIncidents+' => '所有打开的事件',
|
||||
'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' => '打开的事件 (按客户)',
|
||||
'UI-IncidentManagementOverview-OpenIncidentByStatus' => '待处理的事件 (按状态)',
|
||||
'UI-IncidentManagementOverview-OpenIncidentByAgent' => '待处理的事件 (按办理人)',
|
||||
'UI-IncidentManagementOverview-OpenIncidentByCustomer' => '待处理的事件 (按客户)',
|
||||
'Class:Incident/Method:UpdateChildTicketWith:public_log' => '<i><u>来自父级事件的公共日志 %2$s:</u></i><br><br>',
|
||||
'Class:Incident/Method:UpdateChildTicketWith:private_log' => '<i>来自父级事件的私有日志 [[Incident:%1$s]]:</i><br><br>',
|
||||
]);
|
||||
|
||||
// Dictionnay conventions
|
||||
@@ -245,5 +247,5 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
|
||||
'Class:Incident/Method:ResolveChildTickets' => '解决子工单',
|
||||
'Class:Incident/Method:ResolveChildTickets+' => '递归解决子工单 (自动解决), 并调整相关字段与父级工单保持一致: 服务, 团队, 办理人, 解决方案',
|
||||
'Tickets:Related:OpenIncidents' => '打开的事件',
|
||||
'Tickets:Related:OpenIncidents' => '待处理的事件',
|
||||
]);
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<lnkErrorToFunctionalCI alias="lnkErrorToFunctionalCI" id="4">
|
||||
<functionalci_id><![CDATA[SELECT FunctionalCI WHERE name='Server1']]></functionalci_id>
|
||||
<error_id>2</error_id>
|
||||
</lnkErrorToFunctionalCI>
|
||||
<lnkErrorToFunctionalCI alias="lnkErrorToFunctionalCI" id="1">
|
||||
<functionalci_id><![CDATA[SELECT FunctionalCI WHERE name='Server2']]></functionalci_id>
|
||||
<error_id>2</error_id>
|
||||
</lnkErrorToFunctionalCI>
|
||||
<lnkErrorToFunctionalCI alias="lnkErrorToFunctionalCI" id="2">
|
||||
<functionalci_id><![CDATA[SELECT FunctionalCI WHERE name='Server3']]></functionalci_id>
|
||||
<error_id>2</error_id>
|
||||
</lnkErrorToFunctionalCI>
|
||||
<lnkErrorToFunctionalCI alias="lnkErrorToFunctionalCI" id="3">
|
||||
<functionalci_id><![CDATA[SELECT FunctionalCI WHERE name='Server4']]></functionalci_id>
|
||||
<error_id>2</error_id>
|
||||
</lnkErrorToFunctionalCI>
|
||||
</Set>
|
||||
@@ -0,0 +1,132 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<KnownError alias="KnownError" id="1">
|
||||
<name>Verminderte VM-Leistung auf ESXi-8.0U2-Hosts nach dem Update auf vCenter Server 8.0U2b</name>
|
||||
<org_id>3</org_id>
|
||||
<problem_id>0</problem_id>
|
||||
<symptom>- Hohe Latenz (bis zu 500 ms) bei Speicher-Lese-/Schreibvorgängen für VMs auf ESXi-8.0U2-Hosts.
|
||||
- vCenter-Alarme:
|
||||
+ "Storage device latency is high" (Schwellwert überschritten: > 30 ms).
|
||||
+ "Virtual machine disk I/O latency is high".
|
||||
- Auswirkungen auf Anwendungen:
|
||||
+ Verlangsamungen bei Datenbanken (SQL, Oracle).
|
||||
+ Timeouts in kritischen Anwendungen (z. B. ERP, SAP).
|
||||
- Zeitraum des Auftretens: Seit dem Update von vCenter Server auf Version 8.0U2b (ausgerollt am 10. Juli 2026).
|
||||
|
||||
Betroffene Umgebung:
|
||||
- ESXi-Hosts: 5 Server (Cluster PROD-01).
|
||||
- Storage: Dell EMC PowerStore 5000 (über iSCSI verbunden).
|
||||
- vCenter Server: Version 8.0U2b (Build 21513536).</symptom>
|
||||
<root_cause>Kompatibilitätsproblem zwischen:
|
||||
- Dem nativen iSCSI-Treiber in ESXi 8.0U2 (vmw_iscsi) und vCenter Server 8.0U2b.
|
||||
- Einem bekannten Fehler im NMP-(Native Multi-Pathing)-Storage-Scheduler, der nach dem vCenter-Update zu fehlerhafter Multipath-Verwaltung führt.
|
||||
|
||||
VMware-Referenz:
|
||||
- KB 90827 (ähnlich, aber nicht identisch).
|
||||
- ESXi-Logs: Wiederholte Meldungen "NMP: nmp_DeviceRequestFastDeviceProbe: NMP device state in doubt" in /var/log/vmkernel.log.</root_cause>
|
||||
<workaround>Option 1: NMP-Dienst zurücksetzen (temporär)
|
||||
1. Per SSH auf jeden betroffenen ESXi-Host verbinden.
|
||||
2. Folgende Befehle ausführen:
|
||||
esxcli storage nmp device list # Betroffene Geräte auflisten
|
||||
esxcli storage nmp device set --device <NAA_ID> --state in_use # Aktiven Pfad erzwingen
|
||||
3. Die betroffenen VMs neu starten. ⚠️ Effekt: Löst das Problem für 24–48 Stunden, danach tritt die Latenz nach Host-Neustart erneut auf.
|
||||
|
||||
Option 2: Multipathing für betroffene LUNs deaktivieren
|
||||
1. In vCenter zu: Host > Configure > Storage > Storage Devices navigieren.
|
||||
2. Betroffene LUN auswählen > Edit Multipathing Policy > "Fixed" wählen (statt "Most Recently Used"). ⚠️ Risiko: Redundanzverlust bei Ausfall eines Pfads.
|
||||
|
||||
Option 3: Rollback von vCenter auf Version 8.0U2a
|
||||
- vCenter auf Version 8.0U2a zurücksetzen (Build 21495409).
|
||||
- Auswirkung: Verlust von Funktionen aus 8.0U2b (z. B. Sicherheitsverbesserungen).</workaround>
|
||||
<solution>- Maßnahme: VMware ESXi-Patch 8.0U2c anwenden (Patch ESXi80U2c-21567894), der den Fehler im NMP-Scheduler behebt.
|
||||
- Zuständiges Team: Virtualization + Storage Team.
|
||||
- Geplantes Datum: 18. Juli 2026 (geplantes Wartungsfenster).
|
||||
- Vorgehen:
|
||||
1. ESXi-Hosts nacheinander in den Wartungsmodus versetzen.
|
||||
2. Patch über vSphere Lifecycle Manager (vLCM) einspielen.
|
||||
3. Hosts neu starten und die Leistung prüfen.</solution>
|
||||
<error_code>"Storage device latency is high" "Virtual machine disk I/O latency is high"</error_code>
|
||||
<domain>Application</domain>
|
||||
<vendor>VMWare</vendor>
|
||||
<model>ESXi</model>
|
||||
<version>8.0U2</version>
|
||||
</KnownError>
|
||||
<KnownError alias="KnownError" id="2">
|
||||
<name>Apache HTTP Server (apache2) stürzt nach Kernel-Update (5.15.0-86-generic) auf Ubuntu-22.04-LTS-Servern zufällig mit 'Segmentation Fault' ab</name>
|
||||
<org_id>2</org_id>
|
||||
<problem_id>0</problem_id>
|
||||
<symptom>- Der Apache2-Dienst stürzt plötzlich ab, ohne eindeutige Logs in /var/log/apache2/error.log.
|
||||
- System-Logs (/var/log/syslog) zeigen:
|
||||
Jul 14 08:45:23 web-server-01 kernel: [12345.678901] apache2[12345]: segfault at 7f8e12345678 ip 00007f8e12345678 sp 00007ffd12345678 error 4 in libapr-1.so.0.7.0[7f8e12345000+20000]
|
||||
|
||||
- Auswirkungen für Benutzer:
|
||||
+ Totalausfall der Website (HTTP 503 Service Unavailable).
|
||||
+ Durchschnittliche Ausfallzeit pro Vorfall: 5–10 Minuten (manueller Neustart erforderlich).
|
||||
|
||||
- Häufigkeit: 2–3 Mal pro Tag seit dem 12. Juli 2026.
|
||||
|
||||
- Betroffene Umgebung:
|
||||
+ Server: 3 Webserver (web-server-01, web-server-02, web-server-03).
|
||||
+ Betriebssystem: Ubuntu 22.04 LTS.
|
||||
+ Kernel-Version: 5.15.0-86-generic (aktualisiert am 12. Juli 2026).
|
||||
+ Apache-Version: 2.4.52.
|
||||
+ Geladene Apache-Module: mod_ssl, mod_rewrite, mod_php8.1, mod_security2.</symptom>
|
||||
<root_cause>- Konflikt zwischen Linux-Kernel 5.15.0-86-generic und mod_security2 (Version 2.9.5):
|
||||
+ Kernel 5.15.0-86 führt eine Änderung im Speichermanagement für Multi-Thread-Prozesse ein.
|
||||
+ Das Modul mod_security2 (für WAF-Sicherheit) ist mit diesem Update nicht kompatibel und verursacht einen Segmentation Fault (ungültiger Speicherzugriff).
|
||||
|
||||
- Nachweise:
|
||||
+ Das Problem verschwindet, wenn mod_security2 deaktiviert wird.
|
||||
+ Das Problem tritt auf Servern mit Kernel 5.15.0-82-generic (Vorversion) nicht auf.
|
||||
|
||||
- Externe Referenzen:
|
||||
+ Gemeldeter Fehler in Apache JIRA (ähnlich).
|
||||
+ Diskussion auf Server Fault (Community).</root_cause>
|
||||
<workaround>- Option 1: mod_security2 vorübergehend deaktivieren
|
||||
1. Apache-Konfigurationsdatei bearbeiten:
|
||||
sudo nano /etc/apache2/mods-enabled/security2.conf
|
||||
2 . Folgende Zeile auskommentieren:
|
||||
# SecRuleEngine On
|
||||
3. Apache neu starten:
|
||||
sudo systemctl restart apache2
|
||||
|
||||
⚠️ Auswirkung: Der Webserver wird anfälliger für Angriffe (z. B. SQL-Injection, XSS).
|
||||
✅ Vorteil: Das Problem wird sofort behoben.
|
||||
|
||||
- Option 2: Auf den vorherigen Kernel zurückgehen (5.15.0-82-generic)
|
||||
1. Server mit dem älteren Kernel neu starten:
|
||||
sudo reboot
|
||||
2. In GRUB Kernel 5.15.0-82-generic auswählen.⚠️ Auswirkung: Sicherheits-Patches aus Kernel 5.15.0-86 fehlen.
|
||||
|
||||
- Option 3: Apache-Threads begrenzen
|
||||
1. Apache-Konfiguration anpassen (/etc/apache2/apache2.conf):
|
||||
StartServers 2
|
||||
MinSpareThreads 5
|
||||
MaxSpareThreads 10
|
||||
ThreadsPerChild 5
|
||||
MaxRequestWorkers 20
|
||||
2. Apache neu starten:
|
||||
sudo systemctl restart apache2
|
||||
⚠️ Auswirkung: Reduzierte Leistung (weniger gleichzeitige Anfragen).</workaround>
|
||||
<solution>- Maßnahme: Upgrade von mod_security2 auf Version 2.9.6 (kompatibel mit Kernel 5.15.0-86).
|
||||
+ Korrigierte Version: libapache2-mod-security2 2.9.6-1ubuntu0.22.04.1 (im Ubuntu-Proposed-Repository verfügbar).
|
||||
- Zuständiges Team: DevOps + Security Team.
|
||||
- Geplantes Datum: 17. Juli 2026 (Wartungsfenster: 02:00–04:00 UTC).
|
||||
- Vorgehen:
|
||||
1. Proposed-Repository hinzufügen:
|
||||
sudo add-apt-repository ppa:ubuntu-security-proposed
|
||||
sudo apt update
|
||||
2. mod_security2 aktualisieren:
|
||||
sudo apt install --only-upgrade libapache2-mod-security2
|
||||
3. Apache neu starten:
|
||||
sudo systemctl restart apache2
|
||||
4. Version prüfen:
|
||||
apache2ctl -M | grep security</solution>
|
||||
<error_code></error_code>
|
||||
<domain>Application</domain>
|
||||
<vendor>Linux</vendor>
|
||||
<model>Apache</model>
|
||||
<version>2.4.52</version>
|
||||
</KnownError>
|
||||
</Set>
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<KnownError alias="KnownError" id="1">
|
||||
<name>Degraded VM Performance on ESXi 8.0U2 Hosts After vCenter Server 8.0U2b Update</name>
|
||||
<org_id>3</org_id>
|
||||
<problem_id>0</problem_id>
|
||||
<symptom>- High latency (up to 500 ms) on storage read/write operations for VMs hosted on ESXi 8.0U2 hosts.
|
||||
- vCenter Alarms:
|
||||
+ "Storage device latency is high" (Threshold exceeded: > 30 ms).
|
||||
+ "Virtual machine disk I/O latency is high".
|
||||
- Application Impact:
|
||||
+ Slowdowns in databases (SQL, Oracle).
|
||||
+ Timeouts in critical applications (e.g., ERP, SAP).
|
||||
- Occurrence Period: Since the vCenter Server update to version 8.0U2b (deployed on July 10, 2026).
|
||||
|
||||
Affected Environment:
|
||||
- ESXi Hosts: 5 servers (PROD-01 Cluster).
|
||||
- Storage: Dell EMC PowerStore 5000 (connected via iSCSI).
|
||||
- vCenter Server: Version 8.0U2b (build 21513536).</symptom>
|
||||
<root_cause>Compatibility issue between:
|
||||
- The native iSCSI driver in ESXi 8.0U2 (vmw_iscsi) and vCenter Server 8.0U2b.
|
||||
- A known bug in the NMP (Native Multi-Pathing) storage scheduler causing incorrect multipathing management after the vCenter update.
|
||||
|
||||
VMware Reference:
|
||||
- KB 90827 (similar but not identical).
|
||||
- ESXi Logs: Repeated messages "NMP: nmp_DeviceRequestFastDeviceProbe: NMP device state in doubt" in /var/log/vmkernel.log.</root_cause>
|
||||
<workaround>Option 1: Reset the NMP Service (Temporary)
|
||||
1. SSH into each affected ESXi host.
|
||||
2. Run the following commands:
|
||||
esxcli storage nmp device list # List affected devices
|
||||
esxcli storage nmp device set --device <NAA_ID> --state in_use # Force active path
|
||||
3. Restart the affected VMs. ⚠️ Effect: Resolves the issue for 24–48 hours, but latency reappears after a host reboot.
|
||||
|
||||
Option 2: Disable Multipathing for Affected LUNs
|
||||
1. In vCenter, navigate to: Host > Configure > Storage > Storage Devices.
|
||||
2. Select the affected LUN > Edit Multipathing Policy > Choose "Fixed" (instead of "Most Recently Used"). ⚠️ Risk: Loss of redundancy if one path fails.
|
||||
|
||||
Option 3: Roll Back vCenter to Version 8.0U2a
|
||||
- Rollback vCenter to version 8.0U2a (build 21495409).
|
||||
- Impact: Loss of 8.0U2b features (e.g., security improvements).</workaround>
|
||||
<solution>- Action: Apply the VMware ESXi 8.0U2c patch (patch ESXi80U2c-21567894), which fixes the NMP scheduler bug.
|
||||
- Responsible Team: Virtualization + Storage Team.
|
||||
- Planned Date: July 18, 2026 (scheduled maintenance window).
|
||||
- Procedure:
|
||||
1. Place ESXi hosts in maintenance mode one by one.
|
||||
2. Apply the patch via vSphere Lifecycle Manager (vLCM).
|
||||
3. Reboot hosts and verify performance.</solution>
|
||||
<error_code>"Storage device latency is high" "Virtual machine disk I/O latency is high"</error_code>
|
||||
<domain>Application</domain>
|
||||
<vendor>VMWare</vendor>
|
||||
<model>ESXi</model>
|
||||
<version>8.0U2</version>
|
||||
</KnownError>
|
||||
<KnownError alias="KnownError" id="2">
|
||||
<name>Apache HTTP Server (apache2) Crashes Randomly with 'Segmentation Fault' on Ubuntu 22.04 LTS Servers After Kernel Update (5.15.0-86-generic)</name>
|
||||
<org_id>2</org_id>
|
||||
<problem_id>0</problem_id>
|
||||
<symptom>- The Apache2 service crashes suddenly without clear logs in /var/log/apache2/error.log.
|
||||
- System logs (/var/log/syslog) show:
|
||||
Jul 14 08:45:23 web-server-01 kernel: [12345.678901] apache2[12345]: segfault at 7f8e12345678 ip 00007f8e12345678 sp 00007ffd12345678 error 4 in libapr-1.so.0.7.0[7f8e12345000+20000]
|
||||
|
||||
- User Impact:
|
||||
+ Total unavailability of the website (HTTP 503 Service Unavailable).
|
||||
+ Average downtime per incident: 5–10 minutes (manual restart required).
|
||||
|
||||
- Frequency: 2–3 times per day since July 12, 2026.
|
||||
|
||||
- Affected Environment:
|
||||
+ Servers: 3 web servers (web-server-01, web-server-02, web-server-03).
|
||||
+ Operating System: Ubuntu 22.04 LTS.
|
||||
+ Kernel Version: 5.15.0-86-generic (updated on July 12, 2026).
|
||||
+ Apache Version: 2.4.52.
|
||||
+ Loaded Apache Modules: mod_ssl, mod_rewrite, mod_php8.1, mod_security2.</symptom>
|
||||
<root_cause>- Conflict between Linux kernel 5.15.0-86-generic and mod_security2 (version 2.9.5):
|
||||
+ The 5.15.0-86 kernel introduces a change in memory management for multi-threaded processes.
|
||||
+ The mod_security2 module (used for WAF security) is not compatible with this update, causing a segmentation fault (invalid memory access).
|
||||
|
||||
- Evidence:
|
||||
+ The issue disappears when mod_security2 is disabled.
|
||||
+ The issue does not occur on servers running kernel 5.15.0-82-generic (previous version).
|
||||
|
||||
- External References:
|
||||
+ Reported bug on Apache JIRA (similar).
|
||||
+ Discussion on Server Fault (community).</root_cause>
|
||||
<workaround>- Option 1: Temporarily Disable mod_security2
|
||||
1. Edit the Apache configuration file:
|
||||
sudo nano /etc/apache2/mods-enabled/security2.conf
|
||||
2 . Comment out the line:
|
||||
# SecRuleEngine On
|
||||
3. Restart Apache:
|
||||
sudo systemctl restart apache2
|
||||
|
||||
⚠️ Impact: The web server becomes vulnerable to attacks (e.g., SQL injection, XSS).
|
||||
✅ Benefits: Immediately resolves the issue.
|
||||
|
||||
- Option 2: Revert to the Previous Kernel (5.15.0-82-generic)
|
||||
1. Reboot the server with the older kernel:
|
||||
sudo reboot
|
||||
2. In GRUB, select kernel 5.15.0-82-generic.⚠️ Impact: The server misses security patches from kernel 5.15.0-86.
|
||||
|
||||
- Option 3: Limit Apache Threads
|
||||
1. Modify Apache configuration (/etc/apache2/apache2.conf):
|
||||
StartServers 2
|
||||
MinSpareThreads 5
|
||||
MaxSpareThreads 10
|
||||
ThreadsPerChild 5
|
||||
MaxRequestWorkers 20
|
||||
2. Restart Apache:
|
||||
sudo systemctl restart apache2
|
||||
⚠️ Impact: Reduced performance (fewer concurrent requests handled).</workaround>
|
||||
<solution>- Action: Upgrade mod_security2 to version 2.9.6 (compatible with kernel 5.15.0-86).
|
||||
+ Fixed Version: libapache2-mod-security2 2.9.6-1ubuntu0.22.04.1 (available in Ubuntu proposed repository).
|
||||
- Responsible Team: DevOps + Security Team.
|
||||
- Planned Date: July 17, 2026 (maintenance window: 02:00–04:00 UTC).
|
||||
- Procedure:
|
||||
1. Add the proposed repository:
|
||||
sudo add-apt-repository ppa:ubuntu-security-proposed
|
||||
sudo apt update
|
||||
2. Upgrade mod_security2:
|
||||
sudo apt install --only-upgrade libapache2-mod-security2
|
||||
3. Restart Apache:
|
||||
sudo systemctl restart apache2
|
||||
4. Verify the version:
|
||||
apache2ctl -M | grep security</solution>
|
||||
<error_code></error_code>
|
||||
<domain>Application</domain>
|
||||
<vendor>Linux</vendor>
|
||||
<model>Apache</model>
|
||||
<version>2.4.52</version>
|
||||
</KnownError>
|
||||
</Set>
|
||||
@@ -0,0 +1,131 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<KnownError alias="KnownError" id="1">
|
||||
<name>Dégradation des performances des VMs sur les hôtes ESXi 8.0U2 après mise à jour du vCenter Server 8.0U2b</name>
|
||||
<org_id>3</org_id>
|
||||
<problem_id>0</problem_id>
|
||||
<symptom>- Latence élevée (jusqu’à 500 ms) sur les opérations de stockage (lecture/écriture) pour les VMs hébergées sur les hôtes ESXi 8.0U2.
|
||||
- Alarmes vCenter:
|
||||
+ "Storage device latency is high" (Threshold exceeded: > 30 ms).
|
||||
+ "Virtual machine disk I/O latency is high".
|
||||
- Impact sur les applications :
|
||||
+ Ralentissements des bases de données (SQL, Oracle).
|
||||
+ Timeouts sur les applications critiques (ex. : ERP, SAP).
|
||||
- Période d'occurrence : Depuis la mise à jour du vCenter Server vers la version 8.0U2b (déployée le 10/07/2026).
|
||||
|
||||
Environnement affecté :
|
||||
- Hôtes ESXi : 5 serveurs (Cluster PROD-01).
|
||||
- Stockage : Baie Dell EMC PowerStore 5000 (connectée en iSCSI).
|
||||
- vCenter Server : Version 8.0U2b (build 21513536).</symptom>
|
||||
<root_cause>Problème de compatibilité entre :
|
||||
- Le pilote iSCSI natif d’ESXi 8.0U2 (vmw_iscsi) et la version 8.0U2b du vCenter Server.
|
||||
- Un bug connu dans le scheduler de stockage NMP (Native Multi-Pathing) qui provoque une mauvaise gestion des chemins multiples (multipathing) après la mise à jour du vCenter.
|
||||
|
||||
VMware Reference:
|
||||
- KB 90827 (similaire, mais non identique).
|
||||
- Log ESXi : Messages répétés "NMP: nmp_DeviceRequestFastDeviceProbe: NMP device state in doubt" dans /var/log/vmkernel.log.</root_cause>
|
||||
<workaround>Option 1: Réinitialiser le service NMP (temporaire)
|
||||
1. Se connecter en SSH à chaque hôte ESXi affecté.
|
||||
2. Exécuter les commandes :
|
||||
esxcli storage nmp device list # List affected devices
|
||||
esxcli storage nmp device set --device <NAA_ID> --state in_use # Force active path
|
||||
3. Redémarrer les VMs concernées. ⚠️ Effet : Résout le problème pendant 24–48h, mais la latence réapparaît après un redémarrage de l’hôte.
|
||||
|
||||
Option 2: Désactiver le multipathing pour les LUNs concernés
|
||||
1. Dans vCenter, aller dans: Host > Configure > Storage > Storage Devices.
|
||||
2. Sélectionner le LUN concerné > Edit Multipathing Policy > Choisir "Fixed" (au lieu de "Most Recently Used"). ⚠️ Risque : Perte de redondance en cas de panne d’un chemin.
|
||||
|
||||
Option 3: Revenir à la version précédente de vCenter (8.0U2a)
|
||||
- Rollback du vCenter vers la version 8.0U2a (build 21495409).
|
||||
- Impact : Perte des fonctionnalités de 8.0U2b (ex. : améliorations de sécurité).</workaround>
|
||||
<solution>- Action : Appliquer le correctif VMware ESXi 8.0U2c (patch ESXi80U2c-21567894), qui corrige le bug du scheduler NMP.
|
||||
- Responsable : Équipe Virtualisation + Stockage.
|
||||
- Date prévue : 18 juillet 2026 (fenêtre de maintenance planifiée).
|
||||
- Procédure:
|
||||
1. Mettre en maintenance les hôtes ESXi un par un.
|
||||
2. Appliquer le patch via vSphere Lifecycle Manager (vLCM).
|
||||
3. Redémarrer les hôtes et vérifier les performances.</solution>
|
||||
<error_code>"Storage device latency is high" "Virtual machine disk I/O latency is high"</error_code>
|
||||
<domain>Application</domain>
|
||||
<vendor>VMWare</vendor>
|
||||
<model>ESXi</model>
|
||||
<version>8.0U2</version>
|
||||
</KnownError>
|
||||
<KnownError alias="KnownError" id="2">
|
||||
<name>Service Apache HTTP Server (apache2) plante aléatoirement avec l'erreur 'Segmentation Fault' sur les serveurs Ubuntu 22.04 LTS après mise à jour du noyau (5.15.0-86-generic)</name>
|
||||
<org_id>2</org_id>
|
||||
<problem_id>0</problem_id>
|
||||
<symptom>- Le service Apache2 s'arrête brutalement sans journalisation claire dans /var/log/apache2/error.log.
|
||||
- Message dans les logs système (/var/log/syslog):
|
||||
Jul 14 08:45:23 web-server-01 kernel: [12345.678901] apache2[12345]: segfault at 7f8e12345678 ip 00007f8e12345678 sp 00007ffd12345678 error 4 in libapr-1.so.0.7.0[7f8e12345000+20000]
|
||||
|
||||
- Impact utilisateur:
|
||||
+ Indisponibilité totale du site web (HTTP 503 Service Unavailable).
|
||||
+ Durée moyenne de l'incident : 5 à 10 minutes (redémarrage manuel nécessaire).
|
||||
|
||||
- Fréquence : 2 à 3 fois par jour depuis le 12 juillet 2026.
|
||||
|
||||
- Environnement affecté :
|
||||
+ Serveurs : 3 serveurs web (web-server-01, web-server-02, web-server-03).
|
||||
+ Système d'exploitation : Ubuntu 22.04 LTS.
|
||||
+ Version du noyau : 5.15.0-86-generic (mis à jour le 12/07/2026).
|
||||
+ Version d'Apache : 2.4.52.
|
||||
+ Modules Apache chargés : mod_ssl, mod_rewrite, mod_php8.1, mod_security2.</symptom>
|
||||
<root_cause>- Conflit entre le noyau Linux 5.15.0-86-generic et le module mod_security2 (version 2.9.5) :
|
||||
+ Le noyau 5.15.0-86 introduit une modification dans la gestion de la mémoire pour les processus multi-threadés.
|
||||
+ Le module mod_security2 (utilisé pour la sécurité WAF) n'est pas compatible avec cette mise à jour, provoquant un segmentation fault (accès mémoire invalide).
|
||||
|
||||
- Preuve :
|
||||
+ Le problème disparaît lorsque mod_security2 est désactivé.
|
||||
+ Le problème n'existe pas sur les serveurs sous le noyau 5.15.0-82-generic (version précédente).
|
||||
|
||||
- Référence externe :
|
||||
+ Bug rapporté sur Apache JIRA (similaire).
|
||||
+ Discussion sur Server Fault (communauté).</root_cause>
|
||||
<workaround>- Option 1: Désactiver temporairement mod_security2
|
||||
1. Éditer le fichier de configuration Apache :
|
||||
sudo nano /etc/apache2/mods-enabled/security2.conf
|
||||
2 . Commenter la ligne :
|
||||
# SecRuleEngine On
|
||||
3. Redémarrer Apache:
|
||||
sudo systemctl restart apache2
|
||||
|
||||
⚠️ Le serveur web devient vulnérable aux attaques (ex. : SQL injection, XSS).
|
||||
✅ Avantages : Résout immédiatement le problème.
|
||||
|
||||
- Option 2: Revenir au noyau précédent (5.15.0-82-generic)
|
||||
1. Redémarrer le serveur avec l'ancien noyau:
|
||||
sudo reboot
|
||||
2. Dans le GRUB, sélectionner le noyau 5.15.0-82-generic.⚠️ Impact : Le serveur ne bénéficie pas des correctifs de sécurité du noyau 5.15.0-86.
|
||||
|
||||
- Option 3: Limiter le nombre de threads pour Apache
|
||||
1. Modifier la configuration Apache (/etc/apache2/apache2.conf) :
|
||||
StartServers 2
|
||||
MinSpareThreads 5
|
||||
MaxSpareThreads 10
|
||||
ThreadsPerChild 5
|
||||
MaxRequestWorkers 20
|
||||
2. Redémarrer Apache :
|
||||
sudo systemctl restart apache2
|
||||
⚠️ Impact : Réduction des performances (moins de requêtes simultanées gérées).</workaround>
|
||||
<solution>- Action: Mettre à jour mod_security2 vers la version 2.9.6 (compatible avec le noyau 5.15.0-86).
|
||||
+ Version corrigée : libapache2-mod-security2 2.9.6-1ubuntu0.22.04.1 (disponible dans les dépôts Ubuntu proposed).
|
||||
- Responsable : Équipe DevOps + Sécurité.
|
||||
- Date prévue : 17 juillet 2026 (fenêtre de maintenance de 02:00 à 04:00).
|
||||
- Procédure :
|
||||
1. Ajouter le dépôt proposed :
|
||||
sudo add-apt-repository ppa:ubuntu-security-proposed
|
||||
sudo apt update
|
||||
2. Mettre à jour mod_security2 :
|
||||
sudo apt install --only-upgrade libapache2-mod-security2
|
||||
3. Redémarrer Apache :
|
||||
sudo systemctl restart apache2
|
||||
4. Vérifier la version:
|
||||
apache2ctl -M | grep security</solution>
|
||||
<error_code></error_code>
|
||||
<domain>Application</domain>
|
||||
<vendor>Linux</vendor>
|
||||
<model>Apache</model>
|
||||
<version>2.4.52</version>
|
||||
</KnownError>
|
||||
</Set>
|
||||
@@ -15,27 +15,27 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:KnownError' => 'Известная ошибка',
|
||||
'Class:KnownError+' => 'Проблема, имеющая задокументированные корневую причину и обходное решение',
|
||||
'Class:KnownError/Attribute:name' => 'Название',
|
||||
'Class:KnownError/Attribute:name+' => 'This is expected to be a unique identifier within the Known Errors of this organization~~',
|
||||
'Class:KnownError/Attribute:name+' => 'Ожидается уникальный идентификатор в рамках известных ошибок этой организации',
|
||||
'Class:KnownError/Attribute:org_id' => 'Организация',
|
||||
'Class:KnownError/Attribute:org_id+' => 'Link the known error to the service provider in charge of handling them, or maybe to a customer organization if the error is specific to them~~',
|
||||
'Class:KnownError/Attribute:org_id+' => 'Свяжите известную ошибку с поставщиком услуг, отвечающим за её обработку, либо с организацией-заказчиком, если ошибка специфична для неё',
|
||||
'Class:KnownError/Attribute:cust_name' => 'Организация',
|
||||
'Class:KnownError/Attribute:cust_name+' => '',
|
||||
'Class:KnownError/Attribute:problem_id' => 'Проблема',
|
||||
'Class:KnownError/Attribute:problem_id+' => 'The problem which couldn\'t be solved immediately and has led to the creation of this known error~~',
|
||||
'Class:KnownError/Attribute:problem_id+' => 'Проблема, которую не удалось решить сразу и которая привела к созданию этой известной ошибки',
|
||||
'Class:KnownError/Attribute:problem_ref' => 'Проблема',
|
||||
'Class:KnownError/Attribute:problem_ref+' => '',
|
||||
'Class:KnownError/Attribute:symptom' => 'Проявление',
|
||||
'Class:KnownError/Attribute:symptom+' => 'What are the observable effects of this error?~~',
|
||||
'Class:KnownError/Attribute:symptom+' => 'Какие наблюдаемые последствия у этой ошибки?',
|
||||
'Class:KnownError/Attribute:root_cause' => 'Корневая причина',
|
||||
'Class:KnownError/Attribute:root_cause+' => 'What is the underlying cause of this error?~~',
|
||||
'Class:KnownError/Attribute:root_cause+' => 'Какова первопричина этой ошибки?',
|
||||
'Class:KnownError/Attribute:workaround' => 'Обходное решение',
|
||||
'Class:KnownError/Attribute:workaround+' => 'How to bypass the effects of this error until a proper solution is found?~~',
|
||||
'Class:KnownError/Attribute:workaround+' => 'Как обойти последствия этой ошибки до нахождения полноценного решения?',
|
||||
'Class:KnownError/Attribute:solution' => 'Решение',
|
||||
'Class:KnownError/Attribute:solution+' => 'What is the permanent solution for this error?~~',
|
||||
'Class:KnownError/Attribute:solution+' => 'В чём заключается окончательное решение этой ошибки?',
|
||||
'Class:KnownError/Attribute:error_code' => 'Код ошибки',
|
||||
'Class:KnownError/Attribute:error_code+' => 'If a specific error code is associated to this known error, specify it here~~',
|
||||
'Class:KnownError/Attribute:error_code+' => 'Если с этой известной ошибкой связан конкретный код ошибки, укажите его здесь',
|
||||
'Class:KnownError/Attribute:domain' => 'Домен',
|
||||
'Class:KnownError/Attribute:domain+' => 'Choose the technical domain related to this known error?~~',
|
||||
'Class:KnownError/Attribute:domain+' => 'Выберите технический домен, связанный с этой известной ошибкой',
|
||||
'Class:KnownError/Attribute:domain/Value:Application' => 'Приложение',
|
||||
'Class:KnownError/Attribute:domain/Value:Application+' => '',
|
||||
'Class:KnownError/Attribute:domain/Value:Desktop' => 'Рабочее окружение',
|
||||
@@ -45,11 +45,11 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:KnownError/Attribute:domain/Value:Server' => 'Сервер',
|
||||
'Class:KnownError/Attribute:domain/Value:Server+' => '',
|
||||
'Class:KnownError/Attribute:vendor' => 'Производитель',
|
||||
'Class:KnownError/Attribute:vendor+' => 'A free text field to identify the vendor of the CI(s) concerned by this known error~~',
|
||||
'Class:KnownError/Attribute:vendor+' => 'Произвольное текстовое поле для указания производителя КЕ, к которым относится эта известная ошибка',
|
||||
'Class:KnownError/Attribute:model' => 'Модель',
|
||||
'Class:KnownError/Attribute:model+' => 'The model of the CI(s) concerned by this known error~~',
|
||||
'Class:KnownError/Attribute:model+' => 'Модель КЕ, к которым относится эта известная ошибка',
|
||||
'Class:KnownError/Attribute:version' => 'Версия',
|
||||
'Class:KnownError/Attribute:version+' => 'The version of the CI(s) concerned by this known error~~',
|
||||
'Class:KnownError/Attribute:version+' => 'Версия КЕ, к которым относится эта известная ошибка',
|
||||
'Class:KnownError/Attribute:ci_list' => 'КЕ',
|
||||
'Class:KnownError/Attribute:ci_list+' => 'Связанный конфигурационные единицы',
|
||||
'Class:KnownError/Attribute:document_list' => 'Документы',
|
||||
@@ -63,7 +63,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkErrorToFunctionalCI' => 'Связь Известная ошибка/Функциональная КЕ',
|
||||
'Class:lnkErrorToFunctionalCI+' => 'Infra related to a known error',
|
||||
'Class:lnkErrorToFunctionalCI/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkErrorToFunctionalCI/Name' => '%1$s / %2$s',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id' => 'КЕ',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id+' => '',
|
||||
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name' => 'КЕ',
|
||||
@@ -83,7 +83,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:lnkDocumentToError' => 'Связь Документ/Известная ошибка',
|
||||
'Class:lnkDocumentToError+' => 'A link between a document and a known error',
|
||||
'Class:lnkDocumentToError/Name' => '%1$s / %2$s~~',
|
||||
'Class:lnkDocumentToError/Name' => '%1$s / %2$s',
|
||||
'Class:lnkDocumentToError/Attribute:document_id' => 'Документ',
|
||||
'Class:lnkDocumentToError/Attribute:document_id+' => '',
|
||||
'Class:lnkDocumentToError/Attribute:document_name' => 'Документ',
|
||||
@@ -98,7 +98,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Menu:ProblemManagement' => 'Управление проблемами',
|
||||
'Menu:ProblemManagement+' => 'An ITIL process that identifies root causes of incidents, documents Known Errors and FAQs, in order to reduce helpdesk workload~~',
|
||||
'Menu:ProblemManagement+' => 'Процесс ITIL, который выявляет первопричины инцидентов, документирует известные ошибки и FAQ, чтобы снизить нагрузку на службу поддержки',
|
||||
'Menu:Problem:Shortcuts' => 'Ярлыки',
|
||||
'Menu:NewError' => 'Новая известная ошибка',
|
||||
'Menu:NewError+' => 'Создать новую известную ошибку',
|
||||
|
||||
@@ -55,27 +55,27 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:KnownError' => '已知错误',
|
||||
'Class:KnownError+' => '记录一个已知错误',
|
||||
'Class:KnownError/Attribute:name' => '名称',
|
||||
'Class:KnownError/Attribute:name+' => 'This is expected to be a unique identifier within the Known Errors of this organization~~',
|
||||
'Class:KnownError/Attribute:name+' => '该名称将作为此组织内的已知问题的唯一标识符',
|
||||
'Class:KnownError/Attribute:org_id' => '客户',
|
||||
'Class:KnownError/Attribute:org_id+' => 'Link the known error to the service provider in charge of handling them, or maybe to a customer organization if the error is specific to them~~',
|
||||
'Class:KnownError/Attribute:org_id+' => '将已知问题关联至负责处理该问题的服务提供商. 若问题仅针对特定客户,则也可关联至对应的客户组织',
|
||||
'Class:KnownError/Attribute:cust_name' => '客户名称',
|
||||
'Class:KnownError/Attribute:cust_name+' => '',
|
||||
'Class:KnownError/Attribute:problem_id' => '相关问题',
|
||||
'Class:KnownError/Attribute:problem_id+' => 'The problem which couldn\'t be solved immediately and has led to the creation of this known error~~',
|
||||
'Class:KnownError/Attribute:problem_id+' => '由于问题无法立即解决,于是才导致了这个已知错误的创建',
|
||||
'Class:KnownError/Attribute:problem_ref' => '问题编号',
|
||||
'Class:KnownError/Attribute:problem_ref+' => '',
|
||||
'Class:KnownError/Attribute:symptom' => '现象',
|
||||
'Class:KnownError/Attribute:symptom+' => 'What are the observable effects of this error?~~',
|
||||
'Class:KnownError/Attribute:symptom+' => '该错误的可见的影响是什么?',
|
||||
'Class:KnownError/Attribute:root_cause' => '问题根源',
|
||||
'Class:KnownError/Attribute:root_cause+' => 'What is the underlying cause of this error?~~',
|
||||
'Class:KnownError/Attribute:root_cause+' => '该错误的底层原因是什么?',
|
||||
'Class:KnownError/Attribute:workaround' => '解决过程',
|
||||
'Class:KnownError/Attribute:workaround+' => 'How to bypass the effects of this error until a proper solution is found?~~',
|
||||
'Class:KnownError/Attribute:workaround+' => '如何规避该错误的影响直至找到适当的解决方案?',
|
||||
'Class:KnownError/Attribute:solution' => '解决方案',
|
||||
'Class:KnownError/Attribute:solution+' => 'What is the permanent solution for this error?~~',
|
||||
'Class:KnownError/Attribute:solution+' => '该错误的永久解决方案是什么?',
|
||||
'Class:KnownError/Attribute:error_code' => '错误编码',
|
||||
'Class:KnownError/Attribute:error_code+' => 'If a specific error code is associated to this known error, specify it here~~',
|
||||
'Class:KnownError/Attribute:error_code+' => '如果此已知错误关联到特定的错误编码,请在此指定',
|
||||
'Class:KnownError/Attribute:domain' => '类型',
|
||||
'Class:KnownError/Attribute:domain+' => 'Choose the technical domain related to this known error?~~',
|
||||
'Class:KnownError/Attribute:domain+' => '请选择该错误相关的技术领域',
|
||||
'Class:KnownError/Attribute:domain/Value:Application' => '应用',
|
||||
'Class:KnownError/Attribute:domain/Value:Application+' => '',
|
||||
'Class:KnownError/Attribute:domain/Value:Desktop' => '桌面',
|
||||
@@ -85,15 +85,15 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:KnownError/Attribute:domain/Value:Server' => '服务器',
|
||||
'Class:KnownError/Attribute:domain/Value:Server+' => '',
|
||||
'Class:KnownError/Attribute:vendor' => '厂商',
|
||||
'Class:KnownError/Attribute:vendor+' => 'A free text field to identify the vendor of the CI(s) concerned by this known error~~',
|
||||
'Class:KnownError/Attribute:vendor+' => '这个已知错误相关的厂商',
|
||||
'Class:KnownError/Attribute:model' => '型号',
|
||||
'Class:KnownError/Attribute:model+' => 'The model of the CI(s) concerned by this known error~~',
|
||||
'Class:KnownError/Attribute:model+' => '这个已知错误相关的配置项型号',
|
||||
'Class:KnownError/Attribute:version' => '版本',
|
||||
'Class:KnownError/Attribute:version+' => 'The version of the CI(s) concerned by this known error~~',
|
||||
'Class:KnownError/Attribute:version+' => '这个已知错误相关的配置项版本',
|
||||
'Class:KnownError/Attribute:ci_list' => '配置项',
|
||||
'Class:KnownError/Attribute:ci_list+' => '此已知错误相关的所有配置项',
|
||||
'Class:KnownError/Attribute:ci_list+' => '这个已知错误相关的所有配置项',
|
||||
'Class:KnownError/Attribute:document_list' => '文档',
|
||||
'Class:KnownError/Attribute:document_list+' => '此已知错误相关的所有文档',
|
||||
'Class:KnownError/Attribute:document_list+' => '这个已知错误相关的所有文档',
|
||||
]);
|
||||
|
||||
//
|
||||
|
||||
@@ -25,6 +25,8 @@ SetupWebPage::AddModule(
|
||||
//'data.struct.itop-knownerror-mgmt.xml',
|
||||
],
|
||||
'data.sample' => [
|
||||
'data/data.sample.knownerror.en_us.xml',
|
||||
'data/data.sample.errortofunctionalci.xml',
|
||||
],
|
||||
|
||||
// Documentation
|
||||
|
||||
@@ -11,23 +11,23 @@
|
||||
*
|
||||
*/
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'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~~',
|
||||
'Menu:CreateMailbox' => 'Создать почтовый ящик…',
|
||||
'Menu:OAuthClient' => 'Доступ к почте через OAuth',
|
||||
'Menu:OAuthClient+' => '',
|
||||
'Menu:GenerateTokens' => 'Сгенерировать токен доступа…',
|
||||
'Menu:RegenerateTokens' => 'Перегенерировать токен доступа…',
|
||||
'itop-oauth-client/Operation:CreateMailBox/Title' => 'Создание почтового ящика',
|
||||
'itop-oauth-client:UsedForSMTP' => 'Этот клиент OAuth используется для SMTP',
|
||||
'itop-oauth-client:TestSMTP' => 'Тест отправки email',
|
||||
'itop-oauth-client:MissingOAuthClient' => 'Отсутствует клиент OAuth для пользователя %1$s',
|
||||
'itop-oauth-client:Message:MissingToken' => 'Сгенерируйте токен доступа перед использованием этого клиента OAuth',
|
||||
'itop-oauth-client:Message:RegenerateToken' => 'Перегенерируйте токен доступа, чтобы учесть изменения',
|
||||
'itop-oauth-client:Message:TokenCreated' => 'Токен доступа создан',
|
||||
'itop-oauth-client:Message:TokenRecreated' => 'Токен доступа перегенерирован',
|
||||
'itop-oauth-client:Message:TokenError' => 'Токен доступа не сгенерирован из-за ошибки сервера',
|
||||
'OAuthClient:Name/UseForSMTPMustBeUnique' => 'Комбинация Логин (%1$s) и Использовать для SMTP (%2$s) уже используется другим клиентом OAuth',
|
||||
'OAuthClient:baseinfo' => 'Основная информация',
|
||||
'OAuthClient:scope' => 'Область доступа',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -35,36 +35,36 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'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:scope' => 'Scope~~',
|
||||
'Class:OAuthClient/Attribute:scope+' => '~~',
|
||||
'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+' => 'This url must be copied in the OAuth2 configuration of the provider
|
||||
Erase the field to recalculate default value~~',
|
||||
'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
|
||||
'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
|
||||
'Class:OAuthClient' => 'Доступ к почте через OAuth',
|
||||
'Class:OAuthClient/Attribute:provider' => 'Провайдер',
|
||||
'Class:OAuthClient/Attribute:provider+' => '',
|
||||
'Class:OAuthClient/Attribute:name' => 'Логин',
|
||||
'Class:OAuthClient/Attribute:name+' => 'Обычно это ваш email-адрес',
|
||||
'Class:OAuthClient/Attribute:status' => 'Статус',
|
||||
'Class:OAuthClient/Attribute:status+' => 'После создания используйте действие «Сгенерировать токен доступа», чтобы иметь возможность использовать этого клиента OAuth',
|
||||
'Class:OAuthClient/Attribute:status/Value:active' => 'Токен доступа сгенерирован',
|
||||
'Class:OAuthClient/Attribute:status/Value:inactive' => 'Нет токена доступа',
|
||||
'Class:OAuthClient/Attribute:description' => 'Описание',
|
||||
'Class:OAuthClient/Attribute:description+' => '',
|
||||
'Class:OAuthClient/Attribute:client_id' => 'Client id',
|
||||
'Class:OAuthClient/Attribute:client_id+' => 'Длинная строка символов, предоставленная вашим провайдером OAuth2',
|
||||
'Class:OAuthClient/Attribute:client_secret' => 'Client secret',
|
||||
'Class:OAuthClient/Attribute:client_secret+' => 'Ещё одна длинная строка символов, предоставленная вашим провайдером OAuth2',
|
||||
'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token',
|
||||
'Class:OAuthClient/Attribute:refresh_token+' => '',
|
||||
'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Истечение refresh token',
|
||||
'Class:OAuthClient/Attribute:refresh_token_expiration+' => '',
|
||||
'Class:OAuthClient/Attribute:scope' => 'Область доступа',
|
||||
'Class:OAuthClient/Attribute:scope+' => '',
|
||||
'Class:OAuthClient/Attribute:token' => 'Токен доступа',
|
||||
'Class:OAuthClient/Attribute:token+' => '',
|
||||
'Class:OAuthClient/Attribute:token_expiration' => 'Истечение токена доступа',
|
||||
'Class:OAuthClient/Attribute:token_expiration+' => '',
|
||||
'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url',
|
||||
'Class:OAuthClient/Attribute:redirect_url+' => 'Этот url нужно скопировать в конфигурацию OAuth2 у провайдера.
|
||||
Очистите поле, чтобы пересчитать значение по умолчанию',
|
||||
'Class:OAuthClient/Attribute:mailbox_list' => 'Список почтовых ящиков',
|
||||
'Class:OAuthClient/Attribute:mailbox_list+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -72,28 +72,28 @@ Erase the field to recalculate default value~~',
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'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:OAuthClientAzure' => 'Доступ к почте через OAuth (Microsoft Azure)',
|
||||
'Class:OAuthClientAzure/Name' => '%1$s (%2$s)',
|
||||
'Class:OAuthClientAzure/Attribute:scope' => 'Область доступа',
|
||||
'Class:OAuthClientAzure/Attribute:scope+' => 'Обычно подходит выбор по умолчанию',
|
||||
'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' => 'Расширенная область доступа',
|
||||
'Class:OAuthClientAzure/Attribute:advanced_scope+' => 'Как только здесь что-то указано, это имеет приоритет над выбором «Область доступа», который в этом случае игнорируется',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope' => 'Используемая область доступа',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope+' => '',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple' => 'Простая',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple+' => '',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:advanced' => 'Расширенная',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:advanced+' => '',
|
||||
'Class:OAuthClientAzure/Attribute:used_for_smtp' => 'Используется для SMTP',
|
||||
'Class:OAuthClientAzure/Attribute:used_for_smtp+' => 'Хотя бы у одного клиента OAuth этот флаг должен быть «Да», если вы хотите, чтобы iTop использовал его для отправки почты',
|
||||
'Class:OAuthClientAzure/Attribute:used_for_smtp/Value:yes' => 'Да',
|
||||
'Class:OAuthClientAzure/Attribute:used_for_smtp/Value:no' => 'Нет',
|
||||
'Class:OAuthClientAzure/Attribute:tenant' => 'Tenant',
|
||||
'Class:OAuthClientAzure/Attribute:tenant+' => 'Tenant ID настроенного приложения. Для multi-tenant приложения используйте "common".',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -101,24 +101,24 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
//
|
||||
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'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~~',
|
||||
'Class:OAuthClientGoogle' => 'Доступ к почте через OAuth (Google)',
|
||||
'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)',
|
||||
'Class:OAuthClientGoogle/Attribute:scope' => 'Область доступа',
|
||||
'Class:OAuthClientGoogle/Attribute:scope+' => 'Обычно подходит выбор по умолчанию',
|
||||
'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' => 'Расширенная область доступа',
|
||||
'Class:OAuthClientGoogle/Attribute:advanced_scope+' => 'Как только здесь что-то указано, это имеет приоритет над выбором «Область доступа», который в этом случае игнорируется',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope' => 'Используемая область доступа',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope+' => '',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope/Value:simple' => 'Простая',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope/Value:simple+' => '',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope/Value:advanced' => 'Расширенная',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope/Value:advanced+' => '',
|
||||
'Class:OAuthClientGoogle/Attribute:used_for_smtp' => 'Используется для SMTP',
|
||||
'Class:OAuthClientGoogle/Attribute:used_for_smtp+' => 'Хотя бы у одного клиента OAuth этот флаг должен быть «Да», если вы хотите, чтобы iTop использовал его для отправки почты',
|
||||
'Class:OAuthClientGoogle/Attribute:used_for_smtp/Value:yes' => 'Да',
|
||||
'Class:OAuthClientGoogle/Attribute:used_for_smtp/Value:no' => 'Нет',
|
||||
]);
|
||||
|
||||
@@ -38,27 +38,27 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:OAuthClient' => 'OAuth Mail Access~~',
|
||||
'Class:OAuthClient/Attribute:provider' => '提供商',
|
||||
'Class:OAuthClient/Attribute:provider+' => '~~',
|
||||
'Class:OAuthClient/Attribute:provider+' => '',
|
||||
'Class:OAuthClient/Attribute:name' => '登录',
|
||||
'Class:OAuthClient/Attribute:name+' => 'In general, this is your email address~~',
|
||||
'Class:OAuthClient/Attribute:name+' => '通常, 这里填您的邮箱地址',
|
||||
'Class:OAuthClient/Attribute:status' => '状态',
|
||||
'Class:OAuthClient/Attribute:status+' => '创建后, 通过 "生成访问令牌" 来使用此OAuth 客户端',
|
||||
'Class:OAuthClient/Attribute:status/Value:active' => '已生成访问令牌',
|
||||
'Class:OAuthClient/Attribute:status/Value:inactive' => '没有访问令牌',
|
||||
'Class:OAuthClient/Attribute:description' => '备注',
|
||||
'Class:OAuthClient/Attribute:description+' => '~~',
|
||||
'Class:OAuthClient/Attribute:description' => '描述',
|
||||
'Class:OAuthClient/Attribute:description+' => '',
|
||||
'Class:OAuthClient/Attribute:client_id' => '客户端编号',
|
||||
'Class:OAuthClient/Attribute:client_id+' => 'A long string of characters provided by your OAuth2 provider~~',
|
||||
'Class:OAuthClient/Attribute:client_secret' => '客户端密码',
|
||||
'Class:OAuthClient/Attribute:client_secret+' => 'Another long string of characters provided by your OAuth2 provider~~',
|
||||
'Class:OAuthClient/Attribute:refresh_token' => '刷新令牌',
|
||||
'Class:OAuthClient/Attribute:refresh_token+' => '~~',
|
||||
'Class:OAuthClient/Attribute:refresh_token+' => '',
|
||||
'Class:OAuthClient/Attribute:refresh_token_expiration' => '刷新令牌有效期',
|
||||
'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
|
||||
'Class:OAuthClient/Attribute:refresh_token_expiration+' => '',
|
||||
'Class:OAuthClient/Attribute:token' => '访问令牌',
|
||||
'Class:OAuthClient/Attribute:token+' => '~~',
|
||||
'Class:OAuthClient/Attribute:token+' => '',
|
||||
'Class:OAuthClient/Attribute:token_expiration' => '访问令牌有效期',
|
||||
'Class:OAuthClient/Attribute: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
|
||||
@@ -66,7 +66,7 @@ Erase the field to recalculate default value
|
||||
EOF
|
||||
,
|
||||
'Class:OAuthClient/Attribute:mailbox_list' => '邮箱列表',
|
||||
'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
|
||||
'Class:OAuthClient/Attribute:mailbox_list+' => '',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -79,22 +79,22 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:OAuthClientAzure/Attribute:scope' => '范围',
|
||||
'Class:OAuthClientAzure/Attribute:scope+' => '通常情况下使用默认选择最合适',
|
||||
'Class:OAuthClientAzure/Attribute:scope/Value:SMTP' => 'SMTP',
|
||||
'Class:OAuthClientAzure/Attribute:scope/Value:SMTP+' => '~~',
|
||||
'Class:OAuthClientAzure/Attribute:scope/Value:SMTP+' => '',
|
||||
'Class:OAuthClientAzure/Attribute:scope/Value:IMAP' => 'IMAP',
|
||||
'Class:OAuthClientAzure/Attribute:scope/Value:IMAP+' => '~~',
|
||||
'Class:OAuthClientAzure/Attribute:scope/Value:IMAP+' => '',
|
||||
'Class:OAuthClientAzure/Attribute:advanced_scope' => '高级范围',
|
||||
'Class:OAuthClientAzure/Attribute:advanced_scope+' => '您在此输入的内容将优先于 "范围" 选择并导致其被忽略',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope' => '使用范围',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope+' => '~~',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple' => '精简',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple+' => '~~',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope+' => '',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple' => '简单',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:simple+' => '',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:advanced' => '高级',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:advanced+' => '~~',
|
||||
'Class:OAuthClientAzure/Attribute:used_for_smtp' => '使用于SMTP',
|
||||
'Class:OAuthClientAzure/Attribute:used_scope/Value:advanced+' => '',
|
||||
'Class:OAuthClientAzure/Attribute:used_for_smtp' => '用于SMTP',
|
||||
'Class:OAuthClientAzure/Attribute:used_for_smtp+' => '如果您需要系统使用其发送邮件, 则至少需要有一个OAuth客户端标记为 "是"',
|
||||
'Class:OAuthClientAzure/Attribute:used_for_smtp/Value:yes' => '是',
|
||||
'Class:OAuthClientAzure/Attribute:used_for_smtp/Value:no' => '否',
|
||||
'Class:OAuthClientAzure/Attribute:tenant' => 'Tenant~~',
|
||||
'Class:OAuthClientAzure/Attribute:tenant' => '租户',
|
||||
'Class:OAuthClientAzure/Attribute:tenant+' => 'Tenant ID of the configured application. For multi-tenant application, use "common".~~',
|
||||
]);
|
||||
|
||||
@@ -108,18 +108,18 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:OAuthClientGoogle/Attribute:scope' => '范围',
|
||||
'Class:OAuthClientGoogle/Attribute:scope+' => '通常情况下使用默认选择最合适',
|
||||
'Class:OAuthClientGoogle/Attribute:scope/Value:SMTP' => 'SMTP',
|
||||
'Class:OAuthClientGoogle/Attribute:scope/Value:SMTP+' => '~~',
|
||||
'Class:OAuthClientGoogle/Attribute:scope/Value:SMTP+' => '',
|
||||
'Class:OAuthClientGoogle/Attribute:scope/Value:IMAP' => 'IMAP',
|
||||
'Class:OAuthClientGoogle/Attribute:scope/Value:IMAP+' => '~~',
|
||||
'Class:OAuthClientGoogle/Attribute:scope/Value:IMAP+' => '',
|
||||
'Class:OAuthClientGoogle/Attribute:advanced_scope' => '高级范围',
|
||||
'Class:OAuthClientGoogle/Attribute:advanced_scope+' => '您在此输入的内容将优先于 "范围" 选择并导致其被忽略',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope' => '使用范围',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope+' => '~~',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope/Value:simple' => '精简',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope/Value:simple+' => '~~',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope+' => '',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope/Value:simple' => '简单',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope/Value:simple+' => '',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope/Value:advanced' => '高级',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope/Value:advanced+' => '~~',
|
||||
'Class:OAuthClientGoogle/Attribute:used_for_smtp' => '使用与SMTP',
|
||||
'Class:OAuthClientGoogle/Attribute:used_scope/Value:advanced+' => '',
|
||||
'Class:OAuthClientGoogle/Attribute:used_for_smtp' => '用于SMTP',
|
||||
'Class:OAuthClientGoogle/Attribute:used_for_smtp+' => '如果您需要系统使用其发送邮件, 则至少需要有一个OAuth客户端标记为 "是"',
|
||||
'Class:OAuthClientGoogle/Attribute:used_for_smtp/Value:yes' => '是',
|
||||
'Class:OAuthClientGoogle/Attribute:used_for_smtp/Value:no' => '否',
|
||||
|
||||
@@ -59,11 +59,11 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
|
||||
// Object form
|
||||
Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Portal:Form:Caselog:Entry:Close:Tooltip' => 'Close this entry~~',
|
||||
'Portal:Form:Caselog:Entry:Close:Tooltip' => 'Закрыть эту запись',
|
||||
'Portal:Form:Close:Warning' => 'Вы действительно хотите закрыть эту форму? Введённые данные могут быть утеряны.',
|
||||
'Portal:Error:ObjectCannotBeCreated' => 'Error: object cannot be created. Check associated objects and attachments before submitting this form again.~~',
|
||||
'Portal:Error:ObjectCannotBeUpdated' => 'Error: object cannot be updated. Check associated objects and attachments before submitting this form again.~~',
|
||||
'Portal:Error:CheckToWriteFailed' => 'Error during validation of field \'%1$s\': %2$s~~',
|
||||
'Portal:Error:ObjectCannotBeCreated' => 'Ошибка: объект не может быть создан. Проверьте связанные объекты и вложения перед повторной отправкой формы.',
|
||||
'Portal:Error:ObjectCannotBeUpdated' => 'Ошибка: объект не может быть обновлён. Проверьте связанные объекты и вложения перед повторной отправкой формы.',
|
||||
'Portal:Error:CheckToWriteFailed' => 'Ошибка при проверке поля \'%1$s\': %2$s',
|
||||
]);
|
||||
|
||||
// UserProfile brick
|
||||
|
||||
@@ -49,7 +49,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Portal:Datatables:Language:Info' => '第 _PAGE_ 页,共 _PAGES_ 页',
|
||||
'Portal:Datatables:Language:InfoEmpty' => '没有信息',
|
||||
'Portal:Datatables:Language:InfoFiltered' => '最多筛选 _MAX_ 项',
|
||||
'Portal:Datatables:Language:EmptyTable' => '表格中没有数据',
|
||||
'Portal:Datatables:Language:EmptyTable' => '暂无数据',
|
||||
'Portal:Datatables:Language:DisplayLength:All' => '全部',
|
||||
'Portal:Datatables:Language:Paginate:First' => '首页',
|
||||
'Portal:Datatables:Language:Paginate:Previous' => '上一页',
|
||||
@@ -106,14 +106,14 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Brick:Portal:Browse:Action:CreateObjectFromThis' => '新建 %1$s',
|
||||
'Brick:Portal:Browse:Tree:ExpandAll' => '全部展开',
|
||||
'Brick:Portal:Browse:Tree:CollapseAll' => '全部收起',
|
||||
'Brick:Portal:Browse:Filter:NoData' => '没有项目',
|
||||
'Brick:Portal:Browse:Filter:NoData' => '没有数据',
|
||||
'Brick:Portal:Browse:Mosaic:Back' => '返回',
|
||||
]);
|
||||
|
||||
// ManageBrick brick
|
||||
Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Brick:Portal:Manage:Name' => '管理项目',
|
||||
'Brick:Portal:Manage:Table:NoData' => '没有项目.',
|
||||
'Brick:Portal:Manage:Table:NoData' => '没有数据.',
|
||||
'Brick:Portal:Manage:Table:ItemActions' => '操作',
|
||||
'Brick:Portal:Manage:DisplayMode:list' => '列表',
|
||||
'Brick:Portal:Manage:DisplayMode:pie-chart' => '饼图',
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user