Compare commits

..

167 Commits

Author SHA1 Message Date
Denis Flaven
b4a33b521a Fix for supporting the CSV export of big audit results.
SVN:1.2.1[2597]
2013-02-06 14:38:24 +00:00
Denis Flaven
2bc01db8d9 Fix for Trac #670: XSS vulnerability issue.
SVN:1.2.1[2587]
2013-01-22 17:34:36 +00:00
Denis Flaven
d72503b411 Bug fix: (replicate what was done in the 1.2 branch) make sure that we differentiate the cache entries for the queries with and without the $bAllowAllData flag
SVN:1.2.1[2581]
2012-12-17 12:42:14 +00:00
Denis Flaven
71732f1722 Do not perform time consuming computations for building the menus if there are too many objects in a list (limit is configurable).
SVN:1.2.1[2343]
2012-10-24 14:00:26 +00:00
Denis Flaven
489c4c05e0 Do not perform time consuming computations for building the menus if there are too many objects in a list (limit is configurable).
SVN:1.2.1[2341]
2012-10-24 13:48:20 +00:00
Denis Flaven
f65e18400d Bug fix: regression introduced by revision 2278.
SVN:1.2.1[2339]
2012-10-24 13:18:26 +00:00
Denis Flaven
9a53938473 Optimization to speed-up the "group-by" tables. (The complete solution is implemented in 2.0)
SVN:1.2.1[2337]
2012-10-24 13:09:24 +00:00
Romain Quetiez
e2bd0b82c7 Fixed regression (CSV import - unknown method utils::GetConfig) -same fix as in branch 1.2
SVN:1.2.1[2323]
2012-10-22 08:09:31 +00:00
Romain Quetiez
48a067c286 #583 Losing attachments when performing massive change
SVN:1.2.1[2285]
2012-10-18 09:39:09 +00:00
Denis Flaven
bd933f3b14 Properly handle all types of fields when entering values via the state transition "wizard" screen
SVN:1.2.1[2281]
2012-10-17 14:13:22 +00:00
Denis Flaven
cb9bc8f6d7 Properly handle a change of an external key...
SVN:1.2.1[2278]
2012-10-17 13:31:24 +00:00
Romain Quetiez
dd61cd1697 Portal: enable adding dependent attributes in the request creation form -reintegrated from trunk
SVN:1.2.1[2275]
2012-10-17 12:56:41 +00:00
Romain Quetiez
dd0c22708c Portal: enable adding dependent attributes in the request creation form -reintegrated from trunk
SVN:1.2.1[2272]
2012-10-17 12:17:53 +00:00
Romain Quetiez
b6f6e7a1ff Fixed issue in the portal: the list of opened requests and closed request where messed up when pagination was activated on both lists -reintegrated from trunk
SVN:1.2.1[2269]
2012-10-17 09:13:24 +00:00
Romain Quetiez
db640fde59 CSV import: added a flag to disable the history tab (too long to display, when the feature is heavily used), reintegrated from trunk
SVN:1.2.1[2266]
2012-10-16 14:47:57 +00:00
Romain Quetiez
aa9933a6b3 #585 Error in CSV export (from a search result), some occurrences could still be found in UI.php, see change [2167] in trunk
SVN:1.2.1[2177]
2012-09-11 14:42:21 +00:00
Denis Flaven
7a9d70d15b Improved Japanese Localization, thanks to Shoji Seki
SVN:1.2.1[2173]
2012-09-10 09:52:10 +00:00
Denis Flaven
cd33335401 Improved Japanese Localization, thanks to Shoji Seki
SVN:1.2.1[2172]
2012-09-10 09:50:35 +00:00
Denis Flaven
9755af9b7b Bug fix: properly export boolean attributes to XML (a value of false was creating an empty XML tag)
SVN:1.2.1[2153]
2012-08-23 14:41:16 +00:00
Denis Flaven
5edf6ee43f Implemented Track #582: "stable name" for synchro_data_xxx tables
SVN:1.2.1[2135]
2012-07-25 14:43:42 +00:00
Romain Quetiez
00176a7f71 Fixed issue (seen at first login for a given user or in case of internal error: warning - preg_match_all...) revealed by the very recent change 2118
SVN:1.2.1[2119]
2012-07-04 08:49:34 +00:00
Erwan Taloc
4f8e62b44a Tranform attributeHTML into Long Text
Change attibute "Body" in EventNotificationEmail class to be displayed as HTML attribute

SVN:1.2.1[2118]
2012-07-03 14:49:18 +00:00
Denis Flaven
d1944c1af3 Bug fix: $this->label(attcode)$ used inside Email Notifications should not contain HTML entities since this not an HTML fragment.
SVN:1.2.1[2116]
2012-06-29 15:10:31 +00:00
Denis Flaven
470397e2fd Bug fix: support [+] button inside linkedsets.. with constraints (cf Revision 1913)
SVN:1.2.1[2115]
2012-06-28 12:15:52 +00:00
Denis Flaven
ea3fe45ce5 Fix for Trac #559: ldap user can login with blank password
SVN:1.2.1[2108]
2012-06-14 16:23:42 +00:00
Denis Flaven
5b39fd372f Updated the test list to take into account Trac #558 (hexadecimal numbers inside strings)
SVN:1.2.1[2105]
2012-06-14 09:26:20 +00:00
Denis Flaven
6bca068bbe Fixed Trac #558: properly parse strings containing hexadecimal sequences (i.e. 'QWERTY0xCUIOP').
Note that for now hexadecimal numbers are parsed but not interpreted properly...

SVN:1.2.1[2102]
2012-06-14 09:14:47 +00:00
Romain Quetiez
4c0150378c Fixed regression (See #556) due to the existence of an overload of the protected API GetUserOrgs
SVN:1.2.1[2099]
2012-06-14 07:40:41 +00:00
Romain Quetiez
be4d017f4c #556 Continuation (suppressed a warning)
SVN:1.2.1[2082]
2012-06-05 15:38:39 +00:00
Romain Quetiez
ffd816038d #556 Reworked the caching of user rights data (really too slow for > 1000 users)
SVN:1.2.1[2081]
2012-06-05 15:22:25 +00:00
Denis Flaven
9818214ec8 Protects against too long strings when logging web services events
SVN:1.2.1[1962]
2012-04-19 11:18:41 +00:00
Romain Quetiez
f115e0b120 Fixed bug on the export for Excel: time is given in am-pm format (there is no way to know wether it is in the morning or the afternoon)
SVN:1.2.1[1945]
2012-04-06 09:32:00 +00:00
Denis Flaven
10b81f0569 Properly log-off (and report the issue in the log) in case we fail to create a user during the CAS Synchro
SVN:1.2.1[1941]
2012-04-04 10:06:43 +00:00
Romain Quetiez
3d5c05f6d4 Updated schema.php to add web link to link class on linked set attributes
SVN:1.2.1[1938]
2012-04-03 11:25:41 +00:00
Romain Quetiez
46c71fcefc #540 Data synchro: the option "write if empty" was not implemented
SVN:1.2.1[1932]
2012-03-29 13:28:40 +00:00
Denis Flaven
198898ada4 Bug fix: to do not try to access a DataSource while it's being deleted
SVN:1.2.1[1930]
2012-03-27 11:32:51 +00:00
Denis Flaven
42f355a592 CAS integration. Done.
SVN:1.2.1[1920]
2012-03-22 15:29:53 +00:00
Denis Flaven
ab1fc4b1b5 CAS integration:
- regression fix: support patterns for the MemberOf groups filtering
- activate/de-activate the profiles synchronization using the 'cas_update_profiles' configuration flag
- provide default profile(s) when creating a new user from CAS, only if no match is found for assigning profiles from the CAS MemberOf group(s).
....

SVN:1.2.1[1918]
2012-03-22 15:14:49 +00:00
Denis Flaven
2273e2dbaa Don't trigger a full search when the entered text is empty !
SVN:1.2.1[1866]
2012-02-21 14:09:21 +00:00
Denis Flaven
68412f53a4 Typo!
SVN:1.2.1[1865]
2012-02-21 14:07:40 +00:00
Denis Flaven
7c7b657d71 Bug fix: Reset the URLMaker context after generating the notifications
SVN:1.2.1[1864]
2012-02-21 14:07:12 +00:00
Denis Flaven
42dc240aac Creating the 1.2.1 branch for maintenance purposes
SVN:1.2.1[1844]
2012-02-07 09:26:12 +00:00
Denis Flaven
fac1084b1d Release 1.2.1
SVN:1.2.1[1839]
2012-02-01 16:14:47 +00:00
Denis Flaven
e623467782 Readme updated for the 1.2.1 release.
SVN:1.2[1838]
2012-02-01 10:27:10 +00:00
Denis Flaven
32208fcbfc Readme updated for the 1.2.1 release.
SVN:1.2[1837]
2012-02-01 10:24:31 +00:00
Denis Flaven
dcbff406f7 Fix to the Brazilian translation: thanks to Google translate !
SVN:1.2[1836]
2012-01-31 17:51:15 +00:00
Denis Flaven
017dfe641c Update to the Brazilian translation, thanks to Marco Tulio
SVN:1.2[1834]
2012-01-31 17:48:02 +00:00
Denis Flaven
fad258cd2d (Tried to) improve the display of the Synchronization Tooltip that "sometimes" does not work on IE 8...
SVN:1.2[1832]
2012-01-31 17:30:59 +00:00
Denis Flaven
3470ce18e8 Removed a (useless) hardcoded reference to FunctionalCI
SVN:1.2[1830]
2012-01-31 15:39:35 +00:00
Denis Flaven
af710c549f SQL Block with parameters were always displayed as table, whatever their type...
SVN:1.2[1828]
2012-01-31 15:04:23 +00:00
Denis Flaven
ee938d674d Fixed typos during the copy/paste for automatic account creation
SVN:1.2[1826]
2012-01-31 12:36:05 +00:00
Denis Flaven
423de35cf5 Fixed the encoding of mail headers !
SVN:1.2[1825]
2012-01-31 12:35:34 +00:00
Denis Flaven
6a7af8ad73 Make the OQLQuery class import-able
SVN:1.2[1822]
2012-01-30 17:46:00 +00:00
Denis Flaven
89732d6e52 Put some default reconciliation keys to ease the use of CSV import
SVN:1.2[1820]
2012-01-30 17:42:54 +00:00
Denis Flaven
cddeab2c90 Protect against empty list of reconciliation keys
SVN:1.2[1818]
2012-01-30 17:38:45 +00:00
Denis Flaven
d9d84703ae Fix to have the proper use of GetEditValue... thanks to C. Naud
SVN:1.2[1817]
2012-01-30 12:49:04 +00:00
Romain Quetiez
c3de9ecf10 Export for spreadsheets: transform keys (id of the queried object or external keys) into the corresponding friendly name
SVN:1.2[1815]
2012-01-30 10:58:21 +00:00
Denis Flaven
cf37a50b3d Enhancements to the German localization
SVN:1.2[1814]
2012-01-30 10:45:27 +00:00
Romain Quetiez
4db30648c2 Object details: log always displayed AFTER plugin data
SVN:1.2[1812]
2012-01-27 13:51:17 +00:00
Denis Flaven
8de84d5ec7 Fixed Trac#518 : Properly pass the context (i.e. currently selected org) to the auto-refresh lists
SVN:1.2[1810]
2012-01-25 10:27:23 +00:00
Denis Flaven
459a271d11 Fixed Trac#522: issue with non-ASCII characters in notifications subject.
SVN:1.2[1809]
2012-01-24 18:24:34 +00:00
Denis Flaven
9da00b83b2 Added the ability to display a custom welcome/disclaimer message at the bottom of the login form.
SVN:1.2[1807]
2012-01-24 15:24:25 +00:00
Denis Flaven
0c8ef6a690 Why put "APPROOT/modules/" as the AbsoluteUrlAppRoot in the portal ??
SVN:1.2[1804]
2012-01-24 14:26:39 +00:00
Denis Flaven
cdefd7a4c6 Hmmm, also may cause troubles for bug #519...
SVN:1.2[1801]
2012-01-24 13:04:39 +00:00
Romain Quetiez
4f057ac29f Improved the check on data model consistency: detection of SQL columns used by two attributes
SVN:1.2[1800]
2012-01-24 13:01:55 +00:00
Denis Flaven
ab16588f87 Fix for Trac#519 - change password bug !
SVN:1.2[1799]
2012-01-24 13:00:15 +00:00
Denis Flaven
07d8da9d99 Added the "search" form on top of the list of users
SVN:1.2[1796]
2012-01-20 15:24:33 +00:00
Romain Quetiez
c539f19ce9 Optimized memory usage when auditing large volumes of CIs (10'000 items was requiring 200 Mb, it now runs with 32 Mb -including the 30Mb overhead!)
SVN:1.2[1795]
2012-01-20 15:03:07 +00:00
Denis Flaven
3635e60850 Typo fix
SVN:1.2[1794]
2012-01-20 14:19:56 +00:00
Denis Flaven
b278b84f46 Fixed #481: localized characters in Service / Service Category name and description were not properly displayed.
SVN:1.2[1793]
2012-01-20 14:16:20 +00:00
Romain Quetiez
04647970a8 Case log now largely bigger than 64 Kilobytes... (reintegrated change made in trunk)
SVN:1.2[1791]
2012-01-19 15:32:48 +00:00
Romain Quetiez
fe58f6bd19 Fixed regression in the tool to test queries: losing the query when there is a syntax error
SVN:1.2[1788]
2012-01-19 10:13:36 +00:00
Romain Quetiez
0d6cd529a1 #516 and #517 Improved the export (specify fields for multi-column queries) and web queries (default field list)
SVN:1.2[1786]
2012-01-18 16:59:09 +00:00
Denis Flaven
2a155fe8ee Added SetMessageId for forward compatibility with SwiftMailer
SVN:1.2[1785]
2012-01-18 10:05:12 +00:00
Romain Quetiez
3f381a3530 Partially de-hardcoded against the subdirectory "modules", so that 1.2.1 should be compatible with modules running under 2.0.
SVN:1.2[1778]
2012-01-17 15:26:02 +00:00
Denis Flaven
7fadb5e08b Added self-registering / user synchronization extensibility
SVN:1.2[1760]
2012-01-11 16:01:11 +00:00
Denis Flaven
5d4476f48b Added self-registering / user synchronization extensibility
SVN:1.2[1757]
2012-01-11 14:31:44 +00:00
Romain Quetiez
2fbb37cc2f Readme updated, ready for 1.2.1 beta
SVN:1.2[1753]
2011-12-22 10:34:00 +00:00
Denis Flaven
6801ecb266 Updated the readme file to prepare for the 1.2.1 beta release
SVN:1.2[1752]
2011-12-22 10:29:27 +00:00
Romain Quetiez
fa821d3a9b #512 Allow the CLI mode for export.php
SVN:1.2[1750]
2011-12-21 15:28:50 +00:00
Denis Flaven
00f9deeaa5 Updated the readme file to prepare for the 1.2.1 beta release
SVN:1.2[1747]
2011-12-21 15:14:41 +00:00
Romain Quetiez
58cfc1d51b CSV import (both std and related to the data synchro) can be used with a tab (keyword 'tab', case insensitive)
SVN:1.2[1746]
2011-12-21 14:46:03 +00:00
Denis Flaven
af8b3b972d Fixed Trac #480: properly take into account the 'min_autocomplete_chars' settings.
SVN:1.2[1745]
2011-12-21 14:23:20 +00:00
Denis Flaven
07671f40fd Allow a module to restrict the access to a given menu/group by redeclaring the menu with restricted rights. All rights are combined with the AND operator.
SVN:1.2[1743]
2011-12-21 14:17:03 +00:00
Denis Flaven
3da5c65fe4 Allow to filter which class(es) of objects are displayed in the graphical impact analysis view
SVN:1.2[1742]
2011-12-21 14:15:27 +00:00
Romain Quetiez
489be44b90 #489 Data synchro: reintegrated the latest improvements from trunk.
SVN:1.2[1740]
2011-12-21 13:45:07 +00:00
Denis Flaven
912088d017 Fixed Trac #486: SQL dashboards limitations
SVN:1.2[1730]
2011-12-20 15:17:14 +00:00
Denis Flaven
06620133b6 Bug fix: missing (but useless) parameter in ExpandArgs causes a notice...
SVN:1.2[1728]
2011-12-20 12:41:05 +00:00
Denis Flaven
95d7a24630 Keep the current value iin the search form when reloading the search form for a different (sub)class. For example Contact => Person.
SVN:1.2[1726]
2011-12-19 17:30:02 +00:00
Denis Flaven
cb0e1d8ef3 When searching objects to add to the current object (n:n relationship), set the default search params in order to stay in the current silo.
SVN:1.2[1724]
2011-12-19 16:50:39 +00:00
Denis Flaven
d321ebc8e4 Bug fix: apply the AllowedValues constraints(as default values) when selecting elements via the "magnifier" button or creating an new element via the "plus" button... also make sure that allowed values is enforced
SVN:1.2[1721]
2011-12-15 10:46:48 +00:00
Romain Quetiez
c149ec8e2c #485 Improved the end-user experience with Excel and the web queries (added a phrasebook) + link to test the OQL attributes (query phrasebook or email actions, etc.) including the handlink of query arguments) + fixed wrong prototypes for a few implementations of GetBareProperties()
SVN:1.2[1719]
2011-12-14 17:44:06 +00:00
Denis Flaven
281adfb043 Bug fix: apply the AllowedValues constraints(as default values) when selecting elements via the "magnifier" button or creating an new element via the "plus" button.
SVN:1.2[1715]
2011-12-13 14:43:33 +00:00
Romain Quetiez
4244029087 #485 Export for MS Excel web queries: format=spreadsheet
SVN:1.2[1713]
2011-12-13 14:30:36 +00:00
Denis Flaven
78e173d5fb Bug fix: paginated lists were broken in the Impact Analysis "List" tab
SVN:1.2[1708]
2011-12-07 10:41:13 +00:00
Romain Quetiez
6b8abce03a - commited merge information (done earlier) -
SVN:1.2[1705]
2011-12-06 13:52:44 +00:00
Denis Flaven
33a7005069 - Bug ! Incorrectly appending a parameter ?version= to linked scripts already containing a parameter in their URL !
- changed the parameter name to itopversion to avoid collisions

SVN:1.2[1702]
2011-12-01 17:18:47 +00:00
Denis Flaven
006a6037d1 Increased Suhosin minimum value for get_max_value to 2048 due to a bug seen on some installations
SVN:1.2[1700]
2011-11-30 13:23:32 +00:00
Denis Flaven
e2f8be1745 Use the default language when creating a new user from CAS
SVN:1.2[1698]
2011-11-29 15:56:24 +00:00
Denis Flaven
ebae45f6a5 Support patterns for casMemberof
SVN:1.2[1696]
2011-11-29 15:36:58 +00:00
Denis Flaven
0685835d49 Allow to log entries on behalf of another user
SVN:1.2[1694]
2011-11-24 17:22:19 +00:00
Romain Quetiez
1b1e88f9a4 In french, organiZation takes an S
SVN:1.2[1691]
2011-11-23 15:30:11 +00:00
Denis Flaven
b90f443e75 - Don't create warnings for empty ext keys (i.e. empty string)
- Properly record multiple warnings
- Don't record warnings in case of creation error (error has precedence)

SVN:1.2[1689]
2011-11-23 09:55:44 +00:00
Romain Quetiez
4da64a64b1 Cosmetic on the API of the dictionnary (internal)
SVN:1.2[1686]
2011-11-21 17:03:36 +00:00
Denis Flaven
6673e171dc Properly handle restrictions (e.g. AllowedValues) on objects that are used as n:n relationships managed via LinksWidget.
SVN:1.2[1685]
2011-11-21 13:08:10 +00:00
Denis Flaven
afee7297cc Properly handle restrictions (e.g. AllowedValues) on objects that are used as n:n relationships managed via LinksWidget.
SVN:1.2[1683]
2011-11-21 10:57:50 +00:00
Denis Flaven
3cc8b5b88a Enhancement: when an (optional) external key cannot be reconciled, log a warning on the replica. the replicas containing a warning are then processed everytime in case the ext key changes
Also improved the search/display of replicas

SVN:1.2[1678]
2011-11-18 11:42:29 +00:00
Romain Quetiez
b2e6981b24 Fixed bug in change tracking: it was impossible to factorize code creating objects in the background either in the context of an object update or in the context of the application of a stimulus
SVN:1.2[1674]
2011-11-18 10:46:42 +00:00
Denis Flaven
c0a79fa573 Prevent warnings when checking the available stimuli in the menu...
SVN:1.2[1672]
2011-11-16 17:26:27 +00:00
Denis Flaven
02ad6d19fe Prevent Javascript errors in case a name contains a quote.
SVN:1.2[1670]
2011-11-15 13:12:22 +00:00
Denis Flaven
d16308ab62 - Reload the object after applying a stimulus, in case an action has an effect on an external field...
SVN:1.2[1665]
2011-11-14 10:44:31 +00:00
Denis Flaven
4598959bc2 - Reload the object after applying a stimulus, in case an action has an effect on an external field...
SVN:1.2[1664]
2011-11-14 10:43:06 +00:00
Denis Flaven
65a3755f81 - Regression from previous fix: don't Reload an object before saving it !
SVN:1.2[1662]
2011-11-10 16:37:18 +00:00
Denis Flaven
dc46c65499 - Don't activate triggers if the transition fails
- Reload the object, in case some custom action changed an external object

SVN:1.2[1659]
2011-11-10 10:12:43 +00:00
Denis Flaven
9d691c8e56 Removed obsolete code which caused a warning in bulk_stimulus
SVN:1.2[1658]
2011-11-10 10:07:28 +00:00
Denis Flaven
99f897bff7 Better error handling in case of OQL error
SVN:1.2[1657]
2011-11-09 17:07:25 +00:00
Denis Flaven
8d83447222 Added the capability for plug-ins to "listen" to add/remove attachment events.
SVN:1.2[1652]
2011-10-28 12:46:22 +00:00
Romain Quetiez
dcc8ad08a4 New helper class: TemplateString - to allow extended syntaxes such as $this->location_id->org_id->parent_id->name$... to be progressively introduced and replace the heavy ToArgs()
SVN:1.2[1646]
2011-10-24 13:45:49 +00:00
Denis Flaven
c1b0b73b51 Bug fix: Trac #494. It seems that PHPSoap does not understand the <wsdl:documentation> tag.
SVN:1.2[1644]
2011-10-21 08:42:13 +00:00
Romain Quetiez
81173decca Fixed issue: nobody in the list of persons to notify for portal users (security takes precedence)
SVN:1.2[1641]
2011-10-21 08:05:07 +00:00
Denis Flaven
9aca062bf5 Enhancement to provide a forward compatible API for some external plugins: support adding attachments to an email in a "clean" way.
SVN:1.2[1640]
2011-10-20 16:33:46 +00:00
Denis Flaven
09aba95d0a Fixed Trac #493: incorrect display of Users' Grant Matrix
SVN:1.2[1635]
2011-10-17 09:27:23 +00:00
Denis Flaven
1683ca2dd6 Merged some enhancements fro the trunk to better keep track of sent emails
SVN:1.2[1634]
2011-10-13 15:42:59 +00:00
Denis Flaven
9e732d6045 Fixed Trac #487: resizable text areas disappeared when located on the second tab !
SVN:1.2[1628]
2011-10-04 10:52:03 +00:00
Denis Flaven
69df343bd2 Automatic synchro of CAS/LDAP users
SVN:1.2[1627]
2011-10-03 14:07:29 +00:00
Denis Flaven
eb8f49ebfe Initializes the admin contact's phone number, in case it is a mandatory field in the data model...
SVN:1.2[1623]
2011-09-30 08:03:45 +00:00
Denis Flaven
398e294604 Prevent crash when trying to load the favicon during the setup !
SVN:1.2[1621]
2011-09-29 15:27:25 +00:00
Denis Flaven
d04c6bccd5 Added a link to a favicon (icon in the browser's bar and tab)
SVN:1.2[1619]
2011-09-29 14:54:03 +00:00
Denis Flaven
f00c7c6bc2 GetValueLabel is used in some dashboards... make sure that it is available for any attribute
SVN:1.2[1617]
2011-09-29 09:46:58 +00:00
Denis Flaven
d30e8c359f Make sure that the organisation's drop-down list is not bigger than the left menu...
SVN:1.2[1616]
2011-09-29 09:44:38 +00:00
Romain Quetiez
2bd4a61c00 #485 Export.php improved for integration into Excel / web queries (bug with IIS/HTTPS, limitation on the size of the OQL)
SVN:1.2[1613]
2011-09-29 08:12:28 +00:00
Romain Quetiez
ba3080594c #485 Export.php improved for integration into Excel / web queries (bug with IIS/HTTPS, limitation on the size of the OQL)
SVN:trunk[1612]
2011-09-29 08:07:37 +00:00
Romain Quetiez
e35c8323df Merge most recent (few) bug fixes from trunk
SVN:1.2[1611]
2011-09-28 14:38:37 +00:00
Romain Quetiez
e4e814281d #484 Fixed issue with IIS ("Wrong password" at first prompt)
SVN:1.2[1610]
2011-09-28 12:59:40 +00:00
Romain Quetiez
a3a94cccbb #484 Fixed issue with IIS ("Wrong password" at first prompt)
SVN:trunk[1609]
2011-09-28 12:55:15 +00:00
Denis Flaven
635cb424a2 Fixed Trac #482: OpenSearch broken.
SVN:1.2[1608]
2011-09-28 10:50:58 +00:00
Romain Quetiez
e8c8e4a0d7 #481 Special characters not transcribed correctly in Portal (regression in 1.2)
SVN:trunk[1607]
2011-09-28 10:17:53 +00:00
Denis Flaven
5b3350f6d5 Fixed Trac #482: link to OpenSearch Xml page was broken
SVN:trunk[1606]
2011-09-28 10:07:27 +00:00
Denis Flaven
b454b24e0f Rename the cron.params file to avoid overwriting the current config when updating.
SVN:trunk[1605]
2011-09-23 14:14:58 +00:00
Romain Quetiez
e95aa6cc69 Merged latest changes in module Attachments (bug fix on install and cosmetic improvements)
SVN:1.2[1604]
2011-09-23 13:49:26 +00:00
Romain Quetiez
c58fd17fc9 Fixed regression on attribute labels; introduced in [1582]
SVN:1.2[1603]
2011-09-23 13:36:57 +00:00
Romain Quetiez
099afb5451 Fixed regression on attribute labels; introduced in [1581]
SVN:trunk[1602]
2011-09-23 13:30:21 +00:00
Denis Flaven
ec226ce76d Cosmetic fix: the "loading..." indicator was visible/spinning when reloading any other field of the form !
SVN:trunk[1601]
2011-09-22 16:37:47 +00:00
Denis Flaven
5080bd58d5 Removed some Debug/Warning messages
SVN:trunk[1600]
2011-09-22 16:35:33 +00:00
Romain Quetiez
efdec7a343 #478 Fixed issue in the audit: the results are wrong whenever an organization is selected
SVN:1.2[1599]
2011-09-22 12:08:11 +00:00
Denis Flaven
5ec37fd26a - Fix a problem with the upgrade (case sensitive table name & prefix)
SVN:trunk[1598]
2011-09-22 11:58:42 +00:00
Romain Quetiez
2352c05d36 Fixed security issue: the attachments were visible by anybody (by forming URLs manually), whatever the allowed organizations. The change requires the execution of the setup/migration procedure.
SVN:1.2[1597]
2011-09-22 11:58:31 +00:00
Denis Flaven
8ae92cb50e - Fix a problem with the upgrade (case sensitive table name & prefix)
- Display a message when there is no attachment

SVN:trunk[1596]
2011-09-22 11:53:49 +00:00
Romain Quetiez
f82a4ada23 #478 Fixed issue in the audit: the results are wrong whenever an organization is selected
SVN:trunk[1595]
2011-09-22 11:40:30 +00:00
Denis Flaven
e5ce12ed0a Make the template system work for real !
SVN:trunk[1594]
2011-09-22 11:15:40 +00:00
Denis Flaven
428f1a26cc Typo ! Impact: Unknown ?
SVN:trunk[1593]
2011-09-22 11:08:34 +00:00
Romain Quetiez
9976999a88 Portal: updated dictionary for new buttton "reopen request"
SVN:trunk[1592]
2011-09-22 10:08:36 +00:00
Romain Quetiez
da2b8ab4c0 Fixed security issue: the attachments were visible by anybody (by forming URLs manually), whatever the allowed organizations. The change requires the execution of the setup/migration procedure.
SVN:trunk[1591]
2011-09-22 09:04:12 +00:00
Romain Quetiez
0de75db474 Portal (regression with the latest implementation, causing a warning)
SVN:trunk[1590]
2011-09-21 12:59:16 +00:00
Romain Quetiez
23634964a5 #477 Could not specify more than one reconciliation key (regression) + took the opportunity to enhance protection against XSS injection (using column names in the data)
SVN:1.2[1589]
2011-09-21 12:39:22 +00:00
Romain Quetiez
b014596172 #477 Could not specify more than one reconciliation key (regression) + took the opportunity to enhance protection against XSS injection (using column names in the data)
SVN:trunk[1588]
2011-09-21 12:27:08 +00:00
Romain Quetiez
b46ed4764d Fixed bug in the new portal: the wizard validation was inoperant when several selection lists were proposed
SVN:trunk[1587]
2011-09-20 13:50:11 +00:00
Romain Quetiez
2b1aecda53 Fixed recent regression on the portal (confusion btw GetContactId and GetUserId)
SVN:trunk[1586]
2011-09-20 08:22:54 +00:00
Romain Quetiez
619252db99 Merge fix on previous change (fixed #473, but getting a warning)
SVN:1.2[1585]
2011-09-19 11:49:43 +00:00
Romain Quetiez
19318973ca Fixed warning (strict standards) on previous fix
SVN:trunk[1584]
2011-09-19 11:44:04 +00:00
Romain Quetiez
ca4dbd833c (record merge info)
SVN:1.2[1583]
2011-09-19 10:58:40 +00:00
Romain Quetiez
f62a3b22a3 #473 Could not load NW interfaces (reconciliation issue) - merged from trunk
SVN:1.2[1582]
2011-09-19 10:55:24 +00:00
Romain Quetiez
cac76a7e08 #473 Could not load NW interfaces (reconciliation issue)
SVN:trunk[1581]
2011-09-19 10:36:47 +00:00
Romain Quetiez
88416bca5d Created branch 1.2
SVN:1.2[1580]
2011-09-19 10:30:29 +00:00
Romain Quetiez
abd645ca98 Fixed regressions in the portal
SVN:trunk[1579]
2011-09-15 15:25:30 +00:00
Romain Quetiez
7301cb9369 Updated the dictionnaries for the latest changes into the portal
SVN:trunk[1578]
2011-09-15 10:26:50 +00:00
Romain Quetiez
559de3d38f Portal reworked (code factorization, allowing for paginated lists) + added the list of closed tickets (+search)
SVN:trunk[1577]
2011-09-15 10:06:46 +00:00
113 changed files with 13723 additions and 10115 deletions

View File

@@ -557,6 +557,10 @@ class UserRightsProfile extends UserRightsAddOnAPI
{
$oContact->Set('org_id', $iOrgId);
}
if (MetaModel::IsValidAttCode('Person', 'phone'))
{
$oContact->Set('phone', '+00 000 000 000');
}
$oContact->Set('email', 'my.email@foo.org');
$iContactId = $oContact->DBInsertTrackedNoReload($oChange, true /* skip security */);
}
@@ -593,12 +597,12 @@ class UserRightsProfile extends UserRightsAddOnAPI
}
protected $m_aAdmins; // id of users being linked to the well-known admin profile
protected $m_aPortalUsers; // id of users being linked to the well-known admin profile
protected $m_aAdmins = array(); // id -> bool, true if the user has the well-known admin profile
protected $m_aPortalUsers = array(); // id -> bool, true if the user has the well-known portal user profile
protected $m_aProfiles; // id -> object
protected $m_aUserProfiles; // userid,profileid -> object
protected $m_aUserOrgs; // userid -> orgid
protected $m_aUserProfiles = array(); // userid,profileid -> object
protected $m_aUserOrgs = array(); // userid -> array of orgid
// Those arrays could be completed on demand (inheriting parent permissions)
protected $m_aClassActionGrants = null; // profile, class, action -> actiongrantid (or false if NO, or null/missing if undefined)
@@ -607,20 +611,64 @@ class UserRightsProfile extends UserRightsAddOnAPI
// Built on demand, could be optimized if necessary (doing a query for each attribute that needs to be read)
protected $m_aObjectActionGrants = array();
/**
* Read and cache organizations allowed to the given user
*
* @param oUser
* @param sClass -not used here but can be used in overloads
*/
protected function GetUserOrgs($oUser, $sClass)
{
return @$this->m_aUserOrgs[$oUser->GetKey()];
$iUser = $oUser->GetKey();
if (!array_key_exists($iUser, $this->m_aUserOrgs))
{
$oSearch = new DBObjectSearch('URP_UserOrg');
$oSearch->AllowAllData();
$oCondition = new BinaryExpression(new FieldExpression('userid'), '=', new VariableExpression('userid'));
$oSearch->AddConditionExpression($oCondition);
$this->m_aUserOrgs[$iUser] = array();
$oUserOrgSet = new DBObjectSet($oSearch, array(), array('userid' => $iUser));
while ($oUserOrg = $oUserOrgSet->Fetch())
{
$this->m_aUserOrgs[$iUser][] = $oUserOrg->Get('allowed_org_id');
}
}
return $this->m_aUserOrgs[$iUser];
}
/**
* Read and cache profiles of the given user
*/
protected function GetUserProfiles($iUser)
{
if (!array_key_exists($iUser, $this->m_aUserProfiles))
{
$oSearch = new DBObjectSearch('URP_UserProfile');
$oSearch->AllowAllData();
$oCondition = new BinaryExpression(new FieldExpression('userid'), '=', new VariableExpression('userid'));
$oSearch->AddConditionExpression($oCondition);
$this->m_aUserProfiles[$iUser] = array();
$oUserProfileSet = new DBObjectSet($oSearch, array(), array('userid' => $iUser));
while ($oUserProfile = $oUserProfileSet->Fetch())
{
$this->m_aUserProfiles[$iUser][$oUserProfile->Get('profileid')] = $oUserProfile;
}
}
return $this->m_aUserProfiles[$iUser];
}
public function ResetCache()
{
// Loaded by Load cache
$this->m_aProfiles = null;
$this->m_aUserProfiles = null;
$this->m_aUserOrgs = null;
$this->m_aUserProfiles = array();
$this->m_aUserOrgs = array();
$this->m_aAdmins = null;
$this->m_aPortalUsers = null;
$this->m_aAdmins = array();
$this->m_aPortalUsers = array();
// Loaded on demand (time consuming as compared to the others)
$this->m_aClassActionGrants = null;
@@ -662,30 +710,6 @@ class UserRightsProfile extends UserRightsAddOnAPI
$this->m_aProfiles[$oProfile->GetKey()] = $oProfile;
}
$oUserProfileSet = new DBObjectSet(DBObjectSearch::FromOQL_AllData("SELECT URP_UserProfile"));
$this->m_aUserProfiles = array();
$this->m_aAdmins = array();
$this->m_aPortalUsers = array();
while ($oUserProfile = $oUserProfileSet->Fetch())
{
$this->m_aUserProfiles[$oUserProfile->Get('userid')][$oUserProfile->Get('profileid')] = $oUserProfile;
if ($oUserProfile->Get('profile') == ADMIN_PROFILE_NAME)
{
$this->m_aAdmins[] = $oUserProfile->Get('userid');
}
elseif ($oUserProfile->Get('profile') == PORTAL_PROFILE_NAME)
{
$this->m_aPortalUsers[] = $oUserProfile->Get('userid');
}
}
$oUserOrgSet = new DBObjectSet(DBObjectSearch::FromOQL_AllData("SELECT URP_UserOrg"));
$this->m_aUserOrgs = array();
while ($oUserOrg = $oUserOrgSet->Fetch())
{
$this->m_aUserOrgs[$oUserOrg->Get('userid')][] = $oUserOrg->Get('allowed_org_id');
}
$this->m_aClassStimulusGrants = array();
$oStimGrantSet = new DBObjectSet(DBObjectSearch::FromOQL_AllData("SELECT URP_StimulusGrant"));
$this->m_aStimGrants = array();
@@ -712,32 +736,45 @@ exit;
public function IsAdministrator($oUser)
{
$this->LoadCache();
if (in_array($oUser->GetKey(), $this->m_aAdmins))
//$this->LoadCache();
$iUser = $oUser->GetKey();
if (!array_key_exists($iUser, $this->m_aAdmins))
{
return true;
}
else
{
return false;
$bIsAdmin = false;
foreach($this->GetUserProfiles($iUser) as $oUserProfile)
{
if ($oUserProfile->Get('profile') == ADMIN_PROFILE_NAME)
{
$bIsAdmin = true;
break;
}
}
$this->m_aAdmins[$iUser] = $bIsAdmin;
}
return $this->m_aAdmins[$iUser];
}
public function IsPortalUser($oUser)
{
$this->LoadCache();
if (in_array($oUser->GetKey(), $this->m_aPortalUsers))
//$this->LoadCache();
$iUser = $oUser->GetKey();
if (!array_key_exists($iUser, $this->m_aPortalUsers))
{
return true;
}
else
{
return false;
$bIsPortalUser = false;
foreach($this->GetUserProfiles($iUser) as $oUserProfile)
{
if ($oUserProfile->Get('profile') == PORTAL_PROFILE_NAME)
{
$bIsPortalUser = true;
break;
}
}
$this->m_aPortalUsers[$iUser] = $bIsPortalUser;
}
return $this->m_aPortalUsers[$iUser];
}
public function GetSelectFilter($oUser, $sClass)
{
$this->LoadCache();
@@ -782,9 +819,9 @@ exit;
// Position the user
//
$aUserOrgs = $this->GetUserOrgs($oUser, $sClass);
if (is_null($aUserOrgs) || count($aUserOrgs) == 0)
if (count($aUserOrgs) == 0)
{
// No position means 'Everywhere'
// No org means 'any org'
return true;
}
@@ -879,33 +916,30 @@ exit;
$iPermission = UR_ALLOWED_NO;
$aAttributes = array();
if (isset($this->m_aUserProfiles[$iUser]))
foreach($this->GetUserProfiles($iUser) as $iProfile => $oProfile)
{
foreach($this->m_aUserProfiles[$iUser] as $iProfile => $oProfile)
$iGrant = $this->GetProfileActionGrant($iProfile, $sClass, $sAction);
if (is_null($iGrant) || !$iGrant)
{
$iGrant = $this->GetProfileActionGrant($iProfile, $sClass, $sAction);
if (is_null($iGrant) || !$iGrant)
continue; // loop to the next profile
}
else
{
$iPermission = UR_ALLOWED_YES;
// update the list of attributes with those allowed for this profile
//
$oSearch = DBObjectSearch::FromOQL_AllData("SELECT URP_AttributeGrant WHERE actiongrantid = :actiongrantid");
$oSet = new DBObjectSet($oSearch, array(), array('actiongrantid' => $iGrant));
$aProfileAttributes = $oSet->GetColumnAsArray('attcode', false);
if (count($aProfileAttributes) == 0)
{
continue; // loop to the next profile
$aAllAttributes = array_keys(MetaModel::ListAttributeDefs($sClass));
$aAttributes = array_merge($aAttributes, $aAllAttributes);
}
else
{
$iPermission = UR_ALLOWED_YES;
// update the list of attributes with those allowed for this profile
//
$oSearch = DBObjectSearch::FromOQL_AllData("SELECT URP_AttributeGrant WHERE actiongrantid = :actiongrantid");
$oSet = new DBObjectSet($oSearch, array(), array('actiongrantid' => $iGrant));
$aProfileAttributes = $oSet->GetColumnAsArray('attcode', false);
if (count($aProfileAttributes) == 0)
{
$aAllAttributes = array_keys(MetaModel::ListAttributeDefs($sClass));
$aAttributes = array_merge($aAttributes, $aAllAttributes);
}
else
{
$aAttributes = array_merge($aAttributes, $aProfileAttributes);
}
$aAttributes = array_merge($aAttributes, $aProfileAttributes);
}
}
}
@@ -970,16 +1004,13 @@ exit;
// Note: The object set is ignored because it was interesting to optimize for huge data sets
// and acceptable to consider only the root class of the object set
$iPermission = UR_ALLOWED_NO;
if (isset($this->m_aUserProfiles[$iUser]))
foreach($this->GetUserProfiles($iUser) as $iProfile => $oProfile)
{
foreach($this->m_aUserProfiles[$iUser] as $iProfile => $oProfile)
$oGrantRecord = $this->GetClassStimulusGrant($iProfile, $sClass, $sStimulusCode);
if (!is_null($oGrantRecord))
{
$oGrantRecord = $this->GetClassStimulusGrant($iProfile, $sClass, $sStimulusCode);
if (!is_null($oGrantRecord))
{
// no need to fetch the record, we've requested the records having permission = 'yes'
$iPermission = UR_ALLOWED_YES;
}
// no need to fetch the record, we've requested the records having permission = 'yes'
$iPermission = UR_ALLOWED_YES;
}
}
return $iPermission;

View File

@@ -88,6 +88,11 @@ class ajax_page extends WebPage
return $sPreviousTab;
}
public function GetCurrentTab()
{
return $this->m_sCurrentTab;
}
/**
* Echoes the content of the whole page
* @return void
@@ -230,6 +235,50 @@ EOF
}
}
/**
* Records the current state of the 'html' part of the page output
* @return mixed The current state of the 'html' output
*/
public function start_capture()
{
if (!empty($this->m_sCurrentTabContainer) && !empty($this->m_sCurrentTab))
{
$iOffset = isset($this->m_aTabs[$this->m_sCurrentTabContainer]['content'][$this->m_sCurrentTab]) ? strlen($this->m_aTabs[$this->m_sCurrentTabContainer]['content'][$this->m_sCurrentTab]): 0;
return array('tc' => $this->m_sCurrentTabContainer, 'tab' => $this->m_sCurrentTab, 'offset' => $iOffset);
}
else
{
return parent::start_capture();
}
}
/**
* Returns the part of the html output that occurred since the call to start_capture
* and removes this part from the current html output
* @param $offset mixed The value returned by start_capture
* @return string The part of the html output that was added since the call to start_capture
*/
public function end_capture($offset)
{
if (is_array($offset))
{
if (isset($this->m_aTabs[$offset['tc']]['content'][$offset['tab']]))
{
$sCaptured = substr($this->m_aTabs[$offset['tc']]['content'][$offset['tab']], $offset['offset']);
$this->m_aTabs[$offset['tc']]['content'][$offset['tab']] = substr($this->m_aTabs[$offset['tc']]['content'][$offset['tab']], 0, $offset['offset']);
}
else
{
$sCaptured = '';
}
}
else
{
$sCaptured = parent::end_capture($offset);
}
return $sCaptured;
}
/**
* Add any text or HTML fragment (identified by an ID) at the end of the body of the page
* This is useful to add hidden content, DIVs or FORMs that should not

View File

@@ -29,6 +29,7 @@ require_once(APPROOT.'/application/displayblock.class.inc.php');
require_once(APPROOT.'/application/sqlblock.class.inc.php');
require_once(APPROOT.'/application/audit.category.class.inc.php');
require_once(APPROOT.'/application/audit.rule.class.inc.php');
require_once(APPROOT.'/application/query.class.inc.php');
//require_once(APPROOT.'/application/menunode.class.inc.php');
require_once(APPROOT.'/application/utils.inc.php');

View File

@@ -77,12 +77,16 @@ class ApplicationContext
protected $aValues;
protected static $aDefaultValues; // Cache shared among all instances
public function __construct()
public function __construct($bReadContext = true)
{
$this->aNames = array(
'org_id', 'menu'
);
$this->ReadContext();
if ($bReadContext)
{
$this->ReadContext();
}
}
/**

View File

@@ -185,7 +185,7 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
$sTip .= Dict::S('Core:Synchro:LastSynchro').'<br/>'.$aStruct['last_synchro']."</p>";
}
$sSynchroIcon = '&nbsp;<img style="vertical-align:middle;" id="synchro_icon" src="../images/locked.png"/>';
$oPage->add_ready_script("$('#synchro_icon').qtip( { content: '$sTip', show: 'mouseover', hide: 'unfocus', style: { name: 'dark', tip: 'leftTop' }, position: { corner: { target: 'rightMiddle', tooltip: 'leftTop' }} } );");
$oPage->add_ready_script("$('#synchro_icon').qtip( { content: '$sTip', show: 'mouseover', hide: { fixed: true }, style: { name: 'dark', tip: 'leftTop' }, position: { corner: { target: 'rightMiddle', tooltip: 'leftTop' }} } );");
}
$oPage->add("<div class=\"page_header\"><h1>".$this->GetIcon()."&nbsp;\n");
@@ -208,6 +208,11 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
{
$aFieldsMap = $this->GetBareProperties($oPage, $bEditMode, $sPrefix, $aExtraParams);
foreach (MetaModel::EnumPlugins('iApplicationUIExtension') as $oExtensionInstance)
{
$oExtensionInstance->OnDisplayProperties($this, $oPage, $bEditMode);
}
// Special case to display the case log, if any...
// WARNING: if you modify the loop below, also check the corresponding code in UpdateObject and DisplayModifyForm
foreach(MetaModel::ListAttributeDefs(get_class($this)) as $sAttCode => $oAttDef)
@@ -219,11 +224,6 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
}
}
foreach (MetaModel::EnumPlugins('iApplicationUIExtension') as $oExtensionInstance)
{
$oExtensionInstance->OnDisplayProperties($this, $oPage, $bEditMode);
}
return $aFieldsMap;
}
@@ -655,8 +655,26 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
$bTruncated = isset($aExtraParams['truncated']) ? $aExtraParams['truncated'] == true : true;
$bSelectMode = isset($aExtraParams['selection_mode']) ? $aExtraParams['selection_mode'] == true : false;
$bSingleSelectMode = isset($aExtraParams['selection_type']) ? ($aExtraParams['selection_type'] == 'single') : false;
$aExtraFields = isset($aExtraParams['extra_fields']) ? explode(',', trim($aExtraParams['extra_fields'])) : array();
$aExtraFieldsRaw = isset($aExtraParams['extra_fields']) ? explode(',', trim($aExtraParams['extra_fields'])) : array();
$aExtraFields = array();
foreach ($aExtraFieldsRaw as $sFieldName)
{
// Ignore attributes not of the main queried class
if (preg_match('/^(.*)\.(.*)$/', $sFieldName, $aMatches))
{
$sClassAlias = $aMatches[1];
$sAttCode = $aMatches[2];
if ($sClassAlias == $oSet->GetFilter()->GetClassAlias())
{
$aExtraFields[] = $sAttCode;
}
}
else
{
$aExtraFields[] = $sFieldName;
}
}
$sHtml = '';
$oAppContext = new ApplicationContext();
$sClassName = $oSet->GetFilter()->GetClass();
@@ -883,7 +901,9 @@ EOF
$sDisplayList = json_encode($aList);
$sCssCount = isset($aExtraParams['cssCount']) ? ", cssCount: '{$aExtraParams['cssCount']}'" : '';
$iPageSize = MetaModel::GetConfig()->GetMinDisplayLimit();
$oPage->add_ready_script("$('#{$iListId} table.listResults').tablesorter( { $sHeaders widgets: ['myZebra', 'truncatedList']} ).tablesorterPager({container: $('#pager{$iListId}'), totalRows:$iCount, size: $iPageSize, filter: '$sFilter', extra_params: '$sExtraParams', select_mode: '$sSelectMode', displayKey: $sDisplayKey, displayList: $sDisplayList $sCssCount});\n");
$oSet->ApplyParameters();
$sOQL = addslashes($oSet->GetFilter()->serialize());
$oPage->add_ready_script("$('#{$iListId} table.listResults').tablesorter( { $sHeaders widgets: ['myZebra', 'truncatedList']} ).tablesorterPager({container: $('#pager{$iListId}'), totalRows:$iCount, size: $iPageSize, filter: '$sOQL', extra_params: '$sExtraParams', select_mode: '$sSelectMode', displayKey: $sDisplayKey, displayList: $sDisplayList $sCssCount});\n");
}
else
{
@@ -940,7 +960,28 @@ EOF
$bDisplayMenu = isset($aExtraParams['menu']) ? $aExtraParams['menu'] == true : true;
// Check if there is a list of aliases to limit the display to...
$aDisplayAliases = isset($aExtraParams['display_aliases']) ? explode(',', $aExtraParams['display_aliases']) : array();
$sZListName = isset($aExtraParams['zlist']) ? ($aExtraParams['zlist']) : 'list';
$aExtraFieldsRaw = isset($aExtraParams['extra_fields']) ? explode(',', trim($aExtraParams['extra_fields'])) : array();
$aExtraFields = array();
foreach ($aExtraFieldsRaw as $sFieldName)
{
// Ignore attributes not of the main queried class
if (preg_match('/^(.*)\.(.*)$/', $sFieldName, $aMatches))
{
$sClassAlias = $aMatches[1];
$sAttCode = $aMatches[2];
if (array_key_exists($sClassAlias, $oSet->GetSelectedClasses()))
{
$aExtraFields[$sClassAlias][] = $sAttCode;
}
}
else
{
$aExtraFields['*'] = $sAttCode;
}
}
$sHtml = '';
$oAppContext = new ApplicationContext();
$aClasses = $oSet->GetFilter()->GetSelectedClasses();
@@ -956,12 +997,36 @@ EOF
$aAttribs = array();
foreach($aAuthorizedClasses as $sAlias => $sClassName) // TO DO: check if the user has enough rights to view the classes of the list...
{
$aList[$sClassName] = MetaModel::GetZListItems($sClassName, 'list');
if (array_key_exists($sAlias, $aExtraFields))
{
$aList[$sAlias] = $aExtraFields[$sAlias];
}
else
{
$aList[$sAlias] = array();
}
if ($sZListName !== false)
{
$aDefaultList = self::FlattenZList(MetaModel::GetZListItems($sClassName, $sZListName));
$aList[$sAlias] = array_merge($aDefaultList, $aList[$sAlias]);
}
// Filter the list to removed linked set since we are not able to display them here
foreach($aList[$sAlias] as $index => $sAttCode)
{
$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCode);
if ($oAttDef instanceof AttributeLinkedSet)
{
// Removed from the display list
unset($aList[$sAlias][$index]);
}
}
if ($bViewLink)
{
$aAttribs['key_'.$sAlias] = array('label' => MetaModel::GetName($sClassName), 'description' => '');
}
foreach($aList[$sClassName] as $sAttCode)
foreach($aList[$sAlias] as $sAttCode)
{
$aAttribs[$sAttCode.'_'.$sAlias] = array('label' => MetaModel::GetLabel($sClassName, $sAttCode), 'description' => MetaModel::GetDescription($sClassName, $sAttCode));
}
@@ -970,7 +1035,7 @@ EOF
$aAttToLoad = array(); // attributes to load
foreach($aAuthorizedClasses as $sAlias => $sClassName)
{
foreach($aList[$sClassName] as $sAttCode)
foreach($aList[$sAlias] as $sAttCode)
{
$aAttToLoad[$sAlias][] = $sAttCode;
}
@@ -1004,7 +1069,7 @@ EOF
$aRow['key_'.$sAlias] = $aObjects[$sAlias]->GetHyperLink();
}
}
foreach($aList[$sClassName] as $sAttCode)
foreach($aList[$sAlias] as $sAttCode)
{
if (is_null($aObjects[$sAlias]))
{
@@ -1087,6 +1152,8 @@ EOF
$aHeader = array();
foreach($aAuthorizedClasses as $sAlias => $sClassName)
{
$aList[$sAlias] = array();
foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode => $oAttDef)
{
if (is_null($aFields) || (count($aFields) == 0))
@@ -1094,20 +1161,20 @@ EOF
// Standard list of attributes (no link sets)
if ($oAttDef->IsScalar() && ($oAttDef->IsWritable() || $oAttDef->IsExternalField()))
{
$aList[$sClassName][$sAttCode] = $oAttDef;
$aList[$sAlias][$sAttCode] = $oAttDef;
}
}
else
{
// User defined list of attributes
if (in_array($sAttCode, $aFields))
if (in_array($sAttCode, $aFields) || in_array($sAlias.'.'.$sAttCode, $aFields))
{
$aList[$sClassName][$sAttCode] = $oAttDef;
$aList[$sAlias][$sAttCode] = $oAttDef;
}
}
}
$aHeader[] = 'id';
foreach($aList[$sClassName] as $sAttCode => $oAttDef)
foreach($aList[$sAlias] as $sAttCode => $oAttDef)
{
$sStar = '';
if ($oAttDef->IsExternalField())
@@ -1154,7 +1221,7 @@ EOF
{
$aRow[] = $oObj->GetKey();
}
foreach($aList[$sClassName] as $sAttCode => $oAttDef)
foreach($aList[$sAlias] as $sAttCode => $oAttDef)
{
if (is_null($oObj))
{
@@ -1172,6 +1239,149 @@ EOF
return $sHtml;
}
static function DisplaySetAsHTMLSpreadsheet(WebPage $oPage, CMDBObjectSet $oSet, $aParams = array())
{
$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
*/
static function GetSetAsHTMLSpreadsheet(DBObjectSet $oSet, $aParams = array())
{
$aFields = null;
if (isset($aParams['fields']) && (strlen($aParams['fields']) > 0))
{
$aFields = explode(',', $aParams['fields']);
}
$aList = array();
$oAppContext = new ApplicationContext();
$aClasses = $oSet->GetFilter()->GetSelectedClasses();
$aAuthorizedClasses = array();
foreach($aClasses as $sAlias => $sClassName)
{
if (UserRights::IsActionAllowed($sClassName, UR_ACTION_READ, $oSet) && (UR_ALLOWED_YES || UR_ALLOWED_DEPENDS))
{
$aAuthorizedClasses[$sAlias] = $sClassName;
}
}
$aAttribs = array();
$aHeader = array();
foreach($aAuthorizedClasses as $sAlias => $sClassName)
{
$aList[$sAlias] = array();
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()))
{
$aList[$sAlias][$sAttCode] = $oAttDef;
}
}
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 $sAttCode => $oAttDef)
{
if ($oAttDef->IsExternalField())
{
$sExtKeyLabel = MetaModel::GetLabel($sClassName, $oAttDef->GetKeyAttCode());
$oExtKeyAttDef = MetaModel::GetAttributeDef($sClassName, $oAttDef->GetKeyAttCode());
$sRemoteAttLabel = MetaModel::GetLabel($oAttDef->GetTargetClass(), $oAttDef->GetExtAttCode());
$oTargetAttDef = MetaModel::GetAttributeDef($oAttDef->GetTargetClass(), $oAttDef->GetExtAttCode());
$sSuffix = '';
if ($oTargetAttDef->IsExternalKey())
{
$sSuffix = '->id';
}
$sColLabel = $sExtKeyLabel.'->'.$sRemoteAttLabel.$sSuffix;
}
else
{
$sColLabel = MetaModel::GetLabel($sClassName, $sAttCode);
}
$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 = array();
foreach($aAuthorizedClasses as $sAlias => $sClassName)
{
$oObj = $aObjects[$sAlias];
foreach($aList[$sAlias] as $sAttCode => $oAttDef)
{
if (is_null($oObj))
{
$aRow[] = '<td></td>';
}
else
{
$oFinalAttDef = $oAttDef->GetFinalAttDef();
if (get_class($oFinalAttDef) == 'AttributeDateTime')
{
$iDate = AttributeDateTime::GetAsUnixSeconds($oObj->Get($sAttCode));
$aRow[] = '<td>'.date('Y-m-d', $iDate).'</td>';
$aRow[] = '<td>'.date('H:i:s', $iDate).'</td>';
}
else
{
$aRow[] = '<td>'.(string) $oObj->Get($sAttCode).'</td>';
}
}
}
}
$sHtml .= implode("\n", $aRow);
$sHtml .= "</tr>\n";
}
$sHtml .= "</table>\n";
return $sHtml;
}
static function DisplaySetAsXML(WebPage $oPage, CMDBObjectSet $oSet, $aParams = array())
{
$oAppContext = new ApplicationContext();
@@ -1186,7 +1396,7 @@ EOF
}
$aAttribs = array();
$aList = array();
$aList[$sClassName] = MetaModel::GetZListItems($sClassName, 'details');
$aList[$sAlias] = MetaModel::GetZListItems($sClassName, 'details');
$oPage->add("<Set>\n");
$oSet->Seek(0);
while ($aObjects = $oSet->FetchAssoc())
@@ -1305,12 +1515,14 @@ EOF
$aMapCriteria[$aCriteria['filtercode']][] = array('value' => $aCriteria['value'], 'opcode' => $aCriteria['opcode']);
}
$aList = MetaModel::GetZListItems($sClassName, 'standard_search');
$aConsts = $oSet->ListConstantFields(); // Some fields are constants based on the query/context
$sClassAlias = $oSet->GetFilter()->GetClassAlias();
foreach($aList as $sFilterCode)
{
//$oAppContext->Reset($sFilterCode); // Make sure the same parameter will not be passed twice
$sHtml .= '<span style="white-space: nowrap;padding:5px;display:inline-block;">';
$sFilterValue = '';
$sFilterValue = utils::ReadParam($sFilterCode, '', false, 'raw_data');
$sFilterValue = isset($aConsts[$sClassAlias][$sFilterCode]) ? $aConsts[$sClassAlias][$sFilterCode] : '';
$sFilterValue = utils::ReadParam($sFilterCode, $sFilterValue, false, 'raw_data');
$sFilterOpCode = null; // Use the default 'loose' OpCode
if (empty($sFilterValue))
{
@@ -1507,6 +1719,7 @@ EOF
$sHTMLValue = "<input title=\"$sHelpText\" type=\"password\" size=\"30\" name=\"attr_{$sFieldPrefix}{$sAttCode}{$sNameSuffix}\" value=\"".htmlentities($value, ENT_QUOTES, 'UTF-8')."\" id=\"$iId\"/>&nbsp;{$sValidationField}";
break;
case 'OQLExpression':
case 'Text':
$aEventsList[] ='validate';
$aEventsList[] ='keyup';
@@ -1528,7 +1741,21 @@ EOF
{
$sStyle = 'style="'.implode('; ', $aStyles).'"';
}
$sHTMLValue = "<table><tr><td><textarea class=\"resizable\" title=\"$sHelpText\" name=\"attr_{$sFieldPrefix}{$sAttCode}{$sNameSuffix}\" rows=\"8\" cols=\"40\" id=\"$iId\" $sStyle>".htmlentities($sEditValue, ENT_QUOTES, 'UTF-8')."</textarea></td><td>{$sValidationField}</td></tr></table>";
if ($oAttDef->GetEditClass() == 'OQLExpression')
{
$sTestResId = 'query_res_'.$sFieldPrefix.$sAttCode.$sNameSuffix; //$oPage->GetUniqueId();
$sBaseUrl = utils::GetAbsoluteUrlAppRoot().'pages/run_query.php?expression=';
$sInitialUrl = $sBaseUrl.urlencode($sEditValue);
$sAdditionalStuff = "<a id=\"$sTestResId\" target=\"_blank\" href=\"$sInitialUrl\">".Dict::S('UI:Edit:TestQuery')."</a>";
$oPage->add_ready_script("$('#$iId').bind('change keyup', function(evt, sFormId) { $('#$sTestResId').attr('href', '$sBaseUrl'+encodeURIComponent($(this).val())); } );");
}
else
{
$sAdditionalStuff = "";
}
// Ok, the text area is drawn here
$sHTMLValue = "<table><tr><td><textarea class=\"resizable\" title=\"$sHelpText\" name=\"attr_{$sFieldPrefix}{$sAttCode}{$sNameSuffix}\" rows=\"8\" cols=\"40\" id=\"$iId\" $sStyle>".htmlentities($sEditValue, ENT_QUOTES, 'UTF-8')."</textarea>$sAdditionalStuff</td><td>{$sValidationField}</td></tr></table>";
break;
case 'CaseLog':
@@ -1565,8 +1792,9 @@ EOF
case 'LinkedSet':
$aEventsList[] ='validate';
$aEventsList[] ='change';
$oWidget = new UILinksWidget($sClass, $sAttCode, $iId, $sNameSuffix, $oAttDef->DuplicatesAllowed());
$sHTMLValue = $oWidget->Display($oPage, $value);
$oWidget = new UILinksWidget($sClass, $sAttCode, $iId, $sNameSuffix, $oAttDef->DuplicatesAllowed(), $aArgs);
$oObj = isset($aArgs['this']) ? $aArgs['this'] : null;
$sHTMLValue = $oWidget->Display($oPage, $value, array(), $sFormPrefix, $oObj);
break;
case 'Document':
@@ -1606,7 +1834,7 @@ EOF
$aExtKeyParams = $aArgs;
$aExtKeyParams['iFieldSize'] = $oAttDef->GetMaxSize();
$aExtKeyParams['iMinChars'] = $oAttDef->GetMinAutoCompleteChars();
$sHTMLValue = UIExtKeyWidget::DisplayFromAttCode($oPage, $sAttCode, $sClass, $oAttDef->GetLabel(), $oAllowedValues, $value, $iId, $bMandatory, $sFieldName, $sFormPrefix, $aArgs);
$sHTMLValue = UIExtKeyWidget::DisplayFromAttCode($oPage, $sAttCode, $sClass, $oAttDef->GetLabel(), $oAllowedValues, $value, $iId, $bMandatory, $sFieldName, $sFormPrefix, $aExtKeyParams);
$sHTMLValue .= "<!-- iFlags: $iFlags bMandatory: $bMandatory -->\n";
break;
@@ -1733,7 +1961,7 @@ EOF
if ($iKey > 0)
{
// The object already exists in the database, it's a modification
$sButtons = "<input type=\"hidden\" name=\"id\" value=\"$iKey\">\n";
$sButtons = "<input id=\"{$sPrefix}_id\" type=\"hidden\" name=\"id\" value=\"$iKey\">\n";
$sButtons .= "<input type=\"hidden\" name=\"operation\" value=\"{$sOperation}\">\n";
$sButtons .= "<button type=\"button\" class=\"action cancel\"><span>".Dict::S('UI:Button:Cancel')."</span></button>&nbsp;&nbsp;&nbsp;&nbsp;\n";
$sButtons .= "<button type=\"submit\" class=\"action\"><span>{$sApplyButton}</span></button>\n";
@@ -1819,6 +2047,10 @@ EOF
$oPage->SetCurrentTab(Dict::S('UI:PropertiesTab'));
$aFieldsMap = $this->DisplayBareProperties($oPage, true, $sPrefix, $aExtraParams);
if ($iKey > 0)
{
$aFieldsMap['id'] = $sPrefix.'_id';
}
// Now display the relations, one tab per relation
if (!isset($aExtraParams['noRelations']))
{

View File

@@ -348,7 +348,11 @@ class DisplayBlock
$aGroupBy = array();
$sLabels = array();
$iTotalCount = $this->m_oSet->Count();
while($oObj = $this->m_oSet->Fetch())
$oTmpSet = clone $this->m_oSet;
// Speed up the load, load only the needed field to group on
$sAlias = $oTmpSet->GetFilter()->GetClassAlias();
$oTmpSet->OptimizeColumnLoad(array($sAlias => array($sGroupByField)));
while($oObj = $oTmpSet->Fetch())
{
if (isset($aExtraParams['group_by_expr']))
{
@@ -621,7 +625,7 @@ class DisplayBlock
$this->m_oSet = new CMDBObjectSet($this->m_oFilter, array(), $aQueryParams);
}
$iCount = $this->m_oSet->Count();
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.$this->m_oFilter->serialize();
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.urlencode($this->m_oFilter->serialize());
$sHtml .= '<p><a class="actions" href="'.$sHyperlink.'">';
$sHtml .= MetaModel::GetClassIcon($sClass, true, 'float;left;margin-right:10px;');
$sHtml .= MetaModel::GetName($sClass).': '.$iCount.'</a></p>';
@@ -682,7 +686,7 @@ class DisplayBlock
}
else
{
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.$oFilter->serialize();
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.urlencode($oFilter->serialize());
$aCounts[$sStateValue] = "<a href=\"$sHyperlink\">{$aCounts[$sStateValue]}</a>";
}
}
@@ -691,7 +695,7 @@ class DisplayBlock
$sHtml .= '<tr><td>'.implode('</td><td>', $aCounts).'</td></tr></table></div>';
// Title & summary
$iCount = $this->m_oSet->Count();
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.$this->m_oFilter->serialize();
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.urlencode($this->m_oFilter->serialize());
$sHtml .= '<h1>'.Dict::S(str_replace('_', ':', $sTitle)).'</h1>';
$sHtml .= '<a class="summary" href="'.$sHyperlink.'">'.Dict::Format(str_replace('_', ':', $sLabel), $iCount).'</a>';
break;
@@ -746,7 +750,7 @@ EOF
$sHtml .= "<div id=\"my_chart_{$iChartCounter}\">If the chart does not display, <a href=\"http://get.adobe.com/flash/\" target=\"_blank\">install Flash</a></div>\n";
$oPage->add_script("function ofc_resize(left, width, top, height) { /* do nothing special */ }");
$oPage->add_ready_script("swfobject.embedSWF(\"../images/open-flash-chart.swf\", \"my_chart_{$iChartCounter}\", \"100%\", \"300\",\"9.0.0\", \"expressInstall.swf\",
{\"data-file\":\"".urlencode(utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=open_flash_chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[chart_type]=$sChartType&params[chart_title]=$sTitle&id=$sId&filter=".$sFilter)."\"}, {wmode: 'transparent'} );\n");
{\"data-file\":\"".urlencode(utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=open_flash_chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[chart_type]=$sChartType&params[chart_title]=$sTitle&id=$sId&filter=".urlencode($sFilter))."\"}, {wmode: 'transparent'} );\n");
$iChartCounter++;
if (isset($aExtraParams['group_by']))
{
@@ -1107,7 +1111,7 @@ class MenuBlock extends DisplayBlock
if (count($aTransitions))
{
$this->AddMenuSeparator($aActions);
$aStimuli = Metamodel::EnumStimuli($sClass);
$aStimuli = Metamodel::EnumStimuli(get_class($oObj));
foreach($aTransitions as $sStimulusCode => $aTransitionDef)
{
$iActionAllowed = (get_class($aStimuli[$sStimulusCode]) == 'StimulusUserAction') ? UserRights::IsStimulusAllowed($sClass, $sStimulusCode, $oSet) : UR_ALLOWED_NO;
@@ -1136,7 +1140,7 @@ class MenuBlock extends DisplayBlock
// Static menus: Email this page & CSV Export
$sUrl = ApplicationContext::MakeObjectUrl($sClass, $id);
$aActions['UI:Menu:EMail'] = array ('label' => Dict::S('UI:Menu:EMail'), 'url' => "mailto:?subject=".urlencode($oObj->GetRawName())."&body=".urlencode($sUrl));
$aActions['UI:Menu:CSVExport'] = array ('label' => Dict::S('UI:Menu:CSVExport'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=search&filter=$sFilter&format=csv{$sContext}");
$aActions['UI:Menu:CSVExport'] = array ('label' => Dict::S('UI:Menu:CSVExport'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=search&filter=".urlencode($sFilter)."&format=csv{$sContext}");
}
$this->AddMenuSeparator($aActions);
foreach (MetaModel::EnumPlugins('iApplicationUIExtension') as $oExtensionInstance)
@@ -1170,12 +1174,15 @@ class MenuBlock extends DisplayBlock
{
// many objects in the set, possible actions are: new / modify all / delete all
if ($bIsModifyAllowed) { $aActions['UI:Menu:New'] = array ('label' => Dict::S('UI:Menu:New'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=new&class=$sClass{$sContext}{$sDefault}"); }
if ($bIsBulkModifyAllowed) { $aActions['UI:Menu:ModifyAll'] = array ('label' => Dict::S('UI:Menu:ModifyAll'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=select_for_modify_all&class=$sClass&filter=$sFilter{$sContext}"); }
if ($bIsBulkDeleteAllowed) { $aActions['UI:Menu:BulkDelete'] = array ('label' => Dict::S('UI:Menu:BulkDelete'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=select_for_deletion&filter=$sFilter{$sContext}"); }
if ($bIsBulkModifyAllowed) { $aActions['UI:Menu:ModifyAll'] = array ('label' => Dict::S('UI:Menu:ModifyAll'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=select_for_modify_all&class=$sClass&filter=".urlencode($sFilter)."{$sContext}"); }
if ($bIsBulkDeleteAllowed) { $aActions['UI:Menu:BulkDelete'] = array ('label' => Dict::S('UI:Menu:BulkDelete'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=select_for_deletion&filter=".urlencode($sFilter)."{$sContext}"); }
// Stimuli
$aStates = MetaModel::EnumStates($sClass);
if (count($aStates) > 0)
// Do not perform time consuming computations if there are too may objects in the list
$iLimit = MetaModel::GetConfig()->Get('complex_actions_limit');
if ((count($aStates) > 0) && (($iLimit == 0) || ($oSet->Count() < $iLimit)))
{
// Life cycle actions may be available... if all objects are in the same state
$oSet->Rewind();
@@ -1202,7 +1209,7 @@ class MenuBlock extends DisplayBlock
{
case UR_ALLOWED_YES:
case UR_ALLOWED_DEPENDS:
$aActions[$sStimulusCode] = array('label' => $aStimuli[$sStimulusCode]->GetLabel(), 'url' => "{$sRootUrl}pages/UI.php?operation=select_bulk_stimulus&stimulus=$sStimulusCode&state=$sState&class=$sClass&filter=$sFilter{$sContext}");
$aActions[$sStimulusCode] = array('label' => $aStimuli[$sStimulusCode]->GetLabel(), 'url' => "{$sRootUrl}pages/UI.php?operation=select_bulk_stimulus&stimulus=$sStimulusCode&state=$sState&class=$sClass&filter=".urlencode($sFilter)."{$sContext}");
break;
default:
@@ -1214,8 +1221,8 @@ class MenuBlock extends DisplayBlock
}
$this->AddMenuSeparator($aActions);
$sUrl = utils::GetAbsoluteUrlAppRoot();
$aActions['UI:Menu:EMail'] = array ('label' => Dict::S('UI:Menu:EMail'), 'url' => "mailto:?subject=$sFilterDesc&body=".urlencode("{$sUrl}pages/$sUIPage?operation=search&filter=$sFilter{$sContext}"));
$aActions['UI:Menu:CSVExport'] = array ('label' => Dict::S('UI:Menu:CSVExport'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=search&filter=$sFilter&format=csv{$sContext}");
$aActions['UI:Menu:EMail'] = array ('label' => Dict::S('UI:Menu:EMail'), 'url' => "mailto:?subject=$sFilterDesc&body=".urlencode("{$sUrl}pages/$sUIPage?operation=search&filter=".urlencode($sFilter)."{$sContext}"));
$aActions['UI:Menu:CSVExport'] = array ('label' => Dict::S('UI:Menu:CSVExport'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=search&filter=".urlencode($sFilter)."&format=csv{$sContext}");
}
$this->AddMenuSeparator($aActions);
foreach (MetaModel::EnumPlugins('iApplicationUIExtension') as $oExtensionInstance)

View File

@@ -146,7 +146,12 @@ class iTopWebPage extends NiceWebPage
// that the tabs aren't changed on click, and any custom event name can be
// specified. Note that if you define a callback for the 'select' event, it
// will be executed for the selected tab whenever the hash changes.
tabs.tabs({ event: 'change'});
tabs.tabs({ event: 'change', 'show': function(event, ui) {
$('.resizable', ui.panel).resizable(); // Make resizable everything that claims to be resizable !
}
});
$('.resizable').filter(':visible').resizable();
}
catch(err)
{
@@ -198,7 +203,6 @@ EOF
}
});
$('.resizable').resizable(); // Make resizable everything that claims to be resizable !
// Adjust initial size
$('.v-resizable').each( function()
{
@@ -403,6 +407,11 @@ EOF
return '$sAbsURLAppRoot';
}
function GetAbsoluteUrlModulesRoot()
{
return '$sAbsURLAppRoot'+'modules/';
}
function AddAppContext(sURL)
{
var sContext = '$sAppContext';
@@ -515,7 +524,7 @@ EOF
*/
$sFavoriteOrgs = '';
$oWidget = new UIExtKeyWidget('Organization', 'org_id');
$sHtml .= $oWidget->Display($this, 50, false, '', $oSet, $iCurrentOrganization, 'org_id', false, 'c[org_id]', '', array('iFieldSize' => 20, 'sDefaultValue' => Dict::S('UI:AllOrganizations')), $bSearchMode = true);
$sHtml .= $oWidget->Display($this, 50, false, '', $oSet, $iCurrentOrganization, 'org_id', false, 'c[org_id]', '', array('iFieldSize' => 20, 'iMinChars' => MetaModel::GetConfig()->Get('min_autocomplete_chars'), 'sDefaultValue' => Dict::S('UI:AllOrganizations')), $bSearchMode = true);
$this->add_ready_script('$("#org_id").bind("extkeychange", function() { $("#SiloSelection form").submit(); } )');
$this->add_ready_script("$('#label_org_id').click( function() { $(this).val(''); $('#org_id').val(''); return true; } );\n");
// Add other dimensions/context information to this form
@@ -589,13 +598,13 @@ EOF
{
// Make sure that the URL to the script contains the application's version number
// so that the new script do NOT get reloaded from the cache when the application is upgraded
if (strpos('?', $s_script) === false)
if (strpos($s_script, '?') === false)
{
$s_script .= "?version=".ITOP_VERSION;
$s_script .= "?itopversion=".ITOP_VERSION;
}
else
{
$s_script .= "&version=".ITOP_VERSION;
$s_script .= "&itopversion=".ITOP_VERSION;
}
echo "<script type=\"text/javascript\" src=\"$s_script\"></script>\n";
}
@@ -623,7 +632,9 @@ EOF
}
echo "</style>\n";
}
echo "<link rel=\"search\" type=\"application/opensearchdescription+xml\" title=\"iTop\" href=\"".utils::GetAbsoluteUrlAppRoot()."opensearch.xml.php\" />\n";
echo "<link rel=\"search\" type=\"application/opensearchdescription+xml\" title=\"iTop\" href=\"".utils::GetAbsoluteUrlAppRoot()."pages/opensearch.xml.php\" />\n";
echo "<link rel=\"shortcut icon\" href=\"".utils::GetAbsoluteUrlAppRoot()."images/favicon.ico\" />\n";
echo "</head>\n";
echo "<body>\n";
@@ -834,6 +845,11 @@ EOF
return $sPreviousTab;
}
public function GetCurrentTab()
{
return $this->m_sCurrentTab;
}
/**
* Make the given tab the active one, as if it were clicked
* DOES NOT WORK: apparently in the *old* version of jquery
@@ -932,8 +948,15 @@ EOF
{
if (is_array($offset))
{
$sCaptured = substr($this->m_aTabs[$offset['tc']][$offset['tab']], $offset['offset']);
$this->m_aTabs[$offset['tc']][$offset['tab']] = substr($this->m_aTabs[$offset['tc']][$offset['tab']], 0, $offset['offset']);
if (isset($this->m_aTabs[$offset['tc']][$offset['tab']]))
{
$sCaptured = substr($this->m_aTabs[$offset['tc']][$offset['tab']], $offset['offset']);
$this->m_aTabs[$offset['tc']][$offset['tab']] = substr($this->m_aTabs[$offset['tc']][$offset['tab']], 0, $offset['offset']);
}
else
{
$sCaptured = '';
}
}
else
{

View File

@@ -29,7 +29,9 @@ require_once(APPROOT."/application/nicewebpage.class.inc.php");
*/
class LoginWebPage extends NiceWebPage
{
{
protected static $m_sLoginFailedMessage = '';
public function __construct()
{
parent::__construct("iTop Login");
@@ -89,6 +91,11 @@ EOF
);
}
public static function SetLoginFailedMessage($sMessage)
{
self::$m_sLoginFailedMessage = $sMessage;
}
public function DisplayLoginForm($sLoginType, $bFailedLogin = false)
{
switch($sLoginType)
@@ -119,7 +126,14 @@ EOF
$this->add("<h1>".Dict::S('UI:Login:Welcome')."</h1>\n");
if ($bFailedLogin)
{
$this->add("<p class=\"hilite\">".Dict::S('UI:Login:IncorrectLoginPassword')."</p>\n");
if (self::$m_sLoginFailedMessage != '')
{
$this->add("<p class=\"hilite\">".self::$m_sLoginFailedMessage."</p>\n");
}
else
{
$this->add("<p class=\"hilite\">".Dict::S('UI:Login:IncorrectLoginPassword')."</p>\n");
}
}
else
{
@@ -133,6 +147,7 @@ EOF
$this->add("</table>\n");
$this->add("<input type=\"hidden\" name=\"loginop\" value=\"login\" />\n");
$this->add("</form>\n");
$this->add(Dict::S('UI:Login:About'));
$this->add("</div>\n");
break;
}
@@ -250,77 +265,17 @@ EOF
// check CAS authentication
if (phpCAS::isAuthenticated())
{
// Check is a membership is required
$sCASMemberships = MetaModel::GetConfig()->Get('cas_memberof');
$bFound = false;
if (!empty($sCASMemberships))
{
if (phpCAS::hasAttribute('memberOf'))
{
// A list of groups is specified, the user must a be member of (at least) one of them to pass
$aCASMemberships = array();
$aTmp = explode(';', $sCASMemberships);
setlocale(LC_ALL, "en_US.utf8"); // !!! WARNING: this is needed to have the iconv //TRANSLIT working fine below !!!
foreach($aTmp as $sGroupName)
{
$aCASMemberships[] = trim(iconv('UTF-8', 'ASCII//TRANSLIT', $sGroupName)); // Just in case remove accents and spaces...
}
$aMemberOf = phpCAS::getAttribute('memberOf');
if (!is_array($aMemberOf)) $aMemberOf = array($aMemberOf); // Just one entry, turn it into an array
$aFilteredGroupNames = array();
foreach($aMemberOf as $sGroupName)
{
$sGroupName = trim(iconv('UTF-8', 'ASCII//TRANSLIT', $sGroupName)); // Remove accents and spaces as well
$aFilteredGroupNames[] = $sGroupName;
if (in_array($sGroupName, $aCASMemberships))
{
$bFound = true;
break;
}
}
if(!$bFound)
{
phpCAS :: log("User ".phpCAS::getUser().", none of his/her groups (".implode('; ', $aFilteredGroupNames).") match any of the required groups: ".implode('; ', $aCASMemberships));
}
}
else
{
// Too bad, the user is not part of any of the group => not allowed
phpCAS :: log("No 'memberOf' attribute found for user ".phpCAS::getUser().". Are you using the SAML protocol (S1) ?");
}
}
else
{
// No membership required, anybody will pass
$bFound = true;
}
if ($bFound)
{
$sAuthUser = phpCAS::getUser();
$sAuthPwd = '';
$sLoginMode = 'cas';
$sAuthentication = 'external';
}
else
{
// The user is not part of the allowed groups, => log out
$sUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php';
$sCASLogoutUrl = MetaModel::GetConfig()->Get('cas_logout_redirect_service');
if (empty($sCASLogoutUrl))
{
$sCASLogoutUrl = $sUrl;
}
phpCAS::logoutWithRedirectService($sCASLogoutUrl); // Redirects to the CAS logout page
}
$sAuthUser = phpCAS::getUser();
$sAuthPwd = '';
$sLoginMode = 'cas';
$sAuthentication = 'external';
}
break;
case 'form':
// iTop standard mode: form based authentication
$sAuthUser = utils::ReadPostedParam('auth_user', '', 'raw_data');
$sAuthPwd = utils::ReadPostedParam('auth_pwd', '', 'raw_data');
$sAuthUser = utils::ReadPostedParam('auth_user', '', false, 'raw_data');
$sAuthPwd = utils::ReadPostedParam('auth_pwd', '', false, 'raw_data');
if ($sAuthUser != '')
{
$sLoginMode = 'form';
@@ -346,12 +301,10 @@ EOF
case 'external':
// Web server supplied authentication
$bExternalAuth = false;
$sExtAuthVar = MetaModel::GetConfig()->GetExternalAuthenticationVariable(); // In which variable is the info passed ?
$sEval = '$bExternalAuth = isset('.$sExtAuthVar.');';
eval($sEval);
if ($bExternalAuth)
{
eval('$sAuthUser = '.$sExtAuthVar.';'); // Retrieve the value
$sExtAuthVar = MetaModel::GetConfig()->GetExternalAuthenticationVariable(); // In which variable is the info passed ?
eval('$sAuthUser = isset('.$sExtAuthVar.') ? '.$sExtAuthVar.' : false;'); // Retrieve the value
if ($sAuthUser && (strlen($sAuthUser) > 0))
{
$sAuthPwd = ''; // No password in this case the web server already authentified the user...
$sLoginMode = 'external';
$sAuthentication = 'external';
@@ -361,9 +314,9 @@ EOF
case 'url':
// Credentials passed directly in the url
$sAuthUser = utils::ReadParam('auth_user', '', false, 'raw_data');
if ($sAuthUser != '')
$sAuthPwd = utils::ReadParam('auth_pwd', null, false, 'raw_data');
if (($sAuthUser != '') && ($sAuthPwd != null))
{
$sAuthPwd = utils::ReadParam('auth_pwd', '', false, 'raw_data');
$sLoginMode = 'url';
}
break;
@@ -390,7 +343,7 @@ EOF
}
else
{
if (!UserRights::CheckCredentials($sAuthUser, $sAuthPwd, $sAuthentication))
if (!UserRights::CheckCredentials($sAuthUser, $sAuthPwd, $sLoginMode, $sAuthentication))
{
//echo "Check Credentials returned false for user $sAuthUser!";
self::ResetSession();
@@ -471,8 +424,8 @@ EOF
{
$sAuthUser = $_SESSION['auth_user'];
UserRights::Login($sAuthUser); // Set the user's language
$sOldPwd = utils::ReadPostedParam('old_pwd', 'raw_data');
$sNewPwd = utils::ReadPostedParam('new_pwd', 'raw_data');
$sOldPwd = utils::ReadPostedParam('old_pwd', '', false, 'raw_data');
$sNewPwd = utils::ReadPostedParam('new_pwd', '', false, 'raw_data');
if (UserRights::CanChangePassword() && ((!UserRights::CheckCredentials($sAuthUser, $sOldPwd)) || (!UserRights::ChangePassword($sOldPwd, $sNewPwd))))
{
$oPage = new LoginWebPage();
@@ -499,7 +452,6 @@ EOF
header('Location: '.utils::GetAbsoluteUrlAppRoot().'portal/index.php');
}
return $sMessage;
}
}
} // End of class
?>

View File

@@ -104,6 +104,11 @@ class ApplicationMenu
self::$aMenusIndex[$iParentIndex]['children'][] = array ('rank' => $fRank, 'index' => $index);
}
}
else
{
// the menu already exists, let's combine the conditions that make it visible
self::$aMenusIndex[$index]['node']->AddCondition($oMenuNode);
}
return $index;
}
@@ -287,22 +292,22 @@ abstract class MenuNode
/**
* Class of objects to check if the menu is enabled, null if none
*/
protected $m_sEnableClass;
protected $m_aEnableClasses;
/**
* User Rights Action code to check if the menu is enabled, null if none
*/
protected $m_iEnableAction;
protected $m_aEnableActions;
/**
* User Rights allowed results (actually a bitmask) to check if the menu is enabled, null if none
*/
protected $m_iEnableActionResults;
protected $m_aEnableActionResults;
/**
* Stimulus to check: if the user can 'apply' this stimulus, then she/he can see this menu
*/
protected $m_sEnableStimulus;
protected $m_aEnableStimuli;
/**
* Create a menu item, sets the condition to have it displayed and inserts it into the application's main menu
@@ -318,10 +323,10 @@ abstract class MenuNode
public function __construct($sMenuId, $iParentIndex = -1, $fRank = 0, $sEnableClass = null, $iActionCode = null, $iAllowedResults = UR_ALLOWED_YES, $sEnableStimulus = null)
{
$this->sMenuId = $sMenuId;
$this->m_sEnableClass = $sEnableClass;
$this->m_iEnableAction = $iActionCode;
$this->m_iEnableActionResults = $iAllowedResults;
$this->m_sEnableStimulus = $sEnableStimulus;
$this->m_aEnableClasses = array($sEnableClass);
$this->m_aEnableActions = array($iActionCode);
$this->m_aEnableActionResults = array($iAllowedResults);
$this->m_aEnableStimuli = array($sEnableStimulus);
$this->index = ApplicationMenu::InsertMenu($this, $iParentIndex, $fRank);
}
@@ -351,38 +356,54 @@ abstract class MenuNode
return $this->AddParams(utils::GetAbsoluteUrlAppRoot().'pages/UI.php', $aExtraParams);
}
/**
* Add a limiting display condition for the same menu node. The conditions will be combined with a AND
* @param $oMenuNode MenuNode Another definition of the same menu node, with potentially different access restriction
* @return void
*/
public function AddCondition(MenuNode $oMenuNode)
{
foreach($oMenuNode->m_aEnableClasses as $index => $sClass )
{
$this->m_aEnableClasses[] = $sClass;
$this->m_aEnableActions[] = $oMenuNode->m_aEnableActions[$index];
$this->m_aEnableActionResults[] = $oMenuNode->m_aEnableActionResults[$index];
$this->m_aEnableStimuli[] = $oMenuNode->m_aEnableStimuli[$index];
}
}
/**
* Tells whether the menu is enabled (i.e. displayed) for the current user
* @return bool True if enabled, false otherwise
*/
public function IsEnabled()
{
if ($this->m_sEnableClass != null)
foreach($this->m_aEnableClasses as $index => $sClass)
{
if (MetaModel::IsValidClass($this->m_sEnableClass))
if ($sClass != null)
{
if ($this->m_sEnableStimulus != null)
if (MetaModel::IsValidClass($sClass))
{
if (!UserRights::IsStimulusAllowed($this->m_sEnableClass, $this->m_sEnableStimulus))
if ($this->m_aEnableStimuli[$index] != null)
{
return false;
if (!UserRights::IsStimulusAllowed($sClass, $this->m_aEnableStimuli[$index]))
{
return false;
}
}
if ($this->m_aEnableActions[$index] != null)
{
$iResult = UserRights::IsActionAllowed($sClass, $this->m_aEnableActions[$index]);
if (!($iResult & $this->m_aEnableActionResults[$index]))
{
return false;
}
}
}
if ($this->m_iEnableAction != null)
else
{
$iResult = UserRights::IsActionAllowed($this->m_sEnableClass, $this->m_iEnableAction);
if (($iResult & $this->m_iEnableActionResults))
{
return true;
}
else
{
return false;
}
return false;
}
return true;
}
return false;
}
return true;
}

View File

@@ -147,9 +147,18 @@ EOF
$this->add_script(
<<<EOF
function CheckSelection(sMessage)
function CheckSelection(sMessage, sInputId)
{
var bResult = ($('input:checked').length > 0);
var bResult;
if (sInputId.length > 0)
{
bResult = ($('input[name='+sInputId+']:checked').length > 0);
}
else
{
// First select found...
bResult = ($('input:checked').length > 0);
}
if (!bResult)
{
alert(sMessage);
@@ -203,8 +212,10 @@ EOF
}
EOF
);
}
// For Wizard helper to process the ajax replies
$this->add('<div id="ajax_content"></div>');
}
public function SetCurrentTab($sTabLabel = '')
{
@@ -264,13 +275,9 @@ EOF
{
// Home-made and very limited display of an object set
//
//$oSet->Seek(0);// juste pour que le warning soit moins crado
//$oSet->Fetch();// juste pour que le warning soit moins crado
//
$this->add("<div id=\"listOf$sClass\">\n");
cmdbAbstractObject::DisplaySet($this, $oSet, array('currentId' => "listOf$sClass", 'menu' => false, 'zlist' => false, 'extra_fields' => implode(',', $aZList)));
$sUniqueId = $sClass.$this->GetUniqueId();
$this->add("<div id=\"$sUniqueId\">\n"); // The id here MUST be the same as currentId, otherwise the pagination will be broken
cmdbAbstractObject::DisplaySet($this, $oSet, array('currentId' => $sUniqueId, 'menu' => false, 'zlist' => false, 'extra_fields' => implode(',', $aZList)));
$this->add("</div>\n");
}
else
@@ -804,12 +811,12 @@ EOF
}
}
public function WizardCheckSelectionOnSubmit($sMessageIfNoSelection)
public function WizardCheckSelectionOnSubmit($sMessageIfNoSelection, $sInputName = '')
{
$this->add_ready_script(
<<<EOF
$('#{$this->m_sWizardId}').submit(function() {
return CheckSelection('$sMessageIfNoSelection');
return CheckSelection('$sMessageIfNoSelection', '$sInputName');
});
EOF
);

View File

@@ -0,0 +1,107 @@
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* Persistent class Event and derived
* Application internal events
* There is also a file log
*
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
abstract class Query extends cmdbAbstractObject
{
public static function Init()
{
$aParams = array
(
"category" => "core/cmdb,view_in_gui,application",
"key_type" => "autoincrement",
"name_attcode" => "name",
"state_attcode" => "",
"reconc_keys" => array(),
"db_table" => "priv_query",
"db_key_field" => "id",
"db_finalclass_field" => "realclass",
"display_template" => "",
);
MetaModel::Init_Params($aParams);
//MetaModel::Init_InheritAttributes();
MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values"=>null, "sql"=>"name", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeString("fields", array("allowed_values"=>null, "sql"=>"fields", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
// Display lists
MetaModel::Init_SetZListItems('details', array('name', 'description', 'fields')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('description')); // Attributes to be displayed for a list
// Search criteria
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
}
}
class QueryOQL extends Query
{
public static function Init()
{
$aParams = array
(
"category" => "core/cmdb,view_in_gui,application",
"key_type" => "autoincrement",
"name_attcode" => "name",
"state_attcode" => "",
"reconc_keys" => array(),
"db_table" => "priv_query_oql",
"db_key_field" => "id",
"db_finalclass_field" => "",
"display_template" => "",
);
MetaModel::Init_Params($aParams);
MetaModel::Init_InheritAttributes();
MetaModel::Init_AddAttribute(new AttributeOQL("oql", array("allowed_values"=>null, "sql"=>"oql", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
// Display lists
MetaModel::Init_SetZListItems('details', array('name', 'description', 'oql', 'fields')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('description')); // Attributes to be displayed for a list
// Search criteria
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
}
function DisplayBareProperties(WebPage $oPage, $bEditMode = false, $sPrefix = '', $aExtraParams = array())
{
parent::DisplayBareProperties($oPage, $bEditMode, $sPrefix, $aExtraParams);
if (!$bEditMode)
{
$sUrl = utils::GetAbsoluteUrlAppRoot().'webservices/export.php?format=spreadsheet&login_mode=basic&query='.$this->GetKey();
$sOql = $this->Get('oql');
$oSearch = DBObjectSearch::FromOQL($sOql);
$aParameters = $oSearch->GetQueryParams();
foreach($aParameters as $sParam => $val)
{
$sUrl .= '&arg_'.$sParam.'=["'.$sParam.'"]';
}
$oPage->p(Dict::S('UI:Query:UrlForExcel').':<br/><textarea cols="80" rows="3" READONLY>'.$sUrl.'</textarea>');
}
}
}
?>

View File

@@ -40,13 +40,15 @@ class SqlBlock
protected $m_aColumns;
protected $m_sTitle;
protected $m_sType;
protected $m_aParams;
public function __construct($sQuery, $aColumns, $sTitle, $sType)
public function __construct($sQuery, $aColumns, $sTitle, $sType, $aParams = array())
{
$this->m_sQuery = $sQuery;
$this->m_aColumns = $aColumns;
$this->m_sTitle = $sTitle;
$this->m_sType = $sType;
$this->m_aParams = $aParams;
}
/**
@@ -54,9 +56,14 @@ class SqlBlock
/*
*
* <sqlblock>
* <sql>SELECT date_format(start_date, '%d') AS Date, count(*) AS Count FROM ticket WHERE DATE_SUB(NOW(), INTERVAL 15 DAY) &lt; start_date AND finalclass = 'UserIssue' GROUP BY date_format(start_date, '%d')</sql>
* <sql>SELECT date_format(start_date, '%d') AS Date, count(*) AS Count FROM ticket WHERE DATE_SUB(NOW(), INTERVAL 15 DAY) &lt; start_date AND finalclass = 'UserIssue' GROUP BY date_format(start_date, '%d') AND $CONDITION(param1, ticket.org_id)$</sql>
* <type>table</type>
* <title>UserRequest:Overview-Title</title>
* <parameter>
* <name>param1</name>
* <type>context</type>
* <mapping>org_id</mapping>
* </parameter>
* <column>
* <name>Date</name>
* <label>UserRequest:Overview-Date</label>
@@ -73,6 +80,11 @@ class SqlBlock
* - sql: a (My)SQL query. Do not forget to use html entities (e.g. &lt; for <)
* - type: table (default), bars or pie. If bars or pie is selected only the two first columns are taken into account.
* - title: optional title, typed in clear or given as a dictionnary entry
* - parameter: specifies how to map the context parameters (namely org_id) to a given named parameter in the query.
* The expression $CONDITION(<param_name>, <sql_column_name>) will be automatically replaced by:
* either the string "1" if there is no restriction on the organisation in iTop
* or the string "(<sql_column_name>=<value_of_org_id>)" if there is a limitation to one organizations in iTop
* or the string "(<sql_column_name> IN (<values_of_org_id>))" if there is a limitation to a given set of organizations in iTop
* - column: specification of a column (not displayed if omitted)
* - column / name: name of the column in the SQL query (use aliases)
* - column / label: label, typed in clear or given as a dictionnary entry
@@ -144,8 +156,96 @@ class SqlBlock
}
}
}
return new SqlBlock($sQuery, $aColumns, $sTitle, $sType);
$aParams = array();
if (isset($oXml->parameter))
{
foreach ($oXml->parameter AS $oParamData)
{
if (!isset($oParamData->name))
{
throw new Exception("Missing tag 'name' for parameter in sqlblock/column");
}
$sName = (string) $oParamData->name;
if (strlen($sName) == 0)
{
throw new Exception("Empty tag 'name' for parameter in sqlblock/column");
}
if (!isset($oParamData->mapping))
{
throw new Exception("Missing tag 'mapping' for parameter in sqlblock/column");
}
$sMapping = (string) $oParamData->mapping;
if (strlen($sMapping) == 0)
{
throw new Exception("Empty tag 'mapping' for parameter in sqlblock/column");
}
if (isset($oParamData->type))
{
$sParamType = $oParamData->type;
}
else
{
$sParamType = 'context';
}
$aParams[$sName] = array('mapping' => $sMapping, 'type' => $sParamType);
}
}
return new SqlBlock($sQuery, $aColumns, $sTitle, $sType, $aParams);
}
/**
* Applies the defined parameters into the SQL query
* @return string the SQL query to execute
*/
public function BuildQuery()
{
$oAppContext = new ApplicationContext();
$sQuery = $this->m_sQuery;
$sQuery = str_replace('$DB_PREFIX$', MetaModel::GetConfig()->GetDBSubname(), $sQuery); // put the tables DB prefix (if any)
foreach($this->m_aParams as $sName => $aParam)
{
if ($aParam['type'] == 'context')
{
$sSearchPattern = '/\$CONDITION\('.$sName.',([^\)]+)\)\$/';
$value = $oAppContext->GetCurrentValue($aParam['mapping']);
if (empty($value))
{
$sSQLExpr = '(1)';
}
else
{
// Special case for managing the hierarchy of organizations
if (($aParam['mapping'] == 'org_id') && ( MetaModel::IsValidClass('Organization')))
{
$sHierarchicalKeyCode = MetaModel::IsHierarchicalClass('Organization');
if ($sHierarchicalKeyCode != false)
{
// organizations are in hierarchy... gather all the orgs below the given one...
$sOQL = "SELECT Organization AS node JOIN Organization AS root ON node.$sHierarchicalKeyCode BELOW root.id WHERE root.id = :value";
$oSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array(), array('value' => $value));
$aOrgIds = array();
while($oOrg = $oSet->Fetch())
{
$aOrgIds[]= $oOrg->GetKey();
}
$sSQLExpr = '($1 IN('.implode(',', $aOrgIds).'))';
}
else
{
$sSQLExpr = '($1 = '.CMDBSource::Quote($value).')';
}
}
else
{
$sSQLExpr = '($1 = '.CMDBSource::Quote($value).')';
}
}
$sQuery = preg_replace($sSearchPattern, $sSQLExpr, $sQuery);
}
}
return $sQuery;
}
public function RenderContent(WebPage $oPage, $aExtraParams = array())
@@ -160,7 +260,8 @@ class SqlBlock
}
// $oPage->add($this->GetRenderContent($oPage, $aExtraParams, $sId));
$res = CMDBSource::Query($this->m_sQuery);
$sQuery = $this->BuildQuery();
$res = CMDBSource::Query($sQuery);
$aQueryCols = CMDBSource::GetColumns($res);
// Prepare column definitions (check + give default values)

View File

@@ -35,7 +35,15 @@ class DisplayTemplate
public function __construct($sTemplate)
{
$this->m_aTags = array('itopblock', 'itopcheck', 'itoptabs', 'itoptab', 'itoptoggle', 'itopstring', 'sqlblock');
$this->m_aTags = array (
'itopblock',
'itopcheck',
'itoptabs',
'itoptab',
'itoptoggle',
'itopstring',
'sqlblock'
);
$this->m_sTemplate = $sTemplate;
}
@@ -208,7 +216,6 @@ class DisplayTemplate
$oBlock->RenderContent($oPage);
break;
case 'itopblock': // No longer used, handled by DisplayBlock::FromTemplate see above
$oPage->add("<!-- Application Error: should be handled by DisplayBlock::FromTemplate -->");
break;
@@ -272,6 +279,7 @@ class ObjectDetailsTemplate extends DisplayTemplate
public function Render(WebPage $oPage, $aParams = array(), $bEditMode = false)
{
$sStateAttCode = MetaModel :: GetStateAttributeCode(get_class($this->m_oObj));
$aTemplateFields = array();
preg_match_all('/\\$this->([a-z0-9_]+)\\$/', $this->m_sTemplate, $aMatches);
$aTemplateFields = $aMatches[1];
@@ -302,6 +310,11 @@ class ObjectDetailsTemplate extends DisplayTemplate
$iFlags = $iFlags & ~OPT_ATT_READONLY; // Mandatory fields cannot be read-only when creating an object
}
if ((!$oAttDef->IsWritable()) || ($sStateAttCode == $sAttCode))
{
$iFlags = $iFlags | OPT_ATT_READONLY;
}
if ($iFlags & OPT_ATT_HIDDEN)
{
$aParams['this->label('.$sAttCode.')'] = '';
@@ -313,7 +326,6 @@ class ObjectDetailsTemplate extends DisplayTemplate
{
if ($bEditMode && ($iFlags & (OPT_ATT_READONLY|OPT_ATT_SLAVE)))
{
// Check if the attribute is not read-only because of a synchro...
$aReasons = array();
$sSynchroIcon = '';
@@ -336,7 +348,6 @@ class ObjectDetailsTemplate extends DisplayTemplate
$aParams['this->comments('.$sAttCode.')'] = $sSynchroIcon;
}
if ($bEditMode && !($iFlags & OPT_ATT_READONLY)) //TODO: check the data synchro status...
{
$aParams['this->field('.$sAttCode.')'] = "<span id=\"field_{$iInputId}\">".$this->m_oObj->GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef,
@@ -388,5 +399,4 @@ class ObjectDetailsTemplate extends DisplayTemplate
}
//DisplayTemplate::UnitTest();
?>

View File

@@ -65,6 +65,7 @@ class UIExtKeyWidget
{
protected $iId;
protected $sTargetClass;
protected $sAttCode;
//public function __construct($sAttCode, $sClass, $sTitle, $oAllowedValues, $value, $iInputId, $bMandatory, $sNameSuffix = '', $sFieldPrefix = '', $sFormPrefix = '')
static public function DisplayFromAttCode($oPage, $sAttCode, $sClass, $sTitle, $oAllowedValues, $value, $iInputId, $bMandatory, $sFieldName = '', $sFormPrefix = '', $aArgs, $bSearchMode = false)
@@ -81,14 +82,15 @@ class UIExtKeyWidget
{
$sDisplayStyle = 'select'; // In search mode, always use a drop-down list
}
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId);
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode);
return $oWidget->Display($oPage, $iMaxComboLength, $bAllowTargetCreation, $sTitle, $oAllowedValues, $value, $iInputId, $bMandatory, $sFieldName, $sFormPrefix, $aArgs, $bSearchMode, $sDisplayStyle);
}
public function __construct($sTargetClass, $iInputId)
public function __construct($sTargetClass, $iInputId, $sAttCode = '')
{
$this->sTargetClass = $sTargetClass;
$this->iId = $iInputId;
$this->sAttCode = $sAttCode;
}
/**
@@ -118,7 +120,7 @@ class UIExtKeyWidget
else
{
$sWizHelper = 'oWizardHelper'.$sFormPrefix;
$sWizHelperJSON = $sWizHelper.'.ToJSON()';
$sWizHelperJSON = $sWizHelper.'.UpdateWizardToJSON()';
}
if (is_null($oAllowedValues))
{
@@ -182,7 +184,7 @@ class UIExtKeyWidget
$sHTMLValue .= "</select>\n";
$oPage->add_ready_script(
<<<EOF
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', true, $sWizHelper);
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', true, $sWizHelper, '{$this->sAttCode}');
oACWidget_{$this->iId}.emptyHtml = "<div style=\"background: #fff; border:0; text-align:center; vertical-align:middle;\"><p>$sMessage</p></div>";
$('#$this->iId').bind('update', function() { oACWidget_{$this->iId}.Update(); } );
$('#$this->iId').bind('change', function() { $(this).trigger('extkeychange') } );
@@ -217,7 +219,7 @@ EOF
// Scripts to start the autocomplete and bind some events to it
$oPage->add_ready_script(
<<<EOF
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', false, $sWizHelper);
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', false, $sWizHelper, '{$this->sAttCode}');
oACWidget_{$this->iId}.emptyHtml = "<div style=\"background: #fff; border:0; text-align:center; vertical-align:middle;\"><p>$sMessage</p></div>";
$('#label_$this->iId').autocomplete(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', { scroll:true, minChars:{$iMinChars}, autoFill:false, matchContains:true, mustMatch: true, keyHolder:'#{$this->iId}', extraParams:{operation:'ac_extkey', sTargetClass:'{$this->sTargetClass}',sFilter:'$sFilter', json: function() { return $sWizHelperJSON; } }});
$('#label_$this->iId').keyup(function() { if ($(this).val() == '') { $('#$this->iId').val(''); } } ); // Useful for search forms: empty value in the "label", means no value, immediatly !
@@ -262,13 +264,24 @@ EOF
return $sHTMLValue;
}
public function GetSearchDialog(WebPage $oPage, $sTitle)
public function GetSearchDialog(WebPage $oPage, $sTitle, $oCurrObject = null)
{
$sHTML = '<div class="wizContainer" style="vertical-align:top;"><div id="dc_'.$this->iId.'">';
$oFilter = new DBObjectSearch($this->sTargetClass);
$oSet = new CMDBObjectSet($oFilter);
$oBlock = new DisplayBlock($oFilter, 'search', false);
if ( ($oCurrObject != null) && ($this->sAttCode != ''))
{
$oAttDef = MetaModel::GetAttributeDef(get_class($oCurrObject), $this->sAttCode);
$aParams = array('query_params' => array('this' => $oCurrObject));
$oSet = $oAttDef->GetAllowedValuesAsObjectSet($aParams);
$oFilter = $oSet->GetFilter();
}
else
{
$aParam = array();
$oFilter = new DBObjectSearch($this->sTargetClass);
$oSet = new CMDBObjectSet($oFilter);
}
$oBlock = new DisplayBlock($oFilter, 'search', false, $aParams);
$sHTML .= $oBlock->GetDisplay($oPage, $this->iId, array('open' => true, 'currentId' => $this->iId));
$sHTML .= "<form id=\"fr_{$this->iId}\" OnSubmit=\"return oACWidget_{$this->iId}.DoOk();\">\n";
$sHTML .= "<div id=\"dr_{$this->iId}\" style=\"vertical-align:top;background: #fff;height:100%;overflow:auto;padding:0;border:0;\">\n";
@@ -306,7 +319,7 @@ EOF
try
{
$oFilter = DBObjectSearch::FromOQL($sFilter);
$oBlock = new DisplayBlock($oFilter, 'list', false);
$oBlock = new DisplayBlock($oFilter, 'list', false, array('query_params' => array('this' => $oObj)));
$oBlock->Display($oP, $this->iId.'_results', array('this' => $oObj, 'cssCount'=> '#count_'.$this->iId, 'menu' => false, 'selection_mode' => true, 'selection_type' => 'single')); // Don't display the 'Actions' menu on the results
}
catch(MissingQueryArgument $e)
@@ -315,8 +328,8 @@ EOF
// TODO check if we can improve this behavior...
$sOQL = 'SELECT '.$sRemoteClass;
$oFilter = DBObjectSearch::FromOQL($sOQL);
$oBlock = new DisplayBlock($oFilter, 'list', false);
$oBlock->Display($oP, $this->iId.'_results', array('cssCount'=> '#count_'.$this->iId, 'menu' => false, 'selection_mode' => true, 'selection_type' => 'single')); // Don't display the 'Actions' menu on the results
//$oBlock = new DisplayBlock($oFilter, 'list', false);
//$oBlock->Display($oP, $this->iId.'_results', array('cssCount'=> '#count_'.$this->iId, 'menu' => false, 'selection_mode' => true, 'selection_type' => 'single')); // Don't display the 'Actions' menu on the results
}
}
@@ -353,7 +366,7 @@ EOF
/**
* Get the form to create a new object of the 'target' class
*/
public function GetObjectCreationForm(WebPage $oPage)
public function GetObjectCreationForm(WebPage $oPage, $oCurrObject)
{
// Set all the default values in an object and clone this "default" object
$oNewObj = MetaModel::NewObject($this->sTargetClass);
@@ -362,7 +375,24 @@ EOF
$oAppContext = new ApplicationContext();
$oAppContext->InitObjectFromContext($oNewObj);
// 2nd - set values from the page argument 'default'
// 2nd set the default values from the constraint on the external key... if any
if ( ($oCurrObject != null) && ($this->sAttCode != ''))
{
$oAttDef = MetaModel::GetAttributeDef(get_class($oCurrObject), $this->sAttCode);
$aParams = array('this' => $oCurrObject);
$oSet = $oAttDef->GetAllowedValuesAsObjectSet($aParams);
$aConsts = $oSet->ListConstantFields();
$sClassAlias = $oSet->GetFilter()->GetClassAlias();
if (isset($aConsts[$sClassAlias]))
{
foreach($aConsts[$sClassAlias] as $sAttCode => $value)
{
$oNewObj->Set($sAttCode, $value);
}
}
}
// 3rd - set values from the page argument 'default'
$oNewObj->UpdateObjectFromArg('default');
$sDialogTitle = addslashes($this->sTitle);

View File

@@ -34,6 +34,7 @@ class UILinksWidget
protected $m_iInputId;
protected $m_aAttributes;
protected $m_sExtKeyToRemote;
protected $m_sExtKeyToMe;
protected $m_sLinkedClass;
protected $m_sRemoteClass;
protected $m_bDuplicatesAllowed;
@@ -50,6 +51,7 @@ class UILinksWidget
$oAttDef = MetaModel::GetAttributeDef($this->m_sClass, $this->m_sAttCode);
$this->m_sLinkedClass = $oAttDef->GetLinkedClass();
$this->m_sExtKeyToRemote = $oAttDef->GetExtKeyToRemote();
$this->m_sExtKeyToMe = $oAttDef->GetExtKeyToMe();
$oLinkingAttDef = MetaModel::GetAttributeDef($this->m_sLinkedClass, $this->m_sExtKeyToRemote);
$this->m_sRemoteClass = $oLinkingAttDef->GetTargetClass();
$sExtKeyToMe = $oAttDef->GetExtKeyToMe();
@@ -97,7 +99,7 @@ class UILinksWidget
* @param Hash $aArgs Extra context arguments
* @return string The HTML fragment of the one-row form
*/
protected function GetFormRow(WebPage $oP, DBObject $oLinkedObj, $linkObjOrId = null, $aArgs = array() )
protected function GetFormRow(WebPage $oP, DBObject $oLinkedObj, $linkObjOrId = null, $aArgs = array(), $oCurrentObj )
{
$sPrefix = "$this->m_sAttCode{$this->m_sNameSuffix}";
$aRow = array();
@@ -107,6 +109,7 @@ class UILinksWidget
$sPrefix .= "[$key][";
$sNameSuffix = "]"; // To make a tabular form
$aArgs['prefix'] = $sPrefix;
$aArgs['this'] = $linkObjOrId;
$aRow['form::checkbox'] = "<input class=\"selection\" type=\"checkbox\" onClick=\"oWidget".$this->m_iInputId.".OnSelectChange();\" value=\"$key\">";
$aRow['form::checkbox'] .= "<input type=\"hidden\" name=\"attr_{$sPrefix}id{$sNameSuffix}\" value=\"$key\">";
foreach($this->m_aEditableFields as $sFieldCode)
@@ -121,8 +124,13 @@ class UILinksWidget
{
// form for creating a new record
$sPrefix .= "[$linkObjOrId][";
$oNewLinkObj = MetaModel::NewObject($this->m_sLinkedClass);
$oRemoteObj = MetaModel::GetObject($this->m_sRemoteClass, -$linkObjOrId);
$oNewLinkObj->Set($this->m_sExtKeyToRemote, $oRemoteObj); // Setting the extkey with the object alsoo fills the related external fields
$oNewLinkObj->Set($this->m_sExtKeyToMe, $oCurrentObj); // Setting the extkey with the object alsoo fills the related external fields
$sNameSuffix = "]"; // To make a tabular form
$aArgs['prefix'] = $sPrefix;
$aArgs['this'] = $oNewLinkObj;
$aRow['form::checkbox'] = "<input class=\"selection\" type=\"checkbox\" onClick=\"oWidget".$this->m_iInputId.".OnSelectChange();\" value=\"$linkObjOrId\">";
$aRow['form::checkbox'] .= "<input type=\"hidden\" name=\"attr_{$sPrefix}id{$sNameSuffix}\" value=\"\">";
foreach($this->m_aEditableFields as $sFieldCode)
@@ -207,9 +215,11 @@ class UILinksWidget
* @param WebPage $oP The web page used for all the output
* @param DBObjectSet The initial value of the linked set
* @param Hash $aArgs Extra context arguments
* @param string $sFormPrefix prefix of the fields in the current form
* @param DBObject $oCurrentObj the current object to which the linkset is related
* @return string The HTML fragment to be inserted into the page
*/
public function Display(WebPage $oPage, DBObjectSet $oValue, $aArgs = array())
public function Display(WebPage $oPage, DBObjectSet $oValue, $aArgs = array(), $sFormPrefix, $oCurrentObj)
{
$sHtmlValue = '';
$sTargetClass = self::GetTargetClass($this->m_sClass, $this->m_sAttCode);
@@ -223,27 +233,28 @@ class UILinksWidget
if ($oCurrentLink->IsNew())
{
$key = -$oLinkedObj->GetKey();
$aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $key, $aArgs);
$aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $key, $aArgs, $oCurrentObj);
}
else
{
$key = $oCurrentLink->GetKey();
$aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $oCurrentLink, $aArgs);
$aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $oCurrentLink, $aArgs, $oCurrentObj);
}
}
$sHtmlValue .= $this->DisplayFormTable($oPage, $this->m_aTableConfig, $aForm);
$sDuplicates = ($this->m_bDuplicatesAllowed) ? 'true' : 'false';
$sWizHelper = 'oWizardHelper'.$sFormPrefix;
$oPage->add_ready_script(<<<EOF
oWidget{$this->m_iInputId} = new LinksWidget('{$this->m_sAttCode}{$this->m_sNameSuffix}', '{$this->m_sClass}', '{$this->m_sAttCode}', '{$this->m_iInputId}', '{$this->m_sNameSuffix}', $sDuplicates);
oWidget{$this->m_iInputId} = new LinksWidget('{$this->m_sAttCode}{$this->m_sNameSuffix}', '{$this->m_sClass}', '{$this->m_sAttCode}', '{$this->m_iInputId}', '{$this->m_sNameSuffix}', $sDuplicates, $sWizHelper);
oWidget{$this->m_iInputId}.Init();
EOF
);
$sHtmlValue .= "<span style=\"float:left;\">&nbsp;&nbsp;&nbsp;<img src=\"../images/tv-item-last.gif\">&nbsp;&nbsp;<input id=\"{$this->m_sAttCode}{$this->m_sNameSuffix}_btnRemove\" type=\"button\" value=\"".Dict::S('UI:RemoveLinkedObjectsOf_Class')."\" onClick=\"oWidget{$this->m_iInputId}.RemoveSelected();\" >";
$sHtmlValue .= "&nbsp;&nbsp;&nbsp;<input id=\"{$this->m_sAttCode}{$this->m_sNameSuffix}_btnAdd\" type=\"button\" value=\"".Dict::Format('UI:AddLinkedObjectsOf_Class', MetaModel::GetName($this->m_sRemoteClass))."\" onClick=\"oWidget{$this->m_iInputId}.AddObjects();\"></span>\n";
$sHtmlValue .= "&nbsp;&nbsp;&nbsp;<input id=\"{$this->m_sAttCode}{$this->m_sNameSuffix}_btnAdd\" type=\"button\" value=\"".Dict::Format('UI:AddLinkedObjectsOf_Class', MetaModel::GetName($this->m_sRemoteClass))."\" onClick=\"oWidget{$this->m_iInputId}.AddObjects();\"><span id=\"{$this->m_sAttCode}{$this->m_sNameSuffix}_indicatorAdd\"></span></span>\n";
$sHtmlValue .= "<span style=\"clear:both;\"><p>&nbsp;</p></span>\n";
$sHtmlValue .= "</div>\n";
$oPage->add_at_the_end($this->GetObjectPickerDialog($oPage), "dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}"); // To prevent adding forms inside the main form
$oPage->add_at_the_end("<div id=\"dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}\"></div>"); // To prevent adding forms inside the main form
return $sHtmlValue;
}
@@ -266,12 +277,11 @@ EOF
return $sTargetClass;
}
protected function GetObjectPickerDialog($oPage)
public function GetObjectPickerDialog($oPage, $oCurrentObj)
{
$sHtml = "<div id=\"dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}\">";
$sHtml .= "<div class=\"wizContainer\" style=\"vertical-align:top;\">\n";
$sHtml = "<div class=\"wizContainer\" style=\"vertical-align:top;\">\n";
$oFilter = new DBObjectSearch($this->m_sRemoteClass);
$oSet = new CMDBObjectSet($oFilter);
$this->SetSearchDefaultFromContext($oCurrentObj, $oFilter);
$oBlock = new DisplayBlock($oFilter, 'search', false);
$sHtml .= $oBlock->GetDisplay($oPage, "SearchFormToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}", array('open' => true));
$sHtml .= "<form id=\"ObjectsAddForm_{$this->m_sAttCode}{$this->m_sNameSuffix}\" OnSubmit=\"return oWidget{$this->m_iInputId}.DoAddObjects(this.id);\">\n";
@@ -282,12 +292,11 @@ EOF
$sHtml .= "<input type=\"button\" value=\"".Dict::S('UI:Button:Cancel')."\" onClick=\"$('#dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}').dialog('close');\">&nbsp;&nbsp;<input id=\"btn_ok_{$this->m_sAttCode}{$this->m_sNameSuffix}\" disabled=\"disabled\" type=\"submit\" value=\"".Dict::S('UI:Button:Add')."\">";
$sHtml .= "</div>\n";
$sHtml .= "</form>\n";
$sHtml .= "</div>\n";
$oPage->add($sHtml);
$oPage->add_ready_script("$('#dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}').dialog({ width: $(window).width()*0.8, height: $(window).height()*0.8, autoOpen: false, modal: true, resizeStop: oWidget{$this->m_iInputId}.UpdateSizes });");
$oPage->add_ready_script("$('#dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}').dialog('option', {title:'".addslashes(Dict::Format('UI:AddObjectsOf_Class_LinkedWith_Class', MetaModel::GetName($this->m_sLinkedClass), MetaModel::GetName($this->m_sClass)))."'});");
$oPage->add_ready_script("$('#SearchFormToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix} form').bind('submit.uilinksWizard', oWidget{$this->m_iInputId}.SearchObjectsToAdd);");
$oPage->add_ready_script("$('#SearchFormToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}').resize(oWidget{$this->m_iInputId}.UpdateSizes);");
return $sHtml;
}
/**
@@ -344,7 +353,7 @@ EOF
$oBlock->Display($oP, "ResultsToAdd_{$this->m_sAttCode}", array('menu' => false, 'cssCount'=> '#count_'.$this->m_sAttCode.$this->m_sNameSuffix , 'selection_mode' => true)); // Don't display the 'Actions' menu on the results
}
public function DoAddObjects(WebPage $oP, $oFullSetFilter)
public function DoAddObjects(WebPage $oP, $oFullSetFilter, $oCurrentObj)
{
$aLinkedObjectIds = utils::ReadMultipleSelection($oFullSetFilter);
@@ -353,7 +362,7 @@ EOF
$oLinkedObj = MetaModel::GetObject($this->m_sRemoteClass, $iObjectId);
if (is_object($oLinkedObj))
{
$aRow = $this->GetFormRow($oP, $oLinkedObj, -$iObjectId ); // Not yet created link get negative Ids
$aRow = $this->GetFormRow($oP, $oLinkedObj, -$iObjectId, array(), $oCurrentObj ); // Not yet created link get negative Ids
$oP->add($this->DisplayFormRow($oP, $this->m_aTableConfig, $aRow, -$iObjectId));
}
else
@@ -362,5 +371,47 @@ EOF
}
}
}
/**
* Initializes the default search parameters based on 1) a 'current' object and 2) the silos defined by the context
* @param DBObject $oSourceObj
* @param DBObjectSearch $oSearch
*/
protected function SetSearchDefaultFromContext($oSourceObj, &$oSearch)
{
$oAppContext = new ApplicationContext();
$sSrcClass = get_class($oSourceObj);
$sDestClass = $oSearch->GetClass();
foreach($oAppContext->GetNames() as $key)
{
// Find the value of the object corresponding to each 'context' parameter
$aCallSpec = array($sSrcClass, 'MapContextParam');
$sAttCode = '';
if (is_callable($aCallSpec))
{
$sAttCode = call_user_func($aCallSpec, $key); // Returns null when there is no mapping for this parameter
}
if (MetaModel::IsValidAttCode($sSrcClass, $sAttCode))
{
$oAttDef = MetaModel::GetAttributeDef($sSrcClass, $sAttCode);
$defaultValue = $oSourceObj->Get($sAttCode);
// Find the attcode for the same 'context' parameter in the destination class
// and sets its value as the default value for the search condition
$aCallSpec = array($sDestClass, 'MapContextParam');
$sAttCode = '';
if (is_callable($aCallSpec))
{
$sAttCode = call_user_func($aCallSpec, $key); // Returns null when there is no mapping for this parameter
}
if (MetaModel::IsValidAttCode($sDestClass, $sAttCode) && !empty($defaultValue))
{
$oSearch->AddCondition($sAttCode, $defaultValue);
}
}
}
}
}
?>

View File

@@ -46,6 +46,7 @@ class utils
// Parameters loaded from a file, parameters of the page/command line still have precedence
private static $m_aParamsFromFile = null;
private static $m_aParamSource = array();
protected static function LoadParamFile($sParamFile)
{
@@ -82,6 +83,7 @@ class utils
$sParam = $aMatches[1];
$value = trim($aMatches[2]);
self::$m_aParamsFromFile[$sParam] = $value;
self::$m_aParamSource[$sParam] = $sParamFile;
}
}
}
@@ -99,6 +101,25 @@ class utils
}
}
/**
* Return the source file from which the parameter has been found,
* usefull when it comes to pass user credential to a process executed
* in the background
* @param $sName Parameter name
* @return The file name if any, or null
*/
public static function GetParamSourceFile($sName)
{
if (array_key_exists($sName, self::$m_aParamSource))
{
return self::$m_aParamSource[$sName];
}
else
{
return null;
}
}
public static function IsModeCLI()
{
$sSAPIName = php_sapi_name();
@@ -152,10 +173,18 @@ class utils
public static function Sanitize($value, $defaultValue, $sSanitizationFilter)
{
$retValue = self::Sanitize_Internal($value, $sSanitizationFilter);
if ($retValue === false)
if ($value === $defaultValue)
{
$retValue = $defaultValue;
// Preserve the real default value (can be used to detect missing mandatory parameters)
$retValue = $value;
}
else
{
$retValue = self::Sanitize_Internal($value, $sSanitizationFilter);
if ($retValue === false)
{
$retValue = $defaultValue;
}
}
return $retValue;
}
@@ -431,8 +460,6 @@ class utils
/**
* Returns the absolute URL to the server's root path
* @param $sCurrentRelativePath string NO MORE USED, kept for backward compatibility only !
* @param $bForceHTTPS bool True to force HTTPS, false otherwise
* @return string The absolute URL to the server's root, without the first slash
*/
static public function GetAbsoluteUrlAppRoot()
@@ -521,6 +548,17 @@ class utils
return $sAppRootUrl;
}
/**
* Returns the absolute URL to the modules root path
* Hardcoded here for compatibility with iTop 2.0 modules
* @return string The absolute URL to the modules
*/
static public function GetAbsoluteUrlModulesRoot()
{
$sUrl = self::GetAbsoluteUrlAppRoot().'modules/';
return $sUrl;
}
/**
* Tells whether or not log off operation is supported.
* Actually in only one case:
@@ -601,5 +639,86 @@ class utils
}
echo "<p><pre>".print_r($aLightTrace, true)."</pre></p>\n";
}
/**
* Execute the given iTop PHP script, passing it the current credentials
* Only CLI mode is supported, because of the need to hand the credentials over to the next process
* Throws an exception if the execution fails or could not be attempted (config issue)
* @param string $sScript Name and relative path to the file (relative to the iTop root dir)
* @param hash $aArguments Associative array of 'arg' => 'value'
* @return array(iCode, array(output lines))
*/
/**
*/
static function ExecITopScript($sScriptName, $aArguments)
{
$aDisabled = explode(', ', ini_get('disable_functions'));
if (in_array('exec', $aDisabled))
{
throw new Exception("The PHP exec() function has been disabled on this server");
}
$sPHPExec = trim(MetaModel::GetConfig()->Get('php_path'));
if (strlen($sPHPExec) == 0)
{
throw new Exception("The path to php must not be empty. Please set a value for 'php_path' in your configuration file.");
}
$sAuthUser = self::ReadParam('auth_user', '', 'raw_data');
$sAuthPwd = self::ReadParam('auth_pwd', '', 'raw_data');
$sParamFile = self::GetParamSourceFile('auth_user');
if (is_null($sParamFile))
{
$aArguments['auth_user'] = $sAuthUser;
$aArguments['auth_pwd'] = $sAuthPwd;
}
else
{
$aArguments['param_file'] = $sParamFile;
}
$aArgs = array();
foreach($aArguments as $sName => $value)
{
// Note: See comment from the 23-Apr-2004 03:30 in the PHP documentation
// It suggests to rely on pctnl_* function instead of using escapeshellargs
$aArgs[] = "--$sName=".escapeshellarg($value);
}
$sArgs = implode(' ', $aArgs);
$sScript = realpath(APPROOT.$sScriptName);
if (!file_exists($sScript))
{
throw new Exception("Could not find the script file '$sScriptName' from the directory '".APPROOT."'");
}
$sCommand = '"'.$sPHPExec.'" '.escapeshellarg($sScript).' -- '.$sArgs;
if (version_compare(phpversion(), '5.3.0', '<'))
{
if (substr(PHP_OS,0,3) == 'WIN')
{
// Under Windows, and for PHP 5.2.x, the whole command has to be quoted
// Cf PHP doc: http://php.net/manual/fr/function.exec.php, comment from the 27-Dec-2010
$sCommand = '"'.$sCommand.'"';
}
}
$sLastLine = exec($sCommand, $aOutput, $iRes);
if ($iRes == 1)
{
throw new Exception(Dict::S('Core:ExecProcess:Code1')." - ".$sCommand);
}
elseif ($iRes == 255)
{
$sErrors = implode("\n", $aOutput);
throw new Exception(Dict::S('Core:ExecProcess:Code255')." - ".$sCommand.":\n".$sErrors);
}
//$aOutput[] = $sCommand;
return array($iRes, $aOutput);
}
}
?>

View File

@@ -372,13 +372,13 @@ class WebPage
{
// Make sure that the URL to the script contains the application's version number
// so that the new script do NOT get reloaded from the cache when the application is upgraded
if (strpos('?', $s_script) === false)
if (strpos($s_script, '?') === false)
{
$s_script .= "?version=".ITOP_VERSION;
$s_script .= "?itopversion=".ITOP_VERSION;
}
else
{
$s_script .= "&version=".ITOP_VERSION;
$s_script .= "&itopversion=".ITOP_VERSION;
}
echo "<script type=\"text/javascript\" src=\"$s_script\"></script>\n";
}
@@ -413,6 +413,10 @@ class WebPage
}
echo "</style>\n";
}
if (class_exists('MetaModel') && MetaModel::GetConfig())
{
echo "<link rel=\"shortcut icon\" href=\"".utils::GetAbsoluteUrlAppRoot()."images/favicon.ico\" />\n";
}
echo "</head>\n";
echo "<body>\n";
echo self::FilterXSS($this->s_content);

View File

@@ -1,5 +1,6 @@
<?php
define('APPROOT', dirname(__FILE__).'/');
define('MODULESROOT', APPROOT.'modules/');
if (function_exists('microtime'))
{
$fItopStarted = microtime(true);

View File

@@ -42,7 +42,7 @@ abstract class Action extends cmdbAbstractObject
"key_type" => "autoincrement",
"name_attcode" => "name",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('name'),
"db_table" => "priv_action",
"db_key_field" => "id",
"db_finalclass_field" => "realclass",
@@ -106,7 +106,7 @@ abstract class ActionNotification extends Action
"key_type" => "autoincrement",
"name_attcode" => "name",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('name'),
"db_table" => "priv_action_notification",
"db_key_field" => "id",
"db_finalclass_field" => "",
@@ -139,7 +139,7 @@ class ActionEmail extends ActionNotification
"key_type" => "autoincrement",
"name_attcode" => "name",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('name'),
"db_table" => "priv_action_email",
"db_key_field" => "id",
"db_finalclass_field" => "",
@@ -183,6 +183,7 @@ class ActionEmail extends ActionNotification
try
{
$oSearch = DBObjectSearch::FromOQL($sOQL);
$oSearch->AllowAllData();
}
catch (OQLException $e)
{
@@ -275,6 +276,7 @@ class ActionEmail extends ActionNotification
protected function _DoExecute($oTrigger, $aContextArgs, &$oLog)
{
$sPreviousUrlMaker = ApplicationContext::SetUrlMakerClass();
$aHeaders = array();
try
{
$this->m_iRecipients = 0;
@@ -294,14 +296,17 @@ class ActionEmail extends ActionNotification
$sBody = MetaModel::ApplyParams($this->Get('body'), $aContextArgs);
$oObj = $aContextArgs['this->object()'];
$sReference = '<iTop/'.get_class($oObj).'/'.$oObj->GetKey().'>';
$sMessageId = sprintf('<iTop_%s_%d_%f@%s.openitop.org>', get_class($oObj), $oObj->GetKey(), microtime(true /* get as float*/), MetaModel::GetConfig()->Get('session_name'));
$sReference = $sMessageId;
$aHeaders['Message-ID'] = $sMessageId;
}
catch(Exception $e)
{
ApplicationContext::SetUrlMakerClass($sPreviousUrlMaker);
throw $e;
}
ApplicationContext::SetUrlMakerClass($sPreviousUrlMaker);
if (!is_null($oLog))
{
// Note: we have to secure this because those values are calculated
@@ -315,7 +320,7 @@ class ActionEmail extends ActionNotification
if (isset($sBody)) $oLog->Set('body', $sBody);
}
$oEmail = new EMail();
$oEmail = new EMail('', '', '', $aHeaders);
if ($this->IsBeingTested())
{

View File

@@ -170,6 +170,10 @@ abstract class AttributeDefinition
return "";
// e.g: return array("Site", "infrid", "name");
}
public function GetFinalAttDef()
{
return $this;
}
public function IsDirectField() {return false;}
public function IsScalar() {return false;}
public function IsLinkSet() {return false;}
@@ -180,24 +184,41 @@ abstract class AttributeDefinition
public function IsNullAllowed() {return true;}
public function GetCode() {return $this->m_sCode;}
public function GetLabel()
public function GetLabel($sDefault = null)
{
// If no default value is specified, let's define the most relevant one for developping purposes
if (is_null($sDefault))
{
$sDefault = $this->m_sCode;
}
$sLabel = Dict::S('Class:'.$this->m_sHostClass.'/Attribute:'.$this->m_sCode, '');
if (strlen($sLabel) == 0)
{
$sLabel = $this->m_sCode;
// Nothing found: go higher in the hierarchy (if possible)
//
$sLabel = $sDefault;
$sParentClass = MetaModel::GetParentClass($this->m_sHostClass);
if ($sParentClass)
{
if (MetaModel::IsValidAttCode($sParentClass, $this->m_sCode))
{
$oAttDef = MetaModel::GetAttributeDef($sParentClass, $this->m_sCode);
$sLabel = $oAttDef->GetLabel();
$sLabel = $oAttDef->GetLabel($sDefault);
}
}
}
return $sLabel;
}
/**
* Get the label corresponding to the given value
* To be overloaded for localized enums
*/
public function GetValueLabel($sValue)
{
return GetAsHTML($sValue);
}
public function GetLabel_Obsolete()
{
@@ -212,40 +233,56 @@ abstract class AttributeDefinition
}
}
public function GetDescription()
public function GetDescription($sDefault = null)
{
$sDescription = Dict::S('Class:'.$this->m_sHostClass.'/Attribute:'.$this->m_sCode.'+', '');
if (strlen($sDescription) == 0)
// If no default value is specified, let's define the most relevant one for developping purposes
if (is_null($sDefault))
{
$sDefault = '';
}
$sLabel = Dict::S('Class:'.$this->m_sHostClass.'/Attribute:'.$this->m_sCode.'+', '');
if (strlen($sLabel) == 0)
{
// Nothing found: go higher in the hierarchy (if possible)
//
$sLabel = $sDefault;
$sParentClass = MetaModel::GetParentClass($this->m_sHostClass);
if ($sParentClass)
{
if (MetaModel::IsValidAttCode($sParentClass, $this->m_sCode))
{
$oAttDef = MetaModel::GetAttributeDef($sParentClass, $this->m_sCode);
$sDescription = $oAttDef->GetDescription();
$sLabel = $oAttDef->GetDescription($sDefault);
}
}
}
return $sDescription;
return $sLabel;
}
public function GetHelpOnEdition()
public function GetHelpOnEdition($sDefault = null)
{
$sHelp = Dict::S('Class:'.$this->m_sHostClass.'/Attribute:'.$this->m_sCode.'?', '');
if (strlen($sHelp) == 0)
// If no default value is specified, let's define the most relevant one for developping purposes
if (is_null($sDefault))
{
$sDefault = '';
}
$sLabel = Dict::S('Class:'.$this->m_sHostClass.'/Attribute:'.$this->m_sCode.'?', '');
if (strlen($sLabel) == 0)
{
// Nothing found: go higher in the hierarchy (if possible)
//
$sLabel = $sDefault;
$sParentClass = MetaModel::GetParentClass($this->m_sHostClass);
if ($sParentClass)
{
if (MetaModel::IsValidAttCode($sParentClass, $this->m_sCode))
{
$oAttDef = MetaModel::GetAttributeDef($sParentClass, $this->m_sCode);
$sHelp = $oAttDef->GetHelpOnEdition();
$sLabel = $oAttDef->GetHelpOnEdition($sDefault);
}
}
}
return $sHelp;
return $sLabel;
}
public function GetHelpOnSmartSearch()
@@ -1048,6 +1085,11 @@ class AttributeBoolean extends AttributeInteger
if ($value) return 1;
return 0;
}
public function GetAsXML($sValue, $oHostObject = null)
{
return $sValue ? '1' : '0';
}
}
/**
@@ -1309,7 +1351,12 @@ class AttributeFinalClass extends AttributeString
{
return '=';
}
public function GetValueLabel($sValue)
{
if (empty($sValue)) return '';
return MetaModel::GetName($sValue);
}
}
@@ -1601,7 +1648,7 @@ class AttributeLongText extends AttributeText
*
* @package iTopORM
*/
class AttributeCaseLog extends AttributeText
class AttributeCaseLog extends AttributeLongText
{
public function GetNullValue()
{
@@ -1787,7 +1834,7 @@ class AttributeCaseLog extends AttributeText
*
* @package iTopORM
*/
class AttributeHTML extends AttributeText
class AttributeHTML extends AttributeLongText
{
public function GetEditClass() {return "HTML";}
@@ -1838,6 +1885,7 @@ class AttributeIPAddress extends AttributeString
*/
class AttributeOQL extends AttributeText
{
public function GetEditClass() {return "OQLExpression";}
}
/**
@@ -2265,6 +2313,7 @@ class AttributeDateTime extends AttributeDBField
default:
$oNewCondition = parent::GetSmartConditionExpression($sSearchText, $oField, $aParams);
}
return $oNewCondition;
@@ -2695,6 +2744,13 @@ class AttributeExternalField extends AttributeDefinition
}
public function GetEditClass() {return "ExtField";}
public function GetFinalAttDef()
{
$oExtAttDef = $this->GetExtAttDef();
return $oExtAttDef->GetFinalAttDef();
}
protected function GetSQLCol()
{
// throw new CoreException("external attribute: does it make any sense to request its type ?");
@@ -2714,23 +2770,35 @@ class AttributeExternalField extends AttributeDefinition
}
}
public function GetLabel()
public function GetLabel($sDefault = null)
{
$oRemoteAtt = $this->GetExtAttDef();
$sDefault = $oRemoteAtt->GetLabel();
return Dict::S('Class:'.$this->m_sHostClass.'/Attribute:'.$this->m_sCode, $sDefault);
$sLabel = parent::GetLabel('');
if (strlen($sLabel) == 0)
{
$oRemoteAtt = $this->GetExtAttDef();
$sLabel = $oRemoteAtt->GetLabel($this->m_sCode);
}
return $sLabel;
}
public function GetDescription()
public function GetDescription($sDefault = null)
{
$oRemoteAtt = $this->GetExtAttDef();
$sDefault = $oRemoteAtt->GetDescription();
return Dict::S('Class:'.$this->m_sHostClass.'/Attribute:'.$this->m_sCode.'+', $sDefault);
$sLabel = parent::GetDescription('');
if (strlen($sLabel) == 0)
{
$oRemoteAtt = $this->GetExtAttDef();
$sLabel = $oRemoteAtt->GetDescription('');
}
return $sLabel;
}
public function GetHelpOnEdition()
public function GetHelpOnEdition($sDefault = null)
{
$oRemoteAtt = $this->GetExtAttDef();
$sDefault = $oRemoteAtt->GetHelpOnEdition();
return Dict::S('Class:'.$this->m_sHostClass.'/Attribute:'.$this->m_sCode.'?', $sDefault);
$sLabel = parent::GetHelpOnEdition('');
if (strlen($sLabel) == 0)
{
$oRemoteAtt = $this->GetExtAttDef();
$sLabel = $oRemoteAtt->GetHelpOnEdition('');
}
return $sLabel;
}
public function IsExternalKey($iType = EXTKEY_RELATIVE)
@@ -3228,16 +3296,26 @@ class AttributeOneWayPassword extends AttributeDefinition
}
// Indexed array having two dimensions
class AttributeTable extends AttributeText
class AttributeTable extends AttributeDBField
{
public function GetEditClass() {return "Text";}
protected function GetSQLCol() {return "TEXT";}
public function GetEditClass() {return "Table";}
protected function GetSQLCol() {return "LONGTEXT";}
public function GetMaxSize()
{
return null;
}
public function GetNullValue()
{
return array();
}
public function IsNull($proposedValue)
{
return (count($proposedValue) == 0);
}
// Facilitate things: allow the user to Set the value from a string
public function MakeRealValue($proposedValue, $oHostObj)
{
@@ -3300,13 +3378,39 @@ class AttributeTable extends AttributeText
$sRes .= "</TABLE>";
return $sRes;
}
public function GetAsCSV($sValue, $sSeparator = ',', $sTextQualifier = '"', $oHostObject = null)
{
// Not implemented
return '';
}
public function GetAsXML($value, $oHostObject = null)
{
if (count($value) == 0)
{
return "";
}
$sRes = "";
foreach($value as $iRow => $aRawData)
{
$sRes .= "<row>";
foreach ($aRawData as $iCol => $cell)
{
$sCell = Str::pure2xml((string)$cell);
$sRes .= "<cell icol=\"$iCol\">$sCell</cell>";
}
$sRes .= "</row>";
}
return $sRes;
}
}
// The PHP value is a hash array, it is stored as a TEXT column
class AttributePropertySet extends AttributeTable
{
public function GetEditClass() {return "Text";}
protected function GetSQLCol() {return "TEXT";}
public function GetEditClass() {return "PropertySet";}
// Facilitate things: allow the user to Set the value from a string
public function MakeRealValue($proposedValue, $oHostObj)
@@ -3333,6 +3437,10 @@ class AttributePropertySet extends AttributeTable
$sRes .= "<TBODY>";
foreach($value as $sProperty => $sValue)
{
if ($sProperty == 'auth_pwd')
{
$sValue = '*****';
}
$sRes .= "<TR>";
$sCell = str_replace("\n", "<br>\n", Str::pure2html((string)$sValue));
$sRes .= "<TD class=\"label\">$sProperty</TD><TD>$sCell</TD>";
@@ -3342,6 +3450,53 @@ class AttributePropertySet extends AttributeTable
$sRes .= "</TABLE>";
return $sRes;
}
public function GetAsCSV($value, $sSeparator = ',', $sTextQualifier = '"', $oHostObject = null)
{
if (count($value) == 0)
{
return "";
}
$aRes = array();
foreach($value as $sProperty => $sValue)
{
if ($sProperty == 'auth_pwd')
{
$sValue = '*****';
}
$sFrom = array(',', '=');
$sTo = array('\,', '\=');
$aRes[] = $sProperty.'='.str_replace($sFrom, $sTo, (string)$sValue);
}
$sRaw = implode(',', $aRes);
$sFrom = array("\r\n", $sTextQualifier);
$sTo = array("\n", $sTextQualifier.$sTextQualifier);
$sEscaped = str_replace($sFrom, $sTo, $sRaw);
return $sTextQualifier.$sEscaped.$sTextQualifier;
}
public function GetAsXML($value, $oHostObject = null)
{
if (count($value) == 0)
{
return "";
}
$sRes = "";
foreach($value as $sProperty => $sValue)
{
if ($sProperty == 'auth_pwd')
{
$sValue = '*****';
}
$sRes .= "<property id=\"$sProperty\">";
$sRes .= Str::pure2xml((string)$sValue);
$sRes .= "</property>";
}
return $sRes;
}
}
/**
@@ -3444,6 +3599,43 @@ class AttributeFriendlyName extends AttributeComputedFieldVoid
public function GetKeyAttCode() {return $this->Get("extkey_attcode");}
public function GetLabel($sDefault = null)
{
$sLabel = parent::GetLabel('');
if (strlen($sLabel) == 0)
{
$sKeyAttCode = $this->Get("extkey_attcode");
if ($sKeyAttCode == 'id')
{
return Dict::S('Core:FriendlyName-Label');
}
else
{
$oExtKeyAttDef = MetaModel::GetAttributeDef($this->GetHostClass(), $sKeyAttCode);
$sLabel = $oExtKeyAttDef->GetLabel($this->m_sCode);
}
}
return $sLabel;
}
public function GetDescription($sDefault = null)
{
$sLabel = parent::GetDescription('');
if (strlen($sLabel) == 0)
{
$sKeyAttCode = $this->Get("extkey_attcode");
if ($sKeyAttCode == 'id')
{
return Dict::S('Core:FriendlyName-Description');
}
else
{
$oExtKeyAttDef = MetaModel::GetAttributeDef($this->GetHostClass(), $sKeyAttCode);
$sLabel = $oExtKeyAttDef->GetDescription('');
}
}
return $sLabel;
}
// n/a, the friendly name is made of a complex expression (see GetNameSpec)
protected function GetSQLCol() {return "";}

View File

@@ -401,7 +401,13 @@ class BulkChange
if ($sAttCode == 'id') continue;
$oAttDef = MetaModel::GetAttributeDef($this->m_sClass, $sAttCode);
if ($oAttDef->IsLinkSet() && $oAttDef->IsIndirect())
$aReasons = array();
$iFlags = $oTargetObj->GetAttributeFlags($sAttCode, $aReasons);
if ( (($iFlags & OPT_ATT_READONLY) == OPT_ATT_READONLY) && ( $oTargetObj->Get($sAttCode) != $aRowData[$iCol]) )
{
$aErrors[$sAttCode] = "the attribute '$sAttCode' is read-only and cannot be modified (current value: ".$oTargetObj->Get($sAttCode).", proposed value: {$aRowData[$iCol]}).";
}
else if ($oAttDef->IsLinkSet() && $oAttDef->IsIndirect())
{
try
{

View File

@@ -76,6 +76,7 @@ require_once('cmdbchangeop.class.inc.php');
// Romain: temporary moved into application.inc.php (see explanations there)
//require_once('event.class.inc.php');
require_once('templatestring.class.inc.php');
require_once('csvparser.class.inc.php');
require_once('bulkchange.class.inc.php');
@@ -279,9 +280,10 @@ abstract class CMDBObject extends DBObject
{
$this->CheckUserRights($bSkipStrongSecurity, UR_ACTION_MODIFY);
$oPreviousChange = self::$m_oCurrChange;
self::$m_oCurrChange = $oChange;
$ret = $this->DBInsertTracked_Internal();
self::$m_oCurrChange = null;
self::$m_oCurrChange = $oPreviousChange;
return $ret;
}
@@ -289,9 +291,10 @@ abstract class CMDBObject extends DBObject
{
$this->CheckUserRights($bSkipStrongSecurity, UR_ACTION_MODIFY);
$oPreviousChange = self::$m_oCurrChange;
self::$m_oCurrChange = $oChange;
$ret = $this->DBInsertTracked_Internal(true);
self::$m_oCurrChange = null;
self::$m_oCurrChange = $oPreviousChange;
return $ret;
}
@@ -320,9 +323,10 @@ abstract class CMDBObject extends DBObject
public function DBCloneTracked(CMDBChange $oChange, $newKey = null)
{
$oPreviousChange = self::$m_oCurrChange;
self::$m_oCurrChange = $oChange;
$this->DBCloneTracked_Internal($newKey);
self::$m_oCurrChange = null;
self::$m_oCurrChange = $oPreviousChange;
}
protected function DBCloneTracked_Internal($newKey = null)
@@ -347,9 +351,10 @@ abstract class CMDBObject extends DBObject
{
$this->CheckUserRights($bSkipStrongSecurity, UR_ACTION_MODIFY);
$oPreviousChange = self::$m_oCurrChange;
self::$m_oCurrChange = $oChange;
$this->DBUpdateTracked_Internal();
self::$m_oCurrChange = null;
self::$m_oCurrChange = $oPreviousChange;
}
protected function DBUpdateTracked_Internal()
@@ -382,9 +387,10 @@ abstract class CMDBObject extends DBObject
{
$this->CheckUserRights($bSkipStrongSecurity, UR_ACTION_DELETE);
$oPreviousChange = self::$m_oCurrChange;
self::$m_oCurrChange = $oChange;
$this->DBDeleteTracked_Internal($oDeletionPlan);
self::$m_oCurrChange = null;
self::$m_oCurrChange = $oPreviousChange;
}
protected function DBDeleteTracked_Internal(&$oDeletionPlan = null)
@@ -406,9 +412,10 @@ abstract class CMDBObject extends DBObject
public static function BulkDeleteTracked(CMDBChange $oChange, DBObjectSearch $oFilter)
{
$oPreviousChange = self::$m_oCurrChange;
self::$m_oCurrChange = $oChange;
$this->BulkDeleteTracked_Internal($oFilter);
self::$m_oCurrChange = null;
self::$m_oCurrChange = $oPreviousChange;
}
protected static function BulkDeleteTracked_Internal(DBObjectSearch $oFilter)
@@ -445,9 +452,10 @@ abstract class CMDBObject extends DBObject
public static function BulkUpdateTracked(CMDBChange $oChange, DBObjectSearch $oFilter, array $aValues)
{
$oPreviousChange = self::$m_oCurrChange;
self::$m_oCurrChange = $oChange;
$this->BulkUpdateTracked_Internal($oFilter, $aValues);
self::$m_oCurrChange = null;
self::$m_oCurrChange = $oPreviousChange;
}
protected static function BulkUpdateTracked_Internal(DBObjectSearch $oFilter, array $aValues)

View File

@@ -124,6 +124,14 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
),
'php_path' => array(
'type' => 'string',
'description' => 'Path to the php executable in CLI mode',
'default' => 'php',
'value' => 'php',
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'session_name' => array(
'type' => 'string',
'description' => 'The name of the cookie used to store the PHP session id',
@@ -189,6 +197,14 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
),
'csv_import_history_display' => array(
'type' => 'bool',
'description' => 'Display the history tab in the import wizard',
'default' => true,
'value' => true,
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'access_mode' => array(
'type' => 'integer',
'description' => 'Combination of flags (ACCESS_USER_WRITE | ACCESS_ADMIN_WRITE, or ACCESS_FULL)',
@@ -383,6 +399,42 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'cas_user_synchro' => array(
'type' => 'bool',
'description' => 'Whether or not to synchronize users with CAS/LDAP',
// examples... not used (nor 'description')
'default' => 0,
'value' => 0,
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'cas_update_profiles' => array(
'type' => 'bool',
'description' => 'Whether or not to update the profiles of an existing user from the CAS information',
// examples... not used (nor 'description')
'default' => 0,
'value' => 0,
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'cas_profile_pattern' => array(
'type' => 'string',
'description' => 'A regular expression pattern to extract the name of the iTop profile from the name of an LDAP/CAS group',
// examples... not used (nor 'description')
'default' => '/^cn=([^,]+),/',
'value' => '/^cn=([^,]+),/',
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'cas_default_profiles' => array(
'type' => 'string',
'description' => 'A semi-colon separated list of iTop Profiles to use when creating a new user if no profile is retrieved from CAS',
// examples... not used (nor 'description')
'default' => 'Portal user',
'value' => 'Portal user',
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'cas_debug' => array(
'type' => 'bool',
'description' => 'Activate the CAS debug',
@@ -419,6 +471,15 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'complex_actions_limit' => array(
'type' => 'integer',
'description' => 'Display the "actions" menu items that require long computation only if the list of objects is contains less objects than this number (0 means no limit)',
// examples... not used
'default' => 50,
'value' => 50,
'source_of_value' => '',
'show_in_conf_sample' => false,
),
);
public function IsProperty($sPropCode)
@@ -544,6 +605,7 @@ class Config
'application/menunode.class.inc.php',
'application/user.preferences.class.inc.php',
'application/audit.rule.class.inc.php',
'application/query.class.inc.php',
// Romain - That's dirty, because those classes are in fact part of the core
// but I needed those classes to be derived from cmdbAbstractObject
// (to be managed via the GUI) and this class in not really known from

View File

@@ -154,7 +154,7 @@ abstract class DBObject
return true;
}
protected function Reload()
public function Reload()
{
assert($this->m_bIsInDB);
$aRow = MetaModel::MakeSingleRow(get_class($this), $this->m_iKey, false/*, $this->m_bAllowAllData*/);
@@ -302,30 +302,53 @@ abstract class DBObject
$this->Reload();
}
if ($oAttDef->IsExternalKey() && is_object($value))
if ($oAttDef->IsExternalKey())
{
// Setting an external key with a whole object (instead of just an ID)
// let's initialize also the external fields that depend on it
// (useful when building objects in memory and not from a query)
if ( (get_class($value) != $oAttDef->GetTargetClass()) && (!is_subclass_of($value, $oAttDef->GetTargetClass())))
if (is_object($value))
{
throw new CoreUnexpectedValue("Trying to set the value of '$sAttCode', to an object of class '".get_class($value)."', whereas it's an ExtKey to '".$oAttDef->GetTargetClass()."'. Ignored");
// Setting an external key with a whole object (instead of just an ID)
// let's initialize also the external fields that depend on it
// (useful when building objects in memory and not from a query)
if ( (get_class($value) != $oAttDef->GetTargetClass()) && (!is_subclass_of($value, $oAttDef->GetTargetClass())))
{
throw new CoreUnexpectedValue("Trying to set the value of '$sAttCode', to an object of class '".get_class($value)."', whereas it's an ExtKey to '".$oAttDef->GetTargetClass()."'. Ignored");
}
else
{
$this->m_aCurrValues[$sAttCode] = $value->GetKey();
foreach(MetaModel::ListAttributeDefs(get_class($this)) as $sCode => $oDef)
{
if ($oDef->IsExternalField() && ($oDef->GetKeyAttCode() == $sAttCode))
{
$this->m_aCurrValues[$sCode] = $value->Get($oDef->GetExtAttCode());
}
}
$this->m_aCurrValues[$sAttCode.'_friendlyname'] = $value->GetName();
}
}
else
else if ($this->m_aCurrValues[$sAttCode] != $value)
{
// The object has changed, reset caches
$this->m_bCheckStatus = null;
$this->m_aAsArgs = null;
$this->m_aCurrValues[$sAttCode] = $value->GetKey();
// If the external key changed, invalidate all the external fields (and friendly name) related to this external key
$this->m_aCurrValues[$sAttCode] = $value;
foreach(MetaModel::ListAttributeDefs(get_class($this)) as $sCode => $oDef)
{
if ($oDef->IsExternalField() && ($oDef->GetKeyAttCode() == $sAttCode))
{
$this->m_aCurrValues[$sCode] = $value->Get($oDef->GetExtAttCode());
unset($this->m_aLoadedAtt[$sCode]);
$this->m_aCurrValues[$sCode] = null;
}
}
$this->m_aCurrValues[$sAttCode.'_friendlyname'] = null;
unset($this->m_aLoadedAtt[$sAttCode.'_friendlyname']);
}
// The object has changed, reset caches
$this->m_bCheckStatus = null;
$this->m_aAsArgs = null;
// Make sure we do not reload it anymore... before saving it
$this->RegisterAsDirty();
return;
}
if(!$oAttDef->IsScalar() && !is_object($value))
@@ -367,15 +390,93 @@ abstract class DBObject
}
public function Get($sAttCode)
{
if (($iPos = strpos($sAttCode, '->')) === false)
{
return $this->GetStrict($sAttCode);
}
else
{
$sExtKeyAttCode = substr($sAttCode, 0, $iPos);
$sRemoteAttCode = substr($sAttCode, $iPos + 2);
if (!MetaModel::IsValidAttCode(get_class($this), $sExtKeyAttCode))
{
throw new CoreException("Unknown external key '$sExtKeyAttCode' for the class ".get_class($this));
}
$oKeyAttDef = MetaModel::GetAttributeDef(get_class($this), $sExtKeyAttCode);
$sRemoteClass = $oKeyAttDef->GetTargetClass();
$oRemoteObj = MetaModel::GetObject($sRemoteClass, $this->GetStrict($sExtKeyAttCode), false);
if (is_null($oRemoteObj))
{
return '';
}
else
{
return $oRemoteObj->Get($sRemoteAttCode);
}
}
}
public function GetStrict($sAttCode)
{
if (!array_key_exists($sAttCode, MetaModel::ListAttributeDefs(get_class($this))))
{
throw new CoreException("Unknown attribute code '$sAttCode' for the class ".get_class($this));
}
if ($this->m_bIsInDB && !isset($this->m_aLoadedAtt[$sAttCode]) && !$this->m_bDirty)
if ($this->m_bIsInDB && !isset($this->m_aLoadedAtt[$sAttCode]))
{
// #@# non-scalar attributes.... handle that differently
$this->Reload();
if (!$this->m_bDirty)
{
$this->Reload();
}
else
{
// If the missing attribute is an external fields (or a friendlyname), try to selectively reload it
// from the value of its external key... and reload the related external fields & friendlyname as well
$sTargetClass = '';
$iCurrKey = 0;
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
if ($oAttDef->IsExternalField())
{
$sKeyAttCode = $oAttDef->GetKeyAttCode();
$iCurrKey = $this->m_aCurrValues[$oAttDef->GetKeyAttCode()];
$sTargetClass= $oAttDef->GetTargetClass();
}
else if ($oAttDef instanceof AttributeFriendlyName)
{
$sKeyAttCode = $oAttDef->GetKeyAttCode();
$oKeyAttDef = MetaModel::GetAttributeDef(get_class($this), $sKeyAttCode);
$iCurrKey = $this->m_aCurrValues[$oAttDef->GetKeyAttCode()];
$sTargetClass = $oKeyAttDef->GetTargetClass();
}
if (($sTargetClass != '') && ($iCurrKey != 0))
{
$oTargetObj = MetaModel::GetObject($sTargetClass, $iCurrKey, false);
if (is_object($oTargetObj))
{
foreach(MetaModel::ListAttributeDefs(get_class($this)) as $sCode => $oDef)
{
if ($oDef->IsExternalField() && ($oDef->GetKeyAttCode() == $sKeyAttCode))
{
$this->m_aLoadedAtt[$sCode] = true;
$this->m_aCurrValues[$sCode] = $oTargetObj->Get($oDef->GetExtAttCode());
}
}
if ($oAttDef instanceof AttributeFriendlyName)
{
$this->m_aLoadedAtt[$sAttCode] = true;
$this->m_aCurrValues[$sAttCode] = $oTargetObj->GetName();
}
else
{
$this->m_aLoadedAtt[$sKeyAttCode.'_friendlyname'] = true;
$this->m_aCurrValues[$sKeyAttCode.'_friendlyname'] = $oTargetObj->GetName();
}
}
}
}
}
$value = $this->m_aCurrValues[$sAttCode];
if ($value instanceof DBObjectSet)
@@ -460,7 +561,7 @@ abstract class DBObject
}
// That's a standard attribute (might be an ext field or a direct field, etc.)
return $oAtt->GetAsHTML($this->Get($sAttCode));
return $oAtt->GetAsHTML($this->Get($sAttCode), $this);
}
public function GetEditValue($sAttCode)
@@ -904,7 +1005,7 @@ abstract class DBObject
$oDeletionPlan->AddToDelete($oReplica, DEL_SILENT);
if ($oDataSource->GetKey() == SynchroDataSource::GetCurrentTaskId())
if ($oDataSource->GetKey() == SynchroExecution::GetCurrentTaskId())
{
// The current task has the right to delete the object
continue;
@@ -953,30 +1054,35 @@ abstract class DBObject
$aDelta = array();
foreach ($aProposal as $sAtt => $proposedValue)
{
if (!array_key_exists($sAtt, $this->m_aOrigValues))
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAtt);
// Ignore external fields and friendly names that change only as a consequence of modifying another field
if ((!$oAttDef->IsExternalField() && !($oAttDef instanceof AttributeFriendlyName)))
{
// The value was not set
$aDelta[$sAtt] = $proposedValue;
}
elseif(is_object($proposedValue))
{
$oLinkAttDef = MetaModel::GetAttributeDef(get_class($this), $sAtt);
// The value is an object, the comparison is not strict
if (!$oLinkAttDef->Equals($proposedValue, $this->m_aOrigValues[$sAtt]))
if (!array_key_exists($sAtt, $this->m_aOrigValues))
{
// The value was not set
$aDelta[$sAtt] = $proposedValue;
}
}
else
{
// The value is a scalar, the comparison must be 100% strict
if($this->m_aOrigValues[$sAtt] !== $proposedValue)
{
//echo "$sAtt:<pre>\n";
//var_dump($this->m_aOrigValues[$sAtt]);
//var_dump($proposedValue);
//echo "</pre>\n";
$aDelta[$sAtt] = $proposedValue;
elseif(is_object($proposedValue))
{
$oLinkAttDef = MetaModel::GetAttributeDef(get_class($this), $sAtt);
// The value is an object, the comparison is not strict
if (!$oLinkAttDef->Equals($proposedValue, $this->m_aOrigValues[$sAtt]))
{
$aDelta[$sAtt] = $proposedValue;
}
}
else
{
// The value is a scalar, the comparison must be 100% strict
if($this->m_aOrigValues[$sAtt] !== $proposedValue)
{
//echo "$sAtt:<pre>\n";
//var_dump($this->m_aOrigValues[$sAtt]);
//var_dump($proposedValue);
//echo "</pre>\n";
$aDelta[$sAtt] = $proposedValue;
}
}
}
}
@@ -1580,19 +1686,22 @@ abstract class DBObject
if (!$bRet) $bSuccess = false;
}
// Change state triggers...
$sClass = get_class($this);
$sClassList = implode("', '", MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL));
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateLeave AS t WHERE t.target_class IN ('$sClassList') AND t.state='$sPreviousState'"));
while ($oTrigger = $oSet->Fetch())
if ($bSuccess)
{
$oTrigger->DoActivate($this->ToArgs('this'));
}
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateEnter AS t WHERE t.target_class IN ('$sClassList') AND t.state='$sNewState'"));
while ($oTrigger = $oSet->Fetch())
{
$oTrigger->DoActivate($this->ToArgs('this'));
// Change state triggers...
$sClass = get_class($this);
$sClassList = implode("', '", MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL));
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateLeave AS t WHERE t.target_class IN ('$sClassList') AND t.state='$sPreviousState'"));
while ($oTrigger = $oSet->Fetch())
{
$oTrigger->DoActivate($this->ToArgs('this'));
}
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateEnter AS t WHERE t.target_class IN ('$sClassList') AND t.state='$sNewState'"));
while ($oTrigger = $oSet->Fetch())
{
$oTrigger->DoActivate($this->ToArgs('this'));
}
}
return $bSuccess;
@@ -1625,7 +1734,7 @@ abstract class DBObject
// #@# Note: This has been proven to be quite slow, this can slow down bulk load
$sAsHtml = $this->GetAsHtml($sAttCode);
$aScalarArgs[$sArgName.'->html('.$sAttCode.')'] = $sAsHtml;
$aScalarArgs[$sArgName.'->label('.$sAttCode.')'] = strip_tags($sAsHtml);
$aScalarArgs[$sArgName.'->label('.$sAttCode.')'] = $this->GetEditValue($sAttCode); // "Nice" display value, but without HTML tags and entities
}
// Do something for case logs... quick N' dirty...
if ($aScalarArgs[$sArgName.'->'.$sAttCode] instanceof ormCaseLog)
@@ -1831,7 +1940,7 @@ abstract class DBObject
$oSet = $this->GetMasterReplica();
while($aData = $oSet->FetchAssoc())
{
if ($aData['datasource']->GetKey() == SynchroDataSource::GetCurrentTaskId())
if ($aData['datasource']->GetKey() == SynchroExecution::GetCurrentTaskId())
{
// Ignore the current task (check to write => ok)
continue;

View File

@@ -73,7 +73,18 @@ class DBObjectSearch
public function IsDataFiltered() {return $this->m_bDataFiltered; }
public function SetDataFiltered() {$this->m_bDataFiltered = true;}
public function GetClassName($sAlias) {return $this->m_aClasses[$sAlias];}
public function GetClassName($sAlias)
{
if (array_key_exists($sAlias, $this->m_aClasses))
{
return $this->m_aClasses[$sAlias];
}
else
{
throw new CoreException("Invalid class alias '$sAlias'");
}
}
public function GetJoinedClasses() {return $this->m_aClasses;}
public function GetClass()
@@ -737,16 +748,43 @@ class DBObjectSearch
{
return $this->m_aRelatedTo;
}
public function SetInternalParams($aParams)
{
return $this->m_aParams = $aParams;
}
public function GetInternalParams()
{
return $this->m_aParams;
}
public function GetQueryParams()
{
$aParams = array();
$this->m_oSearchCondition->Render($aParams, true);
return $aParams;
}
public function ListConstantFields()
{
return $this->m_oSearchCondition->ListConstantFields();
}
public function RenderCondition()
{
return $this->m_oSearchCondition->Render($this->m_aParams, false);
}
/**
* Turn the parameters (:xxx) into scalar values in order to easily
* serialize a search
*/
public function ApplyParameters($aArgs)
{
return $this->m_oSearchCondition->ApplyParameters(array_merge($this->m_aParams, $aArgs));
}
public function serialize($bDevelopParams = false, $aContextParams = null)
{
$sOql = $this->ToOql($bDevelopParams, $aContextParams);

View File

@@ -687,6 +687,56 @@ class DBObjectSet
$this->Rewind();
return $oCommonObj;
}
/**
* List the constant fields (and their value) in the given query
* @return Hash [Alias][AttCode] => value
*/
public function ListConstantFields()
{
$aScalarArgs = $this->ExpandArgs();
$aConst = $this->m_oFilter->ListConstantFields();
foreach($aConst as $sClassAlias => $aVals)
{
foreach($aVals as $sCode => $oExpr)
{
if ($oExpr instanceof ScalarExpression)
{
$aConst[$sClassAlias][$sCode] = $oExpr->GetValue();
}
else //Variable
{
$aConst[$sClassAlias][$sCode] = $aScalarArgs[$oExpr->GetName()];
}
}
}
return $aConst;
}
protected function ExpandArgs()
{
$aScalarArgs = $this->m_oFilter->GetInternalParams();
foreach($this->m_aArgs as $sArgName => $value)
{
if (MetaModel::IsValidObject($value))
{
$aScalarArgs = array_merge($aScalarArgs, $value->ToArgs($sArgName));
}
else
{
$aScalarArgs[$sArgName] = (string) $value;
}
}
$aScalarArgs['current_contact_id'] = UserRights::GetContactId();
return $aScalarArgs;
}
public function ApplyParameters()
{
$aScalarArgs = $this->ExpandArgs();
$this->m_oFilter->ApplyParameters($aScalarArgs);
}
}
/**

View File

@@ -97,7 +97,7 @@ class Dict
}
public static function GetCurrentLanguage()
public static function GetUserLanguage()
{
if (self::$m_sCurrentLanguage == null) // May happen when no user is logged in (i.e login screen, non authentifed page)
{
@@ -124,12 +124,12 @@ class Dict
{
// Attempt to find the string in the user language
//
if (!array_key_exists(self::GetCurrentLanguage(), self::$m_aData))
if (!array_key_exists(self::GetUserLanguage(), self::$m_aData))
{
// It may happen, when something happens before the dictionnaries get loaded
return $sStringCode;
}
$aCurrentDictionary = self::$m_aData[self::GetCurrentLanguage()];
$aCurrentDictionary = self::$m_aData[self::GetUserLanguage()];
if (array_key_exists($sStringCode, $aCurrentDictionary))
{
return $aCurrentDictionary[$sStringCode];

View File

@@ -35,6 +35,7 @@ class EMail
protected $m_sSubject;
protected $m_sTo;
protected $m_aHeaders; // array of key=>value
protected $m_aAttachments;
public function __construct($sTo = '', $sSubject = '', $sBody = '', $aHeaders = array())
{
@@ -42,6 +43,7 @@ class EMail
$this->m_sSubject = $sSubject;
$this->m_sBody = $sBody;
$this->m_aHeaders = $aHeaders;
$this->m_aAttachments = array();
}
// Errors management : not that simple because we need that function to be
@@ -73,8 +75,14 @@ class EMail
{
$sHeaders = 'MIME-Version: 1.0' . "\r\n";
// ! the case is important for MS-Outlook
$sHeaders .= 'Content-Type: text/html; charset=UTF-8' . "\r\n";
$sHeaders .= 'Content-Transfer-Encoding: 8bit' . "\r\n";
if (!array_key_exists('Content-Type', $this->m_aHeaders))
{
$sHeaders .= 'Content-Type: text/html; charset=UTF-8' . "\r\n";
}
if (!array_key_exists('Content-Transfer-Encoding', $this->m_aHeaders))
{
$sHeaders .= 'Content-Transfer-Encoding: 8bit' . "\r\n";
}
foreach ($this->m_aHeaders as $sKey => $sValue)
{
$sHeaders .= "$sKey: $sValue\r\n";
@@ -87,7 +95,7 @@ class EMail
$bRes = mail
(
str_replace(array("\n", "\r"), ' ', $this->m_sTo), // Prevent header injection
str_replace(array("\n", "\r"), ' ', $this->m_sSubject), // Prevent header injection
$this->EncodeHeaderField($this->m_sSubject), // Prevent header injection & MIME Encode charsets
$this->m_sBody,
$sHeaders
);
@@ -110,6 +118,7 @@ class EMail
public function Send(&$aIssues, $bForceSynchronous = false, $oLog = null)
{
$this->BuildMessage(); // assemble the attachments into the header/body structure
if ($bForceSynchronous)
{
return $this->SendSynchronous($aIssues, $oLog);
@@ -135,6 +144,11 @@ class EMail
$this->m_aHeaders[$sKey] = $sValue;
}
}
public function SetMessageId($sId)
{
$this->AddToHeader('Message-ID', $sId);
}
public function SetReferences($sReferences)
{
@@ -181,6 +195,48 @@ class EMail
$this->AddToHeader('Reply-To', $sAddress);
}
public function AddAttachment($data, $sFileName, $sMimeType)
{
$this->m_aAttachments[] = array('data' => $data, 'filename' => $sFileName, 'mimeType' => $sMimeType);
}
/**
* Takes care of the attachments (if any) to build the header/body of the message before storing or sending it
*/
protected function BuildMessage()
{
if (count($this->m_aAttachments) == 0) return; // Nothing to do if there are no attachments
$sDelimiter = '== iTopEmailPart---'.md5(date('r', time()))." ==";
$sContentType = isset($this->m_aHeaders['Content-Type']) ? $this->m_aHeaders['Content-Type'] : 'text/html; charset="UTF-8"';
$sContentHeader = "Content-Type: $sContentType\r\n";
$this->m_aHeaders['Content-Type'] = "multipart/mixed; boundary=\"{$sDelimiter}\"";
$aAttachments = array();
foreach($this->m_aAttachments as $aAttach)
{
$sAttachmentHeader = "Content-Type: {$aAttach['mimeType']};\r\n Name=\"{$aAttach['filename']}\"\r\n";
$sAttachmentHeader .= "Content-Transfer-Encoding: base64\r\nContent-Disposition: attachment;\r\n filename=\"{$aAttach['filename']}\"\r\n";
$sAttachmentHeader .= "\r\n";
$sAttachment = chunk_split(base64_encode($aAttach['data']));
$aAttachments[] = $sAttachmentHeader.$sAttachment."\r\n";
}
$this->m_sBody = "This is a multi-part message in MIME format.\r\n--".$sDelimiter."\r\n".$sContentHeader."\r\n".$this->m_sBody."\r\n--".$sDelimiter."\r\n";
$this->m_sBody .= implode("--".$sDelimiter."\r\n", $aAttachments);
$this->m_sBody .= "--".$sDelimiter."--";
}
/**
* MIME encode the content of a header field according to RFC2047
* @param string $sFieldContent the content of the header to encode
* @return string The encoded string
*/
protected function EncodeHeaderField($sFieldContent)
{
$sTemp = str_replace(array("\n", "\r"), ' ', $sFieldContent);
$sTemp = iconv_mime_encode('Tagada', $sTemp, array('scheme' => 'Q', 'input-charset' => 'UTF-8', 'output-charset' => 'UTF-8'));
return preg_replace('/^Tagada: /', '', $sTemp);
}
}
?>

View File

@@ -103,7 +103,7 @@ class Event extends DBObject implements iDisplay
$this->DisplayBareProperties($oPage, $bEditMode);
}
function DisplayBareProperties(WebPage $oPage, $bEditMode = false, $aExtraParams = array())
function DisplayBareProperties(WebPage $oPage, $bEditMode = false, $sPrefix = '', $aExtraParams = array())
{
if ($bEditMode) return; // Not editable
@@ -174,7 +174,7 @@ class EventNotificationEmail extends EventNotification
MetaModel::Init_AddAttribute(new AttributeText("bcc", array("allowed_values"=>null, "sql"=>"bcc", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("from", array("allowed_values"=>null, "sql"=>"from", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("subject", array("allowed_values"=>null, "sql"=>"subject", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("body", array("allowed_values"=>null, "sql"=>"body", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeHTML("body", array("allowed_values"=>null, "sql"=>"body", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
// Display lists
MetaModel::Init_SetZListItems('details', array('date', 'userinfo', 'message', 'trigger_id', 'action_id', 'object_id', 'to', 'cc', 'bcc', 'from', 'subject', 'body')); // Attributes to be displayed for the complete details

View File

@@ -36,11 +36,16 @@ abstract class Expression
// recursive rendering (aArgs used as input by default, or used as output if bRetrofitParams set to True
abstract public function Render(&$aArgs = null, $bRetrofitParams = false);
abstract public function ApplyParameters($aArgs);
// recursively builds an array of class => fieldname
abstract public function ListRequiredFields();
abstract public function IsTrue();
// recursively builds an array of [classAlias][fieldName] => value
abstract public function ListConstantFields();
public function RequiresField($sClass, $sFieldName)
{
// #@# todo - optimize : this is called quite often when building a single query !
@@ -108,6 +113,10 @@ class SQLExpression extends Expression
return $this->m_sSQL;
}
public function ApplyParameters($aArgs)
{
}
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
}
@@ -122,6 +131,11 @@ class SQLExpression extends Expression
return array();
}
public function ListConstantFields()
{
return array();
}
public function RenameParam($sOldName, $sNewName)
{
// Do nothing, since there is nothing to rename
@@ -164,11 +178,11 @@ class BinaryExpression extends Expression
// return true if we are certain that it will be true
if ($this->m_sOperator == 'AND')
{
if ($this->m_oLeftExpr->IsTrue() && $this->m_oLeftExpr->IsTrue()) return true;
if ($this->m_oLeftExpr->IsTrue() && $this->m_oRightExpr->IsTrue()) return true;
}
return false;
}
public function GetLeftExpr()
{
return $this->m_oLeftExpr;
@@ -192,7 +206,27 @@ class BinaryExpression extends Expression
$sRight = $this->GetRightExpr()->Render($aArgs, $bRetrofitParams);
return "($sLeft $sOperator $sRight)";
}
public function ApplyParameters($aArgs)
{
if ($this->m_oLeftExpr instanceof VariableExpression)
{
$this->m_oLeftExpr = $this->m_oLeftExpr->GetAsScalar($aArgs);
}
else //if ($this->m_oLeftExpr instanceof Expression)
{
$this->m_oLeftExpr->ApplyParameters($aArgs);
}
if ($this->m_oRightExpr instanceof VariableExpression)
{
$this->m_oRightExpr = $this->m_oRightExpr->GetAsScalar($aArgs);
}
else //if ($this->m_oRightExpr instanceof Expression)
{
$this->m_oRightExpr->ApplyParameters($aArgs);
}
}
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
$this->GetLeftExpr()->GetUnresolvedFields($sAlias, $aUnresolved);
@@ -213,6 +247,44 @@ class BinaryExpression extends Expression
return array_merge($aLeft, $aRight);
}
/**
* List all constant expression of the form <field> = <scalar> or <field> = :<variable>
* Could be extended to support <field> = <function><constant_expression>
*/
public function ListConstantFields()
{
$aResult = array();
if ($this->m_sOperator == '=')
{
if (($this->m_oLeftExpr instanceof FieldExpression) && ($this->m_oRightExpr instanceof ScalarExpression))
{
$aResult[$this->m_oLeftExpr->GetParent()][$this->m_oLeftExpr->GetName()] = $this->m_oRightExpr;
}
else if (($this->m_oRightExpr instanceof FieldExpression) && ($this->m_oLeftExpr instanceof ScalarExpression))
{
$aResult[$this->m_oRightExpr->GetParent()][$this->m_oRightExpr->GetName()] = $this->m_oLeftExpr;
}
else if (($this->m_oLeftExpr instanceof FieldExpression) && ($this->m_oRightExpr instanceof VariableExpression))
{
$aResult[$this->m_oLeftExpr->GetParent()][$this->m_oLeftExpr->GetName()] = $this->m_oRightExpr;
}
else if (($this->m_oRightExpr instanceof FieldExpression) && ($this->m_oLeftExpr instanceof VariableExpression))
{
$aResult[$this->m_oRightExpr->GetParent()][$this->m_oRightExpr->GetName()] = $this->m_oLeftExpr;
}
else
{
$aResult = array_merge($this->m_oRightExpr->ListConstantFields(), $this->m_oLeftExpr->ListConstantFields()) ;
}
}
else
{
$aResult = array_merge($this->m_oRightExpr->ListConstantFields(), $this->m_oLeftExpr->ListConstantFields()) ;
}
return $aResult;
}
public function RenameParam($sOldName, $sNewName)
{
$this->GetLeftExpr()->RenameParam($sOldName, $sNewName);
@@ -244,18 +316,13 @@ class UnaryExpression extends Expression
// recursive rendering
public function Render(&$aArgs = null, $bRetrofitParams = false)
{
if ($bRetrofitParams)
{
$iParamIndex = count($aArgs) + 1; // 1-based indexation
$aArgs['param'.$iParamIndex] = $this->m_value;
return ':param'.$iParamIndex;
}
else
{
return CMDBSource::Quote($this->m_value);
}
return CMDBSource::Quote($this->m_value);
}
public function ApplyParameters($aArgs)
{
}
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
}
@@ -269,6 +336,11 @@ class UnaryExpression extends Expression
{
return array();
}
public function ListConstantFields()
{
return array();
}
public function RenameParam($sOldName, $sNewName)
{
@@ -440,7 +512,7 @@ class VariableExpression extends UnaryExpression
}
elseif ($bRetrofitParams)
{
//$aArgs[$this->m_sName] = null;
$aArgs[$this->m_sName] = null;
return ':'.$this->m_sName;
}
else
@@ -456,6 +528,20 @@ class VariableExpression extends UnaryExpression
$this->m_sName = $sNewName;
}
}
public function GetAsScalar($aArgs)
{
$value = '';
if (array_key_exists($this->m_sName, $aArgs))
{
$value = $aArgs[$this->m_sName];
}
else
{
throw new MissingQueryArgument('Missing query argument', array('expecting'=>$this->m_sName, 'available'=>array_keys($aArgs)));
}
return new ScalarExpression($value);
}
}
// Temporary, until we implement functions and expression casting!
@@ -501,6 +587,22 @@ class ListExpression extends Expression
return '('.implode(', ', $aRes).')';
}
public function ApplyParameters($aArgs)
{
$aRes = array();
foreach ($this->m_aExpressions as $idx => $oExpr)
{
if ($oExpr instanceof VariableExpression)
{
$this->m_aExpressions[$idx] = $oExpr->GetAsScalar();
}
else
{
$oExpr->ApplyParameters($aArgs);
}
}
}
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
foreach ($this->m_aExpressions as $oExpr)
@@ -529,6 +631,16 @@ class ListExpression extends Expression
return $aRes;
}
public function ListConstantFields()
{
$aRes = array();
foreach ($this->m_aExpressions as $oExpr)
{
$aRes = array_merge($aRes, $oExpr->ListConstantFields());
}
return $aRes;
}
public function RenameParam($sOldName, $sNewName)
{
$aRes = array();
@@ -578,6 +690,22 @@ class FunctionExpression extends Expression
return $this->m_sVerb.'('.implode(', ', $aRes).')';
}
public function ApplyParameters($aArgs)
{
$aRes = array();
foreach ($this->m_aArgs as $idx => $oExpr)
{
if ($oExpr instanceof VariableExpression)
{
$this->m_aArgs[$idx] = $oExpr->GetAsScalar($aArgs);
}
else
{
$oExpr->ApplyParameters($aArgs);
}
}
}
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
foreach ($this->m_aArgs as $oExpr)
@@ -606,6 +734,16 @@ class FunctionExpression extends Expression
return $aRes;
}
public function ListConstantFields()
{
$aRes = array();
foreach ($this->m_aArgs as $oExpr)
{
$aRes = array_merge($aRes, $oExpr->ListConstantFields());
}
return $aRes;
}
public function RenameParam($sOldName, $sNewName)
{
foreach ($this->m_aArgs as $key => $oExpr)
@@ -648,6 +786,18 @@ class IntervalExpression extends Expression
return 'INTERVAL '.$this->m_oValue->Render($aArgs, $bRetrofitParams).' '.$this->m_sUnit;
}
public function ApplyParameters($aArgs)
{
if ($this->m_oValue instanceof VariableExpression)
{
$this->m_oValue = $this->m_oValue->GetAsScalar($aArgs);
}
else
{
$this->m_oValue->ApplyParameters($aArgs);
}
}
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
$this->m_oValue->GetUnresolvedFields($sAlias, $aUnresolved);
@@ -662,6 +812,11 @@ class IntervalExpression extends Expression
{
return array();
}
public function ListConstantFields()
{
return array();
}
public function RenameParam($sOldName, $sNewName)
{
@@ -702,6 +857,22 @@ class CharConcatExpression extends Expression
return "CAST(CONCAT(".implode(', ', $aRes).") AS CHAR)";
}
public function ApplyParameters($aArgs)
{
$aRes = array();
foreach ($this->m_aExpressions as $idx => $oExpr)
{
if ($oExpr instanceof VariableExpression)
{
$this->m_aExpressions[$idx] = $oExpr->GetAsScalar();
}
else
{
$this->m_aExpressions->ApplyParameters($aArgs);
}
}
}
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
foreach ($this->m_aExpressions as $oExpr)
@@ -730,6 +901,16 @@ class CharConcatExpression extends Expression
return $aRes;
}
public function ListConstantFields()
{
$aRes = array();
foreach ($this->m_aExpressions as $oExpr)
{
$aRes = array_merge($aRes, $oExpr->ListConstantFields());
}
return $aRes;
}
public function RenameParam($sOldName, $sNewName)
{
foreach ($this->m_aExpressions as $key => $oExpr)

View File

@@ -191,6 +191,16 @@ class ExecutionKPI
return $output[1] * 1024;
}
}
static public function memory_get_peak_usage($bRealUsage = false)
{
if (function_exists('memory_get_peak_usage'))
{
return memory_get_peak_usage($bRealUsage);
}
// PHP > 5.2.1 - this verb depends on a compilation option
return 0;
}
}
class ApplicationStartupKPI extends ExecutionKPI

View File

@@ -676,10 +676,38 @@ abstract class MetaModel
if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass])) return false;
return (self::$m_aAttribDefs[$sClass][$sAttCode]->IsExternalKey());
}
final static public function IsValidAttCode($sClass, $sAttCode)
final static public function IsValidAttCode($sClass, $sAttCode, $bExtended = false)
{
if (!array_key_exists($sClass, self::$m_aAttribDefs)) return false;
return (array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]));
if ($bExtended)
{
if (($iPos = strpos($sAttCode, '->')) === false)
{
$bRes = array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]);
}
else
{
$sExtKeyAttCode = substr($sAttCode, 0, $iPos);
$sRemoteAttCode = substr($sAttCode, $iPos + 2);
if (MetaModel::IsValidAttCode($sClass, $sExtKeyAttCode))
{
$oKeyAttDef = MetaModel::GetAttributeDef($sClass, $sExtKeyAttCode);
$sRemoteClass = $oKeyAttDef->GetTargetClass();
$bRes = MetaModel::IsValidAttCode($sRemoteClass, $sRemoteAttCode, true);
}
else
{
$bRes = false;
}
}
}
else
{
$bRes = array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]);
}
return $bRes;
}
final static public function IsAttributeOrigin($sClass, $sAttCode)
{
@@ -1971,7 +1999,10 @@ if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]))
$aOrderSpec = array();
foreach ($aOrderBy as $sFieldAlias => $bAscending)
{
MyHelpers::CheckValueInArray('field name in ORDER BY spec', $sFieldAlias, self::GetAttributesList($oFilter->GetFirstJoinedClass()));
if ($sFieldAlias != 'id')
{
MyHelpers::CheckValueInArray('field name in ORDER BY spec', $sFieldAlias, self::GetAttributesList($oFilter->GetFirstJoinedClass()));
}
if (!is_bool($bAscending))
{
throw new CoreException("Wrong direction in ORDER BY spec, found '$bAscending' and expecting a boolean value");
@@ -3044,7 +3075,36 @@ if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]))
}
}
}
}
// Check unicity of the SQL columns
//
if (self::HasTable($sClass))
{
$aTableColumns = array(); // array of column => attcode (the column is used by this attribute)
$aTableColumns[self::DBGetKey($sClass)] = 'id';
// Check that SQL columns are declared only once
//
foreach(self::ListAttributeDefs($sClass) as $sAttCode=>$oAttDef)
{
// Skip this attribute if not originaly defined in this class
if (self::$m_aAttribOrigins[$sClass][$sAttCode] != $sClass) continue;
foreach($oAttDef->GetSQLColumns() as $sField => $sDBFieldType)
{
if (array_key_exists($sField, $aTableColumns))
{
$aErrors[$sClass][] = "Column '$sField' declared for attribute $sAttCode, but already used for attribute ".$aTableColumns[$sField];
$aSugFix[$sClass][] = "Please find another name for the SQL column";
}
else
{
$aTableColumns[$sField] = $sAttCode;
}
}
}
}
} // foreach class
if (count($aErrors) > 0)
{
@@ -4268,7 +4328,15 @@ if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]))
public static function MakeSingleRow($sClass, $iKey, $bMustBeFound = true, $bAllowAllData = false)
{
if (!array_key_exists($sClass, self::$aQueryCacheGetObject))
// Build the query cache signature
//
$sQuerySign = $sClass;
if($bAllowAllData)
{
$sQuerySign .= '_all_';
}
if (!array_key_exists($sQuerySign, self::$aQueryCacheGetObject))
{
// NOTE: Quick and VERY dirty caching mechanism which relies on
// the fact that the string '987654321' will never appear in the
@@ -4283,13 +4351,13 @@ if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]))
}
$sSQL = self::MakeSelectQuery($oFilter);
self::$aQueryCacheGetObject[$sClass] = $sSQL;
self::$aQueryCacheGetObjectHits[$sClass] = 0;
self::$aQueryCacheGetObject[$sQuerySign] = $sSQL;
self::$aQueryCacheGetObjectHits[$sQuerySign] = 0;
}
else
{
$sSQL = self::$aQueryCacheGetObject[$sClass];
self::$aQueryCacheGetObjectHits[$sClass] += 1;
$sSQL = self::$aQueryCacheGetObject[$sQuerySign];
self::$aQueryCacheGetObjectHits[$sQuerySign] += 1;
// echo " -load $sClass/$iKey- ".self::$aQueryCacheGetObjectHits[$sClass]."<br/>\n";
}
$sSQL = str_replace(CMDBSource::Quote(987654321), CMDBSource::Quote($iKey), $sSQL);
@@ -4569,6 +4637,9 @@ if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]))
*/
static public function ApplyParams($aInput, $aParams)
{
$aParams['APP_URL'] = utils::GetAbsoluteUrlAppRoot();
$aParams['MODULES_URL'] = utils::GetAbsoluteUrlModulesRoot();
$aSearches = array();
$aReplacements = array();
foreach($aParams as $sSearch => $replace)

View File

@@ -168,7 +168,7 @@ class OQLLexerRaw
'/\GABOVE STRICT/ ',
'/\GNOT ABOVE/ ',
'/\GNOT ABOVE STRICT/ ',
'/\G[0-9]+|0x[0-9a-fA-F]+/ ',
'/\G(0x[0-9a-fA-F]+|[0-9]+)/ ',
'/\G\"([^\\\\\"]|\\\\\"|\\\\\\\\)*\"|'.chr(94).chr(39).'([^\\\\'.chr(39).']|\\\\'.chr(39).'|\\\\\\\\)*'.chr(39).'/ ',
'/\G([_a-zA-Z][_a-zA-Z0-9]*|`[^`]+`)/ ',
'/\G:([_a-zA-Z][_a-zA-Z0-9]*->[_a-zA-Z][_a-zA-Z0-9]*|[_a-zA-Z][_a-zA-Z0-9]*)/ ',

View File

@@ -140,7 +140,23 @@ above = "ABOVE"
above_strict = "ABOVE STRICT"
not_above = "NOT ABOVE"
not_above_strict = "NOT ABOVE STRICT"
numval = /[0-9]+|0x[0-9a-fA-F]+/
//
// WARNING: there seems to be a bug in the Lexer about matching the longest pattern
// when there are alternates in the regexp.
//
// For instance:
// numval = /[0-9]+|0x[0-9a-fA-F]+/
// Does not work: SELECT Toto WHERE name = 'Text0xCTest' => Fails because 0xC is recongnized as a numval (inside the string) instead of a strval !!
//
// Inserting a ^ after the alternate (see comment at the top of this file) does not work either
// numval = /[0-9]+|'.chr(94).'0x[0-9a-fA-F]+/
// SELECT Toto WHERE name = 'Text0xCTest' => works but
// SELECT Toto WHERE id = 0xC => does not work, 'xC' is found as a name (apparently 0 is recognized as a numval and the remaining is a name !)
//
// numval = /([0-9]+|0x[0-9a-fA-F]+)/
// Does not work either, the hexadecimal numbers are not matched properly
// The following seems to work...
numval = /(0x[0-9a-fA-F]+|[0-9]+)/
strval = /"([^\\"]|\\"|\\\\)*"|'.chr(94).chr(39).'([^\\'.chr(39).']|\\'.chr(39).'|\\\\)*'.chr(39).'/
name = /([_a-zA-Z][_a-zA-Z0-9]*|`[^`]+`)/
varname = /:([_a-zA-Z][_a-zA-Z0-9]*->[_a-zA-Z][_a-zA-Z0-9]*|[_a-zA-Z][_a-zA-Z0-9]*)/

View File

@@ -153,16 +153,25 @@ class ormCaseLog {
* Add a new entry to the log and updates the internal index
* @param $sText string The text of the new entry
*/
public function AddLogEntry($sText)
public function AddLogEntry($sText, $sOnBehalfOf = '')
{
$sDate = date(Dict::S('UI:CaseLog:DateFormat'));
$sSeparator = sprintf(CASELOG_SEPARATOR, $sDate, UserRights::GetUserFriendlyName(), UserRights::GetUserId());
if ($sOnBehalfOf == '')
{
$sOnBehalfOf = UserRights::GetUserFriendlyName();
$iUserId = UserRights::GetUserId();
}
else
{
$iUserId = null;
}
$sSeparator = sprintf(CASELOG_SEPARATOR, $sDate, $sOnBehalfOf, $iUserId);
$iSepLength = strlen($sSeparator);
$iTextlength = strlen($sText);
$this->m_sLog = $sSeparator.$sText.$this->m_sLog; // Latest entry printed first
$this->m_aIndex[] = array(
'user_name' => UserRights::GetUserFriendlyName(),
'user_id' => UserRights::GetUserId(),
'user_name' => $sOnBehalfOf,
'user_id' => $iUserId,
'date' => time(),
'text_length' => $iTextlength,
'separator_length' => $iSepLength,

View File

@@ -0,0 +1,177 @@
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* Simple helper class to interpret and transform a template string
*
* Usage:
* $oString = new TemplateString("Blah $this->friendlyname$ is in location $this->location_id->name$ ('$this->location_id->org_id->name$)");
* echo $oString->Render(array('this' => $oContact));
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
/**
* Helper class
*/
class TemplateStringPlaceholder
{
public $sToken;
public $sAttCode;
public $sFunction;
public $sParamName;
public $bIsValid;
public function __construct($sToken)
{
$this->sToken = $sToken;
$this->sAttcode = '';
$this->sFunction = '';
$this->sParamName = '';
$this->bIsValid = false; // Validity may be false in general, but it can work anyway (thanks to specialization) when rendering
}
}
/**
* Class TemplateString
*/
class TemplateString
{
protected $m_sRaw;
protected $m_aPlaceholders;
public function __construct($sRaw)
{
$this->m_sRaw = $sRaw;
$this->m_aPlaceholders = null;
}
/**
* Split the string into placholders
* @param Hash $aParamTypes Class of the expected parameters: hash array of '<param_id>' => '<class_name>'
* @return void
*/
protected function Analyze($aParamTypes = array())
{
if (!is_null($this->m_aPlaceholders)) return;
$this->m_aPlaceholders = array();
if (preg_match_all('/\\$([a-z0-9_]+(->[a-z0-9_]+)*)\\$/', $this->m_sRaw, $aMatches))
{
foreach($aMatches[1] as $sPlaceholder)
{
$oPlaceholder = new TemplateStringPlaceholder($sPlaceholder);
$oPlaceholder->bIsValid = false;
foreach ($aParamTypes as $sParamName => $sClass)
{
$sParamPrefix = $sParamName.'->';
if (substr($sPlaceholder, 0, strlen($sParamPrefix)) == $sParamPrefix)
{
// Todo - detect functions (label...)
$oPlaceholder->sFunction = '';
$oPlaceholder->sParamName = $sParamName;
$sAttcode = substr($sPlaceholder, strlen($sParamPrefix));
$oPlaceholder->sAttcode = $sAttcode;
$oPlaceholder->bIsValid = MetaModel::IsValidAttCode($sClass, $sAttcode, true /* extended */);
}
}
$this->m_aPlaceholders[] = $oPlaceholder;
}
}
}
/**
* Return the placeholders (for reporting purposes)
* @return void
*/
public function GetPlaceholders()
{
return $this->m_aPlaceholders;
}
/**
* Check the format when possible
* @param Hash $aParamTypes Class of the expected parameters: hash array of '<param_id>' => '<class_name>'
* @return void
*/
public function IsValid($aParamTypes = array())
{
$this->Analyze($aParamTypes);
foreach($this->m_aPlaceholders as $oPlaceholder)
{
if (!$oPlaceholder->bIsValid)
{
if (count($aParamTypes) == 0)
{
return false;
}
if (array_key_exists($oPlaceholder->sParamName, $aParamTypes))
{
return false;
}
}
}
return true;
}
/**
* Apply the given parameters to replace the placeholders
* @param Hash $aParamValues Value of the expected parameters: hash array of '<param_id>' => '<value>'
* @return void
*/
public function Render($aParamValues = array())
{
$aParamTypes = array();
foreach($aParamValues as $sParamName => $value)
{
$aParamTypes[$sParamName] = get_class($value);
}
$this->Analyze($aParamTypes);
$aSearch = array();
$aReplace = array();
foreach($this->m_aPlaceholders as $oPlaceholder)
{
if (array_key_exists($oPlaceholder->sParamName, $aParamValues))
{
$oRef = $aParamValues[$oPlaceholder->sParamName];
try
{
$value = $oRef->Get($oPlaceholder->sAttcode);
$aSearch[] = '$'.$oPlaceholder->sToken.'$';
$aReplace[] = $value;
$oPlaceholder->bIsValid = true;
}
catch(Exception $e)
{
$oPlaceholder->bIsValid = false;
}
}
else
{
$oPlaceholder->bIsValid = false;
}
}
return str_replace($aSearch, $aReplace, $this->m_sRaw);
}
}
?>

View File

@@ -41,7 +41,7 @@ abstract class Trigger extends cmdbAbstractObject
"key_type" => "autoincrement",
"name_attcode" => "description",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('description'),
"db_table" => "priv_trigger",
"db_key_field" => "id",
"db_finalclass_field" => "realclass",
@@ -87,7 +87,7 @@ abstract class TriggerOnObject extends Trigger
"key_type" => "autoincrement",
"name_attcode" => "description",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('description'),
"db_table" => "priv_trigger_onobject",
"db_key_field" => "id",
"db_finalclass_field" => "",
@@ -118,7 +118,7 @@ class TriggerOnPortalUpdate extends TriggerOnObject
"key_type" => "autoincrement",
"name_attcode" => "description",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('description'),
"db_table" => "priv_trigger_onportalupdate",
"db_key_field" => "id",
"db_finalclass_field" => "",
@@ -144,7 +144,7 @@ abstract class TriggerOnStateChange extends TriggerOnObject
"key_type" => "autoincrement",
"name_attcode" => "description",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('description'),
"db_table" => "priv_trigger_onstatechange",
"db_key_field" => "id",
"db_finalclass_field" => "",
@@ -173,7 +173,7 @@ class TriggerOnStateEnter extends TriggerOnStateChange
"key_type" => "autoincrement",
"name_attcode" => "description",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('description'),
"db_table" => "priv_trigger_onstateenter",
"db_key_field" => "id",
"db_finalclass_field" => "",
@@ -201,7 +201,7 @@ class TriggerOnStateLeave extends TriggerOnStateChange
"key_type" => "autoincrement",
"name_attcode" => "description",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('description'),
"db_table" => "priv_trigger_onstateleave",
"db_key_field" => "id",
"db_finalclass_field" => "",
@@ -229,7 +229,7 @@ class TriggerOnObjectCreate extends TriggerOnObject
"key_type" => "autoincrement",
"name_attcode" => "description",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('description'),
"db_table" => "priv_trigger_onobjcreate",
"db_key_field" => "id",
"db_finalclass_field" => "",
@@ -257,7 +257,7 @@ class lnkTriggerAction extends cmdbAbstractObject
"key_type" => "autoincrement",
"name_attcode" => "",
"state_attcode" => "",
"reconc_keys" => array(""),
"reconc_keys" => array('action_id', 'trigger_id'),
"db_table" => "priv_link_action_trigger",
"db_key_field" => "link_id",
"db_finalclass_field" => "",

View File

@@ -295,6 +295,35 @@ abstract class UserInternal extends User
}
}
/**
* Self register extension
*
* @package iTopORM
*/
interface iSelfRegister
{
/**
* Called when no user is found in iTop for the corresponding 'name'. This method
* can create/synchronize the User in iTop with an external source (such as AD/LDAP) on the fly
* @param string $sName The typed-in user name
* @param string $sPassword The typed-in password
* @param string $sLoginMode The login method used (cas|form|basic|url)
* @param string $sAuthentication The authentication method used (any|internal|external)
* @return bool true if the user is a valid one, false otherwise
*/
public static function CheckCredentialsAndCreateUser($sName, $sPassword, $sLoginMode, $sAuthentication);
/**
* Called after the user has been authenticated and found in iTop. This method can
* Update the user's definition on the fly (profiles...) to keep it in sync with an external source
* @param User $oUser The user to update/synchronize
* @param string $sLoginMode The login mode used (cas|form|basic|url)
* @param string $sAuthentication The authentication method used
* @return void
*/
public static function UpdateUser(User $oUser, $sLoginMode, $sAuthentication);
}
/**
* User management core API
*
@@ -305,6 +334,7 @@ class UserRights
protected static $m_oAddOn;
protected static $m_oUser;
protected static $m_oRealUser;
protected static $m_sSelfRegisterAddOn = null;
public static function SelectModule($sModuleName)
{
@@ -324,6 +354,15 @@ class UserRights
self::$m_oRealUser = null;
}
public static function SelectSelfRegister($sModuleName)
{
if (!class_exists($sModuleName))
{
throw new CoreException("Could not select the class, '$sModuleName' for self register, is not a valid class name");
}
self::$m_sSelfRegisterAddOn = $sModuleName;
}
public static function GetModuleInstance()
{
return self::$m_oAddOn;
@@ -361,21 +400,38 @@ class UserRights
return true;
}
public static function CheckCredentials($sName, $sPassword, $sAuthentication = 'any')
public static function CheckCredentials($sName, $sPassword, $sLoginMode = 'form', $sAuthentication = 'any')
{
$oUser = self::FindUser($sName, $sAuthentication);
if (is_null($oUser))
{
return false;
return self::CheckCredentialsAndCreateUser($sName, $sPassword, $sLoginMode, $sAuthentication);
}
if (!$oUser->CheckCredentials($sPassword))
{
return false;
}
self::UpdateUser($oUser, $sLoginMode, $sAuthentication);
return true;
}
public static function CheckCredentialsAndCreateUser($sName, $sPassword, $sLoginMode, $sAuthentication)
{
if (self::$m_sSelfRegisterAddOn != null)
{
return call_user_func(array(self::$m_sSelfRegisterAddOn, 'CheckCredentialsAndCreateUser'), $sName, $sPassword, $sLoginMode, $sAuthentication);
}
}
public static function UpdateUser($oUser, $sLoginMode, $sAuthentication)
{
if (self::$m_sSelfRegisterAddOn != null)
{
call_user_func(array(self::$m_sSelfRegisterAddOn, 'UpdateUser'), $oUser, $sLoginMode, $sAuthentication);
}
}
public static function TrustWebServerContext()
{
if (!is_null(self::$m_oUser))
@@ -625,10 +681,6 @@ class UserRights
if (MetaModel::HasCategory($sClass, 'bizmodel'))
{
// #@# Temporary?????
// The read access is controlled in MetaModel::MakeSelectQuery()
if ($iActionCode == UR_ACTION_READ) return true;
if (is_null($oUser))
{
$oUser = self::$m_oUser;
@@ -969,4 +1021,339 @@ class StimulusChecker extends ActionChecker
return $this->iState;
}
}
/**
* Self-register extension to allow the automatic creation & update of CAS users
*
* @package iTopORM
*
*/
class CAS_SelfRegister implements iSelfRegister
{
/**
* Called when no user is found in iTop for the corresponding 'name'. This method
* can create/synchronize the User in iTop with an external source (such as AD/LDAP) on the fly
* @param string $sName The CAS authenticated user name
* @param string $sPassword Ignored
* @param string $sLoginMode The login mode used (cas|form|basic|url)
* @param string $sAuthentication The authentication method used
* @return bool true if the user is a valid one, false otherwise
*/
public static function CheckCredentialsAndCreateUser($sName, $sPassword, $sLoginMode, $sAuthentication)
{
$bOk = true;
if ($sLoginMode != 'cas') return false; // Must be authenticated via CAS
$sCASMemberships = MetaModel::GetConfig()->Get('cas_memberof');
$bFound = false;
if (!empty($sCASMemberships))
{
if (phpCAS::hasAttribute('memberOf'))
{
// A list of groups is specified, the user must a be member of (at least) one of them to pass
$aCASMemberships = array();
$aTmp = explode(';', $sCASMemberships);
setlocale(LC_ALL, "en_US.utf8"); // !!! WARNING: this is needed to have the iconv //TRANSLIT working fine below !!!
foreach($aTmp as $sGroupName)
{
$aCASMemberships[] = trim(iconv('UTF-8', 'ASCII//TRANSLIT', $sGroupName)); // Just in case remove accents and spaces...
}
$aMemberOf = phpCAS::getAttribute('memberOf');
if (!is_array($aMemberOf)) $aMemberOf = array($aMemberOf); // Just one entry, turn it into an array
$aFilteredGroupNames = array();
foreach($aMemberOf as $sGroupName)
{
phpCAS::log("Info: user if a member of the group: ".$sGroupName);
$sGroupName = trim(iconv('UTF-8', 'ASCII//TRANSLIT', $sGroupName)); // Remove accents and spaces as well
$aFilteredGroupNames[] = $sGroupName;
$bIsMember = false;
foreach($aCASMemberships as $sCASPattern)
{
if (self::IsPattern($sCASPattern))
{
if (preg_match($sCASPattern, $sGroupName))
{
$bIsMember = true;
break;
}
}
else if ($sPattern == $sGroupName)
{
$bIsMember = true;
break;
}
}
if ($bIsMember)
{
$bCASUserSynchro = MetaModel::GetConfig()->Get('cas_user_synchro');
if ($bCASUserSynchro)
{
// If needed create a new user for this email/profile
phpCAS::log('Info: cas_user_synchro is ON');
$bOk = self::CreateCASUser(phpCAS::getUser(), $aMemberOf);
if($bOk)
{
$bFound = true;
}
else
{
phpCAS::log("User ".phpCAS::getUser()." cannot be created in iTop. Logging off...");
}
}
else
{
phpCAS::log('Info: cas_user_synchro is OFF');
$bFound = true;
}
break;
}
}
if($bOk && !$bFound)
{
phpCAS::log("User ".phpCAS::getUser().", none of his/her groups (".implode('; ', $aFilteredGroupNames).") match any of the required groups: ".implode('; ', $aCASMemberships));
}
}
else
{
// Too bad, the user is not part of any of the group => not allowed
phpCAS::log("No 'memberOf' attribute found for user ".phpCAS::getUser().". Are you using the SAML protocol (S1) ?");
}
}
else
{
// No membership required, anybody will pass
$bFound = true;
}
if (!$bFound)
{
// The user is not part of the allowed groups, => log out
$sUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php';
$sCASLogoutUrl = MetaModel::GetConfig()->Get('cas_logout_redirect_service');
if (empty($sCASLogoutUrl))
{
$sCASLogoutUrl = $sUrl;
}
phpCAS::logoutWithRedirectService($sCASLogoutUrl); // Redirects to the CAS logout page
// Will never return !
}
return $bFound;
}
/**
* Called after the user has been authenticated and found in iTop. This method can
* Update the user's definition (profiles...) on the fly to keep it in sync with an external source
* @param User $oUser The user to update/synchronize
* @param string $sLoginMode The login mode used (cas|form|basic|url)
* @param string $sAuthentication The authentication method used
* @return void
*/
public static function UpdateUser(User $oUser, $sLoginMode, $sAuthentication)
{
$bCASUpdateProfiles = MetaModel::GetConfig()->Get('cas_update_profiles');
if (($sLoginMode == 'cas') && $bCASUpdateProfiles && (phpCAS::hasAttribute('memberOf')))
{
$aMemberOf = phpCAS::getAttribute('memberOf');
if (!is_array($aMemberOf)) $aMemberOf = array($aMemberOf); // Just one entry, turn it into an array
return self::SetProfilesFromCAS($oUser, $aMemberOf);
}
// No groups defined in CAS or not CAS at all: do nothing...
return true;
}
/**
* Helper method to create a CAS based user
* @param string $sEmail
* @param array $aGroups
* @return bool true on success, false otherwise
*/
protected static function CreateCASUser($sEmail, $aGroups)
{
if (!MetaModel::IsValidClass('URP_Profiles'))
{
phpCAS::log("URP_Profiles is not a valid class. Automatic creation of Users is not supported in this context, sorry.");
return false;
}
$oUser = MetaModel::GetObjectByName('UserExternal', $sEmail, false);
if ($oUser == null)
{
// Create the user, link it to a contact
phpCAS::log("Info: the user '$sEmail' does not exist. A new UserExternal will be created.");
$oSearch = new DBObjectSearch('Person');
$oSearch->AddCondition('email', $sEmail);
$oSet = new DBObjectSet($oSearch);
$iContactId = 0;
switch($oSet->Count())
{
case 0:
phpCAS::log("Error: found no contact with the email: '$sEmail'. Cannot create the user in iTop.");
return false;
case 1:
$oContact = $oSet->Fetch();
$iContactId = $oContact->GetKey();
phpCAS::log("Info: Found 1 contact '".$oContact->GetName()."' (id=$iContactId) corresponding to the email '$sEmail'.");
break;
default:
phpCAS::log("Error: ".$oSet->Count()." contacts have the same email: '$sEmail'. Cannot create a user for this email.");
return false;
}
$oUser = new UserExternal();
$oUser->Set('login', $sEmail);
$oUser->Set('contactid', $iContactId);
$oUser->Set('language', MetaModel::GetConfig()->GetDefaultLanguage());
}
else
{
phpCAS::log("Info: the user '$sEmail' already exists (id=".$oUser->GetKey().").");
}
// Now synchronize the profiles
if (!self::SetProfilesFromCAS($oUser, $aGroups))
{
return false;
}
else
{
if ($oUser->IsNew() || $oUser->IsModified())
{
$oMyChange = MetaModel::NewObject("CMDBChange");
$oMyChange->Set("date", time());
$oMyChange->Set("userinfo", 'CAS/LDAP Synchro');
$oMyChange->DBInsert();
if ($oUser->IsNew())
{
$oUser->DBInsertTracked($oMyChange);
}
else
{
$oUser->DBUpdateTracked($oMyChange);
}
}
return true;
}
}
protected static function SetProfilesFromCAS($oUser, $aGroups)
{
if (!MetaModel::IsValidClass('URP_Profiles'))
{
phpCAS::log("URP_Profiles is not a valid class. Automatic creation of Users is not supported in this context, sorry.");
return false;
}
// read all the existing profiles
$oProfilesSearch = new DBObjectSearch('URP_Profiles');
$oProfilesSet = new DBObjectSet($oProfilesSearch);
$aAllProfiles = array();
while($oProfile = $oProfilesSet->Fetch())
{
$aAllProfiles[strtolower($oProfile->GetName())] = $oProfile->GetKey();
}
// Translate the CAS/LDAP group names into iTop profile names
$aProfiles = array();
$sPattern = MetaModel::GetConfig()->Get('cas_profile_pattern');
foreach($aGroups as $sGroupName)
{
if (preg_match($sPattern, $sGroupName, $aMatches))
{
if (array_key_exists(strtolower($aMatches[1]), $aAllProfiles))
{
$aProfiles[] = $aAllProfiles[strtolower($aMatches[1])];
phpCAS::log("Info: Adding the profile '{$aMatches[1]}' from CAS.");
}
else
{
phpCAS::log("Warning: {$aMatches[1]} is not a valid iTop profile (extracted from group name: '$sGroupName'). Ignored.");
}
}
else
{
phpCAS::log("Info: The CAS group '$sGroupName' does not seem to match an iTop pattern. Ignored.");
}
}
if (count($aProfiles) == 0)
{
phpCAS::log("Info: The user '".$oUser->GetName()."' has no profiles retrieved from CAS. Default profile(s) will be used.");
// Second attempt: check if there is/are valid default profile(s)
$sCASDefaultProfiles = MetaModel::GetConfig()->Get('cas_default_profiles');
$aCASDefaultProfiles = explode(';', $sCASDefaultProfiles);
foreach($aCASDefaultProfiles as $sDefaultProfileName)
{
if (array_key_exists(strtolower($sDefaultProfileName), $aAllProfiles))
{
$aProfiles[] = $aAllProfiles[strtolower($sDefaultProfileName)];
phpCAS::log("Info: Adding the default profile '".$aAllProfiles[strtolower($sDefaultProfileName)]."' from CAS.");
}
else
{
phpCAS::log("Warning: the default profile {$sDefaultProfileName} is not a valid iTop profile. Ignored.");
}
}
if (count($aProfiles) == 0)
{
phpCAS::log("Error: The user '".$oUser->GetName()."' has no profiles in iTop, and therefore cannot be created.");
return false;
}
}
// Now synchronize the profiles
$oProfilesSet = DBObjectSet::FromScratch('URP_UserProfile');
foreach($aProfiles as $iProfileId)
{
$oLink = new URP_UserProfile();
$oLink->Set('profileid', $iProfileId);
$oLink->Set('reason', 'CAS/LDAP Synchro');
$oProfilesSet->AddObject($oLink);
}
$oUser->Set('profile_list', $oProfilesSet);
phpCAS::log("Info: the user '".$oUser->GetName()."' (id=".$oUser->GetKey().") now has the following profiles: '".implode("', '", $aProfiles)."'.");
if ($oUser->IsModified())
{
$oMyChange = MetaModel::NewObject("CMDBChange");
$oMyChange->Set("date", time());
$oMyChange->Set("userinfo", 'CAS/LDAP Synchro');
$oMyChange->DBInsert();
if ($oUser->IsNew())
{
$oUser->DBInsertTracked($oMyChange);
}
else
{
$oUser->DBUpdateTracked($oMyChange);
}
}
return true;
}
/**
* Helper function to check if the supplied string is a litteral string or a regular expression pattern
* @param string $sCASPattern
* @return bool True if it's a regular expression pattern, false otherwise
*/
protected static function IsPattern($sCASPattern)
{
if ((substr($sCASPattern, 0, 1) == '/') && (substr($sCASPattern, -1) == '/'))
{
// the string is enclosed by slashes, let's assume it's a pattern
return true;
}
else
{
return false;
}
}
}
// By default enable the 'CAS_SelfRegister' defined above
UserRights::SelectSelfRegister('CAS_SelfRegister');
?>

View File

@@ -176,6 +176,10 @@ legend {
-webkit-border-radius: 6px;
border-radius: 6px;
}
.ui-widget-content td legend a, .ui-widget-content td legend a:hover, .ui-widget-content td legend a:visited {
color: #fff;
}
.ui-widget-content td a, p a, p a:visited, td a, td a:visited {
text-decoration:none;
color: #1C94C4;
@@ -1104,4 +1108,7 @@ div.actions_button a, .actions_button a:hover, .actions_button a:visited {
height:17px;
line-height: 17px;
display: block;
}
select#org_id {
max-width: 90%;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -140,6 +140,12 @@ Operators:<br/>
'Core:AttributePropertySet' => 'Properties',
'Core:AttributePropertySet+' => 'List of untyped properties (name and value)',
'Core:AttributeFriendlyName' => 'Friendly name',
'Core:AttributeFriendlyName+' => 'Attribute created automatically ; the friendly name is computed after several attributes',
'Core:FriendlyName-Label' => 'Name',
'Core:FriendlyName-Description' => 'Friendly name',
));
@@ -564,6 +570,8 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:SynchroDataSource/Attribute:delete_policy_update+' => 'Syntax: field_name:value; ...',
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Retention Duration',
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => 'How much time an obsolete object is kept before being deleted',
'Class:SynchroDataSource/Attribute:database_table_name' => 'Data table',
'Class:SynchroDataSource/Attribute:database_table_name+' => 'Name of the table to store the synchronization data. If left empty, a default name will be computed.',
'SynchroDataSource:Description' => 'Description',
'SynchroDataSource:Reconciliation' => 'Search &amp; reconciliation',
'SynchroDataSource:Deletion' => 'Deletion rules',
@@ -587,7 +595,7 @@ Dict::Add('EN US', 'English', 'English', array(
'Core:Synchro:History' => 'Synchronization History',
'Core:Synchro:NeverRun' => 'This synchro was never run. No log yet.',
'Core:Synchro:SynchroEndedOn_Date' => 'The latest synchronization ended on %1$s.',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'The synchronization started on $1$s is still running...',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'The synchronization started on %1$s is still running...',
'Menu:DataSources' => 'Synchronization Data Sources',
'Menu:DataSources+' => 'All Synchronization Data Sources',
'Core:Synchro:label_repl_ignored' => 'Ignored (%1$s)',
@@ -612,6 +620,7 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'At Least one reconciliation key must be specified, or the reconciliation policy must be to use the primary key.',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'A delete retention period must be specified, since objects are to be deleted after being marked as obsolete',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Obsolete objects are to be updated, but no update is specified.',
'Class:SynchroDataSource/Error:DataTableAlreadyExists' => 'The table %1$s already exists in the database. Please use another name for the synchro data table.',
'Core:SynchroReplica:PublicData' => 'Public Data',
'Core:SynchroReplica:PrivateDetails' => 'Private Details',
'Core:SynchroReplica:BackToDataSource' => 'Go Back to the Synchro Data Source: %1$s',
@@ -639,7 +648,9 @@ Dict::Add('EN US', 'English', 'English', array(
'Core:SyncDataSourceObsolete' => 'The data source is marked as obsolete. Operation cancelled.',
'Core:SyncDataSourceAccessRestriction' => 'Only adminstrators or the user specified in the data source can execute this operation. Operation cancelled.',
'Core:SyncTooManyMissingReplicas' => 'All records have been untouched for some time (all of the objects could be deleted). Please check that the process that writes into the synchronization table is still running. Operation cancelled.',
'Core:SyncSplitModeCLIOnly' => 'The synchronization can be executed in chunks only if run in mode CLI',
'Core:Synchro:ListReplicas_AllReplicas_Errors_Warnings' => '%1$s replicas, %2$s error(s), %3$s warning(s).',
'Core:SynchroReplica:TargetObject' => 'Synchronized Object: %1$s',
'Class:AsyncSendEmail' => 'Email (asynchronous)',
'Class:AsyncSendEmail/Attribute:to' => 'To',
'Class:AsyncSendEmail/Attribute:subject' => 'Subject',
@@ -717,7 +728,7 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:SynchroReplica/Attribute:sync_source_id' => 'Synchro Data Source',
'Class:SynchroReplica/Attribute:dest_id' => 'Destination object (ID)',
'Class:SynchroReplica/Attribute:dest_class' => 'Destination type',
'Class:SynchroReplica/Attribute:status_last_seen' => 'Lat seen',
'Class:SynchroReplica/Attribute:status_last_seen' => 'Last seen',
'Class:SynchroReplica/Attribute:status' => 'Status',
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modified',
'Class:SynchroReplica/Attribute:status/Value:new' => 'New',
@@ -726,11 +737,14 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Synchronized',
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Object Created ?',
'Class:SynchroReplica/Attribute:status_last_error' => 'Last Error',
'Class:SynchroReplica/Attribute:status_last_warning' => 'Warnings',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Creation Date',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Last Modified Date',
'Class:appUserPreferences' => 'User Preferences',
'Class:appUserPreferences/Attribute:userid' => 'User',
'Class:appUserPreferences/Attribute:preferences' => 'Prefs',
'Core:ExecProcess:Code1' => 'Wrong command or command finished with errors (e.g. wrong script name)',
'Core:ExecProcess:Code255' => 'PHP Error (parsing, or runtime)',
));
//

View File

@@ -76,6 +76,26 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:AuditRule/Attribute:category_name+' => 'Name of the category for this rule',
));
//
// Class: QueryOQL
//
Dict::Add('EN US', 'English', 'English', array(
'Class:Query' => 'Query',
'Class:Query+' => 'A query is a data set defined in a dynamic way',
'Class:Query/Attribute:name' => 'Name',
'Class:Query/Attribute:name+' => 'Identifies the query',
'Class:Query/Attribute:description' => 'Description',
'Class:Query/Attribute:description+' => 'Long description for the query (purpose, usage, etc.)',
'Class:Query/Attribute:fields' => 'Fields',
'Class:Query/Attribute:fields+' => 'Coma separated list of attributes (or alias.attribute) to export',
'Class:QueryOQL' => 'OQL Query',
'Class:QueryOQL+' => 'A query based on the Object Query Language',
'Class:QueryOQL/Attribute:oql' => 'Expression',
'Class:QueryOQL/Attribute:oql+' => 'OQL Expression',
));
//////////////////////////////////////////////////////////////////////
// Classes in 'addon/userrights'
//////////////////////////////////////////////////////////////////////
@@ -429,6 +449,8 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:UndefinedObject' => 'undefined',
'UI:Document:OpenInNewWindow:Download' => 'Open in new window: %1$s, Download: %2$s',
'UI:SelectAllToggle+' => 'Select / Deselect All',
'UI:SplitDateTime-Date' => 'date',
'UI:SplitDateTime-Time' => 'time',
'UI:TruncatedResults' => '%1$d objects displayed out of %2$d',
'UI:DisplayAll' => 'Display All',
'UI:CollapseList' => 'Collapse',
@@ -448,6 +470,7 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:Login:IdentifyYourself' => 'Identify yourself before continuing',
'UI:Login:UserNamePrompt' => 'User Name',
'UI:Login:PasswordPrompt' => 'Password',
'UI:Login:About' => '',
'UI:Login:ChangeYourPassword' => 'Change Your Password',
'UI:Login:OldPasswordPrompt' => 'Old password',
'UI:Login:NewPasswordPrompt' => 'New password',
@@ -532,7 +555,9 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:Audit:HeaderNbObjects' => '# Objects',
'UI:Audit:HeaderNbErrors' => '# Errors',
'UI:Audit:PercentageOk' => '% Ok',
'UI:Audit:ErrorIn_Rule_Reason' => 'OQL Error in the Rule %1$s: %2$s.',
'UI:Audit:ErrorIn_Category_Reason' => 'OQL Error in the Category %1$s: %2$s.',
'UI:RunQuery:Title' => 'iTop - OQL Query Evaluation',
'UI:RunQuery:QueryExamples' => 'Query Examples',
'UI:RunQuery:HeaderPurpose' => 'Purpose',
@@ -544,7 +569,7 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:RunQuery:DevelopedQuery' => 'Redevelopped query expression: ',
'UI:RunQuery:SerializedFilter' => 'Serialized filter: ',
'UI:RunQuery:Error' => 'An error occured while running the query: %1$s',
'UI:Query:UrlForExcel' => 'URL to use for MS-Excel web queries',
'UI:Schema:Title' => 'iTop objects schema',
'UI:Schema:CategoryMenuItem' => 'Category <b>%1$s</b>',
'UI:Schema:Relationships' => 'Relationships',
@@ -604,8 +629,8 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:Schema:LifeCycleAttributeMustChange' => 'Must change',
'UI:Schema:LifeCycleAttributeMustPrompt' => 'User will be prompted to change the value',
'UI:Schema:LifeCycleEmptyList' => 'empty list',
'UI:LinksWidget:Autocomplete+' => 'Type the first 3 characters...',
'UI:Edit:TestQuery' => 'Test query',
'UI:Combo:SelectValue' => '--- select a value ---',
'UI:Label:SelectedObjects' => 'Selected objects: ',
'UI:Label:AvailableObjects' => 'Available objects: ',
@@ -618,7 +643,6 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:RemoveLinkedObjectsOf_Class' => 'Remove selected objects',
'UI:Message:EmptyList:UseAdd' => 'The list is empty, use the "Add..." button to add elements.',
'UI:Message:EmptyList:UseSearchForm' => 'Use the search form above to search for objects to be added.',
'UI:Wizard:FinalStepTitle' => 'Final step: confirmation',
'UI:Title:DeletionOf_Object' => 'Deletion of %1$s',
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'Bulk deletion of %1$d objects of class %2$s',
@@ -821,6 +845,9 @@ When associated with a trigger, each action is given an "order" number, specifyi
'Menu:RunQueriesMenu' => 'Run Queries',
'Menu:RunQueriesMenu+' => 'Run any query',
'Menu:QueryMenu' => 'Query phrasebook',
'Menu:QueryMenu+' => 'Query phrasebook',
'Menu:DataAdministration' => 'Data administration',
'Menu:DataAdministration+' => 'Data administration',
@@ -862,14 +889,19 @@ When associated with a trigger, each action is given an "order" number, specifyi
'UI:RelationshipGraph' => 'Graphical view',
'UI:RelationshipList' => 'List',
'UI:OperationCancelled' => 'Operation Cancelled',
'UI:ElementsDisplayed' => 'Filtering',
'Portal:Title' => 'iTop user portal',
'Portal:Refresh' => 'Refresh',
'Portal:Back' => 'Back',
'Portal:WelcomeUserOrg' => 'Welcome %1$s, from %2$s',
'Portal:ShowOngoing' => 'Show open requests',
'Portal:ShowClosed' => 'Show closed requests',
'Portal:CreateNewRequest' => 'Create a new request',
'Portal:ChangeMyPassword' => 'Change my password',
'Portal:Disconnect' => 'Disconnect',
'Portal:OpenRequests' => 'My open requests',
'Portal:ClosedRequests' => 'My closed requests',
'Portal:ResolvedRequests' => 'My resolved requests',
'Portal:SelectService' => 'Select a service from the catalog:',
'Portal:PleaseSelectOneService' => 'Please select one service',
@@ -877,8 +909,11 @@ When associated with a trigger, each action is given an "order" number, specifyi
'Portal:PleaseSelectAServiceSubCategory' => 'Please select one sub-category',
'Portal:DescriptionOfTheRequest' => 'Enter the description of your request:',
'Portal:TitleRequestDetailsFor_Request' => 'Details for request %1$s:',
'Portal:NoOpenRequest' => 'No request in this category.',
'Portal:NoOpenRequest' => 'No request in this category',
'Portal:NoClosedRequest' => 'No request in this category',
'Portal:Button:ReopenTicket' => 'Reopen this ticket',
'Portal:Button:CloseTicket' => 'Close this ticket',
'Portal:Button:UpdateRequest' => 'Update the request',
'Portal:EnterYourCommentsOnTicket' => 'Enter your comments about the resolution of this ticket:',
'Portal:ErrorNoContactForThisUser' => 'Error: the current user is not associated with a Contact/Person. Please contact your administrator.',
'Portal:Attachments' => 'Attachments',

View File

@@ -280,6 +280,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:SynchroDataSource/Attribute:url_icon+' => 'Hyperlien vers une icône représentant l\'application source des données',
'Class:SynchroDataSource/Attribute:url_application' => 'Application (hyperlien)',
'Class:SynchroDataSource/Attribute:url_application+' => 'Un hyperlien vers l\'application source des données. Paramètres possibles: $this->nom_de_champ$ et $replica->primary_key$',
'Class:SynchroDataSource/Attribute:database_table_name' => 'Table de données',
'Class:SynchroDataSource/Attribute:database_table_name+' => 'Nom de la table stockant les données de cette source. Un nom par défaut est calculé automatiquement si ce champ est laissé vide.',
'Class:SynchroAttribute' => 'Champs de synchronisation',
'Class:SynchroAttribute+' => '',
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Source de données',
@@ -386,6 +388,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:SynchroReplica/Attribute:status_dest_creator+' => '',
'Class:SynchroReplica/Attribute:status_last_error' => 'Dernière erreur',
'Class:SynchroReplica/Attribute:status_last_error+' => '',
'Class:SynchroReplica/Attribute:status_last_warning' => 'Avertissements',
'Class:SynchroReplica/Attribute:status_last_warning+' => '',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Date de création',
'Class:SynchroReplica/Attribute:info_creation_date+' => '',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Date de dernière modification',
@@ -483,6 +487,13 @@ Opérateurs :<br/>
'Core:AttributeTable+' => 'Tableau à deux dimensions',
'Core:AttributePropertySet' => 'Propriétés',
'Core:AttributePropertySet+' => 'Liste de propriétés (nom et valeur) non typées',
'Core:AttributeFriendlyName' => 'Nom usuel (convivial)',
'Core:AttributeFriendlyName+' => 'Attribut créé automatiquement ; sa valeur est calculée d\'après d\'autres attributs',
'Core:FriendlyName-Label' => 'Nom',
'Core:FriendlyName-Description' => 'Nom usuel',
'Change:ObjectCreated' => 'Elément créé',
'Change:ObjectDeleted' => 'Elément effacé',
'Change:ObjectModified' => 'Elément modifié',
@@ -554,7 +565,7 @@ Opérateurs :<br/>
'Core:Synchro:History' => 'Historique de synchronisation',
'Core:Synchro:NeverRun' => 'Aucun historique, la synchronisation n\'a pas encore fonctionné',
'Core:Synchro:SynchroEndedOn_Date' => 'La dernière synchronisation s\'est terminée à: %1$s.',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'Synchronisation en cours (début à $1$s)',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'Synchronisation en cours (début à %1$s)',
'Menu:DataSources' => 'Synchronisation',
'Menu:DataSources+' => '',
'Core:Synchro:label_repl_ignored' => 'Ignorés (%1$s)',
@@ -578,6 +589,7 @@ Opérateurs :<br/>
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Si la politique de réconciliation n\'est pas la clé primaire, au moins une clé de recherche doit être spécifiée',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'Pour que les objets soient effacés après avoir été obsoletés, il faut spécifier une durée de rétention',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Les objets obsolètes doivent être mis à jour, mais aucune information de mise à jour n\'est spécifiée',
'Class:SynchroDataSource/Error:DataTableAlreadyExists' => 'La table %1$s existe déjà dans la base de données. Veuillez utiliser un autre nom pour la table des données de cette source.',
'Core:SynchroReplica:PublicData' => 'Données synchronisées',
'Core:SynchroReplica:PrivateDetails' => 'Informations internes',
'Core:SynchroReplica:BackToDataSource' => 'Retourner aux détails de la source de données: %1$s',
@@ -593,7 +605,7 @@ Opérateurs :<br/>
'Core:SynchroAtt:update_policy+' => '',
'Core:SynchroAtt:reconciliation_attcode' => 'Clé de recherche',
'Core:SynchroAtt:reconciliation_attcode+' => '',
'Core:SyncDataExchangeComment' => '(Synhcronisation)',
'Core:SyncDataExchangeComment' => '(Synchronisation)',
'Core:Synchro:ListOfDataSources' => 'Sources de données:',
'Core:Synchro:LastSynchro' => 'Dernière synchronisation:',
'Core:Synchro:ThisObjectIsSynchronized' => 'Cet objet est synchronisé avec une source de données',
@@ -605,6 +617,8 @@ Opérateurs :<br/>
'Core:SyncDataSourceObsolete' => 'Cette source de données est obsolète. Opération annulée.',
'Core:SyncDataSourceAccessRestriction' => 'Seuls les administrateurs et l\'utilisateur spécifié dans la source de données peuvent exécuter cette synchronisation. Opération annulée.',
'Core:SyncTooManyMissingReplicas' => 'Tous les réplicas sont absents de l\'import. L\'import a-t-il réellement tourné. Opération annulée.',
'Core:Synchro:ListReplicas_AllReplicas_Errors_Warnings' => '%1$s replicas, %2$s erreur(s), %3$s avertissement(s).',
'Core:SynchroReplica:TargetObject' => 'Objet Synchronisé : %1$s',
'Core:Duration_Seconds' => '%1$ds',
'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds',
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds',

View File

@@ -50,6 +50,18 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:AuditCategory/Attribute:definition_set+' => 'Expression OQL qui défini le périmètre d\'application de l\'audit',
'Class:AuditCategory/Attribute:rules_list' => 'Règles d\'audit',
'Class:AuditCategory/Attribute:rules_list+' => 'Règles d\'audit pour cette catégorie',
'Class:Query' => 'Requête',
'Class:Query+' => 'Une requête définit un ensemble d\'information de manière dynamique',
'Class:Query/Attribute:name' => 'Nom',
'Class:Query/Attribute:name+' => 'Identification de la requête',
'Class:Query/Attribute:description' => 'Description',
'Class:Query/Attribute:description+' => 'Description complète (finalité, utilisations, public)',
'Class:Query/Attribute:fields' => 'Champs',
'Class:Query/Attribute:fields+' => 'Liste CSV des attributs (ou alias.attribut) à exporter',
'Class:QueryOQL' => 'Requête OQL',
'Class:QueryOQL+' => 'Une requête écrite dans le langage "Object Query Language"',
'Class:QueryOQL/Attribute:oql' => 'Expression',
'Class:QueryOQL/Attribute:oql+' => 'Expression OQL',
'Class:URP_Profiles' => 'Profil',
'Class:URP_Profiles+' => 'Profil utilisateur',
'Class:URP_Profiles/Attribute:name' => 'Nom',
@@ -71,7 +83,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_UserProfile/Attribute:reason' => 'Raison',
'Class:URP_UserProfile/Attribute:reason+' => 'Justifie le rôle affecté à cet utilisateur',
'Class:URP_UserOrg' => 'Utilisateur/Organisation',
'Class:URP_UserOrg+' => 'Organizations permises pour l\'utilisateur',
'Class:URP_UserOrg+' => 'Organisations permises pour l\'utilisateur',
'Class:URP_UserOrg/Attribute:userid' => 'Utilisateur',
'Class:URP_UserOrg/Attribute:userid+' => '',
'Class:URP_UserOrg/Attribute:userlogin' => 'Login',
@@ -215,7 +227,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:WelcomeMenu:OpenIncidents' => 'Incidents en cours: %1$d',
'UI:WelcomeMenu:AllConfigItems' => 'Actifs: %1$d',
'UI:WelcomeMenu:MyIncidents' => 'Mes Incidents',
'UI:AllOrganizations' => ' Toutes les Organizations ',
'UI:AllOrganizations' => ' Toutes les Organisations ',
'UI:YourSearch' => 'Votre recherche',
'UI:LoggedAsMessage' => 'Connecté comme: %1$s',
'UI:LoggedAsMessage+Admin' => 'Connecté comme: %1$s (Administrateur)',
@@ -316,6 +328,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Document:OpenInNewWindow:Download' => 'Ouvrir dans un nouvelle fenêtre: %1$s, Télécharger: %2$s',
'UI:SelectAllToggle+' => 'Tout sélectionner / Tout déselectionner',
'UI:TruncatedResults' => '%1$d objets affichés sur %2$d',
'UI:SplitDateTime-Date' => 'date',
'UI:SplitDateTime-Time' => 'heure',
'UI:DisplayAll' => 'Tout afficher',
'UI:CollapseList' => 'Refermer',
'UI:CountOfResults' => '%1$d objet(s)',
@@ -416,6 +430,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Audit:HeaderNbObjects' => 'Nb d\'Objets',
'UI:Audit:HeaderNbErrors' => 'Nb d\'Erreurs',
'UI:Audit:PercentageOk' => '% Ok',
'UI:Audit:ErrorIn_Rule_Reason' => 'Erreur OQL dans la règle %1$s: %2$s.',
'UI:Audit:ErrorIn_Category_Reason' => 'Erreur OQL dans la catégorie %1$s: %2$s.',
'UI:RunQuery:Title' => 'iTop - Evaluation de requêtes OQL',
'UI:RunQuery:QueryExamples' => 'Exemples de requêtes',
'UI:RunQuery:HeaderPurpose' => 'Objectif',
@@ -427,6 +443,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:RunQuery:DevelopedQuery' => 'Requête OQL décompilée : ',
'UI:RunQuery:SerializedFilter' => 'Version sérialisée : ',
'UI:RunQuery:Error' => 'Une erreur s\'est produite durant l\'exécution de la requête : %1$s',
'UI:Query:UrlForExcel' => 'Lien à copier-coller dans Excel, pour déclarer une source de données à partir du web',
'UI:Schema:Title' => 'Modèle de données iTop',
'UI:Schema:CategoryMenuItem' => 'Catégorie <b>%1$s</b>',
'UI:Schema:Relationships' => 'Relations',
@@ -486,6 +503,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Schema:LifeCycleAttributeMustPrompt' => 'L\'utilisateur se verra proposer de changer la valeur',
'UI:Schema:LifeCycleEmptyList' => 'liste vide',
'UI:LinksWidget:Autocomplete+' => 'Tapez les 3 premiers caractères...',
'UI:Edit:TestQuery' => 'Tester le requête',
'UI:Combo:SelectValue' => '--- choisissez une valeur ---',
'UI:Label:SelectedObjects' => 'Objets sélectionnés: ',
'UI:Label:AvailableObjects' => 'Objets disponibles: ',
@@ -680,6 +698,8 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
'Menu:Notifications:Title' => 'Catégories d\'audit',
'Menu:RunQueriesMenu' => 'Requêtes OQL',
'Menu:RunQueriesMenu+' => 'Executer une requête OQL',
'Menu:QueryMenu' => 'Livre des requêtes',
'Menu:QueryMenu+' => 'Livre des requêtes',
'Menu:DataAdministration' => 'Administration des données',
'Menu:DataAdministration+' => 'Administration des données',
'Menu:UniversalSearchMenu' => 'Recherche Universelle',
@@ -712,14 +732,19 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
'UI:DisplayThisMessageAtStartup' => 'Afficher ce message au démarrage',
'UI:RelationshipGraph' => 'Vue graphique',
'UI:RelationshipList' => 'Liste',
'UI:ElementsDisplayed' => 'Filtrage',
'UI:OperationCancelled' => 'Opération Annulée',
'Portal:Title' => 'Portail utilisateur iTop',
'Portal:Refresh' => 'Rafraîchir',
'Portal:Back' => 'Retour',
'Portal:WelcomeUserOrg' => 'Bienvenue %1$s (%2$s)',
'Portal:ShowOngoing' => 'Requêtes en cours',
'Portal:ShowClosed' => 'Requêtes fermées',
'Portal:CreateNewRequest' => 'Créer une nouvelle requête',
'Portal:ChangeMyPassword' => 'Changer mon mot de passe',
'Portal:Disconnect' => 'Déconnexion',
'Portal:OpenRequests' => 'Mes requêtes en cours',
'Portal:ClosedRequests' => 'Mes requêtes fermées',
'Portal:ResolvedRequests' => 'Mes requêtes résolues',
'Portal:SelectService' => 'Choisissez un service dans le catalogue:',
'Portal:PleaseSelectOneService' => 'Veuillez choisir un service',
@@ -728,7 +753,10 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
'Portal:DescriptionOfTheRequest' => 'Entrez la description de votre requête:',
'Portal:TitleRequestDetailsFor_Request' => 'Détails de votre requête %1$s:',
'Portal:NoOpenRequest' => 'Aucune requête.',
'Portal:NoClosedRequest' => 'Aucune requête.',
'Portal:Button:ReopenTicket' => 'Réouvrir cette requête',
'Portal:Button:CloseTicket' => 'Clôre cette requête',
'Portal:Button:UpdateRequest' => 'Mettre à jour la requête',
'Portal:EnterYourCommentsOnTicket' => 'Vos commentaires à propos du traitement de cette requête:',
'Portal:ErrorNoContactForThisUser' => 'Erreur: l\'utilisateur courant n\'est pas associé à une Personne/Contact. Contactez votre administrateur.',
'Portal:Attachments' => 'Pièces jointes',

View File

@@ -422,7 +422,7 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Core:Synchro:History' => 'Szinkronizáció történet',
'Core:Synchro:NeverRun' => 'Ez a szinkronizáció még soha nem futott. Nincs még napló bejegyzés.',
'Core:Synchro:SynchroEndedOn_Date' => 'Az utolsó szinkronizáció lefutásának időpontja: %1$s.',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'Az szinkronizáció elindut $1$s, de még fut.',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'Az szinkronizáció elindut %1$s, de még fut.',
'Menu:DataSources' => 'Szinkronizált adatforrások',
'Menu:DataSources+' => '',
'Core:Synchro:label_repl_ignored' => 'Figyelmen kívül hagyott (%1$s)',

View File

@@ -715,10 +715,14 @@ Akció kiváltó okhoz rendelésekor kap egy sorszámot , amely meghatározza az
'Portal:Title' => 'iTop felhasználói portál',
'Portal:Refresh' => 'Frissítés',
'Portal:Back' => 'Vissza',
'Portal:WelcomeUserOrg' => 'Welcome %1$s, from %2$s',
'Portal:ShowOngoing' => 'Show open requests',
'Portal:ShowClosed' => 'Show closed requests',
'Portal:CreateNewRequest' => 'Új kérés létrehozása',
'Portal:ChangeMyPassword' => 'Jelszó változtatás',
'Portal:Disconnect' => 'Kilépés',
'Portal:OpenRequests' => 'Nyitott kéréseim',
'Portal:ClosedRequests' => 'My closed requests',
'Portal:ResolvedRequests' => 'Megoldott kéréseim',
'Portal:SelectService' => 'Válasszon szolgáltatást a katalógusból:',
'Portal:PleaseSelectOneService' => 'Kérem válasszon egy szolgáltatást',
@@ -727,7 +731,10 @@ Akció kiváltó okhoz rendelésekor kap egy sorszámot , amely meghatározza az
'Portal:DescriptionOfTheRequest' => 'Adja meg a kérés leírásást:',
'Portal:TitleRequestDetailsFor_Request' => '%1$s kérés részletei:',
'Portal:NoOpenRequest' => 'A kategóriához nem tartozik nyitott kérés.',
'Portal:NoClosedRequest' => 'No request in this category',
'Portal:Button:ReopenTicket' => 'Reopen this ticket',
'Portal:Button:CloseTicket' => 'Hibajegy lezárása',
'Portal:Button:UpdateRequest' => 'Update the request',
'Portal:EnterYourCommentsOnTicket' => 'Adjon megjegyzést a megoldáshoz:',
'Portal:ErrorNoContactForThisUser' => 'Hiba: az aktuális felhasználó nem tartozik egyetlen Kapcsolattartóhoz / Szemályhez sem. Kérem vegye felk a kapcsolatot az adminisztrátorral.',
'Portal:Attachments' => 'Csatolmányok',

View File

@@ -1,485 +1,485 @@
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Class:ActionEmail' => 'E-mail di notifica',
'Class:ActionEmail+' => '',
'Class:ActionEmail/Attribute:test_recipient' => 'Test destinatario',
'Class:ActionEmail/Attribute:test_recipient+' => '',
'Class:ActionEmail/Attribute:from' => 'Da',
'Class:ActionEmail/Attribute:from+' => '',
'Class:ActionEmail/Attribute:reply_to' => 'Rispondi A',
'Class:ActionEmail/Attribute:reply_to+' => '',
'Class:ActionEmail/Attribute:to' => 'A',
'Class:ActionEmail/Attribute:to+' => '',
'Class:ActionEmail/Attribute:cc' => 'Cc',
'Class:ActionEmail/Attribute:cc+' => '',
'Class:ActionEmail/Attribute:bcc' => 'BCC',
'Class:ActionEmail/Attribute:bcc+' => '',
'Class:ActionEmail/Attribute:subject' => 'Oggetto',
'Class:ActionEmail/Attribute:subject+' => '',
'Class:ActionEmail/Attribute:body' => 'corpo',
'Class:ActionEmail/Attribute:body+' => '',
'Class:ActionEmail/Attribute:importance' => 'priorità',
'Class:ActionEmail/Attribute:importance+' => '',
'Class:ActionEmail/Attribute:importance/Value:high' => 'alta',
'Class:ActionEmail/Attribute:importance/Value:high+' => '',
'Class:ActionEmail/Attribute:importance/Value:low' => 'bassa',
'Class:ActionEmail/Attribute:importance/Value:low+' => '',
'Class:ActionEmail/Attribute:importance/Value:normal' => 'normake',
'Class:ActionEmail/Attribute:importance/Value:normal+' => '',
'Class:TriggerOnStateEnter' => 'Trigger (sull\'entrare in uno stato)',
'Class:TriggerOnStateEnter+' => '',
'Class:TriggerOnStateLeave' => 'Trigger (sul lasciare uno stato)~~',
'Class:TriggerOnStateLeave+' => '',
'Class:TriggerOnObjectCreate' => 'Trigger (sulla creazione di un oggetto)~~',
'Class:TriggerOnObjectCreate+' => '',
'Class:lnkTriggerAction' => 'Azione/Trigger~~',
'Class:lnkTriggerAction+' => '',
'Class:lnkTriggerAction/Attribute:action_id' => 'Azione',
'Class:lnkTriggerAction/Attribute:action_id+' => '',
'Class:lnkTriggerAction/Attribute:trigger_id' => 'Trigger',
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
'Class:lnkTriggerAction/Attribute:order' => 'Ordine',
'Class:lnkTriggerAction/Attribute:order+' => '',
'Class:AsyncSendEmail' => 'Email (asincrona)',
'Class:AsyncSendEmail/Attribute:to' => 'A',
'Class:AsyncSendEmail/Attribute:subject' => 'Oggetto',
'Class:AsyncSendEmail/Attribute:body' => 'Corpo',
'Class:AsyncSendEmail/Attribute:header' => 'Intestazione',
'Class:CMDBChange' => 'Cambio',
'Class:CMDBChange+' => '',
'Class:CMDBChange/Attribute:date' => 'data',
'Class:CMDBChange/Attribute:date+' => '',
'Class:CMDBChange/Attribute:userinfo' => 'info varie',
'Class:CMDBChange/Attribute:userinfo+' => '',
'Class:CMDBChangeOp' => 'Operazione di Cambio',
'Class:CMDBChangeOp+' => '',
'Class:CMDBChangeOp/Attribute:change' => 'cambio',
'Class:CMDBChangeOp/Attribute:change+' => '',
'Class:CMDBChangeOp/Attribute:objclass' => 'oggetto della classe',
'Class:CMDBChangeOp/Attribute:objclass+' => '',
'Class:CMDBChangeOp/Attribute:objkey' => 'oggetto id',
'Class:CMDBChangeOp/Attribute:objkey+' => '',
'Class:CMDBChangeOp/Attribute:finalclass' => 'tipo',
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
'Class:CMDBChangeOpCreate' => 'creazione dell\'oggetto',
'Class:CMDBChangeOpCreate+' => '',
'Class:CMDBChangeOpDelete' => 'cancellazione dell\'oggetto',
'Class:CMDBChangeOpDelete+' => '',
'Class:CMDBChangeOpSetAttribute' => 'cambio dell\'oggetto',
'Class:CMDBChangeOpSetAttribute+' => '',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => 'Attributo',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => '',
'Class:CMDBChangeOpSetAttributeScalar' => 'cambio della proprietà',
'Class:CMDBChangeOpSetAttributeScalar+' => '',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'Valore precedente',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => '',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'Valore Nuovo',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => '',
'Class:CMDBChangeOpSetAttributeBlob' => 'modifica i dati',
'Class:CMDBChangeOpSetAttributeBlob+' => '',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'Dati precedenti',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => '',
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Password criptata',
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Valore Precedente',
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Encrypted Field~~',
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Valore Precedente',
'Class:CMDBChangeOpSetAttributeText' => 'modifica testo',
'Class:CMDBChangeOpSetAttributeText+' => '',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Dati precendenti',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => '',
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Log dei casi',
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Ultima entrata',
'Class:Event' => 'Log dell\'evento',
'Class:Event+' => '',
'Class:Event/Attribute:message' => 'Messaggio',
'Class:Event/Attribute:message+' => '',
'Class:Event/Attribute:date' => 'Data',
'Class:Event/Attribute:date+' => '',
'Class:Event/Attribute:userinfo' => 'Info Utente',
'Class:Event/Attribute:userinfo+' => '',
'Class:Event/Attribute:finalclass' => 'Tipo',
'Class:Event/Attribute:finalclass+' => '',
'Class:EventNotification' => 'Notifica dell\'evento',
'Class:EventNotification+' => '',
'Class:EventNotification/Attribute:trigger_id' => 'Trigger',
'Class:EventNotification/Attribute:trigger_id+' => '',
'Class:EventNotification/Attribute:action_id' => 'utente',
'Class:EventNotification/Attribute:action_id+' => '',
'Class:EventNotification/Attribute:object_id' => 'Oggetto id',
'Class:EventNotification/Attribute:object_id+' => '',
'Class:EventNotificationEmail' => 'Email caso di emissione',
'Class:EventNotificationEmail+' => '',
'Class:EventNotificationEmail/Attribute:to' => 'A',
'Class:EventNotificationEmail/Attribute:to+' => '',
'Class:EventNotificationEmail/Attribute:cc' => 'CC',
'Class:EventNotificationEmail/Attribute:cc+' => '',
'Class:EventNotificationEmail/Attribute:bcc' => 'BCC',
'Class:EventNotificationEmail/Attribute:bcc+' => '',
'Class:EventNotificationEmail/Attribute:from' => 'Da',
'Class:EventNotificationEmail/Attribute:from+' => '',
'Class:EventNotificationEmail/Attribute:subject' => 'Oggeto',
'Class:EventNotificationEmail/Attribute:subject+' => '',
'Class:EventNotificationEmail/Attribute:body' => 'Corpo',
'Class:EventNotificationEmail/Attribute:body+' => '',
'Class:EventIssue' => 'Evento Problema',
'Class:EventIssue+' => '',
'Class:EventIssue/Attribute:issue' => 'Problema',
'Class:EventIssue/Attribute:issue+' => '',
'Class:EventIssue/Attribute:impact' => 'Impatto',
'Class:EventIssue/Attribute:impact+' => '',
'Class:EventIssue/Attribute:page' => 'Pagina',
'Class:EventIssue/Attribute:page+' => '',
'Class:EventIssue/Attribute:arguments_post' => 'Argomenti inviati',
'Class:EventIssue/Attribute:arguments_post+' => '',
'Class:EventIssue/Attribute:arguments_get' => 'Argomenti URL',
'Class:EventIssue/Attribute:arguments_get+' => '',
'Class:EventIssue/Attribute:callstack' => 'Callstack',
'Class:EventIssue/Attribute:callstack+' => '',
'Class:EventIssue/Attribute:data' => 'Dati',
'Class:EventIssue/Attribute:data+' => '',
'Class:EventWebService' => 'Evento Servizio Web',
'Class:EventWebService+' => '',
'Class:EventWebService/Attribute:verb' => 'Verbo',
'Class:EventWebService/Attribute:verb+' => '',
'Class:EventWebService/Attribute:result' => 'Resulto',
'Class:EventWebService/Attribute:result+' => '',
'Class:EventWebService/Attribute:log_info' => 'Log delle info',
'Class:EventWebService/Attribute:log_info+' => '',
'Class:EventWebService/Attribute:log_warning' => 'Log dei warning',
'Class:EventWebService/Attribute:log_warning+' => '',
'Class:EventWebService/Attribute:log_error' => 'Log degli errori',
'Class:EventWebService/Attribute:log_error+' => '',
'Class:EventWebService/Attribute:data' => 'Dati',
'Class:EventWebService/Attribute:data+' => '',
'Class:EventLoginUsage' => 'Login di utilizzo',
'Class:EventLoginUsage+' => '',
'Class:EventLoginUsage/Attribute:user_id' => 'Login',
'Class:EventLoginUsage/Attribute:user_id+' => '',
'Class:SynchroDataSource' => 'Sorgente di sincronizzazione dei dati',
'Class:SynchroDataSource/Attribute:name' => 'Nome',
'Class:SynchroDataSource/Attribute:name+' => '',
'Class:SynchroDataSource/Attribute:description' => 'Descrizione',
'Class:SynchroDataSource/Attribute:status' => 'Stato',
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implementazione',
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsoleto',
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Produzione',
'Class:SynchroDataSource/Attribute:user_id' => 'Utente',
'Class:SynchroDataSource/Attribute:scope_class' => 'Classe Target',
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Campo di applicazione restrizione',
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Intervallo a pieno carico',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => '',
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Policy di riconciliazione',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Usa gli attributi',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Usa il campo chiave primaria',
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Azione su zero~~',
'Class:SynchroDataSource/Attribute:action_on_zero+' => '',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Crea',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Errore',
'Class:SynchroDataSource/Attribute:action_on_one' => 'Azione su uno',
'Class:SynchroDataSource/Attribute:action_on_one+' => '',
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Error',
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Aggiorna',
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Azione su molti',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => '',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Crea',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Errore',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Considera il primo (random?)',
'Class:SynchroDataSource/Attribute:delete_policy' => 'Policy di cancellazioen',
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Cancella',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignora',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Aggiorna',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Aggiorna e poi Cancella',
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Regole per l\'aggiornamento',
'Class:SynchroDataSource/Attribute:delete_policy_update+' => '',
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Durata di conservazione',
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => '',
'Class:SynchroDataSource/Attribute:attribute_list' => 'Lista degli attributi',
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'utenti autorizzati',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => '',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Solo Amministratore',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Tutti sono autorizzati a cancellare questi oggetti',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Nessuno',
'Class:SynchroDataSource/Attribute:url_icon' => 'Icona di collegamento ipertestuale',
'Class:SynchroDataSource/Attribute:url_icon+' => '',
'Class:SynchroDataSource/Attribute:url_application' => 'Collegamento ipertestuale all\'applicazione',
'Class:SynchroDataSource/Attribute:url_application+' => '',
'Class:SynchroAttribute' => 'Attributo di sincronizzazione',
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Sorgente sincronizzazione dati',
'Class:SynchroAttribute/Attribute:attcode' => 'Codice attributo',
'Class:SynchroAttribute/Attribute:update' => 'Aggiorna',
'Class:SynchroAttribute/Attribute:reconcile' => 'Rincocilia',
'Class:SynchroAttribute/Attribute:update_policy' => 'Policy di aggiornamento',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'Bloccato',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'Sbloccato',
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Inizializza se vuoto',
'Class:SynchroAttribute/Attribute:finalclass' => 'Classe',
'Class:SynchroAttExtKey' => 'Attributo di sincronizzazione (ExtKey)',
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Attributo di riconciliazione',
'Class:SynchroAttLinkSet' => 'Attributo di sincronizzazione (Linkset)',
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Separatore di righe',
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Separatore di attributi',
'Class:SynchroLog' => 'Log di sincronizzazione',
'Class:SynchroLog/Attribute:sync_source_id' => 'Sorgente di sincronizzazione dati',
'Class:SynchroLog/Attribute:start_date' => 'Data di inizio',
'Class:SynchroLog/Attribute:end_date' => 'Data di fine',
'Class:SynchroLog/Attribute:status' => 'Stato',
'Class:SynchroLog/Attribute:status/Value:completed' => 'Completo',
'Class:SynchroLog/Attribute:status/Value:error' => 'Errore',
'Class:SynchroLog/Attribute:status/Value:running' => 'Ancora in esecuzione',
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nb replica viste',
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nb replica totale',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nb oggetti cancellati',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nb di errore durante la cancellazione',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nb oggetti obsoleti',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nb di errori mentre obsoleta',
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nb oggetti creati',
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nb di errori durante la creazione',
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nb oggetti aggiornati',
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nb di errori durante l\'aggiornamento',
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nb di errori durante la riconcilazione',
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nb repliche scomparse',
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nb oggetti aggiornati',
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nb oggetti non modificati',
'Class:SynchroLog/Attribute:last_error' => 'Untimo errore',
'Class:SynchroLog/Attribute:traces' => 'Tracce',
'Class:SynchroReplica' => 'Replica sincronizzazione',
'Class:SynchroReplica/Attribute:sync_source_id' => 'Sorgente di sincronizzazione dati',
'Class:SynchroReplica/Attribute:dest_id' => 'Oggetto di destinazione (ID)~~',
'Class:SynchroReplica/Attribute:dest_class' => 'Tipo di destinazione',
'Class:SynchroReplica/Attribute:status_last_seen' => 'Ultimo visto',
'Class:SynchroReplica/Attribute:status' => 'Stato',
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modificato',
'Class:SynchroReplica/Attribute:status/Value:new' => 'Nuovo',
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Obsoleto',
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Orfano',
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Sincronizzato',
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Oggetto Creato ?',
'Class:SynchroReplica/Attribute:status_last_error' => 'Ultimo Errore',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Data di creazione',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Data ultima modifica',
'Class:appUserPreferences' => 'Preferenze utente',
'Class:appUserPreferences/Attribute:userid' => 'Utente',
'Class:appUserPreferences/Attribute:preferences' => 'Preferenze',
'Core:AttributeLinkedSet' => 'Array di oggetti',
'Core:AttributeLinkedSet+' => '',
'Core:AttributeLinkedSetIndirect' => 'Array di oggetti (N-N)',
'Core:AttributeLinkedSetIndirect+' => '',
'Core:AttributeInteger' => 'Integero',
'Core:AttributeInteger+' => '',
'Core:AttributeDecimal' => 'Decimale',
'Core:AttributeDecimal+' => '',
'Core:AttributeBoolean' => 'Booleano',
'Core:AttributeBoolean+' => '',
'Core:AttributeString' => 'Stringa',
'Core:AttributeString+' => '',
'Core:AttributeClass' => 'Classe',
'Core:AttributeClass+' => '',
'Core:AttributeApplicationLanguage' => 'Linguaggio Utente',
'Core:AttributeApplicationLanguage+' => '',
'Core:AttributeFinalClass' => 'Classe (auto)',
'Core:AttributeFinalClass+' => '',
'Core:AttributePassword' => 'Password',
'Core:AttributePassword+' => '',
'Core:AttributeEncryptedString' => 'Stringa criptata',
'Core:AttributeEncryptedString+' => '',
'Core:AttributeText' => 'Testo',
'Core:AttributeText+' => '',
'Core:AttributeHTML' => 'HTML',
'Core:AttributeHTML+' => '',
'Core:AttributeEmailAddress' => 'Indirizzo Email',
'Core:AttributeEmailAddress+' => '',
'Core:AttributeIPAddress' => 'Indirizzo IP',
'Core:AttributeIPAddress+' => '',
'Core:AttributeOQL' => 'OQL',
'Core:AttributeOQL+' => '',
'Core:AttributeEnum' => 'Enum',
'Core:AttributeEnum+' => '',
'Core:AttributeTemplateString' => 'Stringa Template',
'Core:AttributeTemplateString+' => '',
'Core:AttributeTemplateText' => 'Testo Template',
'Core:AttributeTemplateText+' => '',
'Core:AttributeTemplateHTML' => 'HTML Template',
'Core:AttributeTemplateHTML+' => '',
'Core:AttributeDateTime' => 'Data/ora',
'Core:AttributeDateTime+' => '',
'Core:AttributeDate' => 'Data',
'Core:AttributeDate+' => '',
'Core:AttributeDeadline' => 'Scadenza',
'Core:AttributeDeadline+' => '',
'Core:AttributeExternalKey' => 'Chiave esterna',
'Core:AttributeExternalKey+' => '',
'Core:AttributeExternalField' => 'Campo esterno',
'Core:AttributeExternalField+' => '',
'Core:AttributeURL' => 'URL',
'Core:AttributeURL+' => '',
'Core:AttributeBlob' => 'Blob',
'Core:AttributeBlob+' => '',
'Core:AttributeOneWayPassword' => 'Password unidierzionale',
'Core:AttributeOneWayPassword+' => '',
'Core:AttributeTable' => 'Tabella',
'Core:AttributeTable+' => '',
'Core:AttributePropertySet' => 'Proprietà',
'Core:AttributePropertySet+' => '',
'Class:CMDBChangeOp/Attribute:date' => 'data',
'Class:CMDBChangeOp/Attribute:date+' => '',
'Class:CMDBChangeOp/Attribute:userinfo' => 'utente',
'Class:CMDBChangeOp/Attribute:userinfo+' => '',
'Change:ObjectCreated' => 'Oggetto creato',
'Change:ObjectDeleted' => 'Oggetto cancellato',
'Change:ObjectModified' => 'Object modificato',
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s imposatato a %2$s (valore precendente: %3$s)',
'Change:AttName_SetTo' => '%1$s impostato a %2$s~~',
'Change:Text_AppendedTo_AttName' => '%1$s allegato a %2$s~~',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s moficato, valore precendente: %2$s',
'Change:AttName_Changed' => '%1$s modificato',
'Change:AttName_EntryAdded' => '%1$s modificato, nuova entrata aggiunta.',
'Class:EventLoginUsage/Attribute:contact_name' => 'Nome Utente',
'Class:EventLoginUsage/Attribute:contact_name+' => '',
'Class:EventLoginUsage/Attribute:contact_email' => 'Email Utente',
'Class:EventLoginUsage/Attribute:contact_email+' => '',
'Class:Action' => 'Azione personalizzata',
'Class:Action+' => '',
'Class:Action/Attribute:name' => 'Nome',
'Class:Action/Attribute:name+' => '',
'Class:Action/Attribute:description' => 'Descrizione',
'Class:Action/Attribute:description+' => '',
'Class:Action/Attribute:status' => 'Stato',
'Class:Action/Attribute:status+' => '',
'Class:Action/Attribute:status/Value:test' => 'In fase di test',
'Class:Action/Attribute:status/Value:test+' => '',
'Class:Action/Attribute:status/Value:enabled' => 'In produzione',
'Class:Action/Attribute:status/Value:enabled+' => '',
'Class:Action/Attribute:status/Value:disabled' => 'Inattivo',
'Class:Action/Attribute:status/Value:disabled+' => '',
'Class:Action/Attribute:trigger_list' => 'Trigger Correlati',
'Class:Action/Attribute:trigger_list+' => '',
'Class:Action/Attribute:finalclass' => 'Tipo',
'Class:Action/Attribute:finalclass+' => '',
'Class:ActionNotification' => 'Notifica',
'Class:ActionNotification+' => '',
'Class:Trigger' => 'Trigger',
'Class:Trigger+' => '',
'Class:Trigger/Attribute:description' => 'Descrizione',
'Class:Trigger/Attribute:description+' => '',
'Class:Trigger/Attribute:action_list' => 'Azioni Triggerate',
'Class:Trigger/Attribute:action_list+' => '',
'Class:Trigger/Attribute:finalclass' => 'Tipo',
'Class:Trigger/Attribute:finalclass+' => '',
'Class:TriggerOnObject' => 'Trigger (classe dipendente)',
'Class:TriggerOnObject+' => '',
'Class:TriggerOnObject/Attribute:target_class' => 'Classe Target',
'Class:TriggerOnObject/Attribute:target_class+' => '',
'Class:TriggerOnStateChange' => 'Trigger (sul cambio di stato)',
'Class:TriggerOnStateChange+' => '',
'Class:TriggerOnStateChange/Attribute:state' => 'Stato',
'Class:TriggerOnStateChange/Attribute:state+' => '',
'Class:lnkTriggerAction/Attribute:action_name' => 'Azione',
'Class:lnkTriggerAction/Attribute:action_name+' => '',
'Class:lnkTriggerAction/Attribute:trigger_name' => 'Trigger',
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Nessuno',
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Solo Amministratore',
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'Tutti gli utenti autorizzati',
'SynchroDataSource:Description' => 'Descrizione',
'SynchroDataSource:Reconciliation' => 'Ricerca &amp; riconciliazione',
'SynchroDataSource:Deletion' => 'Regole di cancellazione',
'SynchroDataSource:Status' => 'Stato',
'SynchroDataSource:Information' => 'Informazione',
'SynchroDataSource:Definition' => 'Definizione',
'Core:SynchroAttributes' => 'Attributi',
'Core:SynchroStatus' => 'Stato',
'Core:Synchro:ErrorsLabel' => 'Errori',
'Core:Synchro:CreatedLabel' => 'Creato',
'Core:Synchro:ModifiedLabel' => 'Modificato',
'Core:Synchro:UnchangedLabel' => 'Non modificato',
'Core:Synchro:ReconciledErrorsLabel' => 'Errori',
'Core:Synchro:ReconciledLabel' => 'Reconciliato',
'Core:Synchro:ReconciledNewLabel' => 'Creato',
'Core:SynchroReconcile:Yes' => 'Si',
'Core:SynchroReconcile:No' => 'No',
'Core:SynchroUpdate:Yes' => 'Si',
'Core:SynchroUpdate:No' => 'No',
'Core:Synchro:LastestStatus' => 'Ultimo stato',
'Core:Synchro:History' => 'Storia della sincronizzazione',
'Core:Synchro:NeverRun' => 'Questa sincronizzazione non è mai stata eseguita. Nessun Log ancora...',
'Core:Synchro:SynchroEndedOn_Date' => 'L\'ultima sincronizzazione si è conclusa il %1$s.~~',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'La sincronizzazione è iniziata il $1$s è ancora in esecuzione...~~',
'Menu:DataSources' => 'Sorgente di sincronizzazione dei dati',
'Menu:DataSources+' => '',
'Core:Synchro:label_repl_ignored' => 'Ignorato(%1$s)',
'Core:Synchro:label_repl_disappeared' => 'Scomparso (%1$s)',
'Core:Synchro:label_repl_existing' => 'Esistente (%1$s)',
'Core:Synchro:label_repl_new' => 'Nuovo (%1$s)~~',
'Core:Synchro:label_obj_deleted' => 'Cancellato (%1$s)',
'Core:Synchro:label_obj_obsoleted' => 'Obsoleto (%1$s)',
'Core:Synchro:label_obj_disappeared_errors' => 'Errori (%1$s)',
'Core:Synchro:label_obj_disappeared_no_action' => 'Nessuna Azione (%1$s)',
'Core:Synchro:label_obj_unchanged' => 'Non modificato(%1$s)',
'Core:Synchro:label_obj_updated' => 'Aggiornato (%1$s)',
'Core:Synchro:label_obj_updated_errors' => 'Errori (%1$s)',
'Core:Synchro:label_obj_new_unchanged' => 'Non modificato (%1$s)',
'Core:Synchro:label_obj_new_updated' => 'Aggiornato (%1$s)',
'Core:Synchro:label_obj_created' => 'Creato (%1$s)',
'Core:Synchro:label_obj_new_errors' => 'Errori (%1$s)',
'Core:SynchroLogTitle' => '%1$s - %2$s~~',
'Core:Synchro:Nb_Replica' => 'Replica processata: %1$s',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Almeno una chiave riconciliazione deve essere specificata, o la policy di conciliazione deve essere quella di utilizzare la chiave primaria',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'Deve essere specificato un periodo di conservazione di cancellazione , dato che gli oggetti devono essere eliminati dopo essere contrassegnati come obsoleti ',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Oggetti obsoleti devono essere aggiornati, ma nessun aggiornamento è specificato',
'Core:SynchroReplica:PublicData' => 'Dati Pubblici',
'Core:SynchroReplica:PrivateDetails' => 'Dettagli Privati',
'Core:SynchroReplica:BackToDataSource' => 'Torna indietro alla sorgente di sincronizzazione dei dati: %1$s~~',
'Core:SynchroReplica:ListOfReplicas' => 'Lista della Replica',
'Core:SynchroAttExtKey:ReconciliationById' => 'id (Chiave Primaria)',
'Core:SynchroAtt:attcode' => 'Attributo',
'Core:SynchroAtt:attcode+' => '',
'Core:SynchroAtt:reconciliation' => 'Riconciliazione ?~~',
'Core:SynchroAtt:reconciliation+' => '',
'Core:SynchroAtt:update' => 'Aggiornamento ?~~',
'Core:SynchroAtt:update+' => '',
'Core:SynchroAtt:update_policy' => 'Policy di aggiornamento',
'Core:SynchroAtt:update_policy+' => '',
'Core:SynchroAtt:reconciliation_attcode' => 'Chiave di riconciliazione',
'Core:SynchroAtt:reconciliation_attcode+' => '',
'Core:SyncDataExchangeComment' => '(Scambio dati)',
'Core:Synchro:ListOfDataSources' => 'Lista delle sorgenti di dati:',
'Core:Synchro:LastSynchro' => 'Ultima sincronizzazione:',
'Core:Synchro:ThisObjectIsSynchronized' => 'Questo oggetto è sincronizzato con una sorgente esterna di dati',
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'L\'oggetti è stato <b>creato</b> da una sorgente esterna di dati %1$s~~',
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'L\'oggetti <b>può essere cancellato</b> da una sorgente esterna di dati %1$s~~',
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'Tu <b>non puoi cancellare l\'oggetto</b> perché è di proprietà della sorgente dati esterna %1$s~~',
'TitleSynchroExecution' => 'Esecuzione della sincronizzazione',
'Class:SynchroDataSource:DataTable' => 'Tabella del database: %1$s',
'Core:SyncDataSourceObsolete' => 'La fonte dei dati è contrassegnata come obsoleta. Operazione annullata',
'Core:SyncDataSourceAccessRestriction' => 'Solo amministratori o l\'utente specificato nella fonte dei dati può eseguire questa operazione. Operazione annullata',
'Core:SyncTooManyMissingReplicas' => 'Tutte le repliche sono mancanti dall\'importazione. Hai eseguito realmente l\'importazione? Operazione annullata',
'Core:Duration_Seconds' => '%1$ds',
'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds',
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$sec~~',
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sg %2$dh %3$dmin %4$ds~~',
));
?>
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Class:ActionEmail' => 'E-mail di notifica',
'Class:ActionEmail+' => '',
'Class:ActionEmail/Attribute:test_recipient' => 'Test destinatario',
'Class:ActionEmail/Attribute:test_recipient+' => '',
'Class:ActionEmail/Attribute:from' => 'Da',
'Class:ActionEmail/Attribute:from+' => '',
'Class:ActionEmail/Attribute:reply_to' => 'Rispondi A',
'Class:ActionEmail/Attribute:reply_to+' => '',
'Class:ActionEmail/Attribute:to' => 'A',
'Class:ActionEmail/Attribute:to+' => '',
'Class:ActionEmail/Attribute:cc' => 'Cc',
'Class:ActionEmail/Attribute:cc+' => '',
'Class:ActionEmail/Attribute:bcc' => 'BCC',
'Class:ActionEmail/Attribute:bcc+' => '',
'Class:ActionEmail/Attribute:subject' => 'Oggetto',
'Class:ActionEmail/Attribute:subject+' => '',
'Class:ActionEmail/Attribute:body' => 'corpo',
'Class:ActionEmail/Attribute:body+' => '',
'Class:ActionEmail/Attribute:importance' => 'priorità',
'Class:ActionEmail/Attribute:importance+' => '',
'Class:ActionEmail/Attribute:importance/Value:high' => 'alta',
'Class:ActionEmail/Attribute:importance/Value:high+' => '',
'Class:ActionEmail/Attribute:importance/Value:low' => 'bassa',
'Class:ActionEmail/Attribute:importance/Value:low+' => '',
'Class:ActionEmail/Attribute:importance/Value:normal' => 'normake',
'Class:ActionEmail/Attribute:importance/Value:normal+' => '',
'Class:TriggerOnStateEnter' => 'Trigger (sull\'entrare in uno stato)',
'Class:TriggerOnStateEnter+' => '',
'Class:TriggerOnStateLeave' => 'Trigger (sul lasciare uno stato)~~',
'Class:TriggerOnStateLeave+' => '',
'Class:TriggerOnObjectCreate' => 'Trigger (sulla creazione di un oggetto)~~',
'Class:TriggerOnObjectCreate+' => '',
'Class:lnkTriggerAction' => 'Azione/Trigger~~',
'Class:lnkTriggerAction+' => '',
'Class:lnkTriggerAction/Attribute:action_id' => 'Azione',
'Class:lnkTriggerAction/Attribute:action_id+' => '',
'Class:lnkTriggerAction/Attribute:trigger_id' => 'Trigger',
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
'Class:lnkTriggerAction/Attribute:order' => 'Ordine',
'Class:lnkTriggerAction/Attribute:order+' => '',
'Class:AsyncSendEmail' => 'Email (asincrona)',
'Class:AsyncSendEmail/Attribute:to' => 'A',
'Class:AsyncSendEmail/Attribute:subject' => 'Oggetto',
'Class:AsyncSendEmail/Attribute:body' => 'Corpo',
'Class:AsyncSendEmail/Attribute:header' => 'Intestazione',
'Class:CMDBChange' => 'Cambio',
'Class:CMDBChange+' => '',
'Class:CMDBChange/Attribute:date' => 'data',
'Class:CMDBChange/Attribute:date+' => '',
'Class:CMDBChange/Attribute:userinfo' => 'info varie',
'Class:CMDBChange/Attribute:userinfo+' => '',
'Class:CMDBChangeOp' => 'Operazione di Cambio',
'Class:CMDBChangeOp+' => '',
'Class:CMDBChangeOp/Attribute:change' => 'cambio',
'Class:CMDBChangeOp/Attribute:change+' => '',
'Class:CMDBChangeOp/Attribute:objclass' => 'oggetto della classe',
'Class:CMDBChangeOp/Attribute:objclass+' => '',
'Class:CMDBChangeOp/Attribute:objkey' => 'oggetto id',
'Class:CMDBChangeOp/Attribute:objkey+' => '',
'Class:CMDBChangeOp/Attribute:finalclass' => 'tipo',
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
'Class:CMDBChangeOpCreate' => 'creazione dell\'oggetto',
'Class:CMDBChangeOpCreate+' => '',
'Class:CMDBChangeOpDelete' => 'cancellazione dell\'oggetto',
'Class:CMDBChangeOpDelete+' => '',
'Class:CMDBChangeOpSetAttribute' => 'cambio dell\'oggetto',
'Class:CMDBChangeOpSetAttribute+' => '',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => 'Attributo',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => '',
'Class:CMDBChangeOpSetAttributeScalar' => 'cambio della proprietà',
'Class:CMDBChangeOpSetAttributeScalar+' => '',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'Valore precedente',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => '',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'Valore Nuovo',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => '',
'Class:CMDBChangeOpSetAttributeBlob' => 'modifica i dati',
'Class:CMDBChangeOpSetAttributeBlob+' => '',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'Dati precedenti',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => '',
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Password criptata',
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Valore Precedente',
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Encrypted Field~~',
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Valore Precedente',
'Class:CMDBChangeOpSetAttributeText' => 'modifica testo',
'Class:CMDBChangeOpSetAttributeText+' => '',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Dati precendenti',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => '',
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Log dei casi',
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Ultima entrata',
'Class:Event' => 'Log dell\'evento',
'Class:Event+' => '',
'Class:Event/Attribute:message' => 'Messaggio',
'Class:Event/Attribute:message+' => '',
'Class:Event/Attribute:date' => 'Data',
'Class:Event/Attribute:date+' => '',
'Class:Event/Attribute:userinfo' => 'Info Utente',
'Class:Event/Attribute:userinfo+' => '',
'Class:Event/Attribute:finalclass' => 'Tipo',
'Class:Event/Attribute:finalclass+' => '',
'Class:EventNotification' => 'Notifica dell\'evento',
'Class:EventNotification+' => '',
'Class:EventNotification/Attribute:trigger_id' => 'Trigger',
'Class:EventNotification/Attribute:trigger_id+' => '',
'Class:EventNotification/Attribute:action_id' => 'utente',
'Class:EventNotification/Attribute:action_id+' => '',
'Class:EventNotification/Attribute:object_id' => 'Oggetto id',
'Class:EventNotification/Attribute:object_id+' => '',
'Class:EventNotificationEmail' => 'Email caso di emissione',
'Class:EventNotificationEmail+' => '',
'Class:EventNotificationEmail/Attribute:to' => 'A',
'Class:EventNotificationEmail/Attribute:to+' => '',
'Class:EventNotificationEmail/Attribute:cc' => 'CC',
'Class:EventNotificationEmail/Attribute:cc+' => '',
'Class:EventNotificationEmail/Attribute:bcc' => 'BCC',
'Class:EventNotificationEmail/Attribute:bcc+' => '',
'Class:EventNotificationEmail/Attribute:from' => 'Da',
'Class:EventNotificationEmail/Attribute:from+' => '',
'Class:EventNotificationEmail/Attribute:subject' => 'Oggeto',
'Class:EventNotificationEmail/Attribute:subject+' => '',
'Class:EventNotificationEmail/Attribute:body' => 'Corpo',
'Class:EventNotificationEmail/Attribute:body+' => '',
'Class:EventIssue' => 'Evento Problema',
'Class:EventIssue+' => '',
'Class:EventIssue/Attribute:issue' => 'Problema',
'Class:EventIssue/Attribute:issue+' => '',
'Class:EventIssue/Attribute:impact' => 'Impatto',
'Class:EventIssue/Attribute:impact+' => '',
'Class:EventIssue/Attribute:page' => 'Pagina',
'Class:EventIssue/Attribute:page+' => '',
'Class:EventIssue/Attribute:arguments_post' => 'Argomenti inviati',
'Class:EventIssue/Attribute:arguments_post+' => '',
'Class:EventIssue/Attribute:arguments_get' => 'Argomenti URL',
'Class:EventIssue/Attribute:arguments_get+' => '',
'Class:EventIssue/Attribute:callstack' => 'Callstack',
'Class:EventIssue/Attribute:callstack+' => '',
'Class:EventIssue/Attribute:data' => 'Dati',
'Class:EventIssue/Attribute:data+' => '',
'Class:EventWebService' => 'Evento Servizio Web',
'Class:EventWebService+' => '',
'Class:EventWebService/Attribute:verb' => 'Verbo',
'Class:EventWebService/Attribute:verb+' => '',
'Class:EventWebService/Attribute:result' => 'Resulto',
'Class:EventWebService/Attribute:result+' => '',
'Class:EventWebService/Attribute:log_info' => 'Log delle info',
'Class:EventWebService/Attribute:log_info+' => '',
'Class:EventWebService/Attribute:log_warning' => 'Log dei warning',
'Class:EventWebService/Attribute:log_warning+' => '',
'Class:EventWebService/Attribute:log_error' => 'Log degli errori',
'Class:EventWebService/Attribute:log_error+' => '',
'Class:EventWebService/Attribute:data' => 'Dati',
'Class:EventWebService/Attribute:data+' => '',
'Class:EventLoginUsage' => 'Login di utilizzo',
'Class:EventLoginUsage+' => '',
'Class:EventLoginUsage/Attribute:user_id' => 'Login',
'Class:EventLoginUsage/Attribute:user_id+' => '',
'Class:SynchroDataSource' => 'Sorgente di sincronizzazione dei dati',
'Class:SynchroDataSource/Attribute:name' => 'Nome',
'Class:SynchroDataSource/Attribute:name+' => '',
'Class:SynchroDataSource/Attribute:description' => 'Descrizione',
'Class:SynchroDataSource/Attribute:status' => 'Stato',
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implementazione',
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsoleto',
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Produzione',
'Class:SynchroDataSource/Attribute:user_id' => 'Utente',
'Class:SynchroDataSource/Attribute:scope_class' => 'Classe Target',
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Campo di applicazione restrizione',
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Intervallo a pieno carico',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => '',
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Policy di riconciliazione',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Usa gli attributi',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Usa il campo chiave primaria',
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Azione su zero~~',
'Class:SynchroDataSource/Attribute:action_on_zero+' => '',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Crea',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Errore',
'Class:SynchroDataSource/Attribute:action_on_one' => 'Azione su uno',
'Class:SynchroDataSource/Attribute:action_on_one+' => '',
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Error',
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Aggiorna',
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Azione su molti',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => '',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Crea',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Errore',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Considera il primo (random?)',
'Class:SynchroDataSource/Attribute:delete_policy' => 'Policy di cancellazioen',
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Cancella',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignora',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Aggiorna',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Aggiorna e poi Cancella',
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Regole per l\'aggiornamento',
'Class:SynchroDataSource/Attribute:delete_policy_update+' => '',
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Durata di conservazione',
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => '',
'Class:SynchroDataSource/Attribute:attribute_list' => 'Lista degli attributi',
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'utenti autorizzati',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => '',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Solo Amministratore',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Tutti sono autorizzati a cancellare questi oggetti',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Nessuno',
'Class:SynchroDataSource/Attribute:url_icon' => 'Icona di collegamento ipertestuale',
'Class:SynchroDataSource/Attribute:url_icon+' => '',
'Class:SynchroDataSource/Attribute:url_application' => 'Collegamento ipertestuale all\'applicazione',
'Class:SynchroDataSource/Attribute:url_application+' => '',
'Class:SynchroAttribute' => 'Attributo di sincronizzazione',
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Sorgente sincronizzazione dati',
'Class:SynchroAttribute/Attribute:attcode' => 'Codice attributo',
'Class:SynchroAttribute/Attribute:update' => 'Aggiorna',
'Class:SynchroAttribute/Attribute:reconcile' => 'Rincocilia',
'Class:SynchroAttribute/Attribute:update_policy' => 'Policy di aggiornamento',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'Bloccato',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'Sbloccato',
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Inizializza se vuoto',
'Class:SynchroAttribute/Attribute:finalclass' => 'Classe',
'Class:SynchroAttExtKey' => 'Attributo di sincronizzazione (ExtKey)',
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Attributo di riconciliazione',
'Class:SynchroAttLinkSet' => 'Attributo di sincronizzazione (Linkset)',
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Separatore di righe',
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Separatore di attributi',
'Class:SynchroLog' => 'Log di sincronizzazione',
'Class:SynchroLog/Attribute:sync_source_id' => 'Sorgente di sincronizzazione dati',
'Class:SynchroLog/Attribute:start_date' => 'Data di inizio',
'Class:SynchroLog/Attribute:end_date' => 'Data di fine',
'Class:SynchroLog/Attribute:status' => 'Stato',
'Class:SynchroLog/Attribute:status/Value:completed' => 'Completo',
'Class:SynchroLog/Attribute:status/Value:error' => 'Errore',
'Class:SynchroLog/Attribute:status/Value:running' => 'Ancora in esecuzione',
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nb replica viste',
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nb replica totale',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nb oggetti cancellati',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nb di errore durante la cancellazione',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nb oggetti obsoleti',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nb di errori mentre obsoleta',
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nb oggetti creati',
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nb di errori durante la creazione',
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nb oggetti aggiornati',
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nb di errori durante l\'aggiornamento',
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nb di errori durante la riconcilazione',
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nb repliche scomparse',
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nb oggetti aggiornati',
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nb oggetti non modificati',
'Class:SynchroLog/Attribute:last_error' => 'Untimo errore',
'Class:SynchroLog/Attribute:traces' => 'Tracce',
'Class:SynchroReplica' => 'Replica sincronizzazione',
'Class:SynchroReplica/Attribute:sync_source_id' => 'Sorgente di sincronizzazione dati',
'Class:SynchroReplica/Attribute:dest_id' => 'Oggetto di destinazione (ID)~~',
'Class:SynchroReplica/Attribute:dest_class' => 'Tipo di destinazione',
'Class:SynchroReplica/Attribute:status_last_seen' => 'Ultimo visto',
'Class:SynchroReplica/Attribute:status' => 'Stato',
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modificato',
'Class:SynchroReplica/Attribute:status/Value:new' => 'Nuovo',
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Obsoleto',
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Orfano',
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Sincronizzato',
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Oggetto Creato ?',
'Class:SynchroReplica/Attribute:status_last_error' => 'Ultimo Errore',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Data di creazione',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Data ultima modifica',
'Class:appUserPreferences' => 'Preferenze utente',
'Class:appUserPreferences/Attribute:userid' => 'Utente',
'Class:appUserPreferences/Attribute:preferences' => 'Preferenze',
'Core:AttributeLinkedSet' => 'Array di oggetti',
'Core:AttributeLinkedSet+' => '',
'Core:AttributeLinkedSetIndirect' => 'Array di oggetti (N-N)',
'Core:AttributeLinkedSetIndirect+' => '',
'Core:AttributeInteger' => 'Integero',
'Core:AttributeInteger+' => '',
'Core:AttributeDecimal' => 'Decimale',
'Core:AttributeDecimal+' => '',
'Core:AttributeBoolean' => 'Booleano',
'Core:AttributeBoolean+' => '',
'Core:AttributeString' => 'Stringa',
'Core:AttributeString+' => '',
'Core:AttributeClass' => 'Classe',
'Core:AttributeClass+' => '',
'Core:AttributeApplicationLanguage' => 'Linguaggio Utente',
'Core:AttributeApplicationLanguage+' => '',
'Core:AttributeFinalClass' => 'Classe (auto)',
'Core:AttributeFinalClass+' => '',
'Core:AttributePassword' => 'Password',
'Core:AttributePassword+' => '',
'Core:AttributeEncryptedString' => 'Stringa criptata',
'Core:AttributeEncryptedString+' => '',
'Core:AttributeText' => 'Testo',
'Core:AttributeText+' => '',
'Core:AttributeHTML' => 'HTML',
'Core:AttributeHTML+' => '',
'Core:AttributeEmailAddress' => 'Indirizzo Email',
'Core:AttributeEmailAddress+' => '',
'Core:AttributeIPAddress' => 'Indirizzo IP',
'Core:AttributeIPAddress+' => '',
'Core:AttributeOQL' => 'OQL',
'Core:AttributeOQL+' => '',
'Core:AttributeEnum' => 'Enum',
'Core:AttributeEnum+' => '',
'Core:AttributeTemplateString' => 'Stringa Template',
'Core:AttributeTemplateString+' => '',
'Core:AttributeTemplateText' => 'Testo Template',
'Core:AttributeTemplateText+' => '',
'Core:AttributeTemplateHTML' => 'HTML Template',
'Core:AttributeTemplateHTML+' => '',
'Core:AttributeDateTime' => 'Data/ora',
'Core:AttributeDateTime+' => '',
'Core:AttributeDate' => 'Data',
'Core:AttributeDate+' => '',
'Core:AttributeDeadline' => 'Scadenza',
'Core:AttributeDeadline+' => '',
'Core:AttributeExternalKey' => 'Chiave esterna',
'Core:AttributeExternalKey+' => '',
'Core:AttributeExternalField' => 'Campo esterno',
'Core:AttributeExternalField+' => '',
'Core:AttributeURL' => 'URL',
'Core:AttributeURL+' => '',
'Core:AttributeBlob' => 'Blob',
'Core:AttributeBlob+' => '',
'Core:AttributeOneWayPassword' => 'Password unidierzionale',
'Core:AttributeOneWayPassword+' => '',
'Core:AttributeTable' => 'Tabella',
'Core:AttributeTable+' => '',
'Core:AttributePropertySet' => 'Proprietà',
'Core:AttributePropertySet+' => '',
'Class:CMDBChangeOp/Attribute:date' => 'data',
'Class:CMDBChangeOp/Attribute:date+' => '',
'Class:CMDBChangeOp/Attribute:userinfo' => 'utente',
'Class:CMDBChangeOp/Attribute:userinfo+' => '',
'Change:ObjectCreated' => 'Oggetto creato',
'Change:ObjectDeleted' => 'Oggetto cancellato',
'Change:ObjectModified' => 'Object modificato',
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s imposatato a %2$s (valore precendente: %3$s)',
'Change:AttName_SetTo' => '%1$s impostato a %2$s~~',
'Change:Text_AppendedTo_AttName' => '%1$s allegato a %2$s~~',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s moficato, valore precendente: %2$s',
'Change:AttName_Changed' => '%1$s modificato',
'Change:AttName_EntryAdded' => '%1$s modificato, nuova entrata aggiunta.',
'Class:EventLoginUsage/Attribute:contact_name' => 'Nome Utente',
'Class:EventLoginUsage/Attribute:contact_name+' => '',
'Class:EventLoginUsage/Attribute:contact_email' => 'Email Utente',
'Class:EventLoginUsage/Attribute:contact_email+' => '',
'Class:Action' => 'Azione personalizzata',
'Class:Action+' => '',
'Class:Action/Attribute:name' => 'Nome',
'Class:Action/Attribute:name+' => '',
'Class:Action/Attribute:description' => 'Descrizione',
'Class:Action/Attribute:description+' => '',
'Class:Action/Attribute:status' => 'Stato',
'Class:Action/Attribute:status+' => '',
'Class:Action/Attribute:status/Value:test' => 'In fase di test',
'Class:Action/Attribute:status/Value:test+' => '',
'Class:Action/Attribute:status/Value:enabled' => 'In produzione',
'Class:Action/Attribute:status/Value:enabled+' => '',
'Class:Action/Attribute:status/Value:disabled' => 'Inattivo',
'Class:Action/Attribute:status/Value:disabled+' => '',
'Class:Action/Attribute:trigger_list' => 'Trigger Correlati',
'Class:Action/Attribute:trigger_list+' => '',
'Class:Action/Attribute:finalclass' => 'Tipo',
'Class:Action/Attribute:finalclass+' => '',
'Class:ActionNotification' => 'Notifica',
'Class:ActionNotification+' => '',
'Class:Trigger' => 'Trigger',
'Class:Trigger+' => '',
'Class:Trigger/Attribute:description' => 'Descrizione',
'Class:Trigger/Attribute:description+' => '',
'Class:Trigger/Attribute:action_list' => 'Azioni Triggerate',
'Class:Trigger/Attribute:action_list+' => '',
'Class:Trigger/Attribute:finalclass' => 'Tipo',
'Class:Trigger/Attribute:finalclass+' => '',
'Class:TriggerOnObject' => 'Trigger (classe dipendente)',
'Class:TriggerOnObject+' => '',
'Class:TriggerOnObject/Attribute:target_class' => 'Classe Target',
'Class:TriggerOnObject/Attribute:target_class+' => '',
'Class:TriggerOnStateChange' => 'Trigger (sul cambio di stato)',
'Class:TriggerOnStateChange+' => '',
'Class:TriggerOnStateChange/Attribute:state' => 'Stato',
'Class:TriggerOnStateChange/Attribute:state+' => '',
'Class:lnkTriggerAction/Attribute:action_name' => 'Azione',
'Class:lnkTriggerAction/Attribute:action_name+' => '',
'Class:lnkTriggerAction/Attribute:trigger_name' => 'Trigger',
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Nessuno',
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Solo Amministratore',
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'Tutti gli utenti autorizzati',
'SynchroDataSource:Description' => 'Descrizione',
'SynchroDataSource:Reconciliation' => 'Ricerca &amp; riconciliazione',
'SynchroDataSource:Deletion' => 'Regole di cancellazione',
'SynchroDataSource:Status' => 'Stato',
'SynchroDataSource:Information' => 'Informazione',
'SynchroDataSource:Definition' => 'Definizione',
'Core:SynchroAttributes' => 'Attributi',
'Core:SynchroStatus' => 'Stato',
'Core:Synchro:ErrorsLabel' => 'Errori',
'Core:Synchro:CreatedLabel' => 'Creato',
'Core:Synchro:ModifiedLabel' => 'Modificato',
'Core:Synchro:UnchangedLabel' => 'Non modificato',
'Core:Synchro:ReconciledErrorsLabel' => 'Errori',
'Core:Synchro:ReconciledLabel' => 'Reconciliato',
'Core:Synchro:ReconciledNewLabel' => 'Creato',
'Core:SynchroReconcile:Yes' => 'Si',
'Core:SynchroReconcile:No' => 'No',
'Core:SynchroUpdate:Yes' => 'Si',
'Core:SynchroUpdate:No' => 'No',
'Core:Synchro:LastestStatus' => 'Ultimo stato',
'Core:Synchro:History' => 'Storia della sincronizzazione',
'Core:Synchro:NeverRun' => 'Questa sincronizzazione non è mai stata eseguita. Nessun Log ancora...',
'Core:Synchro:SynchroEndedOn_Date' => 'L\'ultima sincronizzazione si è conclusa il %1$s.~~',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'La sincronizzazione è iniziata il %1$s è ancora in esecuzione...~~',
'Menu:DataSources' => 'Sorgente di sincronizzazione dei dati',
'Menu:DataSources+' => '',
'Core:Synchro:label_repl_ignored' => 'Ignorato(%1$s)',
'Core:Synchro:label_repl_disappeared' => 'Scomparso (%1$s)',
'Core:Synchro:label_repl_existing' => 'Esistente (%1$s)',
'Core:Synchro:label_repl_new' => 'Nuovo (%1$s)~~',
'Core:Synchro:label_obj_deleted' => 'Cancellato (%1$s)',
'Core:Synchro:label_obj_obsoleted' => 'Obsoleto (%1$s)',
'Core:Synchro:label_obj_disappeared_errors' => 'Errori (%1$s)',
'Core:Synchro:label_obj_disappeared_no_action' => 'Nessuna Azione (%1$s)',
'Core:Synchro:label_obj_unchanged' => 'Non modificato(%1$s)',
'Core:Synchro:label_obj_updated' => 'Aggiornato (%1$s)',
'Core:Synchro:label_obj_updated_errors' => 'Errori (%1$s)',
'Core:Synchro:label_obj_new_unchanged' => 'Non modificato (%1$s)',
'Core:Synchro:label_obj_new_updated' => 'Aggiornato (%1$s)',
'Core:Synchro:label_obj_created' => 'Creato (%1$s)',
'Core:Synchro:label_obj_new_errors' => 'Errori (%1$s)',
'Core:SynchroLogTitle' => '%1$s - %2$s~~',
'Core:Synchro:Nb_Replica' => 'Replica processata: %1$s',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Almeno una chiave riconciliazione deve essere specificata, o la policy di conciliazione deve essere quella di utilizzare la chiave primaria',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'Deve essere specificato un periodo di conservazione di cancellazione , dato che gli oggetti devono essere eliminati dopo essere contrassegnati come obsoleti ',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Oggetti obsoleti devono essere aggiornati, ma nessun aggiornamento è specificato',
'Core:SynchroReplica:PublicData' => 'Dati Pubblici',
'Core:SynchroReplica:PrivateDetails' => 'Dettagli Privati',
'Core:SynchroReplica:BackToDataSource' => 'Torna indietro alla sorgente di sincronizzazione dei dati: %1$s~~',
'Core:SynchroReplica:ListOfReplicas' => 'Lista della Replica',
'Core:SynchroAttExtKey:ReconciliationById' => 'id (Chiave Primaria)',
'Core:SynchroAtt:attcode' => 'Attributo',
'Core:SynchroAtt:attcode+' => '',
'Core:SynchroAtt:reconciliation' => 'Riconciliazione ?~~',
'Core:SynchroAtt:reconciliation+' => '',
'Core:SynchroAtt:update' => 'Aggiornamento ?~~',
'Core:SynchroAtt:update+' => '',
'Core:SynchroAtt:update_policy' => 'Policy di aggiornamento',
'Core:SynchroAtt:update_policy+' => '',
'Core:SynchroAtt:reconciliation_attcode' => 'Chiave di riconciliazione',
'Core:SynchroAtt:reconciliation_attcode+' => '',
'Core:SyncDataExchangeComment' => '(Scambio dati)',
'Core:Synchro:ListOfDataSources' => 'Lista delle sorgenti di dati:',
'Core:Synchro:LastSynchro' => 'Ultima sincronizzazione:',
'Core:Synchro:ThisObjectIsSynchronized' => 'Questo oggetto è sincronizzato con una sorgente esterna di dati',
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'L\'oggetti è stato <b>creato</b> da una sorgente esterna di dati %1$s~~',
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'L\'oggetti <b>può essere cancellato</b> da una sorgente esterna di dati %1$s~~',
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'Tu <b>non puoi cancellare l\'oggetto</b> perché è di proprietà della sorgente dati esterna %1$s~~',
'TitleSynchroExecution' => 'Esecuzione della sincronizzazione',
'Class:SynchroDataSource:DataTable' => 'Tabella del database: %1$s',
'Core:SyncDataSourceObsolete' => 'La fonte dei dati è contrassegnata come obsoleta. Operazione annullata',
'Core:SyncDataSourceAccessRestriction' => 'Solo amministratori o l\'utente specificato nella fonte dei dati può eseguire questa operazione. Operazione annullata',
'Core:SyncTooManyMissingReplicas' => 'Tutte le repliche sono mancanti dall\'importazione. Hai eseguito realmente l\'importazione? Operazione annullata',
'Core:Duration_Seconds' => '%1$ds',
'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds',
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$sec~~',
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sg %2$dh %3$dmin %4$ds~~',
));
?>

File diff suppressed because it is too large Load Diff

View File

@@ -47,7 +47,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'Core:AttributeClass+' => 'クラス',
'Core:AttributeApplicationLanguage' => '使用言語',
'Core:AttributeApplicationLanguage+' => '言語・国別 (EN US)',
'Core:AttributeApplicationLanguage+' => '言語・国別 (JA JP)',
'Core:AttributeFinalClass' => 'クラス (自動)',
'Core:AttributeFinalClass+' => 'オブジェクトの実クラス (コアで自動的に生成される)',
@@ -85,14 +85,38 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'Core:AttributeTemplateHTML' => 'テンプレートHTML',
'Core:AttributeTemplateHTML+' => 'プレースホルダを含むHTML',
'Core:AttributeWikiText' => 'Wikiアーティクル',
'Core:AttributeWikiText+' => 'Wikiフォーマット済みテキスト',
'Core:AttributeDateTime' => '日付/時刻',
'Core:AttributeDateTime+' => '日付と時刻(年-月-日 hh:mm:ss)',
'Core:AttributeDateTime?SmartSearch' => '
<p>
Date format:<br/>
<b>yyyy-mm-dd hh:mm:ss</b><br/>
例: 2011-07-19 18:40:00
</p>
<p>
Operators:<br/>
<b>&gt;</b><em>日付</em><br/>
<b>&lt;</b><em>日付</em><br/>
<b>[</b><em>日付</em>,<em>日付</em><b>]</b>
</p>
<p>
もし、時刻がなければ、規定値 00:00:00となります。
</p>',
'Core:AttributeDate' => '日付',
'Core:AttributeDate+' => '日付 (年-月-日)',
'Core:AttributeDate?SmartSearch' => '
<p>
日付フォーマット:<br/>
<b>yyyy-mm-dd</b><br/>
例: 2011-07-19
</p>
<p>
演算子:<br/>
<b>&gt;</b><em>日付</em><br/>
<b>&lt;</b><em>日付</em><br/>
<b>[</b><em>日付</em>,<em>日付</em><b>]</b>
</p>',
'Core:AttributeDeadline' => '締切',
'Core:AttributeDeadline+' => '日付, 現在時刻からの相対表示',
@@ -107,7 +131,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'Core:AttributeURL+' => '絶対URLもしくは相対URLのテキスト文字列',
'Core:AttributeBlob' => 'Blob',
'Core:AttributeBlob+' => '任意のバイナリコンテンツ(ドキュメント)',
'Core:AttributeBlob+' => '任意のバイナリコンテンツ(文書)',
'Core:AttributeOneWayPassword' => '一方向パスワード',
'Core:AttributeOneWayPassword+' => '一方向暗号化(ハッシュ)パスワード',
@@ -117,8 +141,14 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'Core:AttributePropertySet' => 'プロパティ',
'Core:AttributePropertySet+' => '型づけされていないプロパティのリスト(名前とバリュー)',
));
'Core:AttributeFriendlyName' => 'Friendly name',
'Core:AttributeFriendlyName+' => 'Attribute created automatically ; the friendly name is computed after several attributes',
'Core:FriendlyName-Label' => 'Name',
'Core:FriendlyName-Description' => 'Friendly name',
));
//////////////////////////////////////////////////////////////////////
// Classes in 'core/cmdb'
@@ -155,7 +185,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:CMDBChangeOp/Attribute:objclass+' => 'オブジェクトクラス',
'Class:CMDBChangeOp/Attribute:objkey' => 'オブジェクトID',
'Class:CMDBChangeOp/Attribute:objkey+' => 'オブジェクトID',
'Class:CMDBChangeOp/Attribute:finalclass' => '',
'Class:CMDBChangeOp/Attribute:finalclass' => 'タイプ',
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
));
@@ -164,8 +194,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:CMDBChangeOpCreate' => 'オブジェクト成',
'Class:CMDBChangeOpCreate+' => 'オブジェクト成履歴',
'Class:CMDBChangeOpCreate' => 'オブジェクト成',
'Class:CMDBChangeOpCreate+' => 'オブジェクト成履歴',
));
//
@@ -204,11 +234,13 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Change:ObjectCreated' => 'オブジェクトを生成しました',
'Change:ObjectDeleted' => 'オブジェクトを削除しました',
'Change:ObjectModified' => 'オブジェクトを更新しました',
'Change:ObjectModified' => 'オブジェクトを修正しました',
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$sを%2$sに設定しました (変更前の値: %3$s)',
'Change:AttName_SetTo' => '%1$s は %2$sにセットされました。', // '%1$s set to %2$s',
'Change:Text_AppendedTo_AttName' => '%1$sを%2$sに追加しました',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$sを更しました。更新前の値: %2$s',
'Change:AttName_Changed' => '%1$sを更しました',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$sを更しました。更新前の値: %2$s',
'Change:AttName_Changed' => '%1$sを更しました',
'Change:AttName_EntryAdded' => '%1$s は、修正されました。新しいエントリーが追加されました。',
));
//
@@ -218,8 +250,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:CMDBChangeOpSetAttributeBlob' => 'データ変更',
'Class:CMDBChangeOpSetAttributeBlob+' => 'データ変更履歴',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => '変更前のデータ', //'Previous data',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => 'この属性の以前の内容', //'previous contents of the attribute',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => '前のデータ',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => 'この属性の以前の内容',
));
//
@@ -227,10 +259,10 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:CMDBChangeOpSetAttributeText' => 'テキストの変更', //'text change',
'Class:CMDBChangeOpSetAttributeText+' => 'テキストの変更履歴', //'text change tracking',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => '以前の内容', //'Previous data',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => 'この属性の以前の内容', //'previous contents of the attribute',
'Class:CMDBChangeOpSetAttributeText' => 'テキストの変更',
'Class:CMDBChangeOpSetAttributeText+' => 'テキストの変更履歴',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => '以前の内容',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => 'この属性の以前の内容',
));
//
@@ -238,15 +270,15 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:Event' => 'ログイベント',// 'Log Event',
'Class:Event+' => 'アプリケーション内部イベント', //'An application internal event',
'Class:Event/Attribute:message' => 'メッセージ', //'message',
'Class:Event/Attribute:message+' => 'イベント概略', //'short description of the event',
'Class:Event/Attribute:date' => '日付', //'date',
'Class:Event/Attribute:date+' => '変更が記録された日時', //'date and time at which the changes have been recorded',
'Class:Event/Attribute:userinfo' => 'ユーザ情報', //'user info',
'Class:Event/Attribute:userinfo+' => 'このイベントをトリガーアクションを起こすユーザの識別', //'identification of the user that was doing the action that triggered this event',
'Class:Event/Attribute:finalclass' => '', //'type',
'Class:Event' => 'ログイベント',
'Class:Event+' => 'アプリケーション内部イベント',
'Class:Event/Attribute:message' => 'メッセージ',
'Class:Event/Attribute:message+' => 'イベントの短い説明',
'Class:Event/Attribute:date' => '日付',
'Class:Event/Attribute:date+' => '変更が記録された日時',
'Class:Event/Attribute:userinfo' => 'ユーザ情報',
'Class:Event/Attribute:userinfo+' => 'このイベントをトリガーしたアクションを行ったユーザ',
'Class:Event/Attribute:finalclass' => 'タイプ',
'Class:Event/Attribute:finalclass+' => '',
));
@@ -255,13 +287,13 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:EventNotification' => '通知イベント', // 'Notification event',
'Class:EventNotification+' => '創出された通知のトレース', //'Trace of a notification that has been sent',
'Class:EventNotification/Attribute:trigger_id' => 'トリガー', //'Trigger',
'Class:EventNotification/Attribute:trigger_id+' => 'ユーザアカウント', //'user account',
'Class:EventNotification/Attribute:action_id' => 'ユーザ', //'user',
'Class:EventNotification/Attribute:action_id+' => 'ユーザアカウント', //'user account',
'Class:EventNotification/Attribute:object_id' => 'オブジェクトID', //'Object id',
'Class:EventNotification' => '通知イベント',
'Class:EventNotification+' => '送信された通知のトレース',
'Class:EventNotification/Attribute:trigger_id' => 'トリガー',
'Class:EventNotification/Attribute:trigger_id+' => 'ユーザアカウント',
'Class:EventNotification/Attribute:action_id' => 'ユーザ',
'Class:EventNotification/Attribute:action_id+' => 'ユーザアカウント',
'Class:EventNotification/Attribute:object_id' => 'オブジェクトID',
'Class:EventNotification/Attribute:object_id+' => 'オブジェクトID(トリガーでクラスが定義済み?)', //'object id (class defined by the trigger ?)',
));
@@ -269,8 +301,9 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
// Class: EventNotificationEmail
//
Dict::Add('JA JP', 'Japanese', '日本語', array('Class:EventNotificationEmail' => 'メール送出イベント', //'Email emission event',
'Class:EventNotificationEmail+' => '送出されたメールのトレース',//Trace of an email that has been sent',
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:EventNotificationEmail' => 'メール送出イベント',
'Class:EventNotificationEmail+' => '送出されたメールのトレース',
'Class:EventNotificationEmail/Attribute:to' => 'TO',
'Class:EventNotificationEmail/Attribute:to+' => 'TO',
'Class:EventNotificationEmail/Attribute:cc' => 'CC',
@@ -278,34 +311,34 @@ Dict::Add('JA JP', 'Japanese', '日本語', array('Class:EventNotificationEmail'
'Class:EventNotificationEmail/Attribute:bcc' => 'BCC',
'Class:EventNotificationEmail/Attribute:bcc+' => 'BCC',
'Class:EventNotificationEmail/Attribute:from' => 'From',
'Class:EventNotificationEmail/Attribute:from+' => 'メール送信者', //'Sender of the message',
'Class:EventNotificationEmail/Attribute:from+' => 'メール送信者',
'Class:EventNotificationEmail/Attribute:subject' => 'Subject',
'Class:EventNotificationEmail/Attribute:subject+' => 'Subject',
'Class:EventNotificationEmail/Attribute:subject+' => '件名',
'Class:EventNotificationEmail/Attribute:body' => 'Body',
'Class:EventNotificationEmail/Attribute:body+' => 'Body',
'Class:EventNotificationEmail/Attribute:body+' => '本文',
));
//
// Class: EventIssue
//
Dict::Add('EN US', 'English', 'English', array(
'Class:EventIssue' => 'イシューイベント', //'Issue event',
'Class:EventIssue+' => 'イシュー(警告、エラーetc)のトレース', //'Trace of an issue (warning, error, etc.)',
'Class:EventIssue/Attribute:issue' => 'イシュー', //'Issue',
'Class:EventIssue/Attribute:issue+' => '何が起こったか', //'What happened',
'Class:EventIssue/Attribute:impact' => 'インパクト', //'Impact',
'Class:EventIssue/Attribute:impact+' => 'その結果', //'What are the consequences',
'Class:EventIssue/Attribute:page' => 'ページ', //'Page',
'Class:EventIssue/Attribute:page+' => 'HTTPエントリポイント', //'HTTP entry point',
'Class:EventIssue/Attribute:arguments_post' => 'POSTされた引数', //'Posted arguments',
'Class:EventIssue/Attribute:arguments_post+' => 'HTTP POST引数', //'HTTP POST arguments',
'Class:EventIssue/Attribute:arguments_get' => 'URLパラメータ', //'URL arguments',
'Class:EventIssue/Attribute:arguments_get+' => 'HTTP GETパラメータ', //'HTTP GET arguments',
'Class:EventIssue/Attribute:callstack' => 'コールスタック', //'Callstack',
'Class:EventIssue/Attribute:callstack+' => 'スタックをコールする', //'Call stack',
'Class:EventIssue/Attribute:data' => 'データ', //'Data',
'Class:EventIssue/Attribute:data+' => '詳細情報', //'More information',
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:EventIssue' => '課題',
'Class:EventIssue+' => '課題(警告、エラーetc)のトレース',
'Class:EventIssue/Attribute:issue' => '課題',
'Class:EventIssue/Attribute:issue+' => '課題',
'Class:EventIssue/Attribute:impact' => 'インパクト',
'Class:EventIssue/Attribute:impact+' => 'その結果',
'Class:EventIssue/Attribute:page' => 'ページ',
'Class:EventIssue/Attribute:page+' => 'HTTPエントリポイント',
'Class:EventIssue/Attribute:arguments_post' => 'POSTされた引数',
'Class:EventIssue/Attribute:arguments_post+' => 'HTTP POST引数',
'Class:EventIssue/Attribute:arguments_get' => 'URLパラメータ',
'Class:EventIssue/Attribute:arguments_get+' => 'HTTP GETパラメータ',
'Class:EventIssue/Attribute:callstack' => 'コールスタック',
'Class:EventIssue/Attribute:callstack+' => 'スタックをコールする',
'Class:EventIssue/Attribute:data' => 'データ',
'Class:EventIssue/Attribute:data+' => '追加情報',
));
//
@@ -313,20 +346,35 @@ Dict::Add('EN US', 'English', 'English', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:EventWebService' => 'ウェブサービスイベント', //'Web service event',
'Class:EventWebService+' => 'ウェブサービス呼出のYトレース', //'Trace of an web service call',
'Class:EventWebService/Attribute:verb' => '動', //'Verb',
'Class:EventWebService/Attribute:verb+' => '操作名', //'Name of the operation',
'Class:EventWebService/Attribute:result' => '結果', //'Result',
'Class:EventWebService/Attribute:result+' => '総体的な成功/失敗', //'Overall success/failure',
'Class:EventWebService/Attribute:log_info' => 'インフォログ', //'Info log',
'Class:EventWebService/Attribute:log_info+' => 'インフォログの結果', //'Result info log',
'Class:EventWebService/Attribute:log_warning' => 'ウォーニンググ', //'Warning log',
'Class:EventWebService/Attribute:log_warning+' => 'ウォーニングログ結果', //'Result warning log',
'Class:EventWebService/Attribute:log_error' => 'エラーログ', //'Error log',
'Class:EventWebService/Attribute:log_error+' => 'エラーログ結果', //'Result error log',
'Class:EventWebService/Attribute:data' => 'データ', //'Data',
'Class:EventWebService/Attribute:data+' => 'データ結果', //'Result data',
'Class:EventWebService' => 'ウェブサービスイベント',
'Class:EventWebService+' => 'ウェブサービス呼出のトレース',
'Class:EventWebService/Attribute:verb' => '動',
'Class:EventWebService/Attribute:verb+' => '操作名',
'Class:EventWebService/Attribute:result' => '結果',
'Class:EventWebService/Attribute:result+' => '総体的な成功/失敗',
'Class:EventWebService/Attribute:log_info' => 'インフォログ',
'Class:EventWebService/Attribute:log_info+' => 'インフォログの結果',
'Class:EventWebService/Attribute:log_warning' => 'ーニンググ',
'Class:EventWebService/Attribute:log_warning+' => 'ーニングログ結果',
'Class:EventWebService/Attribute:log_error' => 'エラーログ',
'Class:EventWebService/Attribute:log_error+' => 'エラーログ結果',
'Class:EventWebService/Attribute:data' => 'データ',
'Class:EventWebService/Attribute:data+' => '結果データ',
));
//
// Class: EventLoginUsage
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:EventLoginUsage' => 'ログイン方法',
'Class:EventLoginUsage+' => 'アプリケーションへ接続します。',
'Class:EventLoginUsage/Attribute:user_id' => 'ログイン',
'Class:EventLoginUsage/Attribute:user_id+' => 'ログイン',
'Class:EventLoginUsage/Attribute:contact_name' => 'ユーザ名',
'Class:EventLoginUsage/Attribute:contact_name+' => 'ユーザ名',
'Class:EventLoginUsage/Attribute:contact_email' => 'ユーザのEmail',
'Class:EventLoginUsage/Attribute:contact_email+' => 'ユーザの電子メールアドレス',
));
//
@@ -334,24 +382,24 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:Action' => 'カスタムアクション', //'Custom Action',
'Class:Action+' => 'ユーザ定義アクション', //'User defined action',
'Class:Action/Attribute:name' => '名前', //'Name',
'Class:Action' => 'カスタムアクション',
'Class:Action+' => 'ユーザ定義アクション',
'Class:Action/Attribute:name' => '名前',
'Class:Action/Attribute:name+' => '',
'Class:Action/Attribute:description' => '概要', //'Description',
'Class:Action/Attribute:description' => '説明',
'Class:Action/Attribute:description+' => '',
'Class:Action/Attribute:status' => 'ステータス', //'Status',
'Class:Action/Attribute:status+' => '製品化済み、あるいは?', //'In production or ?',
'Class:Action/Attribute:status/Value:test' => 'テスト済み', //'Being tested',
'Class:Action/Attribute:status/Value:test+' => 'テスト済み', //'Being tested',
'Class:Action/Attribute:status/Value:enabled' => '製品化済み', //'In production',
'Class:Action/Attribute:status/Value:enabled+' => '製品化済み', //'In production',
'Class:Action/Attribute:status/Value:disabled' => '非アクティブ', //'Inactive',
'Class:Action/Attribute:status/Value:disabled+' => '非アクティブ', //'Inactive',
'Class:Action/Attribute:trigger_list' => '関連トリガ', //'Related Triggers',
'Class:Action/Attribute:trigger_list+' => 'このアクションにリンクされたトリガ', //'Triggers linked to this action',
'Class:Action/Attribute:finalclass' => '', //'Type',
'Class:Action/Attribute:finalclass+' => '',
'Class:Action/Attribute:status' => '状態',
'Class:Action/Attribute:status+' => '稼働中、あるいは?',
'Class:Action/Attribute:status/Value:test' => 'テスト',
'Class:Action/Attribute:status/Value:test+' => 'テスト',
'Class:Action/Attribute:status/Value:enabled' => '稼働中',
'Class:Action/Attribute:status/Value:enabled+' => '稼働中',
'Class:Action/Attribute:status/Value:disabled' => '非アクティブ',
'Class:Action/Attribute:status/Value:disabled+' => '非アクティブ',
'Class:Action/Attribute:trigger_list' => '関連トリガ',
'Class:Action/Attribute:trigger_list+' => 'このアクションにリンクされたトリガ',
'Class:Action/Attribute:finalclass' => 'タイプ',
'Class:Action/Attribute:finalclass+' => 'タイプ',
));
//
@@ -359,8 +407,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:ActionNotification' => 'ノーティフィケーション', //'Notification',
'Class:ActionNotification+' => 'ノーティフィケーション(抽象)', //'Notification (abstract)',
'Class:ActionNotification' => '通知',
'Class:ActionNotification+' => '通知(要約)',
));
//
@@ -368,31 +416,31 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:ActionEmail' => 'メール通知', //'Email notification',
'Class:ActionEmail' => 'メール通知',
'Class:ActionEmail+' => '',
'Class:ActionEmail/Attribute:test_recipient' => 'テストレシピ', //'Test recipient',
'Class:ActionEmail/Attribute:test_recipient+' => 'Detination in case status is set to "Test"',
'Class:ActionEmail/Attribute:test_recipient' => 'テストレシピ',
'Class:ActionEmail/Attribute:test_recipient+' => '状態がテストの場合の宛先',
'Class:ActionEmail/Attribute:from' => 'From',
'Class:ActionEmail/Attribute:from+' => 'Will be sent into the email header',
'Class:ActionEmail/Attribute:reply_to' => 'Reply to',
'Class:ActionEmail/Attribute:reply_to+' => 'Will be sent into the email header',
'Class:ActionEmail/Attribute:to' => 'To',
'Class:ActionEmail/Attribute:to+' => 'メールの宛先', //'Destination of the email',
'Class:ActionEmail/Attribute:to+' => 'メールの宛先',
'Class:ActionEmail/Attribute:cc' => 'Cc',
'Class:ActionEmail/Attribute:cc+' => 'Carbon Copy',
'Class:ActionEmail/Attribute:bcc' => 'bcc',
'Class:ActionEmail/Attribute:bcc+' => 'Blind Carbon Copy',
'Class:ActionEmail/Attribute:subject' => 'subject',
'Class:ActionEmail/Attribute:subject+' => 'メールのタイトル', //'Title of the email',
'Class:ActionEmail/Attribute:subject+' => 'メールの題名',
'Class:ActionEmail/Attribute:body' => 'body',
'Class:ActionEmail/Attribute:body+' => 'メールの本文', //'Contents of the email',
'Class:ActionEmail/Attribute:importance' => 'importance',
'Class:ActionEmail/Attribute:importance+' => '重要度フラグ', //'Importance flag',
'Class:ActionEmail/Attribute:importance/Value:low' => 'low',
'Class:ActionEmail/Attribute:body+' => 'メールの本文',
'Class:ActionEmail/Attribute:importance' => '重要度',
'Class:ActionEmail/Attribute:importance+' => '重要度フラグ',
'Class:ActionEmail/Attribute:importance/Value:low' => '',
'Class:ActionEmail/Attribute:importance/Value:low+' => 'low',
'Class:ActionEmail/Attribute:importance/Value:normal' => 'normal',
'Class:ActionEmail/Attribute:importance/Value:normal' => '',
'Class:ActionEmail/Attribute:importance/Value:normal+' => 'normal',
'Class:ActionEmail/Attribute:importance/Value:high' => 'high',
'Class:ActionEmail/Attribute:importance/Value:high' => '',
'Class:ActionEmail/Attribute:importance/Value:high+' => 'high',
));
@@ -401,14 +449,14 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:Trigger' => 'トリガー', //'Trigger',
'Class:Trigger+' => 'カスタムイベントヘッダ', //'Custom event handler',
'Class:Trigger/Attribute:description' => '概要', //'Description',
'Class:Trigger/Attribute:description+' => '1行概要', //'one line description',
'Class:Trigger/Attribute:action_list' => 'トリガされたアクション', //'Triggered actions',
'Class:Trigger/Attribute:action_list+' => 'トリガが発火した場合に動作するアクション', //'Actions performed when the trigger is activated',
'Class:Trigger/Attribute:finalclass' => '', //'Type',
'Class:Trigger/Attribute:finalclass+' => '',
'Class:Trigger' => 'トリガー',
'Class:Trigger+' => 'カスタムイベントハンドラー',
'Class:Trigger/Attribute:description' => '説明',
'Class:Trigger/Attribute:description+' => '1行の説明',
'Class:Trigger/Attribute:action_list' => 'トリガされたアクション',
'Class:Trigger/Attribute:action_list+' => 'トリガが発行された場合に動作するアクション',
'Class:Trigger/Attribute:finalclass' => 'タイプ',
'Class:Trigger/Attribute:finalclass+' => 'Type',
));
//
@@ -416,21 +464,30 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:TriggerOnObject' => 'トリガ(クラス依存)', //'Trigger (class dependent)',
'Class:TriggerOnObject+' => '指定オブジェクトのクラスのトリガ', //'Trigger on a given class of objects',
'Class:TriggerOnObject/Attribute:target_class' => 'ターゲットクラス', //'Target class',
'Class:TriggerOnObject' => 'トリガ(クラス依存)',
'Class:TriggerOnObject+' => 'オブジェクトの指定されたクラスのトリガ',
'Class:TriggerOnObject/Attribute:target_class' => 'ターゲットクラス',
'Class:TriggerOnObject/Attribute:target_class+' => '',
));
//
// Class: TriggerOnPortalUpdate
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:TriggerOnPortalUpdate' => 'トリガー(ポータルから更新された時)',
'Class:TriggerOnPortalUpdate+' => 'エンドユーザがポータルから更新した場合のトリガー',
));
//
// Class: TriggerOnStateChange
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:TriggerOnStateChange' => '(状態変の)トリガ', // Trigger (on state change)',
'Class:TriggerOnStateChange+' => 'オブジェクト状態変のトリガ', //'Trigger on object state change',
'Class:TriggerOnStateChange/Attribute:state' => '状態', //'State',
'Class:TriggerOnStateChange/Attribute:state+' => '',
'Class:TriggerOnStateChange' => '(状態変の)トリガ',
'Class:TriggerOnStateChange+' => 'オブジェクト状態変のトリガ',
'Class:TriggerOnStateChange/Attribute:state' => '状態',
'Class:TriggerOnStateChange/Attribute:state+' => 'State',
));
//
@@ -438,8 +495,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:TriggerOnStateEnter' => 'トリガ(ある状態に入る)', // 'Trigger (on entering a state)',
'Class:TriggerOnStateEnter+' => 'オブジェクト状態変更のトリガ: 入場', //'Trigger on object state change - entering',
'Class:TriggerOnStateEnter' => '入状態トリガー',
'Class:TriggerOnStateEnter+' => 'オブジェクト状態へ入る変化(エンター,on entering a state時のトリガー',
));
//
@@ -447,8 +504,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:TriggerOnStateLeave' => '(ある状態から退場する)トリガ', // 'Trigger (on leaving a state)',
'Class:TriggerOnStateLeave+' => 'オブジェクト状態変更のトリガ: 退場', //Trigger on object state change - leaving',
'Class:TriggerOnStateLeave' => '出状態トリガ',
'Class:TriggerOnStateLeave+' => 'オブジェクト状態から出る変化(リーブ,on leaving a state時のトリガー',
));
//
@@ -456,8 +513,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:TriggerOnObjectCreate' => '(オブジェクト生成の)トリガ', //Trigger (on object creation)',
'Class:TriggerOnObjectCreate+' => '指定されたクラスの(子クラスの)オブジェクト生成のトリガ', //Trigger on object creation of [a child class of] the given class',
'Class:TriggerOnObjectCreate' => 'オブジェクト作成トリガ',
'Class:TriggerOnObjectCreate+' => '指定されたクラスの(子クラスの)オブジェクト作成時のトリガ',
));
//
@@ -465,19 +522,237 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:lnkTriggerAction' => 'アクション/トリガ', //'Action/Trigger',
'Class:lnkTriggerAction+' => 'トリガとアクション間のリンク', //'Link between a trigger and an action',
'Class:lnkTriggerAction/Attribute:action_id' => 'アクション', //'Action',
'Class:lnkTriggerAction/Attribute:action_id+' => '実行されるべきアクション', //'The action to be executed',
'Class:lnkTriggerAction/Attribute:action_name' => 'アクション', //'Action',
'Class:lnkTriggerAction' => 'トリガ/アクション',
'Class:lnkTriggerAction+' => 'トリガとアクション間のリンク',
'Class:lnkTriggerAction/Attribute:action_id' => 'アクション',
'Class:lnkTriggerAction/Attribute:action_id+' => '実行されるアクション',
'Class:lnkTriggerAction/Attribute:action_name' => 'アクション',
'Class:lnkTriggerAction/Attribute:action_name+' => '',
'Class:lnkTriggerAction/Attribute:trigger_id' => 'トリガ', //'Trigger',
'Class:lnkTriggerAction/Attribute:trigger_id' => 'トリガ',
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
'Class:lnkTriggerAction/Attribute:trigger_name' => 'トリガ', //'Trigger',
'Class:lnkTriggerAction/Attribute:trigger_name' => 'トリガ',
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
'Class:lnkTriggerAction/Attribute:order' => '処理順序', //'Order',
'Class:lnkTriggerAction/Attribute:order+' => 'アクション実行順序', //'Actions execution order',
'Class:lnkTriggerAction/Attribute:order' => '順序',
'Class:lnkTriggerAction/Attribute:order+' => 'アクション実行順序',
));
//
// Synchro Data Source
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:SynchroDataSource/Attribute:name' => '名前',
'Class:SynchroDataSource/Attribute:name+' => '名前',
'Class:SynchroDataSource/Attribute:description' => '説明',
'Class:SynchroDataSource/Attribute:status' => '状態', //TODO: enum values
'Class:SynchroDataSource/Attribute:scope_class' => 'ターゲットクラス',
'Class:SynchroDataSource/Attribute:user_id' => 'ユーザ',
'Class:SynchroDataSource/Attribute:notify_contact_id' => '通知する連絡先',
'Class:SynchroDataSource/Attribute:notify_contact_id+' => 'エラーが発生した場合に通知する連絡先。',
'Class:SynchroDataSource/Attribute:url_icon' => 'アイコンのハイパーリンク',
'Class:SynchroDataSource/Attribute:url_icon+' => 'iTopが同期されたアプリケーションを示すハイパーリンク小さなイメージ',
'Class:SynchroDataSource/Attribute:url_application' => 'アプリケーションのハイパーリンク',
'Class:SynchroDataSource/Attribute:url_application+' => 'iTopが同期化された外部アプリケーションのiTopオブジェクトへのハイパーリンク該当する場合。可能なプレースホルダ: $this->attribute$ and $replica->primary_key$',
'Class:SynchroDataSource/Attribute:reconciliation_policy' => '調整ポリシー', //TODO enum values
'Class:SynchroDataSource/Attribute:full_load_periodicity' => '全データロードの間隔',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => '全データの完全な再ロードを最低ここに指定されている間隔で行う必要があります。',
'Class:SynchroDataSource/Attribute:action_on_zero' => '検索結果0件時のアクション',
'Class:SynchroDataSource/Attribute:action_on_zero+' => '検索結果としてオブジェクトが何も返さない場合に実行されるアクション',
'Class:SynchroDataSource/Attribute:action_on_one' => '検索結果1件時のアクション',
'Class:SynchroDataSource/Attribute:action_on_one+' => '検索結果として一つのみのオブジェクトが返されたときに実行されるアクション',
'Class:SynchroDataSource/Attribute:action_on_multiple' => '検索結果複数時のアクション',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => '検索結果として二つ以上のオブジェクトが返されたときに実行されるアクション',
'Class:SynchroDataSource/Attribute:user_delete_policy' => '許可されたユーザ',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => '同期されたオブジェクトの削除が許可されたユーザ',
// 'Class:SynchroDataSource/Attribute:user_delete_policy' => '許可されたユーザ', // double
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => '誰もいない',//'Nobody',
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => '管理者のみ',
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => '全ての許可されたユーザ',
'Class:SynchroDataSource/Attribute:delete_policy_update' => '更新ルール',
'Class:SynchroDataSource/Attribute:delete_policy_update+' => '構文: フィールド名:値; ...',
'Class:SynchroDataSource/Attribute:delete_policy_retention' => '保持時間',
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => '廃止されたオブジェクトを削除するまでに保持しておく時間',
'SynchroDataSource:Description' => '説明',
'SynchroDataSource:Reconciliation' => '検索と調整',
'SynchroDataSource:Deletion' => '削除ルール',
'SynchroDataSource:Status' => '状態',
'SynchroDataSource:Information' => 'インフォメーション',
'SynchroDataSource:Definition' => '定義',
'Core:SynchroAttributes' => '属性',
'Core:SynchroStatus' => '状態',
'Core:Synchro:ErrorsLabel' => 'エラー',
'Core:Synchro:CreatedLabel' => '作成',
'Core:Synchro:ModifiedLabel' => '修正',
'Core:Synchro:UnchangedLabel' => '無変更',
'Core:Synchro:ReconciledErrorsLabel' => 'エラー',
'Core:Synchro:ReconciledLabel' => '調整',
'Core:Synchro:ReconciledNewLabel' => '新',
'Core:SynchroReconcile:Yes' => 'はい',
'Core:SynchroReconcile:No' => 'いいえ',
'Core:SynchroUpdate:Yes' => 'はい',
'Core:SynchroUpdate:No' => 'いいえ',
'Core:Synchro:LastestStatus' => '最新の状態',
'Core:Synchro:History' => '同期履歴',
'Core:Synchro:NeverRun' => 'この同期は実行されたことがありません。ログはありません。',
'Core:Synchro:SynchroEndedOn_Date' => '最後の同期は %1$s に終了しました。',
'Core:Synchro:SynchroRunningStartedOn_Date' => '同期は %1$s に始まり、現在実行中です。',
'Menu:DataSources' => '同期データソース',
'Menu:DataSources+' => '全ての同期データソース',
'Core:Synchro:label_repl_ignored' => '無視 (%1$s)',
'Core:Synchro:label_repl_disappeared' => '消えた (%1$s)',
'Core:Synchro:label_repl_existing' => '存在 (%1$s)',
'Core:Synchro:label_repl_new' => '新しい (%1$s)',
'Core:Synchro:label_obj_deleted' => '削除 (%1$s)',
'Core:Synchro:label_obj_obsoleted' => '廃止 (%1$s)',
'Core:Synchro:label_obj_disappeared_errors' => 'エラー (%1$s)',
'Core:Synchro:label_obj_disappeared_no_action' => '何もしない (%1$s)',
'Core:Synchro:label_obj_unchanged' => '無変更 (%1$s)',
'Core:Synchro:label_obj_updated' => '更新 (%1$s)',
'Core:Synchro:label_obj_updated_errors' => 'エラー (%1$s)',
'Core:Synchro:label_obj_new_unchanged' => '無変更 (%1$s)',
'Core:Synchro:label_obj_new_updated' => '無変更 (%1$s)',
'Core:Synchro:label_obj_created' => '作成 (%1$s)',
'Core:Synchro:label_obj_new_errors' => 'エラー (%1$s)',
'Core:Synchro:History' => '同期履歴',
'Core:SynchroLogTitle' => '%1$s - %2$s',
'Core:Synchro:Nb_Replica' => 'レプリカプロセス: %1$s',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => '少なくとも一つの調整キーが必要です。または、調整ポリシーは主キーを使用しなければなりません。',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'オブジェクトは廃止としてマークされた後に削除されますので、削除の保存期間を指定する必要があります。',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => '廃止されたオブジェクトは更新されます、しかし、更新は指定されていません。',
'Core:SynchroReplica:PublicData' => 'パブリックデータ',
'Core:SynchroReplica:PrivateDetails' => 'プライベート詳細',
'Core:SynchroReplica:BackToDataSource' => '同期データソースへ戻る: %1$s',
'Core:SynchroReplica:ListOfReplicas' => 'レプリカのリスト',
'Core:SynchroAttExtKey:ReconciliationById' => 'id (主キー)',
'Core:SynchroAtt:attcode' => '属性',
'Core:SynchroAtt:attcode+' => 'オブジェクトのフィールド',
'Core:SynchroAtt:reconciliation' => '調整 ?',
'Core:SynchroAtt:reconciliation+' => '検索に使用',
'Core:SynchroAtt:update' => '更新 ?',
'Core:SynchroAtt:update+' => 'オブジェクトの更新のため使用',
'Core:SynchroAtt:update_policy' => '更新ポリシー',
'Core:SynchroAtt:update_policy+' => '更新されたフィールドの振る舞い',
'Core:SynchroAtt:reconciliation_attcode' => '調整キー',
'Core:SynchroAtt:reconciliation_attcode+' => '外部キー調整用の属性コード',
'Core:SyncDataExchangeComment' => '(データ同期)',
'Core:Synchro:ListOfDataSources' => 'データソースのリスト:',
'Core:Synchro:LastSynchro' => '最後の同期:',
'Core:Synchro:ThisObjectIsSynchronized' => 'このオブジェクトは、外部データソースと同期されます。',
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'このオブジェクトは、外部データソース%1$sにより<b>作成</b>されました。',
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'オブジェクトは、外部データソース%1$sにより削除可能です。',
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'このオブジェクトは、外部データソースに保持されているので削除できません。',
'TitleSynchroExecution' => '同期の実行',
'Class:SynchroDataSource:DataTable' => 'データベーステーブル: %1$s',
'Core:SyncDataSourceObsolete' => 'データソースは廃止とマークされています。操作はキャンセルされました。',
'Core:SyncDataSourceAccessRestriction' => '管理者またはデータ·ソースに指定されたユーザーのみ、この操作を実行することができます。操作はキャンセルされました。',
'Core:SyncTooManyMissingReplicas' => '暫くの間全てのレコードは変更されていません。(全てのオブジェクトが削除される可能性があります。)同期テーブルへ書き込むプロセスがまだ実行中であることを確認ください。操作は、キャンセルされました。',
'Core:SyncSplitModeCLIOnly' => 'CLIモードでの実行時のみチャンクで同期を実行することが出来ます。',
'Core:Synchro:ListReplicas_AllReplicas_Errors_Warnings' => '%1$s レプリカ、 %2$s エラー、 %3$s 警告。',
'Core:SynchroReplica:TargetObject' => '同期されたオブジェクト: %1$s',
'Class:AsyncSendEmail' => '電子メール (非同期)',
'Class:AsyncSendEmail/Attribute:to' => 'To',
'Class:AsyncSendEmail/Attribute:subject' => '件名',
'Class:AsyncSendEmail/Attribute:body' => '本文',
'Class:AsyncSendEmail/Attribute:header' => 'ヘッダー',
'Class:CMDBChangeOpSetAttributeOneWayPassword' => '暗号化パスワード',
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => '以前の値',
'Class:CMDBChangeOpSetAttributeEncrypted' => '暗号化フィールド',
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => '以前の値',
'Class:CMDBChangeOpSetAttributeCaseLog' => 'ケースログ',
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => '最後のエントリー',
'Class:SynchroDataSource' => '同期データソース',
'Class:SynchroDataSource/Attribute:status/Value:implementation' => '実装中',
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => '廃止済',
'Class:SynchroDataSource/Attribute:status/Value:production' => '稼働中',
'Class:SynchroDataSource/Attribute:scope_restriction' => '範囲の制限',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => '属性を使用',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => '主キーフィールドを使用',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => '作成',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'エラー',
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'エラー',
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => '更新',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => '作成',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'エラー',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => '最初を採用 (ランダム?)',
'Class:SynchroDataSource/Attribute:delete_policy' => '削除ポリシー',
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => '削除',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => '無視',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => '更新',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => '更新そして削除',
'Class:SynchroDataSource/Attribute:attribute_list' => '属性リスト',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => '管理者のみ',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => '誰でもがそのようなオブジェクトを削除出来ます。',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'nobody',
'Class:SynchroAttribute' => '同期属性',
'Class:SynchroAttribute/Attribute:sync_source_id' => '同期データソース',
'Class:SynchroAttribute/Attribute:attcode' => '属性コード',
'Class:SynchroAttribute/Attribute:update' => '更新',
'Class:SynchroAttribute/Attribute:reconcile' => '調整',
'Class:SynchroAttribute/Attribute:update_policy' => '更新ポリシー',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'ロック',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'アンロック',
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => '空の場合は、初期化',
'Class:SynchroAttribute/Attribute:finalclass' => 'クラス',
'Class:SynchroAttExtKey' => '同期属性 (外部キー)',
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => '調整属性',
'Class:SynchroAttLinkSet' => '同期属性 (リンクセット)',
'Class:SynchroAttLinkSet/Attribute:row_separator' => '行の区切り',
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => '属性区切り',
'Class:SynchroLog' => '同期ログ',
'Class:SynchroLog/Attribute:sync_source_id' => '同期データソース',
'Class:SynchroLog/Attribute:start_date' => '開始日',
'Class:SynchroLog/Attribute:end_date' => '終了日',
'Class:SynchroLog/Attribute:status' => '状態',
'Class:SynchroLog/Attribute:status/Value:completed' => '完了',
'Class:SynchroLog/Attribute:status/Value:error' => 'エラー',
'Class:SynchroLog/Attribute:status/Value:running' => '実行中',
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'のレプリカ ',
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'レプリカ合計 ',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'オブジェクト削除 ',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => '削除中のエラー ',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'オブジェクト廃止 ',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => '廃止中のエラー ',
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'オブジェクト作成 ',
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => '作成中のエラー ',
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'オブジェクト更新 ',
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => '更新中のエラー ',
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => '調整中のエラー ',
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'レプリカ消 ',
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => ' オブジェクトは更新されました',
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => ' オブジェクトは変更されていません',
'Class:SynchroLog/Attribute:last_error' => '最後のエラー',
'Class:SynchroLog/Attribute:traces' => 'トレース',
'Class:SynchroReplica' => '同期レプリカ',
'Class:SynchroReplica/Attribute:sync_source_id' => '同期データソース',
'Class:SynchroReplica/Attribute:dest_id' => '同期先オブジェクト (ID)',
'Class:SynchroReplica/Attribute:dest_class' => '同期先タイプ',
'Class:SynchroReplica/Attribute:status_last_seen' => 'ラストシーン',
'Class:SynchroReplica/Attribute:status' => '状態',
'Class:SynchroReplica/Attribute:status/Value:modified' => '修正済み',
'Class:SynchroReplica/Attribute:status/Value:new' => '新規',
'Class:SynchroReplica/Attribute:status/Value:obsolete' => '廃止',
'Class:SynchroReplica/Attribute:status/Value:orphan' => '孤立',
'Class:SynchroReplica/Attribute:status/Value:synchronized' => '同期済み',
'Class:SynchroReplica/Attribute:status_dest_creator' => 'オブジェクト作成 ?',
'Class:SynchroReplica/Attribute:status_last_error' => '最後のエラー',
'Class:SynchroReplica/Attribute:status_last_warning' => '警告',
'Class:SynchroReplica/Attribute:info_creation_date' => '作成日',
'Class:SynchroReplica/Attribute:info_last_modified' => '最終修正日',
'Class:appUserPreferences' => 'ユーザプリファレンス',
'Class:appUserPreferences/Attribute:userid' => 'ユーザ',
'Class:appUserPreferences/Attribute:preferences' => 'プリファレンス',
'Core:ExecProcess:Code1' => '間違ったコマンドまたはエラーで終了したコマンド(例えば、間違ったスクリプト名)',
'Core:ExecProcess:Code255' => 'PHP エラー (parsing, or runtime)',
));
//
// Attribute Duration
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Core:Duration_Seconds' => '%1$ds',
'Core:Duration_Minutes_Seconds' =>'%1$d分 %2$d秒',
'Core:Duration_Hours_Minutes_Seconds' => '%1$d時 %2$d分 %3$d秒',
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$s日 %2$d時 %3$d分 %4$d秒',
));
?>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -848,10 +848,14 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'Portal:Title' => 'Пользовательский iTop портал',
'Portal:Refresh' => 'Обновить',
'Portal:Back' => 'Назад',
'Portal:WelcomeUserOrg' => 'Welcome %1$s, from %2$s',
'Portal:ShowOngoing' => 'Show open requests',
'Portal:ShowClosed' => 'Show closed requests',
'Portal:CreateNewRequest' => 'Создать новый запрос',
'Portal:ChangeMyPassword' => 'Изменить мой пароль',
'Portal:Disconnect' => 'Отключить',
'Portal:OpenRequests' => 'Мои открытые запросы',
'Portal:ClosedRequests' => 'My closed requests',
'Portal:ResolvedRequests' => 'Мои решённые запросы',
'Portal:SelectService' => 'Выбери сервис из каталога:',
'Portal:PleaseSelectOneService' => 'Необходимо выбрать хотя-бы один сервис',
@@ -860,7 +864,10 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'Portal:DescriptionOfTheRequest' => 'Введи описание запроса:',
'Portal:TitleRequestDetailsFor_Request' => 'Подробности запроса %1$s:',
'Portal:NoOpenRequest' => 'Нет запросов в этой категории.',
'Portal:NoClosedRequest' => 'No request in this category',
'Portal:Button:ReopenTicket' => 'Reopen this ticket',
'Portal:Button:CloseTicket' => 'Закрыть этот "тикет"',
'Portal:Button:UpdateRequest' => 'Update the request',
'Portal:EnterYourCommentsOnTicket' => 'Введите ваши каментарии по решению этого "тикета":',
'Portal:ErrorNoContactForThisUser' => 'Ошибка: текющий пользователь не ассоциирован с Контактом/Человеком. Пожалуйста свяжитесь с вашим администратором.',

View File

@@ -847,10 +847,14 @@ Tetikleme gerçekleştiriğinde işlemler tanımlanan sıra numarası ile gerçe
'Portal:Title' => 'iTop Kullanıcı Portalı',
'Portal:Refresh' => 'Yenile',
'Portal:Back' => 'Geri',
'Portal:WelcomeUserOrg' => 'Welcome %1$s, from %2$s',
'Portal:ShowOngoing' => 'Show open requests',
'Portal:ShowClosed' => 'Show closed requests',
'Portal:CreateNewRequest' => 'Yeni istek yarat',
'Portal:ChangeMyPassword' => 'Şifre değiştir',
'Portal:Disconnect' => ıkış',
'Portal:OpenRequests' => 'Açık isteklerim',
'Portal:ClosedRequests' => 'My closed requests',
'Portal:ResolvedRequests' => 'Çözdüğüm istekler',
'Portal:SelectService' => 'Kataloğdan servis seçiniz:',
'Portal:PleaseSelectOneService' => 'Sevis seçiniz',
@@ -859,7 +863,10 @@ Tetikleme gerçekleştiriğinde işlemler tanımlanan sıra numarası ile gerçe
'Portal:DescriptionOfTheRequest' => 'İstek tanımlaması:',
'Portal:TitleRequestDetailsFor_Request' => 'İsteğin detayı %1$s:',
'Portal:NoOpenRequest' => 'Bu kategoride istek yok.',
'Portal:NoClosedRequest' => 'Bu kategoride istek yok.',
'Portal:Button:ReopenTicket' => 'Reopen this ticket',
'Portal:Button:CloseTicket' => 'Çağrıyı kapat',
'Portal:Button:UpdateRequest' => 'Update the request',
'Portal:EnterYourCommentsOnTicket' => 'İsteğin çözümüne yönelik açıklamalar:',
'Portal:ErrorNoContactForThisUser' => 'Hata: mevcut kullanıcının irtibat bilgisi yok. Sistem yöneticisi ile irtibata geçiniz.',

View File

@@ -846,10 +846,14 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Portal:Title' => 'iTop 用户门户',
'Portal:Refresh' => '刷新',
'Portal:Back' => '返回',
'Portal:WelcomeUserOrg' => 'Welcome %1$s, from %2$s',
'Portal:ShowOngoing' => 'Show open requests',
'Portal:ShowClosed' => 'Show closed requests',
'Portal:CreateNewRequest' => '创建一个新的请求',
'Portal:ChangeMyPassword' => '改变我的密码',
'Portal:Disconnect' => '断开',
'Portal:OpenRequests' => '我的待解决的请求',
'Portal:ClosedRequests' => 'My closed requests',
'Portal:ResolvedRequests' => '我的已解决的请求',
'Portal:SelectService' => '从类目中选择一个服务:',
'Portal:PleaseSelectOneService' => '请选择一个服务',
@@ -858,7 +862,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Portal:DescriptionOfTheRequest' => '输入您的请求描述:',
'Portal:TitleRequestDetailsFor_Request' => '请求明细内容 %1$s:',
'Portal:NoOpenRequest' => '该类目中没有请求.',
'Portal:NoClosedRequest' => 'No request in this category',
'Portal:Button:CloseTicket' => '关闭这个单据',
'Portal:Button:UpdateRequest' => 'Update the request',
'Portal:EnterYourCommentsOnTicket' => '输入您对于该单据解决情况的评述:',
'Portal:ErrorNoContactForThisUser' => '错误: 当前用户没有和一个联系人或人员关联. 请联系您的系统管理员.',

View File

@@ -13,12 +13,13 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper)
function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper, sAttCode)
{
this.id = id;
this.sTargetClass = sTargetClass;
this.sFilter = sFilter;
this.sTitle = sTitle;
this.sAttCode = sAttCode;
this.emptyHtml = ''; // content to be displayed when the search results are empty (when opening the dialog)
this.emptyOnClose = true; // Workaround for the JQuery dialog being very slow when opening and closing if the content contains many INPUT tags
this.oWizardHelper = oWizHelper;
@@ -61,10 +62,22 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
var theMap = { sAttCode: me.sAttCode,
iInputId: me.id,
sTitle: me.sTitle,
sAttCode: me.sAttCode,
sTargetClass: me.sTargetClass,
operation: 'objectSearchForm'
}
if (me.oWizardHelper == null)
{
theMap['json'] = '';
}
else
{
// Not inside a "search form", updating a real object
me.oWizardHelper.UpdateWizard();
theMap['json'] = me.oWizardHelper.ToJSON();
}
// Make sure that we cancel any pending request before issuing another
// since responses may arrive in arbitrary order
me.StopPendingRequest();
@@ -152,6 +165,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
theMap['sRemoteClass'] = theMap['class']; // swap 'class' (defined in the form) and 'remoteClass'
theMap.operation = 'searchObjectsToSelect'; // Override what is defined in the form itself
theMap.sAttCode = me.sAttCode,
sSearchAreaId = '#dr_'+me.id;
//$(sSearchAreaId).html('<div style="text-align:center;width:100%;height:24px;vertical-align:middle;"><img src="../images/indicator.gif" /></div>');
@@ -200,6 +214,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
var theMap = { sTargetClass: me.sTargetClass,
iInputId: me.id,
iObjectId: iObjectId,
sAttCode: me.sAttCode,
operation: 'getObjectName'
}
@@ -262,6 +277,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
me.oWizardHelper.UpdateWizard();
var theMap = { sTargetClass: me.sTargetClass,
iInputId: me.id,
sAttCode: me.sAttCode,
'json': me.oWizardHelper.ToJSON(),
operation: 'objectCreationForm'
}
@@ -323,6 +339,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
$('#'+sFormId).block();
var theMap = { sTargetClass: me.sTargetClass,
iInputId: me.id,
sAttCode: me.sAttCode,
'json': me.oWizardHelper.ToJSON()
}
@@ -403,6 +420,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
var theMap = { sTargetClass: me.sTargetClass,
sInputId: me.id,
sFilter: me.sFilter,
sAttCode: me.sAttCode,
value: $('#'+me.id).val()
};
@@ -484,6 +502,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
var theMap = { sTargetClass: me.sTargetClass,
iInputId: me.id,
iObjectId: iObjectId,
sAttCode: me.sAttCode,
operation: 'getObjectName'
}

View File

@@ -1,5 +1,5 @@
// JavaScript Document
function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates, oWizHelper)
{
this.id = id;
this.iInputId = iInputId;
@@ -7,6 +7,7 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
this.sAttCode = sAttCode;
this.sSuffix = sSuffix;
this.bDuplicates = bDuplicates;
this.oWizardHelper = oWizHelper;
var me = this;
this.Init = function()
{
@@ -63,9 +64,28 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
this.AddObjects = function()
{
$('#dlg_'+me.id).dialog('open');
this.UpdateSizes(null, null);
this.SearchObjectsToAdd();
var me = this;
$('#'+me.id+'_indicatorAdd').html('&nbsp;<img src="../images/indicator.gif"/>');
me.oWizardHelper.UpdateWizard();
var theMap = { sAttCode: me.sAttCode,
iInputId: me.iInputId,
sSuffix: me.sSuffix,
bDuplicates: me.bDuplicates,
'class' : me.sClass,
operation: 'addObjects',
json: me.oWizardHelper.ToJSON()
};
$.post( GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', theMap,
function(data)
{
$('#dlg_'+me.id).html(data);
$('#dlg_'+me.id).dialog('open');
me.UpdateSizes(null, null);
me.SearchObjectsToAdd();
$('#'+me.id+'_indicatorAdd').html('');
},
'html'
);
}
this.SearchObjectsToAdd = function()
@@ -202,6 +222,16 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
// }
theMap['operation'] = 'doAddObjects';
if (me.oWizardHelper == null)
{
theMap['json'] = '';
}
else
{
// Not inside a "search form", updating a real object
me.oWizardHelper.UpdateWizard();
theMap['json'] = me.oWizardHelper.ToJSON();
}
$('#busy_'+me.iInputId).html('&nbsp;<img src="../images/indicator.gif"/>');
// Run the query and display the results
$.post( GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', theMap,

View File

@@ -119,8 +119,18 @@ function ReloadSearchForm(divId, sClassName, sBaseClass, sContext)
}
sAction = $('#ds_'+divId+' form').attr('action');
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php?'+sContext,
{ operation: 'search_form', className: sClassName, baseClass: sBaseClass, currentId: divId, action: sAction },
// Save the current values in the form
var oMap = {};
$('#ds_'+divId+" form :input[name!='']").each(function() {
oMap[this.name] = this.value;
});
oMap.operation = 'search_form';
oMap.className = sClassName;
oMap.baseClass = sBaseClass;
oMap.currentId = divId;
oMap.action = sAction;
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php?'+sContext, oMap,
function(data) {
oDiv.empty();
oDiv.append(data);

View File

@@ -136,6 +136,12 @@ function WizardHelper(sClass, sFormPrefix, sState)
}
}
this.UpdateWizardToJSON = function ()
{
this.UpdateWizard();
return this.ToJSON()
}
this.AjaxQueryServer = function ()
{
//console.log('data sent:', this.ToJSON());

View File

@@ -20,7 +20,6 @@
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @author Hirofumi Kosaka <kosaka@rworks.jp>
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
@@ -39,8 +38,8 @@
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:UserExternal' => '外部ユーザー', # 'External user',
'Class:UserExternal+' => '外部認証ユーザー', # 'User authentified outside of iTop',
'Class:UserExternal' => '外部ユーザー',
'Class:UserExternal+' => 'iTopの外で認証されたユーザー',
));

View File

@@ -20,7 +20,6 @@
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @author Hirofumi Kosaka <kosaka@rworks.jp>
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
@@ -40,7 +39,7 @@
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:UserLDAP' => 'LDAP ユーザー', # 'LDAP user',
'Class:UserLDAP+' => 'LDAP認証ユーザー', # 'User authentified by LDAP',
'Class:UserLDAP+' => 'LDAPにて認証されたユーザー', # 'User authentified by LDAP',
'Class:UserLDAP/Attribute:password' => 'パスワード', # 'Password',
'Class:UserLDAP/Attribute:password+' => '認証文字列', # 'user authentication string',
));

View File

@@ -120,7 +120,7 @@ class UserLDAP extends UserInternal
$aEntry = ldap_get_entries($hDS, $hSearchResult);
$sUserDN = $aEntry[0]['dn'];
$bUserBind = @ldap_bind($hDS, $sUserDN, $sPassword);
if ($bUserBind !== false)
if (($bUserBind !== false) && !empty($sPassword))
{
ldap_unbind($hDS);
return true; // Password Ok

View File

@@ -1,50 +1,32 @@
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* Localized data
*
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserLocal
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:UserLocal' => 'iTop-Benutzer',
'Class:UserLocal+' => 'Benutzer von iTop authentifiziert',
'Class:UserLocal/Attribute:password' => 'Passwort',
'Class:UserLocal/Attribute:password+' => 'Benutzerpasswort',
));
?>
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:UserLocal' => 'iTop-Benutzer',
'Class:UserLocal+' => 'Benutzer, der von iTop authentifiziert wird',
'Class:UserLocal/Attribute:password' => 'Passwort',
'Class:UserLocal/Attribute:password+' => 'Benutzerpasswort',
));
?>

View File

@@ -20,7 +20,6 @@
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @author Hirofumi Kosaka <kosaka@rworks.jp>
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
@@ -39,10 +38,10 @@
//
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:UserLocal' => 'iTopユーザー', // 'iTop user',
'Class:UserLocal+' => 'iTopローカル認証ユーザー', // 'User authentified by iTop',
'Class:UserLocal/Attribute:password' => 'パスワード', // 'Password',
'Class:UserLocal/Attribute:password+' => '認証文字列', // 'user authentication string',
'Class:UserLocal' => 'iTopユーザー',
'Class:UserLocal+' => 'iTopで認証されるユーザー',
'Class:UserLocal/Attribute:password' => 'パスワード',
'Class:UserLocal/Attribute:password+' => 'ユーザ認証文字列',
));

View File

@@ -63,25 +63,25 @@ try
{
try
{
$oDoc = utils::ReadPostedDocument('file');
$oAttachment = MetaModel::NewObject('Attachment');
$oAttachment->Set('expire', time() + 3600); // one hour...
$oAttachment->Set('temp_id', $sTempId);
$oAttachment->Set('item_class', $sObjClass);
$oAttachment->Set('item_id', 0);
$oAttachment->Set('contents', $oDoc);
$iAttId = $oAttachment->DBInsert();
$aResult['msg'] = $oDoc->GetFileName();
$aResult['icon'] = utils::GetAbsoluteUrlAppRoot().AttachmentPlugIn::GetFileIcon($oDoc->GetFileName());
$aResult['att_id'] = $iAttId;
$oDoc = utils::ReadPostedDocument('file');
$oAttachment = MetaModel::NewObject('Attachment');
$oAttachment->Set('expire', time() + 3600); // one hour...
$oAttachment->Set('temp_id', $sTempId);
$oAttachment->Set('item_class', $sObjClass);
$oAttachment->SetDefaultOrgId();
$oAttachment->Set('contents', $oDoc);
$iAttId = $oAttachment->DBInsert();
$aResult['msg'] = $oDoc->GetFileName();
$aResult['icon'] = utils::GetAbsoluteUrlAppRoot().AttachmentPlugIn::GetFileIcon($oDoc->GetFileName());
$aResult['att_id'] = $iAttId;
}
catch (FileUploadException $e)
{
$aResult['error'] = $e->GetMessage();
}
}
$oPage->add(json_encode($aResult));
}
$oPage->add(json_encode($aResult));
break;
case 'remove':

View File

@@ -36,5 +36,6 @@ Dict::Add('EN US', 'English', 'English', array(
'Attachment:Max_Go' => '(Maximale Datei-Größe: %1$s Go)',
'Attachment:Max_Mo' => '(Maximale Datei-Größe: %1$s Mo)',
'Attachment:Max_Ko' => '(Maximale Datei-Größe: %1$s Ko)',
'Attachments:NoAttachment' => 'Kein Attachment.',
));
?>

View File

@@ -35,5 +35,6 @@ Dict::Add('EN US', 'English', 'English', array(
'Attachment:Max_Go' => '(Maximum file size: %1$s Go)',
'Attachment:Max_Mo' => '(Maximum file size: %1$s Mo)',
'Attachment:Max_Ko' => '(Maximum file size: %1$s Ko)',
'Attachments:NoAttachment' => 'No attachment. ',
));
?>

View File

@@ -35,5 +35,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Attachment:Max_Go' => '(Taille de fichier max.: %1$s Gb)',
'Attachment:Max_Mo' => '(Taille de fichier max.: %1$s Mb)',
'Attachment:Max_Ko' => '(Taille de fichier max.: %1$s Kb)',
'Attachments:NoAttachment' => 'Aucune pièce jointe.',
));
?>

View File

@@ -34,7 +34,7 @@ class Attachment extends DBObject
{
$aParams = array
(
"category" => "addon",
"category" => "addon,bizmodel",
"key_type" => "autoincrement",
"name_attcode" => array('item_class', 'temp_id'),
"state_attcode" => "",
@@ -51,15 +51,107 @@ class Attachment extends DBObject
MetaModel::Init_AddAttribute(new AttributeString("item_class", array("allowed_values"=>null, "sql"=>"item_class", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeString("item_id", array("allowed_values"=>null, "sql"=>"item_id", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeInteger("item_org_id", array("allowed_values"=>null, "sql"=>"item_org_id", "default_value"=>0, "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeBlob("contents", array("depends_on"=>array())));
MetaModel::Init_SetZListItems('details', array('temp_id', 'item_class', 'item_id'));
MetaModel::Init_SetZListItems('details', array('temp_id', 'item_class', 'item_id', 'item_org_id'));
MetaModel::Init_SetZListItems('advanced_search', array('temp_id', 'item_class', 'item_id'));
MetaModel::Init_SetZListItems('standard_search', array('temp_id', 'item_class', 'item_id'));
MetaModel::Init_SetZListItems('list', array('temp_id', 'item_class', 'item_id'));
}
/**
* Maps the given context parameter name to the appropriate filter/search code for this class
* @param string $sContextParam Name of the context parameter, e.g. 'org_id'
* @return string Filter code, e.g. 'customer_id'
*/
public static function MapContextParam($sContextParam)
{
if ($sContextParam == 'org_id')
{
return 'item_org_id';
}
else
{
return null;
}
}
/**
* Set/Update all of the '_item' fields
* @param object $oItem Container item
* @return void
*/
public function SetItem($oItem, $bUpdateOnChange = false)
{
$sClass = get_class($oItem);
$iItemId = $oItem->GetKey();
$this->Set('item_class', $sClass);
$this->Set('item_id', $iItemId);
$aCallSpec = array($sClass, 'MapContextParam');
if (is_callable($aCallSpec))
{
$sAttCode = call_user_func($aCallSpec, 'org_id'); // Returns null when there is no mapping for this parameter
if (MetaModel::IsValidAttCode($sClass, $sAttCode))
{
$iOrgId = $oItem->Get($sAttCode);
if ($iOrgId > 0)
{
if ($iOrgId != $this->Get('item_org_id'))
{
$this->Set('item_org_id', $iOrgId);
if ($bUpdateOnChange)
{
$this->DBUpdate();
}
}
}
}
}
}
/**
* Give a default value for item_org_id (if relevant...)
* @return void
*/
public function SetDefaultOrgId()
{
// First check that the organization CAN be fetched from the target class
//
$sClass = $this->Get('item_class');
$aCallSpec = array($sClass, 'MapContextParam');
if (is_callable($aCallSpec))
{
$sAttCode = call_user_func($aCallSpec, 'org_id'); // Returns null when there is no mapping for this parameter
if (MetaModel::IsValidAttCode($sClass, $sAttCode))
{
// Second: check that the organization CAN be fetched from the current user
//
if (MetaModel::IsValidClass('Person'))
{
$aCallSpec = array($sClass, 'MapContextParam');
if (is_callable($aCallSpec))
{
$sAttCode = call_user_func($aCallSpec, 'org_id'); // Returns null when there is no mapping for this parameter
if (MetaModel::IsValidAttCode($sClass, $sAttCode))
{
// OK - try it
//
$oCurrentPerson = MetaModel::GetObject('Person', UserRights::GetContactId(), false);
if ($oCurrentPerson)
{
$this->Set('item_org_id', $oCurrentPerson->Get($sAttCode));
}
}
}
}
}
}
}
// Todo - implement a cleanup function (see a way to do that generic !)
}
@@ -181,6 +273,16 @@ class AttachmentPlugIn implements iApplicationUIExtension, iApplicationObjectExt
public function OnDBUpdate($oObject, $oChange = null)
{
if ($this->IsTargetObject($oObject))
{
// Get all current attachments
$oSearch = DBObjectSearch::FromOQL("SELECT Attachment WHERE item_class = :class AND item_id = :item_id");
$oSet = new DBObjectSet($oSearch, array(), array('class' => get_class($oObject), 'item_id' => $oObject->GetKey()));
while ($oAttachment = $oSet->Fetch())
{
$oAttachment->SetItem($oObject, true /*updateonchange*/);
}
}
}
public function OnDBInsert($oObject, $oChange = null)
@@ -287,12 +389,13 @@ EOF
{
$('#attachment_'+att_id).attr('name', 'removed_attachments[]');
$('#display_attachment_'+att_id).hide();
$('#attachment_plugin').trigger('remove_attachment', [att_id]);
return false; // Do not submit the form !
}
function ajaxFileUpload()
{
//starting setting some animation when the ajax starts and completes
$("#loading").ajaxStart(function(){
$("#attachment_loading").ajaxStart(function(){
$(this).show();
}).ajaxComplete(function(){
$(this).hide();
@@ -331,6 +434,8 @@ EOF
{
$('#display_attachment_'+data.att_id).hover( function() { $(this).children(':button').toggleClass('btn_hidden'); } );
}
$('#attachment_plugin').trigger('add_attachment', [data.att_id, data.msg]);
//alert(data.msg);
}
}
@@ -360,9 +465,10 @@ EOF
$oPage->add('</span>');
$oPage->add('<div style="clear:both"></div>');
$sMaxUpload = $this->GetMaxUpload();
$oPage->p(Dict::S('Attachments:AddAttachment').'<input type="file" name="file" id="file" onChange="ajaxFileUpload();"><span style="display:none;" id="loading">&nbsp;<img src="../images/indicator.gif"></span> '.$sMaxUpload);
$oPage->p(Dict::S('Attachments:AddAttachment').'<input type="file" name="file" id="file" onChange="ajaxFileUpload();"><span style="display:none;" id="attachment_loading">&nbsp;<img src="../images/indicator.gif"></span> '.$sMaxUpload);
//$oPage->p('<input type="button" onClick="ajaxFileUpload();" value=" Upload !">');
$oPage->p('<span style="display:none;" id="loading">Loading, please wait...</span>');
$oPage->p('<span style="display:none;" id="attachment_loading">Loading, please wait...</span>');
$oPage->p('<input type="hidden" id="attachment_plugin" name="attachment_plugin"/>');
$oPage->add('</fieldset>');
if ($this->m_bDeleteEnabled)
{
@@ -372,20 +478,33 @@ EOF
else
{
$oPage->add('<span id="attachments">');
while ($oAttachment = $oSet->Fetch())
if ($oSet->Count() == 0)
{
$iAttId = $oAttachment->GetKey();
$oDoc = $oAttachment->Get('contents');
$sFileName = $oDoc->GetFileName();
$sIcon = utils::GetAbsoluteUrlAppRoot().AttachmentPlugIn::GetFileIcon($sFileName);
$sDownloadLink = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php/?operation=download_document&class=Attachment&id='.$iAttId.'&field=contents';
$oPage->add('<div class="attachment" id="attachment_'.$iAttId.'"><a href="'.$sDownloadLink.'"><img src="'.$sIcon.'"><br/>'.$sFileName.'</a><input type="hidden" name="attachments[]" value="'.$iAttId.'"/><br/>&nbsp;&nbsp;</div>');
$oPage->add(Dict::S('Attachments:NoAttachment'));
}
else
{
while ($oAttachment = $oSet->Fetch())
{
$iAttId = $oAttachment->GetKey();
$oDoc = $oAttachment->Get('contents');
$sFileName = $oDoc->GetFileName();
$sIcon = utils::GetAbsoluteUrlAppRoot().AttachmentPlugIn::GetFileIcon($sFileName);
$sDownloadLink = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php/?operation=download_document&class=Attachment&id='.$iAttId.'&field=contents';
$oPage->add('<div class="attachment" id="attachment_'.$iAttId.'"><a href="'.$sDownloadLink.'"><img src="'.$sIcon.'"><br/>'.$sFileName.'</a><input type="hidden" name="attachments[]" value="'.$iAttId.'"/><br/>&nbsp;&nbsp;</div>');
}
}
}
}
protected static function UpdateAttachments($oObject, $oChange = null)
{
if (utils::ReadParam('attachment_plugin', 'not-in-form') == 'not-in-form')
{
// Workaround to an issue in iTop < 2.0
// Leave silently if there is no trace of the attachment form
return;
}
$iTransactionId = utils::ReadParam('transaction_id', null);
if (!is_null($iTransactionId))
{
@@ -424,7 +543,7 @@ EOF
}
else
{
$oAttachment->Set('item_id', $oObject->GetKey());
$oAttachment->SetItem($oObject);
$oAttachment->Set('temp_id', '');
$oAttachment->DBUpdate();
// temporary attachment confirmed, list it in the history

View File

@@ -30,6 +30,7 @@ SetupWebPage::AddModule(
),
'mandatory' => false,
'visible' => true,
'installer' => 'AttachmentInstaller',
// Components
//
@@ -63,4 +64,62 @@ SetupWebPage::AddModule(
),
)
);
?>
// Module installation handler
//
class AttachmentInstaller extends ModuleInstallerAPI
{
public static function BeforeWritingConfig(Config $oConfiguration)
{
// If you want to override/force some configuration values, do it here
return $oConfiguration;
}
/**
* Handler called before creating or upgrading the database schema
* @param $oConfiguration Config The new configuration of the application
* @param $sPreviousVersion string PRevious version number of the module (empty string in case of first install)
* @param $sCurrentVersion string Current version number of the module
*/
public static function BeforeDatabaseCreation(Config $oConfiguration, $sPreviousVersion, $sCurrentVersion)
{
// If you want to migrate data from one format to another, do it here
}
/**
* Handler called after the creation/update of the database schema
* @param $oConfiguration Config The new configuration of the application
* @param $sPreviousVersion string PRevious version number of the module (empty string in case of first install)
* @param $sCurrentVersion string Current version number of the module
*/
public static function AfterDatabaseCreation(Config $oConfiguration, $sPreviousVersion, $sCurrentVersion)
{
// For each record having item_org_id unset,
// get the org_id from the container object
//
// Prerequisite: change null into 0 (workaround to the fact that we cannot use IS NULL in OQL)
SetupWebPage::log_info("Initializing attachment/item_org_id - null to zero");
$sTableName = MetaModel::DBGetTable('Attachment');
$sRepair = "UPDATE `$sTableName` SET `item_org_id` = 0 WHERE `item_org_id` IS NULL";
CMDBSource::Query($sRepair);
SetupWebPage::log_info("Initializing attachment/item_org_id - zero to the container");
$oSearch = DBObjectSearch::FromOQL("SELECT Attachment WHERE item_org_id = 0");
$oSet = new DBObjectSet($oSearch);
$iUpdated = 0;
while ($oAttachment = $oSet->Fetch())
{
$oContainer = MetaModel::GetObject($oAttachment->Get('item_class'), $oAttachment->Get('item_id'), false /* must be found */, true /* allow all data */);
if ($oContainer)
{
$oAttachment->SetItem($oContainer, true /*updateonchange*/);
$iUpdated++;
}
}
SetupWebPage::log_info("Initializing attachment/item_org_id - $iUpdated records have been adjusted");
}
}
?>

View File

@@ -1,348 +1,304 @@
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* Localized data
*
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:ChangeManagement' => 'Change Management',
'Menu:Change:Overview' => 'Übersicht',
'Menu:Change:Overview+' => '',
'Menu:NewChange' => 'Neuer Change',
'Menu:NewChange+' => 'Ein neues Change Ticket erstellen',
'Menu:SearchChanges' => 'Nach Changes suchen',
'Menu:SearchChanges+' => 'Nach Change Tickets suchen',
'Menu:Change:Shortcuts' => 'Shortcuts',
'Menu:Change:Shortcuts+' => '',
'Menu:WaitingAcceptance' => 'Changes, die auf Bestätigung warten',
'Menu:WaitingAcceptance+' => '',
'Menu:WaitingApproval' => 'Changes, die auf Genehmigung warten',
'Menu:WaitingApproval+' => '',
'Menu:Changes' => 'Offene Changes',
'Menu:Changes+' => 'Alle Offene Changes',
'Menu:MyChanges' => 'An mich zugewiesene Changes',
'Menu:MyChanges+' => 'An mich zugewiesene Changes (als Bearbeiter)',
));
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: Change
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Change' => 'Change',
'Class:Change+' => '',
'Class:Change/Attribute:start_date' => 'Geplanter Start',
'Class:Change/Attribute:start_date+' => '',
'Class:Change/Attribute:status' => 'Status',
'Class:Change/Attribute:status+' => '',
'Class:Change/Attribute:status/Value:new' => 'Neu',
'Class:Change/Attribute:status/Value:new+' => '',
'Class:Change/Attribute:status/Value:validated' => 'Validiert',
'Class:Change/Attribute:status/Value:validated+' => '',
'Class:Change/Attribute:status/Value:rejected' => 'Abgelehnt',
'Class:Change/Attribute:status/Value:rejected+' => '',
'Class:Change/Attribute:status/Value:assigned' => 'Zugewiesen',
'Class:Change/Attribute:status/Value:assigned+' => '',
'Class:Change/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
'Class:Change/Attribute:status/Value:plannedscheduled+' => '',
'Class:Change/Attribute:status/Value:approved' => 'Genehmigt',
'Class:Change/Attribute:status/Value:approved+' => '',
'Class:Change/Attribute:status/Value:notapproved' => 'Nicht genehmigt',
'Class:Change/Attribute:status/Value:notapproved+' => '',
'Class:Change/Attribute:status/Value:implemented' => 'Implementiert',
'Class:Change/Attribute:status/Value:implemented+' => '',
'Class:Change/Attribute:status/Value:monitored' => 'Überwacht',
'Class:Change/Attribute:status/Value:monitored+' => '',
'Class:Change/Attribute:status/Value:closed' => 'Geschlossen',
'Class:Change/Attribute:status/Value:closed+' => '',
'Class:Change/Attribute:reason' => 'Ursache',
'Class:Change/Attribute:reason+' => '',
'Class:Change/Attribute:requestor_id' => 'Antragsteller',
'Class:Change/Attribute:requestor_id+' => '',
'Class:Change/Attribute:requestor_email' => 'Antragsteller',
'Class:Change/Attribute:requestor_email+' => '',
'Class:Change/Attribute:org_id' => 'Kunde',
'Class:Change/Attribute:org_id+' => '',
'Class:Change/Attribute:org_name' => 'Kunde',
'Class:Change/Attribute:org_name+' => '',
'Class:Change/Attribute:workgroup_id' => 'Arbeitsgruppe',
'Class:Change/Attribute:workgroup_id+' => '',
'Class:Change/Attribute:workgroup_name' => 'Arbeitsgruppe',
'Class:Change/Attribute:workgroup_name+' => '',
'Class:Change/Attribute:creation_date' => 'Erstellt',
'Class:Change/Attribute:creation_date+' => '',
'Class:Change/Attribute:last_update' => 'Letzte Aktualisierung',
'Class:Change/Attribute:last_update+' => '',
'Class:Change/Attribute:end_date' => 'Enddatum',
'Class:Change/Attribute:end_date+' => '',
'Class:Change/Attribute:close_date' => 'Geschlossen',
'Class:Change/Attribute:close_date+' => '',
'Class:Change/Attribute:impact' => 'Auswirkung',
'Class:Change/Attribute:impact+' => '',
'Class:Change/Attribute:agent_id' => 'Bearbeiter',
'Class:Change/Attribute:agent_id+' => '',
'Class:Change/Attribute:agent_name' => 'Bearbeiter',
'Class:Change/Attribute:agent_name+' => '',
'Class:Change/Attribute:agent_email' => 'Bearbeiter',
'Class:Change/Attribute:agent_email+' => '',
'Class:Change/Attribute:supervisor_group_id' => 'Aufsichts-Team',
'Class:Change/Attribute:supervisor_group_id+' => '',
'Class:Change/Attribute:supervisor_group_name' => 'Aufsichts-Team',
'Class:Change/Attribute:supervisor_group_name+' => '',
'Class:Change/Attribute:supervisor_id' => 'Aufsicht',
'Class:Change/Attribute:supervisor_id+' => '',
'Class:Change/Attribute:supervisor_email' => 'Aufsicht',
'Class:Change/Attribute:supervisor_email+' => '',
'Class:Change/Attribute:manager_group_id' => 'Manager-Team',
'Class:Change/Attribute:manager_group_id+' => '',
'Class:Change/Attribute:manager_group_name' => 'Manager-Team',
'Class:Change/Attribute:manager_group_name+' => '',
'Class:Change/Attribute:manager_id' => 'Manager',
'Class:Change/Attribute:manager_id+' => '',
'Class:Change/Attribute:manager_email' => 'Manager',
'Class:Change/Attribute:manager_email+' => '',
'Class:Change/Attribute:outage' => 'Ausfall',
'Class:Change/Attribute:outage+' => '',
'Class:Change/Attribute:outage/Value:yes' => 'Ja',
'Class:Change/Attribute:outage/Value:yes+' => '',
'Class:Change/Attribute:outage/Value:no' => 'Nein',
'Class:Change/Attribute:outage/Value:no+' => '',
'Class:Change/Attribute:change_request' => 'Anfrage',
'Class:Change/Attribute:change_request+' => '',
'Class:Change/Attribute:fallback' => 'Fallback-Plan',
'Class:Change/Attribute:fallback+' => '',
'Class:Change/Stimulus:ev_validate' => 'Validieren',
'Class:Change/Stimulus:ev_validate+' => '',
'Class:Change/Stimulus:ev_reject' => 'Ablehnen',
'Class:Change/Stimulus:ev_reject+' => '',
'Class:Change/Stimulus:ev_assign' => 'Zuweisen',
'Class:Change/Stimulus:ev_assign+' => '',
'Class:Change/Stimulus:ev_reopen' => 'Wiedereröffnen',
'Class:Change/Stimulus:ev_reopen+' => '',
'Class:Change/Stimulus:ev_plan' => 'Planen',
'Class:Change/Stimulus:ev_plan+' => '',
'Class:Change/Stimulus:ev_approve' => 'Bestätigen',
'Class:Change/Stimulus:ev_approve+' => '',
'Class:Change/Stimulus:ev_replan' => 'Umplanen',
'Class:Change/Stimulus:ev_replan+' => '',
'Class:Change/Stimulus:ev_notapprove' => 'Ablehnen',
'Class:Change/Stimulus:ev_notapprove+' => '',
'Class:Change/Stimulus:ev_implement' => 'Implementieren',
'Class:Change/Stimulus:ev_implement+' => '',
'Class:Change/Stimulus:ev_monitor' => 'Überwachen',
'Class:Change/Stimulus:ev_monitor+' => '',
'Class:Change/Stimulus:ev_finish' => 'Abschließen',
'Class:Change/Stimulus:ev_finish+' => '',
));
//
// Class: RoutineChange
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:RoutineChange' => 'Routine Change',
'Class:RoutineChange+' => '',
'Class:RoutineChange/Attribute:status/Value:new' => 'Neu',
'Class:RoutineChange/Attribute:status/Value:new+' => '',
'Class:RoutineChange/Attribute:status/Value:assigned' => 'Zugewiesen',
'Class:RoutineChange/Attribute:status/Value:assigned+' => '',
'Class:RoutineChange/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
'Class:RoutineChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:RoutineChange/Attribute:status/Value:approved' => 'Bestätigt',
'Class:RoutineChange/Attribute:status/Value:approved+' => '',
'Class:RoutineChange/Attribute:status/Value:implemented' => 'Implementiert',
'Class:RoutineChange/Attribute:status/Value:implemented+' => '',
'Class:RoutineChange/Attribute:status/Value:monitored' => 'Überwachen',
'Class:RoutineChange/Attribute:status/Value:monitored+' => '',
'Class:RoutineChange/Attribute:status/Value:closed' => 'Geschlossen',
'Class:RoutineChange/Attribute:status/Value:closed+' => '',
'Class:RoutineChange/Stimulus:ev_validate' => 'Validieren',
'Class:RoutineChange/Stimulus:ev_validate+' => '',
'Class:RoutineChange/Stimulus:ev_assign' => 'Zuweisen',
'Class:RoutineChange/Stimulus:ev_assign+' => '',
'Class:RoutineChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
'Class:RoutineChange/Stimulus:ev_reopen+' => '',
'Class:RoutineChange/Stimulus:ev_plan' => 'Planen',
'Class:RoutineChange/Stimulus:ev_plan+' => '',
'Class:RoutineChange/Stimulus:ev_replan' => 'Umplanen',
'Class:RoutineChange/Stimulus:ev_replan+' => '',
'Class:RoutineChange/Stimulus:ev_implement' => 'Implementieren',
'Class:RoutineChange/Stimulus:ev_implement+' => '',
'Class:RoutineChange/Stimulus:ev_monitor' => 'Überwachen',
'Class:RoutineChange/Stimulus:ev_monitor+' => '',
'Class:RoutineChange/Stimulus:ev_finish' => 'Abschließen',
'Class:RoutineChange/Stimulus:ev_finish+' => '',
));
//
// Class: ApprovedChange
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ApprovedChange' => 'Bewilligte Changes',
'Class:ApprovedChange+' => '',
'Class:ApprovedChange/Attribute:approval_date' => 'Datum der Bewilligung',
'Class:ApprovedChange/Attribute:approval_date+' => '',
'Class:ApprovedChange/Attribute:approval_comment' => 'Kommentar zur Bewilligung',
'Class:ApprovedChange/Attribute:approval_comment+' => '',
'Class:ApprovedChange/Stimulus:ev_validate' => 'Validieren',
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
'Class:ApprovedChange/Stimulus:ev_reject' => 'Ablehnen',
'Class:ApprovedChange/Stimulus:ev_reject+' => '',
'Class:ApprovedChange/Stimulus:ev_assign' => 'Zuweisen',
'Class:ApprovedChange/Stimulus:ev_assign+' => '',
'Class:ApprovedChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
'Class:ApprovedChange/Stimulus:ev_reopen+' => '',
'Class:ApprovedChange/Stimulus:ev_plan' => 'Planen',
'Class:ApprovedChange/Stimulus:ev_plan+' => '',
'Class:ApprovedChange/Stimulus:ev_approve' => 'Bestätigen',
'Class:ApprovedChange/Stimulus:ev_approve+' => '',
'Class:ApprovedChange/Stimulus:ev_replan' => 'Umplanen',
'Class:ApprovedChange/Stimulus:ev_replan+' => '',
'Class:ApprovedChange/Stimulus:ev_notapprove' => 'Bestätigen zurücknehmen',
'Class:ApprovedChange/Stimulus:ev_notapprove+' => '',
'Class:ApprovedChange/Stimulus:ev_implement' => 'Implementieren',
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
'Class:ApprovedChange/Stimulus:ev_monitor' => 'Überwachen',
'Class:ApprovedChange/Stimulus:ev_monitor+' => '',
'Class:ApprovedChange/Stimulus:ev_finish' => 'Abschließen',
'Class:ApprovedChange/Stimulus:ev_finish+' => '',
));
//
// Class: NormalChange
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:NormalChange' => 'Normaler Change',
'Class:NormalChange+' => '',
'Class:NormalChange/Attribute:status/Value:new' => 'Neu',
'Class:NormalChange/Attribute:status/Value:new+' => '',
'Class:NormalChange/Attribute:status/Value:validated' => 'Validiert',
'Class:NormalChange/Attribute:status/Value:validated+' => '',
'Class:NormalChange/Attribute:status/Value:rejected' => 'Abgelehnt',
'Class:NormalChange/Attribute:status/Value:rejected+' => '',
'Class:NormalChange/Attribute:status/Value:assigned' => 'Zugewiesen',
'Class:NormalChange/Attribute:status/Value:assigned+' => '',
'Class:NormalChange/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
'Class:NormalChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:NormalChange/Attribute:status/Value:approved' => 'Bestätigt',
'Class:NormalChange/Attribute:status/Value:approved+' => '',
'Class:NormalChange/Attribute:status/Value:notapproved' => 'Nicht bestätigt',
'Class:NormalChange/Attribute:status/Value:notapproved+' => '',
'Class:NormalChange/Attribute:status/Value:implemented' => 'Implementiert',
'Class:NormalChange/Attribute:status/Value:implemented+' => '',
'Class:NormalChange/Attribute:status/Value:monitored' => 'Überwachen',
'Class:NormalChange/Attribute:status/Value:monitored+' => '',
'Class:NormalChange/Attribute:status/Value:closed' => 'Geschlossen',
'Class:NormalChange/Attribute:status/Value:closed+' => '',
'Class:NormalChange/Attribute:acceptance_date' => 'Datum der Bewilligung',
'Class:NormalChange/Attribute:acceptance_date+' => '',
'Class:NormalChange/Attribute:acceptance_comment' => 'Kommentar zur Bewilligung',
'Class:NormalChange/Attribute:acceptance_comment+' => '',
'Class:NormalChange/Stimulus:ev_validate' => 'Validieren',
'Class:NormalChange/Stimulus:ev_validate+' => '',
'Class:NormalChange/Stimulus:ev_reject' => 'Ablehnen',
'Class:NormalChange/Stimulus:ev_reject+' => '',
'Class:NormalChange/Stimulus:ev_assign' => 'Zuweisen',
'Class:NormalChange/Stimulus:ev_assign+' => '',
'Class:NormalChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
'Class:NormalChange/Stimulus:ev_reopen+' => '',
'Class:NormalChange/Stimulus:ev_plan' => 'Planen',
'Class:NormalChange/Stimulus:ev_plan+' => '',
'Class:NormalChange/Stimulus:ev_approve' => 'Bestätigen',
'Class:NormalChange/Stimulus:ev_approve+' => '',
'Class:NormalChange/Stimulus:ev_replan' => 'Umplanen',
'Class:NormalChange/Stimulus:ev_replan+' => '',
'Class:NormalChange/Stimulus:ev_notapprove' => 'Bestätigen zurücknehmen',
'Class:NormalChange/Stimulus:ev_notapprove+' => '',
'Class:NormalChange/Stimulus:ev_implement' => 'Implementieren',
'Class:NormalChange/Stimulus:ev_implement+' => '',
'Class:NormalChange/Stimulus:ev_monitor' => 'Überwachen',
'Class:NormalChange/Stimulus:ev_monitor+' => '',
'Class:NormalChange/Stimulus:ev_finish' => 'Abschließen',
'Class:NormalChange/Stimulus:ev_finish+' => '',
));
//
// Class: EmergencyChange
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:EmergencyChange' => 'Emergency Change',
'Class:EmergencyChange+' => '',
'Class:EmergencyChange/Attribute:status/Value:new' => 'Neu',
'Class:EmergencyChange/Attribute:status/Value:new+' => '',
'Class:EmergencyChange/Attribute:status/Value:validated' => 'Validiert',
'Class:EmergencyChange/Attribute:status/Value:validated+' => '',
'Class:EmergencyChange/Attribute:status/Value:rejected' => 'Abgelehnt',
'Class:EmergencyChange/Attribute:status/Value:rejected+' => '',
'Class:EmergencyChange/Attribute:status/Value:assigned' => 'Zugewiesen',
'Class:EmergencyChange/Attribute:status/Value:assigned+' => '',
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:EmergencyChange/Attribute:status/Value:approved' => 'Bestätigt',
'Class:EmergencyChange/Attribute:status/Value:approved+' => '',
'Class:EmergencyChange/Attribute:status/Value:notapproved' => 'Nicht bestätigt',
'Class:EmergencyChange/Attribute:status/Value:notapproved+' => '',
'Class:EmergencyChange/Attribute:status/Value:implemented' => 'Implementiert',
'Class:EmergencyChange/Attribute:status/Value:implemented+' => '',
'Class:EmergencyChange/Attribute:status/Value:monitored' => 'Überwachen',
'Class:EmergencyChange/Attribute:status/Value:monitored+' => '',
'Class:EmergencyChange/Attribute:status/Value:closed' => 'Geschlossen',
'Class:EmergencyChange/Attribute:status/Value:closed+' => '',
'Class:EmergencyChange/Stimulus:ev_validate' => 'Validieren',
'Class:EmergencyChange/Stimulus:ev_validate+' => '',
'Class:EmergencyChange/Stimulus:ev_reject' => 'Ablehnen',
'Class:EmergencyChange/Stimulus:ev_reject+' => '',
'Class:EmergencyChange/Stimulus:ev_assign' => 'Zuweisen',
'Class:EmergencyChange/Stimulus:ev_assign+' => '',
'Class:EmergencyChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
'Class:EmergencyChange/Stimulus:ev_reopen+' => '',
'Class:EmergencyChange/Stimulus:ev_plan' => 'Planen',
'Class:EmergencyChange/Stimulus:ev_plan+' => '',
'Class:EmergencyChange/Stimulus:ev_approve' => 'Bestätigen',
'Class:EmergencyChange/Stimulus:ev_approve+' => '',
'Class:EmergencyChange/Stimulus:ev_replan' => 'Umplanen',
'Class:EmergencyChange/Stimulus:ev_replan+' => '',
'Class:EmergencyChange/Stimulus:ev_notapprove' => 'Bestätigen zurücknehmen',
'Class:EmergencyChange/Stimulus:ev_notapprove+' => '',
'Class:EmergencyChange/Stimulus:ev_implement' => 'Implementieren',
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
'Class:EmergencyChange/Stimulus:ev_monitor' => 'Überwachen',
'Class:EmergencyChange/Stimulus:ev_monitor+' => '',
'Class:EmergencyChange/Stimulus:ev_finish' => 'Abschließen',
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
));
?>
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:RoutineChange' => 'Routine Change',
'Class:RoutineChange+' => '',
'Class:RoutineChange/Stimulus:ev_validate' => 'Validieren',
'Class:RoutineChange/Stimulus:ev_validate+' => '',
'Class:RoutineChange/Stimulus:ev_reject' => 'Ablehnen',
'Class:RoutineChange/Stimulus:ev_assign' => 'Zuweisen',
'Class:RoutineChange/Stimulus:ev_assign+' => '',
'Class:RoutineChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
'Class:RoutineChange/Stimulus:ev_reopen+' => '',
'Class:RoutineChange/Stimulus:ev_plan' => 'Planen',
'Class:RoutineChange/Stimulus:ev_plan+' => '',
'Class:RoutineChange/Stimulus:ev_approve' => 'Genehmigen',
'Class:RoutineChange/Stimulus:ev_replan' => 'Umplanen',
'Class:RoutineChange/Stimulus:ev_replan+' => '',
'Class:RoutineChange/Stimulus:ev_notapprove' => 'Nicht genehmigen',
'Class:RoutineChange/Stimulus:ev_implement' => 'Implementieren',
'Class:RoutineChange/Stimulus:ev_implement+' => '',
'Class:RoutineChange/Stimulus:ev_monitor' => 'Überwachen',
'Class:RoutineChange/Stimulus:ev_monitor+' => '',
'Class:RoutineChange/Stimulus:ev_finish' => 'Abschließen',
'Class:RoutineChange/Stimulus:ev_finish+' => '',
'Class:NormalChange' => 'Normaler Change',
'Class:NormalChange+' => '',
'Class:NormalChange/Attribute:acceptance_date' => 'Datum der Bewilligung',
'Class:NormalChange/Attribute:acceptance_date+' => '',
'Class:NormalChange/Attribute:acceptance_comment' => 'Kommentar zur Bewilligung',
'Class:NormalChange/Attribute:acceptance_comment+' => '',
'Class:NormalChange/Stimulus:ev_validate' => 'Validieren',
'Class:NormalChange/Stimulus:ev_validate+' => '',
'Class:NormalChange/Stimulus:ev_reject' => 'Ablehnen',
'Class:NormalChange/Stimulus:ev_reject+' => '',
'Class:NormalChange/Stimulus:ev_assign' => 'Zuweisen',
'Class:NormalChange/Stimulus:ev_assign+' => '',
'Class:NormalChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
'Class:NormalChange/Stimulus:ev_reopen+' => '',
'Class:NormalChange/Stimulus:ev_plan' => 'Planen',
'Class:NormalChange/Stimulus:ev_plan+' => '',
'Class:NormalChange/Stimulus:ev_approve' => 'Bestätigen',
'Class:NormalChange/Stimulus:ev_approve+' => '',
'Class:NormalChange/Stimulus:ev_replan' => 'Umplanen',
'Class:NormalChange/Stimulus:ev_replan+' => '',
'Class:NormalChange/Stimulus:ev_notapprove' => 'Bestätigen zurücknehmen',
'Class:NormalChange/Stimulus:ev_notapprove+' => '',
'Class:NormalChange/Stimulus:ev_implement' => 'Implementieren',
'Class:NormalChange/Stimulus:ev_implement+' => '',
'Class:NormalChange/Stimulus:ev_monitor' => 'Überwachen',
'Class:NormalChange/Stimulus:ev_monitor+' => '',
'Class:NormalChange/Stimulus:ev_finish' => 'Abschließen',
'Class:NormalChange/Stimulus:ev_finish+' => '',
'Class:EmergencyChange' => 'Emergency Change',
'Class:EmergencyChange+' => '',
'Class:EmergencyChange/Stimulus:ev_validate' => 'Validieren',
'Class:EmergencyChange/Stimulus:ev_validate+' => '',
'Class:EmergencyChange/Stimulus:ev_reject' => 'Ablehnen',
'Class:EmergencyChange/Stimulus:ev_reject+' => '',
'Class:EmergencyChange/Stimulus:ev_assign' => 'Zuweisen',
'Class:EmergencyChange/Stimulus:ev_assign+' => '',
'Class:EmergencyChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
'Class:EmergencyChange/Stimulus:ev_reopen+' => '',
'Class:EmergencyChange/Stimulus:ev_plan' => 'Planen',
'Class:EmergencyChange/Stimulus:ev_plan+' => '',
'Class:EmergencyChange/Stimulus:ev_approve' => 'Bestätigen',
'Class:EmergencyChange/Stimulus:ev_approve+' => '',
'Class:EmergencyChange/Stimulus:ev_replan' => 'Umplanen',
'Class:EmergencyChange/Stimulus:ev_replan+' => '',
'Class:EmergencyChange/Stimulus:ev_notapprove' => 'Bestätigen zurücknehmen',
'Class:EmergencyChange/Stimulus:ev_notapprove+' => '',
'Class:EmergencyChange/Stimulus:ev_implement' => 'Implementieren',
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
'Class:EmergencyChange/Stimulus:ev_monitor' => 'Überwachen',
'Class:EmergencyChange/Stimulus:ev_monitor+' => '',
'Class:EmergencyChange/Stimulus:ev_finish' => 'Abschließen',
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
'Menu:ChangeManagement' => 'Change Management',
'Menu:Change:Overview' => 'Übersicht',
'Menu:Change:Overview+' => '',
'Menu:NewChange' => 'Neuer Change',
'Menu:NewChange+' => 'Ein neues Change Ticket erstellen',
'Menu:SearchChanges' => 'Nach Changes suchen',
'Menu:SearchChanges+' => 'Nach Change Tickets suchen',
'Menu:Change:Shortcuts' => 'Shortcuts',
'Menu:Change:Shortcuts+' => '',
'Menu:WaitingAcceptance' => 'Changes, die auf Bestätigung warten',
'Menu:WaitingAcceptance+' => '',
'Menu:WaitingApproval' => 'Changes, die auf Genehmigung warten',
'Menu:WaitingApproval+' => '',
'Menu:Changes' => 'Offene Changes',
'Menu:Changes+' => 'Alle Offene Changes',
'Menu:MyChanges' => 'An mich zugewiesene Changes',
'Menu:MyChanges+' => 'An mich zugewiesene Changes (als Bearbeiter)',
'Class:Change' => 'Change',
'Class:Change+' => '',
'Class:Change/Attribute:start_date' => 'Geplanter Start',
'Class:Change/Attribute:start_date+' => '',
'Class:Change/Attribute:status' => 'Status',
'Class:Change/Attribute:status+' => '',
'Class:Change/Attribute:status/Value:new' => 'Neu',
'Class:Change/Attribute:status/Value:new+' => '',
'Class:Change/Attribute:status/Value:validated' => 'Validiert',
'Class:Change/Attribute:status/Value:validated+' => '',
'Class:Change/Attribute:status/Value:rejected' => 'Abgelehnt',
'Class:Change/Attribute:status/Value:rejected+' => '',
'Class:Change/Attribute:status/Value:assigned' => 'Zugewiesen',
'Class:Change/Attribute:status/Value:assigned+' => '',
'Class:Change/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
'Class:Change/Attribute:status/Value:plannedscheduled+' => '',
'Class:Change/Attribute:status/Value:approved' => 'Genehmigt',
'Class:Change/Attribute:status/Value:approved+' => '',
'Class:Change/Attribute:status/Value:notapproved' => 'Nicht genehmigt',
'Class:Change/Attribute:status/Value:notapproved+' => '',
'Class:Change/Attribute:status/Value:implemented' => 'Implementiert',
'Class:Change/Attribute:status/Value:implemented+' => '',
'Class:Change/Attribute:status/Value:monitored' => 'Überwacht',
'Class:Change/Attribute:status/Value:monitored+' => '',
'Class:Change/Attribute:status/Value:closed' => 'Geschlossen',
'Class:Change/Attribute:status/Value:closed+' => '',
'Class:Change/Attribute:reason' => 'Ursache',
'Class:Change/Attribute:reason+' => '',
'Class:Change/Attribute:requestor_id' => 'Antragsteller',
'Class:Change/Attribute:requestor_id+' => '',
'Class:Change/Attribute:requestor_email' => 'Antragsteller',
'Class:Change/Attribute:requestor_email+' => '',
'Class:Change/Attribute:org_id' => 'Kunde',
'Class:Change/Attribute:org_id+' => '',
'Class:Change/Attribute:org_name' => 'Kunde',
'Class:Change/Attribute:org_name+' => '',
'Class:Change/Attribute:workgroup_id' => 'Arbeitsgruppe',
'Class:Change/Attribute:workgroup_id+' => '',
'Class:Change/Attribute:workgroup_name' => 'Arbeitsgruppe',
'Class:Change/Attribute:workgroup_name+' => '',
'Class:Change/Attribute:creation_date' => 'Erstellt',
'Class:Change/Attribute:creation_date+' => '',
'Class:Change/Attribute:last_update' => 'Letzte Aktualisierung',
'Class:Change/Attribute:last_update+' => '',
'Class:Change/Attribute:end_date' => 'Enddatum',
'Class:Change/Attribute:end_date+' => '',
'Class:Change/Attribute:close_date' => 'Geschlossen',
'Class:Change/Attribute:close_date+' => '',
'Class:Change/Attribute:impact' => 'Auswirkung',
'Class:Change/Attribute:impact+' => '',
'Class:Change/Attribute:agent_id' => 'Bearbeiter',
'Class:Change/Attribute:agent_id+' => '',
'Class:Change/Attribute:agent_name' => 'Bearbeiter',
'Class:Change/Attribute:agent_name+' => '',
'Class:Change/Attribute:agent_email' => 'Bearbeiter',
'Class:Change/Attribute:agent_email+' => '',
'Class:Change/Attribute:supervisor_group_id' => 'Aufsichts-Team',
'Class:Change/Attribute:supervisor_group_id+' => '',
'Class:Change/Attribute:supervisor_group_name' => 'Aufsichts-Team',
'Class:Change/Attribute:supervisor_group_name+' => '',
'Class:Change/Attribute:supervisor_id' => 'Aufsicht',
'Class:Change/Attribute:supervisor_id+' => '',
'Class:Change/Attribute:supervisor_email' => 'Aufsicht',
'Class:Change/Attribute:supervisor_email+' => '',
'Class:Change/Attribute:manager_group_id' => 'Manager-Team',
'Class:Change/Attribute:manager_group_id+' => '',
'Class:Change/Attribute:manager_group_name' => 'Manager-Team',
'Class:Change/Attribute:manager_group_name+' => '',
'Class:Change/Attribute:manager_id' => 'Manager',
'Class:Change/Attribute:manager_id+' => '',
'Class:Change/Attribute:manager_email' => 'Manager',
'Class:Change/Attribute:manager_email+' => '',
'Class:Change/Attribute:outage' => 'Ausfall',
'Class:Change/Attribute:outage+' => '',
'Class:Change/Attribute:outage/Value:yes' => 'Ja',
'Class:Change/Attribute:outage/Value:yes+' => '',
'Class:Change/Attribute:outage/Value:no' => 'Nein',
'Class:Change/Attribute:outage/Value:no+' => '',
'Class:Change/Attribute:change_request' => 'Anfrage',
'Class:Change/Attribute:change_request+' => '',
'Class:Change/Attribute:fallback' => 'Fallback-Plan',
'Class:Change/Attribute:fallback+' => '',
'Class:Change/Stimulus:ev_validate' => 'Validieren',
'Class:Change/Stimulus:ev_validate+' => '',
'Class:Change/Stimulus:ev_reject' => 'Ablehnen',
'Class:Change/Stimulus:ev_reject+' => '',
'Class:Change/Stimulus:ev_assign' => 'Zuweisen',
'Class:Change/Stimulus:ev_assign+' => '',
'Class:Change/Stimulus:ev_reopen' => 'Wiedereröffnen',
'Class:Change/Stimulus:ev_reopen+' => '',
'Class:Change/Stimulus:ev_plan' => 'Planen',
'Class:Change/Stimulus:ev_plan+' => '',
'Class:Change/Stimulus:ev_approve' => 'Bestätigen',
'Class:Change/Stimulus:ev_approve+' => '',
'Class:Change/Stimulus:ev_replan' => 'Umplanen',
'Class:Change/Stimulus:ev_replan+' => '',
'Class:Change/Stimulus:ev_notapprove' => 'Ablehnen',
'Class:Change/Stimulus:ev_notapprove+' => '',
'Class:Change/Stimulus:ev_implement' => 'Implementieren',
'Class:Change/Stimulus:ev_implement+' => '',
'Class:Change/Stimulus:ev_monitor' => 'Überwachen',
'Class:Change/Stimulus:ev_monitor+' => '',
'Class:Change/Stimulus:ev_finish' => 'Abschließen',
'Class:Change/Stimulus:ev_finish+' => '',
'Class:RoutineChange/Attribute:status/Value:new' => 'Neu',
'Class:RoutineChange/Attribute:status/Value:new+' => '',
'Class:RoutineChange/Attribute:status/Value:assigned' => 'Zugewiesen',
'Class:RoutineChange/Attribute:status/Value:assigned+' => '',
'Class:RoutineChange/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
'Class:RoutineChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:RoutineChange/Attribute:status/Value:approved' => 'Bestätigt',
'Class:RoutineChange/Attribute:status/Value:approved+' => '',
'Class:RoutineChange/Attribute:status/Value:implemented' => 'Implementiert',
'Class:RoutineChange/Attribute:status/Value:implemented+' => '',
'Class:RoutineChange/Attribute:status/Value:monitored' => 'Überwachen',
'Class:RoutineChange/Attribute:status/Value:monitored+' => '',
'Class:RoutineChange/Attribute:status/Value:closed' => 'Geschlossen',
'Class:RoutineChange/Attribute:status/Value:closed+' => '',
'Class:ApprovedChange' => 'Bewilligte Changes',
'Class:ApprovedChange+' => '',
'Class:ApprovedChange/Attribute:approval_date' => 'Datum der Bewilligung',
'Class:ApprovedChange/Attribute:approval_date+' => '',
'Class:ApprovedChange/Attribute:approval_comment' => 'Kommentar zur Bewilligung',
'Class:ApprovedChange/Attribute:approval_comment+' => '',
'Class:ApprovedChange/Stimulus:ev_validate' => 'Validieren',
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
'Class:ApprovedChange/Stimulus:ev_reject' => 'Ablehnen',
'Class:ApprovedChange/Stimulus:ev_reject+' => '',
'Class:ApprovedChange/Stimulus:ev_assign' => 'Zuweisen',
'Class:ApprovedChange/Stimulus:ev_assign+' => '',
'Class:ApprovedChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
'Class:ApprovedChange/Stimulus:ev_reopen+' => '',
'Class:ApprovedChange/Stimulus:ev_plan' => 'Planen',
'Class:ApprovedChange/Stimulus:ev_plan+' => '',
'Class:ApprovedChange/Stimulus:ev_approve' => 'Bestätigen',
'Class:ApprovedChange/Stimulus:ev_approve+' => '',
'Class:ApprovedChange/Stimulus:ev_replan' => 'Umplanen',
'Class:ApprovedChange/Stimulus:ev_replan+' => '',
'Class:ApprovedChange/Stimulus:ev_notapprove' => 'Bestätigen zurücknehmen',
'Class:ApprovedChange/Stimulus:ev_notapprove+' => '',
'Class:ApprovedChange/Stimulus:ev_implement' => 'Implementieren',
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
'Class:ApprovedChange/Stimulus:ev_monitor' => 'Überwachen',
'Class:ApprovedChange/Stimulus:ev_monitor+' => '',
'Class:ApprovedChange/Stimulus:ev_finish' => 'Abschließen',
'Class:ApprovedChange/Stimulus:ev_finish+' => '',
'Class:NormalChange/Attribute:status/Value:new' => 'Neu',
'Class:NormalChange/Attribute:status/Value:new+' => '',
'Class:NormalChange/Attribute:status/Value:validated' => 'Validiert',
'Class:NormalChange/Attribute:status/Value:validated+' => '',
'Class:NormalChange/Attribute:status/Value:rejected' => 'Abgelehnt',
'Class:NormalChange/Attribute:status/Value:rejected+' => '',
'Class:NormalChange/Attribute:status/Value:assigned' => 'Zugewiesen',
'Class:NormalChange/Attribute:status/Value:assigned+' => '',
'Class:NormalChange/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
'Class:NormalChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:NormalChange/Attribute:status/Value:approved' => 'Bestätigt',
'Class:NormalChange/Attribute:status/Value:approved+' => '',
'Class:NormalChange/Attribute:status/Value:notapproved' => 'Nicht bestätigt',
'Class:NormalChange/Attribute:status/Value:notapproved+' => '',
'Class:NormalChange/Attribute:status/Value:implemented' => 'Implementiert',
'Class:NormalChange/Attribute:status/Value:implemented+' => '',
'Class:NormalChange/Attribute:status/Value:monitored' => 'Überwachen',
'Class:NormalChange/Attribute:status/Value:monitored+' => '',
'Class:NormalChange/Attribute:status/Value:closed' => 'Geschlossen',
'Class:NormalChange/Attribute:status/Value:closed+' => '',
'Class:EmergencyChange/Attribute:status/Value:new' => 'Neu',
'Class:EmergencyChange/Attribute:status/Value:new+' => '',
'Class:EmergencyChange/Attribute:status/Value:validated' => 'Validiert',
'Class:EmergencyChange/Attribute:status/Value:validated+' => '',
'Class:EmergencyChange/Attribute:status/Value:rejected' => 'Abgelehnt',
'Class:EmergencyChange/Attribute:status/Value:rejected+' => '',
'Class:EmergencyChange/Attribute:status/Value:assigned' => 'Zugewiesen',
'Class:EmergencyChange/Attribute:status/Value:assigned+' => '',
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:EmergencyChange/Attribute:status/Value:approved' => 'Bestätigt',
'Class:EmergencyChange/Attribute:status/Value:approved+' => '',
'Class:EmergencyChange/Attribute:status/Value:notapproved' => 'Nicht bestätigt',
'Class:EmergencyChange/Attribute:status/Value:notapproved+' => '',
'Class:EmergencyChange/Attribute:status/Value:implemented' => 'Implementiert',
'Class:EmergencyChange/Attribute:status/Value:implemented+' => '',
'Class:EmergencyChange/Attribute:status/Value:monitored' => 'Überwachen',
'Class:EmergencyChange/Attribute:status/Value:monitored+' => '',
'Class:EmergencyChange/Attribute:status/Value:closed' => 'Geschlossen',
'Class:EmergencyChange/Attribute:status/Value:closed+' => '',
));
?>

View File

@@ -20,28 +20,27 @@
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @author Hirofumi Kosaka <kosaka@rworks.jp>
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Menu:ChangeManagement' => '変更管理', # 'Change management',
'Menu:Change:Overview' => '概要', # 'Overview',
'Menu:Change:Overview+' => '', # '',
'Menu:NewChange' => '新規変更', # 'New Change',
'Menu:NewChange+' => '新規変更のチケット作成', # 'Create a new Change ticket',
'Menu:SearchChanges' => '変更検索', # 'Search for Changes',
'Menu:SearchChanges+' => '変更チケット検索', # 'Search for Change tickets',
'Menu:Change:Shortcuts' => 'ショートカット', # 'Shortcuts',
'Menu:Change:Shortcuts+' => '', # '',
'Menu:WaitingAcceptance' => '受理待ちの変更', # 'Changes awaiting acceptance',
'Menu:WaitingAcceptance+' => '', # '',
'Menu:WaitingApproval' => '承認待ちの変更', # 'Changes awaiting approval',
'Menu:WaitingApproval+' => '', # '',
'Menu:Changes' => '担当のいない変更', # 'Opened changes',
'Menu:Changes+' => '', # '',
'Menu:MyChanges' => '担当している変更', # 'Changes assigned to me',
'Menu:MyChanges+' => '担当している変更(エージェント)', # 'Changes assigned to me (as Agent)',
'Menu:ChangeManagement' => '変更管理',
'Menu:Change:Overview' => '概要',
'Menu:Change:Overview+' => '',
'Menu:NewChange' => '新規変更',
'Menu:NewChange+' => '新規変更のチケット作成',
'Menu:SearchChanges' => '変更検索',
'Menu:SearchChanges+' => '変更チケット検索',
'Menu:Change:Shortcuts' => 'ショートカット',
'Menu:Change:Shortcuts+' => '',
'Menu:WaitingAcceptance' => '受理待ちの変更',
'Menu:WaitingAcceptance+' => '',
'Menu:WaitingApproval' => '承認待ちの変更',
'Menu:WaitingApproval+' => '',
'Menu:Changes' => 'オープン状態の変更',
'Menu:Changes+' => '',
'Menu:MyChanges' => '担当している変更',
'Menu:MyChanges+' => '担当している変更(エージェントとして)',
));
// Dictionnay conventions
@@ -60,110 +59,110 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:Change' => '変更', # 'Change',
'Class:Change+' => '', # '',
'Class:Change/Attribute:start_date' => '開始計画日', # 'Planned startup',
'Class:Change/Attribute:start_date+' => '', # '',
'Class:Change/Attribute:status' => 'ステータス', # 'Status',
'Class:Change/Attribute:status+' => '', # '',
'Class:Change/Attribute:status/Value:new' => '新規', # 'New',
'Class:Change/Attribute:status/Value:new+' => '', # '',
'Class:Change/Attribute:status/Value:validated' => '受付済', # 'Validated',
'Class:Change/Attribute:status/Value:validated+' => '', # '',
'Class:Change/Attribute:status/Value:rejected' => '却下済', # 'Rejected',
'Class:Change/Attribute:status/Value:rejected+' => '', # '',
'Class:Change/Attribute:status/Value:assigned' => '割当済', # 'Assigned',
'Class:Change/Attribute:status/Value:assigned+' => '', # '',
'Class:Change/Attribute:status/Value:plannedscheduled' => '計画・予定された', # 'Planned and scheduled',
'Class:Change/Attribute:status/Value:plannedscheduled+' => '', # '',
'Class:Change/Attribute:status/Value:approved' => '承認済', # 'Approved',
'Class:Change/Attribute:status/Value:approved+' => '', # '',
'Class:Change/Attribute:status/Value:notapproved' => '未承認', # 'Not approved',
'Class:Change/Attribute:status/Value:notapproved+' => '', # '',
'Class:Change/Attribute:status/Value:implemented' => '実施済み', # 'Implemented',
'Class:Change/Attribute:status/Value:implemented+' => '', # '',
'Class:Change/Attribute:status/Value:monitored' => '経過観察', # 'Monitored',
'Class:Change/Attribute:status/Value:monitored+' => '', # '',
'Class:Change/Attribute:status/Value:closed' => '完了', # 'Closed',
'Class:Change/Attribute:status/Value:closed+' => '', # '',
'Class:Change/Attribute:reason' => '理由', # 'Reason',
'Class:Change/Attribute:reason+' => '', # '',
'Class:Change/Attribute:requestor_id' => '依頼者', # 'Requestor',
'Class:Change/Attribute:requestor_id+' => '', # '',
'Class:Change/Attribute:requestor_email' => '依頼者', # 'Requestor',
'Class:Change/Attribute:requestor_email+' => '', # '',
'Class:Change/Attribute:org_id' => '顧客', # 'Customer',
'Class:Change/Attribute:org_id+' => '', # '',
'Class:Change/Attribute:org_name' => '顧客', # 'Customer',
'Class:Change/Attribute:org_name+' => '', # '',
'Class:Change/Attribute:workgroup_id' => '作業グループ', # 'Workgroup',
'Class:Change/Attribute:workgroup_id+' => '', # '',
'Class:Change/Attribute:workgroup_name' => '作業グループ', # 'Workgroup',
'Class:Change/Attribute:workgroup_name+' => '', # '',
'Class:Change/Attribute:creation_date' => '作成', # 'Created',
'Class:Change/Attribute:creation_date+' => '', # '',
'Class:Change/Attribute:last_update' => '最終更新', # 'Last update',
'Class:Change/Attribute:last_update+' => '', # '',
'Class:Change/Attribute:end_date' => '作業終了', # 'End date',
'Class:Change/Attribute:end_date+' => '', # '',
'Class:Change/Attribute:close_date' => '完了', # 'Closed',
'Class:Change/Attribute:close_date+' => '', # '',
'Class:Change/Attribute:impact' => '影響', # 'Impact',
'Class:Change/Attribute:impact+' => '', # '',
'Class:Change/Attribute:agent_id' => 'エージェント', # 'Agent',
'Class:Change/Attribute:agent_id+' => '', # '',
'Class:Change/Attribute:agent_name' => 'エージェント', # 'Agent',
'Class:Change/Attribute:agent_name+' => '', # '',
'Class:Change/Attribute:agent_email' => 'エージェント', # 'Agent','Agent', # 'Agent',
'Class:Change/Attribute:agent_email+' => '', # '',
'Class:Change/Attribute:supervisor_group_id' => '監督者チーム', # 'Supervisor team',
'Class:Change/Attribute:supervisor_group_id+' => '', # '',
'Class:Change/Attribute:supervisor_group_name' => '監督者チーム', # 'Supervisor team',
'Class:Change/Attribute:supervisor_group_name+' => '', # '',
'Class:Change/Attribute:supervisor_id' => '監督者', # 'Supervisor',
'Class:Change/Attribute:supervisor_id+' => '', # '',
'Class:Change/Attribute:supervisor_email' => '監督者', # 'Supervisor',
'Class:Change/Attribute:supervisor_email+' => '', # '',
'Class:Change/Attribute:manager_group_id' => 'マネジャーチーム', # 'Manager team',
'Class:Change/Attribute:manager_group_id+' => '', # '',
'Class:Change/Attribute:manager_group_name' => 'マネジャーチーム', # 'Manager team',
'Class:Change/Attribute:manager_group_name+' => '', # '',
'Class:Change/Attribute:manager_id' => 'マネジャー', # 'Manager',
'Class:Change/Attribute:manager_id+' => '', # '',
'Class:Change/Attribute:manager_email' => 'マネジャー', # 'Manager',
'Class:Change/Attribute:manager_email+' => '', # '',
'Class:Change/Attribute:outage' => '停止', # 'Outage',
'Class:Change/Attribute:outage+' => '', # '',
'Class:Change/Attribute:outage/Value:yes' => 'はい', # 'Yes',
'Class:Change/Attribute:outage/Value:yes+' => '', # '',
'Class:Change/Attribute:outage/Value:no' => 'いいえ', # 'No',
'Class:Change/Attribute:outage/Value:no+' => '', # '',
'Class:Change/Attribute:change_request' => 'リクエスト', # 'Request',
'Class:Change/Attribute:change_request+' => '', # '',
'Class:Change/Attribute:fallback' => '代替計画', # 'Fallback plan',
'Class:Change/Attribute:fallback+' => '', # '',
'Class:Change/Stimulus:ev_validate' => '受', # 'Validate',
'Class:Change/Stimulus:ev_validate+' => '', # '',
'Class:Change/Stimulus:ev_reject' => '却下', # 'Reject',
'Class:Change/Stimulus:ev_reject+' => '', # '',
'Class:Change/Stimulus:ev_assign' => '担当割', # 'Assign',
'Class:Change/Stimulus:ev_assign+' => '', # '',
'Class:Change/Stimulus:ev_reopen' => '再開', # 'Reopen',
'Class:Change/Stimulus:ev_reopen+' => '', # '',
'Class:Change/Stimulus:ev_plan' => '計画', # 'Plan',
'Class:Change/Stimulus:ev_plan+' => '', # '',
'Class:Change/Stimulus:ev_approve' => '承認', # 'Approve',
'Class:Change/Stimulus:ev_approve+' => '', # '',
'Class:Change/Stimulus:ev_replan' => '再計画', # 'Replan',
'Class:Change/Stimulus:ev_replan+' => '', # '',
'Class:Change/Stimulus:ev_notapprove' => '却下', # 'Reject',
'Class:Change/Stimulus:ev_notapprove+' => '', # '',
'Class:Change/Stimulus:ev_implement' => '実施', # 'Implement',
'Class:Change/Stimulus:ev_implement+' => '', # '',
'Class:Change/Stimulus:ev_monitor' => '経過観察', # 'Monitor',
'Class:Change/Stimulus:ev_monitor+' => '', # '',
'Class:Change/Stimulus:ev_finish' => '作業終了', # 'Finish',
'Class:Change/Stimulus:ev_finish+' => '', # '',
'Class:Change' => '変更',
'Class:Change+' => '',
'Class:Change/Attribute:start_date' => '開始計画日',
'Class:Change/Attribute:start_date+' => '',
'Class:Change/Attribute:status' => '状態',
'Class:Change/Attribute:status+' => '',
'Class:Change/Attribute:status/Value:new' => '新規',
'Class:Change/Attribute:status/Value:new+' => '',
'Class:Change/Attribute:status/Value:validated' => '受け付け済み',
'Class:Change/Attribute:status/Value:validated+' => '',
'Class:Change/Attribute:status/Value:rejected' => '却下済',
'Class:Change/Attribute:status/Value:rejected+' => '',
'Class:Change/Attribute:status/Value:assigned' => '割り当て済み',
'Class:Change/Attribute:status/Value:assigned+' => '',
'Class:Change/Attribute:status/Value:plannedscheduled' => '計画・予定された',
'Class:Change/Attribute:status/Value:plannedscheduled+' => '',
'Class:Change/Attribute:status/Value:approved' => '承認済',
'Class:Change/Attribute:status/Value:approved+' => '',
'Class:Change/Attribute:status/Value:notapproved' => '未承認',
'Class:Change/Attribute:status/Value:notapproved+' => '',
'Class:Change/Attribute:status/Value:implemented' => '実施済み',
'Class:Change/Attribute:status/Value:implemented+' => '',
'Class:Change/Attribute:status/Value:monitored' => '経過観察',
'Class:Change/Attribute:status/Value:monitored+' => '',
'Class:Change/Attribute:status/Value:closed' => 'クローズ',
'Class:Change/Attribute:status/Value:closed+' => '',
'Class:Change/Attribute:reason' => '理由',
'Class:Change/Attribute:reason+' => '',
'Class:Change/Attribute:requestor_id' => '依頼者',
'Class:Change/Attribute:requestor_id+' => '',
'Class:Change/Attribute:requestor_email' => '依頼者',
'Class:Change/Attribute:requestor_email+' => '',
'Class:Change/Attribute:org_id' => '顧客',
'Class:Change/Attribute:org_id+' => '',
'Class:Change/Attribute:org_name' => '顧客',
'Class:Change/Attribute:org_name+' => '',
'Class:Change/Attribute:workgroup_id' => '作業グループ',
'Class:Change/Attribute:workgroup_id+' => '',
'Class:Change/Attribute:workgroup_name' => '作業グループ',
'Class:Change/Attribute:workgroup_name+' => '',
'Class:Change/Attribute:creation_date' => '作成',
'Class:Change/Attribute:creation_date+' => '',
'Class:Change/Attribute:last_update' => '最終更新',
'Class:Change/Attribute:last_update+' => '',
'Class:Change/Attribute:end_date' => '終了',
'Class:Change/Attribute:end_date+' => '',
'Class:Change/Attribute:close_date' => 'クローズ',
'Class:Change/Attribute:close_date+' => '',
'Class:Change/Attribute:impact' => 'インパクト',
'Class:Change/Attribute:impact+' => '',
'Class:Change/Attribute:agent_id' => 'エージェント',
'Class:Change/Attribute:agent_id+' => '',
'Class:Change/Attribute:agent_name' => 'エージェント',
'Class:Change/Attribute:agent_name+' => '',
'Class:Change/Attribute:agent_email' => 'エージェント',
'Class:Change/Attribute:agent_email+' => '',
'Class:Change/Attribute:supervisor_group_id' => '監督者チーム',
'Class:Change/Attribute:supervisor_group_id+' => '',
'Class:Change/Attribute:supervisor_group_name' => '監督者チーム',
'Class:Change/Attribute:supervisor_group_name+' => '',
'Class:Change/Attribute:supervisor_id' => '監督者',
'Class:Change/Attribute:supervisor_id+' => '',
'Class:Change/Attribute:supervisor_email' => '監督者',
'Class:Change/Attribute:supervisor_email+' => '',
'Class:Change/Attribute:manager_group_id' => 'マネジャーチーム',
'Class:Change/Attribute:manager_group_id+' => '',
'Class:Change/Attribute:manager_group_name' => 'マネジャーチーム',
'Class:Change/Attribute:manager_group_name+' => '',
'Class:Change/Attribute:manager_id' => 'マネジャー',
'Class:Change/Attribute:manager_id+' => '',
'Class:Change/Attribute:manager_email' => 'マネジャー',
'Class:Change/Attribute:manager_email+' => '',
'Class:Change/Attribute:outage' => '停止',
'Class:Change/Attribute:outage+' => '',
'Class:Change/Attribute:outage/Value:yes' => 'はい',
'Class:Change/Attribute:outage/Value:yes+' => '',
'Class:Change/Attribute:outage/Value:no' => 'いいえ',
'Class:Change/Attribute:outage/Value:no+' => '',
'Class:Change/Attribute:change_request' => '要求',
'Class:Change/Attribute:change_request+' => '',
'Class:Change/Attribute:fallback' => '代替計画',
'Class:Change/Attribute:fallback+' => '',
'Class:Change/Stimulus:ev_validate' => '受け付け',
'Class:Change/Stimulus:ev_validate+' => '',
'Class:Change/Stimulus:ev_reject' => '却下',
'Class:Change/Stimulus:ev_reject+' => '',
'Class:Change/Stimulus:ev_assign' => '担当割り当て',
'Class:Change/Stimulus:ev_assign+' => '',
'Class:Change/Stimulus:ev_reopen' => '再開',
'Class:Change/Stimulus:ev_reopen+' => '',
'Class:Change/Stimulus:ev_plan' => '計画',
'Class:Change/Stimulus:ev_plan+' => '',
'Class:Change/Stimulus:ev_approve' => '承認',
'Class:Change/Stimulus:ev_approve+' => '',
'Class:Change/Stimulus:ev_replan' => '再計画',
'Class:Change/Stimulus:ev_replan+' => '',
'Class:Change/Stimulus:ev_notapprove' => '却下',
'Class:Change/Stimulus:ev_notapprove+' => '',
'Class:Change/Stimulus:ev_implement' => '実施',
'Class:Change/Stimulus:ev_implement+' => '',
'Class:Change/Stimulus:ev_monitor' => '経過観察',
'Class:Change/Stimulus:ev_monitor+' => '',
'Class:Change/Stimulus:ev_finish' => '終了',
'Class:Change/Stimulus:ev_finish+' => '',
));
//
@@ -171,38 +170,41 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:RoutineChange' => '定期変更', # 'Routine Change',
'Class:RoutineChange+' => '', # '',
'Class:RoutineChange/Attribute:status/Value:new' => '新規', # 'New',
'Class:RoutineChange/Attribute:status/Value:new+' => '', # '',
'Class:RoutineChange/Attribute:status/Value:assigned' => '割当済', # 'Assigned',
'Class:RoutineChange/Attribute:status/Value:assigned+' => '', # '',
'Class:RoutineChange/Attribute:status/Value:plannedscheduled' => '計画・予定された', # 'Planned and scheduled',
'Class:RoutineChange/Attribute:status/Value:plannedscheduled+' => '', # '',
'Class:RoutineChange/Attribute:status/Value:approved' => '承認済', # 'Approved',
'Class:RoutineChange/Attribute:status/Value:approved+' => '', # '',
'Class:RoutineChange/Attribute:status/Value:implemented' => '実施済', # 'Implemented',
'Class:RoutineChange/Attribute:status/Value:implemented+' => '', # '',
'Class:RoutineChange/Attribute:status/Value:monitored' => '経過観察中', # 'Monitored',
'Class:RoutineChange/Attribute:status/Value:monitored+' => '', # '',
'Class:RoutineChange/Attribute:status/Value:closed' => '完了', # 'Closed',
'Class:RoutineChange/Attribute:status/Value:closed+' => '', # '',
'Class:RoutineChange/Stimulus:ev_validate' => '受', # 'Validate',
'Class:RoutineChange/Stimulus:ev_validate+' => '', # '',
'Class:RoutineChange/Stimulus:ev_assign' => '担当割当', # 'Assign',
'Class:RoutineChange/Stimulus:ev_assign+' => '', # '',
'Class:RoutineChange/Stimulus:ev_reopen' => '再', # 'Reopen',
'Class:RoutineChange/Stimulus:ev_reopen+' => '', # '',
'Class:RoutineChange/Stimulus:ev_plan' => '計画', # 'Plan',
'Class:RoutineChange/Stimulus:ev_plan+' => '', # '',
'Class:RoutineChange/Stimulus:ev_replan' => '再計画', # 'Replan',
'Class:RoutineChange/Stimulus:ev_replan+' => '', # '',
'Class:RoutineChange/Stimulus:ev_implement' => '実施', # 'Implement',
'Class:RoutineChange/Stimulus:ev_implement+' => '', # '',
'Class:RoutineChange/Stimulus:ev_monitor' => '経過観察', # 'Monitor',
'Class:RoutineChange/Stimulus:ev_monitor+' => '', # '',
'Class:RoutineChange/Stimulus:ev_finish' => '作業終了', # 'Finish',
'Class:RoutineChange/Stimulus:ev_finish+' => '', # '',
'Class:RoutineChange' => 'ルーチン変更',
'Class:RoutineChange+' => '',
'Class:RoutineChange/Attribute:status/Value:new' => '新規',
'Class:RoutineChange/Attribute:status/Value:new+' => '',
'Class:RoutineChange/Attribute:status/Value:assigned' => '割当済',
'Class:RoutineChange/Attribute:status/Value:assigned+' => '',
'Class:RoutineChange/Attribute:status/Value:plannedscheduled' => '計画・予定された',
'Class:RoutineChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:RoutineChange/Attribute:status/Value:approved' => '承認済',
'Class:RoutineChange/Attribute:status/Value:approved+' => '',
'Class:RoutineChange/Attribute:status/Value:implemented' => '実施済',
'Class:RoutineChange/Attribute:status/Value:implemented+' => '',
'Class:RoutineChange/Attribute:status/Value:monitored' => '経過観察中',
'Class:RoutineChange/Attribute:status/Value:monitored+' => '',
'Class:RoutineChange/Attribute:status/Value:closed' => 'クローズ',
'Class:RoutineChange/Attribute:status/Value:closed+' => '',
'Class:RoutineChange/Stimulus:ev_validate' => '受け付け',
'Class:RoutineChange/Stimulus:ev_validate+' => '',
'Class:RoutineChange/Stimulus:ev_assign' => '割り当て',
'Class:RoutineChange/Stimulus:ev_assign+' => '',
'Class:RoutineChange/Stimulus:ev_reopen' => '再オープン',
'Class:RoutineChange/Stimulus:ev_reopen+' => '',
'Class:RoutineChange/Stimulus:ev_plan' => '計画',
'Class:RoutineChange/Stimulus:ev_plan+' => '',
'Class:RoutineChange/Stimulus:ev_replan' => '再計画',
'Class:RoutineChange/Stimulus:ev_replan+' => '',
'Class:RoutineChange/Stimulus:ev_implement' => '実施',
'Class:RoutineChange/Stimulus:ev_implement+' => '',
'Class:RoutineChange/Stimulus:ev_monitor' => '経過観察',
'Class:RoutineChange/Stimulus:ev_monitor+' => '',
'Class:RoutineChange/Stimulus:ev_finish' => '終了',
'Class:RoutineChange/Stimulus:ev_finish+' => '',
'Class:RoutineChange/Stimulus:ev_reject' => '否認',
'Class:RoutineChange/Stimulus:ev_approve' => '承認',
'Class:RoutineChange/Stimulus:ev_notapprove' => '承認しない'
));
//
@@ -210,88 +212,88 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:ApprovedChange' => '承認済の変更', # 'Approved Changes',
'Class:ApprovedChange+' => '', # '',
'Class:ApprovedChange/Attribute:approval_date' => '承認日', # 'Approval Date',
'Class:ApprovedChange/Attribute:approval_date+' => '', # '',
'Class:ApprovedChange/Attribute:approval_comment' => '承認時のコメント', # 'Approval comment',
'Class:ApprovedChange/Attribute:approval_comment+' => '', # '',
'Class:ApprovedChange/Stimulus:ev_validate' => '受', # 'Validate',
'Class:ApprovedChange/Stimulus:ev_validate+' => '', # '',
'Class:ApprovedChange/Stimulus:ev_reject' => '却下', # 'Reject',
'Class:ApprovedChange/Stimulus:ev_reject+' => '', # '',
'Class:ApprovedChange/Stimulus:ev_assign' => '担当割当', # 'Assign',
'Class:ApprovedChange/Stimulus:ev_assign+' => '', # '',
'Class:ApprovedChange/Stimulus:ev_reopen' => '再', # 'Reopen',
'Class:ApprovedChange/Stimulus:ev_reopen+' => '', # '',
'Class:ApprovedChange/Stimulus:ev_plan' => '計画', # 'Plan',
'Class:ApprovedChange/Stimulus:ev_plan+' => '', # '',
'Class:ApprovedChange/Stimulus:ev_approve' => '承認', # 'Approve',
'Class:ApprovedChange/Stimulus:ev_approve+' => '', # '',
'Class:ApprovedChange/Stimulus:ev_replan' => '再計画', # 'Replan',
'Class:ApprovedChange/Stimulus:ev_replan+' => '', # '',
'Class:ApprovedChange/Stimulus:ev_notapprove' => '承認の不同意', # 'Reject approval',
'Class:ApprovedChange/Stimulus:ev_notapprove+' => '', # '',
'Class:ApprovedChange/Stimulus:ev_implement' => '実施', # 'Implement',
'Class:ApprovedChange/Stimulus:ev_implement+' => '', # '',
'Class:ApprovedChange/Stimulus:ev_monitor' => '経過観察', # 'Monitor',
'Class:ApprovedChange/Stimulus:ev_monitor+' => '', # '',
'Class:ApprovedChange/Stimulus:ev_finish' => '作業終了', # 'Finish',
'Class:ApprovedChange/Stimulus:ev_finish+' => '', # '',
'Class:ApprovedChange' => '承認済の変更',
'Class:ApprovedChange+' => '',
'Class:ApprovedChange/Attribute:approval_date' => '承認日',
'Class:ApprovedChange/Attribute:approval_date+' => '',
'Class:ApprovedChange/Attribute:approval_comment' => '承認時のコメント',
'Class:ApprovedChange/Attribute:approval_comment+' => '',
'Class:ApprovedChange/Stimulus:ev_validate' => '受け付け',
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
'Class:ApprovedChange/Stimulus:ev_reject' => '却下',
'Class:ApprovedChange/Stimulus:ev_reject+' => '',
'Class:ApprovedChange/Stimulus:ev_assign' => '割り当て',
'Class:ApprovedChange/Stimulus:ev_assign+' => '',
'Class:ApprovedChange/Stimulus:ev_reopen' => '再オープン',
'Class:ApprovedChange/Stimulus:ev_reopen+' => '',
'Class:ApprovedChange/Stimulus:ev_plan' => '計画',
'Class:ApprovedChange/Stimulus:ev_plan+' => '',
'Class:ApprovedChange/Stimulus:ev_approve' => '承認',
'Class:ApprovedChange/Stimulus:ev_approve+' => '',
'Class:ApprovedChange/Stimulus:ev_replan' => '再計画',
'Class:ApprovedChange/Stimulus:ev_replan+' => '',
'Class:ApprovedChange/Stimulus:ev_notapprove' => '承認を拒否',
'Class:ApprovedChange/Stimulus:ev_notapprove+' => '',
'Class:ApprovedChange/Stimulus:ev_implement' => '実施',
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
'Class:ApprovedChange/Stimulus:ev_monitor' => '経過観察',
'Class:ApprovedChange/Stimulus:ev_monitor+' => '',
'Class:ApprovedChange/Stimulus:ev_finish' => '終了',
'Class:ApprovedChange/Stimulus:ev_finish+' => '',
));
//
// Class: NormalChange
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:NormalChange' => '通常変更', # 'Normal Change',
'Class:NormalChange+' => '', # '',
'Class:NormalChange/Attribute:status/Value:new' => '新規', # 'New',
'Class:NormalChange/Attribute:status/Value:new+' => '', # '',
'Class:NormalChange/Attribute:status/Value:validated' => '受付済', # 'Validated',
'Class:NormalChange/Attribute:status/Value:validated+' => '', # '',
'Class:NormalChange/Attribute:status/Value:rejected' => '却下済', # 'Rejected',
'Class:NormalChange/Attribute:status/Value:rejected+' => '', # '',
'Class:NormalChange/Attribute:status/Value:assigned' => '割当済', # 'Assigned',
'Class:NormalChange/Attribute:status/Value:assigned+' => '', # '',
'Class:NormalChange/Attribute:status/Value:plannedscheduled' => '計画・予定された', # 'Planned and scheduled',
'Class:NormalChange/Attribute:status/Value:plannedscheduled+' => '', # '',
'Class:NormalChange/Attribute:status/Value:approved' => '承認済', # 'Approved',
'Class:NormalChange/Attribute:status/Value:approved+' => '', # '',
'Class:NormalChange/Attribute:status/Value:notapproved' => '未承認', # 'Not approved',
'Class:NormalChange' => '通常変更',
'Class:NormalChange+' => '',
'Class:NormalChange/Attribute:status/Value:new' => '新規',
'Class:NormalChange/Attribute:status/Value:new+' => '',
'Class:NormalChange/Attribute:status/Value:validated' => '受け付け済み',
'Class:NormalChange/Attribute:status/Value:validated+' => '',
'Class:NormalChange/Attribute:status/Value:rejected' => '却下済',
'Class:NormalChange/Attribute:status/Value:rejected+' => '',
'Class:NormalChange/Attribute:status/Value:assigned' => '割り当て済み',
'Class:NormalChange/Attribute:status/Value:assigned+' => '',
'Class:NormalChange/Attribute:status/Value:plannedscheduled' => '計画・予定された',
'Class:NormalChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:NormalChange/Attribute:status/Value:approved' => '承認済',
'Class:NormalChange/Attribute:status/Value:approved+' => '',
'Class:NormalChange/Attribute:status/Value:notapproved' => '未承認',
'Class:NormalChange/Attribute:status/Value:notapproved+' => '', # '',
'Class:NormalChange/Attribute:status/Value:implemented' => '実施済', # 'Implemented',
'Class:NormalChange/Attribute:status/Value:implemented+' => '', # '',
'Class:NormalChange/Attribute:status/Value:monitored' => '経過観察中', # 'Monitored',
'Class:NormalChange/Attribute:status/Value:monitored+' => '', # '',
'Class:NormalChange/Attribute:status/Value:closed' => '完了', # 'Closed',
'Class:NormalChange/Attribute:status/Value:closed+' => '', # '',
'Class:NormalChange/Attribute:acceptance_date' => '受理日', # 'Acceptance date',
'Class:NormalChange/Attribute:acceptance_date+' => '', # '',
'Class:NormalChange/Attribute:acceptance_comment' => '受理コメント', # 'Acceptance comment',
'Class:NormalChange/Attribute:acceptance_comment+' => '', # '',
'Class:NormalChange/Stimulus:ev_validate' => '受', # 'Validate',
'Class:NormalChange/Stimulus:ev_validate+' => '', # '',
'Class:NormalChange/Stimulus:ev_reject' => '却下', # 'Reject',
'Class:NormalChange/Stimulus:ev_reject+' => '', # '',
'Class:NormalChange/Stimulus:ev_assign' => '担当割当', # 'Assign',
'Class:NormalChange/Stimulus:ev_assign+' => '', # '',
'Class:NormalChange/Stimulus:ev_reopen' => '再', # 'Reopen',
'Class:NormalChange/Stimulus:ev_reopen+' => '', # '',
'Class:NormalChange/Stimulus:ev_plan' => '計画', # 'Plan',
'Class:NormalChange/Stimulus:ev_plan+' => '', # '',
'Class:NormalChange/Stimulus:ev_approve' => '承認', # 'Approve',
'Class:NormalChange/Stimulus:ev_approve+' => '', # '',
'Class:NormalChange/Stimulus:ev_replan' => '再計画', # 'Replan',
'Class:NormalChange/Stimulus:ev_replan+' => '', # '',
'Class:NormalChange/Stimulus:ev_notapprove' => '承認の不同意', # 'Reject approval',
'Class:NormalChange/Stimulus:ev_notapprove+' => '', # '',
'Class:NormalChange/Stimulus:ev_implement' => '実施', # 'Implement',
'Class:NormalChange/Stimulus:ev_implement+' => '', # '',
'Class:NormalChange/Stimulus:ev_monitor' => '経過観察', # 'Monitor',
'Class:NormalChange/Stimulus:ev_monitor+' => '', # '',
'Class:NormalChange/Stimulus:ev_finish' => '作業終了', # 'Finish',
'Class:NormalChange/Stimulus:ev_finish+' => '', # '',
'Class:NormalChange/Attribute:status/Value:implemented' => '実施済',
'Class:NormalChange/Attribute:status/Value:implemented+' => '',
'Class:NormalChange/Attribute:status/Value:monitored' => '経過観察中',
'Class:NormalChange/Attribute:status/Value:monitored+' => '',
'Class:NormalChange/Attribute:status/Value:closed' => 'クローズ',
'Class:NormalChange/Attribute:status/Value:closed+' => '',
'Class:NormalChange/Attribute:acceptance_date' => '受理日',
'Class:NormalChange/Attribute:acceptance_date+' => '',
'Class:NormalChange/Attribute:acceptance_comment' => '受理コメント',
'Class:NormalChange/Attribute:acceptance_comment+' => '',
'Class:NormalChange/Stimulus:ev_validate' => '受け付け',
'Class:NormalChange/Stimulus:ev_validate+' => '',
'Class:NormalChange/Stimulus:ev_reject' => '却下',
'Class:NormalChange/Stimulus:ev_reject+' => '',
'Class:NormalChange/Stimulus:ev_assign' => '割り当て',
'Class:NormalChange/Stimulus:ev_assign+' => '',
'Class:NormalChange/Stimulus:ev_reopen' => '再オープン',
'Class:NormalChange/Stimulus:ev_reopen+' => '',
'Class:NormalChange/Stimulus:ev_plan' => '計画',
'Class:NormalChange/Stimulus:ev_plan+' => '',
'Class:NormalChange/Stimulus:ev_approve' => '承認',
'Class:NormalChange/Stimulus:ev_approve+' => '',
'Class:NormalChange/Stimulus:ev_replan' => '再計画',
'Class:NormalChange/Stimulus:ev_replan+' => '',
'Class:NormalChange/Stimulus:ev_notapprove' => '承認を拒否',
'Class:NormalChange/Stimulus:ev_notapprove+' => '',
'Class:NormalChange/Stimulus:ev_implement' => '実施',
'Class:NormalChange/Stimulus:ev_implement+' => '',
'Class:NormalChange/Stimulus:ev_monitor' => '経過観察',
'Class:NormalChange/Stimulus:ev_monitor+' => '',
'Class:NormalChange/Stimulus:ev_finish' => '終了',
'Class:NormalChange/Stimulus:ev_finish+' => '',
));
//
@@ -299,50 +301,50 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:EmergencyChange' => '緊急変更', # 'Emergency Change',
'Class:EmergencyChange+' => '', # '',
'Class:EmergencyChange/Attribute:status/Value:new' => '新規', # 'New',
'Class:EmergencyChange/Attribute:status/Value:new+' => '', # '',
'Class:EmergencyChange/Attribute:status/Value:validated' => '受付済', # 'Validated',
'Class:EmergencyChange/Attribute:status/Value:validated+' => '', # '',
'Class:EmergencyChange/Attribute:status/Value:rejected' => '却下', # 'Rejected',
'Class:EmergencyChange/Attribute:status/Value:rejected+' => '', # '',
'Class:EmergencyChange/Attribute:status/Value:assigned' => '割当済', # 'Assigned',
'Class:EmergencyChange/Attribute:status/Value:assigned+' => '', # '',
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled' => '計画・予定された', # 'Planned and scheduled',
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled+' => '', # '',
'Class:EmergencyChange/Attribute:status/Value:approved' => '承認済み', # 'Approved',
'Class:EmergencyChange/Attribute:status/Value:approved+' => '', # '',
'Class:EmergencyChange/Attribute:status/Value:notapproved' => '未承認', # 'Not approved',
'Class:EmergencyChange/Attribute:status/Value:notapproved+' => '', # '',
'Class:EmergencyChange/Attribute:status/Value:implemented' => '実施済', # 'Implemented',
'Class:EmergencyChange/Attribute:status/Value:implemented+' => '', # '',
'Class:EmergencyChange/Attribute:status/Value:monitored' => '経過観察中', # 'Monitored',
'Class:EmergencyChange/Attribute:status/Value:monitored+' => '', # '',
'Class:EmergencyChange/Attribute:status/Value:closed' => '完了', # 'Closed',
'Class:EmergencyChange/Attribute:status/Value:closed+' => '', # '',
'Class:EmergencyChange/Stimulus:ev_validate' => '受', # 'Validate',
'Class:EmergencyChange/Stimulus:ev_validate+' => '', # '',
'Class:EmergencyChange/Stimulus:ev_reject' => '却下', # 'Reject',
'Class:EmergencyChange/Stimulus:ev_reject+' => '', # '',
'Class:EmergencyChange/Stimulus:ev_assign' => '担当割当', # 'Assign',
'Class:EmergencyChange/Stimulus:ev_assign+' => '', # '',
'Class:EmergencyChange/Stimulus:ev_reopen' => '再', # 'Reopen',
'Class:EmergencyChange/Stimulus:ev_reopen+' => '', # '',
'Class:EmergencyChange/Stimulus:ev_plan' => '計画', # 'Plan',
'Class:EmergencyChange/Stimulus:ev_plan+' => '', # '',
'Class:EmergencyChange/Stimulus:ev_approve' => '承認', # 'Approve',
'Class:EmergencyChange/Stimulus:ev_approve+' => '', # '',
'Class:EmergencyChange/Stimulus:ev_replan' => '再計画', # 'Replan',
'Class:EmergencyChange/Stimulus:ev_replan+' => '', # '',
'Class:EmergencyChange/Stimulus:ev_notapprove' => '承認の不同意', # 'Reject approval',
'Class:EmergencyChange/Stimulus:ev_notapprove+' => '', # '',
'Class:EmergencyChange/Stimulus:ev_implement' => '実施', # 'Implement',
'Class:EmergencyChange/Stimulus:ev_implement+' => '', # '',
'Class:EmergencyChange/Stimulus:ev_monitor' => '経過観察', # 'Monitor',
'Class:EmergencyChange/Stimulus:ev_monitor+' => '', # '',
'Class:EmergencyChange/Stimulus:ev_finish' => '作業終了', # 'Finish',
'Class:EmergencyChange/Stimulus:ev_finish+' => '', # '',
'Class:EmergencyChange' => '緊急変更',
'Class:EmergencyChange+' => '',
'Class:EmergencyChange/Attribute:status/Value:new' => '新規',
'Class:EmergencyChange/Attribute:status/Value:new+' => '',
'Class:EmergencyChange/Attribute:status/Value:validated' => '受け付け済み',
'Class:EmergencyChange/Attribute:status/Value:validated+' => '',
'Class:EmergencyChange/Attribute:status/Value:rejected' => '却下済み',
'Class:EmergencyChange/Attribute:status/Value:rejected+' => '',
'Class:EmergencyChange/Attribute:status/Value:assigned' => '割り当て済み',
'Class:EmergencyChange/Attribute:status/Value:assigned+' => '',
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled' => '計画・予定された',
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:EmergencyChange/Attribute:status/Value:approved' => '承認済み',
'Class:EmergencyChange/Attribute:status/Value:approved+' => '',
'Class:EmergencyChange/Attribute:status/Value:notapproved' => '未承認',
'Class:EmergencyChange/Attribute:status/Value:notapproved+' => '',
'Class:EmergencyChange/Attribute:status/Value:implemented' => '実施済',
'Class:EmergencyChange/Attribute:status/Value:implemented+' => '',
'Class:EmergencyChange/Attribute:status/Value:monitored' => '経過観察中',
'Class:EmergencyChange/Attribute:status/Value:monitored+' => '',
'Class:EmergencyChange/Attribute:status/Value:closed' => 'クローズ',
'Class:EmergencyChange/Attribute:status/Value:closed+' => '',
'Class:EmergencyChange/Stimulus:ev_validate' => '受け付け',
'Class:EmergencyChange/Stimulus:ev_validate+' => '',
'Class:EmergencyChange/Stimulus:ev_reject' => '却下',
'Class:EmergencyChange/Stimulus:ev_reject+' => '',
'Class:EmergencyChange/Stimulus:ev_assign' => '割り当て',
'Class:EmergencyChange/Stimulus:ev_assign+' => '',
'Class:EmergencyChange/Stimulus:ev_reopen' => '再オープン',
'Class:EmergencyChange/Stimulus:ev_reopen+' => '',
'Class:EmergencyChange/Stimulus:ev_plan' => '計画',
'Class:EmergencyChange/Stimulus:ev_plan+' => '',
'Class:EmergencyChange/Stimulus:ev_approve' => '承認',
'Class:EmergencyChange/Stimulus:ev_approve+' => '',
'Class:EmergencyChange/Stimulus:ev_replan' => '再計画',
'Class:EmergencyChange/Stimulus:ev_replan+' => '',
'Class:EmergencyChange/Stimulus:ev_notapprove' => '承認を拒否',
'Class:EmergencyChange/Stimulus:ev_notapprove+' => '',
'Class:EmergencyChange/Stimulus:ev_implement' => '実施',
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
'Class:EmergencyChange/Stimulus:ev_monitor' => '経過観察',
'Class:EmergencyChange/Stimulus:ev_monitor+' => '',
'Class:EmergencyChange/Stimulus:ev_finish' => '終了',
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
));
?>
?>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -257,7 +257,7 @@ abstract class Document extends cmdbAbstractObject
MetaModel::Init_AddAttribute(new AttributeExternalField("org_name", array("allowed_values"=>null, "extkey_attcode"=>"org_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeEnum("type", array("allowed_values"=>new ValueSetEnum('contract,networkmap,presentation,training,whitePaper,workinginstructions'), "sql"=>"type", "default_value"=>"presentation", "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeEnum("status", array("allowed_values"=>new ValueSetEnum('draft,published,obsolete'), "sql"=>"status", "default_value"=>"draft", "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeEnum("status", array("allowed_values"=>new ValueSetEnum('draft,published,obsolete'), "sql"=>"status", "default_value"=>"draft", "is_null_allowed"=>false, "depends_on"=>array('org_id'))));
MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("contract_list", array("linked_class"=>"lnkContractToDoc", "ext_key_to_me"=>"document_id", "ext_key_to_remote"=>"contract_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("service_list", array("linked_class"=>"lnkServiceToDoc", "ext_key_to_me"=>"document_id", "ext_key_to_remote"=>"service_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("ticket_list", array("linked_class"=>"lnkTicketToDoc", "ext_key_to_me"=>"document_id", "ext_key_to_remote"=>"ticket_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
@@ -365,7 +365,7 @@ class FileDoc extends Document
$oPage->add($this->DisplayDocumentInline($oPage, 'contents'));
$oPage->SetCurrentTab(Dict::S('UI:PropertiesTab'));
}
parent::DisplayBareProperties($oPage, $bEditMode, $sPrefix);
parent::DisplayBareProperties($oPage, $bEditMode, $sPrefix, $aExtraParams);
}
}

View File

@@ -53,5 +53,4 @@ SetupWebPage::AddModule(
),
)
);
?>

View File

@@ -38,8 +38,8 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Organization/Attribute:status/Value:inactive+' => 'Inativo',
'Class:Organization/Attribute:parent_id' => 'Matriz',
'Class:Organization/Attribute:parent_id+' => 'Organização matriz',
'Class:Location' => 'Localizacao',
'Class:Location+' => 'Qualquer tipo localizacao: Região, Pais, Cidade, Site, Construção, Piso, Sala, Rack,...',
'Class:Location' => 'Localização',
'Class:Location+' => 'Qualquer tipo localização: Região, Pais, Cidade, Site, Construção, Piso, Sala, Rack,...',
'Class:Location/Attribute:name' => 'Nome',
'Class:Location/Attribute:name+' => '',
'Class:Location/Attribute:status' => 'Status',
@@ -416,17 +416,17 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Contact/Attribute:status/Value:active+' => 'Ativo',
'Class:Contact/Attribute:status/Value:inactive' => 'Inativo',
'Class:Contact/Attribute:status/Value:inactive+' => 'Inativo',
'Class:Contact/Attribute:org_id' => 'Organizacao',
'Class:Contact/Attribute:org_id' => 'Organização',
'Class:Contact/Attribute:org_id+' => '',
'Class:Contact/Attribute:org_name' => 'Organizacao',
'Class:Contact/Attribute:org_name' => 'Organização',
'Class:Contact/Attribute:org_name+' => '',
'Class:Contact/Attribute:email' => 'Email',
'Class:Contact/Attribute:email+' => '',
'Class:Contact/Attribute:phone' => 'Telefone',
'Class:Contact/Attribute:phone+' => '',
'Class:Contact/Attribute:location_id' => 'Localizacao',
'Class:Contact/Attribute:location_id' => 'Localização',
'Class:Contact/Attribute:location_id+' => '',
'Class:Contact/Attribute:location_name' => 'Localizacao',
'Class:Contact/Attribute:location_name' => 'Localização',
'Class:Contact/Attribute:location_name+' => '',
'Class:Contact/Attribute:ci_list' => 'CIs',
'Class:Contact/Attribute:ci_list+' => 'CIs relacionados para o contato',

View File

@@ -1,75 +1,59 @@
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* Localized data
*
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:IncidentManagement' => 'Incident Management',
'Menu:IncidentManagement+' => 'Incident Management',
'Menu:Incident:Overview' => 'Übersicht',
'Menu:Incident:Overview+' => 'Übersicht',
'Menu:NewIncident' => 'Neuer Incident',
'Menu:NewIncident+' => 'Ein neues Incident-Ticket erstellen',
'Menu:SearchIncidents' => 'Nach Incidents suchen',
'Menu:SearchIncidents+' => 'Nach Incidents suchen',
'Menu:Incident:Shortcuts' => 'Shortcuts',
'Menu:Incident:Shortcuts+' => '',
'Menu:Incident:MyIncidents' => 'Incidents, die mich betreffen',
'Menu:Incident:MyIncidents+' => 'Incidents, die mich betreffen (als Bearbeiter)',
'Menu:Incident:EscalatedIncidents' => 'Eskalierte Incidents',
'Menu:Incident:EscalatedIncidents+' => 'Eskalierte Incidents',
'Menu:Incident:OpenIncidents' => 'Alle offenen Incidents',
'Menu:Incident:OpenIncidents+' => 'Alle offenen Incidents',
));
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: Incident
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Incident' => 'Incident',
'Class:Incident+' => '',
'Class:Incident/Stimulus:ev_assign' => '"Zuweisen"',
'Class:Incident/Stimulus:ev_assign+' => '',
'Class:Incident/Stimulus:ev_reassign' => 'Neu zuweisen',
'Class:Incident/Stimulus:ev_reassign+' => '',
'Class:Incident/Stimulus:ev_timeout' => 'ev-Timeout',
'Class:Incident/Stimulus:ev_timeout+' => '',
'Class:Incident/Stimulus:ev_resolve' => 'Als gelöst markieren',
'Class:Incident/Stimulus:ev_resolve+' => '',
'Class:Incident/Stimulus:ev_close' => 'Schließen',
'Class:Incident/Stimulus:ev_close+' => '',
));
?>
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Incident' => 'Incident',
'Class:Incident+' => '',
'Class:Incident/Stimulus:ev_assign' => '"Zuweisen"',
'Class:Incident/Stimulus:ev_assign+' => '',
'Class:Incident/Stimulus:ev_reassign' => 'Neu zuweisen',
'Class:Incident/Stimulus:ev_reassign+' => '',
'Class:Incident/Stimulus:ev_timeout' => 'ev-Timeout',
'Class:Incident/Stimulus:ev_timeout+' => '',
'Class:Incident/Stimulus:ev_resolve' => 'Als gelöst markieren',
'Class:Incident/Stimulus:ev_resolve+' => '',
'Class:Incident/Stimulus:ev_close' => 'Schließen',
'Class:Incident/Stimulus:ev_close+' => '',
'Class:lnkTicketToIncident' => 'Ticket zu Incident',
'Class:lnkTicketToIncident/Attribute:ticket_id' => 'Ticket',
'Class:lnkTicketToIncident/Attribute:incident_id' => 'Incident',
'Class:lnkTicketToIncident/Attribute:reason' => 'Grund',
'Menu:IncidentManagement' => 'Incident Management',
'Menu:IncidentManagement+' => 'Incident Management',
'Menu:Incident:Overview' => 'Übersicht',
'Menu:Incident:Overview+' => 'Übersicht',
'Menu:NewIncident' => 'Neuer Incident',
'Menu:NewIncident+' => 'Ein neues Incident-Ticket erstellen',
'Menu:SearchIncidents' => 'Nach Incidents suchen',
'Menu:SearchIncidents+' => 'Nach Incidents suchen',
'Menu:Incident:Shortcuts' => 'Shortcuts',
'Menu:Incident:Shortcuts+' => '',
'Menu:Incident:MyIncidents' => 'Incidents, die mich betreffen',
'Menu:Incident:MyIncidents+' => 'Incidents, die mich betreffen (als Bearbeiter)',
'Menu:Incident:EscalatedIncidents' => 'Eskalierte Incidents',
'Menu:Incident:EscalatedIncidents+' => 'Eskalierte Incidents',
'Menu:Incident:OpenIncidents' => 'Alle offenen Incidents',
'Menu:Incident:OpenIncidents+' => 'Alle offenen Incidents',
));
?>

View File

@@ -24,24 +24,27 @@
*/
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Menu:IncidentManagement' => 'インシデント管理', # 'Incident Management'
'Menu:IncidentManagement+' => 'インシデント管理', # 'Incident Management'
'Menu:Incident:Overview' => '概要', # 'Overview'
'Menu:Incident:Overview+' => '概要', # 'Overview'
'Menu:NewIncident' => '新規インシデント', # 'New Incident'
'Menu:NewIncident+' => 'インシデントチケット作成', # 'Create a new Incident ticket'
'Menu:SearchIncidents' => 'インシデント検索', # 'Search for Incidents'
'Menu:SearchIncidents+' => 'インシデントチケット検索', # 'Search for Incident tickets'
'Menu:Incident:Shortcuts' => 'ショートカット', # 'Shortcuts'
'Menu:Incident:Shortcuts+' => '', # ''
'Menu:Incident:MyIncidents' => '担当しているインシデント', # 'Incidents assigned to me'
'Menu:Incident:MyIncidents+' => '担当しているインシデント(エージェント)', # 'Incidents assigned to me (as Agent)'
'Menu:Incident:EscalatedIncidents' => 'エスカレーションされたインシデント', # 'Escalated Incidents'
'Menu:Incident:EscalatedIncidents+' => 'エスカレーションされたインシデント', # 'Escalated Incidents'
'Menu:Incident:OpenIncidents' => '担当のいないインシデント', # 'All Open Incidents'
'Menu:Incident:OpenIncidents+' => '担当のいないインシデント', # 'All Open Incidents'
'Menu:IncidentManagement' => 'インシデント管理',
'Menu:IncidentManagement+' => 'インシデント管理',
'Menu:Incident:Overview' => '概要',
'Menu:Incident:Overview+' => '概要',
'Menu:NewIncident' => '新規インシデント',
'Menu:NewIncident+' => 'インシデントチケット作成',
'Menu:SearchIncidents' => 'インシデント検索',
'Menu:SearchIncidents+' => 'インシデントチケット検索',
'Menu:Incident:Shortcuts' => 'ショートカット',
'Menu:Incident:Shortcuts+' => '', # ''
'Menu:Incident:MyIncidents' => '担当しているインシデント',
'Menu:Incident:MyIncidents+' => '担当しているインシデント(エージェント)',
'Menu:Incident:EscalatedIncidents' => 'エスカレーションされたインシデント',
'Menu:Incident:EscalatedIncidents+' => 'エスカレーションされたインシデント',
'Menu:Incident:OpenIncidents' => '全オープンインシデント',
'Menu:Incident:OpenIncidents+' => '全オープンインシデント',
));
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
@@ -57,18 +60,22 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:Incident' => 'インシデント', # 'Incident'
'Class:Incident+' => '', # ''
'Class:Incident/Stimulus:ev_assign' => '割', # 'Assign'
'Class:Incident/Stimulus:ev_assign+' => '', # ''
'Class:Incident/Stimulus:ev_reassign' => '再割', # 'Reassign'
'Class:Incident/Stimulus:ev_reassign+' => '', # ''
'Class:Incident/Stimulus:ev_timeout' => '中断(エスカレーション)', # 'ev_timeout'
'Class:Incident/Stimulus:ev_timeout+' => '', # ''
'Class:Incident/Stimulus:ev_resolve' => '解決済みとする', # 'Mark as resolved'
'Class:Incident/Stimulus:ev_resolve+' => '', # ''
'Class:Incident/Stimulus:ev_close' => '完了', # 'Close'
'Class:Incident/Stimulus:ev_close+' => '', # ''
'Class:Incident' => 'インシデント',
'Class:Incident+' => '',
'Class:Incident/Stimulus:ev_assign' => '割り当て',
'Class:Incident/Stimulus:ev_assign+' => '',
'Class:Incident/Stimulus:ev_reassign' => '再割り当て',
'Class:Incident/Stimulus:ev_reassign+' => '',
'Class:Incident/Stimulus:ev_timeout' => 'EV_タイムアウト',
'Class:Incident/Stimulus:ev_timeout+' => '',
'Class:Incident/Stimulus:ev_resolve' => '解決',
'Class:Incident/Stimulus:ev_resolve+' => '',
'Class:Incident/Stimulus:ev_close' => 'クローズ',
'Class:Incident/Stimulus:ev_close+' => '',
'Class:lnkTicketToIncident' => 'インシデントへのチケット',
'Class:lnkTicketToIncident/Attribute:ticket_id' => 'チケット',
'Class:lnkTicketToIncident/Attribute:incident_id' => 'インシデント',
'Class:lnkTicketToIncident/Attribute:reason' => '理由',
));
?>

View File

@@ -188,7 +188,7 @@ class Incident extends ResponseTicket
$sIcon = '';
if ($sIconName != '')
{
$sPath = '../modules/itop-incident-mgmt-1.0.0/images/'.$sIconName;
$sPath = utils::GetAbsoluteUrlModulesRoot().'itop-incident-mgmt-1.0.0/images/'.$sIconName;
if ($bImgTag)
{
$sIcon = "<img src=\"$sPath\" style=\"vertical-align:middle;\"/>";

View File

@@ -52,27 +52,27 @@
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Menu:ProblemManagement' => 'プロブレム管理', // 'Problem Management', # 'Problem Management'
'Menu:ProblemManagement+' => 'プロブレム管理', // 'Problem Management', # 'Problem Management'
'Menu:Problem:Overview' => '概要', # 'Overview'
'Menu:Problem:Overview+' => '概要', # 'Overview'
'Menu:NewProblem' => '新規プロブレム', // 'New Problem', # 'New Problem'
'Menu:NewProblem+' => '新規プロブレム', // 'New Problem', # 'New Problem'
'Menu:SearchProblems' => 'プロブレムを検索', // 'Search for Problems', # 'Search for Problems'
'Menu:SearchProblems+' => 'プロブレムを検索', // 'Search for Problems', # 'Search for Problems'
'Menu:Problem:Shortcuts' => 'ショートカット', # 'Shortcuts'
'Menu:Problem:MyProblems' => 'マイプロブレム', // 'My Problems', # 'My Problems'
'Menu:Problem:MyProblems+' => 'マイプロブレム', // 'My Problems', # 'My Problems'
'Menu:Problem:OpenProblems' => '担当のいない problems', # 'All Open problems'
'Menu:Problem:OpenProblems+' => '担当のいない problems', # 'All Open problems'
'UI-ProblemManagementOverview-ProblemByService' => 'サービス別プロブレム', // 'Problems by Service', # 'Problems by Service'
'UI-ProblemManagementOverview-ProblemByService+' => 'サービス別プロブレム', // 'Problems by Service', # 'Problems by Service'
'UI-ProblemManagementOverview-ProblemByPriority' => 'プライオリティ別プロブレム', // 'Problems by Priority', # 'Problems by Priority'
'UI-ProblemManagementOverview-ProblemByPriority+' => 'プライオリティ別プロブレム', // 'Problems by Priority', # 'Problems by Priority'
'UI-ProblemManagementOverview-ProblemUnassigned' => '未アサインプロブレム', // 'Unassigned Problems', # 'Unassigned Problems'
'UI-ProblemManagementOverview-ProblemUnassigned+' => '未アサインプロブレム', // 'Unassigned Problems', # 'Unassigned Problems'
'UI:ProblemMgmtMenuOverview:Title' => 'プロブレム管理ダッシュボード', // 'Dashboard for Problem Management', # 'Dashboard for Problem Management'
'UI:ProblemMgmtMenuOverview:Title+' => 'プロブレム管理ダッシュボード', // 'Dashboard for Problem Management', # 'Dashboard for Problem Management'
'Menu:ProblemManagement' => '問題管理',
'Menu:ProblemManagement+' => '問題管理',
'Menu:Problem:Overview' => '概要',
'Menu:Problem:Overview+' => '概要',
'Menu:NewProblem' => '新規登録',
'Menu:NewProblem+' => '新規登録',
'Menu:SearchProblems' => '検索',
'Menu:SearchProblems+' => '検索',
'Menu:Problem:Shortcuts' => 'ショートカット',
'Menu:Problem:MyProblems' => '私の担当問題',
'Menu:Problem:MyProblems+' => '私の担当問題',
'Menu:Problem:OpenProblems' => 'オープンな問題',
'Menu:Problem:OpenProblems+' => 'オープンな問題',
'UI-ProblemManagementOverview-ProblemByService' => 'サービス別問題',
'UI-ProblemManagementOverview-ProblemByService+' => 'サービス別問題',
'UI-ProblemManagementOverview-ProblemByPriority' => '優先度別問題',
'UI-ProblemManagementOverview-ProblemByPriority+' => '優先度別問題',
'UI-ProblemManagementOverview-ProblemUnassigned' => '未割当問題',
'UI-ProblemManagementOverview-ProblemUnassigned+' => '未割当問題',
'UI:ProblemMgmtMenuOverview:Title' => '問題管理ダッシュボード',
'UI:ProblemMgmtMenuOverview:Title+' => '問題管理ダッシュボード',
));
//
@@ -80,88 +80,88 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:Problem' => 'プロブレム', // 'Problem', # 'Problem'
'Class:Problem+' => '', # ''
'Class:Problem/Attribute:status' => 'ステータス', // 'Status', # 'Status'
'Class:Problem/Attribute:status+' => '', # ''
'Class:Problem/Attribute:status/Value:new' => '新規', # 'New'
'Class:Problem/Attribute:status/Value:new+' => '', # ''
'Class:Problem/Attribute:status/Value:assigned' => '割当済', # 'Assigned'
'Class:Problem/Attribute:status/Value:assigned+' => '', # ''
'Class:Problem/Attribute:status/Value:resolved' => '解決済み', // 'Resolved', # 'Resolved'
'Class:Problem/Attribute:status/Value:resolved+' => '', # ''
'Class:Problem/Attribute:status/Value:closed' => '完了', # 'Closed'
'Class:Problem/Attribute:status/Value:closed+' => '', # ''
'Class:Problem/Attribute:org_id' => 'カスタマー', // 'Customer', # 'Customer'
'Class:Problem/Attribute:org_id+' => '', # ''
'Class:Problem/Attribute:org_name' => '名前', // 'Name', # 'Name'
'Class:Problem/Attribute:org_name+' => '共通名', // 'Common name', # 'Common name'
'Class:Problem/Attribute:service_id' => 'サービス', // 'Service', # 'Service'
'Class:Problem/Attribute:service_id+' => '', # ''
'Class:Problem/Attribute:service_name' => '名前', // 'Name', # 'Name'
'Class:Problem/Attribute:service_name+' => '', # ''
'Class:Problem/Attribute:servicesubcategory_id' => 'サービスカテゴリ', // 'Service Category', # 'Service Category'
'Class:Problem/Attribute:servicesubcategory_id+' => '', # ''
'Class:Problem/Attribute:servicesubcategory_name' => '名前', // 'Name', # 'Name'
'Class:Problem/Attribute:servicesubcategory_name+' => '', # ''
'Class:Problem/Attribute:product' => 'プロダクト', // 'Product', # 'Product'
'Class:Problem/Attribute:product+' => '', # ''
'Class:Problem/Attribute:impact' => '影響', // 'Impact', # 'Impact'
'Class:Problem/Attribute:impact+' => '', # ''
'Class:Problem/Attribute:impact/Value:1' => 'パーソン', // 'A Person', # 'A Person'
'Class:Problem/Attribute:impact/Value:1+' => '', # ''
'Class:Problem/Attribute:impact/Value:2' => 'サービス', // 'A Service', # 'A Service'
'Class:Problem/Attribute:impact/Value:2+' => '', # ''
'Class:Problem/Attribute:impact/Value:3' => '部署', // 'A Department', # 'A Department'
'Class:Problem/Attribute:impact/Value:3+' => '', # ''
'Class:Problem/Attribute:urgency' => '緊急', // 'Urgency', # 'Urgency'
'Class:Problem/Attribute:urgency+' => '', # ''
'Class:Problem/Attribute:urgency/Value:1' => '低', // 'Low', # 'Low'
'Class:Problem/Attribute:urgency/Value:1+' => '低', // 'Low', # 'Low'
'Class:Problem/Attribute:urgency/Value:2' => '中', // 'Medium', # 'Medium'
'Class:Problem/Attribute:urgency/Value:2+' => '中', // 'Medium', # 'Medium'
'Class:Problem/Attribute:urgency/Value:3' => '高', // 'High', # 'High'
'Class:Problem/Attribute:urgency/Value:3+' => '高', // 'High', # 'High'
'Class:Problem/Attribute:priority' => 'プライオリティ', // 'Priority', # 'Priority'
'Class:Problem/Attribute:priority+' => '', # ''
'Class:Problem/Attribute:priority/Value:1' => '低', // 'Low', # 'Low'
'Class:Problem/Attribute:priority/Value:1+' => '', # ''
'Class:Problem/Attribute:priority/Value:2' => '中', // 'Medium', # 'Medium'
'Class:Problem/Attribute:priority/Value:2+' => '', # ''
'Class:Problem/Attribute:priority/Value:3' => '高', // 'High', # 'High'
'Class:Problem/Attribute:priority/Value:3+' => '', # ''
'Class:Problem/Attribute:workgroup_id' => 'ワークグループ', // 'WorkGroup', # 'WorkGroup'
'Class:Problem/Attribute:workgroup_id+' => '', # ''
'Class:Problem/Attribute:workgroup_name' => '名前', // 'Name', # 'Name'
'Class:Problem/Attribute:workgroup_name+' => '', # ''
'Class:Problem/Attribute:agent_id' => 'エージェント', // 'Agent', # 'Agent'
'Class:Problem/Attribute:agent_id+' => '', # ''
'Class:Problem/Attribute:agent_name' => 'エージェント名', // 'Agent Name', # 'Agent Name'
'Class:Problem/Attribute:agent_name+' => '', # ''
'Class:Problem/Attribute:agent_email' => 'エージェントEメール', // 'Agent Email', # 'Agent Email'
'Class:Problem/Attribute:agent_email+' => '', # ''
'Class:Problem/Attribute:related_change_id' => '関連する変更', // 'Related Change', # 'Related Change'
'Class:Problem/Attribute:related_change_id+' => '', # ''
'Class:Problem/Attribute:related_change_ref' => '参照', // 'Ref', # 'Ref'
'Class:Problem/Attribute:related_change_ref+' => '', # ''
'Class:Problem/Attribute:close_date' => 'クローズ日', // 'Close Date', # 'Close Date'
'Class:Problem/Attribute:close_date+' => '', # ''
'Class:Problem/Attribute:last_update' => '最終更新日', // 'Last Update', # 'Last Update'
'Class:Problem/Attribute:last_update+' => '', # ''
'Class:Problem/Attribute:assignment_date' => 'アサイン日付', // 'Assignment Date', # 'Assignment Date'
'Class:Problem/Attribute:assignment_date+' => '', # ''
'Class:Problem/Attribute:resolution_date' => '解決日', // 'Resolution Date', # 'Resolution Date'
'Class:Problem/Attribute:resolution_date+' => '', # ''
'Class:Problem/Attribute:knownerrors_list' => '既知のエラー', // 'Known Errors', # 'Known Errors'
'Class:Problem/Attribute:knownerrors_list+' => '', # ''
'Class:Problem/Stimulus:ev_assign' => '割', # 'Assign'
'Class:Problem/Stimulus:ev_assign+' => '', # ''
'Class:Problem/Stimulus:ev_reassign' => '再割', // 'Reaassign', # 'Reaassign'
'Class:Problem/Stimulus:ev_reassign+' => '', # ''
'Class:Problem/Stimulus:ev_resolve' => '解決', // 'Resolve', # 'Resolve'
'Class:Problem/Stimulus:ev_resolve+' => '', # ''
'Class:Problem/Stimulus:ev_close' => '完了', # 'Close'
'Class:Problem/Stimulus:ev_close+' => '', # ''
'Class:Problem' => '問題',
'Class:Problem+' => '',
'Class:Problem/Attribute:status' => '状態',
'Class:Problem/Attribute:status+' => '',
'Class:Problem/Attribute:status/Value:new' => '新規',
'Class:Problem/Attribute:status/Value:new+' => '',
'Class:Problem/Attribute:status/Value:assigned' => '割当済',
'Class:Problem/Attribute:status/Value:assigned+' => '',
'Class:Problem/Attribute:status/Value:resolved' => '解決済み',
'Class:Problem/Attribute:status/Value:resolved+' => '',
'Class:Problem/Attribute:status/Value:closed' => 'クローズ',
'Class:Problem/Attribute:status/Value:closed+' => '',
'Class:Problem/Attribute:org_id' => '顧客',
'Class:Problem/Attribute:org_id+' => '',
'Class:Problem/Attribute:org_name' => '名前',
'Class:Problem/Attribute:org_name+' => '共通名',
'Class:Problem/Attribute:service_id' => 'サービス',
'Class:Problem/Attribute:service_id+' => '',
'Class:Problem/Attribute:service_name' => '名前',
'Class:Problem/Attribute:service_name+' => '',
'Class:Problem/Attribute:servicesubcategory_id' => 'サービスカテゴリ',
'Class:Problem/Attribute:servicesubcategory_id+' => '',
'Class:Problem/Attribute:servicesubcategory_name' => '名前',
'Class:Problem/Attribute:servicesubcategory_name+' => '',
'Class:Problem/Attribute:product' => '製品',
'Class:Problem/Attribute:product+' => '',
'Class:Problem/Attribute:impact' => 'インパクト',
'Class:Problem/Attribute:impact+' => '',
'Class:Problem/Attribute:impact/Value:1' => '',
'Class:Problem/Attribute:impact/Value:1+' => '',
'Class:Problem/Attribute:impact/Value:2' => 'サービス',
'Class:Problem/Attribute:impact/Value:2+' => '',
'Class:Problem/Attribute:impact/Value:3' => '部署',
'Class:Problem/Attribute:impact/Value:3+' => '',
'Class:Problem/Attribute:urgency' => '緊急',
'Class:Problem/Attribute:urgency+' => '',
'Class:Problem/Attribute:urgency/Value:1' => '低',
'Class:Problem/Attribute:urgency/Value:1+' => '低',
'Class:Problem/Attribute:urgency/Value:2' => '中',
'Class:Problem/Attribute:urgency/Value:2+' => '中',
'Class:Problem/Attribute:urgency/Value:3' => '高',
'Class:Problem/Attribute:urgency/Value:3+' => '高',
'Class:Problem/Attribute:priority' => '優先度',
'Class:Problem/Attribute:priority+' => '',
'Class:Problem/Attribute:priority/Value:1' => '低',
'Class:Problem/Attribute:priority/Value:1+' => '',
'Class:Problem/Attribute:priority/Value:2' => '中',
'Class:Problem/Attribute:priority/Value:2+' => '',
'Class:Problem/Attribute:priority/Value:3' => '高',
'Class:Problem/Attribute:priority/Value:3+' => '',
'Class:Problem/Attribute:workgroup_id' => 'ワークグループ',
'Class:Problem/Attribute:workgroup_id+' => '',
'Class:Problem/Attribute:workgroup_name' => '名前',
'Class:Problem/Attribute:workgroup_name+' => '',
'Class:Problem/Attribute:agent_id' => 'エージェント',
'Class:Problem/Attribute:agent_id+' => '',
'Class:Problem/Attribute:agent_name' => 'エージェント名',
'Class:Problem/Attribute:agent_name+' => '',
'Class:Problem/Attribute:agent_email' => 'エージェントEメール',
'Class:Problem/Attribute:agent_email+' => '',
'Class:Problem/Attribute:related_change_id' => '関連する変更',
'Class:Problem/Attribute:related_change_id+' => '',
'Class:Problem/Attribute:related_change_ref' => '参照',
'Class:Problem/Attribute:related_change_ref+' => '',
'Class:Problem/Attribute:close_date' => 'クローズ日',
'Class:Problem/Attribute:close_date+' => '',
'Class:Problem/Attribute:last_update' => '最終更新日',
'Class:Problem/Attribute:last_update+' => '',
'Class:Problem/Attribute:assignment_date' => '割り当て日',
'Class:Problem/Attribute:assignment_date+' => '',
'Class:Problem/Attribute:resolution_date' => '解決日',
'Class:Problem/Attribute:resolution_date+' => '',
'Class:Problem/Attribute:knownerrors_list' => '既知のエラー',
'Class:Problem/Attribute:knownerrors_list+' => '',
'Class:Problem/Stimulus:ev_assign' => '割り当て',
'Class:Problem/Stimulus:ev_assign+' => '',
'Class:Problem/Stimulus:ev_reassign' => '再割り当て',
'Class:Problem/Stimulus:ev_reassign+' => '',
'Class:Problem/Stimulus:ev_resolve' => '解決',
'Class:Problem/Stimulus:ev_resolve+' => '',
'Class:Problem/Stimulus:ev_close' => 'クローズ',
'Class:Problem/Stimulus:ev_close+' => '',
));
?>

View File

@@ -24,22 +24,22 @@
*/
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Menu:RequestManagement' => 'ヘルプデスク', # 'Helpdesk'
'Menu:RequestManagement+' => 'ヘルプデスク', # 'Helpdesk'
'Menu:UserRequest:Overview' => '概要', # 'Overview'
'Menu:UserRequest:Overview+' => '概要', # 'Overview'
'Menu:NewUserRequest' => '新規リクエスト', # 'New User Request'
'Menu:NewUserRequest+' => 'リクエストチケットを作成', # 'Create a new User Request ticket'
'Menu:SearchUserRequests' => 'リクエストを検索', # 'Search for User Requests'
'Menu:SearchUserRequests+' => 'リクエストチケットを検索', # 'Search for User Request tickets'
'Menu:UserRequest:Shortcuts' => 'ショートカット', # 'Shortcuts'
'Menu:UserRequest:Shortcuts+' => '', # ''
'Menu:UserRequest:MyRequests' => '担当しているリクエスト', # 'Requests assigned to me'
'Menu:UserRequest:MyRequests+' => '担当しているリクエスト(エージェント)', # 'Requests assigned to me (as Agent)'
'Menu:UserRequest:EscalatedRequests' => 'エスカレーションされた Requests', # 'Escalated Requests'
'Menu:UserRequest:EscalatedRequests+' => 'エスカレーションされた Requests', # 'Escalated Requests'
'Menu:UserRequest:OpenRequests' => '担当のいないリクエスト', # 'All Open Requests'
'Menu:UserRequest:OpenRequests+' => '担当のいないリクエスト', # 'All Open Requests'
'Menu:RequestManagement' => 'ヘルプデスク',
'Menu:RequestManagement+' => 'ヘルプデスク',
'Menu:UserRequest:Overview' => '概要',
'Menu:UserRequest:Overview+' => '概要',
'Menu:NewUserRequest' => '新規要求',
'Menu:NewUserRequest+' => '要求チケットを作成',
'Menu:SearchUserRequests' => '要求を検索',
'Menu:SearchUserRequests+' => '要求チケットを検索',
'Menu:UserRequest:Shortcuts' => 'ショートカット',
'Menu:UserRequest:Shortcuts+' => '',
'Menu:UserRequest:MyRequests' => '担当の要求',
'Menu:UserRequest:MyRequests+' => '担当の要求(エージェント)',
'Menu:UserRequest:EscalatedRequests' => 'エスカレーションされた要求',
'Menu:UserRequest:EscalatedRequests+' => 'エスカレーションされた要求',
'Menu:UserRequest:OpenRequests' => 'オープン中の要求',
'Menu:UserRequest:OpenRequests+' => 'オープン中の要求',
));
// Dictionnay conventions
@@ -57,30 +57,30 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:UserRequest' => 'ユーザーリクエスト', # 'User Request'
'Class:UserRequest+' => '', # ''
'Class:UserRequest/Attribute:request_type' => 'リクエストの種別', # 'Request Type'
'Class:UserRequest/Attribute:request_type+' => '', # ''
'Class:UserRequest/Attribute:request_type/Value:information' => '情報', # 'Information'
'Class:UserRequest/Attribute:request_type/Value:information+' => '情報', # 'Information'
'Class:UserRequest/Attribute:request_type/Value:issue' => '問題点', # 'Issue'
'Class:UserRequest/Attribute:request_type/Value:issue+' => '問題点', # 'Issue'
'Class:UserRequest/Attribute:request_type/Value:service request' => 'サービスの依頼', # 'Service Request'
'Class:UserRequest/Attribute:request_type/Value:service request+' => 'サービスの依頼', # 'Service Request'
'Class:UserRequest/Attribute:freeze_reason' => '保留の理由', # 'Pending reason'
'Class:UserRequest/Attribute:freeze_reason+' => '', # ''
'Class:UserRequest/Stimulus:ev_assign' => '割', # 'Assign'
'Class:UserRequest/Stimulus:ev_assign+' => '', # ''
'Class:UserRequest/Stimulus:ev_reassign' => '再割', # 'Reassign'
'Class:UserRequest/Stimulus:ev_reassign+' => '', # ''
'Class:UserRequest/Stimulus:ev_timeout' => '中断(エスカレーション)', # 'ev_timeout'
'Class:UserRequest/Stimulus:ev_timeout+' => '', # ''
'Class:UserRequest/Stimulus:ev_resolve' => '解決済みとする', # 'Mark as resolved'
'Class:UserRequest/Stimulus:ev_resolve+' => '', # ''
'Class:UserRequest/Stimulus:ev_close' => '完了', # 'Close'
'Class:UserRequest/Stimulus:ev_close+' => '', # ''
'Class:UserRequest/Stimulus:ev_freeze' => '保留とする', # 'Mark as pending'
'Class:UserRequest/Stimulus:ev_freeze+' => '', # ''
'Class:UserRequest' => 'ユーザー要求',
'Class:UserRequest+' => '',
'Class:UserRequest/Attribute:request_type' => '要求のタイプ',
'Class:UserRequest/Attribute:request_type+' => '',
'Class:UserRequest/Attribute:request_type/Value:information' => '情報',
'Class:UserRequest/Attribute:request_type/Value:information+' => '情報',
'Class:UserRequest/Attribute:request_type/Value:issue' => '課題',
'Class:UserRequest/Attribute:request_type/Value:issue+' => '課題',
'Class:UserRequest/Attribute:request_type/Value:service request' => 'サービス要求',
'Class:UserRequest/Attribute:request_type/Value:service request+' => 'サービス要求',
'Class:UserRequest/Attribute:freeze_reason' => '保留の理由',
'Class:UserRequest/Attribute:freeze_reason+' => '',
'Class:UserRequest/Stimulus:ev_assign' => '割り当て',
'Class:UserRequest/Stimulus:ev_assign+' => '',
'Class:UserRequest/Stimulus:ev_reassign' => '再割り当て',
'Class:UserRequest/Stimulus:ev_reassign+' => '',
'Class:UserRequest/Stimulus:ev_timeout' => 'ev_タイムアウト',
'Class:UserRequest/Stimulus:ev_timeout+' => '',
'Class:UserRequest/Stimulus:ev_resolve' => '解決済み',
'Class:UserRequest/Stimulus:ev_resolve+' => '',
'Class:UserRequest/Stimulus:ev_close' => 'クローズ',
'Class:UserRequest/Stimulus:ev_close+' => '',
'Class:UserRequest/Stimulus:ev_freeze' => '保留',
'Class:UserRequest/Stimulus:ev_freeze+' => '',
));
?>

View File

@@ -1,456 +1,315 @@
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* Localized data
*
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:ServiceManagement' => 'Service Management',
'Menu:ServiceManagement+' => 'Service Management-Übersicht',
'Menu:Service:Overview' => 'Übersicht',
'Menu:Service:Overview+' => '',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Verträge nach Service Level',
'UI-ServiceManagementMenu-ContractsByStatus' => 'Verträge nach Status',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Verträge, die in weniger als 30 Tagen enden',
'Menu:ServiceType' => 'Service Typen',
'Menu:ServiceType+' => 'Service Typen',
'Menu:ProviderContract' => 'Provider-Verträge',
'Menu:ProviderContract+' => 'Provider-Verträge',
'Menu:CustomerContract' => 'Kundenverträge',
'Menu:CustomerContract+' => 'Kundenverträge',
'Menu:ServiceSubcategory' => 'Service-Unterkategorien',
'Menu:ServiceSubcategory+' => 'Service-Unterkategorien',
'Menu:Service' => 'Services',
'Menu:Service+' => 'Services',
'Menu:SLA' => 'SLAs',
'Menu:SLA+' => 'Service Level Agreements',
'Menu:SLT' => 'SLTs',
'Menu:SLT+' => 'Service Level Targets',
));
/*
'UI:ServiceManagementMenu' => 'Gestion des Services',
'UI:ServiceManagementMenu+' => 'Gestion des Services',
'UI:ServiceManagementMenu:Title' => 'Résumé des services & contrats',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Contrats par niveau de service',
'UI-ServiceManagementMenu-ContractsByStatus' => 'Contrats par état',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Contrats se terminant dans moins de 30 jours',
*/
//
// Class: Contract
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Contract' => 'Vertrag',
'Class:Contract+' => '',
'Class:Contract/Attribute:name' => 'Name',
'Class:Contract/Attribute:name+' => '',
'Class:Contract/Attribute:description' => 'Beschreibung',
'Class:Contract/Attribute:description+' => '',
'Class:Contract/Attribute:start_date' => 'Anfangsdatum',
'Class:Contract/Attribute:start_date+' => '',
'Class:Contract/Attribute:end_date' => 'Ablaufdatum',
'Class:Contract/Attribute:end_date+' => '',
'Class:Contract/Attribute:cost' => 'Kosten',
'Class:Contract/Attribute:cost+' => '',
'Class:Contract/Attribute:cost_currency' => 'Währung',
'Class:Contract/Attribute:cost_currency+' => '',
'Class:Contract/Attribute:cost_currency/Value:dollars' => 'Dollar',
'Class:Contract/Attribute:cost_currency/Value:dollars+' => '',
'Class:Contract/Attribute:cost_currency/Value:euros' => 'Euro',
'Class:Contract/Attribute:cost_currency/Value:euros+' => '',
'Class:Contract/Attribute:cost_unit' => 'Kosteneinheit',
'Class:Contract/Attribute:cost_unit+' => '',
'Class:Contract/Attribute:billing_frequency' => 'Abrechnungshäufigkeit',
'Class:Contract/Attribute:billing_frequency+' => '',
'Class:Contract/Attribute:contact_list' => 'Kontakte',
'Class:Contract/Attribute:contact_list+' => 'Kontakte zu diesem Vertrag',
'Class:Contract/Attribute:document_list' => 'Dokumente',
'Class:Contract/Attribute:document_list+' => 'Dokumente zu diesem Vertrag',
'Class:Contract/Attribute:ci_list' => 'CIs',
'Class:Contract/Attribute:ci_list+' => 'CI, die von dem Vertrag unterstützt werden',
'Class:Contract/Attribute:finalclass' => 'Typ',
'Class:Contract/Attribute:finalclass+' => '',
));
//
// Class: ProviderContract
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ProviderContract' => 'Provider-Vertrag',
'Class:ProviderContract+' => '',
'Class:ProviderContract/Attribute:provider_id' => 'Anbieter',
'Class:ProviderContract/Attribute:provider_id+' => '',
'Class:ProviderContract/Attribute:provider_name' => 'Providername',
'Class:ProviderContract/Attribute:provider_name+' => '',
'Class:ProviderContract/Attribute:sla' => 'SLA',
'Class:ProviderContract/Attribute:sla+' => 'Service Level Agreement',
'Class:ProviderContract/Attribute:coverage' => 'Abdeckung',
'Class:ProviderContract/Attribute:coverage+' => '',
));
//
// Class: CustomerContract
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:CustomerContract' => 'Kundenvertrag',
'Class:CustomerContract+' => '',
'Class:CustomerContract/Attribute:org_id' => 'Kunde',
'Class:CustomerContract/Attribute:org_id+' => '',
'Class:CustomerContract/Attribute:org_name' => 'Kundenname',
'Class:CustomerContract/Attribute:org_name+' => '',
'Class:CustomerContract/Attribute:provider_id' => 'Anbieter',
'Class:CustomerContract/Attribute:provider_id+' => '',
'Class:CustomerContract/Attribute:provider_name' => 'Providername',
'Class:CustomerContract/Attribute:provider_name+' => '',
'Class:CustomerContract/Attribute:support_team_id' => 'Support-Team',
'Class:CustomerContract/Attribute:support_team_id+' => '',
'Class:CustomerContract/Attribute:support_team_name' => 'Support-Team',
'Class:CustomerContract/Attribute:support_team_name+' => '',
'Class:CustomerContract/Attribute:provider_list' => 'Anbieter',
'Class:CustomerContract/Attribute:provider_list+' => '',
'Class:CustomerContract/Attribute:sla_list' => 'SLAs',
'Class:CustomerContract/Attribute:sla_list+' => 'Liste der SLAs zu dem Vertrag',
'Class:CustomerContract/Attribute:provider_list' => 'Zugrunde liegende Verträge',
'Class:CustomerContract/Attribute:sla_list+' => '',
));
// Class: lnkCustomerContractToProviderContract
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkCustomerContractToProviderContract' => 'Verbindung Kundenvertratg zu Provider-Vertrag',
'Class:lnkCustomerContractToProviderContract+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id' => 'Kundenvertrag',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name' => 'Name',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id' => 'Provider Contract',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name' => 'Name',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla' => 'Provider-SLA',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla+' => 'Service Level Agreement',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage' => 'Service-Stunden',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage+' => '',
));
//
// Class: lnkContractToSLA
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkContractToSLA' => 'Contract/SLA',
'Class:lnkContractToSLA+' => '',
'Class:lnkContractToSLA/Attribute:contract_id' => 'Vertrag',
'Class:lnkContractToSLA/Attribute:contract_id+' => '',
'Class:lnkContractToSLA/Attribute:contract_name' => 'Vertrag',
'Class:lnkContractToSLA/Attribute:contract_name+' => '',
'Class:lnkContractToSLA/Attribute:sla_id' => 'SLA',
'Class:lnkContractToSLA/Attribute:sla_id+' => '',
'Class:lnkContractToSLA/Attribute:sla_name' => 'SLA',
'Class:lnkContractToSLA/Attribute:sla_name+' => '',
'Class:lnkContractToSLA/Attribute:coverage' => 'Abdeckung',
'Class:lnkContractToSLA/Attribute:coverage+' => '',
));
//
// Class: lnkContractToDoc
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkContractToDoc' => 'Vertrag/Dokument',
'Class:lnkContractToDoc+' => '',
'Class:lnkContractToDoc/Attribute:contract_id' => 'Vertrag',
'Class:lnkContractToDoc/Attribute:contract_id+' => '',
'Class:lnkContractToDoc/Attribute:contract_name' => 'Vertrag',
'Class:lnkContractToDoc/Attribute:contract_name+' => '',
'Class:lnkContractToDoc/Attribute:document_id' => 'Dokument',
'Class:lnkContractToDoc/Attribute:document_id+' => '',
'Class:lnkContractToDoc/Attribute:document_name' => 'Dokument',
'Class:lnkContractToDoc/Attribute:document_name+' => '',
'Class:lnkContractToDoc/Attribute:document_type' => 'Dokumententyp',
'Class:lnkContractToDoc/Attribute:document_type+' => '',
'Class:lnkContractToDoc/Attribute:document_status' => 'Dokumentenstatus',
'Class:lnkContractToDoc/Attribute:document_status+' => '',
));
//
// Class: lnkContractToContact
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkContractToContact' => 'Vertrag/Kontakt',
'Class:lnkContractToContact+' => '',
'Class:lnkContractToContact/Attribute:contract_id' => 'Vertrag',
'Class:lnkContractToContact/Attribute:contract_id+' => '',
'Class:lnkContractToContact/Attribute:contract_name' => 'Vertrag',
'Class:lnkContractToContact/Attribute:contract_name+' => '',
'Class:lnkContractToContact/Attribute:contact_id' => 'Kontakt',
'Class:lnkContractToContact/Attribute:contact_id+' => '',
'Class:lnkContractToContact/Attribute:contact_name' => 'Kontakt',
'Class:lnkContractToContact/Attribute:contact_name+' => '',
'Class:lnkContractToContact/Attribute:contact_email' => 'Kontaktemail',
'Class:lnkContractToContact/Attribute:contact_email+' => '',
'Class:lnkContractToContact/Attribute:role' => 'Rolle',
'Class:lnkContractToContact/Attribute:role+' => '',
));
//
// Class: lnkContractToCI
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkContractToCI' => 'Vertrag/CI',
'Class:lnkContractToCI+' => '',
'Class:lnkContractToCI/Attribute:contract_id' => 'Vertrag',
'Class:lnkContractToCI/Attribute:contract_id+' => '',
'Class:lnkContractToCI/Attribute:contract_name' => 'Vertrag',
'Class:lnkContractToCI/Attribute:contract_name+' => '',
'Class:lnkContractToCI/Attribute:ci_id' => 'CI',
'Class:lnkContractToCI/Attribute:ci_id+' => '',
'Class:lnkContractToCI/Attribute:ci_name' => 'CI',
'Class:lnkContractToCI/Attribute:ci_name+' => '',
'Class:lnkContractToCI/Attribute:ci_status' => 'CI-Status',
'Class:lnkContractToCI/Attribute:ci_status+' => '',
));
//
// Class: Service
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Service' => 'Service',
'Class:Service+' => '',
'Class:Service/Attribute:org_id' => 'Anbieter',
'Class:Service/Attribute:org_id+' => '',
'Class:Service/Attribute:provider_name' => 'Anbieter',
'Class:Service/Attribute:provider_name+' => '',
'Class:Service/Attribute:name' => 'Name',
'Class:Service/Attribute:name+' => '',
'Class:Service/Attribute:description' => 'Beschreibung',
'Class:Service/Attribute:description+' => '',
'Class:Service/Attribute:type' => 'Typ',
'Class:Service/Attribute:type+' => '',
'Class:Service/Attribute:type/Value:IncidentManagement' => 'Incident Management',
'Class:Service/Attribute:type/Value:IncidentManagement+' => 'Incident Management',
'Class:Service/Attribute:type/Value:RequestManagement' => 'Request Management',
'Class:Service/Attribute:type/Value:RequestManagement+' => 'Request Management',
'Class:Service/Attribute:status' => 'Status',
'Class:Service/Attribute:status+' => '',
'Class:Service/Attribute:status/Value:design' => 'Design',
'Class:Service/Attribute:status/Value:design+' => '',
'Class:Service/Attribute:status/Value:obsolete' => 'Veraltet',
'Class:Service/Attribute:status/Value:obsolete+' => '',
'Class:Service/Attribute:status/Value:production' => 'Produktion',
'Class:Service/Attribute:status/Value:production+' => '',
'Class:Service/Attribute:subcategory_list' => 'Service-Unterkategorien',
'Class:Service/Attribute:subcategory_list+' => '',
'Class:Service/Attribute:sla_list' => 'SLAs',
'Class:Service/Attribute:sla_list+' => '',
'Class:Service/Attribute:document_list' => 'Dokumente',
'Class:Service/Attribute:document_list+' => 'Dokumente beigefügt zu dem Service',
'Class:Service/Attribute:contact_list' => 'Kontakte',
'Class:Service/Attribute:contact_list+' => 'Kontakte, die für diesen Service eine Rolle wahrnehmen',
'Class:Service/Tab:Related_Contracts' => 'Zugehörige Verträge',
'Class:Service/Tab:Related_Contracts+' => 'Verträge, die für diesen Vertrag unterschrieben wurden',
));
//
// Class: ServiceSubcategory
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ServiceSubcategory' => 'Service-Unterkategorien',
'Class:ServiceSubcategory+' => '',
'Class:ServiceSubcategory/Attribute:name' => 'Name',
'Class:ServiceSubcategory/Attribute:name+' => '',
'Class:ServiceSubcategory/Attribute:description' => 'Beschreibung',
'Class:ServiceSubcategory/Attribute:description+' => '',
'Class:ServiceSubcategory/Attribute:service_id' => 'Service',
'Class:ServiceSubcategory/Attribute:service_id+' => '',
'Class:ServiceSubcategory/Attribute:service_name' => 'Service',
'Class:ServiceSubcategory/Attribute:service_name+' => '',
));
//
// Class: SLA
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:SLA' => 'SLA',
'Class:SLA+' => '',
'Class:SLA/Attribute:name' => 'Name',
'Class:SLA/Attribute:name+' => '',
'Class:SLA/Attribute:service_id' => 'Service',
'Class:SLA/Attribute:service_id+' => '',
'Class:SLA/Attribute:service_name' => 'Service',
'Class:SLA/Attribute:service_name+' => '',
'Class:SLA/Attribute:slt_list' => 'SLTs',
'Class:SLA/Attribute:slt_list+' => 'Auflistung der Service Level-Grenzbereiche',
));
//
// Class: SLT
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:SLT' => 'SLT',
'Class:SLT+' => '',
'Class:SLT/Attribute:name' => 'Name',
'Class:SLT/Attribute:name+' => '',
'Class:SLT/Attribute:metric' => 'Metrisch',
'Class:SLT/Attribute:metric+' => '',
'Class:SLT/Attribute:metric/Value:TTO' => 'TTO',
'Class:SLT/Attribute:metric/Value:TTO+' => 'TTO',
'Class:SLT/Attribute:metric/Value:TTR' => 'TTR',
'Class:SLT/Attribute:metric/Value:TTR+' => 'TTR',
'Class:SLT/Attribute:ticket_priority' => 'Ticketpriorität',
'Class:SLT/Attribute:ticket_priority+' => '',
'Class:SLT/Attribute:ticket_priority/Value:1' => '1',
'Class:SLT/Attribute:ticket_priority/Value:1+' => '1',
'Class:SLT/Attribute:ticket_priority/Value:2' => '2',
'Class:SLT/Attribute:ticket_priority/Value:2+' => '2',
'Class:SLT/Attribute:ticket_priority/Value:3' => '3',
'Class:SLT/Attribute:ticket_priority/Value:3+' => '3',
'Class:SLT/Attribute:value' => 'Wert',
'Class:SLT/Attribute:value+' => '',
'Class:SLT/Attribute:value_unit' => 'Einheit',
'Class:SLT/Attribute:value_unit+' => '',
'Class:SLT/Attribute:value_unit/Value:days' => 'Tage',
'Class:SLT/Attribute:value_unit/Value:days+' => 'Tage',
'Class:SLT/Attribute:value_unit/Value:hours' => 'Stunden',
'Class:SLT/Attribute:value_unit/Value:hours+' => 'Stunden',
'Class:SLT/Attribute:value_unit/Value:minutes' => 'Minuten',
'Class:SLT/Attribute:value_unit/Value:minutes+' => 'Minuten',
'Class:SLT/Attribute:sla_list' => 'SLAs',
'Class:SLT/Attribute:sla_list+' => 'SLAs, die den SLT nutzen',
));
//
// Class: lnkSLTToSLA
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkSLTToSLA' => 'SLT/SLA',
'Class:lnkSLTToSLA+' => '',
'Class:lnkSLTToSLA/Attribute:sla_id' => 'SLA',
'Class:lnkSLTToSLA/Attribute:sla_id+' => '',
'Class:lnkSLTToSLA/Attribute:sla_name' => 'SLA',
'Class:lnkSLTToSLA/Attribute:sla_name+' => '',
'Class:lnkSLTToSLA/Attribute:slt_id' => 'SLT',
'Class:lnkSLTToSLA/Attribute:slt_id+' => '',
'Class:lnkSLTToSLA/Attribute:slt_name' => 'SLT',
'Class:lnkSLTToSLA/Attribute:slt_name+' => '',
'Class:lnkSLTToSLA/Attribute:slt_metric' => 'Metrisch',
'Class:lnkSLTToSLA/Attribute:slt_metric+' => '',
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority' => 'Ticketpriorität',
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority+' => '',
'Class:lnkSLTToSLA/Attribute:slt_value' => 'Wert',
'Class:lnkSLTToSLA/Attribute:slt_value+' => '',
'Class:lnkSLTToSLA/Attribute:slt_value_unit' => 'Einheit',
'Class:lnkSLTToSLA/Attribute:slt_value_unit+' => '',
));
//
// Class: lnkServiceToDoc
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkServiceToDoc' => 'Service/Dokument',
'Class:lnkServiceToDoc+' => '',
'Class:lnkServiceToDoc/Attribute:service_id' => 'Service',
'Class:lnkServiceToDoc/Attribute:service_id+' => '',
'Class:lnkServiceToDoc/Attribute:service_name' => 'Service',
'Class:lnkServiceToDoc/Attribute:service_name+' => '',
'Class:lnkServiceToDoc/Attribute:document_id' => 'Dokument',
'Class:lnkServiceToDoc/Attribute:document_id+' => '',
'Class:lnkServiceToDoc/Attribute:document_name' => 'Dokument',
'Class:lnkServiceToDoc/Attribute:document_name+' => '',
'Class:lnkServiceToDoc/Attribute:document_type' => 'Dokumententyp',
'Class:lnkServiceToDoc/Attribute:document_type+' => '',
'Class:lnkServiceToDoc/Attribute:document_status' => 'Dokumentenstatus',
'Class:lnkServiceToDoc/Attribute:document_status+' => '',
));
//
// Class: lnkServiceToContact
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkServiceToContact' => 'Service/Kontakt',
'Class:lnkServiceToContact+' => '',
'Class:lnkServiceToContact/Attribute:service_id' => 'Service',
'Class:lnkServiceToContact/Attribute:service_id+' => '',
'Class:lnkServiceToContact/Attribute:service_name' => 'Service',
'Class:lnkServiceToContact/Attribute:service_name+' => '',
'Class:lnkServiceToContact/Attribute:contact_id' => 'Kontakt',
'Class:lnkServiceToContact/Attribute:contact_id+' => '',
'Class:lnkServiceToContact/Attribute:contact_name' => 'Kontakt',
'Class:lnkServiceToContact/Attribute:contact_name+' => '',
'Class:lnkServiceToContact/Attribute:contact_email' => 'Kontaktemail',
'Class:lnkServiceToContact/Attribute:contact_email+' => '',
'Class:lnkServiceToContact/Attribute:role' => 'Rolle',
'Class:lnkServiceToContact/Attribute:role+' => '',
));
//
// Class: lnkServiceToCI
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkServiceToCI' => 'Service/CI',
'Class:lnkServiceToCI+' => '',
'Class:lnkServiceToCI/Attribute:service_id' => 'Service',
'Class:lnkServiceToCI/Attribute:service_id+' => '',
'Class:lnkServiceToCI/Attribute:service_name' => 'Service',
'Class:lnkServiceToCI/Attribute:service_name+' => '',
'Class:lnkServiceToCI/Attribute:ci_id' => 'CI',
'Class:lnkServiceToCI/Attribute:ci_id+' => '',
'Class:lnkServiceToCI/Attribute:ci_name' => 'CI',
'Class:lnkServiceToCI/Attribute:ci_name+' => '',
'Class:lnkServiceToCI/Attribute:ci_status' => 'CI-Status',
'Class:lnkServiceToCI/Attribute:ci_status+' => '',
));
?>
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ProviderContract' => 'Provider-Vertrag',
'Class:ProviderContract+' => '',
'Class:ProviderContract/Attribute:provider_id' => 'Anbieter',
'Class:ProviderContract/Attribute:provider_id+' => '',
'Class:ProviderContract/Attribute:sla' => 'SLA',
'Class:ProviderContract/Attribute:sla+' => 'Service Level Agreement',
'Class:ProviderContract/Attribute:coverage' => 'Abdeckung',
'Class:ProviderContract/Attribute:coverage+' => '',
'Class:CustomerContract' => 'Kundenvertrag',
'Class:CustomerContract+' => '',
'Class:CustomerContract/Attribute:org_id' => 'Kunde',
'Class:CustomerContract/Attribute:org_id+' => '',
'Class:CustomerContract/Attribute:provider_id' => 'Anbieter',
'Class:CustomerContract/Attribute:provider_id+' => '',
'Class:CustomerContract/Attribute:support_team_id' => 'Support-Team',
'Class:CustomerContract/Attribute:support_team_id+' => '',
'Class:CustomerContract/Attribute:sla_list' => 'SLAs',
'Class:CustomerContract/Attribute:sla_list+' => '',
'Class:CustomerContract/Attribute:provider_list' => 'Zugrunde liegende Verträge',
'Class:CustomerContract/Attribute:provider_list+' => '',
'Class:lnkCustomerContractToProviderContract' => 'Verbindung Kundenvertratg zu Provider-Vertrag',
'Class:lnkCustomerContractToProviderContract+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id' => 'Kundenvertrag',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id' => 'Provider Contract',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id+' => '',
'Class:lnkContractToSLA' => 'Contract/SLA',
'Class:lnkContractToSLA+' => '',
'Class:lnkContractToSLA/Attribute:contract_id' => 'Vertrag',
'Class:lnkContractToSLA/Attribute:contract_id+' => '',
'Class:lnkContractToSLA/Attribute:sla_id' => 'SLA',
'Class:lnkContractToSLA/Attribute:sla_id+' => '',
'Class:lnkContractToSLA/Attribute:coverage' => 'Abdeckung',
'Class:lnkContractToSLA/Attribute:coverage+' => '',
'Class:lnkContractToDoc' => 'Vertrag/Dokument',
'Class:lnkContractToDoc+' => '',
'Class:lnkContractToDoc/Attribute:contract_id' => 'Vertrag',
'Class:lnkContractToDoc/Attribute:contract_id+' => '',
'Class:lnkContractToDoc/Attribute:document_id' => 'Dokument',
'Class:lnkContractToDoc/Attribute:document_id+' => '',
'Class:lnkContractToContact' => 'Vertrag/Kontakt',
'Class:lnkContractToContact+' => '',
'Class:lnkContractToContact/Attribute:contract_id' => 'Vertrag',
'Class:lnkContractToContact/Attribute:contract_id+' => '',
'Class:lnkContractToContact/Attribute:contact_id' => 'Kontakt',
'Class:lnkContractToContact/Attribute:contact_id+' => '',
'Class:lnkContractToContact/Attribute:role' => 'Rolle',
'Class:lnkContractToContact/Attribute:role+' => '',
'Class:lnkContractToCI' => 'Vertrag/CI',
'Class:lnkContractToCI+' => '',
'Class:lnkContractToCI/Attribute:contract_id' => 'Vertrag',
'Class:lnkContractToCI/Attribute:contract_id+' => '',
'Class:lnkContractToCI/Attribute:ci_id' => 'CI',
'Class:lnkContractToCI/Attribute:ci_id+' => '',
'Class:Service' => 'Service',
'Class:Service+' => '',
'Class:Service/Attribute:org_id' => 'Anbieter',
'Class:Service/Attribute:org_id+' => '',
'Class:Service/Attribute:name' => 'Name',
'Class:Service/Attribute:name+' => '',
'Class:Service/Attribute:description' => 'Beschreibung',
'Class:Service/Attribute:description+' => '',
'Class:Service/Attribute:type' => 'Typ',
'Class:Service/Attribute:type+' => '',
'Class:Service/Attribute:type/Value:IncidentManagement' => 'Incident Management',
'Class:Service/Attribute:type/Value:IncidentManagement+' => 'Incident Management',
'Class:Service/Attribute:type/Value:RequestManagement' => 'Request Management',
'Class:Service/Attribute:type/Value:RequestManagement+' => 'Request Management',
'Class:Service/Attribute:status' => 'Status',
'Class:Service/Attribute:status+' => '',
'Class:Service/Attribute:status/Value:design' => 'Design',
'Class:Service/Attribute:status/Value:design+' => '',
'Class:Service/Attribute:status/Value:obsolete' => 'Veraltet',
'Class:Service/Attribute:status/Value:obsolete+' => '',
'Class:Service/Attribute:status/Value:production' => 'Produktion',
'Class:Service/Attribute:status/Value:production+' => '',
'Class:Service/Attribute:subcategory_list' => 'Service-Unterkategorien',
'Class:Service/Attribute:subcategory_list+' => '',
'Class:Service/Attribute:sla_list' => 'SLAs',
'Class:Service/Attribute:sla_list+' => '',
'Class:Service/Attribute:document_list' => 'Dokumente',
'Class:Service/Attribute:document_list+' => 'Dokumente beigefügt zu dem Service',
'Class:Service/Attribute:contact_list' => 'Kontakte',
'Class:Service/Attribute:contact_list+' => 'Kontakte, die für diesen Service eine Rolle wahrnehmen',
'Class:ServiceSubcategory' => 'Service-Unterkategorien',
'Class:ServiceSubcategory+' => '',
'Class:ServiceSubcategory/Attribute:name' => 'Name',
'Class:ServiceSubcategory/Attribute:name+' => '',
'Class:ServiceSubcategory/Attribute:description' => 'Beschreibung',
'Class:ServiceSubcategory/Attribute:description+' => '',
'Class:ServiceSubcategory/Attribute:service_id' => 'Service',
'Class:ServiceSubcategory/Attribute:service_id+' => '',
'Class:SLA' => 'SLA',
'Class:SLA+' => '',
'Class:SLA/Attribute:name' => 'Name',
'Class:SLA/Attribute:name+' => '',
'Class:SLA/Attribute:service_id' => 'Service',
'Class:SLA/Attribute:service_id+' => '',
'Class:SLA/Attribute:slt_list' => 'SLTs',
'Class:SLA/Attribute:slt_list+' => 'Auflistung der Service Level-Grenzbereiche',
'Class:SLT' => 'SLT',
'Class:SLT+' => '',
'Class:SLT/Attribute:name' => 'Name',
'Class:SLT/Attribute:name+' => '',
'Class:SLT/Attribute:metric' => 'Metrisch',
'Class:SLT/Attribute:metric+' => '',
'Class:SLT/Attribute:metric/Value:TTO' => 'TTO',
'Class:SLT/Attribute:metric/Value:TTO+' => 'TTO',
'Class:SLT/Attribute:metric/Value:TTR' => 'TTR',
'Class:SLT/Attribute:metric/Value:TTR+' => 'TTR',
'Class:SLT/Attribute:ticket_priority' => 'Ticketpriorität',
'Class:SLT/Attribute:ticket_priority+' => '',
'Class:SLT/Attribute:ticket_priority/Value:1' => '1',
'Class:SLT/Attribute:ticket_priority/Value:1+' => '1',
'Class:SLT/Attribute:ticket_priority/Value:2' => '2',
'Class:SLT/Attribute:ticket_priority/Value:2+' => '2',
'Class:SLT/Attribute:ticket_priority/Value:3' => '3',
'Class:SLT/Attribute:ticket_priority/Value:3+' => '3',
'Class:SLT/Attribute:value' => 'Wert',
'Class:SLT/Attribute:value+' => '',
'Class:SLT/Attribute:value_unit' => 'Einheit',
'Class:SLT/Attribute:value_unit+' => '',
'Class:SLT/Attribute:value_unit/Value:days' => 'Tage',
'Class:SLT/Attribute:value_unit/Value:days+' => 'Tage',
'Class:SLT/Attribute:value_unit/Value:hours' => 'Stunden',
'Class:SLT/Attribute:value_unit/Value:hours+' => 'Stunden',
'Class:SLT/Attribute:value_unit/Value:minutes' => 'Minuten',
'Class:SLT/Attribute:value_unit/Value:minutes+' => 'Minuten',
'Class:SLT/Attribute:sla_list' => 'SLAs',
'Class:SLT/Attribute:sla_list+' => 'SLAs, die den SLT nutzen',
'Class:lnkSLTToSLA' => 'SLT/SLA',
'Class:lnkSLTToSLA+' => '',
'Class:lnkSLTToSLA/Attribute:sla_id' => 'SLA',
'Class:lnkSLTToSLA/Attribute:sla_id+' => '',
'Class:lnkSLTToSLA/Attribute:slt_id' => 'SLT',
'Class:lnkSLTToSLA/Attribute:slt_id+' => '',
'Class:lnkServiceToDoc' => 'Service/Dokument',
'Class:lnkServiceToDoc+' => '',
'Class:lnkServiceToDoc/Attribute:service_id' => 'Service',
'Class:lnkServiceToDoc/Attribute:service_id+' => '',
'Class:lnkServiceToDoc/Attribute:document_id' => 'Dokument',
'Class:lnkServiceToDoc/Attribute:document_id+' => '',
'Class:lnkServiceToContact' => 'Service/Kontakt',
'Class:lnkServiceToContact+' => '',
'Class:lnkServiceToContact/Attribute:service_id' => 'Service',
'Class:lnkServiceToContact/Attribute:service_id+' => '',
'Class:lnkServiceToContact/Attribute:contact_id' => 'Kontakt',
'Class:lnkServiceToContact/Attribute:contact_id+' => '',
'Class:lnkServiceToContact/Attribute:role' => 'Rolle',
'Class:lnkServiceToContact/Attribute:role+' => '',
'Class:lnkServiceToCI' => 'Service/CI',
'Class:lnkServiceToCI+' => '',
'Class:lnkServiceToCI/Attribute:service_id' => 'Service',
'Class:lnkServiceToCI/Attribute:service_id+' => '',
'Class:lnkServiceToCI/Attribute:ci_id' => 'CI',
'Class:lnkServiceToCI/Attribute:ci_id+' => '',
'Menu:ServiceManagement' => 'Service Management',
'Menu:ServiceManagement+' => 'Service Management-Übersicht',
'Menu:Service:Overview' => 'Übersicht',
'Menu:Service:Overview+' => '',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Verträge nach Service Level',
'UI-ServiceManagementMenu-ContractsByStatus' => 'Verträge nach Status',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Verträge, die in weniger als 30 Tagen enden',
'Menu:ServiceType' => 'Service Typen',
'Menu:ServiceType+' => 'Service Typen',
'Menu:ProviderContract' => 'Provider-Verträge',
'Menu:ProviderContract+' => 'Provider-Verträge',
'Menu:CustomerContract' => 'Kundenverträge',
'Menu:CustomerContract+' => 'Kundenverträge',
'Menu:ServiceSubcategory' => 'Service-Unterkategorien',
'Menu:ServiceSubcategory+' => 'Service-Unterkategorien',
'Menu:Service' => 'Services',
'Menu:Service+' => 'Services',
'Menu:SLA' => 'SLAs',
'Menu:SLA+' => 'Service Level Agreements',
'Menu:SLT' => 'SLTs',
'Menu:SLT+' => 'Service Level Targets',
'Class:Contract' => 'Vertrag',
'Class:Contract+' => '',
'Class:Contract/Attribute:name' => 'Name',
'Class:Contract/Attribute:name+' => '',
'Class:Contract/Attribute:description' => 'Beschreibung',
'Class:Contract/Attribute:description+' => '',
'Class:Contract/Attribute:start_date' => 'Anfangsdatum',
'Class:Contract/Attribute:start_date+' => '',
'Class:Contract/Attribute:end_date' => 'Ablaufdatum',
'Class:Contract/Attribute:end_date+' => '',
'Class:Contract/Attribute:cost' => 'Kosten',
'Class:Contract/Attribute:cost+' => '',
'Class:Contract/Attribute:cost_currency' => 'Währung',
'Class:Contract/Attribute:cost_currency+' => '',
'Class:Contract/Attribute:cost_currency/Value:dollars' => 'Dollar',
'Class:Contract/Attribute:cost_currency/Value:dollars+' => '',
'Class:Contract/Attribute:cost_currency/Value:euros' => 'Euro',
'Class:Contract/Attribute:cost_currency/Value:euros+' => '',
'Class:Contract/Attribute:cost_unit' => 'Kosteneinheit',
'Class:Contract/Attribute:cost_unit+' => '',
'Class:Contract/Attribute:billing_frequency' => 'Abrechnungshäufigkeit',
'Class:Contract/Attribute:billing_frequency+' => '',
'Class:Contract/Attribute:contact_list' => 'Kontakte',
'Class:Contract/Attribute:contact_list+' => 'Kontakte zu diesem Vertrag',
'Class:Contract/Attribute:document_list' => 'Dokumente',
'Class:Contract/Attribute:document_list+' => 'Dokumente zu diesem Vertrag',
'Class:Contract/Attribute:ci_list' => 'CIs',
'Class:Contract/Attribute:ci_list+' => 'CI, die von dem Vertrag unterstützt werden',
'Class:Contract/Attribute:finalclass' => 'Typ',
'Class:Contract/Attribute:finalclass+' => '',
'Class:ProviderContract/Attribute:provider_name' => 'Providername',
'Class:ProviderContract/Attribute:provider_name+' => '',
'Class:CustomerContract/Attribute:org_name' => 'Kundenname',
'Class:CustomerContract/Attribute:org_name+' => '',
'Class:CustomerContract/Attribute:provider_name' => 'Providername',
'Class:CustomerContract/Attribute:provider_name+' => '',
'Class:CustomerContract/Attribute:support_team_name' => 'Support-Team',
'Class:CustomerContract/Attribute:support_team_name+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name' => 'Name',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name' => 'Name',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla' => 'Provider-SLA',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla+' => 'Service Level Agreement',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage' => 'Service-Stunden',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage+' => '',
'Class:lnkContractToSLA/Attribute:contract_name' => 'Vertrag',
'Class:lnkContractToSLA/Attribute:contract_name+' => '',
'Class:lnkContractToSLA/Attribute:sla_name' => 'SLA',
'Class:lnkContractToSLA/Attribute:sla_name+' => '',
'Class:lnkContractToDoc/Attribute:contract_name' => 'Vertrag',
'Class:lnkContractToDoc/Attribute:contract_name+' => '',
'Class:lnkContractToDoc/Attribute:document_name' => 'Dokument',
'Class:lnkContractToDoc/Attribute:document_name+' => '',
'Class:lnkContractToDoc/Attribute:document_type' => 'Dokumententyp',
'Class:lnkContractToDoc/Attribute:document_type+' => '',
'Class:lnkContractToDoc/Attribute:document_status' => 'Dokumentenstatus',
'Class:lnkContractToDoc/Attribute:document_status+' => '',
'Class:lnkContractToContact/Attribute:contract_name' => 'Vertrag',
'Class:lnkContractToContact/Attribute:contract_name+' => '',
'Class:lnkContractToContact/Attribute:contact_name' => 'Kontakt',
'Class:lnkContractToContact/Attribute:contact_name+' => '',
'Class:lnkContractToContact/Attribute:contact_email' => 'Kontaktemail',
'Class:lnkContractToContact/Attribute:contact_email+' => '',
'Class:lnkContractToCI/Attribute:contract_name' => 'Vertrag',
'Class:lnkContractToCI/Attribute:contract_name+' => '',
'Class:lnkContractToCI/Attribute:ci_name' => 'CI',
'Class:lnkContractToCI/Attribute:ci_name+' => '',
'Class:lnkContractToCI/Attribute:ci_status' => 'CI-Status',
'Class:lnkContractToCI/Attribute:ci_status+' => '',
'Class:Service/Attribute:provider_name' => 'Anbieter',
'Class:Service/Attribute:provider_name+' => '',
'Class:Service/Tab:Related_Contracts' => 'Zugehörige Verträge',
'Class:Service/Tab:Related_Contracts+' => 'Verträge, die für diesen Service unterschrieben wurden',
'Class:ServiceSubcategory/Attribute:service_name' => 'Service',
'Class:ServiceSubcategory/Attribute:service_name+' => '',
'Class:SLA/Attribute:service_name' => 'Service',
'Class:SLA/Attribute:service_name+' => '',
'Class:lnkSLTToSLA/Attribute:sla_name' => 'SLA',
'Class:lnkSLTToSLA/Attribute:sla_name+' => '',
'Class:lnkSLTToSLA/Attribute:slt_name' => 'SLT',
'Class:lnkSLTToSLA/Attribute:slt_name+' => '',
'Class:lnkSLTToSLA/Attribute:slt_metric' => 'Metrik',
'Class:lnkSLTToSLA/Attribute:slt_metric+' => '',
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority' => 'Ticketpriorität',
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority+' => '',
'Class:lnkSLTToSLA/Attribute:slt_value' => 'Wert',
'Class:lnkSLTToSLA/Attribute:slt_value+' => '',
'Class:lnkSLTToSLA/Attribute:slt_value_unit' => 'Einheit',
'Class:lnkSLTToSLA/Attribute:slt_value_unit+' => '',
'Class:lnkServiceToDoc/Attribute:service_name' => 'Service',
'Class:lnkServiceToDoc/Attribute:service_name+' => '',
'Class:lnkServiceToDoc/Attribute:document_name' => 'Dokument',
'Class:lnkServiceToDoc/Attribute:document_name+' => '',
'Class:lnkServiceToDoc/Attribute:document_type' => 'Dokumententyp',
'Class:lnkServiceToDoc/Attribute:document_type+' => '',
'Class:lnkServiceToDoc/Attribute:document_status' => 'Dokumentenstatus',
'Class:lnkServiceToDoc/Attribute:document_status+' => '',
'Class:lnkServiceToContact/Attribute:service_name' => 'Service',
'Class:lnkServiceToContact/Attribute:service_name+' => '',
'Class:lnkServiceToContact/Attribute:contact_name' => 'Kontakt',
'Class:lnkServiceToContact/Attribute:contact_name+' => '',
'Class:lnkServiceToContact/Attribute:contact_email' => 'Kontaktemail',
'Class:lnkServiceToContact/Attribute:contact_email+' => '',
'Class:lnkServiceToCI/Attribute:service_name' => 'Service',
'Class:lnkServiceToCI/Attribute:service_name+' => '',
'Class:lnkServiceToCI/Attribute:ci_name' => 'CI',
'Class:lnkServiceToCI/Attribute:ci_name+' => '',
'Class:lnkServiceToCI/Attribute:ci_status' => 'CI-Status',
'Class:lnkServiceToCI/Attribute:ci_status+' => '',
));
?>

View File

@@ -35,27 +35,29 @@
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Menu:ServiceManagement' => 'サービス管理', // 'Service Management', # 'Service Management'
'Menu:ServiceManagement+' => 'サービス管理概要', // 'Service Management Overview', # 'Service Management Overview'
'Menu:Service:Overview' => '概要', # 'Overview'
'Menu:Service:Overview+' => '', # ''
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'サービスレベル別コンタクト', // 'Contracts by service level', # 'Contracts by service level'
'UI-ServiceManagementMenu-ContractsByStatus' => 'ステータス別コンタクト', // 'Contracts by status', # 'Contracts by status'
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => '30日以内に終了するコンタクト', // 'Contracts ending in less then 30 days', # 'Contracts ending in less then 30 days'
'Menu:ServiceType' => 'サービスタイプ', // 'Service Types', # 'Service Types'
'Menu:ServiceType+' => 'サービスタイプ', // 'Service Types', # 'Service Types'
'Menu:ProviderContract' => 'プロバイダコンタクト', // 'Provider Contracts', # 'Provider Contracts'
'Menu:ProviderContract+' => 'プロバイダコンタクト', // 'Provider Contracts', # 'Provider Contracts'
'Menu:CustomerContract' => 'カスタマーコンタクト', // 'Customer Contracts', # 'Customer Contracts'
'Menu:CustomerContract+' => 'カスタマーコンタクト', // 'Customer Contracts', # 'Customer Contracts'
'Menu:ServiceSubcategory' => 'サービスのサブカテゴリ', // 'Service Subcategories', # 'Service Subcategories'
'Menu:ServiceSubcategory+' => 'サービスのサブカテゴリ', // 'Service Subcategories', # 'Service Subcategories'
'Menu:Service' => 'サービス', // 'Services', # 'Services'
'Menu:Service+' => 'サービス', // 'Services', # 'Services'
'Menu:SLA' => 'SLA', // 'SLAs', # 'SLAs'
'Menu:SLA+' => 'サービスレベルアグリーメント', // 'Service Level Agreements', # 'Service Level Agreements'
'Menu:SLT' => 'SLT', // 'SLTs', # 'SLTs'
'Menu:SLT+' => 'サービスレベルターゲット', // 'Service Level Targets', # 'Service Level Targets'
'Menu:ServiceManagement' => 'サービス管理',
'Menu:ServiceManagement+' => 'サービス管理概要',
'Menu:Service:Overview' => '概要',
'Menu:Service:Overview+' => '',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'サービスレベル別連絡先',
'UI-ServiceManagementMenu-ContractsByStatus' => '状態別連絡先',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => '30日以内に終了する契約',
'Menu:ServiceType' => 'サービスタイプ',
'Menu:ServiceType+' => 'サービスタイプ',
'Menu:ProviderContract' => 'プロバイダ契約',
'Menu:ProviderContract+' => 'プロバイダ契約',
'Menu:CustomerContract' => '顧客契約',
'Menu:CustomerContract+' => '顧客契約',
'Menu:ServiceSubcategory' => 'サービスのサブカテゴリ',
'Menu:ServiceSubcategory+' => 'サービスのサブカテゴリ',
'Menu:Service' => 'サービス',
'Menu:Service+' => 'サービス',
'Menu:SLA' => 'SLA',
'Menu:SLA+' => 'サービスレベルアグリーメント',
'Menu:SLT' => 'SLT',
'Menu:SLT+' => 'サービスレベルターゲット',
));
@@ -74,36 +76,36 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:Contract' => '契約', // 'Contract', # 'Contract'
'Class:Contract+' => '', # ''
'Class:Contract/Attribute:name' => '名前', // 'Name', # 'Name'
'Class:Contract/Attribute:name+' => '', # ''
'Class:Contract/Attribute:description' => '詳細記述', // 'Description', # 'Description'
'Class:Contract/Attribute:description+' => '', # ''
'Class:Contract/Attribute:start_date' => '開始日', // 'Start date', # 'Start date'
'Class:Contract/Attribute:start_date+' => '', # ''
'Class:Contract/Attribute:end_date' => '終了日', // 'End date', # 'End date'
'Class:Contract/Attribute:end_date+' => '', # ''
'Class:Contract/Attribute:cost' => 'コスト', // 'Cost', # 'Cost'
'Class:Contract/Attribute:cost+' => '', # ''
'Class:Contract/Attribute:cost_currency' => 'コスト通貨', // 'Cost Currency', # 'Cost Currency'
'Class:Contract/Attribute:cost_currency+' => '', # ''
'Class:Contract/Attribute:cost_currency/Value:dollars' => '米ドル', // 'Dollars', # 'Dollars'
'Class:Contract/Attribute:cost_currency/Value:dollars+' => '', # ''
'Class:Contract/Attribute:cost_currency/Value:euros' => 'ユーロ', // 'Euros', # 'Euros'
'Class:Contract/Attribute:cost_currency/Value:euros+' => '', # ''
'Class:Contract/Attribute:cost_unit' => 'コスト単位', // 'Cost unit', # 'Cost unit'
'Class:Contract/Attribute:cost_unit+' => '', # ''
'Class:Contract/Attribute:billing_frequency' => 'ビリング頻度', // 'Billing frequency', # 'Billing frequency'
'Class:Contract/Attribute:billing_frequency+' => '', # ''
'Class:Contract/Attribute:contact_list' => 'コンタクト', // 'Contacts', # 'Contacts'
'Class:Contract/Attribute:contact_list+' => '契約に関連するコンタクト', // 'Contacts related to the contract', # 'Contacts related to the contract'
'Class:Contract/Attribute:document_list' => 'ドキュメント', // 'Documents', # 'Documents'
'Class:Contract/Attribute:document_list+' => '契約に付随するドキュメント', // 'Documents attached to the contract', # 'Documents attached to the contract'
'Class:Contract/Attribute:ci_list' => 'CI', // 'CIs', # 'CIs'
'Class:Contract/Attribute:ci_list+' => '契約でサポートされるCI', // 'CI supported by the contract', # 'CI supported by the contract'
'Class:Contract/Attribute:finalclass' => 'タイプ', // 'Type', # 'Type'
'Class:Contract/Attribute:finalclass+' => '', # ''
'Class:Contract' => '契約',
'Class:Contract+' => '',
'Class:Contract/Attribute:name' => '名前',
'Class:Contract/Attribute:name+' => '',
'Class:Contract/Attribute:description' => '説明',
'Class:Contract/Attribute:description+' => '',
'Class:Contract/Attribute:start_date' => '開始日',
'Class:Contract/Attribute:start_date+' => '',
'Class:Contract/Attribute:end_date' => '終了日',
'Class:Contract/Attribute:end_date+' => '',
'Class:Contract/Attribute:cost' => '費用',
'Class:Contract/Attribute:cost+' => '',
'Class:Contract/Attribute:cost_currency' => '費用通貨',
'Class:Contract/Attribute:cost_currency+' => '',
'Class:Contract/Attribute:cost_currency/Value:dollars' => '米ドル',
'Class:Contract/Attribute:cost_currency/Value:dollars+' => '',
'Class:Contract/Attribute:cost_currency/Value:euros' => 'ユーロ',
'Class:Contract/Attribute:cost_currency/Value:euros+' => '',
'Class:Contract/Attribute:cost_unit' => '費用単位',
'Class:Contract/Attribute:cost_unit+' => '',
'Class:Contract/Attribute:billing_frequency' => '課金頻度',
'Class:Contract/Attribute:billing_frequency+' => '',
'Class:Contract/Attribute:contact_list' => '連絡先',
'Class:Contract/Attribute:contact_list+' => 'この契約に関連する連絡先',
'Class:Contract/Attribute:document_list' => '文書',
'Class:Contract/Attribute:document_list+' => 'この契約に付随する文書',
'Class:Contract/Attribute:ci_list' => 'CI',
'Class:Contract/Attribute:ci_list+' => 'この契約でサポートされるCI',
'Class:Contract/Attribute:finalclass' => 'タイプ',
'Class:Contract/Attribute:finalclass+' => '',
));
//
@@ -111,16 +113,16 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:ProviderContract' => 'プロバイダ契約', // 'Provider Contract', # 'Provider Contract'
'Class:ProviderContract+' => '', # ''
'Class:ProviderContract/Attribute:provider_id' => 'プロバイダ', // 'Provider', # 'Provider'
'Class:ProviderContract/Attribute:provider_id+' => '', # ''
'Class:ProviderContract/Attribute:provider_name' => 'プロバイダ名', // 'Provider name', # 'Provider name'
'Class:ProviderContract/Attribute:provider_name+' => '', # ''
'Class:ProviderContract/Attribute:sla' => 'SLA', # 'SLA'
'Class:ProviderContract/Attribute:sla+' => 'サービスレベルアグリーメント', // 'Service Level Agreement', # 'Service Level Agreement'
'Class:ProviderContract/Attribute:coverage' => 'サービス時間', // 'Service hours', # 'Service hours'
'Class:ProviderContract/Attribute:coverage+' => '', # ''
'Class:ProviderContract' => 'プロバイダ契約',
'Class:ProviderContract+' => '',
'Class:ProviderContract/Attribute:provider_id' => 'プロバイダ',
'Class:ProviderContract/Attribute:provider_id+' => '',
'Class:ProviderContract/Attribute:provider_name' => 'プロバイダ名',
'Class:ProviderContract/Attribute:provider_name+' => '',
'Class:ProviderContract/Attribute:sla' => 'SLA',
'Class:ProviderContract/Attribute:sla+' => 'サービスレベルアグリーメント',
'Class:ProviderContract/Attribute:coverage' => 'サービス時間',
'Class:ProviderContract/Attribute:coverage+' => '',
));
//
@@ -128,47 +130,46 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:CustomerContract' => 'カスタマ契約', // 'Customer Contract', # 'Customer Contract'
'Class:CustomerContract+' => '', # ''
'Class:CustomerContract/Attribute:org_id' => 'カスタマ', // 'Customer', # 'Customer'
'Class:CustomerContract/Attribute:org_id+' => '', # ''
'Class:CustomerContract/Attribute:org_name' => 'カスタマ名', // 'Customer name', # 'Customer name'
'Class:CustomerContract/Attribute:org_name+' => '', # ''
'Class:CustomerContract/Attribute:provider_id' => 'プロバイダ', // 'Provider', # 'Provider'
'Class:CustomerContract/Attribute:provider_id+' => '', # ''
'Class:CustomerContract/Attribute:provider_name' => 'プロバイダ名', // 'Provider name', # 'Provider name'
'Class:CustomerContract/Attribute:provider_name+' => '', # ''
'Class:CustomerContract/Attribute:support_team_id' => 'サポートチーム', // 'Support team', # 'Support team'
'Class:CustomerContract/Attribute:support_team_id+' => '', # ''
'Class:CustomerContract/Attribute:support_team_name' => 'サポートチーム', // 'Support team', # 'Support team'
'Class:CustomerContract/Attribute:support_team_name+' => '', # ''
'Class:CustomerContract/Attribute:provider_list' => 'プロバイダ', // 'Providers', # 'Providers'
'Class:CustomerContract/Attribute:provider_list+' => '', # ''
'Class:CustomerContract/Attribute:sla_list' => 'SLA', // 'SLAs', # 'SLAs'
'Class:CustomerContract/Attribute:sla_list+' => '契約に関連するSLAリスト', // 'List of SLA related to the contract', # 'List of SLA related to the contract'
'Class:CustomerContract/Attribute:provider_list' => '前提となる契約', // 'Underpinning Contracts', # 'Underpinning Contracts'
'Class:CustomerContract/Attribute:sla_list+' => '', # ''
'Class:CustomerContract' => '顧客契約',
'Class:CustomerContract+' => '',
'Class:CustomerContract/Attribute:org_id' => '顧客',
'Class:CustomerContract/Attribute:org_id+' => '',
'Class:CustomerContract/Attribute:org_name' => '顧客名',
'Class:CustomerContract/Attribute:org_name+' => '',
'Class:CustomerContract/Attribute:provider_id' => 'プロバイダ',
'Class:CustomerContract/Attribute:provider_id+' => '',
'Class:CustomerContract/Attribute:provider_name' => 'プロバイダ名',
'Class:CustomerContract/Attribute:provider_name+' => '',
'Class:CustomerContract/Attribute:support_team_id' => 'サポートチーム',
'Class:CustomerContract/Attribute:support_team_id+' => '',
'Class:CustomerContract/Attribute:support_team_name' => 'サポートチーム',
'Class:CustomerContract/Attribute:support_team_name+' => '',
'Class:CustomerContract/Attribute:provider_list' => 'プロバイダ',
'Class:CustomerContract/Attribute:provider_list+' => '',
'Class:CustomerContract/Attribute:sla_list' => 'SLA',
'Class:CustomerContract/Attribute:sla_list+' => 'この契約に関連するSLAリスト',
'Class:CustomerContract/Attribute:provider_list' => '前提となる契約', // 'Underpinning Contracts',
'Class:CustomerContract/Attribute:sla_list+' => '',
));
//
// Class: lnkCustomerContractToProviderContract
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:lnkCustomerContractToProviderContract' => 'カスタマー契約とプロバイダ契約のリンク', // 'lnkCustomerContractToProviderContract', # 'lnkCustomerContractToProviderContract'
'Class:lnkCustomerContractToProviderContract+' => '', # ''
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id' => 'カスタマ契約', // 'Customer Contract', # 'Customer Contract'
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id+' => '', # ''
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name' => '名前', // 'Name', # 'Name'
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name+' => '', # ''
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id' => 'プロバイダ契約', // 'Provider Contract', # 'Provider Contract'
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id+' => '', # ''
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name' => '名前', // 'Name', # 'Name'
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name+' => '', # ''
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla' => 'プロバイダSLA', // 'Provider SLA', # 'Provider SLA'
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla+' => 'サービスレベルアグリーメント', // 'Service Level Agreement', # 'Service Level Agreement'
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage' => 'サービス時間', // 'Service hours', # 'Service hours'
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage+' => '', # ''
'Class:lnkCustomerContractToProviderContract' => '顧客契約とプロバイダ契約のリンク',
'Class:lnkCustomerContractToProviderContract+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id' => 'カスタマ契約',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name' => '名前',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id' => 'プロバイダ契約',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name' => '名前',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla' => 'プロバイダSLA',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla+' => 'サービスレベルアグリーメント',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage' => 'サービス時間',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage+' => '',
));
@@ -177,18 +178,18 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:lnkContractToSLA' => '契約/SLA', // 'Contract/SLA', # 'Contract/SLA'
'Class:lnkContractToSLA+' => '', # ''
'Class:lnkContractToSLA/Attribute:contract_id' => '契約', // 'Contract', # 'Contract'
'Class:lnkContractToSLA/Attribute:contract_id+' => '', # ''
'Class:lnkContractToSLA/Attribute:contract_name' => '契約', // 'Contract', # 'Contract'
'Class:lnkContractToSLA/Attribute:contract_name+' => '', # ''
'Class:lnkContractToSLA/Attribute:sla_id' => 'SLA', # 'SLA'
'Class:lnkContractToSLA/Attribute:sla_id+' => '', # ''
'Class:lnkContractToSLA/Attribute:sla_name' => 'SLA', # 'SLA'
'Class:lnkContractToSLA/Attribute:sla_name+' => '', # ''
'Class:lnkContractToSLA/Attribute:coverage' => 'サービス時間', // 'Service Hours', # 'Service Hours'
'Class:lnkContractToSLA/Attribute:coverage+' => '', # ''
'Class:lnkContractToSLA' => '契約/SLA',
'Class:lnkContractToSLA+' => '',
'Class:lnkContractToSLA/Attribute:contract_id' => '契約',
'Class:lnkContractToSLA/Attribute:contract_id+' => '',
'Class:lnkContractToSLA/Attribute:contract_name' => '契約',
'Class:lnkContractToSLA/Attribute:contract_name+' => '',
'Class:lnkContractToSLA/Attribute:sla_id' => 'SLA',
'Class:lnkContractToSLA/Attribute:sla_id+' => '',
'Class:lnkContractToSLA/Attribute:sla_name' => 'SLA',
'Class:lnkContractToSLA/Attribute:sla_name+' => '',
'Class:lnkContractToSLA/Attribute:coverage' => 'サービス時間',
'Class:lnkContractToSLA/Attribute:coverage+' => '',
));
//
@@ -196,20 +197,20 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:lnkContractToDoc' => '契約/ドキュメント', // 'Contract/Doc', # 'Contract/Doc'
'Class:lnkContractToDoc+' => '', # ''
'Class:lnkContractToDoc/Attribute:contract_id' => '契約', // 'Contract', # 'Contract'
'Class:lnkContractToDoc/Attribute:contract_id+' => '', # ''
'Class:lnkContractToDoc/Attribute:contract_name' => '契約', // 'Contract', # 'Contract'
'Class:lnkContractToDoc/Attribute:contract_name+' => '', # ''
'Class:lnkContractToDoc/Attribute:document_id' => 'ドキュメント', // 'Document', # 'Document'
'Class:lnkContractToDoc/Attribute:document_id+' => '', # ''
'Class:lnkContractToDoc/Attribute:document_name' => 'ドキュメント', // 'Document', # 'Document'
'Class:lnkContractToDoc/Attribute:document_name+' => '', # ''
'Class:lnkContractToDoc/Attribute:document_type' => 'ドキュメントタイプ', // 'Document type', # 'Document type'
'Class:lnkContractToDoc/Attribute:document_type+' => '', # ''
'Class:lnkContractToDoc/Attribute:document_status' => 'ドキュメントステータス', // 'Document status', # 'Document status'
'Class:lnkContractToDoc/Attribute:document_status+' => '', # ''
'Class:lnkContractToDoc' => '契約/文書',
'Class:lnkContractToDoc+' => '',
'Class:lnkContractToDoc/Attribute:contract_id' => '契約',
'Class:lnkContractToDoc/Attribute:contract_id+' => '',
'Class:lnkContractToDoc/Attribute:contract_name' => '契約',
'Class:lnkContractToDoc/Attribute:contract_name+' => '',
'Class:lnkContractToDoc/Attribute:document_id' => '文書',
'Class:lnkContractToDoc/Attribute:document_id+' => '',
'Class:lnkContractToDoc/Attribute:document_name' => '文書',
'Class:lnkContractToDoc/Attribute:document_name+' => '',
'Class:lnkContractToDoc/Attribute:document_type' => '文書のタイプ',
'Class:lnkContractToDoc/Attribute:document_type+' => '',
'Class:lnkContractToDoc/Attribute:document_status' => '文書の状態',
'Class:lnkContractToDoc/Attribute:document_status+' => '',
));
//
@@ -217,20 +218,20 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:lnkContractToContact' => '契約/コンタクト', // 'Contract/Contact', # 'Contract/Contact'
'Class:lnkContractToContact+' => '', # ''
'Class:lnkContractToContact/Attribute:contract_id' => '契約', // 'Contract', # 'Contract'
'Class:lnkContractToContact/Attribute:contract_id+' => '', # ''
'Class:lnkContractToContact/Attribute:contract_name' => '契約', // 'Contract', # 'Contract'
'Class:lnkContractToContact/Attribute:contract_name+' => '', # ''
'Class:lnkContractToContact/Attribute:contact_id' => 'コンタクト', // 'Contact', # 'Contact'
'Class:lnkContractToContact/Attribute:contact_id+' => '', # ''
'Class:lnkContractToContact/Attribute:contact_name' => 'コンタクト', // 'Contact', # 'Contact'
'Class:lnkContractToContact/Attribute:contact_name+' => '', # ''
'Class:lnkContractToContact/Attribute:contact_email' => 'コンタクトEメール', // 'Contact email', # 'Contact email'
'Class:lnkContractToContact/Attribute:contact_email+' => '', # ''
'Class:lnkContractToContact/Attribute:role' => '役割', // 'Role', # 'Role'
'Class:lnkContractToContact/Attribute:role+' => '', # ''
'Class:lnkContractToContact' => '契約/連絡先',
'Class:lnkContractToContact+' => '',
'Class:lnkContractToContact/Attribute:contract_id' => '契約',
'Class:lnkContractToContact/Attribute:contract_id+' => '',
'Class:lnkContractToContact/Attribute:contract_name' => '契約',
'Class:lnkContractToContact/Attribute:contract_name+' => '',
'Class:lnkContractToContact/Attribute:contact_id' => '連絡先',
'Class:lnkContractToContact/Attribute:contact_id+' => '',
'Class:lnkContractToContact/Attribute:contact_name' => '連絡先',
'Class:lnkContractToContact/Attribute:contact_name+' => '',
'Class:lnkContractToContact/Attribute:contact_email' => '連絡先Eメール',
'Class:lnkContractToContact/Attribute:contact_email+' => '',
'Class:lnkContractToContact/Attribute:role' => '役割',
'Class:lnkContractToContact/Attribute:role+' => '',
));
//
@@ -238,18 +239,18 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:lnkContractToCI' => '契約/CI', // 'Contract/CI', # 'Contract/CI'
'Class:lnkContractToCI+' => '', # ''
'Class:lnkContractToCI/Attribute:contract_id' => '契約', // 'Contract', # 'Contract'
'Class:lnkContractToCI/Attribute:contract_id+' => '', # ''
'Class:lnkContractToCI/Attribute:contract_name' => '契約', // 'Contract', # 'Contract'
'Class:lnkContractToCI/Attribute:contract_name+' => '', # ''
'Class:lnkContractToCI/Attribute:ci_id' => 'CI', # 'CI'
'Class:lnkContractToCI/Attribute:ci_id+' => '', # ''
'Class:lnkContractToCI/Attribute:ci_name' => 'CI', # 'CI'
'Class:lnkContractToCI/Attribute:ci_name+' => '', # ''
'Class:lnkContractToCI/Attribute:ci_status' => 'CIステータス', // 'CI status', # 'CI status'
'Class:lnkContractToCI/Attribute:ci_status+' => '', # ''
'Class:lnkContractToCI' => '契約/CI',
'Class:lnkContractToCI+' => '',
'Class:lnkContractToCI/Attribute:contract_id' => '契約',
'Class:lnkContractToCI/Attribute:contract_id+' => '',
'Class:lnkContractToCI/Attribute:contract_name' => '契約',
'Class:lnkContractToCI/Attribute:contract_name+' => '',
'Class:lnkContractToCI/Attribute:ci_id' => 'CI',
'Class:lnkContractToCI/Attribute:ci_id+' => '',
'Class:lnkContractToCI/Attribute:ci_name' => 'CI',
'Class:lnkContractToCI/Attribute:ci_name+' => '',
'Class:lnkContractToCI/Attribute:ci_status' => 'CIの状態',
'Class:lnkContractToCI/Attribute:ci_status+' => '',
));
//
@@ -257,40 +258,40 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:Service' => 'サービス', // 'Service', # 'Service'
'Class:Service+' => '', # ''
'Class:Service/Attribute:org_id' => 'プロバイダ', // 'Provider', # 'Provider'
'Class:Service/Attribute:org_id+' => '', # ''
'Class:Service/Attribute:provider_name' => 'プロバイダ', // 'Provider', # 'Provider'
'Class:Service/Attribute:provider_name+' => '', # ''
'Class:Service/Attribute:name' => '名前', // 'Name', # 'Name'
'Class:Service/Attribute:name+' => '', # ''
'Class:Service/Attribute:description' => '詳細記述', // 'Description', # 'Description'
'Class:Service/Attribute:description+' => '', # ''
'Class:Service/Attribute:type' => 'タイプ', // 'Type', # 'Type'
'Class:Service/Attribute:type+' => '', # ''
'Class:Service/Attribute:type/Value:IncidentManagement' => 'インシデント管理', # 'Incident Management'
'Class:Service/Attribute:type/Value:IncidentManagement+' => 'インシデント管理', # 'Incident Management'
'Class:Service/Attribute:type/Value:RequestManagement' => 'リクエスト管理', # 'Request Management'
'Class:Service/Attribute:type/Value:RequestManagement+' => 'リクエスト管理', # 'Request Management'
'Class:Service/Attribute:status' => 'Status', # 'Status'
'Class:Service/Attribute:status+' => '', # ''
'Class:Service/Attribute:status/Value:design' => '設計', // 'Design', # 'Design'
'Class:Service/Attribute:status/Value:design+' => '', # ''
'Class:Service/Attribute:status/Value:obsolete' => 'すでに利用されていない', // 'Obsolete', # 'Obsolete'
'Class:Service/Attribute:status/Value:obsolete+' => '', # ''
'Class:Service/Attribute:status/Value:production' => 'プロダクション', // 'Production', # 'Production'
'Class:Service/Attribute:status/Value:production+' => '', # ''
'Class:Service/Attribute:subcategory_list' => 'サービスサブカテゴリ', // 'Service subcategories', # 'Service subcategories'
'Class:Service/Attribute:subcategory_list+' => '', # ''
'Class:Service/Attribute:sla_list' => 'SLA', // 'SLAs', # 'SLAs'
'Class:Service/Attribute:sla_list+' => '', # ''
'Class:Service/Attribute:document_list' => 'ドキュメント', // 'Documents', # 'Documents'
'Class:Service/Attribute:document_list+' => 'サービスに添付されているドキュメント', // 'Documents attached to the service', # 'Documents attached to the service'
'Class:Service/Attribute:contact_list' => 'コンタクト', // 'Contacts', # 'Contacts'
'Class:Service/Attribute:contact_list+' => 'サービスに対する役割を保持するコンタクト', // 'Contacts having a role for this service', # 'Contacts having a role for this service'
'Class:Service/Tab:Related_Contracts' => '関連する契約', // 'Related Contracts', # 'Related Contracts'
'Class:Service/Tab:Related_Contracts+' => 'サービスに締結された契約', // 'Contracts signed for this service', # 'Contracts signed for this service'
'Class:Service' => 'サービス',
'Class:Service+' => '',
'Class:Service/Attribute:org_id' => 'プロバイダ',
'Class:Service/Attribute:org_id+' => '',
'Class:Service/Attribute:provider_name' => 'プロバイダ',
'Class:Service/Attribute:provider_name+' => '',
'Class:Service/Attribute:name' => '名前',
'Class:Service/Attribute:name+' => '',
'Class:Service/Attribute:description' => '説明',
'Class:Service/Attribute:description+' => '',
'Class:Service/Attribute:type' => 'タイプ',
'Class:Service/Attribute:type+' => '',
'Class:Service/Attribute:type/Value:IncidentManagement' => 'インシデント管理',
'Class:Service/Attribute:type/Value:IncidentManagement+' => 'インシデント管理',
'Class:Service/Attribute:type/Value:RequestManagement' => '要求管理',
'Class:Service/Attribute:type/Value:RequestManagement+' => '要求管理',
'Class:Service/Attribute:status' => '状態',
'Class:Service/Attribute:status+' => '',
'Class:Service/Attribute:status/Value:design' => '設計',
'Class:Service/Attribute:status/Value:design+' => '',
'Class:Service/Attribute:status/Value:obsolete' => '廃止済',
'Class:Service/Attribute:status/Value:obsolete+' => '',
'Class:Service/Attribute:status/Value:production' => '稼働中',
'Class:Service/Attribute:status/Value:production+' => '',
'Class:Service/Attribute:subcategory_list' => 'サービスサブカテゴリ',
'Class:Service/Attribute:subcategory_list+' => '',
'Class:Service/Attribute:sla_list' => 'SLA',
'Class:Service/Attribute:sla_list+' => '',
'Class:Service/Attribute:document_list' => '文書',
'Class:Service/Attribute:document_list+' => 'サービスに添付されている文書',
'Class:Service/Attribute:contact_list' => '連絡先',
'Class:Service/Attribute:contact_list+' => 'このサービスの役割を持つ連絡先',
'Class:Service/Tab:Related_Contracts' => '関連する契約',
'Class:Service/Tab:Related_Contracts+' => 'このサービスのために締結された契約',
));
//
@@ -298,16 +299,16 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:ServiceSubcategory' => 'サービスサブカテゴリ', // 'Service Subcategory', # 'Service Subcategory'
'Class:ServiceSubcategory+' => '', # ''
'Class:ServiceSubcategory/Attribute:name' => '名前', // 'Name', # 'Name'
'Class:ServiceSubcategory/Attribute:name+' => '', # ''
'Class:ServiceSubcategory/Attribute:description' => '詳細記述', // 'Description', # 'Description'
'Class:ServiceSubcategory/Attribute:description+' => '', # ''
'Class:ServiceSubcategory/Attribute:service_id' => 'サービス', // 'Service', # 'Service'
'Class:ServiceSubcategory/Attribute:service_id+' => '', # ''
'Class:ServiceSubcategory/Attribute:service_name' => 'サービス', // 'Service', # 'Service'
'Class:ServiceSubcategory/Attribute:service_name+' => '', # ''
'Class:ServiceSubcategory' => 'サービスサブカテゴリ',
'Class:ServiceSubcategory+' => '',
'Class:ServiceSubcategory/Attribute:name' => '名前',
'Class:ServiceSubcategory/Attribute:name+' => '',
'Class:ServiceSubcategory/Attribute:description' => '説明',
'Class:ServiceSubcategory/Attribute:description+' => '',
'Class:ServiceSubcategory/Attribute:service_id' => 'サービス',
'Class:ServiceSubcategory/Attribute:service_id+' => '',
'Class:ServiceSubcategory/Attribute:service_name' => 'サービス',
'Class:ServiceSubcategory/Attribute:service_name+' => '',
));
//
@@ -315,16 +316,16 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:SLA' => 'SLA', # 'SLA'
'Class:SLA+' => '', # ''
'Class:SLA/Attribute:name' => '名前', // 'Name', # 'Name'
'Class:SLA/Attribute:name+' => '', # ''
'Class:SLA/Attribute:service_id' => 'サービス', // 'Service', # 'Service'
'Class:SLA/Attribute:service_id+' => '', # ''
'Class:SLA/Attribute:service_name' => 'サービス', // 'Service', # 'Service'
'Class:SLA/Attribute:service_name+' => '', # ''
'Class:SLA/Attribute:slt_list' => 'SLT', // 'SLTs', # 'SLTs'
'Class:SLA/Attribute:slt_list+' => 'サービスレベル閾値リスト', // 'List Service Level Thresholds', # 'List Service Level Thresholds'
'Class:SLA' => 'SLA',
'Class:SLA+' => '',
'Class:SLA/Attribute:name' => '名前',
'Class:SLA/Attribute:name+' => '',
'Class:SLA/Attribute:service_id' => 'サービス',
'Class:SLA/Attribute:service_id+' => '',
'Class:SLA/Attribute:service_name' => 'サービス',
'Class:SLA/Attribute:service_name+' => '',
'Class:SLA/Attribute:slt_list' => 'SLT',
'Class:SLA/Attribute:slt_list+' => 'サービスレベル閾値リスト',
));
//
@@ -332,36 +333,36 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:SLT' => 'SLT', # 'SLT'
'Class:SLT+' => '', # ''
'Class:SLT/Attribute:name' => '名前', // 'Name', # 'Name'
'Class:SLT/Attribute:name+' => '', # ''
'Class:SLT/Attribute:metric' => 'メトリック', // 'Metric', # 'Metric'
'Class:SLT/Attribute:metric+' => '', # ''
'Class:SLT/Attribute:metric/Value:TTO' => 'TTO', # 'TTO'
'Class:SLT/Attribute:metric/Value:TTO+' => 'TTO', # 'TTO'
'Class:SLT/Attribute:metric/Value:TTR' => 'TTR', # 'TTR'
'Class:SLT/Attribute:metric/Value:TTR+' => 'TTR', # 'TTR'
'Class:SLT/Attribute:ticket_priority' => 'チケットプライオリティ', // 'Ticket priority', # 'Ticket priority'
'Class:SLT/Attribute:ticket_priority+' => '', # ''
'Class:SLT/Attribute:ticket_priority/Value:1' => '1', # '1'
'Class:SLT/Attribute:ticket_priority/Value:1+' => '1', # '1'
'Class:SLT/Attribute:ticket_priority/Value:2' => '2', # '2'
'Class:SLT/Attribute:ticket_priority/Value:2+' => '2', # '2'
'Class:SLT/Attribute:ticket_priority/Value:3' => '3', # '3'
'Class:SLT/Attribute:ticket_priority/Value:3+' => '3', # '3'
'Class:SLT/Attribute:value' => '値', // 'Value', # 'Value'
'Class:SLT/Attribute:value+' => '', # ''
'Class:SLT/Attribute:value_unit' => '単位', // 'Unit', # 'Unit'
'Class:SLT/Attribute:value_unit+' => '', # ''
'Class:SLT/Attribute:value_unit/Value:days' => '日', // 'days', # 'days'
'Class:SLT/Attribute:value_unit/Value:days+' => '日', // 'days', # 'days'
'Class:SLT/Attribute:value_unit/Value:hours' => '時', // 'hours', # 'hours'
'Class:SLT/Attribute:value_unit/Value:hours+' => '時', // 'hours', # 'hours'
'Class:SLT/Attribute:value_unit/Value:minutes' => '分', // 'minutes', # 'minutes'
'Class:SLT/Attribute:value_unit/Value:minutes+' => '分', // 'minutes', # 'minutes'
'Class:SLT/Attribute:sla_list' => 'SLA', // 'SLAs', # 'SLAs'
'Class:SLT/Attribute:sla_list+' => 'SLTを使うSLA', // 'SLAs using the SLT', # 'SLAs using the SLT'
'Class:SLT' => 'SLT',
'Class:SLT+' => 'SLT サービスレベルターゲット',
'Class:SLT/Attribute:name' => '名前',
'Class:SLT/Attribute:name+' => '',
'Class:SLT/Attribute:metric' => 'メトリック',
'Class:SLT/Attribute:metric+' => '',
'Class:SLT/Attribute:metric/Value:TTO' => 'TTO',
'Class:SLT/Attribute:metric/Value:TTO+' => 'TTO Time To Own, 対応開始までの時間', # 'TTO'
'Class:SLT/Attribute:metric/Value:TTR' => 'TTR',
'Class:SLT/Attribute:metric/Value:TTR+' => 'TTR Time To Resolve, 解決までの時間', # 'TTR'
'Class:SLT/Attribute:ticket_priority' => 'チケット優先度',
'Class:SLT/Attribute:ticket_priority+' => '',
'Class:SLT/Attribute:ticket_priority/Value:1' => '1',
'Class:SLT/Attribute:ticket_priority/Value:1+' => '1',
'Class:SLT/Attribute:ticket_priority/Value:2' => '2',
'Class:SLT/Attribute:ticket_priority/Value:2+' => '2',
'Class:SLT/Attribute:ticket_priority/Value:3' => '3',
'Class:SLT/Attribute:ticket_priority/Value:3+' => '3',
'Class:SLT/Attribute:value' => '値',
'Class:SLT/Attribute:value+' => '',
'Class:SLT/Attribute:value_unit' => '単位',
'Class:SLT/Attribute:value_unit+' => '',
'Class:SLT/Attribute:value_unit/Value:days' => '日',
'Class:SLT/Attribute:value_unit/Value:days+' => '日',
'Class:SLT/Attribute:value_unit/Value:hours' => '時',
'Class:SLT/Attribute:value_unit/Value:hours+' => '時',
'Class:SLT/Attribute:value_unit/Value:minutes' => '分',
'Class:SLT/Attribute:value_unit/Value:minutes+' => '分',
'Class:SLT/Attribute:sla_list' => 'SLA',
'Class:SLT/Attribute:sla_list+' => 'このSLTを使うSLA',
));
//
@@ -369,24 +370,24 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:lnkSLTToSLA' => 'SLT/SLA', # 'SLT/SLA'
'Class:lnkSLTToSLA+' => '', # ''
'Class:lnkSLTToSLA/Attribute:sla_id' => 'SLA', # 'SLA'
'Class:lnkSLTToSLA/Attribute:sla_id+' => '', # ''
'Class:lnkSLTToSLA/Attribute:sla_name' => 'SLA', # 'SLA'
'Class:lnkSLTToSLA/Attribute:sla_name+' => '', # ''
'Class:lnkSLTToSLA/Attribute:slt_id' => 'SLT', # 'SLT'
'Class:lnkSLTToSLA/Attribute:slt_id+' => '', # ''
'Class:lnkSLTToSLA/Attribute:slt_name' => 'SLT', # 'SLT'
'Class:lnkSLTToSLA/Attribute:slt_name+' => '', # ''
'Class:lnkSLTToSLA/Attribute:slt_metric' => 'メトリック', // 'Metric', # 'Metric'
'Class:lnkSLTToSLA/Attribute:slt_metric+' => '', # ''
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority' => 'チケットプライオリティ', // 'Ticket priority', # 'Ticket priority'
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority+' => '', # ''
'Class:lnkSLTToSLA/Attribute:slt_value' => '値', // 'Value', # 'Value'
'Class:lnkSLTToSLA/Attribute:slt_value+' => '', # ''
'Class:lnkSLTToSLA/Attribute:slt_value_unit' => '単位', // 'Unit', # 'Unit'
'Class:lnkSLTToSLA/Attribute:slt_value_unit+' => '', # ''
'Class:lnkSLTToSLA' => 'SLT/SLA',
'Class:lnkSLTToSLA+' => '',
'Class:lnkSLTToSLA/Attribute:sla_id' => 'SLA',
'Class:lnkSLTToSLA/Attribute:sla_id+' => '',
'Class:lnkSLTToSLA/Attribute:sla_name' => 'SLA',
'Class:lnkSLTToSLA/Attribute:sla_name+' => '',
'Class:lnkSLTToSLA/Attribute:slt_id' => 'SLT',
'Class:lnkSLTToSLA/Attribute:slt_id+' => '',
'Class:lnkSLTToSLA/Attribute:slt_name' => 'SLT',
'Class:lnkSLTToSLA/Attribute:slt_name+' => '',
'Class:lnkSLTToSLA/Attribute:slt_metric' => 'メトリック',
'Class:lnkSLTToSLA/Attribute:slt_metric+' => '',
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority' => 'チケット優先度',
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority+' => '',
'Class:lnkSLTToSLA/Attribute:slt_value' => '値',
'Class:lnkSLTToSLA/Attribute:slt_value+' => '',
'Class:lnkSLTToSLA/Attribute:slt_value_unit' => '単位',
'Class:lnkSLTToSLA/Attribute:slt_value_unit+' => '',
));
//
@@ -394,20 +395,20 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:lnkServiceToDoc' => 'サービス/ドキュメント', // 'Service/Doc', # 'Service/Doc'
'Class:lnkServiceToDoc+' => '', # ''
'Class:lnkServiceToDoc/Attribute:service_id' => 'サービス', // 'Service', # 'Service'
'Class:lnkServiceToDoc/Attribute:service_id+' => '', # ''
'Class:lnkServiceToDoc/Attribute:service_name' => 'サービス', // 'Service', # 'Service'
'Class:lnkServiceToDoc/Attribute:service_name+' => '', # ''
'Class:lnkServiceToDoc/Attribute:document_id' => 'ドキュメント', // 'Document', # 'Document'
'Class:lnkServiceToDoc/Attribute:document_id+' => '', # ''
'Class:lnkServiceToDoc/Attribute:document_name' => 'ドキュメント', // 'Document', # 'Document'
'Class:lnkServiceToDoc/Attribute:document_name+' => '', # ''
'Class:lnkServiceToDoc/Attribute:document_type' => 'ドキュメントタイプ', // 'Document type', # 'Document type'
'Class:lnkServiceToDoc/Attribute:document_type+' => '', # ''
'Class:lnkServiceToDoc/Attribute:document_status' => 'ドキュメントステータス', // 'Document status', # 'Document status'
'Class:lnkServiceToDoc/Attribute:document_status+' => '', # ''
'Class:lnkServiceToDoc' => 'サービス/文書',
'Class:lnkServiceToDoc+' => '',
'Class:lnkServiceToDoc/Attribute:service_id' => 'サービス',
'Class:lnkServiceToDoc/Attribute:service_id+' => '',
'Class:lnkServiceToDoc/Attribute:service_name' => 'サービス',
'Class:lnkServiceToDoc/Attribute:service_name+' => '',
'Class:lnkServiceToDoc/Attribute:document_id' => '文書',
'Class:lnkServiceToDoc/Attribute:document_id+' => '',
'Class:lnkServiceToDoc/Attribute:document_name' => '文書',
'Class:lnkServiceToDoc/Attribute:document_name+' => '',
'Class:lnkServiceToDoc/Attribute:document_type' => '文書のタイプ',
'Class:lnkServiceToDoc/Attribute:document_type+' => '',
'Class:lnkServiceToDoc/Attribute:document_status' => '文書の状態',
'Class:lnkServiceToDoc/Attribute:document_status+' => '',
));
//
@@ -415,20 +416,20 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:lnkServiceToContact' => 'サービス/コンタクト', // 'Service/Contact', # 'Service/Contact'
'Class:lnkServiceToContact+' => '', # ''
'Class:lnkServiceToContact/Attribute:service_id' => 'サービス', // 'Service', # 'Service'
'Class:lnkServiceToContact/Attribute:service_id+' => '', # ''
'Class:lnkServiceToContact/Attribute:service_name' => 'サービス', // 'Service', # 'Service'
'Class:lnkServiceToContact/Attribute:service_name+' => '', # ''
'Class:lnkServiceToContact/Attribute:contact_id' => 'コンタクト', // 'Contact', # 'Contact'
'Class:lnkServiceToContact/Attribute:contact_id+' => '', # ''
'Class:lnkServiceToContact/Attribute:contact_name' => 'コンタクト', // 'Contact', # 'Contact'
'Class:lnkServiceToContact/Attribute:contact_name+' => '', # ''
'Class:lnkServiceToContact/Attribute:contact_email' => 'コンタクトEメール', // 'Contact email', # 'Contact email'
'Class:lnkServiceToContact/Attribute:contact_email+' => '', # ''
'Class:lnkServiceToContact/Attribute:role' => '役割', // 'Role', # 'Role'
'Class:lnkServiceToContact/Attribute:role+' => '', # ''
'Class:lnkServiceToContact' => 'サービス/連絡先',
'Class:lnkServiceToContact+' => '',
'Class:lnkServiceToContact/Attribute:service_id' => 'サービス',
'Class:lnkServiceToContact/Attribute:service_id+' => '',
'Class:lnkServiceToContact/Attribute:service_name' => 'サービス',
'Class:lnkServiceToContact/Attribute:service_name+' => '',
'Class:lnkServiceToContact/Attribute:contact_id' => '連絡先',
'Class:lnkServiceToContact/Attribute:contact_id+' => '',
'Class:lnkServiceToContact/Attribute:contact_name' => '連絡先',
'Class:lnkServiceToContact/Attribute:contact_name+' => '',
'Class:lnkServiceToContact/Attribute:contact_email' => '連絡先Eメール',
'Class:lnkServiceToContact/Attribute:contact_email+' => '',
'Class:lnkServiceToContact/Attribute:role' => '役割',
'Class:lnkServiceToContact/Attribute:role+' => '',
));
//
@@ -436,18 +437,19 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:lnkServiceToCI' => 'サービス/CI', // 'Service/CI', # 'Service/CI'
'Class:lnkServiceToCI+' => '', # ''
'Class:lnkServiceToCI/Attribute:service_id' => 'サービス', // 'Service', # 'Service'
'Class:lnkServiceToCI/Attribute:service_id+' => '', # ''
'Class:lnkServiceToCI/Attribute:service_name' => 'サービス', // 'Service', # 'Service'
'Class:lnkServiceToCI/Attribute:service_name+' => '', # ''
'Class:lnkServiceToCI/Attribute:ci_id' => 'CI', # 'CI'
'Class:lnkServiceToCI/Attribute:ci_id+' => '', # ''
'Class:lnkServiceToCI/Attribute:ci_name' => 'CI', # 'CI'
'Class:lnkServiceToCI/Attribute:ci_name+' => '', # ''
'Class:lnkServiceToCI/Attribute:ci_status' => 'CIステータス', // 'CI status', # 'CI status'
'Class:lnkServiceToCI/Attribute:ci_status+' => '', # ''
'Class:lnkServiceToCI' => 'サービス/CI',
'Class:lnkServiceToCI+' => '',
'Class:lnkServiceToCI/Attribute:service_id' => 'サービス',
'Class:lnkServiceToCI/Attribute:service_id+' => '',
'Class:lnkServiceToCI/Attribute:service_name' => 'サービス',
'Class:lnkServiceToCI/Attribute:service_name+' => '',
'Class:lnkServiceToCI/Attribute:ci_id' => 'CI',
'Class:lnkServiceToCI/Attribute:ci_id+' => '',
'Class:lnkServiceToCI/Attribute:ci_name' => 'CI',
'Class:lnkServiceToCI/Attribute:ci_name+' => '',
'Class:lnkServiceToCI/Attribute:ci_status' => 'CIの状態',
'Class:lnkServiceToCI/Attribute:ci_status+' => '',
));
?>

View File

@@ -1,274 +1,220 @@
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* Localized data
*
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: Ticket
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Ticket' => 'Ticket',
'Class:Ticket+' => '',
'Class:Ticket/Attribute:ref' => 'Referenz',
'Class:Ticket/Attribute:ref+' => '',
'Class:Ticket/Attribute:title' => 'Titel',
'Class:Ticket/Attribute:title+' => '',
'Class:Ticket/Attribute:description' => 'Beschreibung',
'Class:Ticket/Attribute:description+' => '',
'Class:Ticket/Attribute:ticket_log' => 'Protokoll',
'Class:Ticket/Attribute:ticket_log+' => '',
'Class:Ticket/Attribute:start_date' => 'Gestartet',
'Class:Ticket/Attribute:start_date+' => '',
'Class:Ticket/Attribute:document_list' => 'Dokumente',
'Class:Ticket/Attribute:document_list+' => 'Dokumente zu diesem Ticket',
'Class:Ticket/Attribute:ci_list' => 'CIs',
'Class:Ticket/Attribute:ci_list+' => 'CIs, die diesen Incident betreffen',
'Class:Ticket/Attribute:contact_list' => 'Kontakte',
'Class:Ticket/Attribute:contact_list+' => 'Beteiligtes Team und beteiligte Personen',
'Class:Ticket/Attribute:incident_list' => 'Dazugehörige Incidents',
'Class:Ticket/Attribute:incident_list+' => '',
'Class:Ticket/Attribute:finalclass' => 'Typ',
'Class:Ticket/Attribute:finalclass+' => '',
));
// Fieldset translation
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Ticket:baseinfo' => 'Allgemeine Informationen',
'Ticket:date' => 'Daten',
'Ticket:contact' => 'Kontakte',
'Ticket:moreinfo' => 'weitergehende Informationen',
'Ticket:relation' => 'Beziehungen',
'Ticket:log' => 'Kommunikation',
));
//
// Class: lnkTicketToDoc
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkTicketToDoc' => 'Ticket/Document',
'Class:lnkTicketToDoc+' => '',
'Class:lnkTicketToDoc/Attribute:ticket_id' => 'Ticket',
'Class:lnkTicketToDoc/Attribute:ticket_id+' => '',
'Class:lnkTicketToDoc/Attribute:ticket_ref' => 'Ticket #',
'Class:lnkTicketToDoc/Attribute:ticket_ref+' => '',
'Class:lnkTicketToDoc/Attribute:document_id' => 'Dokument',
'Class:lnkTicketToDoc/Attribute:document_id+' => '',
'Class:lnkTicketToDoc/Attribute:document_name' => 'Dokument',
'Class:lnkTicketToDoc/Attribute:document_name+' => '',
));
//
// Class: lnkTicketToContact
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkTicketToContact' => 'Ticket/Kontakt',
'Class:lnkTicketToContact+' => '',
'Class:lnkTicketToContact/Attribute:ticket_id' => 'Ticket',
'Class:lnkTicketToContact/Attribute:ticket_id+' => '',
'Class:lnkTicketToContact/Attribute:ticket_ref' => 'Ticket #',
'Class:lnkTicketToContact/Attribute:ticket_ref+' => '',
'Class:lnkTicketToContact/Attribute:contact_id' => 'Kontakt',
'Class:lnkTicketToContact/Attribute:contact_id+' => '',
'Class:lnkTicketToContact/Attribute:contact_name' => 'Kontakt',
'Class:lnkTicketToContact/Attribute:contact_name+' => '',
'Class:lnkTicketToContact/Attribute:contact_email' => 'Email',
'Class:lnkTicketToContact/Attribute:contact_email+' => '',
'Class:lnkTicketToContact/Attribute:role' => 'Rolle',
'Class:lnkTicketToContact/Attribute:role+' => '',
));
//
// Class: lnkTicketToCI
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkTicketToCI' => 'Ticket/CI',
'Class:lnkTicketToCI+' => '',
'Class:lnkTicketToCI/Attribute:ticket_id' => 'Ticket',
'Class:lnkTicketToCI/Attribute:ticket_id+' => '',
'Class:lnkTicketToCI/Attribute:ticket_ref' => 'Ticket #',
'Class:lnkTicketToCI/Attribute:ticket_ref+' => '',
'Class:lnkTicketToCI/Attribute:ci_id' => 'CI',
'Class:lnkTicketToCI/Attribute:ci_id+' => '',
'Class:lnkTicketToCI/Attribute:ci_name' => 'CI',
'Class:lnkTicketToCI/Attribute:ci_name+' => '',
'Class:lnkTicketToCI/Attribute:ci_status' => 'CI-Status',
'Class:lnkTicketToCI/Attribute:ci_status+' => '',
'Class:lnkTicketToCI/Attribute:impact' => 'Auswirkung',
'Class:lnkTicketToCI/Attribute:impact+' => '',
));
//
// Class: ResponseTicket
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ResponseTicket' => 'Antwortticket',
'Class:ResponseTicket+' => '',
'Class:ResponseTicket/Attribute:status' => 'Status',
'Class:ResponseTicket/Attribute:status+' => '',
'Class:ResponseTicket/Attribute:status/Value:new' => 'Neu',
'Class:ResponseTicket/Attribute:status/Value:new+' => 'Neu eröffnet',
'Class:ResponseTicket/Attribute:status/Value:frozen' => 'Unerledigt',
'Class:ResponseTicket/Attribute:status/Value:frozen+' => '',
'Class:ResponseTicket/Attribute:status/Value:escalated_tto' => 'Eskalation/TTO',
'Class:ResponseTicket/Attribute:status/Value:escalated_tto+' => '',
'Class:ResponseTicket/Attribute:status/Value:assigned' => 'Zugeteilt',
'Class:ResponseTicket/Attribute:status/Value:assigned+' => '',
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr' => 'Eskalation/TTR',
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr+' => '',
'Class:ResponseTicket/Attribute:status/Value:frozen' => 'Anstehend',
'Class:ResponseTicket/Attribute:status/Value:frozen+' => '',
'Class:ResponseTicket/Attribute:status/Value:resolved' => 'Gelöst',
'Class:ResponseTicket/Attribute:status/Value:resolved+' => '',
'Class:ResponseTicket/Attribute:status/Value:closed' => 'Geschlossen',
'Class:ResponseTicket/Attribute:status/Value:closed+' => '',
'Class:ResponseTicket/Attribute:caller_id' => 'Melder',
'Class:ResponseTicket/Attribute:caller_id+' => '',
'Class:ResponseTicket/Attribute:caller_email' => 'Email',
'Class:ResponseTicket/Attribute:caller_email+' => '',
'Class:ResponseTicket/Attribute:org_id' => 'Kunde',
'Class:ResponseTicket/Attribute:org_id+' => '',
'Class:ResponseTicket/Attribute:org_name' => 'Kunde',
'Class:ResponseTicket/Attribute:org_name+' => '',
'Class:ResponseTicket/Attribute:service_id' => 'Service',
'Class:ResponseTicket/Attribute:service_id+' => '',
'Class:ResponseTicket/Attribute:service_name' => 'Name',
'Class:ResponseTicket/Attribute:service_name+' => '',
'Class:ResponseTicket/Attribute:servicesubcategory_id' => 'Service-Element',
'Class:ResponseTicket/Attribute:servicesubcategory_id+' => '',
'Class:ResponseTicket/Attribute:servicesubcategory_name' => 'Name',
'Class:ResponseTicket/Attribute:servicesubcategory_name+' => '',
'Class:ResponseTicket/Attribute:product' => 'Produkt',
'Class:ResponseTicket/Attribute:product+' => '',
'Class:ResponseTicket/Attribute:impact' => 'Auswirkung',
'Class:ResponseTicket/Attribute:impact+' => '',
'Class:ResponseTicket/Attribute:impact/Value:1' => 'Eine Person',
'Class:ResponseTicket/Attribute:impact/Value:1+' => '',
'Class:ResponseTicket/Attribute:impact/Value:2' => 'Ein Service',
'Class:ResponseTicket/Attribute:impact/Value:2+' => '',
'Class:ResponseTicket/Attribute:impact/Value:3' => 'Eine Abteilung',
'Class:ResponseTicket/Attribute:impact/Value:3+' => '',
'Class:ResponseTicket/Attribute:urgency' => 'Dringlichkeit',
'Class:ResponseTicket/Attribute:urgency+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:1' => 'Niedrig',
'Class:ResponseTicket/Attribute:urgency/Value:1+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:2' => 'Medium',
'Class:ResponseTicket/Attribute:urgency/Value:2+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:3' => 'Hoch',
'Class:ResponseTicket/Attribute:urgency/Value:3+' => '',
'Class:ResponseTicket/Attribute:priority' => 'Priorität',
'Class:ResponseTicket/Attribute:priority+' => '',
'Class:ResponseTicket/Attribute:priority/Value:1' => 'Niedrig',
'Class:ResponseTicket/Attribute:priority/Value:1+' => '',
'Class:ResponseTicket/Attribute:priority/Value:2' => 'Medium',
'Class:ResponseTicket/Attribute:priority/Value:2+' => '',
'Class:ResponseTicket/Attribute:priority/Value:3' => 'Hoch',
'Class:ResponseTicket/Attribute:priority/Value:3+' => '',
'Class:ResponseTicket/Attribute:workgroup_id' => 'Arbeitsgruppe',
'Class:ResponseTicket/Attribute:workgroup_id+' => '',
'Class:ResponseTicket/Attribute:workgroup_name' => 'Arbeitsgruppe',
'Class:ResponseTicket/Attribute:workgroup_name+' => '',
'Class:ResponseTicket/Attribute:agent_id' => 'Bearbeiter',
'Class:ResponseTicket/Attribute:agent_id+' => '',
'Class:ResponseTicket/Attribute:agent_name' => 'Bearbeiter',
'Class:ResponseTicket/Attribute:agent_name+' => '',
'Class:ResponseTicket/Attribute:agent_email' => 'Bearbeiter schreiben (Email)',
'Class:ResponseTicket/Attribute:agent_email+' => '',
'Class:ResponseTicket/Attribute:related_problem_id' => 'Dazugehöriges Problem',
'Class:ResponseTicket/Attribute:related_problem_id+' => '',
'Class:ResponseTicket/Attribute:related_problem_ref' => 'Referenz',
'Class:ResponseTicket/Attribute:related_problem_ref+' => '',
'Class:ResponseTicket/Attribute:related_change_id' => 'Verbundene Änderungen',
'Class:ResponseTicket/Attribute:related_change_id+' => '',
'Class:ResponseTicket/Attribute:related_change_ref' => 'Verbundene Änderungen',
'Class:ResponseTicket/Attribute:related_change_ref+' => '',
'Class:ResponseTicket/Attribute:close_date' => 'Geschlossen',
'Class:ResponseTicket/Attribute:close_date+' => '',
'Class:ResponseTicket/Attribute:last_update' => 'Letzte Aktualisierung',
'Class:ResponseTicket/Attribute:last_update+' => '',
'Class:ResponseTicket/Attribute:assignment_date' => 'Zugeteilt',
'Class:ResponseTicket/Attribute:assignment_date+' => '',
'Class:ResponseTicket/Attribute:resolution_date' => 'Lösungsdatum',
'Class:ResponseTicket/Attribute:resolution_date+' => '',
'Class:ResponseTicket/Attribute:tto_escalation_deadline' => 'TTO Eskaltionsfrist',
'Class:ResponseTicket/Attribute:tto_escalation_deadline+' => '',
'Class:ResponseTicket/Attribute:ttr_escalation_deadline' => 'TTR Eskaltionsfrist',
'Class:ResponseTicket/Attribute:ttr_escalation_deadline+' => '',
'Class:ResponseTicket/Attribute:closure_deadline' => 'Abschlussfrist',
'Class:ResponseTicket/Attribute:closure_deadline+' => '',
'Class:ResponseTicket/Attribute:resolution_code' => 'Code für Lösung',
'Class:ResponseTicket/Attribute:resolution_code+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce' => 'Konnte nicht reproduziert werden',
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate' => 'Duplikat eines bestehenden Tickets',
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed' => 'Repariert',
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant' => 'Irrelevant',
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant+' => '',
'Class:ResponseTicket/Attribute:solution' => 'Lösung',
'Class:ResponseTicket/Attribute:solution+' => '',
'Class:ResponseTicket/Attribute:user_satisfaction' => 'Benutzerzufriedenheit',
'Class:ResponseTicket/Attribute:user_satisfaction+' => '',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1' => '1',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1+' => '1',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2' => '2',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2+' => '2',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3' => '3',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3+' => '3',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4' => '4',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4+' => '4',
'Class:ResponseTicket/Attribute:user_commment' => 'Benutzerkommentar',
'Class:ResponseTicket/Attribute:user_commment+' => '',
'Class:ResponseTicket/Stimulus:ev_assign' => 'Zuweisen',
'Class:ResponseTicket/Stimulus:ev_assign+' => '',
'Class:ResponseTicket/Stimulus:ev_reassign' => 'Neu zuweisen',
'Class:ResponseTicket/Stimulus:ev_reassign+' => '',
'Class:ResponseTicket/Stimulus:ev_timeout' => 'ev-Timeout',
'Class:ResponseTicket/Stimulus:ev_timeout+' => '',
'Class:ResponseTicket/Stimulus:ev_resolve' => 'Als gelöst markieren',
'Class:ResponseTicket/Stimulus:ev_resolve+' => '',
'Class:ResponseTicket/Stimulus:ev_close' => 'Schließen',
'Class:ResponseTicket/Stimulus:ev_close+' => '',
));
?>
<?php
// Copyright (C) 2010 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/**
* @author Erwan Taloc <erwan.taloc@combodo.com>
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @author Denis Flaven <denis.flaven@combodo.com>
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkTicketToDoc' => 'Ticket/Document',
'Class:lnkTicketToDoc+' => '',
'Class:lnkTicketToDoc/Attribute:ticket_id' => 'Ticket',
'Class:lnkTicketToDoc/Attribute:ticket_id+' => '',
'Class:lnkTicketToDoc/Attribute:document_id' => 'Dokument',
'Class:lnkTicketToDoc/Attribute:document_id+' => '',
'Class:lnkTicketToContact' => 'Ticket/Kontakt',
'Class:lnkTicketToContact+' => '',
'Class:lnkTicketToContact/Attribute:ticket_id' => 'Ticket',
'Class:lnkTicketToContact/Attribute:ticket_id+' => '',
'Class:lnkTicketToContact/Attribute:contact_id' => 'Kontakt',
'Class:lnkTicketToContact/Attribute:contact_id+' => '',
'Class:lnkTicketToContact/Attribute:role' => 'Rolle',
'Class:lnkTicketToContact/Attribute:role+' => '',
'Class:lnkTicketToCI' => 'Ticket/CI',
'Class:lnkTicketToCI+' => '',
'Class:lnkTicketToCI/Attribute:ticket_id' => 'Ticket',
'Class:lnkTicketToCI/Attribute:ticket_id+' => '',
'Class:lnkTicketToCI/Attribute:ci_id' => 'CI',
'Class:lnkTicketToCI/Attribute:ci_id+' => '',
'Class:lnkTicketToCI/Attribute:impact' => 'Auswirkung',
'Class:lnkTicketToCI/Attribute:impact+' => '',
'Class:Ticket' => 'Ticket',
'Class:Ticket+' => '',
'Class:Ticket/Attribute:ref' => 'Referenz',
'Class:Ticket/Attribute:ref+' => '',
'Class:Ticket/Attribute:title' => 'Titel',
'Class:Ticket/Attribute:title+' => '',
'Class:Ticket/Attribute:description' => 'Beschreibung',
'Class:Ticket/Attribute:description+' => '',
'Class:Ticket/Attribute:ticket_log' => 'Protokoll',
'Class:Ticket/Attribute:ticket_log+' => '',
'Class:Ticket/Attribute:start_date' => 'Gestartet',
'Class:Ticket/Attribute:start_date+' => '',
'Class:Ticket/Attribute:document_list' => 'Dokumente',
'Class:Ticket/Attribute:document_list+' => 'Dokumente zu diesem Ticket',
'Class:Ticket/Attribute:ci_list' => 'CIs',
'Class:Ticket/Attribute:ci_list+' => 'CIs, die diesen Incident betreffen',
'Class:Ticket/Attribute:contact_list' => 'Kontakte',
'Class:Ticket/Attribute:contact_list+' => 'Beteiligtes Team und beteiligte Personen',
'Class:Ticket/Attribute:incident_list' => 'Dazugehörige Incidents',
'Class:Ticket/Attribute:incident_list+' => '',
'Class:Ticket/Attribute:finalclass' => 'Typ',
'Class:Ticket/Attribute:finalclass+' => '',
'Ticket:baseinfo' => 'Allgemeine Informationen',
'Ticket:date' => 'Daten',
'Ticket:contact' => 'Kontakte',
'Ticket:moreinfo' => 'weitergehende Informationen',
'Ticket:relation' => 'Beziehungen',
'Ticket:log' => 'Kommunikation',
'Class:lnkTicketToDoc/Attribute:ticket_ref' => 'Ticket #',
'Class:lnkTicketToDoc/Attribute:ticket_ref+' => '',
'Class:lnkTicketToDoc/Attribute:document_name' => 'Dokument',
'Class:lnkTicketToDoc/Attribute:document_name+' => '',
'Class:lnkTicketToContact/Attribute:ticket_ref' => 'Ticket #',
'Class:lnkTicketToContact/Attribute:ticket_ref+' => '',
'Class:lnkTicketToContact/Attribute:contact_name' => 'Kontakt',
'Class:lnkTicketToContact/Attribute:contact_name+' => '',
'Class:lnkTicketToContact/Attribute:contact_email' => 'Email',
'Class:lnkTicketToContact/Attribute:contact_email+' => '',
'Class:lnkTicketToCI/Attribute:ticket_ref' => 'Ticket #',
'Class:lnkTicketToCI/Attribute:ticket_ref+' => '',
'Class:lnkTicketToCI/Attribute:ci_name' => 'CI',
'Class:lnkTicketToCI/Attribute:ci_name+' => '',
'Class:lnkTicketToCI/Attribute:ci_status' => 'CI-Status',
'Class:lnkTicketToCI/Attribute:ci_status+' => '',
'Class:ResponseTicket' => 'Antwortticket',
'Class:ResponseTicket+' => '',
'Class:ResponseTicket/Attribute:status' => 'Status',
'Class:ResponseTicket/Attribute:status+' => '',
'Class:ResponseTicket/Attribute:status/Value:new' => 'Neu',
'Class:ResponseTicket/Attribute:status/Value:new+' => 'Neu eröffnet',
'Class:ResponseTicket/Attribute:status/Value:escalated_tto' => 'Eskalation/TTO',
'Class:ResponseTicket/Attribute:status/Value:escalated_tto+' => '',
'Class:ResponseTicket/Attribute:status/Value:assigned' => 'Zugeteilt',
'Class:ResponseTicket/Attribute:status/Value:assigned+' => '',
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr' => 'Eskalation/TTR',
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr+' => '',
'Class:ResponseTicket/Attribute:status/Value:frozen' => 'Anstehend',
'Class:ResponseTicket/Attribute:status/Value:frozen+' => '',
'Class:ResponseTicket/Attribute:status/Value:resolved' => 'Gelöst',
'Class:ResponseTicket/Attribute:status/Value:resolved+' => '',
'Class:ResponseTicket/Attribute:status/Value:closed' => 'Geschlossen',
'Class:ResponseTicket/Attribute:status/Value:closed+' => '',
'Class:ResponseTicket/Attribute:caller_id' => 'Melder',
'Class:ResponseTicket/Attribute:caller_id+' => '',
'Class:ResponseTicket/Attribute:caller_email' => 'Email',
'Class:ResponseTicket/Attribute:caller_email+' => '',
'Class:ResponseTicket/Attribute:org_id' => 'Kunde',
'Class:ResponseTicket/Attribute:org_id+' => '',
'Class:ResponseTicket/Attribute:org_name' => 'Kunde',
'Class:ResponseTicket/Attribute:org_name+' => '',
'Class:ResponseTicket/Attribute:service_id' => 'Service',
'Class:ResponseTicket/Attribute:service_id+' => '',
'Class:ResponseTicket/Attribute:service_name' => 'Name',
'Class:ResponseTicket/Attribute:service_name+' => '',
'Class:ResponseTicket/Attribute:servicesubcategory_id' => 'Service-Element',
'Class:ResponseTicket/Attribute:servicesubcategory_id+' => '',
'Class:ResponseTicket/Attribute:servicesubcategory_name' => 'Name',
'Class:ResponseTicket/Attribute:servicesubcategory_name+' => '',
'Class:ResponseTicket/Attribute:product' => 'Produkt',
'Class:ResponseTicket/Attribute:product+' => '',
'Class:ResponseTicket/Attribute:impact' => 'Auswirkung',
'Class:ResponseTicket/Attribute:impact+' => '',
'Class:ResponseTicket/Attribute:impact/Value:1' => 'Eine Person',
'Class:ResponseTicket/Attribute:impact/Value:1+' => '',
'Class:ResponseTicket/Attribute:impact/Value:2' => 'Ein Service',
'Class:ResponseTicket/Attribute:impact/Value:2+' => '',
'Class:ResponseTicket/Attribute:impact/Value:3' => 'Eine Abteilung',
'Class:ResponseTicket/Attribute:impact/Value:3+' => '',
'Class:ResponseTicket/Attribute:urgency' => 'Dringlichkeit',
'Class:ResponseTicket/Attribute:urgency+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:1' => 'Niedrig',
'Class:ResponseTicket/Attribute:urgency/Value:1+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:2' => 'Medium',
'Class:ResponseTicket/Attribute:urgency/Value:2+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:3' => 'Hoch',
'Class:ResponseTicket/Attribute:urgency/Value:3+' => '',
'Class:ResponseTicket/Attribute:priority' => 'Priorität',
'Class:ResponseTicket/Attribute:priority+' => '',
'Class:ResponseTicket/Attribute:priority/Value:1' => 'Niedrig',
'Class:ResponseTicket/Attribute:priority/Value:1+' => '',
'Class:ResponseTicket/Attribute:priority/Value:2' => 'Medium',
'Class:ResponseTicket/Attribute:priority/Value:2+' => '',
'Class:ResponseTicket/Attribute:priority/Value:3' => 'Hoch',
'Class:ResponseTicket/Attribute:priority/Value:3+' => '',
'Class:ResponseTicket/Attribute:workgroup_id' => 'Arbeitsgruppe',
'Class:ResponseTicket/Attribute:workgroup_id+' => '',
'Class:ResponseTicket/Attribute:workgroup_name' => 'Arbeitsgruppe',
'Class:ResponseTicket/Attribute:workgroup_name+' => '',
'Class:ResponseTicket/Attribute:agent_id' => 'Bearbeiter',
'Class:ResponseTicket/Attribute:agent_id+' => '',
'Class:ResponseTicket/Attribute:agent_name' => 'Bearbeiter',
'Class:ResponseTicket/Attribute:agent_name+' => '',
'Class:ResponseTicket/Attribute:agent_email' => 'Bearbeiter schreiben (Email)',
'Class:ResponseTicket/Attribute:agent_email+' => '',
'Class:ResponseTicket/Attribute:related_problem_id' => 'Dazugehöriges Problem',
'Class:ResponseTicket/Attribute:related_problem_id+' => '',
'Class:ResponseTicket/Attribute:related_problem_ref' => 'Referenz',
'Class:ResponseTicket/Attribute:related_problem_ref+' => '',
'Class:ResponseTicket/Attribute:related_change_id' => 'Verbundene Changes',
'Class:ResponseTicket/Attribute:related_change_id+' => '',
'Class:ResponseTicket/Attribute:related_change_ref' => 'Verbundene Changes',
'Class:ResponseTicket/Attribute:related_change_ref+' => '',
'Class:ResponseTicket/Attribute:close_date' => 'Geschlossen',
'Class:ResponseTicket/Attribute:close_date+' => '',
'Class:ResponseTicket/Attribute:last_update' => 'Letzte Aktualisierung',
'Class:ResponseTicket/Attribute:last_update+' => '',
'Class:ResponseTicket/Attribute:assignment_date' => 'Zugeteilt',
'Class:ResponseTicket/Attribute:assignment_date+' => '',
'Class:ResponseTicket/Attribute:resolution_date' => 'Lösungsdatum',
'Class:ResponseTicket/Attribute:resolution_date+' => '',
'Class:ResponseTicket/Attribute:tto_escalation_deadline' => 'TTO Eskaltionsfrist',
'Class:ResponseTicket/Attribute:tto_escalation_deadline+' => '',
'Class:ResponseTicket/Attribute:ttr_escalation_deadline' => 'TTR Eskaltionsfrist',
'Class:ResponseTicket/Attribute:ttr_escalation_deadline+' => '',
'Class:ResponseTicket/Attribute:closure_deadline' => 'Abschlussfrist',
'Class:ResponseTicket/Attribute:closure_deadline+' => '',
'Class:ResponseTicket/Attribute:resolution_code' => 'Code für Lösung',
'Class:ResponseTicket/Attribute:resolution_code+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce' => 'Konnte nicht reproduziert werden',
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate' => 'Duplikat eines bestehenden Tickets',
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed' => 'Repariert',
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant' => 'Irrelevant',
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant+' => '',
'Class:ResponseTicket/Attribute:solution' => 'Lösung',
'Class:ResponseTicket/Attribute:solution+' => '',
'Class:ResponseTicket/Attribute:user_satisfaction' => 'Benutzerzufriedenheit',
'Class:ResponseTicket/Attribute:user_satisfaction+' => '',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1' => '1',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1+' => '1',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2' => '2',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2+' => '2',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3' => '3',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3+' => '3',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4' => '4',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4+' => '4',
'Class:ResponseTicket/Attribute:user_commment' => 'Benutzerkommentar',
'Class:ResponseTicket/Attribute:user_commment+' => '',
'Class:ResponseTicket/Stimulus:ev_assign' => 'Zuweisen',
'Class:ResponseTicket/Stimulus:ev_assign+' => '',
'Class:ResponseTicket/Stimulus:ev_reassign' => 'Neu zuweisen',
'Class:ResponseTicket/Stimulus:ev_reassign+' => '',
'Class:ResponseTicket/Stimulus:ev_timeout' => 'ev-Timeout',
'Class:ResponseTicket/Stimulus:ev_timeout+' => '',
'Class:ResponseTicket/Stimulus:ev_resolve' => 'Als gelöst markieren',
'Class:ResponseTicket/Stimulus:ev_resolve+' => '',
'Class:ResponseTicket/Stimulus:ev_close' => 'Schließen',
'Class:ResponseTicket/Stimulus:ev_close+' => '',
));
?>

View File

@@ -43,46 +43,56 @@
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:Ticket' => 'チケット', // 'Ticket', # 'Ticket'
'Class:Ticket+' => '', # ''
'Class:Ticket/Attribute:ref' => '参照', // 'Ref', # 'Ref'
'Class:Ticket/Attribute:ref+' => '', # ''
'Class:Ticket/Attribute:title' => 'タイトル', // 'Title', # 'Title'
'Class:Ticket/Attribute:title+' => '', # ''
'Class:Ticket/Attribute:description' => '詳細記述', // 'Description', # 'Description'
'Class:Ticket/Attribute:description+' => '', # ''
'Class:Ticket/Attribute:ticket_log' => 'ログ', // 'Log', # 'Log'
'Class:Ticket' => 'チケット',
'Class:Ticket+' => '',
'Class:Ticket/Attribute:ref' => '参照',
'Class:Ticket/Attribute:ref+' => '',
'Class:Ticket/Attribute:title' => '題名',
'Class:Ticket/Attribute:title+' => '',
'Class:Ticket/Attribute:description' => '説明',
'Class:Ticket/Attribute:description+' => '',
'Class:Ticket/Attribute:ticket_log' => 'ログ',
'Class:Ticket/Attribute:ticket_log+' => '', # ''
'Class:Ticket/Attribute:start_date' => '開始済み', // 'Started', # 'Started'
'Class:Ticket/Attribute:start_date+' => '', # ''
'Class:Ticket/Attribute:document_list' => 'ドキュメント', // 'Documents', # 'Documents'
'Class:Ticket/Attribute:document_list+' => 'チケットに関連するドキュメント', // 'Documents related to the ticket', # 'Documents related to the ticket'
'Class:Ticket/Attribute:ci_list' => 'CI', // 'CIs', # 'CIs'
'Class:Ticket/Attribute:ci_list+' => 'インシデントに関連するCI', // 'CIs concerned by the incident', # 'CIs concerned by the incident'
'Class:Ticket/Attribute:contact_list' => 'コンタクト', // 'Contacts', # 'Contacts'
'Class:Ticket/Attribute:contact_list+' => '担当チーム、担当者', // 'Team and persons involved', # 'Team and persons involved'
'Class:Ticket/Attribute:incident_list' => '関連インシデント', // 'Related Incidents', # 'Related Incidents'
'Class:Ticket/Attribute:incident_list+' => '', # ''
'Class:Ticket/Attribute:finalclass' => 'タイプ', // 'Type', # 'Type'
'Class:Ticket/Attribute:finalclass+' => '', # ''
'Class:Ticket/Attribute:start_date' => '開始',
'Class:Ticket/Attribute:start_date+' => '',
'Class:Ticket/Attribute:document_list' => '文書',
'Class:Ticket/Attribute:document_list+' => 'このチケットに関連する文書',
'Class:Ticket/Attribute:ci_list' => 'CI',
'Class:Ticket/Attribute:ci_list+' => 'このインシデントに関連するCI',
'Class:Ticket/Attribute:contact_list' => '連絡先',
'Class:Ticket/Attribute:contact_list+' => '担当チーム、担当者',
'Class:Ticket/Attribute:incident_list' => '関連するインシデント',
'Class:Ticket/Attribute:incident_list+' => '',
'Class:Ticket/Attribute:finalclass' => 'タイプ',
'Class:Ticket/Attribute:finalclass+' => '',
));
// Fieldset translation
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Ticket:baseinfo' => '基本情報',
'Ticket:date' => '日付',
'Ticket:contact' => '連絡先',
'Ticket:moreinfo' => '追加情報',
'Ticket:relation' => '関連',
'Ticket:log' => 'コミュニケーション',
));
//
// Class: lnkTicketToDoc
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:lnkTicketToDoc' => 'チケット/ドキュメント', // 'Ticket/Document', # 'Ticket/Document'
'Class:lnkTicketToDoc+' => '', # ''
'Class:lnkTicketToDoc/Attribute:ticket_id' => 'チケット', // 'Ticket', # 'Ticket'
'Class:lnkTicketToDoc/Attribute:ticket_id+' => '', # ''
'Class:lnkTicketToDoc/Attribute:ticket_ref' => 'チケット', // 'Ticket #', # 'Ticket #'
'Class:lnkTicketToDoc/Attribute:ticket_ref+' => '', # ''
'Class:lnkTicketToDoc/Attribute:document_id' => 'ドキュメント', // 'Document', # 'Document'
'Class:lnkTicketToDoc/Attribute:document_id+' => '', # ''
'Class:lnkTicketToDoc/Attribute:document_name' => 'ドキュメント', // 'Document', # 'Document'
'Class:lnkTicketToDoc/Attribute:document_name+' => '', # ''
'Class:lnkTicketToDoc' => 'チケット/文書',
'Class:lnkTicketToDoc+' => '',
'Class:lnkTicketToDoc/Attribute:ticket_id' => 'チケット',
'Class:lnkTicketToDoc/Attribute:ticket_id+' => '',
'Class:lnkTicketToDoc/Attribute:ticket_ref' => 'チケット',
'Class:lnkTicketToDoc/Attribute:ticket_ref+' => '',
'Class:lnkTicketToDoc/Attribute:document_id' => '文書',
'Class:lnkTicketToDoc/Attribute:document_id+' => '',
'Class:lnkTicketToDoc/Attribute:document_name' => '文書',
'Class:lnkTicketToDoc/Attribute:document_name+' => '',
));
//
@@ -90,20 +100,20 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:lnkTicketToContact' => 'チケット/コンタクト', // 'Ticket/Contact', # 'Ticket/Contact'
'Class:lnkTicketToContact+' => '', # ''
'Class:lnkTicketToContact/Attribute:ticket_id' => 'チケット', // 'Ticket', # 'Ticket'
'Class:lnkTicketToContact/Attribute:ticket_id+' => '', # ''
'Class:lnkTicketToContact/Attribute:ticket_ref' => 'チケット', // 'Ticket #', # 'Ticket #'
'Class:lnkTicketToContact/Attribute:ticket_ref+' => '', # ''
'Class:lnkTicketToContact/Attribute:contact_id' => 'コンタクト', // 'Contact', # 'Contact'
'Class:lnkTicketToContact/Attribute:contact_id+' => '', # ''
'Class:lnkTicketToContact/Attribute:contact_name' => 'コンタクト', // 'Contact', # 'Contact'
'Class:lnkTicketToContact/Attribute:contact_name+' => '', # ''
'Class:lnkTicketToContact/Attribute:contact_email' => 'Eメール', // 'Email', # 'Email'
'Class:lnkTicketToContact/Attribute:contact_email+' => '', # ''
'Class:lnkTicketToContact/Attribute:role' => '役割', // 'Role', # 'Role'
'Class:lnkTicketToContact/Attribute:role+' => '', # ''
'Class:lnkTicketToContact' => 'チケット/連絡先',
'Class:lnkTicketToContact+' => '',
'Class:lnkTicketToContact/Attribute:ticket_id' => 'チケット',
'Class:lnkTicketToContact/Attribute:ticket_id+' => '',
'Class:lnkTicketToContact/Attribute:ticket_ref' => 'チケット',
'Class:lnkTicketToContact/Attribute:ticket_ref+' => '',
'Class:lnkTicketToContact/Attribute:contact_id' => '連絡先',
'Class:lnkTicketToContact/Attribute:contact_id+' => '',
'Class:lnkTicketToContact/Attribute:contact_name' => '連絡先',
'Class:lnkTicketToContact/Attribute:contact_name+' => '',
'Class:lnkTicketToContact/Attribute:contact_email' => 'Eメール',
'Class:lnkTicketToContact/Attribute:contact_email+' => '',
'Class:lnkTicketToContact/Attribute:role' => '役割',
'Class:lnkTicketToContact/Attribute:role+' => '',
));
//
@@ -111,20 +121,20 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:lnkTicketToCI' => 'チケット/CI', // 'Ticket/CI', # 'Ticket/CI'
'Class:lnkTicketToCI+' => '', # ''
'Class:lnkTicketToCI/Attribute:ticket_id' => 'チケット', // 'Ticket', # 'Ticket'
'Class:lnkTicketToCI/Attribute:ticket_id+' => '', # ''
'Class:lnkTicketToCI/Attribute:ticket_ref' => 'チケット', // 'Ticket #', # 'Ticket #'
'Class:lnkTicketToCI/Attribute:ticket_ref+' => '', # ''
'Class:lnkTicketToCI/Attribute:ci_id' => 'CI', # 'CI'
'Class:lnkTicketToCI/Attribute:ci_id+' => '', # ''
'Class:lnkTicketToCI/Attribute:ci_name' => 'CI', # 'CI'
'Class:lnkTicketToCI/Attribute:ci_name+' => '', # ''
'Class:lnkTicketToCI/Attribute:ci_status' => 'CIステータス', // 'CI status', # 'CI status'
'Class:lnkTicketToCI/Attribute:ci_status+' => '', # ''
'Class:lnkTicketToCI/Attribute:impact' => '影響', // 'Impact', # 'Impact'
'Class:lnkTicketToCI/Attribute:impact+' => '', # ''
'Class:lnkTicketToCI' => 'チケット/CI',
'Class:lnkTicketToCI+' => '',
'Class:lnkTicketToCI/Attribute:ticket_id' => 'チケット',
'Class:lnkTicketToCI/Attribute:ticket_id+' => '',
'Class:lnkTicketToCI/Attribute:ticket_ref' => 'チケット',
'Class:lnkTicketToCI/Attribute:ticket_ref+' => '',
'Class:lnkTicketToCI/Attribute:ci_id' => 'CI',
'Class:lnkTicketToCI/Attribute:ci_id+' => '',
'Class:lnkTicketToCI/Attribute:ci_name' => 'CI',
'Class:lnkTicketToCI/Attribute:ci_name+' => '',
'Class:lnkTicketToCI/Attribute:ci_status' => 'CIの状態',
'Class:lnkTicketToCI/Attribute:ci_status+' => '',
'Class:lnkTicketToCI/Attribute:impact' => 'インパクト',
'Class:lnkTicketToCI/Attribute:impact+' => '',
));
@@ -133,132 +143,135 @@ Dict::Add('JA JP', 'Japanese', '日本語', array (
//
Dict::Add('JA JP', 'Japanese', '日本語', array (
'Class:ResponseTicket' => 'レスポンスチケット', // 'ResponseTicket', # 'ResponseTicket'
'Class:ResponseTicket+' => '', # ''
'Class:ResponseTicket/Attribute:status' => 'ステータス', // 'Status', # 'Status'
'Class:ResponseTicket/Attribute:status+' => '', # ''
'Class:ResponseTicket/Attribute:status/Value:new' => '新規', # 'New'
'Class:ResponseTicket/Attribute:status/Value:new+' => '新規にオープン', // 'newly opened', # 'newly opened'
'Class:ResponseTicket/Attribute:status/Value:escalated_tto' => 'エスカレーション/TTO', // 'Escalation/TTO', # 'Escalation/TTO'
'Class:ResponseTicket/Attribute:status/Value:escalated_tto+' => '', # ''
'Class:ResponseTicket/Attribute:status/Value:assigned' => '割当済', # 'Assigned'
'Class:ResponseTicket/Attribute:status/Value:assigned+' => '', # ''
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr' => 'エスカレーション/TTR', // 'Escalation/TTR', # 'Escalation/TTR'
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr+' => '', # ''
'Class:ResponseTicket/Attribute:status/Value:frozen' => 'ペンディング', // 'Pending', # 'Pending'
'Class:ResponseTicket/Attribute:status/Value:frozen+' => '', # ''
'Class:ResponseTicket/Attribute:status/Value:resolved' => '解決済み', // 'Resolved', # 'Resolved'
'Class:ResponseTicket/Attribute:status/Value:resolved+' => '', # ''
'Class:ResponseTicket/Attribute:status/Value:closed' => '完了', # 'Closed'
'Class:ResponseTicket/Attribute:status/Value:closed+' => '', # ''
'Class:ResponseTicket/Attribute:caller_id' => '呼び出し', // 'Caller', # 'Caller'
'Class:ResponseTicket/Attribute:caller_id+' => '', # ''
'Class:ResponseTicket/Attribute:caller_email' => 'Eメール', // 'Email', # 'Email'
'Class:ResponseTicket/Attribute:caller_email+' => '', # ''
'Class:ResponseTicket/Attribute:org_id' => 'カスタマ', // 'Customer', # 'Customer'
'Class:ResponseTicket/Attribute:org_id+' => '', # ''
'Class:ResponseTicket/Attribute:org_name' => 'カスタマ', // 'Customer', # 'Customer'
'Class:ResponseTicket/Attribute:org_name+' => '', # ''
'Class:ResponseTicket/Attribute:service_id' => 'サービス', // 'Service', # 'Service'
'Class:ResponseTicket/Attribute:service_id+' => '', # ''
'Class:ResponseTicket/Attribute:service_name' => '名前', // 'Name', # 'Name'
'Class:ResponseTicket/Attribute:service_name+' => '', # ''
'Class:ResponseTicket/Attribute:servicesubcategory_id' => 'サービス要素', // 'Service element', # 'Service element'
'Class:ResponseTicket/Attribute:servicesubcategory_id+' => '', # ''
'Class:ResponseTicket/Attribute:servicesubcategory_name' => '名前', // 'Name', # 'Name'
'Class:ResponseTicket/Attribute:servicesubcategory_name+' => '', # ''
'Class:ResponseTicket/Attribute:product' => 'プロダクト', // 'Product', # 'Product'
'Class:ResponseTicket/Attribute:product+' => '', # ''
'Class:ResponseTicket/Attribute:impact' => '影響', // 'Impact', # 'Impact'
'Class:ResponseTicket/Attribute:impact+' => '', # ''
'Class:ResponseTicket/Attribute:impact/Value:1' => '部署', // 'A department', # 'A department'
'Class:ResponseTicket/Attribute:impact/Value:1+' => '', # ''
'Class:ResponseTicket/Attribute:impact/Value:2' => 'サービス', // 'A service', # 'A service'
'Class:ResponseTicket/Attribute:impact/Value:2+' => '', # ''
'Class:ResponseTicket/Attribute:impact/Value:3' => 'パーソン', // 'A person', # 'A person'
'Class:ResponseTicket/Attribute:impact/Value:3+' => '', # ''
'Class:ResponseTicket/Attribute:urgency' => '緊急', // 'Urgency', # 'Urgency'
'Class:ResponseTicket/Attribute:urgency+' => '', # ''
'Class:ResponseTicket/Attribute:urgency/Value:1' => '高', // 'High', # 'High'
'Class:ResponseTicket/Attribute:urgency/Value:1+' => '', # ''
'Class:ResponseTicket/Attribute:urgency/Value:2' => '中', // 'Medium', # 'Medium'
'Class:ResponseTicket/Attribute:urgency/Value:2+' => '', # ''
'Class:ResponseTicket/Attribute:urgency/Value:3' => '低', // 'Low', # 'Low'
'Class:ResponseTicket/Attribute:urgency/Value:3+' => '', # ''
'Class:ResponseTicket/Attribute:priority' => 'プライオリティ', // 'Priority', # 'Priority'
'Class:ResponseTicket/Attribute:priority+' => '', # ''
'Class:ResponseTicket/Attribute:priority/Value:1' => '高', // 'High', # 'High'
'Class:ResponseTicket/Attribute:priority/Value:1+' => '', # ''
'Class:ResponseTicket/Attribute:priority/Value:2' => '中', // 'Medium', # 'Medium'
'Class:ResponseTicket/Attribute:priority/Value:2+' => '', # ''
'Class:ResponseTicket/Attribute:priority/Value:3' => '低', // 'Low', # 'Low'
'Class:ResponseTicket/Attribute:priority/Value:3+' => '', # ''
'Class:ResponseTicket/Attribute:workgroup_id' => 'ワークグループ', // 'Workgroup', # 'Workgroup'
'Class:ResponseTicket/Attribute:workgroup_id+' => '', # ''
'Class:ResponseTicket/Attribute:workgroup_name' => 'ワークグループ', // 'Workgroup', # 'Workgroup'
'Class:ResponseTicket/Attribute:workgroup_name+' => '', # ''
'Class:ResponseTicket/Attribute:agent_id' => 'エージェント', // 'Agent', # 'Agent'
'Class:ResponseTicket/Attribute:agent_id+' => '', # ''
'Class:ResponseTicket/Attribute:agent_name' => 'エージェント', // 'Agent', # 'Agent'
'Class:ResponseTicket/Attribute:agent_name+' => '', # ''
'Class:ResponseTicket/Attribute:agent_email' => 'エージェントEメール', // 'Agent email', # 'Agent email'
'Class:ResponseTicket/Attribute:agent_email+' => '', # ''
'Class:ResponseTicket/Attribute:related_problem_id' => '関連プロブレム', // 'Related Problem', # 'Related Problem'
'Class:ResponseTicket/Attribute:related_problem_id+' => '', # ''
'Class:ResponseTicket/Attribute:related_problem_ref' => '参照', // 'Ref', # 'Ref'
'Class:ResponseTicket/Attribute:related_problem_ref+' => '', # ''
'Class:ResponseTicket/Attribute:related_change_id' => '関連する変更', // 'Related change', # 'Related change'
'Class:ResponseTicket/Attribute:related_change_id+' => '', # ''
'Class:ResponseTicket/Attribute:related_change_ref' => '関連する変更', // 'Related change', # 'Related change'
'Class:ResponseTicket/Attribute:related_change_ref+' => '', # ''
'Class:ResponseTicket/Attribute:close_date' => '完了', # 'Closed'
'Class:ResponseTicket/Attribute:close_date+' => '', # ''
'Class:ResponseTicket/Attribute:last_update' => '最終更新日', // 'Last update', # 'Last update'
'Class:ResponseTicket/Attribute:last_update+' => '', # ''
'Class:ResponseTicket/Attribute:assignment_date' => 'アサイン日付', // 'Assignment Date ', # 'Assignment Date '
'Class:ResponseTicket/Attribute:assignment_date+' => '', # ''
'Class:ResponseTicket/Attribute:resolution_date' => '解決日', // 'Resolution Date', # 'Resolution Date'
'Class:ResponseTicket/Attribute:resolution_date+' => '', # ''
'Class:ResponseTicket/Attribute:tto_escalation_deadline' => 'TTOエスカレーション締切り', // 'TTO Escalation deadline', # 'TTO Escalation deadline'
'Class:ResponseTicket/Attribute:tto_escalation_deadline+' => '', # ''
'Class:ResponseTicket/Attribute:ttr_escalation_deadline' => 'TTRエスカレーション締切り', // 'TTR Escalation deadline', # 'TTR Escalation deadline'
'Class:ResponseTicket/Attribute:ttr_escalation_deadline+' => '', # ''
'Class:ResponseTicket/Attribute:closure_deadline' => 'クローズ締切り', // 'Closure deadline', # 'Closure deadline'
'Class:ResponseTicket/Attribute:closure_deadline+' => '', # ''
'Class:ResponseTicket/Attribute:resolution_code' => '解決コード', // 'Resolution code', # 'Resolution code'
'Class:ResponseTicket/Attribute:resolution_code+' => '', # ''
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce' => '再現できず', // 'Could not be reproduced', # 'Could not be reproduced'
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce+' => '', # ''
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate' => 'チケットを複製', // 'Duplicate ticket', # 'Duplicate ticket'
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate+' => '', # ''
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed' => '改修済み', // 'Fixed', # 'Fixed'
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed+' => '', # ''
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant' => '見当違い', // 'Irrelevant', # 'Irrelevant'
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant+' => '', # ''
'Class:ResponseTicket/Attribute:solution' => '解決策', // 'Solution', # 'Solution'
'Class:ResponseTicket' => 'レスポンスチケット',
'Class:ResponseTicket+' => '',
'Class:ResponseTicket/Attribute:status' => '状態',
'Class:ResponseTicket/Attribute:status+' => '',
'Class:ResponseTicket/Attribute:status/Value:new' => '新規',
'Class:ResponseTicket/Attribute:status/Value:new+' => '新規にオープン',
'Class:ResponseTicket/Attribute:status/Value:escalated_tto' => 'エスカレーション/TTO',
'Class:ResponseTicket/Attribute:status/Value:escalated_tto+' => '',
'Class:ResponseTicket/Attribute:status/Value:assigned' => '割り当て済み',
'Class:ResponseTicket/Attribute:status/Value:assigned+' => '',
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr' => 'エスカレーション/TTR',
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr+' => '',
'Class:ResponseTicket/Attribute:status/Value:frozen' => '保留', // 'Pending',
'Class:ResponseTicket/Attribute:status/Value:frozen+' => '',
'Class:ResponseTicket/Attribute:status/Value:resolved' => '解決済み',
'Class:ResponseTicket/Attribute:status/Value:resolved+' => '',
'Class:ResponseTicket/Attribute:status/Value:closed' => 'クローズ',
'Class:ResponseTicket/Attribute:status/Value:closed+' => '',
'Class:ResponseTicket/Attribute:caller_id' => '連絡者', // 'caller',
'Class:ResponseTicket/Attribute:caller_id+' => '',
'Class:ResponseTicket/Attribute:caller_email' => 'Eメール',
'Class:ResponseTicket/Attribute:caller_email+' => '',
'Class:ResponseTicket/Attribute:org_id' => '顧客',
'Class:ResponseTicket/Attribute:org_id+' => '',
'Class:ResponseTicket/Attribute:org_name' => '顧客',
'Class:ResponseTicket/Attribute:org_name+' => '',
'Class:ResponseTicket/Attribute:service_id' => 'サービス',
'Class:ResponseTicket/Attribute:service_id+' => '',
'Class:ResponseTicket/Attribute:service_name' => '名前',
'Class:ResponseTicket/Attribute:service_name+' => '',
'Class:ResponseTicket/Attribute:servicesubcategory_id' => 'サービス要素', // 'Service element',
'Class:ResponseTicket/Attribute:servicesubcategory_id+' => '',
'Class:ResponseTicket/Attribute:servicesubcategory_name' => '名前',
'Class:ResponseTicket/Attribute:servicesubcategory_name+' => '',
'Class:ResponseTicket/Attribute:product' => '製品',
'Class:ResponseTicket/Attribute:product+' => '',
'Class:ResponseTicket/Attribute:impact' => 'インパクト',
'Class:ResponseTicket/Attribute:impact+' => '',
'Class:ResponseTicket/Attribute:impact/Value:1' => '部署',
'Class:ResponseTicket/Attribute:impact/Value:1+' => '',
'Class:ResponseTicket/Attribute:impact/Value:2' => 'サービス',
'Class:ResponseTicket/Attribute:impact/Value:2+' => '',
'Class:ResponseTicket/Attribute:impact/Value:3' => '',
'Class:ResponseTicket/Attribute:impact/Value:3+' => '',
'Class:ResponseTicket/Attribute:urgency' => '緊急',
'Class:ResponseTicket/Attribute:urgency+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:1' => '高',
'Class:ResponseTicket/Attribute:urgency/Value:1+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:2' => '中',
'Class:ResponseTicket/Attribute:urgency/Value:2+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:3' => '低',
'Class:ResponseTicket/Attribute:urgency/Value:3+' => '',
'Class:ResponseTicket/Attribute:priority' => '優先度',
'Class:ResponseTicket/Attribute:priority+' => '',
'Class:ResponseTicket/Attribute:priority/Value:1' => '高',
'Class:ResponseTicket/Attribute:priority/Value:1+' => '',
'Class:ResponseTicket/Attribute:priority/Value:2' => '中',
'Class:ResponseTicket/Attribute:priority/Value:2+' => '',
'Class:ResponseTicket/Attribute:priority/Value:3' => '低',
'Class:ResponseTicket/Attribute:priority/Value:3+' => '',
'Class:ResponseTicket/Attribute:workgroup_id' => 'ワークグループ',
'Class:ResponseTicket/Attribute:workgroup_id+' => '',
'Class:ResponseTicket/Attribute:workgroup_name' => 'ワークグループ',
'Class:ResponseTicket/Attribute:workgroup_name+' => '',
'Class:ResponseTicket/Attribute:agent_id' => 'エージェント',
'Class:ResponseTicket/Attribute:agent_id+' => '',
'Class:ResponseTicket/Attribute:agent_name' => 'エージェント',
'Class:ResponseTicket/Attribute:agent_name+' => '',
'Class:ResponseTicket/Attribute:agent_email' => 'エージェントEメール',
'Class:ResponseTicket/Attribute:agent_email+' => '',
'Class:ResponseTicket/Attribute:related_problem_id' => '関連する問題',
'Class:ResponseTicket/Attribute:related_problem_id+' => '',
'Class:ResponseTicket/Attribute:related_problem_ref' => '参照',
'Class:ResponseTicket/Attribute:related_problem_ref+' => '',
'Class:ResponseTicket/Attribute:related_change_id' => '関連する変更',
'Class:ResponseTicket/Attribute:related_change_id+' => '',
'Class:ResponseTicket/Attribute:related_change_ref' => '関連する変更', // 'Related change',
'Class:ResponseTicket/Attribute:related_change_ref+' => '',
'Class:ResponseTicket/Attribute:close_date' => 'クローズ',
'Class:ResponseTicket/Attribute:close_date+' => '',
'Class:ResponseTicket/Attribute:last_update' => '最終更新日',
'Class:ResponseTicket/Attribute:last_update+' => '',
'Class:ResponseTicket/Attribute:assignment_date' => '割り当て日',
'Class:ResponseTicket/Attribute:assignment_date+' => '',
'Class:ResponseTicket/Attribute:resolution_date' => '解決日',
'Class:ResponseTicket/Attribute:resolution_date+' => '',
'Class:ResponseTicket/Attribute:tto_escalation_deadline' => 'TTOエスカレーション期限', // 'TTO Escalation deadline',
'Class:ResponseTicket/Attribute:tto_escalation_deadline+' => '',
'Class:ResponseTicket/Attribute:ttr_escalation_deadline' => 'TTRエスカレーション期限', // 'TTR Escalation deadline',
'Class:ResponseTicket/Attribute:ttr_escalation_deadline+' => '',
'Class:ResponseTicket/Attribute:closure_deadline' => 'クローズ期限', // 'Closure deadline',
'Class:ResponseTicket/Attribute:closure_deadline+' => '',
'Class:ResponseTicket/Attribute:resolution_code' => '解決コード',
'Class:ResponseTicket/Attribute:resolution_code+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce' => '再現出来ない',
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate' => 'チケットを複製',
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed' => '改修済み',
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant' => '見当違い', // 'Irrelevant',
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant+' => '',
'Class:ResponseTicket/Attribute:solution' => '解決策',
'Class:ResponseTicket/Attribute:solution+' => '', # ''
'Class:ResponseTicket/Attribute:user_satisfaction' => 'ユーザ満足度', // 'User satisfaction', # 'User satisfaction'
'Class:ResponseTicket/Attribute:user_satisfaction+' => '', # ''
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1' => '大変満足である', // 'Very satisfied', # 'Very satisfied'
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1+' => '大変満足である', // 'Very satisfied', # 'Very satisfied'
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2' => '概ね満足である', // 'Fairly statisfied', # 'Fairly statisfied'
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2+' => '概ね満足である', // 'Fairly statisfied', # 'Fairly statisfied'
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3' => 'やや不満である', // 'Rather Dissatified', # 'Rather Dissatified'
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3+' => 'やや不満である', // 'Rather Dissatified', # 'Rather Dissatified'
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4' => '大変不満である', // 'Very Dissatisfied', # 'Very Dissatisfied'
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4+' => '大変不満である', // 'Very Dissatisfied', # 'Very Dissatisfied'
'Class:ResponseTicket/Attribute:user_commment' => 'ユーザコメント', // 'User comment', # 'User comment'
'Class:ResponseTicket/Attribute:user_commment+' => '', # ''
'Class:ResponseTicket/Stimulus:ev_assign' => '割', # 'Assign'
'Class:ResponseTicket/Stimulus:ev_assign+' => '', # ''
'Class:ResponseTicket/Stimulus:ev_reassign' => '再割', # 'Reassign'
'Class:ResponseTicket/Stimulus:ev_reassign+' => '', # ''
'Class:ResponseTicket/Stimulus:ev_timeout' => 'エスカレーション', // 'Escalation', # 'Escalation'
'Class:ResponseTicket/Stimulus:ev_timeout+' => '', # ''
'Class:ResponseTicket/Stimulus:ev_resolve' => '解決済みとする', # 'Mark as resolved'
'Class:ResponseTicket/Stimulus:ev_resolve+' => '', # ''
'Class:ResponseTicket/Stimulus:ev_close' => '完了', # 'Close'
'Class:ResponseTicket/Stimulus:ev_close+' => '', # ''
'Class:ResponseTicket/Attribute:user_satisfaction' => 'ユーザ満足度',
'Class:ResponseTicket/Attribute:user_satisfaction+' => '',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1' => '大変満足', // 'Very satisfied',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1+' => '大変満足', // 'Very satisfied',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2' => '満足', // 'Fairly statisfied',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2+' => '満足', // 'Fairly statisfied',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3' => '不満', // 'Rather Dissatified',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3+' => '不満', // 'Rather Dissatified',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4' => '大変不満', // 'Very Dissatisfied',
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4+' => '大変不満', // 'Very Dissatisfied',
'Class:ResponseTicket/Attribute:user_commment' => 'ユーザコメント',
'Class:ResponseTicket/Attribute:user_commment+' => '',
'Class:ResponseTicket/Stimulus:ev_assign' => '割り当て',
'Class:ResponseTicket/Stimulus:ev_assign+' => '',
'Class:ResponseTicket/Stimulus:ev_reassign' => '再割り当て',
'Class:ResponseTicket/Stimulus:ev_reassign+' => '',
'Class:ResponseTicket/Stimulus:ev_timeout' => 'ev_タイムアウト', // 'Escalation', 'ev_timeout',
'Class:ResponseTicket/Stimulus:ev_timeout+' => '',
'Class:ResponseTicket/Stimulus:ev_resolve' => '解決済み',
'Class:ResponseTicket/Stimulus:ev_resolve+' => '',
'Class:ResponseTicket/Stimulus:ev_close' => 'クローズ',
'Class:ResponseTicket/Stimulus:ev_close+' => '',
));
?>

View File

@@ -51,11 +51,12 @@ class ItopWelcome extends ModuleHandlerAPI
if (UserRights::IsAdministrator())
{
$oAdminMenu = new MenuGroup('AdminTools', 80 /* fRank */);
new OQLMenuNode('UserAccountsMenu', 'SELECT User', $oAdminMenu->GetIndex(), 1 /* fRank */);
new OQLMenuNode('UserAccountsMenu', 'SELECT User', $oAdminMenu->GetIndex(), 1 /* fRank */, true /* bSearch */);
new OQLMenuNode('ProfilesMenu', 'SELECT URP_Profiles', $oAdminMenu->GetIndex(), 2 /* fRank */);
new TemplateMenuNode('NotificationsMenu', APPROOT.'application/templates/notifications_menu.html', $oAdminMenu->GetIndex(), 3 /* fRank */);
new OQLMenuNode('AuditCategories', 'SELECT AuditCategory', $oAdminMenu->GetIndex(), 4 /* fRank */);
new WebPageMenuNode('RunQueriesMenu', utils::GetAbsoluteUrlAppRoot().'pages/run_query.php', $oAdminMenu->GetIndex(), 8 /* fRank */);
new OQLMenuNode('QueryMenu', 'SELECT Query', $oAdminMenu->GetIndex(), 8.5 /* fRank */);
new WebPageMenuNode('ExportMenu', utils::GetAbsoluteUrlAppRoot().'webservices/export.php', $oAdminMenu->GetIndex(), 9 /* fRank */);
new WebPageMenuNode('DataModelMenu', utils::GetAbsoluteUrlAppRoot().'pages/schema.php', $oAdminMenu->GetIndex(), 10 /* fRank */);
new WebPageMenuNode('UniversalSearchMenu', utils::GetAbsoluteUrlAppRoot().'pages/UniversalSearch.php', $oAdminMenu->GetIndex(), 11 /* fRank */);

View File

@@ -8,6 +8,8 @@
import fl.controls.Slider;
import fl.events.SliderEvent;
import fl.controls.Label;
// For callbacks from Javascript
import flash.external.ExternalInterface;
// The main canvas
public class Navigator extends MovieClip
@@ -26,6 +28,7 @@
protected var m_sRelation:String;
protected var m_sObjClass:String;
protected var m_sObjId:String;
protected var m_sExclude:String;
// Constants
protected var m_RADIUS = 150;
@@ -43,14 +46,60 @@
{
m_aLinks = new Array();
m_aNodes = new Array();
m_sExclude = '';
m_fZoom = 1;
initParameters();
doLoadData();
var success = true;
if (ExternalInterface.available)
{
//Security.allowDomain(loader.contentLoaderInfo.url);
//the addCallback registers a function to be called from javascript, and this is what you wanted to do:
try
{
ExternalInterface.addCallback("Filter", DoFilter);
}
catch(err)
{
m_sTitle.text = 'E: '+err.description;
success = false
}
}
if (success)
{
//m_sTitle.text = 'Ok...';
doLoadData();
}
else
{
m_sTitle.text = 'Failed to addCallback';
}
addEventListener(Event.ENTER_FRAME, initGraphics);
//Stop scaling the flash content
stage.scaleMode = StageScaleMode.NO_SCALE;
}
function Reset()
{
m_aLinks = new Array();
for (var i:String in m_aNodes)
{
m_oCanvas.removeChild(m_aNodes[i]);
}
m_aNodes = new Array();
removeEventListener(Event.ENTER_FRAME, drawLines);
stage.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDown)
stage.removeEventListener(MouseEvent.MOUSE_UP, mouseReleased);
}
function DoFilter(sExcludeList:String):void
{
//do something
m_sExclude = sExcludeList;
doLoadData();
}
protected function initParameters():void
{
@@ -70,6 +119,8 @@
m_oCanvas.scaleY = m_fZoom;
// Handle listeners...
removeEventListener(Event.ENTER_FRAME,initGraphics);
m_oZoomSlider.value = 100;
m_oZoomSlider.addEventListener(SliderEvent.CHANGE, onZoomChange);
}
function mouseDown(event:MouseEvent):void
{
@@ -99,19 +150,22 @@
m_oCanvas.scaleX = m_fZoom;
m_oCanvas.scaleY = m_fZoom;
}
function GetZommLevel()
function GetZoomLevel()
{
return m_fZoom;
}
function doLoadData()
{
m_sTitle.text = "Loading...";
m_oPreloader.visible = true;
m_oZoomSlider.enabled = true;
var sSeparator:String = '?';
if (m_sDataUrl.indexOf(sSeparator) != -1)
{
sSeparator = '&';
}
var myString:String = m_sDataUrl+sSeparator+'relation='+m_sRelation+'&class='+m_sObjClass+'&id='+m_sObjId;
var myString:String = m_sDataUrl+sSeparator+'relation='+m_sRelation+'&class='+m_sObjClass+'&id='+m_sObjId+'&exclude='+m_sExclude;
trace("Requesting:"+myString);
var myXMLURL:URLRequest = new URLRequest(myString);
m_oLoader = new URLLoader();
@@ -125,6 +179,7 @@
{
try
{
Reset();
var myXML:XML = XML(m_oLoader.data);
//trace("Data loaded." + myXML);
//trace("===========================");
@@ -132,8 +187,6 @@
m_sTitle.text = decodeEntities(myXML.attribute("title").toString());
m_oZoomSlider.enabled = true;
addEventListener(Event.ENTER_FRAME, drawLines);
m_oZoomSlider.value = 100;
m_oZoomSlider.addEventListener(SliderEvent.CHANGE, onZoomChange);
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown)
stage.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
//trace('======= Initial Posistions =========');
@@ -155,8 +208,7 @@
{
if (m_oPreloader != null)
{
removeChild(m_oPreloader);
m_oPreloader = null;
m_oPreloader.visible = false;
}
}
}
@@ -165,8 +217,7 @@
{
if (m_oPreloader != null)
{
removeChild(m_oPreloader);
m_oPreloader = null;
m_oPreloader.visible = false;
}
m_sTitle.text = "I/O Error: unable to load the graph data ("+event+")";
}

Binary file not shown.

Binary file not shown.

View File

@@ -393,6 +393,7 @@ function ApplyNextAction(Webpage $oP, CMDBObject $oObj, $sNextAction, $oMyChange
}
$oObj->DBUpdateTracked($oMyChange);
}
$oObj->Reload();
$oObj->DisplayDetails($oP);
}
else
@@ -673,7 +674,7 @@ try
else
{
$oP->set_title(Dict::S('UI:SearchResultsPageTitle'));
$oP->p("<h1>".Dict::Format('UI:FullTextSearchTitle_Text', $sFullText)."</h1>");
$oP->p("<h1>".Dict::Format('UI:FullTextSearchTitle_Text', htmlentities($sFullText, ENT_QUOTES, 'UTF-8'))."</h1>");
$iCount = 0;
$iBlock = 0;
// Search in full text mode in all the classes
@@ -842,7 +843,7 @@ try
$currValue = $oObj->Get($sAttCode);
if ($oAttDef instanceof AttributeCaseLog)
{
$currValue = '';
$currValue = ' '; // Don't put an empty string, in case the field would be considered as mandatory...
}
if (is_object($currValue)) continue; // Skip non scalar values...
if(!array_key_exists($currValue, $aValues[$sAttCode]))
@@ -935,6 +936,7 @@ try
}
}
$sTip .= "</ul></p>";
$sTip = addslashes($sTip);
$sReadyScript .= "$('#multi_values_$sAttCode').qtip( { content: '$sTip', show: 'mouseover', hide: 'mouseout', style: { name: 'dark', tip: 'leftTop' }, position: { corner: { target: 'rightMiddle', tooltip: 'leftTop' }} } );";
$oDummyObj->Set($sAttCode, null);
@@ -1578,12 +1580,7 @@ EOF
{
$sDisplayValue = empty($aVal['display']) ? '<i>'.Dict::S('Enum:Undefined').'</i>' : str_replace(array("\n", "\r"), " ", $aVal['display']);
$sTip .= "<li>".Dict::Format('UI:BulkModify:Value_Exists_N_Times', $sDisplayValue, $aVal['count'])."</li>";
$index++;
if ($iMaxCount == $index)
{
$sTip .= "<li>".(count($aMultiValues) - $iMaxCount)." more different values...</li>";
break;
}
$index++;
if ($iMaxCount == $index)
{
$sTip .= "<li>".Dict::Format('UI:BulkModify:N_MoreValues', count($aValues[$sAttCode]) - $iMaxCount)."</li>";
@@ -1591,6 +1588,7 @@ EOF
}
}
$sTip .= "</ul></p>";
$sTip = addslashes($sTip);
$sReadyScript .= "$('#multi_values_$sAttCode').qtip( { content: '$sTip', show: 'mouseover', hide: 'mouseout', style: { name: 'dark', tip: 'leftTop' }, position: { corner: { target: 'rightMiddle', tooltip: 'leftTop' }} } );\n";
$sComments .= '<div class="multi_values" id="multi_values_'.$sAttCode.'">'.count($aValues[$sAttCode]).'</div>';
}
@@ -1739,13 +1737,13 @@ EOF
{
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
$aErrors[] = Dict::Format('UI:AttemptingToSetASlaveAttribute_Name', $oAttDef->GetLabel());
}
else
{
$oObj->Set($sAttCode, $paramValue);
unset($aExpectedAttributes[$sAttCode]);
}
}
}
$oObj->UpdateObjectFromPostedForm('', array_keys($aExpectedAttributes), $sTargetState);
if (count($aErrors) == 0)
{
if ($oObj->ApplyStimulus($sStimulus))
@@ -1982,13 +1980,13 @@ EOF
{
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
$aErrors[] = Dict::Format('UI:AttemptingToChangeASlaveAttribute_Name', $oAttDef->GetLabel());
unset($aExpectedAttributes[$sAttCode]);
}
else
{
$oObj->Set($sAttCode, $paramValue);
}
}
}
$oObj->UpdateObjectFromPostedForm('', array_keys($aExpectedAttributes), $sTargetState);
if (count($aErrors) == 0)
{
if ($oObj->ApplyStimulus($sStimulus))
@@ -2011,6 +2009,7 @@ EOF
$oP->p(implode('</p><p>', $aErrors));
}
}
$oObj->Reload();
$oObj->DisplayDetails($oP);
}
else
@@ -2030,25 +2029,100 @@ EOF
$oP->AddTabContainer('Navigator');
$oP->SetCurrentTabContainer('Navigator');
$oP->SetCurrentTab(Dict::S('UI:RelationshipGraph'));
$oP->add("<div id=\"ds_flash\" class=\"SearchDrawer\">\n");
$oP->add_ready_script(
<<<EOF
$("#dh_flash").click( function() {
$("#ds_flash").slideToggle('normal', function() { $("#ds_flash").parent().resize(); } );
$("#dh_flash").toggleClass('open');
});
EOF
);
$aResults = array();
$aSortedElements = array();
$oObj = MetaModel::GetObject($sClass, $id);
$oObj->GetRelatedObjects($sRelation, 20 /* iMaxDepth */, $aResults);
foreach($aResults as $sClassIdx => $aObjects)
{
foreach($aObjects as $oCurrObj)
{
$sSubClass = get_class($oCurrObj);
$aSortedElements[$sSubClass] = MetaModel::GetName($sSubClass);
}
}
asort($aSortedElements);
$idx = 0;
foreach($aSortedElements as $sSubClass => $sClassName)
{
$oP->add("<span style=\"padding-right:2em; white-space:nowrap;\"><input type=\"checkbox\" id=\"exclude_$idx\" name=\"excluded[]\" value=\"$sSubClass\" checked onChange=\"DoReload()\"><label for=\"exclude_$idx\">&nbsp;".MetaModel::GetClassIcon($sSubClass)."&nbsp;$sClassName</label></span> ");
$idx++;
}
$oP->add("</div>\n");
$oP->add("<div class=\"HRDrawer\"></div>\n");
$oP->add("<div id=\"dh_flash\" class=\"DrawerHandle\">".Dict::S('UI:ElementsDisplayed')."</div>\n");
$width = 1000;
$height = 700;
$sDrillUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=details&'.$oAppContext->GetForLink();
$sParams = "pWidth=$width&pHeight=$height&drillUrl=".urlencode($sDrillUrl)."&displayController=false&xmlUrl=".urlencode("./xml.navigator.php")."&obj_class=$sClass&obj_id=$id&relation=$sRelation";
$oP->add("<div style=\"z-index:1;background:white\"><object style=\"z-index:2\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0\" width=\"$width\" height=\"$height\" id=\"navigator\" align=\"middle\">
<param name=\"allowScriptAccess\" value=\"sameDomain\" />
$oP->add("<div style=\"z-index:1;background:white;width:100%;height:{$height}px\"><object style=\"z-index:2\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0\" width=\"100%\" height=\"$height\" id=\"navigator\" align=\"middle\">
<param name=\"allowScriptAccess\" value=\"always\" />
<param name=\"allowFullScreen\" value=\"false\" />
<param name=\"FlashVars\" value=\"$sParams\" />
<param name=\"wmode\" value=\"transparent\">
<param name=\"movie\" value=\"../navigator/navigator.swf\" /><param name=\"quality\" value=\"high\" /><param name=\"bgcolor\" value=\"#ffffff\" />
<embed src=\"../navigator/navigator.swf\" wmode=\"transparent\" flashVars=\"$sParams\" quality=\"high\" bgcolor=\"#ffffff\" width=\"$width\" height=\"$height\" name=\"navigator\" align=\"middle\" allowScriptAccess=\"sameDomain\" allowFullScreen=\"false\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.adobe.com/go/getflashplayer\" />
<embed src=\"../navigator/navigator.swf\" wmode=\"transparent\" flashVars=\"$sParams\" quality=\"high\" bgcolor=\"#ffffff\" width=\"100%\" height=\"$height\" name=\"navigator\" align=\"middle\" swliveconnect=\"true\" allowScriptAccess=\"always\" allowFullScreen=\"false\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.adobe.com/go/getflashplayer\" />
</object></div>\n");
$oP->SetCurrentTab(Dict::S('UI:RelationshipList'));
$oP->add("<div id=\"impacted_objects\" style=\"width:100%;background-color:#fff;padding:10px;\"><p style=\"height:150px;\">&nbsp;</p></div>");
$oP->add_script(
<<<EOF
function getFlashMovieObject(movieName)
{
if (window.document[movieName])
{
return window.document[movieName];
}
if (navigator.appName.indexOf("Microsoft Internet")==-1)
{
if (document.embeds && document.embeds[movieName])
return document.embeds[movieName];
}
else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
{
return document.getElementById(movieName);
}
}
function DoReload()
{
var oMovie = getFlashMovieObject('navigator');
try
{
var aExcluded = [];
$('input[name^=excluded]').each( function() {
if (!$(this).attr('checked'))
{
aExcluded.push($(this).val());
}
} );
oMovie.Filter(aExcluded.join(','));
//oMovie.SetVariable("/:message", "foo");
}
catch(err)
{
alert(err);
}
}
EOF
);
$oP->add_ready_script(
<<<EOF
var ajax_request = null;
function UpdateImpactedObjects(sClass, iId, sRelation)
{
var class_name = sClass; //$('select[name=class_name]').val();
@@ -2070,8 +2144,6 @@ EOF
$('#impacted_objects').empty();
$('#impacted_objects').append(data);
$('#impacted_objects').unblock();
$('#impacted_objects .listResults').tablesorter( { widgets: ['myZebra', 'truncatedList']} ); // sortable and zebra tables
$('#impacted_objects table.listResults').tableHover(); // hover tables
}
);
}
@@ -2188,4 +2260,4 @@ catch(Exception $e)
IssueLog::Error($e->getMessage());
}
}
?>
?>

View File

@@ -347,6 +347,7 @@ try
$aMoreReconciliationKeys = array(); // Store: key => void to automatically remove duplicates
foreach($aReconciliationKeys as $sAttCode)
{
if (!MetaModel::IsValidAttCode($sClassName, $sAttCode)) continue;
$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCode);
if ($oAttDef->IsExternalKey())
{
@@ -403,7 +404,7 @@ EOF
}
else
{
$oPage = new ajax_page("");
$oPage = new ajax_page("Class $sClassName is not a valid class !");
}
break;
}

View File

@@ -73,7 +73,6 @@ try
$sSelectMode = utils::ReadParam('select_mode', '');
$bDisplayKey = utils::ReadParam('display_key', 'true') == 'true';
$aList = utils::ReadParam('display_list', array());
$sClassName = $oFilter->GetClass();
//$aList = cmdbAbstractObject::FlattenZList(MetaModel::GetZListItems($sClassName, 'list'));
@@ -169,6 +168,28 @@ try
}
break;
// ui.linkswidget
case 'addObjects':
$oPage->SetContentType('text/html');
$sAttCode = utils::ReadParam('sAttCode', '');
$iInputId = utils::ReadParam('iInputId', '');
$sSuffix = utils::ReadParam('sSuffix', '');
$bDuplicates = (utils::ReadParam('bDuplicates', 'false') == 'false') ? false : true;
$sJson = utils::ReadParam('json', '', false, 'raw_data');
if (!empty($sJson))
{
$oWizardHelper = WizardHelper::FromJSON($sJson);
$oObj = $oWizardHelper->GetTargetObject();
}
else
{
// Search form: no current object
$oObj = null;
}
$oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix, $bDuplicates);
$oWidget->GetObjectPickerDialog($oPage, $oObj);
break;
// ui.linkswidget
case 'searchObjectsToAdd':
$oPage->SetContentType('text/html');
@@ -192,6 +213,7 @@ try
$sRemoteClass = utils::ReadParam('sRemoteClass', '', false, 'class');
$sFilter = utils::ReadParam('sFilter', '', false, 'raw_data');
$sJson = utils::ReadParam('json', '', false, 'raw_data');
$sAttCode = utils::ReadParam('sAttCode', '');
if (!empty($sJson))
{
$oWizardHelper = WizardHelper::FromJSON($sJson);
@@ -202,7 +224,7 @@ try
// Search form: no current object
$oObj = null;
}
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId);
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode);
$oWidget->SearchObjectsToSelect($oPage, $sFilter, $sRemoteClass, $oObj);
break;
@@ -213,6 +235,32 @@ try
$sFilter = utils::ReadParam('sFilter', '', false, 'raw_data');
$sJson = utils::ReadParam('json', '', false, 'raw_data');
$sContains = utils::ReadParam('q', '', false, 'raw_data');
if ($sContains !='')
{
if (!empty($sJson))
{
$oWizardHelper = WizardHelper::FromJSON($sJson);
$oObj = $oWizardHelper->GetTargetObject();
}
else
{
// Search form: no current object
$oObj = null;
}
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId);
$oWidget->AutoComplete($oPage, $sFilter, $oObj, $sContains);
}
break;
// ui.extkeywidget
case 'objectSearchForm':
$oPage->SetContentType('text/html');
$sTargetClass = utils::ReadParam('sTargetClass', '', false, 'class');
$iInputId = utils::ReadParam('iInputId', '');
$sTitle = utils::ReadParam('sTitle', '', false, 'raw_data');
$sAttCode = utils::ReadParam('sAttCode', '');
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode);
$sJson = utils::ReadParam('json', '', false, 'raw_data');
if (!empty($sJson))
{
$oWizardHelper = WizardHelper::FromJSON($sJson);
@@ -223,26 +271,27 @@ try
// Search form: no current object
$oObj = null;
}
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId);
$oWidget->AutoComplete($oPage, $sFilter, $oObj, $sContains);
break;
// ui.extkeywidget
case 'objectSearchForm':
$oPage->SetContentType('text/html');
$sTargetClass = utils::ReadParam('sTargetClass', '', false, 'class');
$iInputId = utils::ReadParam('iInputId', '');
$sTitle = utils::ReadParam('sTitle', '', false, 'raw_data');
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId);
$oWidget->GetSearchDialog($oPage, $sTitle);
$oWidget->GetSearchDialog($oPage, $sTitle, $oObj);
break;
// ui.extkeywidget
case 'objectCreationForm':
$sTargetClass = utils::ReadParam('sTargetClass', '', false, 'class');
$iInputId = utils::ReadParam('iInputId', '');
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId);
$oWidget->GetObjectCreationForm($oPage);
$sAttCode = utils::ReadParam('sAttCode', '');
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode);
$sJson = utils::ReadParam('json', '', false, 'raw_data');
if (!empty($sJson))
{
$oWizardHelper = WizardHelper::FromJSON($sJson);
$oObj = $oWizardHelper->GetTargetObject();
}
else
{
// Search form: no current object
$oObj = null;
}
$oWidget->GetObjectCreationForm($oPage, $oObj);
break;
// ui.extkeywidget
@@ -250,7 +299,8 @@ try
$sTargetClass = utils::ReadParam('sTargetClass', '', false, 'class');
$iInputId = utils::ReadParam('iInputId', '');
$sFormPrefix = utils::ReadParam('sFormPrefix', '');
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId);
$sAttCode = utils::ReadParam('sAttCode', '');
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode);
$aResult = $oWidget->DoCreateObject($oPage);
echo json_encode($aResult);
break;
@@ -297,6 +347,9 @@ try
$sSuffix = utils::ReadParam('sSuffix', '');
$sRemoteClass = utils::ReadParam('sRemoteClass', $sClass, false, 'class');
$bDuplicates = (utils::ReadParam('bDuplicates', 'false') == 'false') ? false : true;
$sJson = utils::ReadParam('json', '', false, 'raw_data');
$oWizardHelper = WizardHelper::FromJSON($sJson);
$oObj = $oWizardHelper->GetTargetObject();
$oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix, $bDuplicates);
if ($sFilter != '')
{
@@ -306,7 +359,7 @@ try
{
$oFullSetFilter = new DBObjectSearch($sRemoteClass);
}
$oWidget->DoAddObjects($oPage, $oFullSetFilter);
$oWidget->DoAddObjects($oPage, $oFullSetFilter, $oObj);
break;
case 'wizard_helper_preview':
@@ -378,7 +431,7 @@ try
$sTargetState = utils::ReadParam('target_state', '');
$iTransactionId = utils::ReadParam('transaction_id', '');
$oObj->Set(MetaModel::GetStateAttributeCode($sClass), $sTargetState);
cmdbAbstractObject::DisplayCreationForm($oPage, $sClass, $oObj, array(), array('action' => utils::GetAbsoluteUrlAppRoot().'pages/UI.php', 'transcation_id' => $iTransactionId));
cmdbAbstractObject::DisplayCreationForm($oPage, $sClass, $oObj, array(), array('action' => utils::GetAbsoluteUrlAppRoot().'pages/UI.php', 'transaction_id' => $iTransactionId));
break;
// DisplayBlock
@@ -392,6 +445,18 @@ try
{
$aExtraParams = json_decode(str_replace("'", '"', $sExtraParams), true /* associative array */);
}
// Restore the app context from the ExtraParams
$oAppContext = new ApplicationContext(false); // false => don't read the context yet !
$aContext = array();
foreach($oAppContext->GetNames() as $sName)
{
$sParamName = 'c['.$sName.']';
if (isset($aExtraParams[$sParamName]))
{
$aContext[$sName] = $aExtraParams[$sParamName];
}
}
$_REQUEST['c'] = $aContext;
if ($sEncoding == 'oql')
{
$oFilter = CMDBSearchFilter::FromOQL($sFilter);
@@ -592,16 +657,17 @@ function DownloadDocument(WebPage $oPage, $sClass, $id, $sAttCode, $sContentDisp
{
try
{
$oObj = MetaModel::GetObject($sClass, $id);
if (is_object($oObj))
$oObj = MetaModel::GetObject($sClass, $id, false, false);
if (!is_object($oObj))
{
$oDocument = $oObj->Get($sAttCode);
if (is_object($oDocument))
{
$oPage->SetContentType($oDocument->GetMimeType());
$oPage->SetContentDisposition($sContentDisposition,$oDocument->GetFileName());
$oPage->add($oDocument->GetData());
}
throw new Exception("Invalid id ($id) for class '$sClass' - the object does not exist or you are not allowed to view it");
}
$oDocument = $oObj->Get($sAttCode);
if (is_object($oDocument))
{
$oPage->SetContentType($oDocument->GetMimeType());
$oPage->SetContentDisposition($sContentDisposition,$oDocument->GetFileName());
$oPage->add($oDocument->GetData());
}
}
catch(Exception $e)

View File

@@ -22,6 +22,125 @@
* @author Denis Flaven <denis.flaven@combodo.com>
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
/**
* Adds the context parameters to the audit query
*/
function FilterByContext(DBObjectSearch &$oFilter, ApplicationContext $oAppContext)
{
$sObjClass = $oFilter->GetClass();
$aContextParams = $oAppContext->GetNames();
$aCallSpec = array($sObjClass, 'MapContextParam');
if (is_callable($aCallSpec))
{
foreach($aContextParams as $sParamName)
{
$sValue = $oAppContext->GetCurrentValue($sParamName, null);
if ($sValue != null)
{
$sAttCode = call_user_func($aCallSpec, $sParamName); // Returns null when there is no mapping for this parameter
if ( ($sAttCode != null) && MetaModel::IsValidAttCode($sObjClass, $sAttCode))
{
// Check if the condition points to a hierarchical key
if ($sAttCode == 'id')
{
// Filtering on the objects themselves
$sHierarchicalKeyCode = MetaModel::IsHierarchicalClass($sObjClass);
if ($sHierarchicalKeyCode !== false)
{
$oRootFilter = new DBObjectSearch($sObjClass);
$oRootFilter->AddCondition($sAttCode, $sValue);
$oFilter->AddCondition_PointingTo($oRootFilter, $sHierarchicalKeyCode, TREE_OPERATOR_BELOW); // Use the 'below' operator by default
$bConditionAdded = true;
}
}
else
{
$oAttDef = MetaModel::GetAttributeDef($sObjClass, $sAttCode);
$bConditionAdded = false;
if ($oAttDef->IsExternalKey())
{
$sHierarchicalKeyCode = MetaModel::IsHierarchicalClass($oAttDef->GetTargetClass());
if ($sHierarchicalKeyCode !== false)
{
$oRootFilter = new DBObjectSearch($oAttDef->GetTargetClass());
$oRootFilter->AddCondition('id', $sValue);
$oHKFilter = new DBObjectSearch($oAttDef->GetTargetClass());
$oHKFilter->AddCondition_PointingTo($oRootFilter, $sHierarchicalKeyCode, TREE_OPERATOR_BELOW); // Use the 'below' operator by default
$oFilter->AddCondition_PointingTo($oHKFilter, $sAttCode);
$bConditionAdded = true;
}
}
}
if (!$bConditionAdded)
{
$oFilter->AddCondition($sAttCode, $sValue);
}
}
}
}
}
}
function GetRuleResultFilter($iRuleId, $oDefinitionFilter, $oAppContext)
{
$oRule = MetaModel::GetObject('AuditRule', $iRuleId);
$sOql = $oRule->Get('query');
$oRuleFilter = DBObjectSearch::FromOQL($sOql);
FilterByContext($oRuleFilter, $oAppContext); // Not needed since this filter is a subset of the definition filter, but may speedup things
if ($oRule->Get('valid_flag') == 'false')
{
// The query returns directly the invalid elements
$oFilter = $oRuleFilter;
$oFilter->MergeWith($oDefinitionFilter);
}
else
{
// The query returns only the valid elements, all the others are invalid
$aValidRows = $oRuleFilter->ToDataArray(array('id'));
$aValidIds = array();
foreach($aValidRows as $aRow)
{
$aValidIds[] = $aRow['id'];
}
$oFilter = clone $oDefinitionFilter;
if (count($aValidIds) > 0)
{
$aInDefSet = array();
foreach($oDefinitionFilter->ToDataArray(array('id')) as $aRow)
{
$aInDefSet[] = $aRow['id'];
}
$aInvalids = array_diff($aInDefSet, $aValidIds);
if (count($aInvalids) > 0)
{
$oFilter->AddCondition('id', $aInvalids, 'IN');
}
else
{
$oFilter->AddCondition('id', 0, '=');
}
}
}
return $oFilter;
}
function GetReportColor($iTotal, $iErrors)
{
$sResult = 'red';
if ( ($iTotal == 0) || ($iErrors / $iTotal) <= 0.05 )
{
$sResult = 'green';
}
else if ( ($iErrors / $iTotal) <= 0.25 )
{
$sResult = 'orange';
}
return $sResult;
}
try
{
require_once('../approot.inc.php');
@@ -37,116 +156,32 @@ try
$oP = new iTopWebPage(Dict::S('UI:Audit:Title'));
/**
* Adds the context parameters to the audit query
*/
function FilterByContext(DBObjectSearch &$oFilter, ApplicationContext $oAppContext)
{
$sObjClass = $oFilter->GetClass();
$aContextParams = $oAppContext->GetNames();
$aCallSpec = array($sObjClass, 'MapContextParam');
if (is_callable($aCallSpec))
{
foreach($aContextParams as $sParamName)
{
$sValue = $oAppContext->GetCurrentValue($sParamName, null);
if ($sValue != null)
{
$sAttCode = call_user_func($aCallSpec, $sParamName); // Returns null when there is no mapping for this parameter
if ( ($sAttCode != null) && MetaModel::IsValidAttCode($sObjClass, $sAttCode))
{
$oFilter = new DBObjectSearch($sObjClass);
// Check if the condition points to a hierarchical key
if ($sAttCode == 'id')
{
// Filtering on the objects themselves
$sHierarchicalKeyCode = MetaModel::IsHierarchicalClass($sObjClass);
if ($sHierarchicalKeyCode !== false)
{
$oRootFilter = new DBObjectSearch($sObjClass);
$oRootFilter->AddCondition($sAttCode, $sValue);
$oFilter->AddCondition_PointingTo($oRootFilter, $sHierarchicalKeyCode, TREE_OPERATOR_BELOW); // Use the 'below' operator by default
$bConditionAdded = true;
}
}
else
{
$oAttDef = MetaModel::GetAttributeDef($sObjClass, $sAttCode);
$bConditionAdded = false;
if ($oAttDef->IsExternalKey())
{
$sHierarchicalKeyCode = MetaModel::IsHierarchicalClass($oAttDef->GetTargetClass());
if ($sHierarchicalKeyCode !== false)
{
$oRootFilter = new DBObjectSearch($oAttDef->GetTargetClass());
$oRootFilter->AddCondition('id', $sValue);
$oHKFilter = new DBObjectSearch($oAttDef->GetTargetClass());
$oHKFilter->AddCondition_PointingTo($oRootFilter, $sHierarchicalKeyCode, TREE_OPERATOR_BELOW); // Use the 'below' operator by default
$oFilter->AddCondition_PointingTo($oHKFilter, $sAttCode);
$bConditionAdded = true;
}
}
}
if (!$bConditionAdded)
{
$oFilter->AddCondition($sAttCode, $sValue);
}
}
}
}
}
}
function GetRuleResultSet($iRuleId, $oDefinitionFilter, $oAppContext)
{
$oRule = MetaModel::GetObject('AuditRule', $iRuleId);
$sOql = $oRule->Get('query');
$oRuleFilter = DBObjectSearch::FromOQL($sOql);
FilterByContext($oRuleFilter, $oAppContext); // Not needed since this filter is a subset of the definition filter, but may speedup things
if ($oRule->Get('valid_flag') == 'false')
{
// The query returns directly the invalid elements
$oFilter = $oRuleFilter;
$oFilter->MergeWith($oDefinitionFilter);
$oErrorObjectSet = new CMDBObjectSet($oFilter);
}
else
{
// The query returns only the valid elements, all the others are invalid
$oFilter = $oRuleFilter;
$oErrorObjectSet = new CMDBObjectSet($oFilter);
$aValidIds = array(0); // Make sure that we have at least one value in the list
while($oObj = $oErrorObjectSet->Fetch())
{
$aValidIds[] = $oObj->GetKey();
}
$oFilter = clone $oDefinitionFilter;
$oFilter->AddCondition('id', $aValidIds, 'NOTIN');
$oErrorObjectSet = new CMDBObjectSet($oFilter);
}
return $oErrorObjectSet;
}
function GetReportColor($iTotal, $iErrors)
{
$sResult = 'red';
if ( ($iTotal == 0) || ($iErrors / $iTotal) <= 0.05 )
{
$sResult = 'green';
}
else if ( ($iErrors / $iTotal) <= 0.25 )
{
$sResult = 'orange';
}
return $sResult;
}
switch($operation)
{
case 'csv':
// Big result sets cause long OQL that cannot be passed (serialized) as a GET parameter
// Therefore we don't use the standard "search_oql" operation of UI.php to display the CSV
$iCategory = utils::ReadParam('category', '');
$iRuleIndex = utils::ReadParam('rule', 0);
$oAuditCategory = MetaModel::GetObject('AuditCategory', $iCategory);
$oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
FilterByContext($oDefinitionFilter, $oAppContext);
$oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
$oFilter = GetRuleResultFilter($iRuleIndex, $oDefinitionFilter, $oAppContext);
$oErrorObjectSet = new CMDBObjectSet($oFilter);
$oAuditRule = MetaModel::GetObject('AuditRule', $iRuleIndex);
$oP->add('<div class="page_header"><h1>Audit Errors: <span class="hilite">'.$oAuditRule->Get('description').'</span></h1><img style="margin-top: -20px; margin-right: 10px; float: right;" src="../images/stop.png"/></div>');
$oP->p('<a href="./audit.php?'.$oAppContext->GetForLink().'">[Back to audit results]</a>');
$sBlockId = 'audit_errors';
$oP->p("<div id=\"$sBlockId\" style=\"clear:both\">\n");
$oBlock = DisplayBlock::FromObjectSet($oErrorObjectSet, 'csv');
$oBlock->Display($oP, 1);
$oP->p("</div>\n");
// Adjust the size of the Textarea containing the CSV to fit almost all the remaining space
$oP->add_ready_script(" $('#1>textarea').height(400);"); // adjust the size of the block
break;
case 'errors':
$iCategory = utils::ReadParam('category', '');
$iRuleIndex = utils::ReadParam('rule', 0);
@@ -155,7 +190,8 @@ try
$oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
FilterByContext($oDefinitionFilter, $oAppContext);
$oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
$oErrorObjectSet = GetRuleResultSet($iRuleIndex, $oDefinitionFilter, $oAppContext);
$oFilter = GetRuleResultFilter($iRuleIndex, $oDefinitionFilter, $oAppContext);
$oErrorObjectSet = new CMDBObjectSet($oFilter);
$oAuditRule = MetaModel::GetObject('AuditRule', $iRuleIndex);
$oP->add('<div class="page_header"><h1>Audit Errors: <span class="hilite">'.$oAuditRule->Get('description').'</span></h1><img style="margin-top: -20px; margin-right: 10px; float: right;" src="../images/stop.png"/></div>');
$oP->p('<a href="./audit.php?'.$oAppContext->GetForLink().'">[Back to audit results]</a>');
@@ -163,7 +199,9 @@ try
$oP->p("<div id=\"$sBlockId\" style=\"clear:both\">\n");
$oBlock = DisplayBlock::FromObjectSet($oErrorObjectSet, 'list');
$oBlock->Display($oP, 1);
$oP->p("</div>\n");
$oP->p("</div>\n");
$sExportUrl = utils::GetAbsoluteUrlAppRoot()."pages/audit.php?operation=csv&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey();
$oP->add_ready_script("$('a[href*=\"pages/UI.php?operation=search\"]').attr('href', '".$sExportUrl."')");
break;
case 'audit':
@@ -179,52 +217,77 @@ try
$oP->add("</tr>\n");
while($oAuditCategory = $oCategoriesSet->fetch())
{
$oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
FilterByContext($oDefinitionFilter, $oAppContext);
$aObjectsWithErrors = array();
if (!empty($currentOrganization))
try
{
if (MetaModel::IsValidFilterCode($oDefinitionFilter->GetClass(), 'org_id'))
$oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
FilterByContext($oDefinitionFilter, $oAppContext);
$aObjectsWithErrors = array();
if (!empty($currentOrganization))
{
$oDefinitionFilter->AddCondition('org_id', $currentOrganization, '=');
if (MetaModel::IsValidFilterCode($oDefinitionFilter->GetClass(), 'org_id'))
{
$oDefinitionFilter->AddCondition('org_id', $currentOrganization, '=');
}
}
$aResults = array();
$oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
$iCount = $oDefinitionSet->Count();
$oRulesFilter = new CMDBSearchFilter('AuditRule');
$oRulesFilter->AddCondition('category_id', $oAuditCategory->GetKey(), '=');
$oRulesSet = new DBObjectSet($oRulesFilter);
while($oAuditRule = $oRulesSet->fetch() )
{
$aRow = array();
$aRow['description'] = $oAuditRule->GetName();
if ($iCount == 0)
{
// nothing to check, really !
$aRow['nb_errors'] = "<a href=\"?operation=errors&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."\">0</a>";
$aRow['percent_ok'] = '100.00';
$aRow['class'] = GetReportColor($iCount, 0);
}
else
{
try
{
$oFilter = GetRuleResultFilter($oAuditRule->GetKey(), $oDefinitionFilter, $oAppContext);
$aErrors = $oFilter->ToDataArray(array('id'));
$iErrorsCount = count($aErrors);
foreach($aErrors as $aErrorRow)
{
$aObjectsWithErrors[$aErrorRow['id']] = true;
}
$aRow['nb_errors'] = ($iErrorsCount == 0) ? '0' : "<a href=\"?operation=errors&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."&".$oAppContext->GetForLink()."\">$iErrorsCount</a> <a href=\"?operation=csv&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."&".$oAppContext->GetForLink()."\">(CSV)</a>";
$aRow['percent_ok'] = sprintf('%.2f', 100.0 * (($iCount - $iErrorsCount) / $iCount));
$aRow['class'] = GetReportColor($iCount, $iErrorsCount);
}
catch(Exception $e)
{
$aRow['nb_errors'] = "OQL Error";
$aRow['percent_ok'] = 'n/a';
$aRow['class'] = 'red';
$sMessage = Dict::Format('UI:Audit:ErrorIn_Rule_Reason', $oAuditRule->GetHyperlink(), $e->getMessage());
$oP->p("<img style=\"vertical-align:middle\" src=\"../images/stop-mid.png\"/>&nbsp;".$sMessage);
}
}
$aResults[] = $aRow;
$iTotalErrors = count($aObjectsWithErrors);
$sOverallPercentOk = ($iCount == 0) ? '100.00' : sprintf('%.2f', 100.0 * (($iCount - $iTotalErrors) / $iCount));
$sClass = GetReportColor($iCount, $iTotalErrors);
}
}
$aResults = array();
$oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
$iCount = $oDefinitionSet->Count();
$oRulesFilter = new CMDBSearchFilter('AuditRule');
$oRulesFilter->AddCondition('category_id', $oAuditCategory->GetKey(), '=');
$oRulesSet = new DBObjectSet($oRulesFilter);
while($oAuditRule = $oRulesSet->fetch() )
catch(Exception $e)
{
$aRow = array();
$aRow['description'] = $oAuditRule->GetName();
if ($iCount == 0)
{
// nothing to check, really !
$aRow['nb_errors'] = "<a href=\"?operation=errors&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."\">0</a>";
$aRow['percent_ok'] = '100.00';
$aRow['class'] = GetReportColor($iCount, 0);
}
else
{
$oRuleFilter = DBObjectSearch::FromOQL($oAuditRule->Get('query'));
$oErrorObjectSet = GetRuleResultSet($oAuditRule->GetKey(), $oDefinitionFilter, $oAppContext);
$iErrorsCount = $oErrorObjectSet->Count();
while($oObj = $oErrorObjectSet->Fetch())
{
$aObjectsWithErrors[$oObj->GetKey()] = true;
}
$aRow['nb_errors'] = ($iErrorsCount == 0) ? '0' : "<a href=\"?operation=errors&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."&".$oAppContext->GetForLink()."\">$iErrorsCount</a>";
$aRow['percent_ok'] = sprintf('%.2f', 100.0 * (($iCount - $iErrorsCount) / $iCount));
$aRow['class'] = GetReportColor($iCount, $iErrorsCount);
}
$aResults[] = $aRow;
$iTotalErrors = count($aObjectsWithErrors);
$sOverallPercentOk = ($iCount == 0) ? '100.00' : sprintf('%.2f', 100.0 * (($iCount - $iTotalErrors) / $iCount));
$sClass = GetReportColor($iCount, $iTotalErrors);
$aRow['description'] = "OQL error";
$aRow['nb_errors'] = "n/a";
$aRow['percent_ok'] = '';
$aRow['class'] = 'red';
$sMessage = Dict::Format('UI:Audit:ErrorIn_Category_Reason', $oAuditCategory->GetHyperlink(), $e->getMessage());
$oP->p("<img style=\"vertical-align:middle\" src=\"../images/stop-mid.png\"/>&nbsp;".$sMessage);
$aResults[] = $aRow;
}
$oP->add("<tr>\n");
$oP->add("<th><img src=\"../images/minus.gif\"></th><th class=\"alignLeft\">".$oAuditCategory->GetName()."</th><th class=\"alignRight\">$iCount</th><th class=\"alignRight\">$iTotalErrors</th><th class=\"alignRight $sClass\">$sOverallPercentOk %</th>\n");
@@ -240,7 +303,6 @@ try
$oP->add("</td></tr>\n");
$oP->add("</table>\n");
}
$oP->output();
}
catch(CoreException $e)

View File

@@ -1402,14 +1402,18 @@ $('#select_template_class').change( function() {
EOF
);
if (MetaModel::GetConfig()->Get('csv_import_history_display'))
{
$oPage->SetCurrentTabContainer('tabs1');
$oPage->SetCurrentTab(Dict::S('UI:History:BulkImports'));
BulkChange::DisplayImportHistory($oPage);
}
}
switch($iStep)
{
case 10:
// Case generated by BulkChange::DisplayImportHistory
$iChange = (int)utils::ReadParam('changeid', 0);
BulkChange::DisplayImportHistoryDetails($oPage, $iChange);
break;

View File

@@ -120,34 +120,80 @@ try
// leave $sExpression as is
}
$oFilter = null;
$aArgs = array();
$sSyntaxError = null;
if (!empty($sExpression))
{
try
{
$oFilter = DBObjectSearch::FromOQL($sExpression);
}
catch(OqlException $e)
{
$sSyntaxError = $e->getHtmlDesc();
}
if ($oFilter)
{
$aArgs = array();
foreach($oFilter->GetQueryParams() as $sParam => $foo)
{
$value = utils::ReadParam('arg_'.$sParam, null, true, 'raw_data');
if (!is_null($value))
{
$aArgs[$sParam] = $value;
}
else
{
$aArgs[$sParam] = '';
}
}
$oFilter->SetInternalParams($aArgs);
}
elseif ($sSyntaxError)
{
// Query arguments taken from the page args
}
}
$oP->add("<form method=\"get\">\n");
$oP->add(Dict::S('UI:RunQuery:ExpressionToEvaluate')."<br/>\n");
$oP->add("<textarea cols=\"120\" rows=\"8\" name=\"expression\">$sExpression</textarea>\n");
$oP->add("<textarea cols=\"120\" rows=\"8\" name=\"expression\">".htmlentities($sExpression, ENT_QUOTES, 'UTF-8')."</textarea>\n");
if (count($aArgs) > 0)
{
$oP->add("<div class=\"wizContainer\">\n");
$oP->add("<h3>Query arguments</h3>\n");
foreach($aArgs as $sParam => $sValue)
{
$oP->p("$sParam: <input type=\"string\" name=\"arg_$sParam\" value=\"$sValue\">\n");
}
$oP->add("</div>\n");
}
$oP->add("<input type=\"submit\" value=\"".Dict::S('UI:Button:Evaluate')."\">\n");
$oP->add($oAppContext->GetForForm());
$oP->add("</form>\n");
if (!empty($sExpression))
if ($oFilter)
{
$oFilter = DBObjectSearch::FromOQL($sExpression);
if ($oFilter)
{
$oP->add("<h3>Query results</h3>\n");
$oResultBlock = new DisplayBlock($oFilter, 'list', false);
$oResultBlock->Display($oP, 'runquery');
$oP->add("<h3>Query results</h3>\n");
$oResultBlock = new DisplayBlock($oFilter, 'list', false);
$oResultBlock->Display($oP, 'runquery');
$oP->p('');
$oP->StartCollapsibleSection(Dict::S('UI:RunQuery:MoreInfo'), false);
$oP->p(Dict::S('UI:RunQuery:DevelopedQuery').$oFilter->ToOQL());
$oP->p(Dict::S('UI:RunQuery:SerializedFilter').$oFilter->serialize());
$oP->EndCollapsibleSection();
}
$oP->p('');
$oP->StartCollapsibleSection(Dict::S('UI:RunQuery:MoreInfo'), false);
$oP->p(Dict::S('UI:RunQuery:DevelopedQuery').htmlentities($oFilter->ToOQL(), ENT_QUOTES, 'UTF-8'));
$oP->p(Dict::S('UI:RunQuery:SerializedFilter').$oFilter->serialize());
$oP->EndCollapsibleSection();
}
elseif ($sSyntaxError)
{
$oP->p('<b>'.Dict::Format('UI:RunQuery:Error', $e->getHtmlDesc()).'</b>');
}
}
catch(CoreException $e)
{
$oP->p('<b>'.Dict::Format('UI:RunQuery:Error', $e->getHtmlDesc()).'</b>');
}
catch(Exception $e)
{

View File

@@ -385,6 +385,10 @@ function DisplayClassDetails($oPage, $sClass, $sContext)
{
$sValue = Dict::Format('UI:Schema:ExternalKey_To',MakeClassHLink($oAttDef->GetTargetClass(), $sContext));
}
elseif ($oAttDef->IsLinkSet())
{
$sValue = MakeClassHLink($oAttDef->GetLinkedClass(), $sContext);
}
else
{
$sValue = $oAttDef->GetDescription();

View File

@@ -59,9 +59,10 @@ function AddNodeDetails(&$oNode, $oObj)
* @param DBObject $oObj The current object
* @param string $sRelation The name of the relation to search with
*/
function GetRelatedObjectsAsXml(DBObject $oObj, $sRelationName, &$oLinks, &$oXmlDoc, &$oXmlNode, $iDepth = 0)
function GetRelatedObjectsAsXml(DBObject $oObj, $sRelationName, &$oLinks, &$oXmlDoc, &$oXmlNode, $iDepth = 0, $aExcludedClasses)
{
$aResults = array();
$bAddLinks = false;
$oObj->GetRelatedObjects($sRelationName, 1 /* iMaxDepth */, $aResults);
if ($iDepth > MAX_RECURSION_DEPTH) return;
@@ -71,25 +72,33 @@ function GetRelatedObjectsAsXml(DBObject $oObj, $sRelationName, &$oLinks, &$oXml
{
if (is_object($oTargetObj))
{
$oLinkingNode = $oXmlDoc->CreateElement('link');
$oLinkingNode->SetAttribute('relation', $sRelationName);
$oLinkingNode->SetAttribute('arrow', 1); // Such relations have a direction, display an arrow
$oLinkedNode = $oXmlDoc->CreateElement('node');
$oLinkedNode->SetAttribute('id', $oTargetObj->GetKey());
$oLinkedNode->SetAttribute('obj_class', get_class($oTargetObj));
$oLinkedNode->SetAttribute('obj_class_name', htmlspecialchars(MetaModel::GetName(get_class($oTargetObj))));
$oLinkedNode->SetAttribute('name', htmlspecialchars($oTargetObj->GetRawName())); // htmlentities is too much for XML
$oLinkedNode->SetAttribute('icon', BuildIconPath($oTargetObj->GetIcon(false /* No IMG tag */)));
AddNodeDetails($oLinkedNode, $oTargetObj);
$oSubLinks = $oXmlDoc->CreateElement('links');
// Recurse
GetRelatedObjectsAsXml($oTargetObj, $sRelationName, $oSubLinks, $oXmlDoc, $oLinkedNode, $iDepth++);
$oLinkingNode->AppendChild($oLinkedNode);
$oLinks->AppendChild($oLinkingNode);
if (in_array(get_class($oTargetObj), $aExcludedClasses))
{
GetRelatedObjectsAsXml($oTargetObj, $sRelationName, $oLinks, $oXmlDoc, $oXmlNode, $iDepth++, $aExcludedClasses);
}
else
{
$oLinkingNode = $oXmlDoc->CreateElement('link');
$oLinkingNode->SetAttribute('relation', $sRelationName);
$oLinkingNode->SetAttribute('arrow', 1); // Such relations have a direction, display an arrow
$oLinkedNode = $oXmlDoc->CreateElement('node');
$oLinkedNode->SetAttribute('id', $oTargetObj->GetKey());
$oLinkedNode->SetAttribute('obj_class', get_class($oTargetObj));
$oLinkedNode->SetAttribute('obj_class_name', htmlspecialchars(MetaModel::GetName(get_class($oTargetObj))));
$oLinkedNode->SetAttribute('name', htmlspecialchars($oTargetObj->GetRawName())); // htmlentities is too much for XML
$oLinkedNode->SetAttribute('icon', BuildIconPath($oTargetObj->GetIcon(false /* No IMG tag */)));
AddNodeDetails($oLinkedNode, $oTargetObj);
$oSubLinks = $oXmlDoc->CreateElement('links');
// Recurse
GetRelatedObjectsAsXml($oTargetObj, $sRelationName, $oSubLinks, $oXmlDoc, $oLinkedNode, $iDepth++, $aExcludedClasses);
$oLinkingNode->AppendChild($oLinkedNode);
$oLinks->AppendChild($oLinkingNode);
$bAddLinks = true;
}
}
}
}
if (count($aResults) > 0)
if ($bAddLinks)
{
$oXmlNode->AppendChild($oLinks);
}
@@ -117,6 +126,9 @@ $id = utils::ReadParam('id', 1);
$sRelation = utils::ReadParam('relation', 'impacts');
$aValidRelations = MetaModel::EnumRelations();
$sFormat = utils::ReadParam('format', 'xml');
$sExcludedClasses = utils::ReadParam('exclude', '', false, 'raw_data');
$aExcludedClasses = explode(',', $sExcludedClasses);
if (!in_array($sRelation, $aValidRelations))
{
@@ -167,7 +179,7 @@ try
$oXmlRoot->SetAttribute('position', 'left');
$oXmlRoot->SetAttribute('title', MetaModel::GetRelationDescription($sRelation).' '. htmlspecialchars($oObj->GetRawName()));
GetRelatedObjectsAsXml($oObj, $sRelation, $oLinks, $oXmlDoc, $oXmlNode);
GetRelatedObjectsAsXml($oObj, $sRelation, $oLinks, $oXmlDoc, $oXmlNode, 0, $aExcludedClasses);
$oXmlRoot->AppendChild($oXmlNode);
$oXmlDoc->AppendChild($oXmlRoot);

View File

@@ -122,8 +122,8 @@ function SelectService($oP, $oUserOrg)
{
$sChecked = "checked";
}
$oP->p("<tr><td style=\"vertical-align:top\"><p><input name=\"attr_service_id\" $sChecked type=\"radio\" id=\"svc_$id\" value=\"$id\"></p></td><td style=\"vertical-align:top\"><p><b><label for=\"svc_$id\">".htmlentities($oService->GetName(), ENT_QUOTES, 'UTF-8')."</label></b></p>");
$oP->p("<p>".htmlentities($oService->Get('description'), ENT_QUOTES, 'UTF-8')."</p></td></tr>");
$oP->p("<tr><td style=\"vertical-align:top\"><p><input name=\"attr_service_id\" $sChecked type=\"radio\" id=\"svc_$id\" value=\"$id\"></p></td><td style=\"vertical-align:top\"><p><b><label for=\"svc_$id\">".$oService->GetName()."</label></b></p>");
$oP->p("<p>".$oService->Get('description')."</p></td></tr>");
}
$oP->add("</table>\n");
DumpHiddenParams($oP, array('service_id'), $aParameters);
@@ -163,7 +163,7 @@ function SelectSubService($oP, $oUserOrg)
if (is_object($oService))
{
$oP->add("<div class=\"wizContainer\" id=\"form_select_servicesubcategory\">\n");
$oP->add("<h1 id=\"select_subcategory\">".Dict::Format('Portal:SelectSubcategoryFrom_Service', htmlentities($oService->GetName(), ENT_QUOTES, 'UTF-8'))."</h1>\n");
$oP->add("<h1 id=\"select_subcategory\">".Dict::Format('Portal:SelectSubcategoryFrom_Service', $oService->GetName())."</h1>\n");
$oP->add("<form id=\"request_form\" method=\"get\">\n");
$oP->add("<table>\n");
while($oSubService = $oSet->Fetch())
@@ -174,8 +174,8 @@ function SelectSubService($oP, $oUserOrg)
{
$sChecked = "checked";
}
$oP->p("<tr><td style=\"vertical-align:top\"><p><input name=\"attr_servicesubcategory_id\" $sChecked type=\"radio\" id=\"subsvc_$id\" value=\"$id\"></p></td><td style=\"vertical-align:top\"><p><b><label for=\"subsvc_$id\">".htmlentities($oSubService->GetName(), ENT_QUOTES, 'UTF-8')."</label></b></p>");
$oP->p("<p>".htmlentities($oSubService->Get('description'), ENT_QUOTES, 'UTF-8')."</p></td></tr>");
$oP->p("<tr><td style=\"vertical-align:top\"><p><input name=\"attr_servicesubcategory_id\" $sChecked type=\"radio\" id=\"subsvc_$id\" value=\"$id\"></p></td><td style=\"vertical-align:top\"><p><b><label for=\"subsvc_$id\">".$oSubService->GetName()."</label></b></p>");
$oP->p("<p>".$oSubService->Get('description')."</p></td></tr>");
}
$sMessage = Dict::S('Portal:PleaseSelectAServiceSubCategory');
$oP->add_ready_script(
@@ -220,9 +220,9 @@ function RequestCreationForm($oP, $oUserOrg)
$oRequest->Set('servicesubcategory_id', $aParameters['servicesubcategory_id']);
$oAttDef = MetaModel::GetAttributeDef('UserRequest', 'service_id');
$aDetails[] = array('label' => '<span>'.$oAttDef->GetLabel().'</span>', 'value' => htmlentities($oService->GetName(), ENT_QUOTES, 'UTF-8'));
$aDetails[] = array('label' => '<span>'.$oAttDef->GetLabel().'</span>', 'value' => $oService->GetName());
$oAttDef = MetaModel::GetAttributeDef('UserRequest', 'servicesubcategory_id');
$aDetails[] = array('label' => '<span>'.$oAttDef->GetLabel().'</span>', 'value' => htmlentities($oSubService->GetName(), ENT_QUOTES, 'UTF-8'));
$aDetails[] = array('label' => '<span>'.$oAttDef->GetLabel().'</span>', 'value' => $oSubService->GetName());
$iFlags = 0;
foreach($aList as $sAttCode)
{
@@ -245,8 +245,9 @@ function RequestCreationForm($oP, $oUserOrg)
}
$aArgs = array('this' => $oRequest);
$aFieldsMap[$sAttCode] = 'attr_'.$sAttCode;
$sValue = $oRequest->GetFormElementForField($oP, get_class($oRequest), $sAttCode, $oAttDef, $value, '', 'attr_'.$sAttCode, '', $iFlags, $aArgs);
$sInputId = 'attr_'.$sAttCode;
$aFieldsMap[$sAttCode] = $sInputId;
$sValue = "<span id=\"field_{$sInputId}\">".$oRequest->GetFormElementForField($oP, get_class($oRequest), $sAttCode, $oAttDef, $value, '', 'attr_'.$sAttCode, '', $iFlags, $aArgs).'</span>';
$aDetails[] = array('label' => '<span>'.$oAttDef->GetLabel().'</span>', 'value' => $sValue);
}
if (!class_exists('AttachmentPlugIn'))
@@ -289,7 +290,7 @@ function RequestCreationForm($oP, $oUserOrg)
$oP->add("</div>\n");
$iFieldsCount = count($aFieldsMap);
$sJsonFieldsMap = json_encode($aFieldsMap);
$oP->add_ready_script(
$oP->add_script(
<<<EOF
// Create the object once at the beginning of the page... no state specified => new
var oWizardHelper = new WizardHelper('UserRequest', '');

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