Compare commits

..

73 Commits

Author SHA1 Message Date
v-dumas
80fc5324a3 Fix missing comma in dictionaries 2026-08-10 18:00:53 +02:00
Vincent Dumas
1d30795223 Update fr.dict.itop-flow-map.php 2026-08-10 17:49:26 +02:00
Vincent Dumas
32de12dae9 Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-08-10 17:20:44 +02:00
Vincent Dumas
09224c2db8 Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-08-10 17:20:32 +02:00
Vincent Dumas
18c9fcce83 Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-08-10 17:20:22 +02:00
Vincent Dumas
7129571047 Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-08-10 17:20:12 +02:00
v-dumas
b88d564075 N°9643 - Dataflow: split protocol & type, add url and last change 2026-08-10 16:24:49 +02:00
Molkobain
fd553b86dd N°4693 - Fix iBackofficeSassExtension API returning only 1 file 2026-08-09 19:50:52 +02:00
Purple Grape
d7625d9650 N°9891 - Update chinese translations (#937)
* update zh_cn translation

rebase on the latest develop branch

* update zh_cn translation

rebase on the latest develop branch

* update zh_cn translation

* Update zh_cn.dict.itop-oauth-client.php

* Update zh_cn.dictionary.itop.core.php

* Update zh_cn.dict.itop-request-mgmt.php

* update zh_cn translation

rebase on the latest develop branch

* update zh_cn translation

rebase on the latest develop branch

* update zh_cn translation

* Update zh_cn.dict.itop-oauth-client.php

* Update zh_cn.dict.itop-request-mgmt.php

* Update zh_cn.dict.itop-portal-base.php

* Update zh_cn.dictionary.itop.datatable.php

* Update zh_cn.dictionary.itop.welcome-popup.php

* Update zh_cn.dictionary.itop.ui.php
2026-08-09 18:41:18 +02:00
Timmy38
893a1d7f71 N°9888 Add config parameter mention in error message when php cli version is lower than required 2026-08-07 12:37:00 +02:00
Anne-Cath
fda1d3dd16 N°3789 - Bulk actions on replicas: (Resync, Force Update, Delete,...) - Deletes the fake message left by mistake 2026-08-07 11:38:39 +02:00
Thomas Casteleyn
61464fc819 N°9881 - Update dutch translations of itop-config-mgmt module (#986)
* dict(itop-config-mgmt): Update NL translations

* Update datamodels/2.x/itop-config-mgmt/dictionaries/nl.dict.itop-config-mgmt.php
2026-08-07 10:35:40 +02:00
v-dumas
c281677768 N°8142 - Ticket menus label/tooltip standardisation 2026-08-07 08:57:51 +02:00
Molkobain
e280251623 Merge remote-tracking branch 'origin/support/3.2' into develop
# Conflicts:
#	dictionaries/ui/application/links/zh_cn.dictionary.itop.links.php
#	dictionaries/zh_cn.dictionary.itop.core.php
#	dictionaries/zh_cn.dictionary.itop.ui.php
2026-08-06 16:36:15 +02:00
Molkobain
f657308137 Fix PHP code styles for Chinese dictionaries 2026-08-06 16:33:31 +02:00
Molkobain
4596404666 Merge remote-tracking branch 'origin/support/3.2' into develop
# Conflicts:
#	.doc/itop-version-history.md
2026-08-06 13:38:39 +02:00
Molkobain
64394099f7 📝 Add 3.2.3-1 and 3.2.3-2 to version history 2026-08-06 13:37:44 +02:00
Stephen Abello
67e2899a60 N°9787 - Fix skipped test 2026-08-06 10:30:37 +02:00
Molkobain
8d75531d95 Merge remote-tracking branch 'origin/support/3.2' into develop
# Conflicts:
#	datamodels/2.x/combodo-backoffice-fullmoon-high-contrast-theme/dictionaries/zh_cn.dict.combodo-backoffice-fullmoon-high-contrast-theme.php
#	datamodels/2.x/combodo-backoffice-fullmoon-protanopia-deuteranopia-theme/dictionaries/zh_cn.dict.combodo-backoffice-fullmoon-protanopia-deuteranopia-theme.php
#	datamodels/2.x/combodo-backoffice-fullmoon-tritanopia-theme/dictionaries/zh_cn.dict.combodo-backoffice-fullmoon-tritanopia-theme.php
#	datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php
#	datamodels/2.x/itop-backup/dictionaries/zh_cn.dict.itop-backup.php
#	datamodels/2.x/itop-bridge-cmdb-services/dictionaries/zh_cn.dict.itop-bridge-cmdb-services.php
#	datamodels/2.x/itop-bridge-cmdb-ticket/dictionaries/zh_cn.dict.itop-bridge-cmdb-ticket.php
#	datamodels/2.x/itop-change-mgmt-itil/dictionaries/zh_cn.dict.itop-change-mgmt-itil.php
#	datamodels/2.x/itop-change-mgmt/dictionaries/zh_cn.dict.itop-change-mgmt.php
#	datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php
#	datamodels/2.x/itop-config/dictionaries/zh_cn.dict.itop-config.php
#	datamodels/2.x/itop-core-update/dictionaries/zh_cn.dict.itop-core-update.php
#	datamodels/2.x/itop-hub-connector/dictionaries/zh_cn.dict.itop-hub-connector.php
#	datamodels/2.x/itop-incident-mgmt-itil/dictionaries/zh_cn.dict.itop-incident-mgmt-itil.php
#	datamodels/2.x/itop-knownerror-mgmt/dictionaries/zh_cn.dict.itop-knownerror-mgmt.php
#	datamodels/2.x/itop-portal-base/dictionaries/zh_cn.dict.itop-portal-base.php
#	datamodels/2.x/itop-problem-mgmt/dictionaries/zh_cn.dict.itop-problem-mgmt.php
#	datamodels/2.x/itop-request-mgmt-itil/dictionaries/zh_cn.dict.itop-request-mgmt-itil.php
#	datamodels/2.x/itop-request-mgmt/dictionaries/zh_cn.dict.itop-request-mgmt.php
#	datamodels/2.x/itop-service-mgmt-provider/dictionaries/zh_cn.dict.itop-service-mgmt-provider.php
#	datamodels/2.x/itop-service-mgmt/dictionaries/zh_cn.dict.itop-service-mgmt.php
#	datamodels/2.x/itop-storage-mgmt/dictionaries/zh_cn.dict.itop-storage-mgmt.php
#	datamodels/2.x/itop-structure/dictionaries/zh_cn.dict.itop-structure.php
#	datamodels/2.x/itop-themes-compat/dictionaries/zh_cn.dict.itop-themes-compat.php
#	datamodels/2.x/itop-tickets/dictionaries/zh_cn.dict.itop-tickets.php
#	datamodels/2.x/itop-virtualization-mgmt/dictionaries/zh_cn.dict.itop-virtualization-mgmt.php
#	dictionaries/core/orm-value/orm-document/zh_cn.dictionary.itop.orm-document.php
#	dictionaries/core/uniqueness-rule/zh_cn.dictionary.itop.uniqueness-rule.php
#	dictionaries/ui/application/links/zh_cn.dictionary.itop.links.php
#	dictionaries/ui/application/newsroom/zh_cn.dictionary.itop.newsroom.php
#	dictionaries/ui/application/welcome-popup/zh_cn.dictionary.itop.welcome-popup.php
#	dictionaries/ui/layouts/activity-panel/zh_cn.dictionary.itop.activity-panel.php
#	dictionaries/ui/layouts/navigation-menu/zh_cn.dictionary.itop.navigation-menu.php
#	dictionaries/ui/pages/notifications-center/zh_cn.dictionary.itop.notifications-center.php
#	dictionaries/ui/pages/preferences/zh_cn.dictionary.itop.preferences.php
#	dictionaries/zh_cn.dictionary.itop.core.php
#	dictionaries/zh_cn.dictionary.itop.ui.php
#	setup/wizardsteps/WizStepLicense2.php
2026-08-04 18:00:19 +02:00
Benjamin DALSASS
1e023e5431 Merge branch 'support/3.2' into develop
# Conflicts:
#	datamodels/2.x/itop-portal-base/portal/public/css/portal.css
2026-08-04 17:03:32 +02:00
Anne-Cath
e2a1c3e79e reformat file for php cs fixer 2026-08-04 15:47:59 +02:00
Purple Grape
c7570d62c1 N°9889 - Update zh_cn translation for 3.2 branch (#938)
* rebase on the latest 3.2 branch

rebase

Co-Authored-By: Thomas Casteleyn <thomas.casteleyn@me.com>

* Update zh_cn.dict.authent-cas.php

* Update zh_cn.dict.authent-external.php

* Update zh_cn.dict.authent-ldap.php

* Update zh_cn.dict.authent-local.php

* Update zh_cn.dict.combodo-backoffice-darkmoon-theme.php

* Update zh_cn.dict.itop-backup.php

* Update zh_cn.dict.itop-change-mgmt.php

* Update zh_cn.dict.itop-faq-light.php

* Update zh_cn.dict.itop-config.php

* Update zh_cn.dict.itop-config-mgmt.php

* Update zh_cn.dict.itop-hub-connector.php

* Update zh_cn.dict.itop-knownerror-mgmt.php

* Update zh_cn.dictionary.itop.core.php

* Update zh_cn.dict.authent-cas.php

* Update zh_cn.dict.authent-external.php

* Update zh_cn.dict.authent-ldap.php

* Update zh_cn.dict.authent-local.php

* Update zh_cn.dict.combodo-backoffice-darkmoon-theme.php

* Update zh_cn.dict.itop-backup.php

* Update zh_cn.dict.itop-config-mgmt.php

* Update zh_cn.dict.itop-config.php

* Update zh_cn.dict.itop-faq-light.php

* update  license  url

* Update datamodels/2.x/authent-ldap/dictionaries/zh_cn.dict.authent-ldap.php

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

* Update datamodels/2.x/authent-cas/dictionaries/en.dict.authent-cas.php

---------

Co-authored-by: Thomas Casteleyn <thomas.casteleyn@me.com>
Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2026-08-04 15:26:11 +02:00
Anne-Cath
a30ed63a62 N°3789 - Bulk actions on replicas: (Resync, Force Update, Delete,...) - Resynchronization fix + label improvements 2026-08-04 15:15:37 +02:00
Benjamin DALSASS
dd77124b07 N°4720 - Remove old unreferenced methods or pages that are @deprecated
- deleted function GetTileTemplatePath called in aggragte brick
2026-08-04 14:36:09 +02:00
Lenaick
9bfe0430f5 N°9118 - No Safeguard when hub installation fail (#988)
* N°9118 - No Safeguard when hub installation fail

* Apply suggestion from @greptile-apps[bot]

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-08-04 09:01:34 +02:00
Anne-Cath
3fe91ed0b4 N°8397 - Suppress export V1 from iTop packages 2026-08-03 16:39:19 +02:00
Stephen Abello
ccb9633226 Align portal ui_version default value with XML ui_version 2026-08-03 10:14:00 +02:00
Thomas Casteleyn
82b50dc6cd N°9880 - Add dutch translations to itop-flow-map module (#985) 2026-08-03 09:22:14 +02:00
Vladimir Kunin
d3451f8c30 N°9879 - Update russian translations (#983) 2026-08-03 09:17:43 +02:00
Benjamin DALSASS
b5c8a98695 N°9807 - Polishing CKEditor for iTop 3.3.0-beta1
- fix setup css broken unit test
2026-07-30 09:21:51 +02:00
Lenaick
1403914572 N°9116 - Installing modules in extension folder or production-modules doesn't have the same behavior (#981)
* N°9116 - Installing modules in extension folder or production-modules doesn't have the same behavior

* N°9116 - Installing modules in extension folder or production-modules doesn't have the same behavior

* N°9116 - Installing modules in extension folder or production-modules doesn't have the same behavior
2026-07-28 16:40:23 +02:00
Stephen Abello
b976471a0d N°9385 - Action button is not displaying its dropdown in a filtered BrowseBrick 2026-07-28 10:24:02 +02:00
Benjamin DALSASS
fa66a09104 N°9838 - Polishing CKEditor for iTop 3.2.4
- fix php unit test
2026-07-28 09:39:58 +02:00
Benjamin DALSASS
47981f78e3 Merge remote-tracking branch 'origin/support/3.2' into develop
# Conflicts:
#	css/setup.css
#	datamodels/2.x/itop-portal-base/portal/public/css/portal.css
#	datamodels/2.x/itop-portal-base/portal/public/css/portal.scss
2026-07-28 08:41:18 +02:00
Benjamin DALSASS
476ec75a2e N°9838 - Polishing CKEditor for iTop 3.2.4 2026-07-28 08:39:24 +02:00
Benjamin DALSASS
10c000ddfe N°9807 - Polishing CKEditor for iTop 3.3.0-beta1
- update with last ckeditor changes
2026-07-28 08:23:20 +02:00
Vincent Dumas
7e55b9ccfc N°9703 - Updates italian dictionnary 2026-07-27 18:51:53 +02:00
v-dumas
5bb288ffca N°9800 - broken setup in CI 2026-07-27 18:36:03 +02:00
Vincent Dumas
56d7e40f4c N°9800 New sample data for KnownError and FAQ (#982)
* N°9800 - Fix typos in sample data in User and Service in FR
* N°9800 - typo in sample Server ids and Rack id
2026-07-27 18:16:58 +02:00
Benjamin Dalsass
e0dc1fa571 N°8886 - Deprecation warning in DashetGroupBy in 3.3-dev (#972) 2026-07-27 08:26:37 +02:00
Stephen Abello
d6466c0bd6 Update setup.css 2026-07-24 14:30:17 +02:00
Stephen Abello
eb16e6cbc8 Merge branch 'support/3.2' into develop 2026-07-24 14:29:24 +02:00
Stephen Abello
42007ffd95 N°9702 - Fix user rights matrix display when an accessibility theme displayed a visual cue 2026-07-24 14:28:59 +02:00
Molkobain
6329c157e8 📝 Update releases history with 3.3.0-beta1 2026-07-24 11:31:07 +02:00
Benjamin Dalsass
9ee0548767 N°9807 - Polishing CKEditor for iTop 3.3.0-beta1 (#976) 2026-07-24 09:22:24 +02:00
Lenaick
620a6b9a51 N°9827 - Unable to launch check compatibility when a module with bad dependencies is in production-modules (#978)
* N°9827 - Unable to launch check compatibility when a module with bad dependencies is in production-modules

* Update unit tests

* N°9827 - Unable to launch check compatibility when a module with bad dependencies is in production-modules
2026-07-23 16:23:06 +02:00
Stephen Abello
968c56745a Merge branch 'support/3.2' into develop
# Conflicts:
#	core/attributedef.class.inc.php
2026-07-23 16:08:45 +02:00
Anne-Catherine
04a5e5463a N°9759 - Truncating AttributeText doesn't work as expected in case of multibytes characters (#964)
* N°9759 - Truncate AttributeText don't work as expected in case of multibytes characters

* WIP

* Move TrimValue() base definition to AttributeDefinition class, assign DBObject::SetTrim old behavior to it

* Fix variable types

* Fix variable types

* Apply code review fixes, add tests

* Define GetSize in AttributeDefinition to easy polymorphic calls instead of obscure AttributeDBFieldVoid

* Update php with right since version and ticket, remove useless method overload

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update core/attributedef.class.inc.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update core/attributedef.class.inc.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestion from @Molkobain code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestion from @Molkobain code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestion from @Molkobain code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestion from @Molkobain code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestion from @Molkobain code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Correctly handle null values in new methods

---------

Co-authored-by: Stephen Abello <stephen.abello@combodo.com>
Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2026-07-23 16:07:42 +02:00
Benjamin Dalsass
006dd3d6c2 N°9829 - Add unit tests for parent ticket changes (#979) 2026-07-23 15:32:53 +02:00
lenaick.moreira
a808e89c30 Merge branch 'support/3.3-beta1' into develop 2026-07-23 11:43:00 +02:00
lenaick.moreira
c6e50a0ed7 N°9830 - Fix setup error when trying to remove class with a TagSet attribute 2026-07-23 11:39:42 +02:00
Molkobain
d88687527e Merge remote-tracking branch 'origin/support/3.2.3' into support/3.2 2026-07-23 10:49:09 +02:00
Molkobain
2cc071b07a Merge remote-tracking branch 'origin/support/3.3-beta1' into develop 2026-07-23 10:47:12 +02:00
Molkobain
76a410e00d Revert "N°9541 itop-virtualization-mgmt cannot currently be uninstalled" now that N°9831 has been fixed
This reverts commit 52fca750b0.
2026-07-23 10:45:44 +02:00
Molkobain
c68887c2bc N°9831 - Fix ext. management deletion plan analysis by avoiding overwriting entity for a previously processed class 2026-07-23 10:21:31 +02:00
Molkobain
837b433622 N°9831 - Fix DataCleanupService so it handles external keys the same way as \Combodo\iTop\DataFeatureRemoval\Service\StaticDeletionPlan::DeletionPlanForReferencingClasses and \DBObject::MakeDeletionPlan
- Check if ext. key is nullable first
- Then check if its a DEL_MANUAL option
2026-07-23 10:21:31 +02:00
Timmy38
52fca750b0 N°9541 itop-virtualization-mgmt cannot currently be uninstalled 2026-07-22 17:37:19 +02:00
Benjamin Dalsass
a5c14e4870 N°9723 - IsActionAllowed should work with non instantiated users objects (#973) 2026-07-21 17:41:40 +02:00
Timmy38
0e72b090ee Merge branch 'support/3.3-beta1' into develop 2026-07-21 17:06:30 +02:00
Timmy38
d1aedee245 N°9692 - Fix flag name 2026-07-21 17:04:37 +02:00
Timmy38
1b70b4bf70 N°9692 - Fix flag name 2026-07-21 12:02:31 +02:00
odain
41f51a2c0c Merge branch 'support/3.2' into develop 2026-07-21 08:03:21 +02:00
odain-cbd
73ede13443 N°9746 - Synchro execution time change fixes (#951)
* N°9746 - Synchro execution can make damage during time change (object deletions)

* N°9746 - handle timechange during synchro execution + cleanup m_bIsImportPhaseDateKnown

* N°9746 - PR fix

* N°9746 - add corner test case
2026-07-21 08:01:31 +02:00
odain-cbd
40dd72ef82 N°9746 - Synchro execution time change fixes (#951)
* N°9746 - Synchro execution can make damage during time change (object deletions)

* N°9746 - handle timechange during synchro execution + cleanup m_bIsImportPhaseDateKnown

* N°9746 - PR fix

* N°9746 - add corner test case
2026-07-21 07:59:50 +02:00
Lenaick
c8aea56171 N°9565 - Extension Mgmt : display progression during analysis (#975)
* N°9565 - Extension Mgmt : display progression during analysis

* N°9565 - Extension Mgmt : display progression during analysis

* N°9565 - Extension Mgmt : display progression during analysis

* N°9565 - Extension Mgmt : display progression during analysis

* N°9565 - Extension Mgmt : display progression during analysis

* N°9565 - Validate transaction id

* N°9565 - Move unset bForceCompilation
2026-07-20 11:38:30 +02:00
lenaick.moreira
041437cbeb Merge branch 'support/3.3-beta1' into develop 2026-07-17 17:05:46 +02:00
lenaick.moreira
85d50f31bd N°9692 - Fix null coalescing for extension installation status and clean up test cases 2026-07-17 17:05:06 +02:00
Anne-Catherine
5715e0484f N°9759 - Truncating AttributeText doesn't work as expected in case of multibytes characters (#964)
* N°9759 - Truncate AttributeText don't work as expected in case of multibytes characters

* WIP

* Move TrimValue() base definition to AttributeDefinition class, assign DBObject::SetTrim old behavior to it

* Fix variable types

* Fix variable types

* Apply code review fixes, add tests

* Define GetSize in AttributeDefinition to easy polymorphic calls instead of obscure AttributeDBFieldVoid

* Update php with right since version and ticket, remove useless method overload

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update core/attributedef.class.inc.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update core/attributedef.class.inc.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestion from @Molkobain code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestion from @Molkobain code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestion from @Molkobain code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestion from @Molkobain code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestion from @Molkobain code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Correctly handle null values in new methods

---------

Co-authored-by: Stephen Abello <stephen.abello@combodo.com>
Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2026-07-17 16:40:09 +02:00
lenaick.moreira
109fdfa06b Merge branch 'support/3.3-beta1' into develop
^ Conflicts:
^	datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php
2026-07-17 14:45:50 +02:00
lenaick.moreira
3c301affb3 N°9679 - Add remote extensions as uninstallable extension in "Extension management" 2026-07-17 14:32:46 +02:00
Lenaick
147fae7f8c N°9679 - Forced uninstallation is not logged when done by extensions management (#956) 2026-07-17 11:25:36 +02:00
odain-cbd
a5aa8c279f fix broken cache warmup after setup (#974)
* fix broken cache warmup after setup

* clear all caches after setup
2026-07-17 10:40:55 +02:00
lenaick.moreira
04f91ab4a2 Fix error CI 2026-07-16 09:40:33 +02:00
247 changed files with 9746 additions and 3017 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 === '') ? '&nbsp;' : $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;

View File

@@ -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')) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 服务器认证',
]);

View File

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

View File

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

View File

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

View File

@@ -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' => 'Установка срока действия пароля "Одноразовый пароль" для своей собственной учётной записи не разрешена',
]);

View File

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

View File

@@ -11,5 +11,5 @@
*
*/
Dict::Add('RU RU', 'Russian', 'Русский', [
'theme:darkmoon' => 'Dark moon~~',
'theme:darkmoon' => 'Тёмная луна',
]);

View File

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

View File

@@ -23,5 +23,5 @@
*/
Dict::Add('RU RU', 'Russian', 'Русский', [
'theme:fullmoon-high-contrast' => 'Fullmoon (High contrast)~~',
'theme:fullmoon-high-contrast' => 'Fullmoon (высокая контрастность)',
]);

View File

@@ -23,5 +23,5 @@
*/
Dict::Add('RU RU', 'Russian', 'Русский', [
'theme:fullmoon-protanopia-deuteranopia' => 'Fullmoon (Protanopia & Deuteranopia)~~',
'theme:fullmoon-protanopia-deuteranopia' => 'Fullmoon (протанопия и дейтеранопия)',
]);

View File

@@ -23,5 +23,5 @@
*/
Dict::Add('RU RU', 'Russian', 'Русский', [
'theme:fullmoon-tritanopia' => 'Fullmoon (Tritanopia)~~',
'theme:fullmoon-tritanopia' => 'Fullmoon (тританопия)',
]);

View File

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

View File

@@ -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 lanalyse',
'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 lassistant de configuration',

View File

@@ -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' => 'Обновлено записей',
]);

View File

@@ -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' => '已更新的条目',
]);

View File

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

View File

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

View File

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

View File

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

View File

@@ -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'} %}

View File

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

View File

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

View File

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

View File

@@ -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' => '还原',

View File

@@ -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. Используйте специальный триггер',
]);

View File

@@ -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' => 'Пожалуйста, подтвердите, что вы хотите выполнить резервное копирование прямо сейчас.',

View File

@@ -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' => 'Услуга',

View File

@@ -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' => 'Тикет',

View File

@@ -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' => '变更类型',

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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> в файле конфигурации.',
]);

View File

@@ -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+' => 'Список образов контейнеров, использующих это ПО',
]);

View File

@@ -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+' => '运行此软件的容器镜像列表',
]);

View File

@@ -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' => 'Резервное копирование базы данных',

View File

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

View File

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

View File

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

View File

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

View 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>&lt;h4&gt;&lt;strong&gt;📌 Zweck&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;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.&lt;/p&gt;&lt;hr&gt;&lt;h4&gt;&lt;strong&gt;👥 Geltungsbereich&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Gilt für alle Mitarbeitenden, externen Kräfte und Abteilungen, die IT-Ausrüstung für ihre Arbeit benötigen.&lt;/p&gt;&lt;hr&gt;&lt;h4&gt;&lt;strong&gt;✅ Schritt 1: Bedarf klären&lt;/strong&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;Prüfen Sie, ob die Ausrüstung für Rolle oder Projekt erforderlich ist.&lt;/li&gt;&lt;li&gt;Prüfen Sie die Verfügbarkeit im IT-Bestand.&lt;/li&gt;&lt;li&gt;Stellen Sie sicher, dass die Anfrage den IT-Richtlinien entspricht.&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;h4&gt;&lt;strong&gt;📝 Schritt 2: Anfrage einreichen&lt;/strong&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;Öffnen Sie das IT-Anfrageportal und füllen Sie das Formular vollständig aus.&lt;/li&gt;&lt;li&gt;Geben Sie Name, Abteilung, Gerätetyp, Menge, Begründung und gewünschtes Lieferdatum an.&lt;/li&gt;&lt;li&gt;Alternativ senden Sie eine E-Mail an it-requests@[yourorganization].com.&lt;/li&gt;&lt;/ol&gt;&lt;hr&gt;&lt;h4&gt;&lt;strong&gt;🔍 Schritt 3: Genehmigung&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;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.&lt;/p&gt;&lt;hr&gt;&lt;h4&gt;&lt;strong&gt;📦 Schritt 4: Bereitstellung&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Lagerware wird nach Freigabe zeitnah ausgeliefert. Bei Sonderbestellungen informiert die IT über die Lieferzeit und übernimmt bei Bedarf die Ersteinrichtung.&lt;/p&gt;&lt;hr&gt;&lt;h4&gt;&lt;strong&gt;🔄 Rückgabe und Ersatz&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Defekte oder nicht mehr benötigte Geräte werden über eine Rückgabeanfrage an die IT gemeldet und zurückgeführt.&lt;/p&gt;</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>&lt;h4&gt;&lt;strong&gt;❓ Wie beantrage ich Urlaub?&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;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.&lt;/p&gt;&lt;hr&gt;&lt;h4&gt;&lt;strong&gt;⏳ Welche Fristen gelten?&lt;/strong&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;Regulärer Urlaub möglichst frühzeitig, idealerweise mindestens 15 Tage vorher.&lt;/li&gt;&lt;li&gt;Sonderurlaub so schnell wie möglich ankündigen.&lt;/li&gt;&lt;li&gt;Krankheit oder Unfall am selben Tag melden.&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;h4&gt;&lt;strong&gt;📅 Wie viele Urlaubstage habe ich?&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Der Anspruch richtet sich nach Vertrag und lokaler Gesetzgebung. Ihr aktueller Saldo ist im HR-Portal sichtbar.&lt;/p&gt;&lt;hr&gt;&lt;h4&gt;&lt;strong&gt;🔄 Kann ich Urlaub ändern oder stornieren?&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Ja, je nach Unternehmensrichtlinie und mit Zustimmung der Führungskraft. Änderungen sollten frühzeitig gemeldet werden.&lt;/p&gt;&lt;hr&gt;&lt;h4&gt;&lt;strong&gt;🆘 An wen wende ich mich bei Problemen?&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Bei technischen Problemen kontaktieren Sie den IT-Support, bei Fragen zu Rechten und Saldo das HR-Team.&lt;/p&gt;</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>&lt;h2&gt;❓ Fragen zur Fehlersuche&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Druckermarke bekannt?&lt;/strong&gt; HP, IBM, Epson oder andere.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Ist der Drucker mit Strom versorgt?&lt;/strong&gt; Ja oder Nein.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Ist der Drucker eingeschaltet?&lt;/strong&gt; Ja oder Nein.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Ist Papier eingelegt?&lt;/strong&gt; Ja oder Nein.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Gibt es Meldungen zum Tintenstand oder andere Warnungen?&lt;/strong&gt; Falls ja, welche?&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Wurde bereits ein Neustart versucht?&lt;/strong&gt; Ja oder Nein.&lt;/p&gt;</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>&lt;h2&gt;🔍 Grundprüfungen&lt;/h2&gt;&lt;p&gt;Ist WLAN am Gerät aktiviert, ist das Symbol sichtbar und funktionieren andere Geräte im selben Netzwerk?&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;🌐 Netzwerkspezifische Prüfungen&lt;/h2&gt;&lt;p&gt;Ist der Router eingeschaltet, sind die LEDs normal, ist die SSID sichtbar und wurde das richtige Passwort verwendet?&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;💻 Gerätespezifische Prüfungen&lt;/h2&gt;&lt;p&gt;Wurde das Gerät neu gestartet, das WLAN neu verbunden und die Entfernung zum Router geprüft?&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;🛠️ Erweiterte Schritte&lt;/h2&gt;&lt;p&gt;Treiber aktualisieren, Störquellen prüfen, Routerkanal anpassen und bei Bedarf Router zurücksetzen.&lt;/p&gt;</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>&lt;h2&gt;🔍 Allgemeine Prüfungen&lt;/h2&gt;&lt;p&gt;Besteht eine Internetverbindung, ist das WLAN- oder Ethernet-Symbol sichtbar und funktionieren andere Geräte im selben Netzwerk?&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;🌐 Netzwerkspezifische Prüfungen&lt;/h2&gt;&lt;p&gt;Prüfen Sie Flugmodus, Router-Neustart, korrektes Passwort und ggf. den Einfluss eines VPN.&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;🔗 Windows-spezifische Prüfungen&lt;/h2&gt;&lt;p&gt;Computer neu starten, Windows-Updates prüfen, Netzwerktreiber aktualisieren und die integrierte Problembehandlung ausführen.&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;🛠️ Erweiterte Schritte&lt;/h2&gt;&lt;p&gt;Netzwerk zurücksetzen, Sicherheitssoftware prüfen und testweise ein anderes Netzwerk verwenden.&lt;/p&gt;</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>&lt;h2&gt;📌 Vorbereitung&lt;/h2&gt;&lt;p&gt;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.&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;🔍 Modell und Version ermitteln&lt;/h2&gt;&lt;p&gt;Prüfen Sie das exakte Modell und notieren Sie die aktuell installierte Firmware-Version.&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;📥 Firmware herunterladen&lt;/h2&gt;&lt;p&gt;Laden Sie die aktuelle Version von der offiziellen Herstellerseite und prüfen Sie die Kompatibilität für Modell und Region.&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;🔄 Update durchführen&lt;/h2&gt;&lt;p&gt;Das Update kann über Hersteller-Software, Druckermenü oder per USB erfolgen. Folgen Sie den Schritten des Herstellers und unterbrechen Sie den Vorgang nicht.&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;✅ Nachkontrolle&lt;/h2&gt;&lt;p&gt;Drucker neu starten, Testseite drucken und Funktionen wie Drucken, Scannen und Netzwerk prüfen.&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;🚨 Fehlerbehebung&lt;/h2&gt;&lt;p&gt;Bei Fehlern Verbindung prüfen, neu starten und bei Bedarf den Herstellersupport kontaktieren.&lt;/p&gt;</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>&lt;h2&gt;🔍 Erste Prüfungen&lt;/h2&gt;&lt;p&gt;Tritt der Bluescreen wiederholt auf, bei einem bestimmten Schritt oder zufällig? Notieren Sie den angezeigten Fehlercode.&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;🛠️ Basismaßnahmen&lt;/h2&gt;&lt;p&gt;Neustart durchführen, Windows aktualisieren, externe Geräte trennen und einen Malware-Scan starten.&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;🖥️ Erweiterte Prüfungen&lt;/h2&gt;&lt;p&gt;Ereignisanzeige prüfen, Treiber aktualisieren sowie Systemprüfungen wie SFC, DISM, RAM- und Datenträgertests ausführen.&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;🔄 Wiederherstellungsoptionen&lt;/h2&gt;&lt;p&gt;Abgesicherten Modus testen, Systemwiederherstellung verwenden und falls nötig Windows zurücksetzen oder neu installieren.&lt;/p&gt;</description>
<category_id>5</category_id>
<error_code></error_code>
<key_words>Blue Screen, Windows</key_words>
<domains><Set>
</Set>
</domains>
</FAQ>
</Set>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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' => '领域',
]);
//

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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+' => 'Типология протоколов потоков данных',
]);

View File

@@ -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+' => '数据流协议的分类',
]);

View File

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

View File

@@ -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 Hubs store, your one stop place to find wonderful iTop extensions !<br>Find the ones that will help you customize and adapt '.ITOP_APPLICATION_SHORT.' to your processes.<br><br>By connecting to the Hub from this page, you will push information about this '.ITOP_APPLICATION_SHORT.' instance into the Hub.</p>',
'iTopHub:GoBtn' => 'Go To iTop Hub~~',
'iTopHub:CloseBtn' => 'Close~~',
'iTopHub:GoBtn:Tooltip' => 'Jump to www.itophub.io~~',
'iTopHub:OpenInNewWindow' => 'Open iTop Hub in a new window~~',
'iTopHub:AutoSubmit' => 'Don\'t ask me again. Next time, go to iTop Hub automatically.~~',
'UI:About:RemoteExtensionSource' => 'iTop Hub~~',
'iTopHub:Explanation' => 'By clicking this button you will be redirected to iTop Hub.~~',
'iTopHub:BackupFreeDiskSpaceIn' => '%1$s free disk space in %2$s.~~',
'iTopHub:FailedToCheckFreeDiskSpace' => 'Failed to check free disk space.~~',
'iTopHub:BackupOk' => 'Backup Ok.~~',
'iTopHub:BackupFailed' => 'Backup failed!~~',
'iTopHub:Landing:Status' => 'Deployment status~~',
'iTopHub:Landing:Install' => 'Deploying extensions...~~',
'iTopHub:CompiledOK' => 'Compilation successful.~~',
'iTopHub:ConfigurationSafelyReverted' => 'Error detected during deployment!<br>'.ITOP_APPLICATION_SHORT.' configuration has NOT been modified.~~',
'iTopHub:FailAuthent' => 'Authentication failed for this action.~~',
'iTopHub:InstalledExtensions' => 'Extensions deployed on this instance~~',
'iTopHub:ExtensionCategory:Manual' => 'Extensions deployed manually~~',
'iTopHub:ExtensionCategory:Manual+' => 'The following extensions have been deployed by copying them manually in the %1$s directory of '.ITOP_APPLICATION_SHORT.':~~',
'iTopHub:ExtensionCategory:Remote' => 'Extensions deployed from iTop Hub~~',
'iTopHub:ExtensionCategory:Remote+' => 'The following extensions have been deployed from iTop Hub:~~',
'iTopHub:NoExtensionInThisCategory' => 'There is no extension in this category~~',
'iTopHub:NoExtensionInThisCategory+' => 'Browse iTop Hub to find the extensions that will help you customize and adapt '.ITOP_APPLICATION_SHORT.' to your processes !~~',
'iTopHub:ExtensionNotInstalled' => 'Not installed~~',
'iTopHub:GetMoreExtensions' => 'Get extensions from iTop Hub...~~',
'iTopHub:LandingWelcome' => 'Congratulations! The following extensions were downloaded from iTop Hub and deployed into your '.ITOP_APPLICATION_SHORT.'.~~',
'iTopHub:GoBackToITopBtn' => 'Go Back to '.ITOP_APPLICATION_SHORT.'~~',
'iTopHub:Uncompressing' => 'Uncompressing extensions...~~',
'iTopHub:InstallationWelcome' => 'Installation of the extensions downloaded from iTop Hub~~',
'iTopHub:DBBackupLabel' => 'Instance backup~~',
'iTopHub:DBBackupSentence' => 'Do a backup of the database and '.ITOP_APPLICATION_SHORT.' configuration before updating~~',
'iTopHub:DeployBtn' => 'Deploy !~~',
'iTopHub:DatabaseBackupProgress' => 'Instance backup...~~',
'iTopHub:InstallationEffect:Install' => 'Version: %1$s will be installed.~~',
'iTopHub:InstallationEffect:NoChange' => 'Version: %1$s already installed. Nothing will change.~~',
'iTopHub:InstallationEffect:Upgrade' => 'Will be <b>upgraded</b> from version %1$s to version %2$s.~~',
'iTopHub:InstallationEffect:Downgrade' => 'Will be <b>DOWNGRADED</b> from version %1$s to version %2$s.~~',
'iTopHub:InstallationProgress:DatabaseBackup' => ITOP_APPLICATION_SHORT.' Instance backup...~~',
'iTopHub:InstallationProgress:ExtensionsInstallation' => 'Installation of the extensions~~',
'iTopHub:InstallationEffect:MissingDependencies' => 'This extension cannot be installed because of unmet dependencies.~~',
'iTopHub:InstallationEffect:MissingDependencies_Details' => 'The extension requires the module(s): %1$s~~',
'iTopHub:InstallationProgress:InstallationSuccessful' => 'Installation successful!~~',
'iTopHub:InstallationStatus:Installed_Version' => '%1$s version: %2$s.~~',
'iTopHub:InstallationStatus:Installed' => 'Installed~~',
'iTopHub:InstallationStatus:Version_NotInstalled' => 'Version %1$s <b>NOT</b> installed.~~',
'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> установлена.',
]);

View File

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

View File

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

View File

@@ -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 пропущено',

View File

@@ -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' => '待处理的事件',
]);

View File

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

View File

@@ -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:
+ &quot;Storage device latency is high&quot; (Schwellwert überschritten: &gt; 30 ms).
+ &quot;Virtual machine disk I/O latency is high&quot;.
- 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 &quot;NMP: nmp_DeviceRequestFastDeviceProbe: NMP device state in doubt&quot; 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 &lt;NAA_ID&gt; --state in_use # Aktiven Pfad erzwingen
3. Die betroffenen VMs neu starten. ⚠️ Effekt: Löst das Problem für 2448 Stunden, danach tritt die Latenz nach Host-Neustart erneut auf.
Option 2: Multipathing für betroffene LUNs deaktivieren
1. In vCenter zu: Host &gt; Configure &gt; Storage &gt; Storage Devices navigieren.
2. Betroffene LUN auswählen &gt; Edit Multipathing Policy &gt; &quot;Fixed&quot; wählen (statt &quot;Most Recently Used&quot;). ⚠️ 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>&quot;Storage device latency is high&quot; &quot;Virtual machine disk I/O latency is high&quot;</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 &apos;Segmentation Fault&apos; 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: 510 Minuten (manueller Neustart erforderlich).
- Häufigkeit: 23 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:0004: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>

View File

@@ -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:
+ &quot;Storage device latency is high&quot; (Threshold exceeded: &gt; 30 ms).
+ &quot;Virtual machine disk I/O latency is high&quot;.
- 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 &quot;NMP: nmp_DeviceRequestFastDeviceProbe: NMP device state in doubt&quot; 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 &lt;NAA_ID&gt; --state in_use # Force active path
3. Restart the affected VMs. ⚠️ Effect: Resolves the issue for 2448 hours, but latency reappears after a host reboot.
Option 2: Disable Multipathing for Affected LUNs
1. In vCenter, navigate to: Host &gt; Configure &gt; Storage &gt; Storage Devices.
2. Select the affected LUN &gt; Edit Multipathing Policy &gt; Choose &quot;Fixed&quot; (instead of &quot;Most Recently Used&quot;). ⚠️ 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>&quot;Storage device latency is high&quot; &quot;Virtual machine disk I/O latency is high&quot;</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 &apos;Segmentation Fault&apos; 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: 510 minutes (manual restart required).
- Frequency: 23 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:0004: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>

View File

@@ -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:
+ &quot;Storage device latency is high&quot; (Threshold exceeded: &gt; 30 ms).
+ &quot;Virtual machine disk I/O latency is high&quot;.
- 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 dESXi 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 &quot;NMP: nmp_DeviceRequestFastDeviceProbe: NMP device state in doubt&quot; 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 &lt;NAA_ID&gt; --state in_use # Force active path
3. Redémarrer les VMs concernées. ⚠️ Effet : Résout le problème pendant 2448h, mais la latence réapparaît après un redémarrage de lhôte.
Option 2: Désactiver le multipathing pour les LUNs concernés
1. Dans vCenter, aller dans: Host &gt; Configure &gt; Storage &gt; Storage Devices.
2. Sélectionner le LUN concerné &gt; Edit Multipathing Policy &gt; Choisir &quot;Fixed&quot; (au lieu de &quot;Most Recently Used&quot;). ⚠️ Risque : Perte de redondance en cas de panne dun 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>&quot;Storage device latency is high&quot; &quot;Virtual machine disk I/O latency is high&quot;</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>

View File

@@ -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+' => 'Создать новую известную ошибку',

View File

@@ -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+' => '这个已知错误相关的所有文档',
]);
//

View File

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

View File

@@ -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' => 'Нет',
]);

View File

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

View File

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

View File

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