Compare commits

...

208 Commits

Author SHA1 Message Date
Denis Flaven
7ea76869f4 Bug fix: subsequent audit results were wrong when a 'negative' rule was used. Same fix as change [1560] in trunk
SVN:1.1[1649]
2011-10-27 16:43:23 +00:00
Denis Flaven
8fe5450d9e Fixed Trac #492: bulk modify resets the linksets
SVN:1.1[1631]
2011-10-12 19:44:40 +00:00
Denis Flaven
b732673b65 Fix for Trac #434: new class of Trigger: TriggerOnPortalUpdate
SVN:1.1[1442]
2011-08-09 14:46:16 +00:00
Denis Flaven
05c709056b Fixed Trac #433: Incorrect triggers created for the Data Synchro when the iTop uses a prefix for the tables.
SVN:1.1[1373]
2011-07-26 16:49:33 +00:00
Denis Flaven
8e7f629923 - Fixed Trac #429: web browser can crash when a text field contains several times the same URL !!!
SVN:1.1[1338]
2011-07-06 17:13:28 +00:00
Denis Flaven
92b3434954 - Fix for bug #420: error message too long
- Fix for bug #424: error when processing unmodified replicas

SVN:1.1[1331]
2011-07-05 13:27:26 +00:00
Romain Quetiez
71d3a9e443 Fix for #427 implemented into branch 1.1 (delete all team members)
SVN:1.1[1330]
2011-07-05 09:38:04 +00:00
Romain Quetiez
f6aeeb0aaa Branching 1.1 for patching until 1.2 gets released
SVN:1.1[1329]
2011-07-05 09:04:40 +00:00
Romain Quetiez
48ab6cb737 Created tag for release 1.1.0 build 181
SVN:1.1[1266]
2011-05-04 12:30:41 +00:00
Denis Flaven
8b0214eeee Preparing for the 1.1 release.
SVN:trunk[1265]
2011-05-04 08:56:59 +00:00
Denis Flaven
c6454c5a8e Completed the Portuguese/Brazilian translation, thanks to Marco Tulio !
SVN:trunk[1264]
2011-05-02 15:36:32 +00:00
Denis Flaven
6fd3bdbef4 Final touch to the 1.1 build: readme "touch" and "doc" review.
SVN:trunk[1263]
2011-05-02 13:18:12 +00:00
Denis Flaven
4a12c531e6 Last finishing touch to the Italian localization. Now 100% complete !
SVN:trunk[1262]
2011-05-02 13:06:37 +00:00
Denis Flaven
df086c8ce2 - Better display of the "Resolved Request" form, where the user can submit their satisfaction & feedbacks. Now aligned with the display of the ticket's details.
SVN:trunk[1261]
2011-05-02 12:58:32 +00:00
Romain Quetiez
d66e413289 Typo in french dictionary
SVN:trunk[1260]
2011-05-02 12:37:14 +00:00
Romain Quetiez
938d383efd #379 GetAbsoluteUrlRoot becomes GetAbsoluteUrlAppRoot which will simplify the development of plugins, fixed a cosmetic issue in export.php (format: html + iTop not installed in the url root path)
SVN:trunk[1259]
2011-05-02 09:34:45 +00:00
Romain Quetiez
cc35e41028 Ooooops -removed debugging traces
SVN:trunk[1258]
2011-05-02 08:48:46 +00:00
Denis Flaven
0771fd0636 Completion of the Italian localization !
SVN:trunk[1257]
2011-04-29 14:26:17 +00:00
Denis Flaven
e4fa7ba983 Properly manage carriage returns/line feeds in CaseLog records.
SVN:trunk[1256]
2011-04-29 13:57:46 +00:00
Denis Flaven
109e8f6157 Undoing previous commit - keep the old icon, shouldn't have been changed.
SVN:trunk[1255]
2011-04-29 13:53:37 +00:00
Romain Quetiez
99bce469a1 CSV import: regression due to a recent enhancement (labels) and the fact that some labels are redundant (e.g. "Location" used both for Server/location_id and Server/location_name
SVN:trunk[1254]
2011-04-29 12:30:56 +00:00
Denis Flaven
e439797767 Fixed Character encoding issues in the Hungarian translation.
SVN:trunk[1253]
2011-04-29 09:48:56 +00:00
Denis Flaven
7f17acf553 Added Hungarian translation (and fixed the default dictionaries for Italian as well).
SVN:trunk[1252]
2011-04-28 17:23:45 +00:00
Denis Flaven
5e64834b06 Fixed Trac #301: don't force users back into the portal if they are not "portal" users.
SVN:trunk[1251]
2011-04-28 15:43:44 +00:00
Romain Quetiez
79fbec3675 Readme updated with latest fixes
SVN:trunk[1250]
2011-04-28 15:41:46 +00:00
Denis Flaven
f4e796f607 Implemented Trac #347: Allow portal users to update their tickets by adding a comment which gets appended to the log.
SVN:trunk[1249]
2011-04-28 15:31:22 +00:00
Romain Quetiez
0d710d0464 #355 (continuation of the fix) import.php to support localized names in the specification of reconciliation keys, and allowing to specify an external key though it is given as an external field in the input columns
SVN:trunk[1248]
2011-04-28 14:02:01 +00:00
Romain Quetiez
40701f3f36 Added helper tools to ease the setup of cron.php
SVN:trunk[1247]
2011-04-28 12:02:44 +00:00
Romain Quetiez
fcabb8fc43 CRON default duration set to 10 minutes
SVN:trunk[1246]
2011-04-28 08:47:44 +00:00
Romain Quetiez
4c64419f19 Finalized the doc and readme for release 1.1
SVN:trunk[1245]
2011-04-28 08:44:46 +00:00
Romain Quetiez
c8c388dac5 Using iTop in mode CLI: let PHP display the fatal error "unknown function mysql_connect:
SVN:trunk[1244]
2011-04-28 07:50:22 +00:00
Romain Quetiez
374858ef73 Fixed bug: Web services in CLI mode failing with an error when attempting to include APPROOT
SVN:trunk[1243]
2011-04-28 07:28:40 +00:00
Romain Quetiez
d45149a327 Readme for 1.1 RC (draft)
SVN:trunk[1242]
2011-04-27 08:39:13 +00:00
Denis Flaven
0ea9968797 Fixed Trac #391: Support Agent profile was wrong (no rights to modify UserRequest tickets).
SVN:trunk[1241]
2011-04-27 08:06:13 +00:00
Denis Flaven
b68ac3916f Aligned the display of the case log (and properties) of a ticket in the User Portal to what is done in the normal UI: better look (multi-column, fieldsets, wider case log at the bottom).
SVN:trunk[1240]
2011-04-26 16:49:28 +00:00
Romain Quetiez
e5c46340d1 Plugin API: added OnIsModified()
SVN:trunk[1239]
2011-04-26 16:03:01 +00:00
Romain Quetiez
1e6887062f Data synchro: added the support of link sets (to import user accounts)
SVN:trunk[1238]
2011-04-26 15:29:16 +00:00
Romain Quetiez
fc0f6b636e Data sync: fixed issue with the check while creating a new data source (depending on the target class)
SVN:trunk[1237]
2011-04-26 15:24:13 +00:00
Denis Flaven
bcb1864963 Fixed Trac#385: clearing an autocomplete foeld (for instance in a search form) now has an immediate effect.
SVN:trunk[1236]
2011-04-26 13:41:08 +00:00
Denis Flaven
3a1932b742 Typo: double PHP closing tag !
SVN:trunk[1235]
2011-04-26 13:38:56 +00:00
Denis Flaven
438f7f19c0 Italian localization
SVN:trunk[1234]
2011-04-26 13:37:58 +00:00
Denis Flaven
15b8b18b90 Adding Italian localization, thanks to Marialaura Colantoni
SVN:trunk[1233]
2011-04-22 15:59:31 +00:00
Denis Flaven
b9f467f08f Dictionary files that follow the naming convention <Lang>.dict.<ModuleName>.php are now loaded automatically without the need to specify them explicitely in the module definition file.
SVN:trunk[1232]
2011-04-22 15:53:21 +00:00
Denis Flaven
9f779b8dfe English dictionary cleanup/completion.
SVN:trunk[1231]
2011-04-22 15:51:23 +00:00
Denis Flaven
8ce3c48446 New option group_by_expr for "group_by' display blocks (to be used in templates) to specify a PHP expression to use for the group by. This allows to build dashboards where dates are grouped by the day of the month, for example.
SVN:trunk[1230]
2011-04-22 15:49:01 +00:00
Denis Flaven
f84d91e482 Removed the 'bgiframe' javascript , which was designed for fixing IE6 issues only and causes troubles with IE9.
SVN:trunk[1229]
2011-04-22 15:45:19 +00:00
Denis Flaven
c6493f6cdc Dictionary files that follow the naming convention <Lang>.dict.<ModuleName>.php are now loaded automatically without the need to specify them explicitely in the module definition file.
SVN:trunk[1228]
2011-04-22 15:44:50 +00:00
Romain Quetiez
fb87911677 #378 Data Synchro - leave the replica in state 'synchronized' if failing to update (update then delete)
SVN:trunk[1227]
2011-04-22 14:52:33 +00:00
Romain Quetiez
60b2162d84 Data synchro: added notifications in case of error + fixed a bug in the error reporting (reconciliation on null values, last error was not recorded)
SVN:trunk[1226]
2011-04-22 13:54:16 +00:00
Denis Flaven
e42b0513a0 Removed the 'bgiframe' javascript , which was designed for fixing IE6 issues only and causes troubles with IE9.
SVN:trunk[1225]
2011-04-22 13:30:41 +00:00
Romain Quetiez
f92a7df522 Data synchro: added "contact to notify in case of error"
SVN:trunk[1224]
2011-04-21 09:30:30 +00:00
Romain Quetiez
b7bd1a5943 Data synchro: if the object is deleted from within iTop, do cleanup sync table and replica as well
SVN:trunk[1223]
2011-04-21 09:04:34 +00:00
Denis Flaven
69f21b9b79 - English dictionary completion for 1.1 !
SVN:trunk[1222]
2011-04-20 16:11:47 +00:00
Romain Quetiez
6614a90e38 Wiki formatting: automatic detection of urls
SVN:trunk[1221]
2011-04-20 11:47:21 +00:00
Romain Quetiez
88a29fd8d1 #370 standard argument for CLI/REST services: param_file
SVN:trunk[1220]
2011-04-19 15:48:39 +00:00
Denis Flaven
7e2982b848 Added methods to trace the completion of the localization.
SVN:trunk[1219]
2011-04-19 13:22:18 +00:00
Denis Flaven
ed5d59153b Update/cleanup to the French dictionary.
SVN:trunk[1218]
2011-04-19 13:21:01 +00:00
Romain Quetiez
ab3fd7f1b4 Internal: keep track of class declaration source files
SVN:trunk[1217]
2011-04-19 12:22:32 +00:00
Denis Flaven
6e685feb9f Fixed the creation of the "Portal" profile that now behaves like a standard profile and therefore requires the proper rights.
SVN:trunk[1216]
2011-04-13 13:11:51 +00:00
Denis Flaven
d8c5f26aed Fix for IE8: On IE <button type="submit"> does not submit the form if an onClick action is specified !
SVN:trunk[1215]
2011-04-13 09:53:59 +00:00
Romain Quetiez
ada0b310ae cron.php - Fixed error message
SVN:trunk[1214]
2011-04-13 09:16:37 +00:00
Denis Flaven
1f43ba3654 Oops: missing file in the commit.
SVN:trunk[1213]
2011-04-13 09:16:07 +00:00
Denis Flaven
cb1628c759 Documentation updated for the 1.1-beta release. Still to be finalized for 1.1-RC.
SVN:trunk[1212]
2011-04-12 13:09:46 +00:00
Romain Quetiez
605edc261d Readme file ok for the Beta
SVN:trunk[1211]
2011-04-12 13:04:20 +00:00
Denis Flaven
46e7bbe2c8 Bug fix: prevent (infinite) recursion when building search form with external keys, that point to search form with external keys, etc...
Now support nested search dialogs properly...

SVN:trunk[1210]
2011-04-12 09:37:52 +00:00
Romain Quetiez
a6ac44204c Readme for 1.1 beta (draft)
SVN:trunk[1209]
2011-04-12 08:51:10 +00:00
Denis Flaven
af63233fac Styles fix for IE8.
SVN:trunk[1208]
2011-04-11 16:18:20 +00:00
Romain Quetiez
b1b913d891 Fixed mix btw French and English dictionaries (regression)
SVN:trunk[1207]
2011-04-11 16:18:14 +00:00
Denis Flaven
be5bbdf26c IE8 bug: one comma too many !
SVN:trunk[1206]
2011-04-11 16:17:25 +00:00
Denis Flaven
b03e9a969c Relative path to the setup's documentation.
SVN:trunk[1205]
2011-04-11 12:35:48 +00:00
Denis Flaven
c56c662be7 French translation cleanup: removed the doubled backslahes \\
SVN:trunk[1204]
2011-04-11 12:13:20 +00:00
Denis Flaven
6d34c2aa93 - Partial bug fix: enhancement to support extkey widgets (autocomplete) in nested search forms... still not completely fixed, bug showing some progress.
SVN:trunk[1203]
2011-04-11 12:11:57 +00:00
Denis Flaven
af20723c8c Fix the display width of case logs. Make sure that the field wraps even in case of very long strings inside the field.
SVN:trunk[1202]
2011-04-11 11:54:15 +00:00
Denis Flaven
35f09c3091 Don't use removed a field !
SVN:trunk[1201]
2011-04-11 10:27:12 +00:00
Denis Flaven
5f04a54df3 Profiles adjustements: make some links delete-able by Service Mgrs and Problem Mgrs.
SVN:trunk[1200]
2011-04-11 09:20:57 +00:00
Denis Flaven
19bbde6144 - Cleanup of the dictionary usage.
- Improvements to the French translation.

SVN:trunk[1199]
2011-04-11 09:11:00 +00:00
Denis Flaven
6fe81320c0 - English dictionary completion.
SVN:trunk[1198]
2011-04-11 08:39:18 +00:00
Erwan Taloc
d1c808b2c3 Update change Mgmt Module to display properly fields
Update French dictionary for Problem Management

SVN:trunk[1197]
2011-04-08 13:02:09 +00:00
Erwan Taloc
e3697c37f3 Mise à jour DEL MANUAL for SoftwareInstances
SVN:trunk[1196]
2011-04-08 12:42:18 +00:00
Denis Flaven
a9c6d81130 - Dictionary entries (partial) for the SynchroDataSource objects
SVN:trunk[1195]
2011-04-08 12:26:05 +00:00
Romain Quetiez
8ff40fb4b8 Deletion: entirely reviewed to take into account the objects being synchronized by an external data source, or the plugins constraints.
SVN:trunk[1194]
2011-04-08 11:29:25 +00:00
Denis Flaven
037d6cc4ba - Special handling (using some custom code - temporary solution) of the 'ticket_log' attribute: the attribute is displayed at the bottom of the "Properties" page and takes the whole width of the page.
SVN:trunk[1193]
2011-04-08 10:22:18 +00:00
Denis Flaven
4b1726c1ca Proper display of the menu !
SVN:trunk[1192]
2011-04-08 10:09:52 +00:00
Erwan Taloc
0fac58248e Update Display for tickets.
Add naming convention for Person and Database Instances

SVN:trunk[1191]
2011-04-07 19:09:42 +00:00
Denis Flaven
3a486f8edd - Adjusted the default ITIL profiles definitions
SVN:trunk[1190]
2011-04-07 16:12:07 +00:00
Denis Flaven
4fefaa5658 Make sure that we initialize the list of modules with just the default config and not the previous config. Setup now supports removing modules (even if the actual data are NOT removed from the database, yet).
SVN:trunk[1189]
2011-04-07 08:22:57 +00:00
Denis Flaven
65ef621e6f - Bug fix: Bulk modify was failing on a list of tickets in different states.
SVN:trunk[1188]
2011-04-07 07:47:28 +00:00
Denis Flaven
1a818f309d - Revised styles for a nicer/cleaner display of the details and forms.
SVN:trunk[1187]
2011-04-07 07:44:09 +00:00
Denis Flaven
1a74fe1ec3 Bug fix: when doing a bulk modify (or bulk apply stimulus) the external keys that were read-only in the edition form were displayed as "ClassName #id" instead of using their friendly name. This is now fixed, but requires a load of the target object.
SVN:trunk[1186]
2011-04-06 19:13:08 +00:00
Denis Flaven
089a9fcf4a - Make sure that the data (smaples and structure) from hidden modules are loaded as well. (Symptom: sample EmailNotifications were not loaded)
- Make sure that the "synchrodatasource" file gets loaded as part of the "standard" app modules, even when upgrading "in-place" an existing iTop configuration file.

SVN:trunk[1185]
2011-04-06 18:42:27 +00:00
Denis Flaven
e1df33c7d0 - Make the triggers and email action search-able and export/import-able using the standard user interface.
SVN:trunk[1184]
2011-04-06 18:40:22 +00:00
Denis Flaven
ee0fcdd42e Fixed Trac #371: popup dialog's dimensions (welcome screen and create or lookup dialogs) are now adjusted to fit into the screen.
SVN:trunk[1183]
2011-04-06 18:21:43 +00:00
Denis Flaven
7908b87881 - Make sure that the search form preserves it's "action" (i.e. target page) when reloading (when specifying a derived class). This was breaking the UniversalSearch page.
- Prepare for the style cleanup
- Don't display the menu to create a new 'Email Notification" when listing the notifications sent on a ticket (in the Notifications tab) !

SVN:trunk[1182]
2011-04-06 16:39:42 +00:00
Denis Flaven
8e359682ae - Make the navigation (Back / Cancel) work properly on bulk actions.
- Prepare for the style cleanup.

SVN:trunk[1181]
2011-04-06 16:34:44 +00:00
Denis Flaven
8f2089e1f6 - Fixed an error appearing only for non admins.
- Admin menu should never appear for non-admins, even empty
- Synchro Data Source objects are for admins only

SVN:trunk[1180]
2011-04-06 15:18:59 +00:00
Denis Flaven
8d61af3d22 Adjusting the French translation.
SVN:trunk[1179]
2011-04-06 09:43:35 +00:00
Denis Flaven
5e234eefe9 Special class/style for form details.
SVN:trunk[1178]
2011-04-05 13:42:43 +00:00
Romain Quetiez
25c529a797 #359 Dehardcoded the timezone (while preserving 'Europe/Paris' as the default)
SVN:trunk[1177]
2011-04-05 12:22:38 +00:00
Denis Flaven
446a8f74fb Enhancement of the forms presentation.
SVN:trunk[1176]
2011-04-05 12:13:44 +00:00
Denis Flaven
144af46e8b Fixed Track #375: Display scroll bars appropriately when dealing with big CSV load jobs.
SVN:trunk[1175]
2011-04-04 17:19:09 +00:00
Romain Quetiez
d33217285a New option: apc_cache.query_ttl (defaults to 3600s)
SVN:trunk[1174]
2011-04-04 16:20:18 +00:00
Romain Quetiez
6ff5b499b0 AttributeCaseLog finalized (history, easy migration of AttributeText, wiki formatting)
SVN:trunk[1173]
2011-04-04 14:15:33 +00:00
Denis Flaven
0c084c0b17 Delayed startup for all non-important javascript effects to speed-up the display of the pages.
SVN:trunk[1172]
2011-04-04 14:11:07 +00:00
Romain Quetiez
36dd9fc05e New option: apc_cache.enabled = true by default (beta)
SVN:trunk[1171]
2011-04-04 14:04:30 +00:00
Denis Flaven
4febe204e1 - Finishing touch to the DataExchange: various cosmetic fixes
SVN:trunk[1170]
2011-04-04 13:03:11 +00:00
Denis Flaven
9e2c556805 Load the config before using it !
SVN:trunk[1169]
2011-04-04 10:18:03 +00:00
Denis Flaven
3a0be981d6 Added the detection & logging of APC.
SVN:trunk[1168]
2011-04-04 09:57:35 +00:00
Romain Quetiez
44f661cea4 APC cache: fixed an issue with cache reset
SVN:trunk[1167]
2011-04-04 08:58:59 +00:00
Denis Flaven
195c1dabf8 New type of Attribute "CaseLog" (under construction !)
SVN:trunk[1166]
2011-04-04 08:37:30 +00:00
Denis Flaven
ce13b05363 Fixed Trac#367: typo !
SVN:trunk[1165]
2011-04-01 10:48:11 +00:00
Denis Flaven
be4674de11 Fixed Trac#368: (regression compared to 1.0.2) textarea was too small when exporting a list as CSV.
SVN:trunk[1164]
2011-04-01 10:43:07 +00:00
Denis Flaven
911d4177cc - Various fixes an finishing touch to the setup: support of "named" root modules, streamlined back/next processing, cleaner "summary" screen, etc...
SVN:trunk[1163]
2011-04-01 10:02:40 +00:00
Denis Flaven
237e36f562 - Protect against javascript js files being kept in the browser's cache when upgrading an iTop instance.
SVN:trunk[1162]
2011-04-01 09:58:53 +00:00
Romain Quetiez
5fa64ab3d2 Deletion: the message "object deleted" was displayed twice since the last review of the deletion
SVN:trunk[1161]
2011-04-01 07:29:08 +00:00
Romain Quetiez
ad98b8893f Cosmetic: changed error message when dependencies cannot be solved
SVN:trunk[1160]
2011-04-01 07:15:09 +00:00
Romain Quetiez
851b41670e New setup: fixed bug in the HTML (missing Next button on IE8)
SVN:trunk[1159]
2011-03-31 13:03:09 +00:00
Romain Quetiez
d4321ec1ce #366 Global search case sensitive or not working at all (issue with COLLATION)
SVN:trunk[1158]
2011-03-31 08:29:02 +00:00
Denis Flaven
e3ac7067f7 New implementation of the setup:
- All actions are performed asynchronously at the end of the setup
- Supports upgrading and reinstalling (to add modules)

SVN:trunk[1157]
2011-03-30 17:28:01 +00:00
Denis Flaven
eb3d226b3d Change the default collation to be consistent with the DB definition.
SVN:trunk[1156]
2011-03-30 15:37:10 +00:00
Romain Quetiez
5a30986690 Setup: Speedup profiles creation, and implemented incremental update for application upgrade
SVN:trunk[1155]
2011-03-30 08:34:39 +00:00
Romain Quetiez
b423e98295 Optimizations:
- Setup: grouped CREATE TABLE / ALTER TABLE statements in one single CREATE table
- Every page: cache the prepared queries and data model into APC
Cleanup: removed unused verb RegisterPlugin
Fix: GetObject could fail (could not find the reference from within the forum)

SVN:trunk[1154]
2011-03-30 08:30:42 +00:00
Romain Quetiez
bdf46e8136 Optimization in the setup: 10 queries to insert the 1500 action grant records
SVN:trunk[1153]
2011-03-29 14:43:22 +00:00
Romain Quetiez
d4bfa4c48f Optimization in the setup: 10 queries to insert the 1500 action grant records
SVN:trunk[1152]
2011-03-29 14:28:47 +00:00
Romain Quetiez
30a1528a28 Removed the AttributeWikiText which was strictly equivalent to AttributeText
SVN:trunk[1151]
2011-03-29 14:13:16 +00:00
Romain Quetiez
7ae02a7c5b Enablers for the current setup improvements
SVN:trunk[1150]
2011-03-28 14:03:34 +00:00
Denis Flaven
e5682fd2e9 Plug-ins integration: added the ability to manage attachments while creating a new object.
SVN:trunk[1149]
2011-03-25 17:09:50 +00:00
Romain Quetiez
c1b5614268 New verb for application extensions: OnFormCancel
SVN:trunk[1148]
2011-03-25 13:50:49 +00:00
Denis Flaven
5ad7ea1b7b Fixed Trac #365: Give the user some feedback when the password was successfully changed/set. Note that iTop does not check that the new password is different from the old one.
SVN:trunk[1147]
2011-03-24 17:34:00 +00:00
Romain Quetiez
30f4ff8765 Fixed a bug with APC version < 3.0.7
SVN:trunk[1146]
2011-03-24 17:01:59 +00:00
Denis Flaven
bec8b57fe1 Implementation of bulk modify and bulk apply stimulus... to be tested !
SVN:trunk[1145]
2011-03-23 16:22:35 +00:00
Romain Quetiez
9b50124513 Dev: improved performance measure tooling
SVN:trunk[1144]
2011-03-23 14:09:51 +00:00
Denis Flaven
c9b4468f17 Experimental support of APC to speed-up the application.
SVN:trunk[1143]
2011-03-23 14:09:39 +00:00
Romain Quetiez
3790c8f7d5 Fixed a regression in the deletion (and simplified the algorithm, though more queries will be issued)
SVN:trunk[1142]
2011-03-23 08:38:49 +00:00
Romain Quetiez
8f4ee29c69 #362 New capability for attributes derived from AttributeString: specify a validation_pattern (regexp)
SVN:trunk[1141]
2011-03-21 16:06:41 +00:00
Romain Quetiez
cf737bb8ad Added a query usage example with REGEXP
SVN:trunk[1140]
2011-03-21 15:28:31 +00:00
Romain Quetiez
a222b33566 CRON - admin only + queues with timer (field 'planned')
SVN:trunk[1139]
2011-03-21 15:17:08 +00:00
Romain Quetiez
78396eafe3 Cron - enabled mode CLI
SVN:trunk[1138]
2011-03-21 11:41:08 +00:00
Romain Quetiez
de5ccf5908 Background processes - API ready for periodicity management
SVN:trunk[1137]
2011-03-21 11:17:42 +00:00
Romain Quetiez
c3bd0b1b9e Check SLA for tickets, integrated into the internal CRON architecture (and moved into the Tickets module)
SVN:trunk[1136]
2011-03-21 10:57:37 +00:00
Romain Quetiez
736247f6e1 Email sent in asynchronous mode: forgot cron.php
SVN:trunk[1135]
2011-03-18 12:17:04 +00:00
Romain Quetiez
3074683274 Email sent in asynchronous mode: forgot two files...
SVN:trunk[1134]
2011-03-18 12:13:04 +00:00
Denis Flaven
4929f94c20 Protect the output of the config file against values containing quotes.
SVN:trunk[1133]
2011-03-18 11:22:23 +00:00
Romain Quetiez
b8b20f82d7 Email sent in asynchronous mode (established the base for an application internal CRON, task queue, etc.) with adjustable configuration (disable by default). Also improved the OQL: IS_NULL() and REGEXP have been added.
SVN:trunk[1132]
2011-03-18 11:15:09 +00:00
Romain Quetiez
7989cf622f CSV import: fixed a few issues (restricted to N-N links) + added arguments to the export page, to allow for exporting N-N links
SVN:trunk[1130]
2011-03-15 12:19:04 +00:00
Romain Quetiez
f3cc490295 #328 Added the capability to import/export link sets in CSV format
SVN:trunk[1129]
2011-03-14 14:11:08 +00:00
Romain Quetiez
52a47b193d #360 Wrong COUNT when using JOINS (+ other conditions)
SVN:trunk[1128]
2011-03-11 17:47:03 +00:00
Denis Flaven
cfbf77544e Adjust the relative path to 'ajax.render.php' so that it can be called from the portal pages as well.
SVN:trunk[1125]
2011-03-11 11:11:56 +00:00
Romain Quetiez
0b32f511b8 Plugin API - alpha version
SVN:trunk[1124]
2011-03-11 11:04:50 +00:00
Denis Flaven
bca713a964 Search forms enhancement: when a search criteria is an external (foreign) key, use an autocomplete instead of of drop-down list, when the number of different values is too big, as in other forms.
SVN:trunk[1123]
2011-03-09 16:39:58 +00:00
Romain Quetiez
692f7060ea #355 CSV Import (non interactive) now supporting localized column headers, making it possible to import directly data generated by the interactive export. NOTE: to achieve this, the default separator is now the coma (whereas the default separator in XCel sheets is the semicolumn)
SVN:trunk[1122]
2011-03-09 09:19:03 +00:00
Romain Quetiez
4fa9933dc7 #340 Fixed OQL parsing issue - parameters in IN()/NOT IN() clauses
SVN:trunk[1121]
2011-03-08 15:51:11 +00:00
Denis Flaven
45134e182d Fixed Trac#313: Provider contracts are filtered on the 'provider_id' - for filtering in the UI via the drop-down list of Organizations and for the security profiles ("Allowed Organizations"). The mapping for 'org_id', if any, is now taken into account by the security.
SVN:trunk[1120]
2011-03-08 12:31:16 +00:00
Romain Quetiez
38a502aa25 #271 Internal - Removed a workaround made unnecessary with fix [1108]
SVN:trunk[1119]
2011-03-08 12:23:04 +00:00
Denis Flaven
49e05acd4b Fixed Trac #156: make sure the hierarchical ZLists are supported everywhere (final cleanup).
SVN:trunk[1118]
2011-03-08 11:19:38 +00:00
Denis Flaven
089407119b Thanks to Schlobinux for the fix of Trac#336.
SVN:trunk[1117]
2011-03-08 10:52:58 +00:00
Denis Flaven
6262fa1d26 Fix Trac #336: verification of the directory of the temporary config file was wrong... however the script still assumes that the temporary config file and the final one are stored in the same place... at the root of the iTop installation.
SVN:trunk[1116]
2011-03-08 10:48:35 +00:00
Romain Quetiez
c4cca2b2f8 #348 Multi-column queries not working fine with open joins and if null values to be displayed
SVN:trunk[1115]
2011-03-08 10:46:03 +00:00
Denis Flaven
d5353c111c Fixed Trac#356 (Audit results filtered by context) and #357 (Audit results list not expandable)
SVN:trunk[1114]
2011-03-08 10:31:13 +00:00
Denis Flaven
fd79d30483 Fixed Trac #353: no menu for DBServerInstance objects.
SVN:trunk[1113]
2011-03-07 17:12:30 +00:00
Denis Flaven
d708ef585b Fixed Trac#344: default search behavior for enumerated attributes (and similar types: 'Class', 'Language' and 'FinalClass') is now a strict '=' instead of 'contains'.
SVN:trunk[1112]
2011-03-07 17:06:17 +00:00
Romain Quetiez
6ac06d7e47 #352 Web Service CreateTicket: Search the service subcategory given the found service_id (if not already specified)
SVN:trunk[1111]
2011-03-07 16:58:46 +00:00
Romain Quetiez
019888caff #305 Specified the charset in any call to htmlentities()
SVN:trunk[1110]
2011-03-07 16:43:20 +00:00
Romain Quetiez
e36646a3e6 Fixed undocumented issue: in read-only mode, stimulus where still allowed
SVN:trunk[1109]
2011-03-07 16:40:26 +00:00
Romain Quetiez
8b6672c0dd Data Exchange - Fixed issue in DBObjectSet, doubling the count of SynchroAttribute initially created
SVN:trunk[1108]
2011-03-03 08:34:24 +00:00
Denis Flaven
3d4e76d8b0 Synchro Data Sources Implementation on going...
SVN:trunk[1107]
2011-03-02 17:06:56 +00:00
Romain Quetiez
cf8174d54e Data Exchange - Improved to allow the import of complex attributes like passwords and documents + few fixes
SVN:trunk[1106]
2011-03-02 14:38:12 +00:00
Denis Flaven
33f1ec8bf3 Data Exchange implementation in progress...
SVN:trunk[1105]
2011-03-02 10:49:12 +00:00
Denis Flaven
be1d8674f3 Data Exchange implementation in progress...
SVN:trunk[1104]
2011-03-02 09:12:15 +00:00
Romain Quetiez
76b5bfb19e Data Exchange - Cleanup
SVN:trunk[1103]
2011-03-01 16:33:09 +00:00
Romain Quetiez
bddb8b4c92 Data Exchange - Format and save traces (config option: synchro_trace)
SVN:trunk[1102]
2011-03-01 16:21:04 +00:00
Romain Quetiez
67f8ddf5a8 Data Exchange - Implemented reconciliation on external keys
SVN:trunk[1101]
2011-03-01 13:47:09 +00:00
Denis Flaven
f3f2eb5c79 Synchro Data Sources Implementation on going...
SVN:trunk[1100]
2011-03-01 09:01:44 +00:00
Romain Quetiez
a1b9bdaf66 Data Exchange - Improved handling of deletion (inc. the reporting of it)
SVN:trunk[1099]
2011-02-25 17:22:51 +00:00
Denis Flaven
e020bad17d Synchro Data Sources Implementation on going...
SVN:trunk[1098]
2011-02-24 18:45:13 +00:00
Romain Quetiez
36278d59a8 Data Exchange - Implemented checks on sync startup (user identity, task state, protection against entire obsolescence) and added a "last error" into the logs
SVN:trunk[1097]
2011-02-24 17:21:48 +00:00
Denis Flaven
20d0d33b60 Synchro Data Sources Implementation on going...
SVN:trunk[1096]
2011-02-24 17:09:50 +00:00
Romain Quetiez
573712e9af Data Exchange - Fixed issue when a field is selected for reconciliation but not for update
SVN:trunk[1095]
2011-02-24 15:37:21 +00:00
Romain Quetiez
5897ae5bb9 Data Exchange - Simulation in synchro_import.php now relying on MySQL transactions
SVN:trunk[1094]
2011-02-24 08:47:46 +00:00
Romain Quetiez
cd71f02fad Data Exchange - Implemented reconciliation options + cosmetics on synchro_exec
SVN:trunk[1093]
2011-02-23 17:32:21 +00:00
Denis Flaven
e4df8c8c92 Added synchron statistics and their first display...
SVN:trunk[1092]
2011-02-23 16:49:00 +00:00
Romain Quetiez
d1879d0433 Data Exchange - Simulate mode on synchro_exec + cleanup in traces + handling of null values
SVN:trunk[1091]
2011-02-23 14:55:51 +00:00
Denis Flaven
9e636b1ce5 New display of the "Synchro status/log"
SVN:trunk[1090]
2011-02-23 14:37:23 +00:00
Denis Flaven
cccea50159 Added an extra parameter 'simulate'
SVN:trunk[1089]
2011-02-22 15:21:40 +00:00
Romain Quetiez
3441911781 Fixed regression on AttributeInteger
SVN:trunk[1088]
2011-02-22 14:26:00 +00:00
Romain Quetiez
c97f4d5ee7 Data Exchange - Log statistics
SVN:trunk[1087]
2011-02-22 14:20:46 +00:00
Romain Quetiez
4c637548ac Fixed regression in the audit (new way to translate OQL expression having an impact on DBObjectSearch::MergeWith)
SVN:trunk[1086]
2011-02-21 16:35:47 +00:00
Denis Flaven
721ca8c652 Continuing the implementation of the DataExchange
SVN:trunk[1085]
2011-02-16 17:31:32 +00:00
Romain Quetiez
293877d78a Data Exchange - Replica objects must not be derived from cmdbAbstractObject
SVN:trunk[1084]
2011-02-11 13:15:41 +00:00
Romain Quetiez
d92f89fbe6 Data Exchange - Finalized deletion, changed the definition of attributes (update/reconcile), added an automated test
SVN:trunk[1083]
2011-02-11 09:01:16 +00:00
Romain Quetiez
1da6a264d0 Automatic deletion of links lnkSolutionToCI
SVN:trunk[1082]
2011-02-10 15:13:24 +00:00
Denis Flaven
89b58d44cd Removed a "assertion failed" error message.
SVN:trunk[1080]
2011-02-09 09:44:00 +00:00
Denis Flaven
0b93e6f79e Fixed an incorrect detection of the maximum recursion level
SVN:trunk[1079]
2011-02-08 16:25:18 +00:00
Denis Flaven
eb0ba24d7d - Data Exchange implementation... in progress.
SVN:trunk[1078]
2011-02-08 13:34:47 +00:00
Romain Quetiez
64521eb758 Fixed regression (implementation of the data exchange)
SVN:trunk[1074]
2011-02-07 16:29:49 +00:00
Denis Flaven
2d65325f6f New configuration setting (and new class of Log objects) to keep track of the application's usage: an entry in the log is added each time a user connects to the application. (This feature is disabled by default)
SVN:trunk[1073]
2011-02-07 15:55:39 +00:00
Denis Flaven
a97238c3cd Fixed Trac #351: undefined variable sClass...
SVN:trunk[1072]
2011-02-07 15:51:24 +00:00
Romain Quetiez
ce993b60e4 Data Exchange - Removed the state 'deleted': instead, delete the replica!
SVN:trunk[1068]
2011-02-03 16:39:58 +00:00
Romain Quetiez
283f7dc9f8 CSV import web service - cosmetics on the reporting in case the data set is empty
SVN:trunk[1067]
2011-02-03 15:50:48 +00:00
Romain Quetiez
4441fb41b9 Data Exchange - Fixed a corner case issue (a replica going directly from new to obsolete, then touched again -> back into the picture)
SVN:trunk[1066]
2011-02-03 15:36:37 +00:00
Romain Quetiez
34322045df Data Exchange - forgot a change in the previous commit
SVN:trunk[1065]
2011-02-03 09:57:47 +00:00
Romain Quetiez
b73da47775 Data Exchange - new web service to update data tables
SVN:trunk[1064]
2011-02-03 09:55:17 +00:00
Denis Flaven
3d8ffba2fa Mention that the database user must have the "CREATE VIEW and TRIGGER" privileges for the setup to work fine.
SVN:trunk[1063]
2011-02-03 09:41:32 +00:00
Denis Flaven
f9a380b12d DataExchange: implementation in progress.
SVN:trunk[1062]
2011-02-02 14:48:45 +00:00
Romain Quetiez
a9a530a2cb Core: Join any table to an OQL query (prerequisite to Data Exchange)
SVN:trunk[1061]
2011-02-01 16:54:10 +00:00
Romain Quetiez
ba822a655e Wiki: add links to objects in text attributes
SVN:trunk[1060]
2011-02-01 13:40:51 +00:00
Romain Quetiez
20ec91e9f3 Data ExchangeData Exchange - data structure (ready for sync)
SVN:trunk[1059]
2011-02-01 12:56:26 +00:00
Romain Quetiez
735a9729c0 Data Exchange - data structure
SVN:trunk[1058]
2011-01-31 15:53:07 +00:00
Romain Quetiez
1a52f4de72 #149 Implemented friendly names
SVN:trunk[1057]
2011-01-26 09:43:35 +00:00
196 changed files with 28436 additions and 12071 deletions

View File

@@ -27,7 +27,27 @@
define('ADMIN_PROFILE_NAME', 'Administrator');
define('PORTAL_PROFILE_NAME', 'Portal user');
class UserRightsBaseClass extends cmdbAbstractObject
class UserRightsBaseClassGUI extends cmdbAbstractObject
{
// Whenever something changes, reload the privileges
protected function AfterInsert()
{
UserRights::FlushPrivileges();
}
protected function AfterUpdate()
{
UserRights::FlushPrivileges();
}
protected function AfterDelete()
{
UserRights::FlushPrivileges();
}
}
class UserRightsBaseClass extends DBObject
{
// Whenever something changes, reload the privileges
@@ -50,7 +70,7 @@ class UserRightsBaseClass extends cmdbAbstractObject
class URP_Profiles extends UserRightsBaseClass
class URP_Profiles extends UserRightsBaseClassGUI
{
public static function Init()
{
@@ -87,28 +107,115 @@ class URP_Profiles extends UserRightsBaseClass
$this->m_bCheckReservedNames = false;
}
protected static $m_aActions = array(
UR_ACTION_READ => 'Read',
UR_ACTION_MODIFY => 'Modify',
UR_ACTION_DELETE => 'Delete',
UR_ACTION_BULK_READ => 'Bulk Read',
UR_ACTION_BULK_MODIFY => 'Bulk Modify',
UR_ACTION_BULK_DELETE => 'Bulk Delete',
);
protected static $m_aCacheActionGrants = null;
protected static $m_aCacheStimulusGrants = null;
protected static $m_aCacheProfiles = null;
public static function DoCreateProfile($sName, $sDescription, $bReservedName = false)
{
if (is_null(self::$m_aCacheProfiles))
{
self::$m_aCacheProfiles = array();
$oFilterAll = new DBObjectSearch('URP_Profiles');
$oSet = new DBObjectSet($oFilterAll);
while ($oProfile = $oSet->Fetch())
{
self::$m_aCacheProfiles[$oProfile->Get('name')] = $oProfile->GetKey();
}
}
$sCacheKey = $sName;
if (isset(self::$m_aCacheProfiles[$sCacheKey]))
{
return self::$m_aCacheProfiles[$sCacheKey];
}
$oNewObj = MetaModel::NewObject("URP_Profiles");
$oNewObj->Set('name', $sName);
$oNewObj->Set('description', $sDescription);
if ($bReservedName)
{
$oNewObj->DisableCheckOnReservedNames();
}
$iId = $oNewObj->DBInsertNoReload();
self::$m_aCacheProfiles[$sCacheKey] = $iId;
return $iId;
}
public static function DoCreateActionGrant($iProfile, $iAction, $sClass, $bPermission = true)
{
$sAction = self::$m_aActions[$iAction];
if (is_null(self::$m_aCacheActionGrants))
{
self::$m_aCacheActionGrants = array();
$oFilterAll = new DBObjectSearch('URP_ActionGrant');
$oSet = new DBObjectSet($oFilterAll);
while ($oGrant = $oSet->Fetch())
{
self::$m_aCacheActionGrants[$oGrant->Get('profileid').'-'.$oGrant->Get('action').'-'.$oGrant->Get('class')] = $oGrant->GetKey();
}
}
$sCacheKey = "$iProfile-$sAction-$sClass";
if (isset(self::$m_aCacheActionGrants[$sCacheKey]))
{
return self::$m_aCacheActionGrants[$sCacheKey];
}
$oNewObj = MetaModel::NewObject("URP_ActionGrant");
$oNewObj->Set('profileid', $iProfile);
$oNewObj->Set('permission', $bPermission ? 'yes' : 'no');
$oNewObj->Set('class', $sClass);
$oNewObj->Set('action', $sAction);
$iId = $oNewObj->DBInsertNoReload();
self::$m_aCacheActionGrants[$sCacheKey] = $iId;
return $iId;
}
public static function DoCreateStimulusGrant($iProfile, $sStimulusCode, $sClass)
{
if (is_null(self::$m_aCacheStimulusGrants))
{
self::$m_aCacheStimulusGrants = array();
$oFilterAll = new DBObjectSearch('URP_StimulusGrant');
$oSet = new DBObjectSet($oFilterAll);
while ($oGrant = $oSet->Fetch())
{
self::$m_aCacheStimulusGrants[$oGrant->Get('profileid').'-'.$oGrant->Get('stimulus').'-'.$oGrant->Get('class')] = $oGrant->GetKey();
}
}
$sCacheKey = "$iProfile-$sStimulusCode-$sClass";
if (isset(self::$m_aCacheStimulusGrants[$sCacheKey]))
{
return self::$m_aCacheStimulusGrants[$sCacheKey];
}
$oNewObj = MetaModel::NewObject("URP_StimulusGrant");
$oNewObj->Set('profileid', $iProfile);
$oNewObj->Set('permission', 'yes');
$oNewObj->Set('class', $sClass);
$oNewObj->Set('stimulus', $sStimulusCode);
$iId = $oNewObj->DBInsertNoReload();
self::$m_aCacheStimulusGrants[$sCacheKey] = $iId;
return $iId;
}
/*
* Create the built-in Administrator profile with its reserved name
*/
public static function DoCreateAdminProfile()
{
$oNewObj = MetaModel::NewObject("URP_Profiles");
$oNewObj->Set('name', ADMIN_PROFILE_NAME);
$oNewObj->Set('description', 'Has the rights on everything (bypassing any control)');
$oNewObj->DisableCheckOnReservedNames();
$iNewId = $oNewObj->DBInsertNoReload();
}
/*
* Create the built-in User Portal profile with its reserved name
*/
public static function DoCreateUserPortalProfile()
{
$oNewObj = MetaModel::NewObject("URP_Profiles");
$oNewObj->Set('name', PORTAL_PROFILE_NAME);
$oNewObj->Set('description', 'Has the rights to access to the user portal. People having this profile will not be allowed to access the standard application, they will be automatically redirected to the user portal.');
$oNewObj->DisableCheckOnReservedNames();
$iNewId = $oNewObj->DBInsertNoReload();
self::DoCreateProfile(ADMIN_PROFILE_NAME, 'Has the rights on everything (bypassing any control)', true /* reserved name */);
}
/*
@@ -180,7 +287,7 @@ class URP_Profiles extends UserRightsBaseClass
$oGrant = $oUserRights->GetClassStimulusGrant($this->GetKey(), $sClass, $sStimulusCode);
if (is_object($oGrant) && ($oGrant->Get('permission') == 'yes'))
{
$aStimuli[] = '<span title="'.$sStimulusCode.': '.htmlentities($oStimulus->GetDescription()).'">'.htmlentities($oStimulus->GetLabel()).'</span>';
$aStimuli[] = '<span title="'.$sStimulusCode.': '.htmlentities($oStimulus->GetDescription(), ENT_QUOTES, 'UTF-8').'">'.htmlentities($oStimulus->GetLabel(), ENT_QUOTES, 'UTF-8').'</span>';
}
}
$sStimuli = implode(', ', $aStimuli);
@@ -222,7 +329,7 @@ class URP_Profiles extends UserRightsBaseClass
class URP_UserProfile extends UserRightsBaseClass
class URP_UserProfile extends UserRightsBaseClassGUI
{
public static function Init()
{
@@ -262,7 +369,7 @@ class URP_UserProfile extends UserRightsBaseClass
}
}
class URP_UserOrg extends UserRightsBaseClass
class URP_UserOrg extends UserRightsBaseClassGUI
{
public static function Init()
{
@@ -489,7 +596,6 @@ class UserRightsProfile extends UserRightsAddOnAPI
public function Init()
{
MetaModel::RegisterPlugin('userrights', 'ACbyProfile');
}
@@ -649,6 +755,14 @@ exit;
{
$sAttCode = 'id';
}
elseif (is_callable("$sClass::MapContextParam"))
{
$sAttCode = eval("return $sClass::MapContextParam('org_id');"); // Returns null when there is no mapping for this parameter
if ($sAttCode == null)
{
return true;
}
}
elseif(MetaModel::IsValidAttCode($sClass, 'org_id'))
{
$sAttCode = 'org_id';

View File

@@ -119,7 +119,7 @@ class URP_Profiles extends UserRightsBaseClass
$oGrant = $oUserRights->GetClassStimulusGrant($this->GetKey(), $sClass, $sStimulusCode);
if (is_object($oGrant) && ($oGrant->Get('permission') == 'yes'))
{
$aStimuli[] = '<span title="'.$sStimulusCode.': '.htmlentities($oStimulus->GetDescription()).'">'.htmlentities($oStimulus->GetLabel()).'</span>';
$aStimuli[] = '<span title="'.$sStimulusCode.': '.htmlentities($oStimulus->GetDescription(), ENT_QUOTES, 'UTF-8').'">'.htmlentities($oStimulus->GetLabel(), ENT_QUOTES, 'UTF-8').'</span>';
}
}
$sStimuli = implode(', ', $aStimuli);
@@ -660,7 +660,8 @@ class UserRightsProjection extends UserRightsAddOnAPI
public function Init()
{
MetaModel::RegisterPlugin('userrights', 'ACbyProfile', array($this, 'CacheData'));
// CacheData to be invoked in a module extension
//MetaModel::RegisterPlugin('userrights', 'ACbyProfile', array($this, 'CacheData'));
}
protected $m_aDimensions = array(); // id -> object

View File

@@ -166,13 +166,19 @@ EOF
$s_captured_output = ob_get_contents();
ob_end_clean();
echo $this->s_content;
echo $this->s_deferred_content;
//echo $this->s_deferred_content;
if (count($this->a_scripts) > 0)
{
echo "<script type=\"text/javascript\">\n";
echo implode("\n", $this->a_scripts);
echo "\n</script>\n";
}
if (!empty($this->s_deferred_content))
{
echo "<script type=\"text/javascript\">\n";
echo "\$('body').append('".$this->s_deferred_content."');\n";
echo "\n</script>\n";
}
if (!empty($this->m_sReadyScript))
{
echo "<script type=\"text/javascript\">\n";

View File

@@ -0,0 +1,51 @@
<?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
/**
* Class iPlugin
* Management of application plugin
*
* @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
*/
interface iApplicationUIExtension
{
public function OnDisplayProperties($oObject, WebPage $oPage, $bEditMode = false);
public function OnDisplayRelations($oObject, WebPage $oPage, $bEditMode = false);
public function OnFormSubmit($oObject, $sFormPrefix = '');
public function OnFormCancel($sTempId); // temp id is made of session_id and transaction_id, it identifies the object in a unique way
public function EnumUsedAttributes($oObject); // Not yet implemented
public function GetIcon($oObject); // Not yet implemented
public function GetHilightClass($oObject);
public function EnumAllowedActions(DBObjectSet $oSet);
}
interface iApplicationObjectExtension
{
public function OnIsModified($oObject);
public function OnCheckToWrite($oObject);
public function OnCheckToDelete($oObject);
public function OnDBUpdate($oObject, $oChange = null);
public function OnDBInsert($oObject, $oChange = null);
public function OnDBDelete($oObject, $oChange = null);
}
?>

File diff suppressed because it is too large Load Diff

View File

@@ -377,7 +377,14 @@ class DisplayBlock
$sLabels = array();
while($oObj = $this->m_oSet->Fetch())
{
$sValue = $oObj->Get($sGroupByField);
if (isset($aExtraParams['group_by_expr']))
{
eval("\$sValue = ".sprintf($aExtraParams['group_by_expr'], $oObj->Get($sGroupByField)).';');
}
else
{
$sValue = $oObj->Get($sGroupByField);
}
$aGroupBy[$sValue] = isset($aGroupBy[$sValue]) ? $aGroupBy[$sValue]+1 : 1;
$sLabels[$sValue] = $oObj->GetAsHtml($sGroupByField);
}
@@ -441,7 +448,15 @@ class DisplayBlock
$aKeys = array();
foreach($aGroupByFields as $aField)
{
$aKeys[$aField['alias'].'.'.$aField['att_code']] = $aObjects[$aField['alias']]->Get($aField['att_code']);
$sAlias = $aField['alias'];
if (is_null($aObjects[$sAlias]))
{
$aKeys[$sAlias.'.'.$aField['att_code']] = '';
}
else
{
$aKeys[$sAlias.'.'.$aField['att_code']] = $aObjects[$sAlias]->Get($aField['att_code']);
}
}
$sCategory = implode($aKeys, ' ');
$aResults[$sCategory][] = $aObjects;
@@ -469,7 +484,11 @@ class DisplayBlock
$aSimpleArray = array();
foreach($aObjects as $aRow)
{
$aSimpleArray[] = $aRow[$aDisplayAliases[0]];
$oObj = $aRow[$aDisplayAliases[0]];
if (!is_null($oObj))
{
$aSimpleArray[] = $oObj;
}
}
$oSet = CMDBObjectSet::FromArray($this->m_oFilter->GetClass(), $aSimpleArray);
$sHtml .= "<tr><td>".cmdbAbstractObject::GetDisplaySet($oPage, $oSet, $aExtraParams)."</td></tr>\n";
@@ -748,11 +767,12 @@ EOF
$sChartType = isset($aExtraParams['chart_type']) ? $aExtraParams['chart_type'] : 'pie';
$sTitle = isset($aExtraParams['chart_title']) ? $aExtraParams['chart_title'] : '';
$sGroupBy = isset($aExtraParams['group_by']) ? $aExtraParams['group_by'] : '';
$sGroupByExpr = isset($aExtraParams['group_by_expr']) ? '&params[group_by_expr]='.$aExtraParams['group_by_expr'] : '';
$sFilter = $this->m_oFilter->serialize();
$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("../pages/ajax.render.php?operation=open_flash_chart&params[group_by]=$sGroupBy&params[chart_type]=$sChartType&params[chart_title]=$sTitle&filter=".$sFilter)."\"}, {wmode: 'transparent'} );\n");
{\"data-file\":\"".urlencode("../pages/ajax.render.php?operation=open_flash_chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[chart_type]=$sChartType&params[chart_title]=$sTitle&filter=".$sFilter)."\"}, {wmode: 'transparent'} );\n");
$iChartCounter++;
break;
@@ -772,7 +792,14 @@ EOF
$aGroupBy = array();
while($oObj = $this->m_oSet->Fetch())
{
$sValue = $oObj->Get($sGroupByField);
if (isset($aExtraParams['group_by_expr']))
{
eval("\$sValue = ".sprintf($aExtraParams['group_by_expr'], $oObj->Get($sGroupByField)).';');
}
else
{
$sValue = $oObj->Get($sGroupByField);
}
$aGroupBy[$sValue] = isset($aGroupBy[$sValue]) ? $aGroupBy[$sValue]+1 : 1;
}
$sFilter = urlencode($this->m_oFilter->serialize());
@@ -828,7 +855,14 @@ EOF
$aGroupBy = array();
while($oObj = $this->m_oSet->Fetch())
{
$sValue = $oObj->Get($sGroupByField);
if (isset($aExtraParams['group_by_expr']))
{
eval("\$sValue = ".sprintf($aExtraParams['group_by_expr'], $oObj->Get($sGroupByField)).';');
}
else
{
$sValue = $oObj->Get($sGroupByField);
}
$aGroupBy[$sValue] = isset($aGroupBy[$sValue]) ? $aGroupBy[$sValue]+1 : 1;
}
$sFilter = urlencode($this->m_oFilter->serialize());
@@ -1047,6 +1081,15 @@ class MenuBlock extends DisplayBlock
if ($bIsModifyAllowed) { $aActions[] = array ('label' => Dict::S('UI:Menu:Add'), 'url' => "../pages/$sUIPage?operation=modify_links&class=$sClass&link_attr=".$aExtraParams['link_attr']."&target_class=$sTargetClass&id=$id&addObjects=true&$sContext"); }
if ($bIsModifyAllowed) { $aActions[] = array ('label' => Dict::S('UI:Menu:Manage'), 'url' => "../pages/$sUIPage?operation=modify_links&class=$sClass&link_attr=".$aExtraParams['link_attr']."&target_class=$sTargetClass&id=$id&sContext"); }
}
$this->AddMenuSeparator($aActions);
foreach (MetaModel::EnumPlugins('iApplicationUIExtension') as $oExtensionInstance)
{
$oSet->Rewind();
foreach($oExtensionInstance->EnumAllowedActions($oSet) as $sLabel => $sUrl)
{
$aActions[] = array ('label' => $sLabel, 'url' => $sUrl);
}
}
break;
default:
@@ -1071,12 +1114,61 @@ class MenuBlock extends DisplayBlock
// many objects in the set, possible actions are: new / modify all / delete all
$sUrl = utils::GetAbsoluteUrl();
if ($bIsModifyAllowed) { $aActions[] = array ('label' => Dict::S('UI:Menu:New'), 'url' => "../pages/$sUIPage?operation=new&class=$sClass&$sContext{$sDefault}"); }
//if ($bIsBulkModifyAllowed) { $aActions[] = array ('label' => 'Modify All...', 'url' => "../pages/$sUIPage?operation=modify_all&filter=$sFilter&$sContext"); }
if ($bIsBulkModifyAllowed) { $aActions[] = array ('label' => Dict::S('UI:Menu:ModifyAll'), 'url' => "../pages/$sUIPage?operation=select_for_modify_all&class=$sClass&filter=$sFilter&sContext"); }
if ($bIsBulkDeleteAllowed) { $aActions[] = array ('label' => Dict::S('UI:Menu:BulkDelete'), 'url' => "../pages/$sUIPage?operation=select_for_deletion&filter=$sFilter&$sContext"); }
// Stimuli
$aStates = MetaModel::EnumStates($sClass);
if (count($aStates) > 0)
{
// Life cycle actions may be available... if all objects are in the same state
$oSet->Rewind();
$aStates = array();
while($oObj = $oSet->Fetch())
{
$aStates[$oObj->GetState()] = $oObj->GetState();
}
$oSet->Rewind();
if (count($aStates) == 1)
{
// All objects are in the same state...
$sState = array_pop($aStates);
$aTransitions = Metamodel::EnumTransitions($sClass, $sState);
if (count($aTransitions))
{
$this->AddMenuSeparator($aActions);
$aStimuli = Metamodel::EnumStimuli($sClass);
foreach($aTransitions as $sStimulusCode => $aTransitionDef)
{
$oChecker = new StimulusChecker($this->m_oFilter, $sState, $sStimulusCode);
$iActionAllowed = (get_class($aStimuli[$sStimulusCode]) == 'StimulusUserAction') ? $oChecker->IsAllowed() : UR_ALLOWED_NO;
switch($iActionAllowed)
{
case UR_ALLOWED_YES:
case UR_ALLOWED_DEPENDS:
$aActions[] = array('label' => $aStimuli[$sStimulusCode]->GetLabel(), 'url' => "../pages/UI.php?operation=select_bulk_stimulus&stimulus=$sStimulusCode&state=$sState&class=$sClass&filter=$sFilter&$sContext");
break;
default:
// Do nothing
}
}
}
}
}
$this->AddMenuSeparator($aActions);
$aActions[] = array ('label' => Dict::S('UI:Menu:EMail'), 'url' => "mailto:?subject=".$oSet->GetFilter()->__DescribeHTML()."&body=".urlencode("$sUrl?operation=search&filter=$sFilter&$sContext"));
$aActions[] = array ('label' => Dict::S('UI:Menu:CSVExport'), 'url' => "../pages/$sUIPage?operation=search&filter=$sFilter&format=csv&$sContext");
}
$this->AddMenuSeparator($aActions);
foreach (MetaModel::EnumPlugins('iApplicationUIExtension') as $oExtensionInstance)
{
$oSet->Rewind();
foreach($oExtensionInstance->EnumAllowedActions($oSet) as $sLabel => $sUrl)
{
$aActions[] = array ('label' => $sLabel, 'url' => $sUrl);
}
}
}
$sHtml .= "<div class=\"itop_popup\"><ul>\n<li>".Dict::S('UI:Menu:Actions')."\n<ul>\n";
foreach ($aActions as $aAction)

View File

@@ -36,6 +36,8 @@ class iTopWebPage extends NiceWebPage
private $m_aTabs;
private $m_sCurrentTabContainer;
private $m_sCurrentTab;
private $m_sMessage;
private $m_sInitScript;
public function __construct($sTitle)
{
@@ -44,6 +46,7 @@ class iTopWebPage extends NiceWebPage
$this->m_sCurrentTab = '';
$this->m_aTabs = array();
$this->m_sMenu = "";
$this->m_sMessage = '';
$oAppContext = new ApplicationContext();
$sExtraParams = $oAppContext->GetForLink();
// $this->m_currentOrganization = $currentOrganization;
@@ -58,7 +61,6 @@ class iTopWebPage extends NiceWebPage
$this->add_linked_script("../js/jquery.tablehover.js");
$this->add_linked_script("../js/jquery.treeview.js");
$this->add_linked_script("../js/jquery.autocomplete.js");
$this->add_linked_script("../js/jquery.bgiframe.js");
$this->add_linked_script("../js/jquery.positionBy.js");
$this->add_linked_script("../js/jquery.popupmenu.js");
$this->add_linked_script("../js/date.js");
@@ -69,13 +71,13 @@ class iTopWebPage extends NiceWebPage
$this->add_linked_script("../js/swfobject.js");
$this->add_linked_script("../js/ckeditor/ckeditor.js");
$this->add_linked_script("../js/ckeditor/adapters/jquery.js");
$this->add_ready_script(
<<<EOF
$this->add_linked_script("../js/jquery.qtip-1.0.min.js");
$this->m_sInitScript =
<<< EOF
try
{
var myLayout; // a var is required because this page utilizes: myLayout.allowOverflow() method
$(document).ready(function () {
var myLayout; // a var is required because this page utilizes: myLayout.allowOverflow() method
// Layout
paneSize = GetUserPreference('menu_size', 300)
myLayout = $('body').layout({
@@ -127,10 +129,32 @@ class iTopWebPage extends NiceWebPage
{
myLayout.close('west');
}
// Accordion Menu
$("#accordion").accordion({ header: "h3", navigation: true, autoHeight: false, collapsible: false, icons: false }); // collapsible will be enabled once the item will be selected
});
// Tabs, using JQuery BBQ to store the history
// The "tab widgets" to handle.
var tabs = $('div[id^=tabbedContent]');
// This selector will be reused when selecting actual tab widget A elements.
var tab_a_selector = 'ul.ui-tabs-nav a';
// Enable tabs on all tab widgets. The `event` property must be overridden so
// 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' });
}
catch(err)
{
// Do something with the error !
alert(err);
}
EOF
;
$this->add_ready_script(
<<< EOF
//add new widget called TruncatedList to properly display truncated lists when they are sorted
$.tablesorter.addWidget({
// give the widget a id
@@ -212,12 +236,6 @@ class iTopWebPage extends NiceWebPage
// This selector will be reused when selecting actual tab widget A elements.
var tab_a_selector = 'ul.ui-tabs-nav a';
// Enable tabs on all tab widgets. The `event` property must be overridden so
// 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' });
// Define our own click handler for the tabs, overriding the default.
tabs.find( tab_a_selector ).click(function()
{
@@ -331,20 +349,8 @@ class iTopWebPage extends NiceWebPage
$('#ModalDlg').dialog({ autoOpen: false, modal: true, width: 0.8*docWidth }); // JQuery UI dialogs
ShowDebug();
$('#logOffBtn>ul').popupmenu();
// $.history.init(history_callback);
// $("a[rel='history']").click(function()
// {
// $.history.load(this.href.replace(/^.*#/, ''));
// return false;
// });
}
catch(err)
{
// Do something with the error !
alert(err);
}
//$('.display_block').draggable(); // make the blocks draggable
$('.caselog_header').click( function () { $(this).toggleClass('open').next('.caselog_entry').toggle(); });
EOF
);
$sUserPrefs = appUserPreferences::GetAsJSON();
@@ -398,6 +404,21 @@ EOF
}
var oUserPreferences = $sUserPrefs;
// For disabling the CKEditor at init time when the corresponding textarea is disabled !
CKEDITOR.plugins.add( 'disabler',
{
init : function( editor )
{
editor.on( 'instanceReady', function(e)
{
e.removeListener();
$('#'+ editor.name).trigger('update');
});
}
});
EOF
);
@@ -529,11 +550,22 @@ EOF
}
foreach($this->a_linked_scripts as $s_script)
{
// 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)
{
$s_script .= "?version=".ITOP_VERSION;
}
else
{
$s_script .= "&version=".ITOP_VERSION;
}
echo "<script type=\"text/javascript\" src=\"$s_script\"></script>\n";
}
$this->add_script("\$(document).ready(function() {\n{$this->m_sInitScript};\nwindow.setTimeout('onDelayedReady()',10)\n});");
if (count($this->m_aReadyScripts)>0)
{
$this->add_script("\$(document).ready(function() {\n".implode("\n", $this->m_aReadyScripts)."\n});");
$this->add_script("\nonDelayedReady = function() {\n".implode("\n", $this->m_aReadyScripts)."\n}\n");
}
if (count($this->a_scripts)>0)
{
@@ -669,6 +701,10 @@ EOF
}
$sApplicationBanner .= '</div>';
}
else if(strlen($this->m_sMessage))
{
$sApplicationBanner = '<div id="admin-banner"><span style="padding:5px;">'.$this->m_sMessage.'<span></div>';
}
else
{
$sApplicationBanner = '';
@@ -768,7 +804,8 @@ EOF
{
echo "<div id=\"rawOutput\" title=\"Debug Output\"><div style=\"height:500px; overflow-y:auto;\">$s_captured_output</div></div>\n";
}
echo $this->s_deferred_content;
echo "<div id=\"at_the_end\">".$this->s_deferred_content."</div>";
// echo $this->s_deferred_content;
echo "<div style=\"display:none\" title=\"ex2\" id=\"ex2\">Please wait...</div>\n"; // jqModal Window
echo "<div style=\"display:none\" title=\"dialog\" id=\"ModalDlg\"></div>";
echo "<div style=\"display:none\" id=\"ajax_content\"></div>";
@@ -882,6 +919,14 @@ EOF
}
}
/**
* Set the message to be displayed in the 'admin-banner' section at the top of the page
*/
public function SetMessage($sMessage)
{
$this->m_sMessage = $sMessage;
}
/*
public function AddSearchForm($sClassName, $bOpen = false)
{

View File

@@ -326,6 +326,16 @@ EOF
{
// User is Ok, let's save it in the session and proceed with normal login
UserRights::Login($sAuthUser, $sAuthentication); // Login & set the user's language
if (MetaModel::GetConfig()->Get('log_usage'))
{
$oLog = new EventLoginUsage();
$oLog->Set('userinfo', UserRights::GetUser());
$oLog->Set('user_id', UserRights::GetUserObject()->GetKey());
$oLog->Set('message', 'Successful login');
$oLog->DBInsertNoReload();
}
$_SESSION['auth_user'] = $sAuthUser;
$_SESSION['login_mode'] = $sLoginMode;
}
@@ -342,6 +352,7 @@ EOF
*/
static function DoLogin($bMustBeAdmin = false, $bIsAllowedToPortalUsers = false)
{
$sMessage = ''; // In case we need to return a message to the calling web page
$operation = utils::ReadParam('loginop', '');
session_name(MetaModel::GetConfig()->Get('session_name'));
session_start();
@@ -391,6 +402,7 @@ EOF
$oPage->DisplayChangePwdForm(true); // old pwd was wrong
$oPage->output();
}
$sMessage = Dict::S('UI:Login:PasswordChanged');
}
self::Login();
@@ -409,6 +421,7 @@ EOF
// No rights to be here, redirect to the portal
header('Location: ../portal/index.php');
}
return $sMessage;
}
} // End of class

View File

@@ -58,7 +58,6 @@ class PortalWebPage extends NiceWebPage
$this->add_linked_script("../js/jquery.tablehover.js");
$this->add_linked_script("../js/jquery.treeview.js");
$this->add_linked_script("../js/jquery.autocomplete.js");
$this->add_linked_script("../js/jquery.bgiframe.js");
$this->add_linked_script("../js/jquery.positionBy.js");
$this->add_linked_script("../js/jquery.popupmenu.js");
$this->add_linked_script("../js/date.js");
@@ -119,6 +118,7 @@ try
changeYear: true
});
$('.resizable').resizable(); // Make resizable everything that claims to be resizable !
$('.caselog_header').click( function () { $(this).toggleClass('open').next('.caselog_entry').toggle(); });
}
catch(err)
{
@@ -165,7 +165,7 @@ EOF
public function output()
{
$sMenu = '';
$this->AddMenuButton('logoff', 'Portal:Disconnect', '../pages/logoff.php?portal=1'); // This menu is always present and is the last one
$this->AddMenuButton('logoff', 'Portal:Disconnect', '../pages/logoff.php'); // This menu is always present and is the last one
foreach($this->m_aMenuButtons as $aMenuItem)
{
$sMenu .= "<a class=\"button\" id=\"{$aMenuItem['id']}\" href=\"{$aMenuItem['hyperlink']}\"><span>".Dict::S($aMenuItem['label'])."</span></a>";

View File

@@ -161,7 +161,7 @@ class DisplayTemplate
$oPage->AddTabContainer('Tabs_'.$iTabContainerCount);
$oPage->SetCurrentTabContainer('Tabs_'.$iTabContainerCount);
$iTabContainerCount++;
//$oPage->p('Content:<pre>'.htmlentities($sContent).'</pre>');
//$oPage->p('Content:<pre>'.htmlentities($sContent, ENT_QUOTES, 'UTF-8').'</pre>');
$oTemplate = new DisplayTemplate($sContent);
$oTemplate->Render($oPage, array()); // no params to apply, they have already been applied
$oPage->SetCurrentTabContainer('');
@@ -185,7 +185,7 @@ class DisplayTemplate
$oPage->SetCurrentTab(Dict::S(str_replace('_', ' ', $aAttributes['name'])));
$oTemplate = new DisplayTemplate($sContent);
$oTemplate->Render($oPage, array()); // no params to apply, they have already been applied
//$oPage->p('iTop Tab Content:<pre>'.htmlentities($sContent).'</pre>');
//$oPage->p('iTop Tab Content:<pre>'.htmlentities($sContent, ENT_QUOTES, 'UTF-8').'</pre>');
$oPage->SetCurrentTab('');
break;
@@ -195,7 +195,7 @@ class DisplayTemplate
$oPage->StartCollapsibleSection(Dict::S($sName), $bOpen);
$oTemplate = new DisplayTemplate($sContent);
$oTemplate->Render($oPage, array()); // no params to apply, they have already been applied
//$oPage->p('iTop Tab Content:<pre>'.htmlentities($sContent).'</pre>');
//$oPage->p('iTop Tab Content:<pre>'.htmlentities($sContent, ENT_QUOTES, 'UTF-8').'</pre>');
$oPage->EndCollapsibleSection();
break;
@@ -241,7 +241,7 @@ class DisplayTemplate
</itoptabs>';
$oPage = new iTopWebPage('Unit Test');
//$oPage->add("Template content: <pre>".htmlentities($sTemplate)."</pre>\n");
//$oPage->add("Template content: <pre>".htmlentities($sTemplate, ENT_QUOTES, 'UTF-8')."</pre>\n");
$oTemplate = new DisplayTemplate($sTemplate);
$oTemplate->Render($oPage, array('class'=>'Network device','pkey'=> 271, 'name' => 'deliversw01.mecanorama.fr', 'org_id' => 3));
$oPage->output();

View File

@@ -1,4 +1,4 @@
<div style="width:100%;background: url(../images/welcome.jpg) top left no-repeat;">
<div style="width:100%;background: #fff url(../images/welcome.jpg) top left no-repeat;">
<style>
.dashboard {
vertical-align:top;

View File

@@ -92,12 +92,24 @@ class UIExtKeyWidget
* @param Hash $aArgs Extra context arguments
* @return string The HTML fragment to be inserted into the page
*/
public function Display(WebPage $oPage, $aArgs = array())
public function Display(WebPage $oPage, $aArgs = array(), $bSearchMode = false)
{
$bCreate = (!MetaModel::IsAbstract($this->sTargetClass)) && (UserRights::IsActionAllowed($this->sTargetClass, UR_ACTION_BULK_MODIFY) && $this->oAttDef->AllowTargetCreation());
$oPage->add_linked_script('../js/extkeywidget.js');
$oPage->add_linked_script('../js/forms-json-utils.js');
$bCreate = (!$bSearchMode) && (!MetaModel::IsAbstract($this->sTargetClass)) && (UserRights::IsActionAllowed($this->sTargetClass, UR_ACTION_BULK_MODIFY) && $this->oAttDef->AllowTargetCreation());
$sMessage = Dict::S('UI:Message:EmptyList:UseSearchForm');
$sAttrFieldPrefix = ($bSearchMode) ? '' : 'attr_';
$sHTMLValue = "<span style=\"white-space:nowrap\">"; // no wrap
if($bSearchMode)
{
$sWizHelper = 'null';
}
else
{
$sWizHelper = 'oWizardHelper'.$this->sFormPrefix;
}
if (count($this->aAllowedValues) < $this->oAttDef->GetMaximumComboLength())
{
// Few choices, use a normal 'select'
@@ -106,8 +118,15 @@ class UIExtKeyWidget
$sHelpText = $this->oAttDef->GetHelpOnEdition();
// In case there are no valid values, the select will be empty, thus blocking the user from validating the form
$sHTMLValue = "<select title=\"$sHelpText\" name=\"attr_{$this->sFieldPrefix}{$this->sAttCode}{$this->sNameSuffix}\" id=\"$this->iId\">\n";
$sHTMLValue .= "<option value=\"\">".Dict::S('UI:SelectOne')."</option>\n";
$sHTMLValue = "<select title=\"$sHelpText\" name=\"{$sAttrFieldPrefix}{$this->sFieldPrefix}{$this->sAttCode}{$this->sNameSuffix}\" id=\"$this->iId\">\n";
if ($bSearchMode)
{
$sHTMLValue .= "<option value=\"\">".Dict::S('UI:SearchValue:Any')."</option>\n";
}
else
{
$sHTMLValue .= "<option value=\"\">".Dict::S('UI:SelectOne')."</option>\n";
}
foreach($this->aAllowedValues as $key => $display_value)
{
if ((count($this->aAllowedValues) == 1) && ($this->bMandatory == 'true') )
@@ -122,10 +141,11 @@ class UIExtKeyWidget
$sHTMLValue .= "<option value=\"$key\"$sSelected>$display_value</option>\n";
}
$sHTMLValue .= "</select>\n";
$oPage->add_ready_script(
$oPage->add_ready_script(
<<<EOF
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sClass}', '{$this->sAttCode}', '{$this->sNameSuffix}', $sSelectMode, oWizardHelper{$this->sFormPrefix});
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sClass}', '{$this->sAttCode}', '{$this->sNameSuffix}', $sSelectMode, $sWizHelper);
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(); } );
EOF
);
@@ -149,29 +169,30 @@ EOF
// the input for the auto-complete
$sHTMLValue = "<input count=\"".count($this->aAllowedValues)."\" type=\"text\" id=\"label_$this->iId\" size=\"30\" maxlength=\"$iFieldSize\" value=\"$sDisplayValue\"/>&nbsp;";
$sHTMLValue .= "<a class=\"no-arrow\" href=\"javascript:oACWidget_{$this->iId}.Search();\"><img style=\"border:0;vertical-align:middle;\" src=\"../images/mini_search.gif\" /></a>&nbsp;";
$sHTMLValue .= "<a class=\"no-arrow\" href=\"javascript:oACWidget_{$this->iId}.Search();\"><img id=\"mini_search_{$this->iId}\" style=\"border:0;vertical-align:middle;\" src=\"../images/mini_search.gif\" /></a>&nbsp;";
// another hidden input to store & pass the object's Id
$sHTMLValue .= "<input type=\"hidden\" id=\"$this->iId\" name=\"attr_{$this->sFieldPrefix}{$this->sAttCode}{$this->sNameSuffix}\" value=\"$this->value\" />\n";
$sHTMLValue .= "<input type=\"hidden\" id=\"$this->iId\" name=\"{$sAttrFieldPrefix}{$this->sFieldPrefix}{$this->sAttCode}{$this->sNameSuffix}\" value=\"$this->value\" />\n";
// Scripts to start the autocomplete and bind some events to it
$oPage->add_ready_script(
$oPage->add_ready_script(
<<<EOF
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sClass}', '{$this->sAttCode}', '{$this->sNameSuffix}', $sSelectMode, oWizardHelper{$this->sFormPrefix});
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sClass}', '{$this->sAttCode}', '{$this->sNameSuffix}', $sSelectMode, $sWizHelper);
oACWidget_{$this->iId}.emptyHtml = "<div style=\"background: #fff; border:0; text-align:center; vertical-align:middle;\"><p>$sMessage</p></div>";
$('#label_$this->iId').autocomplete('./ajax.render.php', { scroll:true, minChars:{$iMinChars}, formatItem:formatItem, autoFill:false, matchContains:true, keyHolder:'#{$this->iId}', extraParams:{operation:'autocomplete', sclass:'{$this->sClass}',attCode:'{$this->sAttCode}'}});
$('#label_$this->iId').blur(function() { $(this).search(); } );
$('#label_$this->iId').keyup(function() { if ($(this).val() == '') { $('#$this->iId').val(''); } } ); // Useful for search forms: empty value in the "label", means no value, immediatly !
$('#label_$this->iId').result( function(event, data, formatted) { OnAutoComplete('{$this->iId}', event, data, formatted); } );
$('#ac_dlg_$this->iId').dialog({ width: $(window).width()*0.8, height: $(window).height()*0.8, autoOpen: false, modal: true, title: '{$this->sTitle}', resizeStop: oACWidget_{$this->iId}.UpdateSizes, close: oACWidget_{$this->iId}.OnClose });
$('#$this->iId').bind('update', function() { oACWidget_{$this->iId}.Update(); } );
EOF
);
$oPage->add_at_the_end($this->GetSearchDialog($oPage)); // To prevent adding forms inside the main form
//$oPage->add_at_the_end($this->GetSearchDialog($oPage)); // To prevent adding forms inside the main form
$oPage->add_at_the_end('<div id="ac_dlg_'.$this->iId.'"></div>'); // The place where to download the search dialog is outside of the main form (to prevent nested forms)
}
if ($bCreate)
{
$sHTMLValue .= "<a class=\"no-arrow\" href=\"javascript:oACWidget_{$this->iId}.CreateObject();\"><img style=\"border:0;vertical-align:middle;\" src=\"../images/mini_add.gif\" /></a>&nbsp;";
$sHTMLValue .= "<a class=\"no-arrow\" href=\"javascript:oACWidget_{$this->iId}.CreateObject();\"><img id=\"mini_add_{$this->iId}\" style=\"border:0;vertical-align:middle;\" src=\"../images/mini_add.gif\" /></a>&nbsp;";
$oPage->add_at_the_end('<div id="ajax_'.$this->iId.'"></div>');
}
$sHTMLValue .= "<span id=\"v_{$this->iId}\"></span>";
@@ -179,9 +200,9 @@ EOF
return $sHTMLValue;
}
protected function GetSearchDialog(WebPage $oPage)
public function GetSearchDialog(WebPage $oPage)
{
$sHTML = '<div id="ac_dlg_'.$this->iId.'"><div class="wizContainer" style="vertical-align:top;"><div id="dc_'.$this->iId.'">';
$sHTML = '<div class="wizContainer" style="vertical-align:top;"><div id="dc_'.$this->iId.'">';
$oFilter = new DBObjectSearch($this->sTargetClass);
$oSet = new CMDBObjectSet($oFilter);
@@ -194,12 +215,17 @@ EOF
$sHTML .= "<input type=\"button\" id=\"btn_cancel_{$this->iId}\" value=\"".Dict::S('UI:Button:Cancel')."\" onClick=\"$('#ac_dlg_{$this->iId}').dialog('close');\">&nbsp;&nbsp;";
$sHTML .= "<input type=\"button\" id=\"btn_ok_{$this->iId}\" value=\"".Dict::S('UI:Button:Ok')."\" onClick=\"oACWidget_{$this->iId}.DoOk();\">";
$sHTML .= "</form>\n";
$sHTML .= '</div></div></div>';
$sHTML .= '</div></div>';
$oPage->add_ready_script("$('#fs_{$this->iId}').bind('submit.uiAutocomplete', oACWidget_{$this->iId}.DoSearchObjects);");
$oPage->add_ready_script("$('#dc_{$this->iId}').resize(oACWidget_{$this->iId}.UpdateSizes);");
return $sHTML;
$sDialogTitle = addslashes($this->sTitle);
$oPage->add_ready_script(
<<<EOF
$('#ac_dlg_{$this->iId}').dialog({ width: $(window).width()*0.8, height: $(window).height()*0.8, autoOpen: false, modal: true, title: '$sDialogTitle', resizeStop: oACWidget_{$this->iId}.UpdateSizes, close: oACWidget_{$this->iId}.OnClose });
$('#fs_{$this->iId}').bind('submit.uiAutocomplete', oACWidget_{$this->iId}.DoSearchObjects);
$('#dc_{$this->iId}').resize(oACWidget_{$this->iId}.UpdateSizes);
EOF
);
$oPage->add($sHTML);
}
/**
@@ -240,11 +266,13 @@ EOF
*/
public function GetObjectCreationForm(WebPage $oPage)
{
$sDialogTitle = addslashes($this->sTitle);
$oPage->add('<div id="ac_create_'.$this->iId.'"><div class="wizContainer" style="vertical-align:top;"><div id="dcr_'.$this->iId.'">');
$oPage->add("<h1>".MetaModel::GetClassIcon($this->sTargetClass)."&nbsp;".Dict::Format('UI:CreationTitle_Class', MetaModel::GetName($this->sTargetClass))."</h1>\n");
cmdbAbstractObject::DisplayCreationForm($oPage, $this->sTargetClass, null, array(), array('formPrefix' => $this->iId, 'noRelations' => true));
$oPage->add('</div></div></div>');
$oPage->add_ready_script("\$('#ac_create_$this->iId').dialog({ width: $(window).width()*0.8, height: 'auto', autoOpen: false, modal: true, title: '$this->sTitle'});\n");
// $oPage->add_ready_script("\$('#ac_create_$this->iId').dialog({ width: $(window).width()*0.8, height: 'auto', autoOpen: false, modal: true, title: '$sDialogTitle'});\n");
$oPage->add_ready_script("\$('#ac_create_$this->iId').dialog({ width: 'auto', height: 'auto', autoOpen: false, modal: true, title: '$sDialogTitle'});\n");
$oPage->add_ready_script("$('#dcr_{$this->iId} form').removeAttr('onsubmit');");
$oPage->add_ready_script("$('#dcr_{$this->iId} form').bind('submit.uilinksWizard', oACWidget_{$this->iId}.DoCreateObject);");
}
@@ -255,17 +283,21 @@ EOF
public function DoCreateObject($oPage)
{
$oObj = MetaModel::NewObject($this->sTargetClass);
$oObj->UpdateObject($this->sFormPrefix.$this->iId);
$oMyChange = MetaModel::NewObject("CMDBChange");
$oMyChange->Set("date", time());
$sUserString = CMDBChange::GetCurrentUserName();
$oMyChange->Set("userinfo", $sUserString);
$iChangeId = $oMyChange->DBInsert();
$oObj->DBInsertTracked($oMyChange);
return array('name' => $oObj->GetName(), 'id' => $oObj->GetKey());
//return array('name' => 'test', 'id' => '42');
$aErrors = $oObj->UpdateObject($this->sFormPrefix.$this->iId);
if (count($aErrors) == 0)
{
$oMyChange = MetaModel::NewObject("CMDBChange");
$oMyChange->Set("date", time());
$sUserString = CMDBChange::GetCurrentUserName();
$oMyChange->Set("userinfo", $sUserString);
$iChangeId = $oMyChange->DBInsert();
$oObj->DBInsertTracked($oMyChange);
return array('name' => $oObj->GetName(), 'id' => $oObj->GetKey());
}
else
{
return array('name' => implode(' ', $aErrors), 'id' => 0);
}
}
}
?>

View File

@@ -61,14 +61,14 @@ class UIHTMLEditorWidget
$sHelpText = $this->m_sHelpText;
$sValidationField = $this->m_sValidationField;
$sHtmlValue = "<table><tr><td><textarea class=\"htmlEditor\" title=\"$sHelpText\" name=\"attr_{$this->m_sFieldPrefix}{$sCode}\" rows=\"14\" cols=\"110\" id=\"$iId\">$sValue</textarea></td><td>$sValidationField</td></tr></table>";
$sHtmlValue = "<table><tr><td><textarea class=\"htmlEditor\" title=\"$sHelpText\" name=\"attr_{$this->m_sFieldPrefix}{$sCode}\" rows=\"10\" cols=\"10\" id=\"$iId\">$sValue</textarea></td><td>$sValidationField</td></tr></table>";
// Replace the text area with CKEditor
// To change the default settings of the editor,
// a) edit the file /js/ckeditor/config.js
// b) or override some of the configuration settings, using the second parameter of ckeditor()
$sLanguage = strtolower(trim(UserRights::GetUserLanguage()));
$oPage->add_ready_script("$('#$iId').ckeditor(function() { /* callback code */ }, { language : '$sLanguage' , contentsLanguage : '$sLanguage' });"); // Transform $iId into a CKEdit
$oPage->add_ready_script("$('#$iId').ckeditor(function() { /* callback code */ }, { language : '$sLanguage' , contentsLanguage : '$sLanguage', extraPlugins: 'disabler' });"); // Transform $iId into a CKEdit
// Please read...
// ValidateCKEditField triggers a timer... calling itself indefinitely
@@ -78,7 +78,8 @@ class UIHTMLEditorWidget
// The most relevant solution would be to implement a plugin to CKEdit, and handle the internal events like: setData, insertHtml, insertElement, loadSnapshot, key, afterUndo, afterRedo
// Could also be bound to 'instanceReady.ckeditor'
$oPage->add_ready_script("$('#$iId').bind('validate', function(evt, sFormId) { return ValidateCKEditField('$iId', '', {$this->m_sMandatory}, sFormId, '') } );");
$oPage->add_ready_script("$('#$iId').bind('validate', function(evt, sFormId) { return ValidateCKEditField('$iId', '', {$this->m_sMandatory}, sFormId, '') } );\n");
$oPage->add_ready_script("$('#$iId').bind('update', function() { BlockField('cke_$iId', $('#$iId').attr('disabled')); } );\n");
return $sHtmlValue;
}

View File

@@ -66,7 +66,7 @@ class UILinksWidget
{
// State attribute is always hidden from the UI
}
else if (!$oAttDef->IsExternalField() && ($sAttCode != $sExtKeyToMe) && ($sAttCode != $this->m_sExtKeyToRemote) && ($sAttCode != 'finalclass'))
else if ($oAttDef->IsWritable() && ($sAttCode != $sExtKeyToMe) && ($sAttCode != $this->m_sExtKeyToRemote) && ($sAttCode != 'finalclass'))
{
$iFlags = MetaModel::GetAttributeFlags($this->m_sLinkedClass, $sDefaultState, $sAttCode);
if ( !($iFlags & OPT_ATT_HIDDEN) && !($iFlags & OPT_ATT_READONLY) )
@@ -238,94 +238,7 @@ EOF
$oPage->add_at_the_end($this->GetObjectPickerDialog($oPage)); // To prevent adding forms inside the main form
return $sHtmlValue;
}
/**
* This static function is called by the Ajax Page when there is a need to fill an autocomplete combo
* @param $oPage WebPage The ajax page used for the output (sent back to the browser)
* @param $sClass string The name of the class of the current object being edited
* @param $sAttCode string The name of the attribute being edited
* @param $sName string The partial name that was typed by the user
* @param $iMaxCount integer The maximum number of items to return
* @return void
*/
static public function Autocomplete(WebPage $oPage, $sClass, $sAttCode, $sName, $iMaxCount)
{
// #@# todo - add context information, otherwise any value will be authorized for external keys
$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, array() /* $aArgs */, $sName);
if ($aAllowedValues != null)
{
$iCount = $iMaxCount;
foreach($aAllowedValues as $key => $value)
{
$oPage->add($value."|".$key."\n");
$iCount--;
if ($iCount == 0) break;
}
}
else // No limitation to the allowed values
{
// Search for all the object of the linked class
$oAttDef = $oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
$sLinkedClass = $oAttDef->GetLinkedClass();
$sSearchClass = self::GetTargetClass($sClass, $sAttCode);
$oFilter = new DBObjectSearch($sSearchClass);
$sSearchAttCode = MetaModel::GetNameAttributeCode($sSearchClass);
$oFilter->AddCondition($sSearchAttCode, $sName, 'Begins with');
$oSet = new CMDBObjectSet($oFilter, array($sSearchAttCode => true));
$iCount = 0;
while( ($iCount < $iMaxCount) && ($oObj = $oSet->fetch()) )
{
$oPage->add($oObj->GetName()."|".$oObj->GetKey()."\n");
$iCount++;
}
}
}
/**
* This static function is called by the Ajax Page display a set of objects being linked
* to the object being created
* @param $oPage WebPage The ajax page used for the put^put (sent back to the browser
* @param $sClass string The name of the 'linking class' which is the class of the objects to display
* @param $sSet JSON serialized set of objects
* @param $sExtKeyToMe Name of the attribute in sClass that is pointing to a given object
* @param $iObjectId The id of the object $sExtKeyToMe is pointing to
* @return void
*/
static public function RenderSet($oPage, $sClass, $sJSONSet, $sExtKeyToMe, $sExtKeyToRemote, $iObjectId)
{
$aSet = json_decode($sJSONSet, true); // true means hash array instead of object
$oSet = CMDBObjectSet::FromScratch($sClass);
foreach($aSet as $aObject)
{
$oObj = MetaModel::NewObject($sClass);
foreach($aObject as $sAttCode => $value)
{
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
if ($oAttDef->IsExternalKey() && ($value != 0))
{
$oTargetObj = MetaModel::GetObject($oAttDef->GetTargetClass(), $value); // @@ optimization, don't do & query per object in the set !
$oObj->Set($sAttCode, $oTargetObj);
}
else
{
$oObj->Set($sAttCode, $value);
}
}
$oSet->AddObject($oObj);
}
$aExtraParams = array();
$aExtraParams['link_attr'] = $sExtKeyToMe;
$aExtraParams['object_id'] = $iObjectId;
$aExtraParams['target_attr'] = $sExtKeyToRemote;
$aExtraParams['menu'] = false;
$aExtraParams['select'] = false;
$aExtraParams['view_link'] = false;
cmdbAbstractObject::DisplaySet($oPage, $oSet, $aExtraParams);
}
protected static function GetTargetClass($sClass, $sAttCode)
{
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);

View File

@@ -57,13 +57,28 @@ class UIPasswordWidget
$sChangedValue = (($sPasswordValue != '*****') || ($sConfirmPasswordValue != '*****')) ? 1 : 0;
$sHtmlValue = '';
$sHtmlValue = '<input type="password" maxlength="255" name="attr_'.$sCode.'" id="'.$this->iId.'" value="'.htmlentities($sPasswordValue, ENT_QUOTES, 'UTF-8').'"/>&nbsp;<span class="form_validation" id="v_'.$this->iId.'"></span><br/>';
$sHtmlValue .= '<input type="password" maxlength="255" id="'.$this->iId.'_confirm" value="'.htmlentities($sConfirmPasswordValue, ENT_QUOTES, 'UTF-8').'" name="attr_'.$sCode.'_confirmed"/> '.Dict::S('UI:PasswordConfirm').' <input type="button" value="'.Dict::S('UI:Button:ResetPassword').'" onClick="ResetPwd(\''.$this->iId.'\');">';
$sHtmlValue .= '<input type="password" maxlength="255" id="'.$this->iId.'_confirm" value="'.htmlentities($sConfirmPasswordValue, ENT_QUOTES, 'UTF-8').'" name="attr_'.$sCode.'_confirmed"/> '.Dict::S('UI:PasswordConfirm').' <input id="'.$this->iId.'_reset" type="button" value="'.Dict::S('UI:Button:ResetPassword').'" onClick="ResetPwd(\''.$this->iId.'\');">';
$sHtmlValue .= '<input type="hidden" id="'.$this->iId.'_changed" name="attr_'.$sCode.'_changed" value="'.$sChangedValue.'"/>';
$oPage->add_ready_script("$('#$this->iId').bind('keyup change', function(evt) { return PasswordFieldChanged('$this->iId') } );"); // Bind to a custom event: validate
$oPage->add_ready_script("$('#$this->iId').bind('keyup change validate', function(evt, sFormId) { return ValidatePasswordField('$this->iId', sFormId) } );"); // Bind to a custom event: validate
$oPage->add_ready_script("$('#{$this->iId}_confirm').bind('keyup change', function(evt, sFormId) { return ValidatePasswordField('$this->iId', sFormId) } );"); // Bind to a custom event: validate
$oPage->add_ready_script("$('#{$this->iId}').bind('update', function(evt, sFormId)
{
if ($(this).attr('disabled'))
{
$('#{$this->iId}_confirm').attr('disabled', 'disabled');
$('#{$this->iId}_changed').attr('disabled', 'disabled');
$('#{$this->iId}_reset').attr('disabled', 'disabled');
}
else
{
$('#{$this->iId}_confirm').removeAttr('disabled');
$('#{$this->iId}_changed').removeAttr('disabled');
$('#{$this->iId}_reset').removeAttr('disabled');
}
}
);"); // Bind to a custom event: update to handle enabling/disabling
return $sHtmlValue;
}
}

View File

@@ -132,7 +132,7 @@ class UILinksWizard
function AddObjects()
{
// TO DO: compute the list of objects already linked with the current Object
$.post( 'ajax.render.php', { 'operation': 'addObjects',
$.post( '../pages/ajax.render.php', { 'operation': 'addObjects',
'class': '{$this->m_sClass}',
'linkageAttr': '{$this->m_sLinkageAttr}',
'linkedClass': '{$this->m_sLinkedClass}',
@@ -175,7 +175,7 @@ class UILinksWizard
theMap['operation'] = 'searchObjectsToAdd';
// Run the query and display the results
$.post( 'ajax.render.php', theMap,
$.post( '../pages/ajax.render.php', theMap,
function(data)
{
$('#SearchResultsToAdd').html(data);
@@ -223,7 +223,7 @@ class UILinksWizard
theMap['operation'] = 'doAddObjects';
// Run the query and display the results
$.post( 'ajax.render.php', theMap,
$.post( '../pages/ajax.render.php', theMap,
function(data)
{
//console.log('Data: ' + data);

View File

@@ -227,7 +227,7 @@ $sJSHandlerCode
// Now use the dependencies between the fields to order them
// Start from the order of the 'details'
$aList = MetaModel::GetZListItems($this->m_sClass, 'details');
$aList = MetaModel::FlattenZlist(MetaModel::GetZListItems($this->m_sClass, 'details'));
$index = 0;
$aOrder = array();
foreach($aFields as $sAttCode => $void)

View File

@@ -169,9 +169,9 @@ class appUserPreferences extends DBObject
* Overloading this function here to secure a fix done right before the release
* The real fix should be to implement this verb in DBObject
*/
public function DBDeleteTracked(CMDBChange $oChange, $bSkipStrongSecurity = null)
public function DBDeleteTracked(CMDBChange $oChange, $bSkipStrongSecurity = null, &$oDeletionPlan = null)
{
$this->DBDelete();
$this->DBDelete($oDeletionPlan);
}
}
?>

View File

@@ -42,6 +42,60 @@ class utils
private static $m_sConfigFile = ITOP_CONFIG_FILE;
private static $m_oConfig = null;
// Parameters loaded from a file, parameters of the page/command line still have precedence
private static $m_aParamsFromFile = null;
protected static function LoadParamFile($sParamFile)
{
if (!file_exists($sParamFile))
{
throw new Exception("Could not find the parameter file: '$sParamFile'");
}
if (!is_readable($sParamFile))
{
throw new Exception("Could not load parameter file: '$sParamFile'");
}
$sParams = file_get_contents($sParamFile);
if (is_null(self::$m_aParamsFromFile))
{
self::$m_aParamsFromFile = array();
}
$aParamLines = explode("\n", $sParams);
foreach ($aParamLines as $sLine)
{
$sLine = trim($sLine);
// Ignore the line after a '#'
if (($iCommentPos = strpos($sLine, '#')) !== false)
{
$sLine = substr($sLine, 0, $iCommentPos);
$sLine = trim($sLine);
}
// Note: the line is supposed to be already trimmed
if (preg_match('/^(\S*)\s*=(.*)$/', $sLine, $aMatches))
{
$sParam = $aMatches[1];
$value = trim($aMatches[2]);
self::$m_aParamsFromFile[$sParam] = $value;
}
}
}
public static function UseParamFile($sParamFileArgName = 'param_file', $bAllowCLI = true)
{
$sFileSpec = self::ReadParam($sParamFileArgName, '', $bAllowCLI);
foreach(explode(',', $sFileSpec) as $sFile)
{
$sFile = trim($sFile);
if (!empty($sFile))
{
self::LoadParamFile($sFile);
}
}
}
public static function IsModeCLI()
{
@@ -62,6 +116,15 @@ class utils
{
global $argv;
$retValue = $defaultValue;
if (!is_null(self::$m_aParamsFromFile))
{
if (isset(self::$m_aParamsFromFile[$sName]))
{
$retValue = self::$m_aParamsFromFile[$sName];
}
}
if (isset($_REQUEST[$sName]))
{
$retValue = $_REQUEST[$sName];
@@ -282,14 +345,17 @@ class utils
* @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 GetAbsoluteUrlRoot($bForceHTTPS = false)
static public function GetAbsoluteUrlAppRoot($sCurrentRelativePath = '', $bForceHTTPS = false)
{
$sAbsoluteUrl = self::GetAbsoluteUrl(false, $bForceHTTPS); // False => Don't get the query string
$sServerPos = 3 + strpos($sAbsoluteUrl, '://');
$iFirstSlashPos = strpos($sAbsoluteUrl, '/', $sServerPos);
if ($iFirstSlashPos !== false)
$sAppRootPos = strpos($sAbsoluteUrl, $sCurrentRelativePath);
if ($sAppRootPos !== false)
{
$sAbsoluteUrl = substr($sAbsoluteUrl, 0, $iFirstSlashPos); // remove the current page, keep just the path, without the first /
$sAbsoluteUrl = substr($sAbsoluteUrl, 0, $sAppRootPos); // remove the current page and path
}
else
{
throw new Exception("Failed to determine application root path $sAbsoluteUrl ($sCurrentRelativePath)");
}
return $sAbsoluteUrl;
}

View File

@@ -46,6 +46,7 @@ class WebPage
protected $a_headers;
protected $a_base;
protected $iNextId;
protected $iTransactionId;
public function __construct($s_title)
{
@@ -59,6 +60,7 @@ class WebPage
$this->a_headers = array();
$this->a_base = array( 'href' => '', 'target' => '');
$this->iNextId = 0;
$this->iTransactionId = 0;
ob_start(); // Start capturing the output
}
@@ -202,7 +204,7 @@ class WebPage
*/
public function add_linked_script($s_linked_script)
{
$this->a_linked_scripts[] = $s_linked_script;
$this->a_linked_scripts[$s_linked_script] = $s_linked_script;
}
/**
@@ -244,7 +246,7 @@ class WebPage
*/
public function GetDetails($aFields)
{
$sHtml = "<table>\n";
$sHtml = "<table class=\"details\">\n";
$sHtml .= "<tbody>\n";
foreach($aFields as $aAttrib)
{
@@ -258,6 +260,9 @@ class WebPage
{
$sHtml .= "<td class=\"label\">".$aAttrib['label']."</td><td>".$aAttrib['value']."</td>\n";
}
$sComment = (isset($aAttrib['comments'])) ? $aAttrib['comments'] : '&nbsp;';
$sInfo = (isset($aAttrib['infos'])) ? $aAttrib['infos'] : '&nbsp;';
$sHtml .= "<td>$sComment</td><td>$sInfo</td>\n";
$sHtml .= "</tr>\n";
}
$sHtml .= "</tbody>\n";
@@ -279,11 +284,21 @@ class WebPage
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
echo "<html>\n";
echo "<head>\n";
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n";
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n";
echo "<title>{$this->s_title}</title>\n";
echo $this->get_base_tag();
foreach($this->a_linked_scripts as $s_script)
{
// 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)
{
$s_script .= "?version=".ITOP_VERSION;
}
else
{
$s_script .= "&version=".ITOP_VERSION;
}
echo "<script type=\"text/javascript\" src=\"$s_script\"></script>\n";
}
if (count($this->a_scripts)>0)
@@ -324,7 +339,7 @@ class WebPage
{
echo "<div class=\"raw_output\">$s_captured_output</div>\n";
}
echo $this->s_deferred_content;
echo '<div id="at_the_end">'.$this->s_deferred_content.'</div>';
echo "</body>\n";
echo "</html>\n";
}
@@ -369,5 +384,24 @@ class WebPage
{
return $this->iNextId++;
}
/**
* Set the transactionId of the current form
* @param $iTransactionId integer
* @return void
*/
public function SetTransactionId($iTransactionId)
{
$this->iTransactionId = $iTransactionId;
}
/**
* Returns the transactionId of the current form
* @return integer The current transactionID
*/
public function GetTransactionId()
{
return $this->iTransactionId;
}
}
?>

View File

@@ -121,6 +121,11 @@ class WizardHelper
}
}
}
if (isset($this->m_aData['m_sState']) && !empty($this->m_aData['m_sState']))
{
$oObj->Set(MetaModel::GetStateAttributeCode($this->m_aData['m_sClass']), $this->m_aData['m_sState']);
}
return $oObj;
}

View File

@@ -1,3 +1,11 @@
<?php
define('APPROOT', dirname(__FILE__).'/');
if (function_exists('microtime'))
{
$fItopStarted = microtime(true);
}
else
{
$fItopStarted = 1000 * time();
}
?>

View File

@@ -443,9 +443,9 @@ class Str
public static function pure2html($pure, $maxLength = false)
{
// Check for HTML entities, but be careful the DB is in UTF-8
return $maxLength
? htmlentities(substr($pure, 0, $maxLength), ENT_COMPAT, 'UTF-8')
: htmlentities($pure, ENT_COMPAT, 'UTF-8');
return $maxLength
? htmlentities(substr($pure, 0, $maxLength), ENT_QUOTES, 'UTF-8')
: htmlentities($pure, ENT_QUOTES, 'UTF-8');
}
public static function pure2sql($pure, $maxLength = false)
{

View File

@@ -24,6 +24,7 @@
*/
require_once(APPROOT.'/core/asynctask.class.inc.php');
require_once(APPROOT.'/core/email.class.inc.php');
/**
@@ -134,7 +135,7 @@ class ActionEmail extends ActionNotification
{
$aParams = array
(
"category" => "core/cmdb",
"category" => "core/cmdb,bizmodel",
"key_type" => "autoincrement",
"name_attcode" => "name",
"state_attcode" => "",
@@ -162,7 +163,7 @@ class ActionEmail extends ActionNotification
MetaModel::Init_SetZListItems('details', array('name', 'description', 'status', 'test_recipient', 'from', 'reply_to', 'to', 'cc', 'bcc', 'subject', 'body', 'importance', 'trigger_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('name', 'status', 'to', 'subject')); // 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('standard_search', array('name','description', 'status', 'subject')); // Criteria of the std search form
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
}
@@ -219,120 +220,82 @@ class ActionEmail extends ActionNotification
public function DoExecute($oTrigger, $aContextArgs)
{
$this->m_iRecipients = 0;
$this->m_aMailErrors = array();
$bRes = false; // until we do succeed in sending the email
try
{
// Determine recicipients
//
$sTo = $this->FindRecipients('to', $aContextArgs);
$sCC = $this->FindRecipients('cc', $aContextArgs);
$sBCC = $this->FindRecipients('bcc', $aContextArgs);
$sFrom = $this->Get('from');
$sReplyTo = $this->Get('reply_to');
$sSubject = MetaModel::ApplyParams($this->Get('subject'), $aContextArgs);
$sBody = MetaModel::ApplyParams($this->Get('body'), $aContextArgs);
$oObj = $aContextArgs['this->object()'];
$sServerIP = $_SERVER['SERVER_ADDR']; //gethostbyname(gethostname());
$sReference = '<iTop/'.get_class($oObj).'/'.$oObj->GetKey().'@'.$sServerIP.'>';
$oEmail = new EMail();
if ($this->IsBeingTested())
{
$oEmail->SetSubject('TEST['.$sSubject.']');
$sTestBody = $sBody;
$sTestBody .= "<div style=\"border: dashed;\">\n";
$sTestBody .= "<h1>Testing email notification ".$this->GetHyperlink()."</h1>\n";
$sTestBody .= "<p>The email should be sent with the following properties\n";
$sTestBody .= "<ul>\n";
$sTestBody .= "<li>TO: $sTo</li>\n";
$sTestBody .= "<li>CC: $sCC</li>\n";
$sTestBody .= "<li>BCC: $sBCC</li>\n";
$sTestBody .= "<li>From: $sFrom</li>\n";
$sTestBody .= "<li>Reply-To: $sReplyTo</li>\n";
$sTestBody .= "<li>References: $sReference</li>\n";
$sTestBody .= "</ul>\n";
$sTestBody .= "</p>\n";
$sTestBody .= "</div>\n";
$oEmail->SetBody($sTestBody);
$oEmail->SetRecipientTO($this->Get('test_recipient'));
$oEmail->SetRecipientFrom($this->Get('test_recipient'));
$oEmail->SetReferences($sReference);
}
else
{
$oEmail->SetSubject($sSubject);
$oEmail->SetBody($sBody);
$oEmail->SetRecipientTO($sTo);
$oEmail->SetRecipientCC($sCC);
$oEmail->SetRecipientBCC($sBCC);
$oEmail->SetRecipientFrom($sFrom);
$oEmail->SetRecipientReplyTo($sReplyTo);
$oEmail->SetReferences($sReference);
}
if (empty($this->m_aMailErrors))
{
if ($this->m_iRecipients == 0)
{
$this->m_aMailErrors[] = 'No recipient';
}
else
{
$oKPI = new ExecutionKPI();
$this->m_aMailErrors = array_merge($this->m_aMailErrors, $oEmail->Send());
$oKPI->ComputeStats('Send mail', $sTo);
}
}
}
catch (Exception $e)
{
$this->m_aMailErrors[] = $e->getMessage();
}
if (MetaModel::IsLogEnabledNotification())
{
$oLog = new EventNotificationEmail();
if (empty($this->m_aMailErrors))
if ($this->IsBeingTested())
{
if ($this->IsBeingTested())
{
$oLog->Set('message', 'TEST - Notification sent ('.$this->Get('test_recipient').')');
}
else
{
$oLog->Set('message', 'Notification sent');
}
$oLog->Set('message', 'TEST - Notification sent ('.$this->Get('test_recipient').')');
}
else
{
if (is_array($this->m_aMailErrors) && count($this->m_aMailErrors) > 0)
{
$sError = implode(', ', $this->m_aMailErrors);
}
else
{
$sError = 'Unknown reason';
}
if ($this->IsBeingTested())
{
$oLog->Set('message', 'TEST - Notification was not sent: '.$sError);
}
else
{
$oLog->Set('message', 'Notification was not sent: '.$sError);
}
$oLog->Set('message', 'Notification pending');
}
$oLog->Set('userinfo', UserRights::GetUser());
$oLog->Set('trigger_id', $oTrigger->GetKey());
$oLog->Set('action_id', $this->GetKey());
$oLog->Set('object_id', $aContextArgs['this->object()']->GetKey());
// Must be inserted now so that it gets a valid id that will make the link
// between an eventual asynchronous task (queued) and the log
$oLog->DBInsertNoReload();
}
else
{
$oLog = null;
}
try
{
$sRes = $this->_DoExecute($oTrigger, $aContextArgs, $oLog);
if ($this->IsBeingTested())
{
$sPrefix = 'TEST ('.$this->Get('test_recipient').') - ';
}
else
{
$sPrefix = '';
}
$oLog->Set('message', $sPrefix.$sRes);
}
catch (Exception $e)
{
if ($oLog)
{
$oLog->Set('message', 'Error: '.$e->getMessage());
}
}
if ($oLog)
{
$oLog->DBUpdate();
}
}
protected function _DoExecute($oTrigger, $aContextArgs, &$oLog)
{
$this->m_iRecipients = 0;
$this->m_aMailErrors = array();
$bRes = false; // until we do succeed in sending the email
// Determine recicipients
//
$sTo = $this->FindRecipients('to', $aContextArgs);
$sCC = $this->FindRecipients('cc', $aContextArgs);
$sBCC = $this->FindRecipients('bcc', $aContextArgs);
$sFrom = $this->Get('from');
$sReplyTo = $this->Get('reply_to');
$sSubject = MetaModel::ApplyParams($this->Get('subject'), $aContextArgs);
$sBody = MetaModel::ApplyParams($this->Get('body'), $aContextArgs);
$oObj = $aContextArgs['this->object()'];
$sServerIP = $_SERVER['SERVER_ADDR']; //gethostbyname(gethostname());
$sReference = '<iTop/'.get_class($oObj).'/'.$oObj->GetKey().'@'.$sServerIP.'>';
if (!is_null($oLog))
{
// Note: we have to secure this because those values are calculated
// inside the try statement, and we would like to keep track of as
// many data as we could while some variables may still be undefined
@@ -342,7 +305,77 @@ class ActionEmail extends ActionNotification
if (isset($sFrom)) $oLog->Set('from', $sFrom);
if (isset($sSubject)) $oLog->Set('subject', $sSubject);
if (isset($sBody)) $oLog->Set('body', $sBody);
$oLog->DBInsertNoReload();
}
$oEmail = new EMail();
if ($this->IsBeingTested())
{
$oEmail->SetSubject('TEST['.$sSubject.']');
$sTestBody = $sBody;
$sTestBody .= "<div style=\"border: dashed;\">\n";
$sTestBody .= "<h1>Testing email notification ".$this->GetHyperlink()."</h1>\n";
$sTestBody .= "<p>The email should be sent with the following properties\n";
$sTestBody .= "<ul>\n";
$sTestBody .= "<li>TO: $sTo</li>\n";
$sTestBody .= "<li>CC: $sCC</li>\n";
$sTestBody .= "<li>BCC: $sBCC</li>\n";
$sTestBody .= "<li>From: $sFrom</li>\n";
$sTestBody .= "<li>Reply-To: $sReplyTo</li>\n";
$sTestBody .= "<li>References: $sReference</li>\n";
$sTestBody .= "</ul>\n";
$sTestBody .= "</p>\n";
$sTestBody .= "</div>\n";
$oEmail->SetBody($sTestBody);
$oEmail->SetRecipientTO($this->Get('test_recipient'));
$oEmail->SetRecipientFrom($this->Get('test_recipient'));
$oEmail->SetReferences($sReference);
}
else
{
$oEmail->SetSubject($sSubject);
$oEmail->SetBody($sBody);
$oEmail->SetRecipientTO($sTo);
$oEmail->SetRecipientCC($sCC);
$oEmail->SetRecipientBCC($sBCC);
$oEmail->SetRecipientFrom($sFrom);
$oEmail->SetRecipientReplyTo($sReplyTo);
$oEmail->SetReferences($sReference);
}
if (empty($this->m_aMailErrors))
{
if ($this->m_iRecipients == 0)
{
return 'No recipient';
}
else
{
$iRes = $oEmail->Send($aErrors, false, $oLog); // allow asynchronous mode
switch ($iRes)
{
case EMAIL_SEND_OK:
return "Sent";
case EMAIL_SEND_PENDING:
return "Pending";
case EMAIL_SEND_ERROR:
return "Errors: ".implode(', ', $aErrors);
}
}
}
else
{
if (is_array($this->m_aMailErrors) && count($this->m_aMailErrors) > 0)
{
$sError = implode(', ', $this->m_aMailErrors);
}
else
{
$sError = 'Unknown reason';
}
return 'Notification was not sent: '.$sError;
}
}
}

View File

@@ -0,0 +1,192 @@
<?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 classes (internal): user defined actions
*
* @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
*/
class ExecAsyncTask implements iBackgroundProcess
{
public function GetPeriodicity()
{
return 2; // seconds
}
public function Process($iTimeLimit)
{
$sOQL = "SELECT AsyncTask WHERE ISNULL(started) AND (ISNULL(planned) OR (planned < NOW()))";
$oSet = new CMDBObjectSet(DBObjectSearch::FromOQL($sOQL), array('created' => true) /* order by*/, array());
$iProcessed = 0;
while ((time() < $iTimeLimit) && ($oTask = $oSet->Fetch()))
{
$oTask->Set('started', time());
$oTask->DBUpdate();
$oTask->Process();
$iProcessed++;
$oTask->DBDelete();
}
if ($iProcessed == $oSet->Count())
{
return "processed $iProcessed tasks";
}
else
{
return "processed $iProcessed tasks (remaining: ".($oSet->Count() - $iProcessed).")";
}
}
}
/**
* A
*
* @package iTopORM
*/
abstract class AsyncTask extends DBObject
{
public static function Init()
{
$aParams = array
(
"category" => "core/cmdb",
"key_type" => "autoincrement",
"name_attcode" => array('created'),
"state_attcode" => "",
"reconc_keys" => array(),
"db_table" => "priv_async_task",
"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 AttributeDateTime("created", array("allowed_values"=>null, "sql"=>"created", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeDateTime("started", array("allowed_values"=>null, "sql"=>"started", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
// planned... still not used - reserved for timer management
MetaModel::Init_AddAttribute(new AttributeDateTime("planned", array("allowed_values"=>null, "sql"=>"planned", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeExternalKey("event_id", array("targetclass"=>"Event", "jointype"=> "", "allowed_values"=>null, "sql"=>"event_id", "is_null_allowed"=>true, "on_target_delete"=>DEL_SILENT, "depends_on"=>array())));
// Display lists
// MetaModel::Init_SetZListItems('details', array()); // Attributes to be displayed for the complete details
// MetaModel::Init_SetZListItems('list', array()); // 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
}
protected function OnInsert()
{
$this->Set('created', time());
}
public function Process()
{
$sStatus = $this->DoProcess();
if ($this->Get('event_id') != 0)
{
$oEventLog = MetaModel::GetObject('Event', $this->Get('event_id'));
$oEventLog->Set('message', $sStatus);
$oEventLog->DBUpdate();
}
}
abstract public function DoProcess();
}
/**
* An email notification
*
* @package iTopORM
*/
class AsyncSendEmail extends AsyncTask
{
public static function Init()
{
$aParams = array
(
"category" => "core/cmdb",
"key_type" => "autoincrement",
"name_attcode" => "created",
"state_attcode" => "",
"reconc_keys" => array(),
"db_table" => "priv_async_send_email",
"db_key_field" => "id",
"db_finalclass_field" => "",
"display_template" => "",
);
MetaModel::Init_Params($aParams);
MetaModel::Init_InheritAttributes();
MetaModel::Init_AddAttribute(new AttributeText("to", array("allowed_values"=>null, "sql"=>"to", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("subject", array("allowed_values"=>null, "sql"=>"subject", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("body", array("allowed_values"=>null, "sql"=>"body", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("header", array("allowed_values"=>null, "sql"=>"header", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
// Display lists
// MetaModel::Init_SetZListItems('details', array('name', 'description', 'status', 'test_recipient', 'from', 'reply_to', 'to', 'cc', 'bcc', 'subject', 'body', 'importance', 'trigger_list')); // Attributes to be displayed for the complete details
// MetaModel::Init_SetZListItems('list', array('name', 'status', 'to', 'subject')); // 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
}
static public function AddToQueue($sTo, $sSubject, $sBody, $aHeaders, $oLog)
{
$oNew = MetaModel::NewObject(__class__);
if ($oLog)
{
$oNew->Set('event_id', $oLog->GetKey());
}
$oNew->Set('to', $sTo);
$oNew->Set('subject', $sSubject);
$oNew->Set('body', $sBody);
$sHeaders = serialize($aHeaders);
$oNew->Set('header', $sHeaders);
$oNew->DBInsert();
}
public function DoProcess()
{
$sTo = $this->Get('to');
$sSubject = $this->Get('subject');
$sBody = $this->Get('body');
$sHeaders = $this->Get('header');
$aHeaders = unserialize($sHeaders);
$oEmail = new EMail($sTo, $sSubject, $sBody, $aHeaders);
$iRes = $oEmail->Send($aIssues, true /* force synchro !!!!! */);
switch ($iRes)
{
case EMAIL_SEND_OK:
return "Sent";
case EMAIL_SEND_PENDING:
return "Bug - the email should be sent in synchronous mode";
case EMAIL_SEND_ERROR:
return "Failed: ".implode(', ', $aIssues);
}
}
}
?>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,33 @@
<?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
/**
* Class BackgroundProcess
* Any extension that must be called regularly to be executed in the background
*
* @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
*/
interface iBackgroundProcess
{
public function GetPeriodicity();
public function Process($iUnixTimeLimit);
}
?>

View File

@@ -52,19 +52,13 @@ abstract class CellChangeSpec
$this->m_sOql = $sOql;
}
static protected function ValueAsHtml($value)
public function GetPureValue()
{
if (MetaModel::IsValidObject($value))
{
return $value->GetHyperLink();
}
else
{
return htmlentities($value, ENT_QUOTES, 'UTF-8');
}
// Todo - distinguish both values
return $this->m_proposedValue;
}
public function GetValue()
public function GetDisplayableValue()
{
return $this->m_proposedValue;
}
@@ -101,10 +95,10 @@ class CellStatus_Modify extends CellChangeSpec
return 'Modified';
}
public function GetPreviousValue()
{
return $this->m_previousValue;
}
//public function GetPreviousValue()
//{
// return $this->m_previousValue;
//}
}
class CellStatus_Issue extends CellStatus_Modify
@@ -270,6 +264,22 @@ class BulkChange
$this->m_aOnDisappear = $aOnDisappear;
}
protected $m_bReportHtml = false;
protected $m_sReportCsvSep = ',';
protected $m_sReportCsvDelimiter = '"';
public function SetReportHtml()
{
$this->m_bReportHtml = true;
}
public function SetReportCsv($sSeparator = ',', $sDelimiter = '"')
{
$this->m_bReportHtml = false;
$this->m_sReportCsvSep = $sSeparator;
$this->m_sReportCsvDelimiter = $sDelimiter;
}
protected function ResolveExternalKey($aRowData, $sAttCode, &$aResults)
{
$oExtKey = MetaModel::GetAttributeDef($this->m_sClass, $sAttCode);
@@ -388,15 +398,31 @@ class BulkChange
// skip the private key, if any
if ($sAttCode == 'id') continue;
$res = $oTargetObj->CheckValue($sAttCode, $aRowData[$iCol]);
if ($res === true)
$oAttDef = MetaModel::GetAttributeDef($this->m_sClass, $sAttCode);
if ($oAttDef->IsLinkSet() && $oAttDef->IsIndirect())
{
$oTargetObj->Set($sAttCode, $aRowData[$iCol]);
try
{
$oSet = $oAttDef->MakeValueFromString($aRowData[$iCol]);
$oTargetObj->Set($sAttCode, $oSet);
}
catch(CoreException $e)
{
$aErrors[$sAttCode] = "Failed to process input: ".$e->getMessage();
}
}
else
{
// $res is a string with the error description
$aErrors[$sAttCode] = "Unexpected value for attribute '$sAttCode': $res";
{
$res = $oTargetObj->CheckValue($sAttCode, $aRowData[$iCol]);
if ($res === true)
{
$oTargetObj->Set($sAttCode, $aRowData[$iCol]);
}
else
{
// $res is a string with the error description
$aErrors[$sAttCode] = "Unexpected value for attribute '$sAttCode': $res";
}
}
}
@@ -409,25 +435,38 @@ class BulkChange
{
$aResults[$iCol]= new CellStatus_Void($aRowData[$iCol]);
}
if (isset($aErrors[$sAttCode]))
else
{
$aResults[$iCol]= new CellStatus_Issue($oTargetObj->Get($sAttCode), $oTargetObj->GetOriginal($sAttCode), $aErrors[$sAttCode]);
}
elseif (array_key_exists($sAttCode, $aChangedFields))
{
if ($oTargetObj->IsNew())
if ($this->m_bReportHtml)
{
$aResults[$iCol]= new CellStatus_Void($oTargetObj->Get($sAttCode));
$sCurValue = $oTargetObj->GetAsHTML($sAttCode);
$sOrigValue = $oTargetObj->GetOriginalAsHTML($sAttCode);
}
else
{
$aResults[$iCol]= new CellStatus_Modify($oTargetObj->Get($sAttCode), $oTargetObj->GetOriginal($sAttCode));
$sCurValue = $oTargetObj->GetAsCSV($sAttCode, $this->m_sReportCsvSep, $this->m_sReportCsvDelimiter);
$sOrigValue = $oTargetObj->GetOriginalAsCSV($sAttCode, $this->m_sReportCsvSep, $this->m_sReportCsvDelimiter);
}
if (isset($aErrors[$sAttCode]))
{
$aResults[$iCol]= new CellStatus_Issue($sCurValue, $sOrigValue, $aErrors[$sAttCode]);
}
elseif (array_key_exists($sAttCode, $aChangedFields))
{
if ($oTargetObj->IsNew())
{
$aResults[$iCol]= new CellStatus_Void($sCurValue);
}
else
{
$aResults[$iCol]= new CellStatus_Modify($sCurValue, $sOrigValue);
}
}
else
{
// By default... nothing happens
$aResults[$iCol]= new CellStatus_Void($aRowData[$iCol]);
}
}
else
{
// By default... nothing happens
$aResults[$iCol]= new CellStatus_Void($aRowData[$iCol]);
}
}
@@ -581,7 +620,14 @@ class BulkChange
//
if ($oChange)
{
$oTargetObj->DBUpdateTracked($oChange);
try
{
$oTargetObj->DBUpdateTracked($oChange);
}
catch(CoreException $e)
{
$aResult[$iRow]["__STATUS__"] = new RowStatus_Issue($e->getMessage());
}
}
}
else
@@ -610,12 +656,19 @@ class BulkChange
if (count($aChangedFields) > 0)
{
$aResult[$iRow]["__STATUS__"] = new RowStatus_Disappeared(count($aChangedFields));
// Optionaly record the results
//
if ($oChange)
{
$oTargetObj->DBUpdateTracked($oChange);
try
{
$oTargetObj->DBUpdateTracked($oChange);
}
catch(CoreException $e)
{
$aResult[$iRow]["__STATUS__"] = new RowStatus_Issue($e->getMessage());
}
}
}
else
@@ -806,7 +859,7 @@ class BulkChange
$oBulkChangeSearch = DBObjectSearch::FromOQL("SELECT CMDBChange WHERE userinfo LIKE '%(CSV)'");
$iQueryLimit = $bShowAll ? 0 : MetaModel::GetConfig()->GetMaxDisplayLimit() + 1;
$oBulkChanges = new DBObjectSet($oBulkChangeSearch, array('date' => false), array(), $iQueryLimit);
$oBulkChanges = new DBObjectSet($oBulkChangeSearch, array('date' => false), array(), null, $iQueryLimit);
$oAppContext = new ApplicationContext();
@@ -865,8 +918,10 @@ class BulkChange
// Assumption: there is only one class of objects being loaded
// Then the last class found gives us the class for every object
$aDetails[] = array('date' => $sDate, 'user' => $sUser, 'class' => $sClass, 'created' => $iCreated, 'modified' => $iModified);
if ( ($iModified > 0) || ($iCreated > 0))
{
$aDetails[] = array('date' => $sDate, 'user' => $sUser, 'class' => $sClass, 'created' => $iCreated, 'modified' => $iModified);
}
}
@@ -968,7 +1023,7 @@ EOF
{
$aObjects[$iObjId]['__created__'] = true;
}
elseif (is_subclass_of($oOperation, 'CMDBChangeOpSetAttribute'))
elseif ($oOperation instanceof CMDBChangeOpSetAttribute)
{
$sAttCode = $oOperation->Get('attcode');
@@ -1057,6 +1112,49 @@ EOF
}
$oPage->table($aConfig, $aDetails);
}
/**
* Get the user friendly name for an 'extended' attribute code i.e 'name', becomes 'Name' and 'org_id->name' becomes 'Organization->Name'
* @param string $sClassName The name of the class
* @param string $sAttCodeEx Either an attribute code or ext_key_name->att_code
* @return string A user friendly format of the string: AttributeName or AttributeName->ExtAttributeName
*/
public static function GetFriendlyAttCodeName($sClassName, $sAttCodeEx)
{
$sFriendlyName = '';
if (preg_match('/(.+)->(.+)/', $sAttCodeEx, $aMatches) > 0)
{
$sAttribute = $aMatches[1];
$sField = $aMatches[2];
$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttribute);
if ($oAttDef->IsExternalKey())
{
$sTargetClass = $oAttDef->GetTargetClass();
$oTargetAttDef = MetaModel::GetAttributeDef($sTargetClass, $sField);
$sFriendlyName = $oAttDef->GetLabel().'->'.$oTargetAttDef->GetLabel();
}
else
{
// hum, hum... should never happen, we'd better raise an exception
throw(new Exception(Dict::Format('UI:CSVImport:ErrorExtendedAttCode', $sAttCodeEx, $sAttribute, $sClassName)));
}
}
else
{
if ($sAttCodeEx == 'id')
{
$sFriendlyName = Dict::S('UI:CSVImport:idField');
}
else
{
$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCodeEx);
$sFriendlyName = $oAttDef->GetLabel();
}
}
return $sFriendlyName;
}
}

View File

@@ -232,7 +232,14 @@ class CMDBChangeOpSetAttributeScalar extends CMDBChangeOpSetAttribute
}
else
{
$sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sNewValue, $sOldValue);
if (strlen($sOldValue) == 0)
{
$sResult = Dict::Format('Change:AttName_SetTo', $sAttName, $sNewValue);
}
else
{
$sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sNewValue, $sOldValue);
}
}
}
elseif($bIsHtml && $oAttDef->IsExternalKey())
@@ -241,6 +248,14 @@ class CMDBChangeOpSetAttributeScalar extends CMDBChangeOpSetAttribute
$sFrom = MetaModel::GetHyperLink($sTargetClass, $sOldValue);
$sTo = MetaModel::GetHyperLink($sTargetClass, $sNewValue);
$sResult = "$sAttName set to $sTo (previous: $sFrom)";
if (strlen($sFrom) == 0)
{
$sResult = Dict::Format('Change:AttName_SetTo', $sAttName, $sTo);
}
else
{
$sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sTo, $sFrom);
}
}
elseif ($oAttDef instanceOf AttributeBlob)
{
@@ -248,7 +263,14 @@ class CMDBChangeOpSetAttributeScalar extends CMDBChangeOpSetAttribute
}
else
{
$sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sNewValue, $sOldValue);
if (strlen($sOldValue) == 0)
{
$sResult = Dict::Format('Change:AttName_SetTo', $sAttName, $sNewValue);
}
else
{
$sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sNewValue, $sOldValue);
}
}
}
return $sResult;
@@ -475,4 +497,61 @@ class CMDBChangeOpSetAttributeText extends CMDBChangeOpSetAttribute
}
}
/**
* Record the modification of a caselog (text)
* since the caselog itself stores the history
* of its entries, there is no need to duplicate
* the text here
*
* @package iTopORM
*/
class CMDBChangeOpSetAttributeCaseLog extends CMDBChangeOpSetAttribute
{
public static function Init()
{
$aParams = array
(
"category" => "core/cmdb",
"key_type" => "",
"name_attcode" => "change",
"state_attcode" => "",
"reconc_keys" => array(),
"db_table" => "priv_changeop_setatt_log",
"db_key_field" => "id",
"db_finalclass_field" => "",
);
MetaModel::Init_Params($aParams);
MetaModel::Init_InheritAttributes();
MetaModel::Init_AddAttribute(new AttributeInteger("lastentry", array("allowed_values"=>null, "sql"=>"lastentry", "default_value"=>0, "is_null_allowed"=>true, "depends_on"=>array())));
// Display lists
MetaModel::Init_SetZListItems('details', array('date', 'userinfo', 'attcode')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('date', 'userinfo', 'attcode')); // Attributes to be displayed for a list
}
/**
* Describe (as a text string) the modifications corresponding to this change
*/
public function GetDescription()
{
// Temporary, until we change the options of GetDescription() -needs a more global revision
$bIsHtml = true;
$sResult = '';
$oTargetObjectClass = $this->Get('objclass');
$oTargetObjectKey = $this->Get('objkey');
$oTargetSearch = new DBObjectSearch($oTargetObjectClass);
$oTargetSearch->AddCondition('id', $oTargetObjectKey, '=');
$oMonoObjectSet = new DBObjectSet($oTargetSearch);
if (UserRights::IsActionAllowedOnAttribute($this->Get('objclass'), $this->Get('attcode'), UR_ACTION_READ, $oMonoObjectSet) == UR_ALLOWED_YES)
{
$oAttDef = MetaModel::GetAttributeDef($this->Get('objclass'), $this->Get('attcode'));
$sAttName = $oAttDef->GetLabel();
$sResult = Dict::Format('Change:AttName_EntryAdded', $sAttName);
}
return $sResult;
}
}
?>

View File

@@ -59,6 +59,8 @@ require_once('dbobject.class.php');
require_once('dbobjectsearch.class.php');
require_once('dbobjectset.class.php');
require_once('backgroundprocess.inc.php');
require_once('asynctask.class.inc.php');
require_once('dbproperty.class.inc.php');
// db change tracking data model
@@ -175,6 +177,17 @@ abstract class CMDBObject extends DBObject
$oMyChangeOp->Set("prevdata", $original);
$iId = $oMyChangeOp->DBInsertNoReload();
}
elseif ($oAttDef instanceOf AttributeCaseLog)
{
$oMyChangeOp = MetaModel::NewObject("CMDBChangeOpSetAttributeCaseLog");
$oMyChangeOp->Set("change", $oChange->GetKey());
$oMyChangeOp->Set("objclass", get_class($this));
$oMyChangeOp->Set("objkey", $this->GetKey());
$oMyChangeOp->Set("attcode", $sAttCode);
$oMyChangeOp->Set("lastentry", $value->GetLatestEntryIndex());
$iId = $oMyChangeOp->DBInsertNoReload();
}
elseif ($oAttDef instanceOf AttributeText)
{
// Data blobs
@@ -187,6 +200,10 @@ abstract class CMDBObject extends DBObject
if (array_key_exists($sAttCode, $aOrigValues))
{
$original = $aOrigValues[$sAttCode];
if ($original instanceof ormCaseLog)
{
$original = $original->GetText();
}
}
else
{
@@ -352,28 +369,28 @@ abstract class CMDBObject extends DBObject
return $ret;
}
public function DBDelete()
public function DBDelete(&$oDeletionPlan = null)
{
if(!self::$m_oCurrChange)
{
throw new CoreException("DBDelete() could not be used here, please use DBDeleteTracked() instead");
}
return $this->DBDeleteTracked_Internal();
return $this->DBDeleteTracked_Internal($oDeletionPlan);
}
public function DBDeleteTracked(CMDBChange $oChange, $bSkipStrongSecurity = null)
public function DBDeleteTracked(CMDBChange $oChange, $bSkipStrongSecurity = null, &$oDeletionPlan = null)
{
$this->CheckUserRights($bSkipStrongSecurity, UR_ACTION_DELETE);
self::$m_oCurrChange = $oChange;
$this->DBDeleteTracked_Internal();
$this->DBDeleteTracked_Internal($oDeletionPlan);
self::$m_oCurrChange = null;
}
protected function DBDeleteTracked_Internal()
protected function DBDeleteTracked_Internal(&$oDeletionPlan = null)
{
$prevkey = $this->GetKey();
$ret = parent::DBDelete();
$ret = parent::DBDelete($oDeletionPlan);
$this->RecordObjDeletion(self::$m_oCurrChange, $prevkey);
return $ret;
}

View File

@@ -56,7 +56,7 @@ class CMDBSource
self::$m_sDBUser = $sUser;
self::$m_sDBPwd = $sPwd;
self::$m_sDBName = $sSource;
if (!self::$m_resDBLink = @mysql_pconnect($sServer, $sUser, $sPwd))
if (!self::$m_resDBLink = mysql_connect($sServer, $sUser, $sPwd))
{
throw new MySQLException('Could not connect to the DB server', array('host'=>$sServer, 'user'=>$sUser));
}
@@ -84,6 +84,17 @@ class CMDBSource
}
}
public static function SetTimezone($sTimezone = null)
{
// Note: requires the installation of MySQL special tables,
// otherwise, only 'SYSTEM' or "+10:00' may be specified which is NOT sufficient because of day light saving times
if (!is_null($sTimezone))
{
$sQuotedTimezone = self::Quote($sTimezone);
self::Query("SET time_zone = $sQuotedTimezone");
}
}
public static function ListDB()
{
$aDBs = self::QueryToCol('SHOW DATABASES', 'Database');
@@ -243,6 +254,31 @@ class CMDBSource
return false;
}
public static function DeleteFrom($sSQLQuery)
{
self::Query($sSQLQuery);
}
public static function QueryToScalar($sSql)
{
$result = mysql_query($sSql, self::$m_resDBLink);
if (!$result)
{
throw new MySQLException('Failed to issue SQL query', array('query' => $sSql));
}
if ($aRow = mysql_fetch_array($result, MYSQL_BOTH))
{
$res = $aRow[0];
}
else
{
mysql_free_result($result);
throw new MySQLException('Found no result for query', array('query' => $sSql));
}
mysql_free_result($result);
return $res;
}
public static function QueryToArray($sSql)
{
$aData = array();

View File

@@ -14,6 +14,7 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
define('ITOP_APPLICATION', 'iTop');
define('ITOP_VERSION', '$ITOP_VERSION$');
define('ITOP_REVISION', '$WCREV$');
define('ITOP_BUILD_DATE', '$WCNOW$');
@@ -39,7 +40,7 @@ class ConfigException extends CoreException
}
define ('DEFAULT_CHARACTER_SET', 'utf8');
define ('DEFAULT_COLLATION', 'utf8_general_ci');
define ('DEFAULT_COLLATION', 'utf8_unicode_ci');
define ('DEFAULT_LOG_GLOBAL', true);
define ('DEFAULT_LOG_NOTIFICATION', true);
@@ -94,7 +95,7 @@ class Config
),
'skip_check_ext_keys' => array(
'type' => 'bool',
'description' => 'Disable external key check when checking the value of attribtutes',
'description' => 'Disable external key check when checking the value of attributes',
'default' => false,
'value' => false,
'source_of_value' => '',
@@ -125,7 +126,7 @@ class Config
'show_in_conf_sample' => true,
),
'max_combo_length' => array(
'type' => 'int',
'type' => 'integer',
'description' => 'The maximum number of elements in a drop-down list. If more then an autocomplete will be used',
'default' => 50,
'value' => 50,
@@ -133,7 +134,7 @@ class Config
'show_in_conf_sample' => false,
),
'min_autocomplete_chars' => array(
'type' => 'int',
'type' => 'integer',
'description' => 'The minimum number of characters to type in order to trigger the "autocomplete" behavior',
'default' => 3,
'value' => 3,
@@ -205,6 +206,104 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'log_usage' => array(
'type' => 'bool',
'description' => 'Log the usage of the application (i.e. the date/time and the user name of each login)',
'default' => false,
'value' => false,
'source_of_value' => '',
'show_in_conf_sample' => false,
),
'synchro_trace' => array(
'type' => 'string',
'description' => 'Synchronization details: none, display, save (includes \'display\')',
'default' => 'none',
'value' => 'none',
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'link_set_item_separator' => array(
'type' => 'string',
'description' => 'Link set from string: line separator',
'default' => '|',
'value' => '|',
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'link_set_attribute_separator' => array(
'type' => 'string',
'description' => 'Link set from string: attribute separator',
'default' => ';',
'value' => ';',
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'link_set_value_separator' => array(
'type' => 'string',
'description' => 'Link set from string: value separator (between the attcode and the value itself',
'default' => ':',
'value' => ':',
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'link_set_attribute_qualifier' => array(
'type' => 'string',
'description' => 'Link set from string: attribute qualifier (encloses both the attcode and the value)',
'default' => "'",
'value' => "'",
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'cron_max_execution_time' => array(
'type' => 'integer',
'description' => 'Duration (seconds) of the page cron.php, must be shorter than php setting max_execution_time and shorter than the web server response timeout',
'default' => 600,
'value' => 600,
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'cron_sleep' => array(
'type' => 'integer',
'description' => 'Duration (seconds) before cron.php checks again if something must be done',
'default' => 2,
'value' => 2,
'source_of_value' => '',
'show_in_conf_sample' => false,
),
'email_asynchronous' => array(
'type' => 'bool',
'description' => 'If set, the emails are sent off line, which requires cron.php to be activated. Exception: some features like the email test utility will force the serialized mode',
'default' => false,
'value' => false,
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'apc_cache.enabled' => array(
'type' => 'bool',
'description' => 'If set, the APC cache is allowed (the PHP extension must also be active)',
'default' => true,
'value' => true,
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'apc_cache.query_ttl' => array(
'type' => 'integer',
'description' => 'Time to live set in APC for the prepared queries (seconds - 0 means no timeout)',
'default' => 3600,
'value' => 3600,
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'timezone' => array(
'type' => 'string',
'description' => 'Timezone (reference: http://php.net/manual/en/timezones.php). If empty, it will be left unchanged and MUST be explicitely configured in PHP',
// examples... not used (nor 'description')
'examples' => array('America/Sao_Paulo', 'America/New_York (standing for EDT)', 'America/Los_Angeles (standing for PDT)', 'Asia/Istanbul', 'Asia/Singapore', 'Africa/Casablanca', 'Australia/Sydney'),
'default' => 'Europe/Paris',
'value' => 'Europe/Paris',
'source_of_value' => '',
'show_in_conf_sample' => true,
),
);
public function IsProperty($sPropCode)
@@ -333,7 +432,7 @@ class Config
'application/menunode.class.inc.php',
'application/user.preferences.class.inc.php',
'application/audit.rule.class.inc.php',
// Romain - That's dirty, because those 3 classes are in fact part of the core
// 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
// the core, PLUS I needed the includes to be there also for the setup
@@ -341,6 +440,7 @@ class Config
'core/event.class.inc.php',
'core/action.class.inc.php',
'core/trigger.class.inc.php',
'synchro/synchrodatasource.class.inc.php',
);
$this->m_aDataModels = array();
$this->m_aWebServiceCategories = array(
@@ -368,6 +468,10 @@ class Config
'dictionaries/tr.dictionary.itop.core.php', // Support for Turkish
'dictionaries/zh.dictionary.itop.ui.php', // Support for Chinese
'dictionaries/zh.dictionary.itop.core.php', // Support for Chinese
'dictionaries/it.dictionary.itop.ui.php', // Support for Italian
'dictionaries/it.dictionary.itop.core.php', // Support for Italian
'dictionaries/hu.dictionary.itop.ui.php', // Support for Hungarian
'dictionaries/hu.dictionary.itop.core.php', // Support for Hungarian
);
foreach($this->m_aSettings as $sPropCode => $aSettingInfo)
{
@@ -441,7 +545,7 @@ class Config
if (strlen($sNoise) > 0)
{
// Note: sNoise is an html output, but so far it was ok for me (e.g. showing the entire call stack)
throw new ConfigException('Syntax error in configuration file', array('file' => $sConfigFile, 'error' => '<tt>'.htmlentities($sNoise).'</tt>'));
throw new ConfigException('Syntax error in configuration file', array('file' => $sConfigFile, 'error' => '<tt>'.htmlentities($sNoise, ENT_QUOTES, 'UTF-8').'</tt>'));
}
if (!isset($MySettings) || !is_array($MySettings))
@@ -943,7 +1047,7 @@ class Config
$sSeenAs = $aSettingInfo['value'] ? '1' : '0';
break;
default:
$sSeenAs = "'".$aSettingInfo['value']."'";
$sSeenAs = "'".addslashes($aSettingInfo['value'])."'";
}
fwrite($hFile, "\t'$sPropCode' => $sSeenAs,\n");
}

View File

@@ -40,6 +40,8 @@ define('evTEXTQUAL', 3); // used for escaping as well
define('evOTHERCHAR', 4);
define('evEND', 5);
define('NULL_VALUE', '<NULL>');
/**
* CSVParser
@@ -82,6 +84,10 @@ class CSVParser
{
$sCell = $this->m_sCurrCell;
}
if ($sCell == NULL_VALUE)
{
$sCell = null;
}
if (!is_null($aFieldMap))
{
@@ -178,6 +184,7 @@ class CSVParser
{
if ($i == $iDataLength)
{
$c = null;
$iEvent = evEND;
}
else

View File

@@ -24,6 +24,8 @@
*/
require_once('metamodel.class.php');
require_once('deletionplan.class.inc.php');
/**
* A persistent object, as defined by the metamodel
@@ -34,27 +36,37 @@ abstract class DBObject
{
private static $m_aMemoryObjectsByClass = array();
private static $m_aBulkInsertItems = array(); // class => array of ('table' => array of (array of <sql_value>))
private static $m_aBulkInsertCols = array(); // class => array of ('table' => array of <sql_column>)
private static $m_bBulkInsert = false;
private $m_bIsInDB = false; // true IIF the object is mapped to a DB record
private $m_iKey = null;
private $m_aCurrValues = array();
protected $m_aOrigValues = array();
protected $m_aExtendedData = null;
private $m_bDirty = false; // Means: "a modification is ongoing"
// The object may have incorrect external keys, then any attempt of reload must be avoided
private $m_bCheckStatus = null; // Means: the object has been verified and is consistent with integrity rules
// if null, then the check has to be performed again to know the status
protected $m_bSecurityIssue = null;
protected $m_aCheckIssues = null;
protected $m_aDeleteIssues = null;
protected $m_aAsArgs = null; // The current object as a standard argument (cache)
private $m_bFullyLoaded = false; // Compound objects can be partially loaded
private $m_aLoadedAtt = array(); // Compound objects can be partially loaded, array of sAttCode
protected $m_oMasterReplicaSet = null; // Set of SynchroReplica related to this object
// Use the MetaModel::NewObject to build an object (do we have to force it?)
public function __construct($aRow = null, $sClassAlias = '')
public function __construct($aRow = null, $sClassAlias = '', $aExtendedDataSpec = null)
{
if (!empty($aRow))
{
$this->FromRow($aRow, $sClassAlias);
$this->FromRow($aRow, $sClassAlias, $aExtendedDataSpec);
$this->m_bFullyLoaded = $this->IsFullyLoaded();
return;
}
@@ -98,12 +110,13 @@ abstract class DBObject
// Returns an Id for memory objects
static protected function GetNextTempId($sClass)
{
if (!array_key_exists($sClass, self::$m_aMemoryObjectsByClass))
$sRootClass = MetaModel::GetRootClass($sClass);
if (!array_key_exists($sRootClass, self::$m_aMemoryObjectsByClass))
{
self::$m_aMemoryObjectsByClass[$sClass] = 0;
self::$m_aMemoryObjectsByClass[$sRootClass] = 0;
}
self::$m_aMemoryObjectsByClass[$sClass]++;
return (- self::$m_aMemoryObjectsByClass[$sClass]);
self::$m_aMemoryObjectsByClass[$sRootClass]++;
return (- self::$m_aMemoryObjectsByClass[$sRootClass]);
}
public function __toString()
@@ -144,7 +157,7 @@ abstract class DBObject
protected function Reload()
{
assert($this->m_bIsInDB);
$aRow = MetaModel::MakeSingleRow(get_class($this), $this->m_iKey);
$aRow = MetaModel::MakeSingleRow(get_class($this), $this->m_iKey, false/*, $this->m_bAllowAllData*/);
if (empty($aRow))
{
throw new CoreException("Failed to reload object of class '".get_class($this)."', id = ".$this->m_iKey);
@@ -181,7 +194,7 @@ abstract class DBObject
$this->m_bFullyLoaded = true;
}
protected function FromRow($aRow, $sClassAlias = '')
protected function FromRow($aRow, $sClassAlias = '', $aExtendedDataSpec = null)
{
if (strlen($sClassAlias) == 0)
{
@@ -204,15 +217,20 @@ abstract class DBObject
// #@# Bug ?
throw new CoreException("Missing key for class '".get_class($this)."'");
}
else
$iPKey = $aRow[$sKeyField];
if (!self::IsValidPKey($iPKey))
{
$iPKey = $aRow[$sKeyField];
if (!self::IsValidPKey($iPKey))
if (is_null($iPKey))
{
throw new CoreWarning("An object id must be an integer value ($iPKey)");
throw new CoreException("Missing object id in query result (found null)");
}
else
{
throw new CoreException("An object id must be an integer value ($iPKey)");
}
$this->m_iKey = $iPKey;
}
$this->m_iKey = $iPKey;
// Build the object from an array of "attCode"=>"value")
//
@@ -230,6 +248,7 @@ abstract class DBObject
// Take care: the function isset will return false in case the value is null,
// which is something that could happen on open joins
$sAttRef = $sClassAlias.$sAttCode;
if (array_key_exists($sAttRef, $aRow))
{
$value = $oAttDef->FromSQLToValue($aRow, $sAttRef);
@@ -244,6 +263,20 @@ abstract class DBObject
$bFullyLoaded = false;
}
}
// Load extended data
if ($aExtendedDataSpec != null)
{
$aExtendedDataSpec['table'];
foreach($aExtendedDataSpec['fields'] as $sColumn)
{
$sColRef = $sClassAlias.'_extdata_'.$sColumn;
if (array_key_exists($sColRef, $aRow))
{
$this->m_aExtendedData[$sColumn] = $aRow[$sColRef];
}
}
}
return $bFullyLoaded;
}
@@ -310,7 +343,7 @@ abstract class DBObject
}
}
$realvalue = $oAttDef->MakeRealValue($value);
$realvalue = $oAttDef->MakeRealValue($value, $this);
$this->m_aCurrValues[$sAttCode] = $realvalue;
// The object has changed, reset caches
@@ -321,6 +354,12 @@ abstract class DBObject
$this->RegisterAsDirty();
}
public function GetLabel($sAttCode)
{
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
return $oAttDef->GetLabel();
}
public function Get($sAttCode)
{
if (!array_key_exists($sAttCode, MetaModel::ListAttributeDefs(get_class($this))))
@@ -332,7 +371,12 @@ abstract class DBObject
// #@# non-scalar attributes.... handle that differently
$this->Reload();
}
return $this->m_aCurrValues[$sAttCode];
$value = $this->m_aCurrValues[$sAttCode];
if ($value instanceof DBObjectSet)
{
$value->Rewind();
}
return $value;
}
public function GetOriginal($sAttCode)
@@ -344,6 +388,14 @@ abstract class DBObject
return $this->m_aOrigValues[$sAttCode];
}
/**
* Returns data loaded by the mean of a dynamic and explicit JOIN
*/
public function GetExtendedData()
{
return $this->m_aExtendedData;
}
/**
* Updates the value of an external field by (re)loading the object
* corresponding to the external key and getting the value from it
@@ -366,23 +418,25 @@ abstract class DBObject
}
}
// Compute scalar attributes that depend on any other type of attribute
public function DoComputeValues()
public function ComputeValues()
{
if (is_callable(array($this, 'ComputeValues')))
}
// Compute scalar attributes that depend on any other type of attribute
final public function DoComputeValues()
{
// TODO - use a flag rather than checking the call stack -> this will certainly accelerate things
// First check that we are not currently computing the fields
// (yes, we need to do some things like Set/Get to compute the fields which will in turn trigger the update...)
foreach (debug_backtrace() as $aCallInfo)
{
// First check that we are not currently computing the fields
// (yes, we need to do some things like Set/Get to compute the fields which will in turn trigger the update...)
foreach (debug_backtrace() as $aCallInfo)
{
if (!array_key_exists("class", $aCallInfo)) continue;
if ($aCallInfo["class"] != get_class($this)) continue;
if ($aCallInfo["function"] != "ComputeValues") continue;
return; //skip!
}
$this->ComputeValues();
if (!array_key_exists("class", $aCallInfo)) continue;
if ($aCallInfo["class"] != get_class($this)) continue;
if ($aCallInfo["function"] != "ComputeValues") continue;
return; //skip!
}
$this->ComputeValues();
}
public function GetAsHTML($sAttCode)
@@ -390,22 +444,13 @@ abstract class DBObject
$sClass = get_class($this);
$oAtt = MetaModel::GetAttributeDef($sClass, $sAttCode);
$aExtKeyFriends = MetaModel::GetExtKeyFriends($sClass, $sAttCode);
if (count($aExtKeyFriends) > 0)
if ($oAtt->IsExternalKey(EXTKEY_ABSOLUTE))
{
// This attribute is an ext key (in this class or in another class)
// The corresponding value is an id of the remote object
// Let's try to use the corresponding external fields for a sexy display
$aAvailableFields = array();
foreach ($aExtKeyFriends as $sDispAttCode => $oExtField)
{
// $aAvailableFields[$oExtField->GetExtAttCode()] = $oExtField->GetAsHTML($this->Get($oExtField->GetCode()));
$aAvailableFields[$oExtField->GetExtAttCode()] = $this->Get($oExtField->GetCode());
}
//return $this->Get($sAttCode.'_friendlyname');
$sTargetClass = $oAtt->GetTargetClass(EXTKEY_ABSOLUTE);
return $this->MakeHyperLink($sTargetClass, $this->Get($sAttCode), $aAvailableFields);
$iTargetKey = $this->Get($sAttCode);
$sLabel = $this->Get($sAttCode.'_friendlyname');
return $this->MakeHyperLink($sTargetClass, $iTargetKey, $sLabel);
}
// That's a standard attribute (might be an ext field or a direct field, etc.)
@@ -437,23 +482,7 @@ abstract class DBObject
}
else
{
$aAvailableFields = array();
// retrieve the "external fields" linked to this external key
foreach (MetaModel::GetExternalFields(get_class($this), $sAttCode) as $oExtField)
{
$aAvailableFields[$oExtField->GetExtAttCode()] = $oExtField->GetAsHTML($this->Get($oExtField->GetCode()));
}
// Use the "name" of the target class as the label of the hyperlink
// unless it's not available in the external fields...
$sExtClassNameAtt = MetaModel::GetNameAttributeCode($sTargetClass);
if (isset($aAvailableFields[$sExtClassNameAtt]))
{
$sEditValue = $aAvailableFields[$sExtClassNameAtt];
}
else
{
$sEditValue = implode(' / ', $aAvailableFields);
}
$sEditValue = $this->Get($sAttCode.'_friendlyname');
}
}
else
@@ -466,26 +495,89 @@ abstract class DBObject
public function GetAsXML($sAttCode)
{
$oAtt = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
return $oAtt->GetAsXML($this->Get($sAttCode));
return $oAtt->GetAsXML($this->Get($sAttCode), $this);
}
public function GetAsCSV($sAttCode, $sSeparator = ',', $sTextQualifier = '"')
{
$oAtt = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
return $oAtt->GetAsCSV($this->Get($sAttCode), $sSeparator, $sTextQualifier);
return $oAtt->GetAsCSV($this->Get($sAttCode), $sSeparator, $sTextQualifier, $this);
}
protected static function MakeHyperLink($sObjClass, $sObjKey, $aAvailableFields)
public function GetOriginalAsHTML($sAttCode)
{
if ($sObjKey == 0) return '<em>undefined</em>';
$oAtt = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
return $oAtt->GetAsHTML($this->GetOriginal($sAttCode), $this);
}
return MetaModel::GetName($sObjClass)."::$sObjKey";
public function GetOriginalAsXML($sAttCode)
{
$oAtt = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
return $oAtt->GetAsXML($this->GetOriginal($sAttCode), $this);
}
public function GetOriginalAsCSV($sAttCode, $sSeparator = ',', $sTextQualifier = '"')
{
$oAtt = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
return $oAtt->GetAsCSV($this->GetOriginal($sAttCode), $sSeparator, $sTextQualifier, $this);
}
protected static function MakeHyperLink($sObjClass, $sObjKey, $sLabel = '')
{
if ($sObjKey <= 0) return '<em>'.Dict::S('UI:UndefinedObject').'</em>'; // Objects built in memory have negative IDs
$oAppContext = new ApplicationContext();
$sPage = self::ComputeUIPage($sObjClass);
$sAbsoluteUrl = utils::GetAbsoluteUrlPath();
// Safety net
//
if (empty($sLabel))
{
// If the object if not issued from a query but constructed programmatically
// the label may be empty. In this case run a query to get the object's friendly name
$oTmpObj = MetaModel::GetObject($sObjClass, $sObjKey);
$sLabel = $oTmpObj->GetName();
//$sLabel = MetaModel::GetName($sObjClass)." #$sObjKey";
}
$sHint = MetaModel::GetName($sObjClass)."::$sObjKey";
return "<a href=\"{$sAbsoluteUrl}{$sPage}?operation=details&class=$sObjClass&id=$sObjKey&".$oAppContext->GetForLink()."\" title=\"$sHint\">$sLabel</a>";
}
public function GetHyperlink()
{
$aAvailableFields[MetaModel::GetNameAttributeCode(get_class($this))] = $this->GetName();
return $this->MakeHyperLink(get_class($this), $this->GetKey(), $aAvailableFields);
if ($this->IsNew()) return '<em>'.Dict::S('UI:UndefinedObject').'</em>'; // Objects built in memory have negative IDs
$oAppContext = new ApplicationContext();
$sPage = $this->GetUIPage();
$sAbsoluteUrl = utils::GetAbsoluteUrlPath();
$sObjClass = get_class($this);
$sObjKey = $this->GetKey();
$sLabel = $this->GetName();
$sHint = MetaModel::GetName($sObjClass)."::$sObjKey";
return "<a href=\"{$sAbsoluteUrl}{$sPage}?operation=details&class=$sObjClass&id=$sObjKey&".$oAppContext->GetForLink()."\" title=\"$sHint\">$sLabel</a>";
}
public static function ComputeUIPage($sClass)
{
static $aUIPagesCache = array(); // Cache to store the php page used to display each class of object
if (!isset($aUIPagesCache[$sClass]))
{
$UIPage = false;
if (is_callable("$sClass::GetUIPage"))
{
$UIPage = eval("return $sClass::GetUIPage();"); // May return false in case of error
}
$aUIPagesCache[$sClass] = $UIPage === false ? './UI.php' : $UIPage;
}
$sPage = $aUIPagesCache[$sClass];
return $sPage;
}
public static function GetUIPage()
{
return 'UI.php';
}
@@ -524,15 +616,23 @@ abstract class DBObject
public function GetName()
{
$sNameAttCode = MetaModel::GetNameAttributeCode(get_class($this));
if (empty($sNameAttCode))
{
return $this->m_iKey;
}
else
{
return $this->Get($sNameAttCode);
$aNameSpec = MetaModel::GetNameSpec(get_class($this));
$sFormat = $aNameSpec[0];
$aAttributes = $aNameSpec[1];
$aValues = array();
foreach ($aAttributes as $sAttCode)
{
if (empty($sAttCode))
{
$aValues[] = $this->m_iKey;
}
else
{
$aValues[] = $this->Get($sAttCode);
}
}
return vsprintf($sFormat, $aValues);
}
public function GetState()
@@ -581,7 +681,7 @@ abstract class DBObject
* @param string $sAttCode The code of the attribute
* @return integer Flags: the binary combination of the flags applicable to this attribute
*/
public function GetAttributeFlags($sAttCode)
public function GetAttributeFlags($sAttCode, &$aReasons = array())
{
$iFlags = 0; // By default (if no life cycle) no flag at all
$sStateAttCode = MetaModel::GetStateAttributeCode(get_class($this));
@@ -589,7 +689,9 @@ abstract class DBObject
{
$iFlags = MetaModel::GetAttributeFlags(get_class($this), $this->Get($sStateAttCode), $sAttCode);
}
return $iFlags;
$aReasons = array();
$iSynchroFlags = $this->GetSynchroReplicaFlags($sAttCode, $aReasons);
return $iFlags | $iSynchroFlags; // Combine both sets of flags
}
// check if the given (or current) value is suitable for the attribute
@@ -673,6 +775,7 @@ abstract class DBObject
$this->DoComputeValues();
$this->m_aCheckIssues = array();
$aChanges = $this->ListChanges();
foreach(MetaModel::ListAttributeDefs(get_class($this)) as $sAttCode=>$oAttDef)
{
@@ -695,6 +798,27 @@ abstract class DBObject
// $res contains the error description
$this->m_aCheckIssues[] = "Consistency rules not followed: $res";
}
// Synchronization: are we attempting to modify an attribute for which an external source is master?
//
if ($this->m_bIsInDB && $this->InSyncScope() && (count($aChanges) > 0))
{
foreach($aChanges as $sAttCode => $value)
{
$iFlags = $this->GetSynchroReplicaFlags($sAttCode, $aReasons);
if ($iFlags & OPT_ATT_SLAVE)
{
// Note: $aReasonInfo['name'] could be reported (the task owning the attribute)
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
$sAttLabel = $oAttDef->GetLabel();
foreach($aReasons as $aReasonInfo)
{
// Todo: associate the attribute code with the error
$this->m_aCheckIssues[] = Dict::Format('UI:AttemptingToSetASlaveAttribute_Name', $sAttLabel);
}
}
}
}
}
final public function CheckToWrite()
@@ -717,16 +841,71 @@ abstract class DBObject
$this->m_bCheckStatus = false;
}
}
return array($this->m_bCheckStatus, $this->m_aCheckIssues);
return array($this->m_bCheckStatus, $this->m_aCheckIssues, $this->m_bSecurityIssue);
}
// check if it is allowed to delete the existing object from the database
// a displayable error is returned
public function CheckToDelete()
protected function DoCheckToDelete(&$oDeletionPlan)
{
return true;
$this->m_aDeleteIssues = array(); // Ok
if ($this->InSyncScope())
{
$oReplicaSet = $this->GetMasterReplica();
if ($oReplicaSet->Count() > 0)
{
while($aData = $oReplicaSet->FetchAssoc())
{
$oDataSource = $aData['datasource'];
$oReplica = $aData['replica'];
$oDeletionPlan->AddToDelete($oReplica, DEL_SILENT);
if ($oDataSource->GetKey() == SynchroDataSource::GetCurrentTaskId())
{
// The current task has the right to delete the object
continue;
}
if ($oReplica->Get('status_dest_creator') != 1)
{
// The object is not owned by the task
continue;
}
$sLink = $oDataSource->GetName();
$sUserDeletePolicy = $oDataSource->Get('user_delete_policy');
switch($sUserDeletePolicy)
{
case 'nobody':
$this->m_aDeleteIssues[] = Dict::Format('Core:Synchro:TheObjectCannotBeDeletedByUser_Source', $sLink);
break;
case 'administrators':
if (!UserRights::IsAdministrator())
{
$this->m_aDeleteIssues[] = Dict::Format('Core:Synchro:TheObjectCannotBeDeletedByUser_Source', $sLink);
}
break;
case 'everybody':
default:
// Ok
break;
}
}
}
}
}
final public function CheckToDelete(&$oDeletionPlan)
{
$this->MakeDeletionPlan($oDeletionPlan);
$oDeletionPlan->ComputeResults();
return (!$oDeletionPlan->FoundStopper());
}
protected function ListChangedValues(array $aProposal)
{
$aDelta = array();
@@ -739,9 +918,9 @@ abstract class DBObject
}
elseif(is_object($proposedValue))
{
$oLinkAttDef = MetaModel::GetAttributeDef(get_class($this), $sAtt);
// The value is an object, the comparison is not strict
// #@# todo - should be even less strict => add verb on AttributeDefinition: Compare($a, $b)
if ($this->m_aOrigValues[$sAtt] != $proposedValue)
if (!$oLinkAttDef->Equals($proposedValue, $this->m_aOrigValues[$sAtt]))
{
$aDelta[$sAtt] = $proposedValue;
}
@@ -766,16 +945,58 @@ abstract class DBObject
// Returns an array of attname => currentvalue
public function ListChanges()
{
return $this->ListChangedValues($this->m_aCurrValues);
if ($this->m_bIsInDB)
{
return $this->ListChangedValues($this->m_aCurrValues);
}
else
{
return $this->m_aCurrValues;
}
}
// Tells whether or not an object was modified
// Tells whether or not an object was modified since last read (ie: does it differ from the DB ?)
public function IsModified()
{
$aChanges = $this->ListChanges();
return (count($aChanges) != 0);
}
public function Equals($oSibling)
{
if (get_class($oSibling) != get_class($this))
{
return false;
}
if ($this->GetKey() != $oSibling->GetKey())
{
return false;
}
if ($this->m_bIsInDB)
{
// If one has changed, then consider them as being different
if ($this->IsModified() || $oSibling->IsModified())
{
return false;
}
}
else
{
// Todo - implement this case (loop on every attribute)
//foreach(MetaModel::ListAttributeDefs(get_class($this) as $sAttCode => $oAttDef)
//{
//if (!isset($this->m_CurrentValues[$sAttCode])) continue;
//if (!isset($this->m_CurrentValues[$sAttCode])) continue;
//if (!$oAttDef->Equals($this->m_CurrentValues[$sAttCode], $oSibling->m_CurrentValues[$sAttCode]))
//{
//return false;
//}
//}
return false;
}
return true;
}
// used both by insert/update
private function DBWriteLinks()
{
@@ -814,6 +1035,35 @@ abstract class DBObject
}
}
// Note: this is experimental - it was designed to speed up the setup of iTop
// Known limitations:
// - does not work with multi-table classes (issue with the unique id to maintain in several tables)
// - the id of the object is not updated
static public final function BulkInsertStart()
{
self::$m_bBulkInsert = true;
}
static public final function BulkInsertFlush()
{
if (!self::$m_bBulkInsert) return;
foreach(self::$m_aBulkInsertCols as $sClass => $aTables)
{
foreach ($aTables as $sTable => $sColumns)
{
$sValues = implode(', ', self::$m_aBulkInsertItems[$sClass][$sTable]);
$sInsertSQL = "INSERT INTO `$sTable` ($sColumns) VALUES $sValues";
$iNewKey = CMDBSource::InsertInto($sInsertSQL);
}
}
// Reset
self::$m_aBulkInsertItems = array();
self::$m_aBulkInsertCols = array();
self::$m_bBulkInsert = false;
}
private function DBInsertSingleTable($sTableClass)
{
$sTable = MetaModel::DBGetTable($sTableClass);
@@ -847,15 +1097,27 @@ abstract class DBObject
if (count($aValuesToWrite) == 0) return false;
$sInsertSQL = "INSERT INTO `$sTable` (".join(",", $aFieldsToWrite).") VALUES (".join(", ", $aValuesToWrite).")";
if (MetaModel::DBIsReadOnly())
{
$iNewKey = -1;
}
else
{
$iNewKey = CMDBSource::InsertInto($sInsertSQL);
if (self::$m_bBulkInsert)
{
if (!isset(self::$m_aBulkInsertCols[$sClass][$sTable]))
{
self::$m_aBulkInsertCols[$sClass][$sTable] = implode(', ', $aFieldsToWrite);
}
self::$m_aBulkInsertItems[$sClass][$sTable][] = '('.implode (', ', $aValuesToWrite).')';
$iNewKey = 999999; // TODO - compute next id....
}
else
{
$sInsertSQL = "INSERT INTO `$sTable` (".join(",", $aFieldsToWrite).") VALUES (".join(", ", $aValuesToWrite).")";
$iNewKey = CMDBSource::InsertInto($sInsertSQL);
}
}
// Note that it is possible to have a key defined here, and the autoincrement expected, this is acceptable in a non root class
if (empty($this->m_iKey))
@@ -901,7 +1163,8 @@ abstract class DBObject
list($bRes, $aIssues) = $this->CheckToWrite();
if (!$bRes)
{
throw new CoreException("Object not following integrity rules - it will not be written into the DB", array('class' => $sClass, 'id' => $this->GetKey(), 'issues' => $aIssues));
$sIssues = implode(', ', $aIssues);
throw new CoreException("Object not following integrity rules", array('issues' => $sIssues, 'class' => get_class($this), 'id' => $this->GetKey()));
}
// First query built upon on the root class, because the ID must be created first
@@ -998,7 +1261,8 @@ abstract class DBObject
list($bRes, $aIssues) = $this->CheckToWrite();
if (!$bRes)
{
throw new CoreException("Object not following integrity rules - it will not be written into the DB", array('class' => get_class($this), 'id' => $this->GetKey(), 'issues' => $aIssues));
$sIssues = implode(', ', $aIssues);
throw new CoreException("Object not following integrity rules", array('issues' => $sIssues, 'class' => get_class($this), 'id' => $this->GetKey()));
}
$bHasANewExternalKeyValue = false;
@@ -1054,18 +1318,29 @@ abstract class DBObject
}
}
// Delete a record
public function DBDelete()
private function DBDeleteSingleTable($sTableClass)
{
$oFilter = new DBObjectSearch(get_class($this));
$oFilter->AddCondition('id', $this->m_iKey, '=');
$sTable = MetaModel::DBGetTable($sTableClass);
// Abstract classes or classes having no specific attribute do not have an associated table
if ($sTable == '') return;
$sPKField = '`'.MetaModel::DBGetKey($sTableClass).'`';
$sKey = CMDBSource::Quote($this->m_iKey);
$sDeleteSQL = "DELETE FROM `$sTable` WHERE $sPKField = $sKey";
CMDBSource::DeleteFrom($sDeleteSQL);
}
protected function DBDeleteSingleObject()
{
$this->OnDelete();
$sSQL = MetaModel::MakeDeleteQuery($oFilter);
if (!MetaModel::DBIsReadOnly())
{
CMDBSource::Query($sSQL);
foreach(MetaModel::EnumParentClasses(get_class($this), ENUM_PARENT_CLASSES_ALL) as $sParentClass)
{
$this->DBDeleteSingleTable($sParentClass);
}
}
$this->AfterDelete();
@@ -1074,9 +1349,53 @@ abstract class DBObject
$this->m_iKey = null;
}
public function DBDeleteTracked(CMDBChange $oVoid)
// Delete an object... and guarantee data integrity
//
public function DBDelete(&$oDeletionPlan = null)
{
$this->DBDelete();
if (is_null($oDeletionPlan))
{
$oDeletionPlan = new DeletionPlan();
}
$this->MakeDeletionPlan($oDeletionPlan);
$oDeletionPlan->ComputeResults();
if ($oDeletionPlan->FoundStopper())
{
$aIssues = $oDeletionPlan->GetIssues();
throw new DeleteException('Found issue(s)', array('target_class' => get_class($this), 'target_id' => $this->GetKey(), 'issues' => implode(', ', $aIssues)));
}
else
{
foreach ($oDeletionPlan->ListDeletes() as $sClass => $aToDelete)
{
foreach ($aToDelete as $iId => $aData)
{
$oToDelete = $aData['to_delete'];
$oToDelete->DBDeleteSingleObject();
}
}
foreach ($oDeletionPlan->ListUpdates() as $sClass => $aToUpdate)
{
foreach ($aToUpdate as $iId => $aData)
{
$oToUpdate = $aData['to_reset'];
foreach ($aData['attributes'] as $sRemoteExtKey => $aRemoteAttDef)
{
$oToUpdate->Set($sRemoteExtKey, 0);
$oToUpdate->DBUpdate();
}
}
}
}
return $oDeletionPlan;
}
public function DBDeleteTracked(CMDBChange $oVoid, $bSkipStrongSecurity = null, &$oDeletionPlan = null)
{
$this->DBDelete($oDeletionPlan);
}
public function EnumTransitions()
@@ -1250,7 +1569,7 @@ abstract class DBObject
return $aResults;
}
public function GetReferencingObjects()
public function GetReferencingObjects($bAllowAllData = false)
{
$aDependentObjects = array();
$aRererencingMe = MetaModel::EnumReferencingClasses(get_class($this));
@@ -1263,6 +1582,10 @@ abstract class DBObject
$oSearch = new DBObjectSearch($sRemoteClass);
$oSearch->AddCondition($sExtKeyAttCode, $this->GetKey(), '=');
if ($bAllowAllData)
{
$oSearch->AllowAllData();
}
$oSet = new CMDBObjectSet($oSearch);
if ($oSet->Count() > 0)
{
@@ -1276,22 +1599,32 @@ abstract class DBObject
return $aDependentObjects;
}
/**
* $aDeletedObjs = array(); // [class][key] => structure
* $aResetedObjs = array(); // [class][key] => object
*/
public function GetDeletionScheme(&$aDeletedObjs, &$aResetedObjs, $aVisited = array())
private function MakeDeletionPlan(&$oDeletionPlan, $aVisited = array(), $iDeleteOption = null)
{
if (array_key_exists(get_class($this), $aVisited))
$sClass = get_class($this);
$iThisId = $this->GetKey();
$iDeleteOption = $oDeletionPlan->AddToDelete($this, $iDeleteOption);
if (array_key_exists($sClass, $aVisited))
{
if (in_array($this->GetKey(), $aVisited[get_class($this)]))
if (in_array($iThisId, $aVisited[$sClass]))
{
return;
}
}
$aVisited[get_class($this)] = $this->GetKey();
$aVisited[$sClass] = $iThisId;
$aDependentObjects = $this->GetReferencingObjects();
if ($iDeleteOption == DEL_MANUAL)
{
// Stop the recursion here
return;
}
// Check the node itself
$this->DoCheckToDelete($oDeletionPlan);
$oDeletionPlan->SetDeletionIssues($this, $this->m_aDeleteIssues, $this->m_bSecurityIssue);
$aDependentObjects = $this->GetReferencingObjects(true /* allow all data */);
foreach ($aDependentObjects as $sRemoteClass => $aPotentialDeletes)
{
foreach ($aPotentialDeletes as $sRemoteExtKey => $aData)
@@ -1306,46 +1639,90 @@ abstract class DBObject
if ($oAttDef->IsNullAllowed())
{
// Optional external key, list to reset
if (!array_key_exists($sRemoteClass, $aResetedObjs) || !array_key_exists($iId, $aResetedObjs[$sRemoteClass]))
{
$aResetedObjs[$sRemoteClass][$iId]['to_reset'] = $oDependentObj;
}
$aResetedObjs[$sRemoteClass][$iId]['attributes'][$sRemoteExtKey] = $oAttDef;
$oDeletionPlan->AddToUpdate($oDependentObj, $oAttDef);
}
else
{
// Mandatory external key, list to delete
if (array_key_exists($sRemoteClass, $aDeletedObjs) && array_key_exists($iId, $aDeletedObjs[$sRemoteClass]))
{
$iCurrentOption = $aDeletedObjs[$sRemoteClass][$iId];
if ($iCurrentOption == DEL_AUTO)
{
// be conservative, take the new option
// (DEL_MANUAL has precedence over DEL_AUTO)
$aDeletedObjs[$sRemoteClass][$iId]['auto_delete'] = ($iDeletePropagationOption == DEL_AUTO);
}
else
{
// DEL_MANUAL... leave it as is, it HAS to be verified anyway
}
}
else
{
// First time we find the given object in the list
// (and most likely case is that no other occurence will be found)
$aDeletedObjs[$sRemoteClass][$iId]['to_delete'] = $oDependentObj;
$aDeletedObjs[$sRemoteClass][$iId]['auto_delete'] = ($iDeletePropagationOption == DEL_AUTO);
// Recursively inspect this object
if ($iDeletePropagationOption == DEL_AUTO)
{
$oDependentObj->GetDeletionScheme($aDeletedObjs, $aResetedObjs, $aVisited);
}
}
$oDependentObj->MakeDeletionPlan($oDeletionPlan, $aVisited, $iDeletePropagationOption);
}
}
}
}
}
/**
* Get all the synchro replica related to this object
* @param none
* @return DBObjectSet Set with two columns: R=SynchroReplica S=SynchroDataSource
*/
public function GetMasterReplica()
{
if ($this->m_oMasterReplicaSet == null)
{
//$aParentClasses = MetaModel::EnumParentClasses(get_class($this), ENUM_PARENT_CLASSES_ALL);
//$sClassesList = "'".implode("','", $aParentClasses)."'";
$sOQL = "SELECT replica,datasource FROM SynchroReplica AS replica JOIN SynchroDataSource AS datasource ON replica.sync_source_id=datasource.id WHERE replica.dest_class = :dest_class AND replica.dest_id = :dest_id";
$oReplicaSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array() /* order by*/, array('dest_class' => get_class($this), 'dest_id' => $this->GetKey()));
$this->m_oMasterReplicaSet = $oReplicaSet;
}
else
{
$this->m_oMasterReplicaSet->Rewind();
}
return $this->m_oMasterReplicaSet;
}
public function GetSynchroReplicaFlags($sAttCode, &$aReason)
{
$iFlags = OPT_ATT_NORMAL;
$oSet = $this->GetMasterReplica();
while($aData = $oSet->FetchAssoc())
{
if ($aData['datasource']->GetKey() == SynchroDataSource::GetCurrentTaskId())
{
// Ignore the current task (check to write => ok)
continue;
}
// Assumption: $aData['datasource'] will not be null because the data source id is always set...
$oReplica = $aData['replica'];
$oSource = $aData['datasource'];
$oAttrSet = $oSource->Get('attribute_list');
while($oSyncAttr = $oAttrSet->Fetch())
{
if (($oSyncAttr->Get('attcode') == $sAttCode) && ($oSyncAttr->Get('update') == 1) && ($oSyncAttr->Get('update_policy') == 'master_locked'))
{
$iFlags |= OPT_ATT_SLAVE;
$sUrl = $oSource->GetApplicationUrl($this, $oReplica);
$aReason[] = array('name' => $oSource->GetName(), 'description' => $oSource->Get('description'), 'url_application' => $sUrl);
}
}
}
return $iFlags;
}
public function InSyncScope()
{
return true;
// TODO - FINALIZE THIS OPTIMIZATION
//
// Optimization: cache the list of Data Sources and classes candidates for synchro
//
static $aSynchroClasses = null;
if (is_null($aSynchroClasses))
{
$aSynchroClasses = array();
$sOQL = "SELECT SynchroDataSource AS datasource";
$oSourceSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array() /* order by*/, array());
while($oSource = $oSourceSet->Fetch())
{
$sTarget = $oSource->Get('scope_class');
$aSynchroClasses[] = $oSource;
}
}
// to be continued...
}
}

View File

@@ -209,7 +209,7 @@ class DBObjectSearch
protected function TransferConditionExpression($oFilter, $aTranslation)
{
$oTranslated = $oFilter->GetCriteria()->Translate($aTranslation, false);
$oTranslated = $oFilter->GetCriteria()->Translate($aTranslation, false, false /* leave unresolved fields */);
$this->AddConditionExpression($oTranslated);
// #@# what about collisions in parameter names ???
$this->m_aParams = array_merge($this->m_aParams, $oFilter->m_aParams);
@@ -226,6 +226,14 @@ class DBObjectSearch
$this->m_oSearchCondition = $this->m_oSearchCondition->LogAnd($oExpression);
}
public function AddNameCondition($sName)
{
$oValueExpr = new ScalarExpression($sName);
$oNameExpr = new FieldExpression('friendlyname', $this->GetClassAlias());
$oNewCondition = new BinaryExpression($oNameExpr, '=', $oValueExpr);
$this->AddConditionExpression($oNewCondition);
}
public function AddCondition($sFilterCode, $value, $sOpCode = null)
{
MyHelpers::CheckKeyInArray('filter code', $sFilterCode, MetaModel::GetClassFilterDefs($this->GetClass()));

View File

@@ -38,17 +38,18 @@ class DBObjectSet
private $m_aId2Row;
private $m_iCurrRow;
public function __construct(DBObjectSearch $oFilter, $aOrderBy = array(), $aArgs = array(), $iLimitCount = 0, $iLimitStart = 0)
public function __construct(DBObjectSearch $oFilter, $aOrderBy = array(), $aArgs = array(), $aExtendedDataSpec = null, $iLimitCount = 0, $iLimitStart = 0)
{
$this->m_oFilter = $oFilter;
$this->m_aOrderBy = $aOrderBy;
$this->m_aArgs = $aArgs;
$this->m_aExtendedDataSpec = $aExtendedDataSpec;
$this->m_iLimitCount = $iLimitCount;
$this->m_iLimitStart = $iLimitStart;
$this->m_bLoaded = false;
$this->m_aData = array(); // array of (row => array of (classalias) => object)
$this->m_aId2Row = array();
$this->m_bLoaded = false; // true when the filter has been used OR the set is built step by step (AddObject...)
$this->m_aData = array(); // array of (row => array of (classalias) => object/null)
$this->m_aId2Row = array(); // array of (pkey => index in m_aData)
$this->m_iCurrRow = 0;
}
@@ -162,19 +163,42 @@ class DBObjectSet
{
if (!$this->m_bLoaded) $this->Load();
$aSelectedClasses = $this->m_oFilter->GetSelectedClasses();
$aRet = array();
foreach($this->m_aData as $iRow => $aObjects)
{
foreach($aObjects as $sClassAlias => $oObject)
{
$aRet[$iRow][$sClassAlias.'.'.'id'] = $oObject->GetKey();
$sClass = get_class($oObject);
if (is_null($oObject))
{
$aRet[$iRow][$sClassAlias.'.'.'id'] = null;
}
else
{
$aRet[$iRow][$sClassAlias.'.'.'id'] = $oObject->GetKey();
}
if (is_null($oObject))
{
$sClass = $aSelectedClasses[$sClassAlias];
}
else
{
$sClass = get_class($oObject);
}
foreach(MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef)
{
if ($oAttDef->IsScalar())
{
$sAttName = $sClassAlias.'.'.$sAttCode;
$aRet[$iRow][$sAttName] = $oObject->Get($sAttCode);
if (is_null($oObject))
{
$aRet[$iRow][$sAttName] = null;
}
else
{
$aRet[$iRow][$sAttName] = $oObject->Get($sAttCode);
}
}
}
}
@@ -202,6 +226,7 @@ class DBObjectSet
public function GetFilter()
{
// #@# This is false as soon as the set has been manipulated (AddObject...)
return $this->m_oFilter;
}
@@ -239,13 +264,16 @@ class DBObjectSet
public function Load()
{
if ($this->m_bLoaded) return;
// Note: it is mandatory to set this value now, to protect against reentrance
$this->m_bLoaded = true;
if ($this->m_iLimitCount > 0)
{
$sSQL = MetaModel::MakeSelectQuery($this->m_oFilter, $this->m_aOrderBy, $this->m_aArgs, $this->m_iLimitCount, $this->m_iLimitStart);
$sSQL = MetaModel::MakeSelectQuery($this->m_oFilter, $this->m_aOrderBy, $this->m_aArgs, $this->m_aExtendedDataSpec, $this->m_iLimitCount, $this->m_iLimitStart);
}
else
{
$sSQL = MetaModel::MakeSelectQuery($this->m_oFilter, $this->m_aOrderBy, $this->m_aArgs);
$sSQL = MetaModel::MakeSelectQuery($this->m_oFilter, $this->m_aOrderBy, $this->m_aArgs, $this->m_aExtendedDataSpec);
}
$resQuery = CMDBSource::Query($sSQL);
if (!$resQuery) return;
@@ -256,25 +284,37 @@ class DBObjectSet
$aObjects = array();
foreach ($this->m_oFilter->GetSelectedClasses() as $sClassAlias => $sClass)
{
$oObject = MetaModel::GetObjectByRow($sClass, $aRow, $sClassAlias);
if (is_null($aRow[$sClassAlias.'id']))
{
$oObject = null;
}
else
{
$oObject = MetaModel::GetObjectByRow($sClass, $aRow, $sClassAlias, $this->m_aExtendedDataSpec);
}
$aObjects[$sClassAlias] = $oObject;
}
$this->AddObjectExtended($aObjects);
}
CMDBSource::FreeResult($resQuery);
$this->m_bLoaded = true;
}
public function Count()
{
$sSQL = MetaModel::MakeSelectQuery($this->m_oFilter, $this->m_aOrderBy, $this->m_aArgs, 0, 0, true);
$resQuery = CMDBSource::Query($sSQL);
if (!$resQuery) return 0;
$aRow = CMDBSource::FetchArray($resQuery);
CMDBSource::FreeResult($resQuery);
return $aRow['COUNT'];
if ($this->m_bLoaded && ($this->m_iLimitCount == 0) && ($this->m_iLimitStart == 0))
{
return count($this->m_aData);
}
else
{
$sSQL = MetaModel::MakeSelectQuery($this->m_oFilter, $this->m_aOrderBy, $this->m_aArgs, null, 0, 0, true);
$resQuery = CMDBSource::Query($sSQL);
if (!$resQuery) return 0;
$aRow = CMDBSource::FetchArray($resQuery);
CMDBSource::FreeResult($resQuery);
return $aRow['COUNT'];
}
}
public function Fetch($sClassAlias = '')
@@ -326,6 +366,8 @@ class DBObjectSet
public function AddObject($oObject, $sClassAlias = '')
{
if (!$this->m_bLoaded) $this->Load();
if (strlen($sClassAlias) == 0)
{
$sClassAlias = $this->m_oFilter->GetClassAlias();
@@ -333,22 +375,32 @@ class DBObjectSet
$iNextPos = count($this->m_aData);
$this->m_aData[$iNextPos][$sClassAlias] = $oObject;
$this->m_aId2Row[$sClassAlias][$oObject->GetKey()] = $iNextPos;
if (!is_null($oObject))
{
$this->m_aId2Row[$sClassAlias][$oObject->GetKey()] = $iNextPos;
}
}
protected function AddObjectExtended($aObjectArray)
{
if (!$this->m_bLoaded) $this->Load();
$iNextPos = count($this->m_aData);
foreach ($aObjectArray as $sClassAlias => $oObject)
{
$this->m_aData[$iNextPos][$sClassAlias] = $oObject;
$this->m_aId2Row[$sClassAlias][$oObject->GetKey()] = $iNextPos;
if (!is_null($oObject))
{
$this->m_aId2Row[$sClassAlias][$oObject->GetKey()] = $iNextPos;
}
}
}
public function AddObjectArray($aObjects, $sClassAlias = '')
{
if (!$this->m_bLoaded) $this->Load();
// #@# todo - add a check on the object class ?
foreach ($aObjects as $oObj)
{
@@ -393,6 +445,43 @@ class DBObjectSet
return $oNewSet;
}
// Note: This verb works only with objects existing in the database
//
public function HasSameContents($oObjectSet)
{
if ($this->GetRootClass() != $oObjectSet->GetRootClass())
{
return false;
}
if (!$this->m_bLoaded) $this->Load();
if ($this->Count() != $oObjectSet->Count())
{
return false;
}
$sClassAlias = $this->m_oFilter->GetClassAlias();
$oObjectSet->Rewind();
while ($oObject = $oObjectSet->Fetch())
{
$iObjectKey = $oObject->GetKey();
if ($iObjectKey < 0)
{
return false;
}
if (!array_key_exists($iObjectKey, $this->m_aId2Row[$sClassAlias]))
{
return false;
}
$iRow = $this->m_aId2Row[$sClassAlias][$iObjectKey];
$oSibling = $this->m_aData[$iRow][$sClassAlias];
if (!$oObject->Equals($oSibling))
{
return false;
}
}
return true;
}
public function CreateDelta($oObjectSet)
{
if ($this->GetRootClass() != $oObjectSet->GetRootClass())
@@ -437,6 +526,106 @@ class DBObjectSet
}
return $aRelatedObjs;
}
/**
* Builds an object that contains the values that are common to all the objects
* in the set. If for a given attribute, objects in the set have various values
* then the resulting object will contain null for this value.
* @param $aValues Hash Output: the distribution of the values, in the set, for each attribute
* @return Object
*/
public function ComputeCommonObject(&$aValues)
{
$sClass = $this->GetClass();
$aList = MetaModel::ListAttributeDefs($sClass);
$aValues = array();
foreach($aList as $sAttCode => $oAttDef)
{
if ($oAttDef->IsScalar())
{
$aValues[$sAttCode] = array();
}
}
$this->Rewind();
while($oObj = $this->Fetch())
{
foreach($aList as $sAttCode => $oAttDef)
{
if ($oAttDef->IsScalar() && $oAttDef->IsWritable())
{
$currValue = $oObj->Get($sAttCode);
if (is_object($currValue)) continue; // Skip non scalar values...
if(!array_key_exists($currValue, $aValues[$sAttCode]))
{
$aValues[$sAttCode][$currValue] = array('count' => 1, 'display' => $oObj->GetAsHTML($sAttCode));
}
else
{
$aValues[$sAttCode][$currValue]['count']++;
}
}
}
}
foreach($aValues as $sAttCode => $aMultiValues)
{
if (count($aMultiValues) > 1)
{
uasort($aValues[$sAttCode], 'HashCountComparison');
}
}
// Now create an object that has values for the homogenous values only
$oCommonObj = new $sClass(); // @@ What if the class is abstract ?
$aComments = array();
$iFormId = cmdbAbstractObject::GetNextFormId(); // Identifier that prefixes all the form fields
$sReadyScript = '';
$aDependsOn = array();
$sFormPrefix = '2_';
foreach($aList as $sAttCode => $oAttDef)
{
if ($oAttDef->IsScalar() && $oAttDef->IsWritable())
{
if ($oAttDef->GetEditClass() == 'One Way Password')
{
$oCommonObj->Set($sAttCode, null);
}
else
{
$iCount = count($aValues[$sAttCode]);
if ($iCount == 1)
{
// Homogenous value
reset($aValues[$sAttCode]);
$aKeys = array_keys($aValues[$sAttCode]);
$currValue = $aKeys[0]; // The only value is the first key
$oCommonObj->Set($sAttCode, $currValue);
}
else
{
// Non-homogenous value
$oCommonObj->Set($sAttCode, null);
}
}
}
}
$this->Rewind();
return $oCommonObj;
}
}
/**
* Helper function to perform a custom sort of a hash array
*/
function HashCountComparison($a, $b) // Sort descending on 'count'
{
if ($a['count'] == $b['count'])
{
return 0;
}
return ($a['count'] > $b['count']) ? -1 : 1;
}
?>

View File

@@ -0,0 +1,287 @@
<?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
/**
* Class dbObject: the root of persistent classes
*
* @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
*/
class DeleteException extends CoreException
{
}
/**
* Deletion plan (other objects to be deleted/modified, eventual issues, etc.)
*
* @package iTopORM
*/
class DeletionPlan
{
//protected $m_aIssues;
protected $m_bFoundStopper;
protected $m_bFoundSecurityIssue;
protected $m_bFoundManualDelete;
protected $m_bFoundManualOperation;
protected $m_iToDelete;
protected $m_iToUpdate;
protected $m_aToDelete;
protected $m_aToUpdate;
protected static $m_aModeUpdate = array(
DEL_SILENT => array(
DEL_SILENT => DEL_SILENT,
DEL_AUTO => DEL_AUTO,
DEL_MANUAL => DEL_MANUAL
),
DEL_MANUAL => array(
DEL_SILENT => DEL_MANUAL,
DEL_AUTO => DEL_AUTO,
DEL_MANUAL => DEL_MANUAL
),
DEL_AUTO => array(
DEL_SILENT => DEL_AUTO,
DEL_AUTO => DEL_AUTO,
DEL_MANUAL => DEL_AUTO
)
);
public function __construct()
{
$this->m_iToDelete = 0;
$this->m_iToUpdate = 0;
$this->m_aToDelete = array();
$this->m_aToUpdate = array();
$this->m_bFoundStopper = false;
$this->m_bFoundSecurityIssue = false;
$this->m_bFoundManualDelete = false;
$this->m_bFoundManualOperation = false;
}
public function ComputeResults()
{
foreach($this->m_aToDelete as $sClass => $aToDelete)
{
foreach($aToDelete as $iId => $aData)
{
$this->m_iToDelete++;
if (isset($aData['issue']))
{
$this->m_bFoundStopper = true;
$this->m_bFoundManualOperation = true;
if (isset($aData['issue_security']))
{
$this->m_bFoundSecurityIssue = true;
}
}
if ($aData['mode'] == DEL_MANUAL)
{
$this->m_bFoundStopper = true;
$this->m_bFoundManualDelete = true;
}
}
}
foreach($this->m_aToUpdate as $sClass => $aToUpdate)
{
foreach($aToUpdate as $iId => $aData)
{
$this->m_iToUpdate++;
$oObject = $aData['to_reset'];
$aExtKeyLabels = array();
foreach ($aData['attributes'] as $sRemoteExtKey => $aRemoteAttDef)
{
$oObject->Set($sRemoteExtKey, 0);
$aExtKeyLabels[] = $aRemoteAttDef->GetLabel();
}
$this->m_aToUpdate[$sClass][$iId]['attributes_list'] = implode(', ', $aExtKeyLabels);
list($bRes, $aIssues, $bSecurityIssues) = $oObject->CheckToWrite();
if (!$bRes)
{
$this->m_aToUpdate[$sClass][$iId]['issue'] = implode(', ', $aIssues);
$this->m_bFoundStopper = true;
if ($bSecurityIssues)
{
$this->m_aToUpdate[$sClass][$iId]['issue_security'] = true;
$this->m_bFoundSecurityIssue = true;
}
}
}
}
}
public function GetIssues()
{
$aIssues = array();
foreach ($this->m_aToDelete as $sClass => $aToDelete)
{
foreach ($aToDelete as $iId => $aData)
{
if (isset($aData['issue']))
{
$aIssues[] = $aData['issue'];
}
}
}
foreach ($this->m_aToUpdate as $sClass => $aToUpdate)
{
foreach ($aToUpdate as $iId => $aData)
{
if (isset($aData['issue']))
{
$aIssues[] = $aData['issue'];
}
}
}
return $aIssues;
}
public function ListDeletes()
{
return $this->m_aToDelete;
}
public function ListUpdates()
{
return $this->m_aToUpdate;
}
public function GetTargetCount()
{
return $this->m_iToDelete + $this->m_iToUpdate;
}
public function FoundStopper()
{
return $this->m_bFoundStopper;
}
public function FoundSecurityIssue()
{
return $this->m_bFoundSecurityIssue;
}
public function FoundManualOperation()
{
return $this->m_bFoundManualOperation;
}
public function FoundManualDelete()
{
return $this->m_bFoundManualDelete;
}
public function FoundManualUpdate()
{
}
public function AddToDelete($oObject, $iDeletionMode = null)
{
if (is_null($iDeletionMode))
{
$bRequestedExplicitely = true;
$iDeletionMode = DEL_AUTO;
}
else
{
$bRequestedExplicitely = false;
}
$sClass = get_class($oObject);
$iId = $oObject->GetKey();
if (isset($this->m_aToUpdate[$sClass][$iId]))
{
unset($this->m_aToUpdate[$sClass][$iId]);
}
if (isset($this->m_aToDelete[$sClass][$iId]))
{
if ($this->m_aToDelete[$sClass][$iId]['requested_explicitely'])
{
// No change: let it in mode DEL_AUTO
}
else
{
$iPrevDeletionMode = $this->m_aToDelete[$sClass][$iId]['mode'];
$iNewDeletionMode = self::$m_aModeUpdate[$iPrevDeletionMode][$iDeletionMode];
$this->m_aToDelete[$sClass][$iId]['mode'] = $iNewDeletionMode;
if ($bRequestedExplicitely)
{
// This object was in the root list
$this->m_aToDelete[$sClass][$iId]['requested_explicitely'] = true;
$this->m_aToDelete[$sClass][$iId]['mode'] = DEL_AUTO;
}
}
}
else
{
$this->m_aToDelete[$sClass][$iId] = array(
'to_delete' => $oObject,
'mode' => $iDeletionMode,
'requested_explicitely' => $bRequestedExplicitely,
);
}
}
public function SetDeletionIssues($oObject, $aIssues, $bSecurityIssue)
{
if (count($aIssues) > 0)
{
$sClass = get_class($oObject);
$iId = $oObject->GetKey();
$this->m_aToDelete[$sClass][$iId]['issue'] = implode(', ', $aIssues);
if ($bSecurityIssue)
{
$this->m_aToDelete[$sClass][$iId]['issue_security'] = true;
}
}
}
public function AddToUpdate($oObject, $oAttDef)
{
$sClass = get_class($oObject);
$iId = $oObject->GetKey();
if (isset($this->m_aToDelete[$sClass][$iId]))
{
// skip... it should be deleted anyhow !
}
else
{
if (!isset($this->m_aToUpdate[$sClass][$iId]))
{
$this->m_aToUpdate[$sClass][$iId] = array(
'to_reset' => $oObject,
);
}
$this->m_aToUpdate[$sClass][$iId]['attributes'][$oAttDef->GetCode()] = $oAttDef;
}
}
}
?>

View File

@@ -1,235 +1,318 @@
<?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
/**
* Class Dict
* Management of localizable strings
*
* @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
*/
class DictException extends CoreException
{
}
class DictExceptionUnknownLanguage extends DictException
{
public function __construct($sLanguageCode)
{
$aContext = array();
$aContext['language_code'] = $sLanguageCode;
parent::__construct('Unknown localization language', $aContext);
}
}
class DictExceptionMissingString extends DictException
{
public function __construct($sLanguageCode, $sStringCode)
{
$aContext = array();
$aContext['language_code'] = $sLanguageCode;
$aContext['string_code'] = $sStringCode;
parent::__construct('Missing localized string', $aContext);
}
}
define('DICT_ERR_STRING', 1); // when a string is missing, return the identifier
define('DICT_ERR_EXCEPTION', 2); // when a string is missing, throw an exception
//define('DICT_ERR_LOG', 3); // when a string is missing, log an error
class Dict
{
protected static $m_iErrorMode = DICT_ERR_STRING;
protected static $m_sDefaultLanguage = 'EN US';
protected static $m_sCurrentLanguage = null; // No language selected by default
protected static $m_aLanguages = array(); // array( code => array( 'description' => '...', 'localized_description' => '...') ...)
protected static $m_aData = array();
public static function SetDefaultLanguage($sLanguageCode)
{
if (!array_key_exists($sLanguageCode, self::$m_aLanguages))
{
throw new DictExceptionUnknownLanguage($sLanguageCode);
}
self::$m_sDefaultLanguage = $sLanguageCode;
}
public static function SetUserLanguage($sLanguageCode)
{
if (!array_key_exists($sLanguageCode, self::$m_aLanguages))
{
throw new DictExceptionUnknownLanguage($sLanguageCode);
}
self::$m_sCurrentLanguage = $sLanguageCode;
}
public static function GetCurrentLanguage()
{
if (self::$m_sCurrentLanguage == null) // May happen when no user is logged in (i.e login screen, non authentifed page)
{
// In which case let's use the default language
return self::$m_sDefaultLanguage;
}
return self::$m_sCurrentLanguage;
}
//returns a hash array( code => array( 'description' => '...', 'localized_description' => '...') ...)
public static function GetLanguages()
{
return self::$m_aLanguages;
}
// iErrorMode from {DICT_ERR_STRING, DICT_ERR_EXCEPTION}
public static function SetErrorMode($iErrorMode)
{
self::$m_iErrorMode = $iErrorMode;
}
public static function S($sStringCode, $sDefault = null)
{
// Attempt to find the string in the user language
//
if (!array_key_exists(self::GetCurrentLanguage(), self::$m_aData))
{
// It may happen, when something happens before the dictionnaries get loaded
return $sStringCode;
}
$aCurrentDictionary = self::$m_aData[self::GetCurrentLanguage()];
if (array_key_exists($sStringCode, $aCurrentDictionary))
{
return $aCurrentDictionary[$sStringCode];
}
// Attempt to find the string in the default language
//
$aDefaultDictionary = self::$m_aData[self::$m_sDefaultLanguage];
if (array_key_exists($sStringCode, $aDefaultDictionary))
{
return $aDefaultDictionary[$sStringCode];
}
// Attempt to find the string in english
//
$aDefaultDictionary = self::$m_aData['EN US'];
if (array_key_exists($sStringCode, $aDefaultDictionary))
{
return $aDefaultDictionary[$sStringCode];
}
// Could not find the string...
//
switch (self::$m_iErrorMode)
{
case DICT_ERR_STRING:
if (is_null($sDefault))
{
return $sStringCode;
}
else
{
return $sDefault;
}
break;
case DICT_ERR_EXCEPTION:
default:
throw new DictExceptionMissingString(self::$m_sCurrentLanguage, $sStringCode);
break;
}
return 'bug!';
}
public static function Format($sFormatCode /*, ... arguments ....*/)
{
$sLocalizedFormat = self::S($sFormatCode);
$aArguments = func_get_args();
if ($sLocalizedFormat == $sFormatCode)
{
// Make sure the information will be displayed (ex: an error occuring before the dictionary gets loaded)
return $sFormatCode.' - '.implode(', ', $aArguments);
}
array_shift($aArguments);
return vsprintf($sLocalizedFormat, $aArguments);
}
// sLanguageCode: Code identifying the language i.e. FR-FR
// sEnglishLanguageDesc: Description of the language code, in English. i.e. French (France)
// sLocalizedLanguageDesc: Description of the language code, in its own language. i.e. Français (France)
// aEntries: Hash array of dictionnary entries
public static function Add($sLanguageCode, $sEnglishLanguageDesc, $sLocalizedLanguageDesc, $aEntries)
{
if (!array_key_exists($sLanguageCode, self::$m_aLanguages))
{
self::$m_aLanguages[$sLanguageCode] = array('description' => $sEnglishLanguageDesc, 'localized_description' => $sLocalizedLanguageDesc);
self::$m_aData[$sLanguageCode] = array();
}
self::$m_aData[$sLanguageCode] = array_merge(self::$m_aData[$sLanguageCode], $aEntries);
}
public static function MakeStats($sLanguageCode, $sLanguageRef = 'EN US')
{
$aMissing = array(); // Strings missing for the target language
$aUnexpected = array(); // Strings defined for the target language, but not found in the reference dictionary
$aNotTranslated = array(); // Strings having the same value in both dictionaries
$aOK = array(); // Strings having different values in both dictionaries
foreach (self::$m_aData[$sLanguageRef] as $sStringCode => $sValue)
{
if (!array_key_exists($sStringCode, self::$m_aData[$sLanguageCode]))
{
$aMissing[$sStringCode] = $sValue;
}
}
foreach (self::$m_aData[$sLanguageCode] as $sStringCode => $sValue)
{
if (!array_key_exists($sStringCode, self::$m_aData[$sLanguageRef]))
{
$aUnexpected[$sStringCode] = $sValue;
}
else
{
// The value exists in the reference
$sRefValue = self::$m_aData[$sLanguageRef][$sStringCode];
if ($sValue == $sRefValue)
{
$aNotTranslated[$sStringCode] = $sValue;
}
else
{
$aOK[$sStringCode] = $sValue;
}
}
}
return array($aMissing, $aUnexpected, $aNotTranslated, $aOK);
}
public static function Dump()
{
MyHelpers::var_dump_html(self::$m_aData);
}
}
?>
<?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
/**
* Class Dict
* Management of localizable strings
*
* @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
*/
class DictException extends CoreException
{
}
class DictExceptionUnknownLanguage extends DictException
{
public function __construct($sLanguageCode)
{
$aContext = array();
$aContext['language_code'] = $sLanguageCode;
parent::__construct('Unknown localization language', $aContext);
}
}
class DictExceptionMissingString extends DictException
{
public function __construct($sLanguageCode, $sStringCode)
{
$aContext = array();
$aContext['language_code'] = $sLanguageCode;
$aContext['string_code'] = $sStringCode;
parent::__construct('Missing localized string', $aContext);
}
}
define('DICT_ERR_STRING', 1); // when a string is missing, return the identifier
define('DICT_ERR_EXCEPTION', 2); // when a string is missing, throw an exception
//define('DICT_ERR_LOG', 3); // when a string is missing, log an error
class Dict
{
protected static $m_bTraceFiles = false;
protected static $m_aEntryFiles = array();
protected static $m_iErrorMode = DICT_ERR_STRING;
protected static $m_sDefaultLanguage = 'EN US';
protected static $m_sCurrentLanguage = null; // No language selected by default
protected static $m_aLanguages = array(); // array( code => array( 'description' => '...', 'localized_description' => '...') ...)
protected static $m_aData = array();
public static function EnableTraceFiles()
{
self::$m_bTraceFiles = true;
}
public static function GetEntryFiles()
{
return self::$m_aEntryFiles;
}
public static function SetDefaultLanguage($sLanguageCode)
{
if (!array_key_exists($sLanguageCode, self::$m_aLanguages))
{
throw new DictExceptionUnknownLanguage($sLanguageCode);
}
self::$m_sDefaultLanguage = $sLanguageCode;
}
public static function SetUserLanguage($sLanguageCode)
{
if (!array_key_exists($sLanguageCode, self::$m_aLanguages))
{
throw new DictExceptionUnknownLanguage($sLanguageCode);
}
self::$m_sCurrentLanguage = $sLanguageCode;
}
public static function GetCurrentLanguage()
{
if (self::$m_sCurrentLanguage == null) // May happen when no user is logged in (i.e login screen, non authentifed page)
{
// In which case let's use the default language
return self::$m_sDefaultLanguage;
}
return self::$m_sCurrentLanguage;
}
//returns a hash array( code => array( 'description' => '...', 'localized_description' => '...') ...)
public static function GetLanguages()
{
return self::$m_aLanguages;
}
// iErrorMode from {DICT_ERR_STRING, DICT_ERR_EXCEPTION}
public static function SetErrorMode($iErrorMode)
{
self::$m_iErrorMode = $iErrorMode;
}
public static function S($sStringCode, $sDefault = null)
{
// Attempt to find the string in the user language
//
if (!array_key_exists(self::GetCurrentLanguage(), self::$m_aData))
{
// It may happen, when something happens before the dictionnaries get loaded
return $sStringCode;
}
$aCurrentDictionary = self::$m_aData[self::GetCurrentLanguage()];
if (array_key_exists($sStringCode, $aCurrentDictionary))
{
return $aCurrentDictionary[$sStringCode];
}
// Attempt to find the string in the default language
//
$aDefaultDictionary = self::$m_aData[self::$m_sDefaultLanguage];
if (array_key_exists($sStringCode, $aDefaultDictionary))
{
return $aDefaultDictionary[$sStringCode];
}
// Attempt to find the string in english
//
$aDefaultDictionary = self::$m_aData['EN US'];
if (array_key_exists($sStringCode, $aDefaultDictionary))
{
return $aDefaultDictionary[$sStringCode];
}
// Could not find the string...
//
switch (self::$m_iErrorMode)
{
case DICT_ERR_STRING:
if (is_null($sDefault))
{
return $sStringCode;
}
else
{
return $sDefault;
}
break;
case DICT_ERR_EXCEPTION:
default:
throw new DictExceptionMissingString(self::$m_sCurrentLanguage, $sStringCode);
break;
}
return 'bug!';
}
public static function Format($sFormatCode /*, ... arguments ....*/)
{
$sLocalizedFormat = self::S($sFormatCode);
$aArguments = func_get_args();
array_shift($aArguments);
if ($sLocalizedFormat == $sFormatCode)
{
// Make sure the information will be displayed (ex: an error occuring before the dictionary gets loaded)
return $sFormatCode.' - '.implode(', ', $aArguments);
}
return vsprintf($sLocalizedFormat, $aArguments);
}
// sLanguageCode: Code identifying the language i.e. FR-FR
// sEnglishLanguageDesc: Description of the language code, in English. i.e. French (France)
// sLocalizedLanguageDesc: Description of the language code, in its own language. i.e. Français (France)
// aEntries: Hash array of dictionnary entries
// ~~ or ~* can be used to indicate entries still to be translated.
public static function Add($sLanguageCode, $sEnglishLanguageDesc, $sLocalizedLanguageDesc, $aEntries)
{
if (self::$m_bTraceFiles)
{
$aBacktrace = debug_backtrace();
$sFile = $aBacktrace[0]["file"];
foreach($aEntries as $sKey => $sValue)
{
self::$m_aEntryFiles[$sLanguageCode][$sKey] = array(
'file' => $sFile,
'value' => $sValue
);
}
}
if (!array_key_exists($sLanguageCode, self::$m_aLanguages))
{
self::$m_aLanguages[$sLanguageCode] = array('description' => $sEnglishLanguageDesc, 'localized_description' => $sLocalizedLanguageDesc);
self::$m_aData[$sLanguageCode] = array();
}
foreach($aEntries as $sCode => $sValue)
{
self::$m_aData[$sLanguageCode][$sCode] = self::FilterString($sValue);
}
}
public static function MakeStats($sLanguageCode, $sLanguageRef = 'EN US')
{
$aMissing = array(); // Strings missing for the target language
$aUnexpected = array(); // Strings defined for the target language, but not found in the reference dictionary
$aNotTranslated = array(); // Strings having the same value in both dictionaries
$aOK = array(); // Strings having different values in both dictionaries
foreach (self::$m_aData[$sLanguageRef] as $sStringCode => $sValue)
{
if (!array_key_exists($sStringCode, self::$m_aData[$sLanguageCode]))
{
$aMissing[$sStringCode] = $sValue;
}
}
foreach (self::$m_aData[$sLanguageCode] as $sStringCode => $sValue)
{
if (!array_key_exists($sStringCode, self::$m_aData[$sLanguageRef]))
{
$aUnexpected[$sStringCode] = $sValue;
}
else
{
// The value exists in the reference
$sRefValue = self::$m_aData[$sLanguageRef][$sStringCode];
if ($sValue == $sRefValue)
{
$aNotTranslated[$sStringCode] = $sValue;
}
else
{
$aOK[$sStringCode] = $sValue;
}
}
}
return array($aMissing, $aUnexpected, $aNotTranslated, $aOK);
}
public static function Dump()
{
MyHelpers::var_dump_html(self::$m_aData);
}
public static function InCache($sApplicationPrefix)
{
if (function_exists('apc_fetch'))
{
$bResult = false;
// Note: For versions of APC older than 3.0.17, fetch() accepts only one parameter
//
self::$m_aData = apc_fetch($sApplicationPrefix.'-dict');
if (is_bool(self::$m_aData) && (self::$m_aData === false))
{
self::$m_aData = array();
}
else
{
self::$m_aLanguages = apc_fetch($sApplicationPrefix.'-languages');
if (is_bool(self::$m_aLanguages) && (self::$m_aLanguages === false))
{
self::$m_aLanguages = array();
}
else
{
$bResult = true;
}
}
return $bResult;
}
return false;
}
public static function InitCache($sApplicationPrefix)
{
if (function_exists('apc_store'))
{
apc_store($sApplicationPrefix.'-languages', self::$m_aLanguages);
apc_store($sApplicationPrefix.'-dict', self::$m_aData);
}
}
public static function ResetCache($sApplicationPrefix)
{
if (function_exists('apc_delete'))
{
apc_delete($sApplicationPrefix.'-languages');
apc_delete($sApplicationPrefix.'-dict');
}
}
protected static function FilterString($s)
{
return str_replace(array('~~', '~*'), '', $s);
}
}
?>

View File

@@ -24,6 +24,11 @@
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
define ('EMAIL_SEND_OK', 0);
define ('EMAIL_SEND_PENDING', 1);
define ('EMAIL_SEND_ERROR', 2);
class EMail
{
protected $m_sBody;
@@ -31,15 +36,14 @@ class EMail
protected $m_sTo;
protected $m_aHeaders; // array of key=>value
public function __construct()
public function __construct($sTo = '', $sSubject = '', $sBody = '', $aHeaders = array())
{
$this->m_sTo = '';
$this->m_sSubject = '';
$this->m_sBody = '';
$this->m_aHeaders = array();
$this->m_sTo = $sTo;
$this->m_sSubject = $sSubject;
$this->m_sBody = $sBody;
$this->m_aHeaders = $aHeaders;
}
// Errors management : not that simple because we need that function to be
// executed in the background, while making sure that any issue would be reported clearly
protected $m_aMailErrors; //array of strings explaining the issues
@@ -50,9 +54,22 @@ class EMail
$this->m_aMailErrors[] = $sCleanMessage;
}
protected function SendAsynchronous(&$aIssues, $oLog = null)
{
try
{
AsyncSendEmail::AddToQueue($this->m_sTo, $this->m_sSubject, $this->m_sBody, $this->m_aHeaders, $oLog);
}
catch(Exception $e)
{
$aIssues = array($e->GetMessage());
return EMAIL_SEND_ERROR;
}
$aIssues = array();
return EMAIL_SEND_PENDING;
}
// returns a list of issues if any
public function Send()
protected function SendSynchronous(&$aIssues, $oLog = null)
{
$sHeaders = 'MIME-Version: 1.0' . "\r\n";
// ! the case is important for MS-Outlook
@@ -79,7 +96,36 @@ class EMail
{
$this->m_aMailErrors[] = 'Unknown reason';
}
return $this->m_aMailErrors;
if (count($this->m_aMailErrors) > 0)
{
$aIssues = $this->m_aMailErrors;
return EMAIL_SEND_ERROR;
}
else
{
$aIssues = array();
return EMAIL_SEND_OK;
}
}
public function Send(&$aIssues, $bForceSynchronous = false, $oLog = null)
{
if ($bForceSynchronous)
{
return $this->SendSynchronous($aIssues, $oLog);
}
else
{
$bConfigASYNC = MetaModel::GetConfig()->Get('email_asynchronous');
if ($bConfigASYNC)
{
return $this->SendAsynchronous($aIssues, $oLog);
}
else
{
return $this->SendSynchronous($aIssues, $oLog);
}
}
}
protected function AddToHeader($sKey, $sValue)

View File

@@ -25,7 +25,7 @@
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
class Event extends cmdbAbstractObject
class Event extends DBObject implements iDisplay
{
public static function Init()
{
@@ -46,14 +46,77 @@ class Event extends cmdbAbstractObject
MetaModel::Init_AddAttribute(new AttributeText("message", array("allowed_values"=>null, "sql"=>"message", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeDateTime("date", array("allowed_values"=>null, "sql"=>"date", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeString("userinfo", array("allowed_values"=>null, "sql"=>"userinfo", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
// MetaModel::Init_AddAttribute(new AttributeString("userinfo", array("allowed_values"=>null, "sql"=>"userinfo", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
// Display lists
MetaModel::Init_SetZListItems('details', array('message', 'date', 'userinfo')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('details', array('date', 'message', 'userinfo')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('date', 'finalclass', 'message')); // 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
}
/**
* Maps the given context parameter name to the appropriate filter/search code for this class
* @param string $sContextParam Name of the context parameter, i.e. 'org_id'
* @return string Filter code, i.e. 'customer_id'
*/
public static function MapContextParam($sContextParam)
{
if ($sContextParam == 'menu')
{
return null;
}
else
{
return $sContextParam;
}
}
/**
* This function returns a 'hilight' CSS class, used to hilight a given row in a table
* There are currently (i.e defined in the CSS) 4 possible values HILIGHT_CLASS_CRITICAL,
* HILIGHT_CLASS_WARNING, HILIGHT_CLASS_OK, HILIGHT_CLASS_NONE
* To Be overridden by derived classes
* @param void
* @return String The desired higlight class for the object/row
*/
public function GetHilightClass()
{
// Possible return values are:
// HILIGHT_CLASS_CRITICAL, HILIGHT_CLASS_WARNING, HILIGHT_CLASS_OK, HILIGHT_CLASS_NONE
return HILIGHT_CLASS_NONE; // Not hilighted by default
}
public static function GetUIPage()
{
return '../pages/UI.php';
}
function DisplayDetails(WebPage $oPage, $bEditMode = false)
{
// Object's details
//$this->DisplayBareHeader($oPage, $bEditMode);
$oPage->AddTabContainer(OBJECT_PROPERTIES_TAB);
$oPage->SetCurrentTabContainer(OBJECT_PROPERTIES_TAB);
$oPage->SetCurrentTab(Dict::S('UI:PropertiesTab'));
$this->DisplayBareProperties($oPage, $bEditMode);
}
function DisplayBareProperties(WebPage $oPage, $bEditMode = false)
{
if ($bEditMode) return; // Not editable
$aDetails = array();
$sClass = get_class($this);
$aZList = MetaModel::FlattenZlist(MetaModel::GetZListItems($sClass, 'details'));
foreach( $aZList as $sAttCode)
{
$sDisplayValue = $this->GetAsHTML($sAttCode);
$aDetails[] = array('label' => '<span title="'.MetaModel::GetDescription($sClass, $sAttCode).'">'.MetaModel::GetLabel($sClass, $sAttCode).'</span>', 'value' => $sDisplayValue);
}
$oPage->Details($aDetails);
}
}
class EventNotification extends Event
@@ -79,8 +142,8 @@ class EventNotification extends Event
MetaModel::Init_AddAttribute(new AttributeInteger("object_id", array("allowed_values"=>null, "sql"=>"object_id", "default_value"=>0, "is_null_allowed"=>false, "depends_on"=>array())));
// Display lists
MetaModel::Init_SetZListItems('details', array('date', 'userinfo', 'trigger_id', 'action_id', 'object_id')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('date', 'userinfo')); // Attributes to be displayed for a list
MetaModel::Init_SetZListItems('details', array('date', 'message', 'userinfo', 'trigger_id', 'action_id', 'object_id')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('date', 'message')); // 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
@@ -115,7 +178,7 @@ class EventNotificationEmail extends EventNotification
// 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
MetaModel::Init_SetZListItems('list', array('date', 'userinfo', 'message', 'to', 'subject')); // Attributes to be displayed for a list
MetaModel::Init_SetZListItems('list', array('date', 'message', 'to', 'subject')); // Attributes to be displayed for a list
// Search criteria
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
@@ -258,4 +321,35 @@ class EventWebService extends Event
}
}
class EventLoginUsage extends Event
{
public static function Init()
{
$aParams = array
(
"category" => "core/cmdb,view_in_gui",
"key_type" => "autoincrement",
"name_attcode" => "",
"state_attcode" => "",
"reconc_keys" => array(),
"db_table" => "priv_event_loginusage",
"db_key_field" => "id",
"db_finalclass_field" => "",
);
MetaModel::Init_Params($aParams);
MetaModel::Init_InheritAttributes();
MetaModel::Init_AddAttribute(new AttributeExternalKey("user_id", array("targetclass"=>"User", "jointype"=> "", "allowed_values"=>null, "sql"=>"user_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeExternalField("contact_name", array("allowed_values"=>null, "extkey_attcode"=>"user_id", "target_attcode"=>"contactid", "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeExternalField("contact_email", array("allowed_values"=>null, "extkey_attcode"=>"user_id", "target_attcode"=>"email", "is_null_allowed"=>true, "depends_on"=>array())));
// Display lists
MetaModel::Init_SetZListItems('details', array('date', 'user_id', 'contact_name', 'contact_email', 'userinfo', 'message')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('date', 'user_id', 'contact_name', 'contact_email', 'userinfo')); // Attributes to be displayed for a list
// Search criteria
MetaModel::Init_SetZListItems('standard_search', array('date', 'user_id', 'contact_name', 'contact_email')); // Criteria of the std search form
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
}
}
?>

View File

@@ -30,7 +30,8 @@ class MissingQueryArgument extends CoreException
abstract class Expression
{
// recursive translation of identifiers
abstract public function Translate($aTranslationData, $bMatchAll = true);
abstract public function GetUnresolvedFields($sAlias, &$aUnresolved);
abstract public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true);
// 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);
@@ -66,6 +67,12 @@ abstract class Expression
return $oExpression;
}
static public function FromSQL($sSQL)
{
$oSql = new SQLExpression($sSQL);
return $oSql;
}
public function LogAnd($oExpr)
{
if ($this->IsTrue()) return clone $oExpr;
@@ -79,6 +86,42 @@ abstract class Expression
}
}
class SQLExpression extends Expression
{
protected $m_sSQL;
public function __construct($sSQL)
{
$this->m_sSQL = $sSQL;
}
public function IsTrue()
{
return false;
}
// recursive rendering
public function Render(&$aArgs = null, $bRetrofitParams = false)
{
return $this->m_sSQL;
}
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
}
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
{
return clone $this;
}
public function ListRequiredFields()
{
return array();
}
}
class BinaryExpression extends Expression
{
@@ -143,10 +186,16 @@ class BinaryExpression extends Expression
return "($sLeft $sOperator $sRight)";
}
public function Translate($aTranslationData, $bMatchAll = true)
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
$oLeft = $this->GetLeftExpr()->Translate($aTranslationData, $bMatchAll);
$oRight = $this->GetRightExpr()->Translate($aTranslationData, $bMatchAll);
$this->GetLeftExpr()->GetUnresolvedFields($sAlias, $aUnresolved);
$this->GetRightExpr()->GetUnresolvedFields($sAlias, $aUnresolved);
}
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
{
$oLeft = $this->GetLeftExpr()->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
$oRight = $this->GetRightExpr()->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
return new BinaryExpression($oLeft, $this->GetOperator(), $oRight);
}
@@ -194,7 +243,11 @@ class UnaryExpression extends Expression
}
}
public function Translate($aTranslationData, $bMatchAll = true)
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
}
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
{
return clone $this;
}
@@ -275,7 +328,21 @@ class FieldExpression extends UnaryExpression
return "`{$this->m_sParent}`.`{$this->m_sName}`";
}
public function Translate($aTranslationData, $bMatchAll = true)
public function ListRequiredFields()
{
return array($this->m_sParent.'.'.$this->m_sName);
}
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
if ($this->m_sParent == $sAlias)
{
// Add a reference to the field
$aUnresolved[$this->m_sName] = $this;
}
}
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
{
if (!array_key_exists($this->m_sParent, $aTranslationData))
{
@@ -292,21 +359,35 @@ class FieldExpression extends UnaryExpression
}
$sNewParent = $aTranslationData[$this->m_sParent]['*'];
$sNewName = $this->m_sName;
if ($bMarkFieldsAsResolved)
{
$oRet = new FieldExpressionResolved($sNewName, $sNewParent);
}
else
{
$oRet = new FieldExpression($sNewName, $sNewParent);
}
}
else
{
$sNewParent = $aTranslationData[$this->m_sParent][$this->m_sName][0];
$sNewName = $aTranslationData[$this->m_sParent][$this->m_sName][1];
$oRet = $aTranslationData[$this->m_sParent][$this->m_sName];
}
return new FieldExpression($sNewName, $sNewParent);
}
public function ListRequiredFields()
{
return array($this->m_sParent.'.'.$this->m_sName);
return $oRet;
}
}
// Has been resolved into an SQL expression
class FieldExpressionResolved extends FieldExpression
{
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
}
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
{
return clone $this;
}
}
class VariableExpression extends UnaryExpression
{
@@ -393,12 +474,20 @@ class ListExpression extends Expression
return '('.implode(', ', $aRes).')';
}
public function Translate($aTranslationData, $bMatchAll = true)
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
foreach ($this->m_aExpressions as $oExpr)
{
$oExpr->GetUnresolvedFields($sAlias, $aUnresolved);
}
}
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
{
$aRes = array();
foreach ($this->m_aExpressions as $oExpr)
{
$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll);
$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
}
return new ListExpression($aRes);
}
@@ -453,12 +542,20 @@ class FunctionExpression extends Expression
return $this->m_sVerb.'('.implode(', ', $aRes).')';
}
public function Translate($aTranslationData, $bMatchAll = true)
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
foreach ($this->m_aArgs as $oExpr)
{
$oExpr->GetUnresolvedFields($sAlias, $aUnresolved);
}
}
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
{
$aRes = array();
foreach ($this->m_aArgs as $oExpr)
{
$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll);
$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
}
return new FunctionExpression($this->m_sVerb, $aRes);
}
@@ -507,9 +604,14 @@ class IntervalExpression extends Expression
return 'INTERVAL '.$this->m_oValue->Render($aArgs, $bRetrofitParams).' '.$this->m_sUnit;
}
public function Translate($aTranslationData, $bMatchAll = true)
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
return new IntervalExpression($this->m_oValue->Translate($aTranslationData, $bMatchAll), $this->m_sUnit);
$this->m_oValue->GetUnresolvedFields($sAlias, $aUnresolved);
}
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
{
return new IntervalExpression($this->m_oValue->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved), $this->m_sUnit);
}
public function ListRequiredFields()
@@ -551,12 +653,20 @@ class CharConcatExpression extends Expression
return "CAST(CONCAT(".implode(', ', $aRes).") AS CHAR)";
}
public function Translate($aTranslationData, $bMatchAll = true)
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
foreach ($this->m_aExpressions as $oExpr)
{
$oExpr->GetUnresolvedFields($sAlias, $aUnresolved);
}
}
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
{
$aRes = array();
foreach ($this->m_aExpressions as $oExpr)
{
$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll);
$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
}
return new CharConcatExpression($aRes);
}
@@ -572,4 +682,102 @@ class CharConcatExpression extends Expression
}
}
class CharConcatWSExpression extends CharConcatExpression
{
protected $m_separator;
public function __construct($separator, $aExpressions)
{
$this->m_separator = $separator;
parent::__construct($aExpressions);
}
// recursive rendering
public function Render(&$aArgs = null, $bRetrofitParams = false)
{
$aRes = array();
foreach ($this->m_aExpressions as $oExpr)
{
$sCol = $oExpr->Render($aArgs, $bRetrofitParams);
// Concat will be globally NULL if one single argument is null !
$aRes[] = "COALESCE($sCol, '')";
}
$sSep = CMDBSource::Quote($this->m_separator);
return "CAST(CONCAT_WS($sSep, ".implode(', ', $aRes).") AS CHAR)";
}
}
class QueryBuilderExpressions
{
protected $m_oConditionExpr;
protected $m_aSelectExpr;
protected $m_aJoinFields;
public function __construct($aSelect, $oCondition)
{
$this->m_oConditionExpr = $oCondition;
$this->m_aSelectExpr = $aSelect;
$this->m_aJoinFields = array();
}
public function GetSelect()
{
return $this->m_aSelectExpr;
}
public function GetCondition()
{
return $this->m_oConditionExpr;
}
public function PopJoinField()
{
return array_pop($this->m_aJoinFields);
}
public function AddSelect($sAttAlias, $oExpression)
{
$this->m_aSelectExpr[$sAttAlias] = $oExpression;
}
//$oConditionTree = $oConditionTree->LogAnd($oFinalClassRestriction);
public function AddCondition($oExpression)
{
$this->m_oConditionExpr = $this->m_oConditionExpr->LogAnd($oExpression);
}
public function PushJoinField($oExpression)
{
array_push($this->m_aJoinFields, $oExpression);
}
public function GetUnresolvedFields($sAlias, &$aUnresolved)
{
$this->m_oConditionExpr->GetUnresolvedFields($sAlias, $aUnresolved);
foreach($this->m_aSelectExpr as $sColAlias => $oExpr)
{
$oExpr->GetUnresolvedFields($sAlias, $aUnresolved);
}
foreach($this->m_aJoinFields as $oExpression)
{
$oExpression->GetUnresolvedFields($sAlias, $aUnresolved);
}
}
public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
{
$this->m_oConditionExpr = $this->m_oConditionExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
foreach($this->m_aSelectExpr as $sColAlias => $oExpr)
{
$this->m_aSelectExpr[$sColAlias] = $oExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
}
foreach($this->m_aJoinFields as $index => $oExpression)
{
$this->m_aJoinFields[$index] = $oExpression->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
}
}
}
?>

View File

@@ -193,4 +193,13 @@ class ExecutionKPI
}
}
class ApplicationStartupKPI extends ExecutionKPI
{
public function __construct()
{
global $fItopStarted;
$this->m_fStarted = $fItopStarted;
}
}
?>

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,29 @@
<?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
/**
* OQL syntax analyzer, to be used prior to run the lexical analyzer
*
* @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
*/
// Notes (from the source file: oql-lexer.plex) - Romain
//
// The strval rule is a little bit cryptic.
@@ -98,6 +122,7 @@ class OQLLexerRaw
'/^,/',
'/^\\(/',
'/^\\)/',
'/^REGEXP/',
'/^=/',
'/^!=/',
'/^>/',
@@ -112,6 +137,7 @@ class OQLLexerRaw
'/^IF/',
'/^ELT/',
'/^COALESCE/',
'/^ISNULL/',
'/^CONCAT/',
'/^SUBSTR/',
'/^TRIM/',
@@ -314,204 +340,214 @@ class OQLLexerRaw
function yy_r1_16($yy_subpatterns)
{
$this->token = OQLParser::EQ;
$this->token = OQLParser::REGEXP;
}
function yy_r1_17($yy_subpatterns)
{
$this->token = OQLParser::NOT_EQ;
$this->token = OQLParser::EQ;
}
function yy_r1_18($yy_subpatterns)
{
$this->token = OQLParser::GT;
$this->token = OQLParser::NOT_EQ;
}
function yy_r1_19($yy_subpatterns)
{
$this->token = OQLParser::LT;
$this->token = OQLParser::GT;
}
function yy_r1_20($yy_subpatterns)
{
$this->token = OQLParser::GE;
$this->token = OQLParser::LT;
}
function yy_r1_21($yy_subpatterns)
{
$this->token = OQLParser::LE;
$this->token = OQLParser::GE;
}
function yy_r1_22($yy_subpatterns)
{
$this->token = OQLParser::LIKE;
$this->token = OQLParser::LE;
}
function yy_r1_23($yy_subpatterns)
{
$this->token = OQLParser::NOT_LIKE;
$this->token = OQLParser::LIKE;
}
function yy_r1_24($yy_subpatterns)
{
$this->token = OQLParser::IN;
$this->token = OQLParser::NOT_LIKE;
}
function yy_r1_25($yy_subpatterns)
{
$this->token = OQLParser::NOT_IN;
$this->token = OQLParser::IN;
}
function yy_r1_26($yy_subpatterns)
{
$this->token = OQLParser::INTERVAL;
$this->token = OQLParser::NOT_IN;
}
function yy_r1_27($yy_subpatterns)
{
$this->token = OQLParser::F_IF;
$this->token = OQLParser::INTERVAL;
}
function yy_r1_28($yy_subpatterns)
{
$this->token = OQLParser::F_ELT;
$this->token = OQLParser::F_IF;
}
function yy_r1_29($yy_subpatterns)
{
$this->token = OQLParser::F_COALESCE;
$this->token = OQLParser::F_ELT;
}
function yy_r1_30($yy_subpatterns)
{
$this->token = OQLParser::F_CONCAT;
$this->token = OQLParser::F_COALESCE;
}
function yy_r1_31($yy_subpatterns)
{
$this->token = OQLParser::F_SUBSTR;
$this->token = OQLParser::F_ISNULL;
}
function yy_r1_32($yy_subpatterns)
{
$this->token = OQLParser::F_TRIM;
$this->token = OQLParser::F_CONCAT;
}
function yy_r1_33($yy_subpatterns)
{
$this->token = OQLParser::F_DATE;
$this->token = OQLParser::F_SUBSTR;
}
function yy_r1_34($yy_subpatterns)
{
$this->token = OQLParser::F_DATE_FORMAT;
$this->token = OQLParser::F_TRIM;
}
function yy_r1_35($yy_subpatterns)
{
$this->token = OQLParser::F_CURRENT_DATE;
$this->token = OQLParser::F_DATE;
}
function yy_r1_36($yy_subpatterns)
{
$this->token = OQLParser::F_NOW;
$this->token = OQLParser::F_DATE_FORMAT;
}
function yy_r1_37($yy_subpatterns)
{
$this->token = OQLParser::F_TIME;
$this->token = OQLParser::F_CURRENT_DATE;
}
function yy_r1_38($yy_subpatterns)
{
$this->token = OQLParser::F_TO_DAYS;
$this->token = OQLParser::F_NOW;
}
function yy_r1_39($yy_subpatterns)
{
$this->token = OQLParser::F_FROM_DAYS;
$this->token = OQLParser::F_TIME;
}
function yy_r1_40($yy_subpatterns)
{
$this->token = OQLParser::F_YEAR;
$this->token = OQLParser::F_TO_DAYS;
}
function yy_r1_41($yy_subpatterns)
{
$this->token = OQLParser::F_MONTH;
$this->token = OQLParser::F_FROM_DAYS;
}
function yy_r1_42($yy_subpatterns)
{
$this->token = OQLParser::F_DAY;
$this->token = OQLParser::F_YEAR;
}
function yy_r1_43($yy_subpatterns)
{
$this->token = OQLParser::F_HOUR;
$this->token = OQLParser::F_MONTH;
}
function yy_r1_44($yy_subpatterns)
{
$this->token = OQLParser::F_MINUTE;
$this->token = OQLParser::F_DAY;
}
function yy_r1_45($yy_subpatterns)
{
$this->token = OQLParser::F_SECOND;
$this->token = OQLParser::F_HOUR;
}
function yy_r1_46($yy_subpatterns)
{
$this->token = OQLParser::F_DATE_ADD;
$this->token = OQLParser::F_MINUTE;
}
function yy_r1_47($yy_subpatterns)
{
$this->token = OQLParser::F_DATE_SUB;
$this->token = OQLParser::F_SECOND;
}
function yy_r1_48($yy_subpatterns)
{
$this->token = OQLParser::F_ROUND;
$this->token = OQLParser::F_DATE_ADD;
}
function yy_r1_49($yy_subpatterns)
{
$this->token = OQLParser::F_FLOOR;
$this->token = OQLParser::F_DATE_SUB;
}
function yy_r1_50($yy_subpatterns)
{
$this->token = OQLParser::F_INET_ATON;
$this->token = OQLParser::F_ROUND;
}
function yy_r1_51($yy_subpatterns)
{
$this->token = OQLParser::F_INET_NTOA;
$this->token = OQLParser::F_FLOOR;
}
function yy_r1_52($yy_subpatterns)
{
$this->token = OQLParser::NUMVAL;
$this->token = OQLParser::F_INET_ATON;
}
function yy_r1_53($yy_subpatterns)
{
$this->token = OQLParser::STRVAL;
$this->token = OQLParser::F_INET_NTOA;
}
function yy_r1_54($yy_subpatterns)
{
$this->token = OQLParser::NAME;
$this->token = OQLParser::NUMVAL;
}
function yy_r1_55($yy_subpatterns)
{
$this->token = OQLParser::VARNAME;
$this->token = OQLParser::STRVAL;
}
function yy_r1_56($yy_subpatterns)
{
$this->token = OQLParser::NAME;
}
function yy_r1_57($yy_subpatterns)
{
$this->token = OQLParser::VARNAME;
}
function yy_r1_58($yy_subpatterns)
{
$this->token = OQLParser::DOT;

View File

@@ -94,6 +94,7 @@ math_plus = "+"
math_minus = "-"
log_and = "AND"
log_or = "OR"
regexp = "REGEXP"
eq = "="
not_eq = "!="
gt = ">"
@@ -108,6 +109,7 @@ interval = "INTERVAL"
f_if = "IF"
f_elt = "ELT"
f_coalesce = "COALESCE"
f_isnull = "ISNULL"
f_concat = "CONCAT"
f_substr = "SUBSTR"
f_trim = "TRIM"
@@ -186,6 +188,9 @@ par_open {
par_close {
$this->token = OQLParser::PAR_CLOSE;
}
regexp {
$this->token = OQLParser::REGEXP;
}
eq {
$this->token = OQLParser::EQ;
}
@@ -228,6 +233,9 @@ f_elt {
f_coalesce {
$this->token = OQLParser::F_COALESCE;
}
f_isnull {
$this->token = OQLParser::F_ISNULL;
}
f_concat {
$this->token = OQLParser::F_CONCAT;
}

View File

@@ -133,43 +133,45 @@ class OQLParserRaw#line 102 "oql-parser.php"
const NAME = 20;
const NUMVAL = 21;
const STRVAL = 22;
const NOT_EQ = 23;
const LOG_AND = 24;
const LOG_OR = 25;
const MATH_DIV = 26;
const MATH_MULT = 27;
const MATH_PLUS = 28;
const MATH_MINUS = 29;
const GT = 30;
const LT = 31;
const GE = 32;
const LE = 33;
const LIKE = 34;
const NOT_LIKE = 35;
const IN = 36;
const NOT_IN = 37;
const F_IF = 38;
const F_ELT = 39;
const F_COALESCE = 40;
const F_CONCAT = 41;
const F_SUBSTR = 42;
const F_TRIM = 43;
const F_DATE = 44;
const F_DATE_FORMAT = 45;
const F_CURRENT_DATE = 46;
const F_NOW = 47;
const F_TIME = 48;
const F_TO_DAYS = 49;
const F_FROM_DAYS = 50;
const F_DATE_ADD = 51;
const F_DATE_SUB = 52;
const F_ROUND = 53;
const F_FLOOR = 54;
const F_INET_ATON = 55;
const F_INET_NTOA = 56;
const YY_NO_ACTION = 234;
const YY_ACCEPT_ACTION = 233;
const YY_ERROR_ACTION = 232;
const REGEXP = 23;
const NOT_EQ = 24;
const LOG_AND = 25;
const LOG_OR = 26;
const MATH_DIV = 27;
const MATH_MULT = 28;
const MATH_PLUS = 29;
const MATH_MINUS = 30;
const GT = 31;
const LT = 32;
const GE = 33;
const LE = 34;
const LIKE = 35;
const NOT_LIKE = 36;
const IN = 37;
const NOT_IN = 38;
const F_IF = 39;
const F_ELT = 40;
const F_COALESCE = 41;
const F_ISNULL = 42;
const F_CONCAT = 43;
const F_SUBSTR = 44;
const F_TRIM = 45;
const F_DATE = 46;
const F_DATE_FORMAT = 47;
const F_CURRENT_DATE = 48;
const F_NOW = 49;
const F_TIME = 50;
const F_TO_DAYS = 51;
const F_FROM_DAYS = 52;
const F_DATE_ADD = 53;
const F_DATE_SUB = 54;
const F_ROUND = 55;
const F_FLOOR = 56;
const F_INET_ATON = 57;
const F_INET_NTOA = 58;
const YY_NO_ACTION = 238;
const YY_ACCEPT_ACTION = 237;
const YY_ERROR_ACTION = 236;
/* Next are that tables used to determine what action to take based on the
** current state and lookahead token. These tables are used to implement
@@ -221,165 +223,179 @@ class OQLParserRaw#line 102 "oql-parser.php"
** shifting non-terminals after a reduce.
** self::$yy_default Default action for each state.
*/
const YY_SZ_ACTTAB = 384;
const YY_SZ_ACTTAB = 455;
static public $yy_action = array(
/* 0 */ 4, 117, 5, 11, 8, 106, 121, 122, 130, 103,
/* 10 */ 89, 91, 82, 83, 26, 3, 134, 118, 116, 12,
/* 20 */ 105, 70, 54, 58, 60, 59, 63, 64, 57, 90,
/* 30 */ 107, 108, 127, 126, 125, 123, 124, 128, 129, 133,
/* 40 */ 132, 131, 113, 112, 81, 109, 110, 114, 16, 52,
/* 50 */ 69, 31, 30, 29, 95, 97, 4, 33, 96, 101,
/* 60 */ 49, 27, 121, 122, 130, 25, 89, 91, 82, 83,
/* 70 */ 94, 86, 85, 84, 94, 86, 85, 84, 50, 28,
/* 80 */ 141, 141, 74, 25, 53, 90, 107, 108, 127, 126,
/* 90 */ 125, 123, 124, 128, 129, 133, 132, 131, 113, 112,
/* 100 */ 81, 109, 110, 114, 4, 87, 42, 88, 93, 23,
/* 110 */ 121, 122, 130, 74, 89, 91, 82, 83, 46, 2,
/* 120 */ 7, 94, 86, 85, 84, 102, 82, 83, 19, 48,
/* 130 */ 62, 45, 105, 90, 107, 108, 127, 126, 125, 123,
/* 140 */ 124, 128, 129, 133, 132, 131, 113, 112, 81, 109,
/* 150 */ 110, 114, 233, 111, 100, 52, 56, 74, 74, 74,
/* 160 */ 6, 97, 37, 34, 96, 101, 49, 17, 38, 186,
/* 170 */ 22, 23, 14, 6, 41, 44, 76, 55, 23, 52,
/* 180 */ 94, 86, 85, 84, 50, 97, 40, 34, 96, 101,
/* 190 */ 49, 47, 20, 75, 22, 52, 14, 1, 41, 35,
/* 200 */ 61, 51, 67, 52, 94, 86, 85, 84, 50, 97,
/* 210 */ 40, 34, 96, 101, 49, 13, 104, 52, 22, 24,
/* 220 */ 14, 74, 41, 66, 50, 10, 80, 91, 94, 86,
/* 230 */ 85, 84, 50, 98, 52, 25, 36, 120, 119, 23,
/* 240 */ 97, 37, 34, 96, 101, 49, 50, 92, 74, 22,
/* 250 */ 52, 14, 43, 41, 71, 68, 51, 23, 52, 94,
/* 260 */ 86, 85, 84, 50, 97, 18, 34, 96, 101, 49,
/* 270 */ 193, 193, 99, 22, 193, 14, 193, 41, 193, 50,
/* 280 */ 9, 193, 52, 94, 86, 85, 84, 50, 97, 32,
/* 290 */ 34, 96, 101, 49, 115, 193, 193, 22, 193, 14,
/* 300 */ 193, 41, 193, 193, 193, 193, 52, 94, 86, 85,
/* 310 */ 84, 50, 97, 193, 34, 96, 101, 49, 193, 193,
/* 320 */ 193, 22, 193, 14, 193, 39, 193, 193, 193, 193,
/* 330 */ 52, 94, 86, 85, 84, 50, 97, 193, 34, 96,
/* 340 */ 101, 49, 193, 193, 193, 22, 193, 15, 65, 77,
/* 350 */ 79, 78, 73, 72, 52, 94, 86, 85, 84, 50,
/* 360 */ 97, 105, 34, 96, 101, 49, 193, 193, 193, 21,
/* 370 */ 193, 193, 193, 193, 193, 193, 193, 193, 193, 94,
/* 380 */ 86, 85, 84, 50,
/* 0 */ 17, 6, 29, 143, 143, 28, 23, 56, 5, 120,
/* 10 */ 12, 2, 107, 10, 133, 134, 135, 102, 83, 82,
/* 20 */ 87, 88, 103, 104, 121, 119, 115, 116, 106, 105,
/* 30 */ 117, 118, 136, 66, 58, 59, 60, 57, 93, 92,
/* 40 */ 91, 89, 90, 108, 109, 128, 127, 126, 124, 125,
/* 50 */ 129, 130, 131, 132, 123, 122, 114, 113, 5, 35,
/* 60 */ 7, 3, 24, 70, 133, 134, 135, 106, 83, 82,
/* 70 */ 87, 88, 4, 75, 74, 73, 76, 77, 79, 62,
/* 80 */ 52, 69, 30, 20, 26, 63, 55, 106, 93, 92,
/* 90 */ 91, 89, 90, 108, 109, 128, 127, 126, 124, 125,
/* 100 */ 129, 130, 131, 132, 123, 122, 114, 113, 5, 54,
/* 110 */ 64, 64, 64, 64, 133, 134, 135, 8, 83, 82,
/* 120 */ 87, 88, 71, 43, 16, 24, 24, 31, 25, 81,
/* 130 */ 111, 27, 188, 19, 53, 23, 49, 50, 93, 92,
/* 140 */ 91, 89, 90, 108, 109, 128, 127, 126, 124, 125,
/* 150 */ 129, 130, 131, 132, 123, 122, 114, 113, 237, 110,
/* 160 */ 100, 52, 64, 64, 9, 68, 64, 97, 46, 32,
/* 170 */ 96, 101, 51, 44, 45, 84, 21, 24, 15, 38,
/* 180 */ 40, 13, 24, 82, 11, 52, 95, 94, 86, 85,
/* 190 */ 54, 97, 39, 32, 96, 101, 51, 47, 112, 1,
/* 200 */ 21, 23, 15, 8, 40, 99, 80, 72, 78, 52,
/* 210 */ 95, 94, 86, 85, 54, 97, 39, 32, 96, 101,
/* 220 */ 51, 42, 197, 197, 21, 52, 15, 197, 40, 197,
/* 230 */ 67, 55, 61, 52, 95, 94, 86, 85, 54, 97,
/* 240 */ 36, 32, 96, 101, 51, 197, 197, 197, 21, 197,
/* 250 */ 15, 197, 40, 197, 54, 48, 98, 52, 95, 94,
/* 260 */ 86, 85, 54, 97, 46, 32, 96, 101, 51, 197,
/* 270 */ 197, 197, 21, 52, 15, 197, 40, 197, 197, 65,
/* 280 */ 197, 52, 95, 94, 86, 85, 54, 97, 41, 32,
/* 290 */ 96, 101, 51, 197, 197, 197, 21, 197, 15, 197,
/* 300 */ 40, 197, 54, 197, 197, 52, 95, 94, 86, 85,
/* 310 */ 54, 97, 33, 32, 96, 101, 51, 197, 197, 197,
/* 320 */ 21, 197, 15, 197, 40, 197, 197, 197, 197, 52,
/* 330 */ 95, 94, 86, 85, 54, 97, 18, 32, 96, 101,
/* 340 */ 51, 197, 197, 197, 21, 197, 15, 197, 40, 197,
/* 350 */ 197, 197, 197, 52, 95, 94, 86, 85, 54, 97,
/* 360 */ 197, 32, 96, 101, 51, 197, 197, 197, 21, 197,
/* 370 */ 15, 197, 37, 197, 197, 197, 197, 52, 95, 94,
/* 380 */ 86, 85, 54, 97, 197, 32, 96, 101, 51, 197,
/* 390 */ 197, 197, 21, 197, 14, 197, 197, 197, 197, 197,
/* 400 */ 197, 52, 95, 94, 86, 85, 54, 97, 197, 32,
/* 410 */ 96, 101, 51, 197, 197, 197, 22, 197, 197, 197,
/* 420 */ 197, 197, 197, 197, 197, 52, 95, 94, 86, 85,
/* 430 */ 54, 97, 197, 34, 96, 101, 51, 197, 197, 197,
/* 440 */ 197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
/* 450 */ 95, 94, 86, 85, 54,
);
static public $yy_lookahead = array(
/* 0 */ 9, 8, 11, 4, 79, 10, 15, 16, 17, 10,
/* 10 */ 19, 20, 21, 22, 2, 5, 23, 92, 93, 7,
/* 20 */ 25, 28, 29, 30, 31, 32, 33, 34, 35, 38,
/* 30 */ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
/* 40 */ 49, 50, 51, 52, 53, 54, 55, 56, 1, 61,
/* 50 */ 63, 3, 4, 61, 70, 67, 9, 69, 70, 71,
/* 60 */ 72, 2, 15, 16, 17, 6, 19, 20, 21, 22,
/* 70 */ 86, 87, 88, 89, 86, 87, 88, 89, 90, 2,
/* 80 */ 3, 4, 90, 6, 61, 38, 39, 40, 41, 42,
/* 90 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
/* 100 */ 53, 54, 55, 56, 9, 70, 62, 36, 37, 65,
/* 110 */ 15, 16, 17, 90, 19, 20, 21, 22, 83, 4,
/* 120 */ 81, 86, 87, 88, 89, 10, 21, 22, 61, 61,
/* 130 */ 61, 64, 25, 38, 39, 40, 41, 42, 43, 44,
/* 140 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
/* 150 */ 55, 56, 58, 59, 60, 61, 24, 90, 90, 90,
/* 160 */ 82, 67, 68, 69, 70, 71, 72, 8, 62, 18,
/* 170 */ 76, 65, 78, 82, 80, 62, 85, 63, 65, 61,
/* 180 */ 86, 87, 88, 89, 90, 67, 68, 69, 70, 71,
/* 190 */ 72, 73, 61, 63, 76, 61, 78, 9, 80, 18,
/* 200 */ 66, 67, 84, 61, 86, 87, 88, 89, 90, 67,
/* 210 */ 68, 69, 70, 71, 72, 7, 75, 61, 76, 61,
/* 220 */ 78, 90, 80, 67, 90, 9, 84, 20, 86, 87,
/* 230 */ 88, 89, 90, 60, 61, 6, 62, 26, 27, 65,
/* 240 */ 67, 68, 69, 70, 71, 72, 90, 90, 90, 76,
/* 250 */ 61, 78, 74, 80, 62, 66, 67, 65, 61, 86,
/* 260 */ 87, 88, 89, 90, 67, 68, 69, 70, 71, 72,
/* 270 */ 94, 94, 63, 76, 94, 78, 94, 80, 94, 90,
/* 280 */ 77, 94, 61, 86, 87, 88, 89, 90, 67, 68,
/* 290 */ 69, 70, 71, 72, 91, 94, 94, 76, 94, 78,
/* 300 */ 94, 80, 94, 94, 94, 94, 61, 86, 87, 88,
/* 310 */ 89, 90, 67, 94, 69, 70, 71, 72, 94, 94,
/* 320 */ 94, 76, 94, 78, 94, 80, 94, 94, 94, 94,
/* 330 */ 61, 86, 87, 88, 89, 90, 67, 94, 69, 70,
/* 340 */ 71, 72, 94, 94, 94, 76, 94, 78, 12, 13,
/* 350 */ 14, 15, 16, 17, 61, 86, 87, 88, 89, 90,
/* 360 */ 67, 25, 69, 70, 71, 72, 94, 94, 94, 76,
/* 370 */ 94, 94, 94, 94, 94, 94, 94, 94, 94, 86,
/* 380 */ 87, 88, 89, 90,
/* 0 */ 1, 4, 2, 3, 4, 2, 6, 10, 9, 8,
/* 10 */ 7, 4, 10, 81, 15, 16, 17, 10, 19, 20,
/* 20 */ 21, 22, 37, 38, 23, 24, 94, 95, 26, 77,
/* 30 */ 29, 30, 31, 32, 33, 34, 35, 36, 39, 40,
/* 40 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
/* 50 */ 51, 52, 53, 54, 55, 56, 57, 58, 9, 64,
/* 60 */ 11, 5, 67, 65, 15, 16, 17, 26, 19, 20,
/* 70 */ 21, 22, 9, 12, 13, 14, 15, 16, 17, 25,
/* 80 */ 63, 63, 63, 63, 63, 68, 69, 26, 39, 40,
/* 90 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
/* 100 */ 51, 52, 53, 54, 55, 56, 57, 58, 9, 92,
/* 110 */ 92, 92, 92, 92, 15, 16, 17, 84, 19, 20,
/* 120 */ 21, 22, 64, 64, 8, 67, 67, 3, 4, 27,
/* 130 */ 28, 2, 18, 63, 63, 6, 66, 63, 39, 40,
/* 140 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
/* 150 */ 51, 52, 53, 54, 55, 56, 57, 58, 60, 61,
/* 160 */ 62, 63, 92, 92, 83, 65, 92, 69, 70, 71,
/* 170 */ 72, 73, 74, 18, 64, 92, 78, 67, 80, 64,
/* 180 */ 82, 7, 67, 20, 79, 63, 88, 89, 90, 91,
/* 190 */ 92, 69, 70, 71, 72, 73, 74, 75, 93, 9,
/* 200 */ 78, 6, 80, 84, 82, 65, 87, 65, 86, 63,
/* 210 */ 88, 89, 90, 91, 92, 69, 70, 71, 72, 73,
/* 220 */ 74, 76, 96, 96, 78, 63, 80, 96, 82, 96,
/* 230 */ 68, 69, 86, 63, 88, 89, 90, 91, 92, 69,
/* 240 */ 70, 71, 72, 73, 74, 96, 96, 96, 78, 96,
/* 250 */ 80, 96, 82, 96, 92, 85, 62, 63, 88, 89,
/* 260 */ 90, 91, 92, 69, 70, 71, 72, 73, 74, 96,
/* 270 */ 96, 96, 78, 63, 80, 96, 82, 96, 96, 69,
/* 280 */ 96, 63, 88, 89, 90, 91, 92, 69, 70, 71,
/* 290 */ 72, 73, 74, 96, 96, 96, 78, 96, 80, 96,
/* 300 */ 82, 96, 92, 96, 96, 63, 88, 89, 90, 91,
/* 310 */ 92, 69, 70, 71, 72, 73, 74, 96, 96, 96,
/* 320 */ 78, 96, 80, 96, 82, 96, 96, 96, 96, 63,
/* 330 */ 88, 89, 90, 91, 92, 69, 70, 71, 72, 73,
/* 340 */ 74, 96, 96, 96, 78, 96, 80, 96, 82, 96,
/* 350 */ 96, 96, 96, 63, 88, 89, 90, 91, 92, 69,
/* 360 */ 96, 71, 72, 73, 74, 96, 96, 96, 78, 96,
/* 370 */ 80, 96, 82, 96, 96, 96, 96, 63, 88, 89,
/* 380 */ 90, 91, 92, 69, 96, 71, 72, 73, 74, 96,
/* 390 */ 96, 96, 78, 96, 80, 96, 96, 96, 96, 96,
/* 400 */ 96, 63, 88, 89, 90, 91, 92, 69, 96, 71,
/* 410 */ 72, 73, 74, 96, 96, 96, 78, 96, 96, 96,
/* 420 */ 96, 96, 96, 96, 96, 63, 88, 89, 90, 91,
/* 430 */ 92, 69, 96, 71, 72, 73, 74, 96, 96, 96,
/* 440 */ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
/* 450 */ 88, 89, 90, 91, 92,
);
const YY_SHIFT_USE_DFLT = -10;
const YY_SHIFT_MAX = 53;
const YY_SHIFT_USE_DFLT = -16;
const YY_SHIFT_MAX = 55;
static public $yy_shift_ofst = array(
/* 0 */ 47, -9, -9, 95, 95, 95, 95, 95, 95, 95,
/* 10 */ 105, 105, 207, 207, -7, -7, 207, 207, 336, 77,
/* 20 */ 59, 211, 211, 229, 229, 207, 207, 207, 207, 229,
/* 30 */ 207, 207, -5, 71, 71, 207, 10, 107, 10, 132,
/* 40 */ 107, 132, 10, 216, 10, 48, -1, 115, 12, 188,
/* 50 */ 151, 159, 181, 208,
/* 0 */ -1, 49, 49, 99, 99, 99, 99, 99, 99, 99,
/* 10 */ 99, 99, 163, 163, 1, 1, 163, 163, 61, 0,
/* 20 */ 129, 102, 102, 163, 195, 163, 195, 163, 163, 163,
/* 30 */ 195, 163, -15, 2, -15, 56, 41, 54, 56, 41,
/* 40 */ 54, 41, 63, 56, 163, 56, 41, 7, -3, 124,
/* 50 */ 3, 190, 155, 174, 114, 116,
);
const YY_REDUCE_USE_DFLT = -76;
const YY_REDUCE_MAX = 44;
const YY_REDUCE_USE_DFLT = -69;
const YY_REDUCE_MAX = 46;
static public $yy_reduce_ofst = array(
/* 0 */ 94, 118, 142, 173, 221, 197, 245, 269, 293, -12,
/* 10 */ 35, -16, 134, 189, -75, -75, 67, 156, 91, 174,
/* 20 */ 113, 203, 203, 192, 44, 68, 23, -8, 158, 106,
/* 30 */ 69, 131, 78, 178, 178, 157, 209, 78, 114, 39,
/* 40 */ 78, 39, -13, 141, 130,
/* 0 */ 98, 122, 146, 194, 170, 242, 218, 266, 290, 314,
/* 10 */ 338, 362, 162, 17, -68, -68, 210, 70, 119, 115,
/* 20 */ 110, 105, 105, 74, 58, 18, -5, 19, 71, 21,
/* 30 */ 59, 20, 145, 33, 145, 142, 33, 81, 140, 33,
/* 40 */ 81, 33, -48, -2, 83, 100, 33,
);
static public $yyExpectedTokens = array(
/* 0 */ array(1, 9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 1 */ array(9, 11, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 2 */ array(9, 11, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 3 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 4 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 5 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 6 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 7 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 8 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 9 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 10 */ array(21, 22, ),
/* 11 */ array(21, 22, ),
/* 0 */ array(1, 9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 1 */ array(9, 11, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 2 */ array(9, 11, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 3 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 4 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 5 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 6 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 7 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 8 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 9 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 10 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 11 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 12 */ array(20, ),
/* 13 */ array(20, ),
/* 14 */ array(8, 23, 28, 29, 30, 31, 32, 33, 34, 35, ),
/* 15 */ array(8, 23, 28, 29, 30, 31, 32, 33, 34, 35, ),
/* 14 */ array(8, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, ),
/* 15 */ array(8, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, ),
/* 16 */ array(20, ),
/* 17 */ array(20, ),
/* 18 */ array(12, 13, 14, 15, 16, 17, 25, ),
/* 18 */ array(12, 13, 14, 15, 16, 17, 26, ),
/* 19 */ array(2, 3, 4, 6, ),
/* 20 */ array(2, 6, ),
/* 21 */ array(26, 27, ),
/* 22 */ array(26, 27, ),
/* 23 */ array(6, ),
/* 21 */ array(27, 28, ),
/* 22 */ array(27, 28, ),
/* 23 */ array(20, ),
/* 24 */ array(6, ),
/* 25 */ array(20, ),
/* 26 */ array(20, ),
/* 26 */ array(6, ),
/* 27 */ array(20, ),
/* 28 */ array(20, ),
/* 29 */ array(6, ),
/* 30 */ array(20, ),
/* 29 */ array(20, ),
/* 30 */ array(6, ),
/* 31 */ array(20, ),
/* 32 */ array(10, 25, ),
/* 33 */ array(36, 37, ),
/* 34 */ array(36, 37, ),
/* 35 */ array(20, ),
/* 36 */ array(5, ),
/* 32 */ array(37, 38, ),
/* 33 */ array(10, 26, ),
/* 34 */ array(37, 38, ),
/* 35 */ array(5, ),
/* 36 */ array(26, ),
/* 37 */ array(25, ),
/* 38 */ array(5, ),
/* 39 */ array(24, ),
/* 39 */ array(26, ),
/* 40 */ array(25, ),
/* 41 */ array(24, ),
/* 42 */ array(5, ),
/* 43 */ array(9, ),
/* 44 */ array(5, ),
/* 45 */ array(3, 4, ),
/* 46 */ array(4, 10, ),
/* 41 */ array(26, ),
/* 42 */ array(9, ),
/* 43 */ array(5, ),
/* 44 */ array(20, ),
/* 45 */ array(5, ),
/* 46 */ array(26, ),
/* 47 */ array(4, 10, ),
/* 48 */ array(2, 7, ),
/* 49 */ array(9, ),
/* 50 */ array(18, ),
/* 51 */ array(8, ),
/* 48 */ array(4, 10, ),
/* 49 */ array(3, 4, ),
/* 50 */ array(2, 7, ),
/* 51 */ array(9, ),
/* 52 */ array(18, ),
/* 53 */ array(7, ),
/* 54 */ array(),
/* 55 */ array(),
/* 54 */ array(18, ),
/* 55 */ array(8, ),
/* 56 */ array(),
/* 57 */ array(),
/* 58 */ array(),
@@ -459,22 +475,24 @@ static public $yy_action = array(
/* 132 */ array(),
/* 133 */ array(),
/* 134 */ array(),
/* 135 */ array(),
/* 136 */ array(),
);
static public $yy_default = array(
/* 0 */ 232, 169, 232, 232, 232, 232, 232, 232, 232, 232,
/* 10 */ 232, 232, 232, 232, 162, 163, 232, 232, 232, 147,
/* 20 */ 147, 161, 160, 146, 147, 232, 232, 232, 232, 147,
/* 30 */ 232, 232, 232, 159, 158, 232, 144, 151, 144, 165,
/* 40 */ 172, 164, 144, 232, 144, 232, 232, 232, 232, 232,
/* 50 */ 184, 232, 232, 232, 201, 140, 196, 207, 202, 204,
/* 60 */ 203, 149, 142, 205, 206, 174, 150, 170, 148, 138,
/* 70 */ 200, 145, 179, 178, 186, 139, 173, 175, 177, 176,
/* 80 */ 171, 228, 189, 190, 183, 182, 181, 167, 208, 187,
/* 90 */ 210, 188, 185, 209, 180, 168, 152, 153, 143, 137,
/* 100 */ 136, 154, 155, 166, 157, 197, 156, 211, 212, 229,
/* 110 */ 230, 135, 227, 226, 231, 191, 193, 194, 192, 199,
/* 120 */ 198, 225, 224, 216, 217, 215, 214, 213, 218, 219,
/* 130 */ 223, 222, 221, 220, 195,
/* 0 */ 236, 171, 236, 236, 236, 236, 236, 236, 236, 236,
/* 10 */ 236, 236, 236, 236, 165, 164, 236, 236, 236, 149,
/* 20 */ 149, 162, 163, 236, 148, 236, 149, 236, 236, 236,
/* 30 */ 149, 236, 160, 236, 161, 146, 169, 167, 146, 174,
/* 40 */ 166, 170, 236, 146, 236, 146, 153, 236, 236, 236,
/* 50 */ 236, 236, 236, 236, 186, 236, 168, 210, 207, 208,
/* 60 */ 209, 173, 199, 150, 188, 152, 206, 151, 141, 144,
/* 70 */ 142, 147, 140, 178, 177, 176, 179, 180, 172, 181,
/* 80 */ 175, 201, 190, 189, 187, 185, 184, 191, 192, 216,
/* 90 */ 217, 215, 214, 213, 183, 182, 154, 155, 145, 139,
/* 100 */ 138, 156, 157, 211, 212, 159, 200, 158, 218, 219,
/* 110 */ 137, 202, 193, 235, 234, 194, 195, 203, 204, 198,
/* 120 */ 197, 196, 233, 232, 223, 224, 222, 221, 220, 225,
/* 130 */ 226, 230, 231, 229, 228, 227, 205,
);
/* The next thing included is series of defines which control
** various aspects of the generated parser.
@@ -491,11 +509,11 @@ static public $yy_action = array(
** self::YYERRORSYMBOL is the code number of the error symbol. If not
** defined, then do no error processing.
*/
const YYNOCODE = 95;
const YYNOCODE = 97;
const YYSTACKDEPTH = 100;
const YYNSTATE = 135;
const YYNRULE = 97;
const YYERRORSYMBOL = 57;
const YYNSTATE = 137;
const YYNRULE = 99;
const YYERRORSYMBOL = 59;
const YYERRSYMDT = 'yy0';
const YYFALLBACK = 0;
/** The next table maps tokens into fallback tokens. If a construct
@@ -582,25 +600,25 @@ static public $yy_action = array(
'EQ', 'PAR_OPEN', 'PAR_CLOSE', 'INTERVAL',
'F_SECOND', 'F_MINUTE', 'F_HOUR', 'F_DAY',
'F_MONTH', 'F_YEAR', 'DOT', 'VARNAME',
'NAME', 'NUMVAL', 'STRVAL', 'NOT_EQ',
'LOG_AND', 'LOG_OR', 'MATH_DIV', 'MATH_MULT',
'MATH_PLUS', 'MATH_MINUS', 'GT', 'LT',
'GE', 'LE', 'LIKE', 'NOT_LIKE',
'IN', 'NOT_IN', 'F_IF', 'F_ELT',
'F_COALESCE', 'F_CONCAT', 'F_SUBSTR', 'F_TRIM',
'F_DATE', 'F_DATE_FORMAT', 'F_CURRENT_DATE', 'F_NOW',
'F_TIME', 'F_TO_DAYS', 'F_FROM_DAYS', 'F_DATE_ADD',
'F_DATE_SUB', 'F_ROUND', 'F_FLOOR', 'F_INET_ATON',
'F_INET_NTOA', 'error', 'result', 'query',
'condition', 'class_name', 'join_statement', 'where_statement',
'class_list', 'join_item', 'join_condition', 'field_id',
'expression_prio4', 'expression_basic', 'scalar', 'var_name',
'func_name', 'arg_list', 'list_operator', 'list',
'expression_prio1', 'operator1', 'expression_prio2', 'operator2',
'expression_prio3', 'operator3', 'operator4', 'scalar_list',
'argument', 'interval_unit', 'num_scalar', 'str_scalar',
'num_value', 'str_value', 'name', 'num_operator1',
'num_operator2', 'str_operator',
'NAME', 'NUMVAL', 'STRVAL', 'REGEXP',
'NOT_EQ', 'LOG_AND', 'LOG_OR', 'MATH_DIV',
'MATH_MULT', 'MATH_PLUS', 'MATH_MINUS', 'GT',
'LT', 'GE', 'LE', 'LIKE',
'NOT_LIKE', 'IN', 'NOT_IN', 'F_IF',
'F_ELT', 'F_COALESCE', 'F_ISNULL', 'F_CONCAT',
'F_SUBSTR', 'F_TRIM', 'F_DATE', 'F_DATE_FORMAT',
'F_CURRENT_DATE', 'F_NOW', 'F_TIME', 'F_TO_DAYS',
'F_FROM_DAYS', 'F_DATE_ADD', 'F_DATE_SUB', 'F_ROUND',
'F_FLOOR', 'F_INET_ATON', 'F_INET_NTOA', 'error',
'result', 'query', 'condition', 'class_name',
'join_statement', 'where_statement', 'class_list', 'join_item',
'join_condition', 'field_id', 'expression_prio4', 'expression_basic',
'scalar', 'var_name', 'func_name', 'arg_list',
'list_operator', 'list', 'expression_prio1', 'operator1',
'expression_prio2', 'operator2', 'expression_prio3', 'operator3',
'operator4', 'list_items', 'argument', 'interval_unit',
'num_scalar', 'str_scalar', 'num_value', 'str_value',
'name', 'num_operator1', 'num_operator2', 'str_operator',
);
/**
@@ -639,9 +657,9 @@ static public $yy_action = array(
/* 28 */ "expression_prio3 ::= expression_prio3 operator3 expression_prio2",
/* 29 */ "expression_prio4 ::= expression_prio3",
/* 30 */ "expression_prio4 ::= expression_prio4 operator4 expression_prio3",
/* 31 */ "list ::= PAR_OPEN scalar_list PAR_CLOSE",
/* 32 */ "scalar_list ::= scalar",
/* 33 */ "scalar_list ::= scalar_list COMA scalar",
/* 31 */ "list ::= PAR_OPEN list_items PAR_CLOSE",
/* 32 */ "list_items ::= expression_prio4",
/* 33 */ "list_items ::= list_items COMA expression_prio4",
/* 34 */ "arg_list ::=",
/* 35 */ "arg_list ::= argument",
/* 36 */ "arg_list ::= arg_list COMA argument",
@@ -667,44 +685,46 @@ static public $yy_action = array(
/* 56 */ "operator1 ::= num_operator1",
/* 57 */ "operator2 ::= num_operator2",
/* 58 */ "operator2 ::= str_operator",
/* 59 */ "operator2 ::= EQ",
/* 60 */ "operator2 ::= NOT_EQ",
/* 61 */ "operator3 ::= LOG_AND",
/* 62 */ "operator4 ::= LOG_OR",
/* 63 */ "num_operator1 ::= MATH_DIV",
/* 64 */ "num_operator1 ::= MATH_MULT",
/* 65 */ "num_operator2 ::= MATH_PLUS",
/* 66 */ "num_operator2 ::= MATH_MINUS",
/* 67 */ "num_operator2 ::= GT",
/* 68 */ "num_operator2 ::= LT",
/* 69 */ "num_operator2 ::= GE",
/* 70 */ "num_operator2 ::= LE",
/* 71 */ "str_operator ::= LIKE",
/* 72 */ "str_operator ::= NOT_LIKE",
/* 73 */ "list_operator ::= IN",
/* 74 */ "list_operator ::= NOT_IN",
/* 75 */ "func_name ::= F_IF",
/* 76 */ "func_name ::= F_ELT",
/* 77 */ "func_name ::= F_COALESCE",
/* 78 */ "func_name ::= F_CONCAT",
/* 79 */ "func_name ::= F_SUBSTR",
/* 80 */ "func_name ::= F_TRIM",
/* 81 */ "func_name ::= F_DATE",
/* 82 */ "func_name ::= F_DATE_FORMAT",
/* 83 */ "func_name ::= F_CURRENT_DATE",
/* 84 */ "func_name ::= F_NOW",
/* 85 */ "func_name ::= F_TIME",
/* 86 */ "func_name ::= F_TO_DAYS",
/* 87 */ "func_name ::= F_FROM_DAYS",
/* 88 */ "func_name ::= F_YEAR",
/* 89 */ "func_name ::= F_MONTH",
/* 90 */ "func_name ::= F_DAY",
/* 91 */ "func_name ::= F_DATE_ADD",
/* 92 */ "func_name ::= F_DATE_SUB",
/* 93 */ "func_name ::= F_ROUND",
/* 94 */ "func_name ::= F_FLOOR",
/* 95 */ "func_name ::= F_INET_ATON",
/* 96 */ "func_name ::= F_INET_NTOA",
/* 59 */ "operator2 ::= REGEXP",
/* 60 */ "operator2 ::= EQ",
/* 61 */ "operator2 ::= NOT_EQ",
/* 62 */ "operator3 ::= LOG_AND",
/* 63 */ "operator4 ::= LOG_OR",
/* 64 */ "num_operator1 ::= MATH_DIV",
/* 65 */ "num_operator1 ::= MATH_MULT",
/* 66 */ "num_operator2 ::= MATH_PLUS",
/* 67 */ "num_operator2 ::= MATH_MINUS",
/* 68 */ "num_operator2 ::= GT",
/* 69 */ "num_operator2 ::= LT",
/* 70 */ "num_operator2 ::= GE",
/* 71 */ "num_operator2 ::= LE",
/* 72 */ "str_operator ::= LIKE",
/* 73 */ "str_operator ::= NOT_LIKE",
/* 74 */ "list_operator ::= IN",
/* 75 */ "list_operator ::= NOT_IN",
/* 76 */ "func_name ::= F_IF",
/* 77 */ "func_name ::= F_ELT",
/* 78 */ "func_name ::= F_COALESCE",
/* 79 */ "func_name ::= F_ISNULL",
/* 80 */ "func_name ::= F_CONCAT",
/* 81 */ "func_name ::= F_SUBSTR",
/* 82 */ "func_name ::= F_TRIM",
/* 83 */ "func_name ::= F_DATE",
/* 84 */ "func_name ::= F_DATE_FORMAT",
/* 85 */ "func_name ::= F_CURRENT_DATE",
/* 86 */ "func_name ::= F_NOW",
/* 87 */ "func_name ::= F_TIME",
/* 88 */ "func_name ::= F_TO_DAYS",
/* 89 */ "func_name ::= F_FROM_DAYS",
/* 90 */ "func_name ::= F_YEAR",
/* 91 */ "func_name ::= F_MONTH",
/* 92 */ "func_name ::= F_DAY",
/* 93 */ "func_name ::= F_DATE_ADD",
/* 94 */ "func_name ::= F_DATE_SUB",
/* 95 */ "func_name ::= F_ROUND",
/* 96 */ "func_name ::= F_FLOOR",
/* 97 */ "func_name ::= F_INET_ATON",
/* 98 */ "func_name ::= F_INET_NTOA",
);
/**
@@ -1069,103 +1089,105 @@ static public $yy_action = array(
* </pre>
*/
static public $yyRuleInfo = array(
array( 'lhs' => 58, 'rhs' => 1 ),
array( 'lhs' => 58, 'rhs' => 1 ),
array( 'lhs' => 59, 'rhs' => 4 ),
array( 'lhs' => 59, 'rhs' => 6 ),
array( 'lhs' => 59, 'rhs' => 6 ),
array( 'lhs' => 59, 'rhs' => 8 ),
array( 'lhs' => 64, 'rhs' => 1 ),
array( 'lhs' => 64, 'rhs' => 3 ),
array( 'lhs' => 63, 'rhs' => 2 ),
array( 'lhs' => 63, 'rhs' => 0 ),
array( 'lhs' => 62, 'rhs' => 2 ),
array( 'lhs' => 62, 'rhs' => 1 ),
array( 'lhs' => 62, 'rhs' => 0 ),
array( 'lhs' => 65, 'rhs' => 6 ),
array( 'lhs' => 65, 'rhs' => 4 ),
array( 'lhs' => 66, 'rhs' => 3 ),
array( 'lhs' => 60, 'rhs' => 1 ),
array( 'lhs' => 69, 'rhs' => 1 ),
array( 'lhs' => 69, 'rhs' => 1 ),
array( 'lhs' => 69, 'rhs' => 1 ),
array( 'lhs' => 69, 'rhs' => 4 ),
array( 'lhs' => 69, 'rhs' => 3 ),
array( 'lhs' => 69, 'rhs' => 3 ),
array( 'lhs' => 76, 'rhs' => 1 ),
array( 'lhs' => 76, 'rhs' => 3 ),
array( 'lhs' => 60, 'rhs' => 1 ),
array( 'lhs' => 61, 'rhs' => 4 ),
array( 'lhs' => 61, 'rhs' => 6 ),
array( 'lhs' => 61, 'rhs' => 6 ),
array( 'lhs' => 61, 'rhs' => 8 ),
array( 'lhs' => 66, 'rhs' => 1 ),
array( 'lhs' => 66, 'rhs' => 3 ),
array( 'lhs' => 65, 'rhs' => 2 ),
array( 'lhs' => 65, 'rhs' => 0 ),
array( 'lhs' => 64, 'rhs' => 2 ),
array( 'lhs' => 64, 'rhs' => 1 ),
array( 'lhs' => 64, 'rhs' => 0 ),
array( 'lhs' => 67, 'rhs' => 6 ),
array( 'lhs' => 67, 'rhs' => 4 ),
array( 'lhs' => 68, 'rhs' => 3 ),
array( 'lhs' => 62, 'rhs' => 1 ),
array( 'lhs' => 71, 'rhs' => 1 ),
array( 'lhs' => 71, 'rhs' => 1 ),
array( 'lhs' => 71, 'rhs' => 1 ),
array( 'lhs' => 71, 'rhs' => 4 ),
array( 'lhs' => 71, 'rhs' => 3 ),
array( 'lhs' => 71, 'rhs' => 3 ),
array( 'lhs' => 78, 'rhs' => 1 ),
array( 'lhs' => 78, 'rhs' => 3 ),
array( 'lhs' => 80, 'rhs' => 1 ),
array( 'lhs' => 80, 'rhs' => 3 ),
array( 'lhs' => 68, 'rhs' => 1 ),
array( 'lhs' => 68, 'rhs' => 3 ),
array( 'lhs' => 82, 'rhs' => 1 ),
array( 'lhs' => 82, 'rhs' => 3 ),
array( 'lhs' => 70, 'rhs' => 1 ),
array( 'lhs' => 70, 'rhs' => 3 ),
array( 'lhs' => 77, 'rhs' => 3 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 85, 'rhs' => 3 ),
array( 'lhs' => 75, 'rhs' => 0 ),
array( 'lhs' => 75, 'rhs' => 1 ),
array( 'lhs' => 75, 'rhs' => 3 ),
array( 'lhs' => 83, 'rhs' => 1 ),
array( 'lhs' => 83, 'rhs' => 3 ),
array( 'lhs' => 73, 'rhs' => 0 ),
array( 'lhs' => 73, 'rhs' => 1 ),
array( 'lhs' => 73, 'rhs' => 3 ),
array( 'lhs' => 84, 'rhs' => 1 ),
array( 'lhs' => 84, 'rhs' => 3 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 70, 'rhs' => 1 ),
array( 'lhs' => 70, 'rhs' => 1 ),
array( 'lhs' => 86, 'rhs' => 1 ),
array( 'lhs' => 86, 'rhs' => 3 ),
array( 'lhs' => 87, 'rhs' => 1 ),
array( 'lhs' => 67, 'rhs' => 1 ),
array( 'lhs' => 67, 'rhs' => 3 ),
array( 'lhs' => 61, 'rhs' => 1 ),
array( 'lhs' => 71, 'rhs' => 1 ),
array( 'lhs' => 90, 'rhs' => 1 ),
array( 'lhs' => 87, 'rhs' => 1 ),
array( 'lhs' => 87, 'rhs' => 1 ),
array( 'lhs' => 87, 'rhs' => 1 ),
array( 'lhs' => 87, 'rhs' => 1 ),
array( 'lhs' => 87, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 88, 'rhs' => 1 ),
array( 'lhs' => 89, 'rhs' => 1 ),
array( 'lhs' => 77, 'rhs' => 1 ),
array( 'lhs' => 79, 'rhs' => 1 ),
array( 'lhs' => 79, 'rhs' => 1 ),
array( 'lhs' => 79, 'rhs' => 1 ),
array( 'lhs' => 69, 'rhs' => 1 ),
array( 'lhs' => 69, 'rhs' => 3 ),
array( 'lhs' => 63, 'rhs' => 1 ),
array( 'lhs' => 73, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 90, 'rhs' => 1 ),
array( 'lhs' => 91, 'rhs' => 1 ),
array( 'lhs' => 79, 'rhs' => 1 ),
array( 'lhs' => 81, 'rhs' => 1 ),
array( 'lhs' => 82, 'rhs' => 1 ),
array( 'lhs' => 91, 'rhs' => 1 ),
array( 'lhs' => 91, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 81, 'rhs' => 1 ),
array( 'lhs' => 81, 'rhs' => 1 ),
array( 'lhs' => 81, 'rhs' => 1 ),
array( 'lhs' => 81, 'rhs' => 1 ),
array( 'lhs' => 83, 'rhs' => 1 ),
array( 'lhs' => 84, 'rhs' => 1 ),
array( 'lhs' => 93, 'rhs' => 1 ),
array( 'lhs' => 93, 'rhs' => 1 ),
array( 'lhs' => 94, 'rhs' => 1 ),
array( 'lhs' => 94, 'rhs' => 1 ),
array( 'lhs' => 94, 'rhs' => 1 ),
array( 'lhs' => 94, 'rhs' => 1 ),
array( 'lhs' => 94, 'rhs' => 1 ),
array( 'lhs' => 94, 'rhs' => 1 ),
array( 'lhs' => 95, 'rhs' => 1 ),
array( 'lhs' => 95, 'rhs' => 1 ),
array( 'lhs' => 76, 'rhs' => 1 ),
array( 'lhs' => 76, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
);
/**
@@ -1227,7 +1249,6 @@ static public $yy_action = array(
49 => 49,
50 => 50,
51 => 51,
75 => 51,
76 => 51,
77 => 51,
78 => 51,
@@ -1249,6 +1270,8 @@ static public $yy_action = array(
94 => 51,
95 => 51,
96 => 51,
97 => 51,
98 => 51,
52 => 52,
53 => 53,
54 => 54,
@@ -1271,6 +1294,7 @@ static public $yy_action = array(
72 => 54,
73 => 54,
74 => 54,
75 => 54,
55 => 55,
);
/* Beginning here are the reduction cases. A typical example
@@ -1281,44 +1305,44 @@ static public $yy_action = array(
*/
#line 29 "oql-parser.y"
function yy_r0(){ $this->my_result = $this->yystack[$this->yyidx + 0]->minor; }
#line 1288 "oql-parser.php"
#line 1312 "oql-parser.php"
#line 32 "oql-parser.y"
function yy_r2(){
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor));
}
#line 1293 "oql-parser.php"
#line 1317 "oql-parser.php"
#line 35 "oql-parser.y"
function yy_r3(){
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor));
}
#line 1298 "oql-parser.php"
#line 1322 "oql-parser.php"
#line 39 "oql-parser.y"
function yy_r4(){
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -4]->minor);
}
#line 1303 "oql-parser.php"
#line 1327 "oql-parser.php"
#line 42 "oql-parser.y"
function yy_r5(){
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -6]->minor);
}
#line 1308 "oql-parser.php"
#line 1332 "oql-parser.php"
#line 47 "oql-parser.y"
function yy_r6(){
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
}
#line 1313 "oql-parser.php"
#line 1337 "oql-parser.php"
#line 50 "oql-parser.y"
function yy_r7(){
array_push($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor;
}
#line 1319 "oql-parser.php"
#line 1343 "oql-parser.php"
#line 55 "oql-parser.y"
function yy_r8(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; }
#line 1322 "oql-parser.php"
#line 1346 "oql-parser.php"
#line 56 "oql-parser.y"
function yy_r9(){ $this->_retvalue = null; }
#line 1325 "oql-parser.php"
#line 1349 "oql-parser.php"
#line 58 "oql-parser.y"
function yy_r10(){
// insert the join statement on top of the existing list
@@ -1326,67 +1350,67 @@ static public $yy_action = array(
// and return the updated array
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
}
#line 1333 "oql-parser.php"
#line 1357 "oql-parser.php"
#line 64 "oql-parser.y"
function yy_r11(){
$this->_retvalue = Array($this->yystack[$this->yyidx + 0]->minor);
}
#line 1338 "oql-parser.php"
#line 1362 "oql-parser.php"
#line 70 "oql-parser.y"
function yy_r13(){
// create an array with one single item
$this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
}
#line 1344 "oql-parser.php"
#line 1368 "oql-parser.php"
#line 75 "oql-parser.y"
function yy_r14(){
// create an array with one single item
$this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
}
#line 1350 "oql-parser.php"
#line 1374 "oql-parser.php"
#line 80 "oql-parser.y"
function yy_r15(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, '=', $this->yystack[$this->yyidx + 0]->minor); }
#line 1353 "oql-parser.php"
#line 1377 "oql-parser.php"
#line 82 "oql-parser.y"
function yy_r16(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; }
#line 1356 "oql-parser.php"
#line 1380 "oql-parser.php"
#line 87 "oql-parser.y"
function yy_r20(){ $this->_retvalue = new FunctionOqlExpression($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor); }
#line 1359 "oql-parser.php"
#line 1383 "oql-parser.php"
#line 88 "oql-parser.y"
function yy_r21(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; }
#line 1362 "oql-parser.php"
#line 1386 "oql-parser.php"
#line 89 "oql-parser.y"
function yy_r22(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); }
#line 1365 "oql-parser.php"
#line 1389 "oql-parser.php"
#line 104 "oql-parser.y"
function yy_r31(){
$this->_retvalue = new ListOqlExpression($this->yystack[$this->yyidx + -1]->minor);
}
#line 1370 "oql-parser.php"
#line 1394 "oql-parser.php"
#line 115 "oql-parser.y"
function yy_r34(){
$this->_retvalue = array();
}
#line 1375 "oql-parser.php"
#line 1399 "oql-parser.php"
#line 126 "oql-parser.y"
function yy_r38(){ $this->_retvalue = new IntervalOqlExpression($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); }
#line 1378 "oql-parser.php"
#line 1402 "oql-parser.php"
#line 138 "oql-parser.y"
function yy_r47(){ $this->_retvalue = new ScalarOqlExpression($this->yystack[$this->yyidx + 0]->minor); }
#line 1381 "oql-parser.php"
#line 1405 "oql-parser.php"
#line 141 "oql-parser.y"
function yy_r49(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor); }
#line 1384 "oql-parser.php"
#line 1408 "oql-parser.php"
#line 142 "oql-parser.y"
function yy_r50(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -2]->minor); }
#line 1387 "oql-parser.php"
#line 1411 "oql-parser.php"
#line 143 "oql-parser.y"
function yy_r51(){ $this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; }
#line 1390 "oql-parser.php"
#line 1414 "oql-parser.php"
#line 146 "oql-parser.y"
function yy_r52(){ $this->_retvalue = new VariableOqlExpression(substr($this->yystack[$this->yyidx + 0]->minor, 1)); }
#line 1393 "oql-parser.php"
#line 1417 "oql-parser.php"
#line 148 "oql-parser.y"
function yy_r53(){
if ($this->yystack[$this->yyidx + 0]->minor[0] == '`')
@@ -1399,13 +1423,13 @@ static public $yy_action = array(
}
$this->_retvalue = new OqlName($name, $this->m_iColPrev);
}
#line 1406 "oql-parser.php"
#line 1430 "oql-parser.php"
#line 160 "oql-parser.y"
function yy_r54(){$this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; }
#line 1409 "oql-parser.php"
#line 1433 "oql-parser.php"
#line 161 "oql-parser.y"
function yy_r55(){$this->_retvalue=stripslashes(substr($this->yystack[$this->yyidx + 0]->minor, 1, strlen($this->yystack[$this->yyidx + 0]->minor) - 2)); }
#line 1412 "oql-parser.php"
#line 1436 "oql-parser.php"
/**
* placeholder for the left hand side in a reduce operation.
@@ -1520,7 +1544,7 @@ static public $yy_action = array(
#line 25 "oql-parser.y"
throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN);
#line 1528 "oql-parser.php"
#line 1552 "oql-parser.php"
}
/**
@@ -1672,7 +1696,7 @@ throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCo
}
} while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
}
}#line 211 "oql-parser.y"
}#line 213 "oql-parser.y"
class OQLParserException extends OQLException
@@ -1737,4 +1761,4 @@ class OQLParser extends OQLParserRaw
}
}
#line 1747 "oql-parser.php"
#line 1771 "oql-parser.php"

View File

@@ -101,13 +101,13 @@ expression_prio4(A) ::= expression_prio3(X). { A = X; }
expression_prio4(A) ::= expression_prio4(X) operator4(Y) expression_prio3(Z). { A = new BinaryOqlExpression(X, Y, Z); }
list(A) ::= PAR_OPEN scalar_list(X) PAR_CLOSE. {
list(A) ::= PAR_OPEN list_items(X) PAR_CLOSE. {
A = new ListOqlExpression(X);
}
scalar_list(A) ::= scalar(X). {
list_items(A) ::= expression_prio4(X). {
A = array(X);
}
scalar_list(A) ::= scalar_list(L) COMA scalar(X). {
list_items(A) ::= list_items(L) COMA expression_prio4(X). {
array_push(L, X);
A = L;
}
@@ -164,6 +164,7 @@ str_value(A) ::= STRVAL(X). {A=stripslashes(substr(X, 1, strlen(X) - 2));}
operator1(A) ::= num_operator1(X). {A=X;}
operator2(A) ::= num_operator2(X). {A=X;}
operator2(A) ::= str_operator(X). {A=X;}
operator2(A) ::= REGEXP(X). {A=X;}
operator2(A) ::= EQ(X). {A=X;}
operator2(A) ::= NOT_EQ(X). {A=X;}
operator3(A) ::= LOG_AND(X). {A=X;}
@@ -187,6 +188,7 @@ list_operator(A) ::= NOT_IN(X). {A=X;}
func_name(A) ::= F_IF(X). { A=X; }
func_name(A) ::= F_ELT(X). { A=X; }
func_name(A) ::= F_COALESCE(X). { A=X; }
func_name(A) ::= F_ISNULL(X). { A=X; }
func_name(A) ::= F_CONCAT(X). { A=X; }
func_name(A) ::= F_SUBSTR(X). { A=X; }
func_name(A) ::= F_TRIM(X). { A=X; }

View File

@@ -52,19 +52,19 @@ class OQLException extends CoreException
public function getHtmlDesc($sHighlightHtmlBegin = '<b>', $sHighlightHtmlEnd = '</b>')
{
$sRet = htmlentities($this->m_MyIssue.", found '".$this->m_sUnexpected."' in: ");
$sRet .= htmlentities(substr($this->m_sInput, 0, $this->m_iCol));
$sRet .= $sHighlightHtmlBegin.htmlentities(substr($this->m_sInput, $this->m_iCol, strlen($this->m_sUnexpected))).$sHighlightHtmlEnd;
$sRet .= htmlentities(substr($this->m_sInput, $this->m_iCol + strlen($this->m_sUnexpected)));
$sRet = htmlentities($this->m_MyIssue.", found '".$this->m_sUnexpected."' in: ", ENT_QUOTES, 'UTF-8');
$sRet .= htmlentities(substr($this->m_sInput, 0, $this->m_iCol), ENT_QUOTES, 'UTF-8');
$sRet .= $sHighlightHtmlBegin.htmlentities(substr($this->m_sInput, $this->m_iCol, strlen($this->m_sUnexpected)), ENT_QUOTES, 'UTF-8').$sHighlightHtmlEnd;
$sRet .= htmlentities(substr($this->m_sInput, $this->m_iCol + strlen($this->m_sUnexpected)), ENT_QUOTES, 'UTF-8');
if (!is_null($this->m_aExpecting) && (count($this->m_aExpecting) > 0))
{
$sExpectations = '{'.implode(', ', $this->m_aExpecting).'}';
$sRet .= ", expecting ".htmlentities($sExpectations);
$sRet .= ", expecting ".htmlentities($sExpectations, ENT_QUOTES, 'UTF-8');
$sSuggest = self::FindClosestString($this->m_sUnexpected, $this->m_aExpecting);
if (strlen($sSuggest) > 0)
{
$sRet .= ", I would suggest to use '$sHighlightHtmlBegin".htmlentities($sSuggest)."$sHighlightHtmlEnd'";
$sRet .= ", I would suggest to use '$sHighlightHtmlBegin".htmlentities($sSuggest, ENT_QUOTES, 'UTF-8')."$sHighlightHtmlEnd'";
}
}

View File

@@ -0,0 +1,172 @@
<?php
// Copyright (C) 2011 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
define('CASELOG_VISIBLE_ITEMS', 2);
define('CASELOG_SEPARATOR', "\n".'========== %1$s : %2$s (%3$d) ============'."\n\n");
//require_once(APPROOT.'/core/userrights.class.inc.php');
//require_once(APPROOT.'/application/webpage.class.inc.php');
/**
* Class to store a "case log" in a structured way, keeping track of its successive entries
*/
class ormCaseLog {
protected $m_sLog;
protected $m_aIndex;
/**
* Initializes the log with the first (initial) entry
* @param $sLog string The text of the whole case log
* @param $aIndex hash The case log index
*/
public function __construct($sLog = '', $aIndex = array())
{
$this->m_sLog = $sLog;
$this->m_aIndex = $aIndex;
}
public function GetText()
{
return $this->m_sLog;
}
public function GetIndex()
{
return $this->m_aIndex;
}
public function __toString()
{
return $this->m_sLog;
}
public function GetAsHTML(WebPage $oP = null, $bEditMode = false, $aTransfoHandler = null)
{
$sHtml = '<table style="width:100%;table-layout:fixed"><tr><td>'; // Use table-layout:fixed to force the with to be independent from the actual content
$iPos = 0;
for($index=count($this->m_aIndex)-1 ; $index >= 0 ; $index--)
{
if ($index < count($this->m_aIndex) - CASELOG_VISIBLE_ITEMS)
{
$sOpen = '';
$sDisplay = 'style="display:none;"';
}
else
{
$sOpen = ' open';
$sDisplay = '';
}
$iPos += $this->m_aIndex[$index]['separator_length'];
$sTextEntry = substr($this->m_sLog, $iPos, $this->m_aIndex[$index]['text_length']);
$sTextEntry = str_replace(array("\r\n", "\n", "\r"), "<br/>", htmlentities($sTextEntry, ENT_QUOTES, 'UTF-8'));
if (!is_null($aTransfoHandler))
{
$sTextEntry = call_user_func($aTransfoHandler, $sTextEntry);
}
$iPos += $this->m_aIndex[$index]['text_length'];
$sEntry = '<div class="caselog_header'.$sOpen.'">';
$sEntry .= sprintf(Dict::S('UI:CaseLog:Header_Date_UserName'), $this->m_aIndex[$index]['date']->format(Dict::S('UI:CaseLog:DateFormat')), $this->m_aIndex[$index]['user_name']);
$sEntry .= '</div>';
$sEntry .= '<div class="caselog_entry"'.$sDisplay.'>';
$sEntry .= $sTextEntry;
$sEntry .= '</div>';
$sHtml = $sHtml.$sEntry;
}
// Process the case of an eventual remainder (quick migration of AttributeText fields)
if ($iPos < (strlen($this->m_sLog) - 1))
{
$sTextEntry = substr($this->m_sLog, $iPos);
$sTextEntry = str_replace(array("\r\n", "\n", "\r"), "<br/>", htmlentities($sTextEntry, ENT_QUOTES, 'UTF-8'));
if (!is_null($aTransfoHandler))
{
$sTextEntry = call_user_func($aTransfoHandler, $sTextEntry);
}
if (count($this->m_aIndex) == 0)
{
$sHtml .= '<div class="caselog_entry open">';
$sHtml .= $sTextEntry;
$sHtml .= '</div>';
}
else
{
if (count($this->m_aIndex) - CASELOG_VISIBLE_ITEMS > 0)
{
$sOpen = '';
$sDisplay = 'style="display:none;"';
}
else
{
$sOpen = ' open';
$sDisplay = '';
}
$sHtml .= '<div class="caselog_header'.$sOpen.'">';
$sHtml .= Dict::S('UI:CaseLog:InitialValue');
$sHtml .= '</div>';
$sHtml .= '<div class="caselog_entry"'.$sDisplay.'>';
$sHtml .= $sTextEntry;
$sHtml .= '</div>';
}
}
$sHtml .= '</td></tr></table>';
return $sHtml;
}
/**
* 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)
{
$sDate = date(Dict::S('UI:CaseLog:DateFormat'));
$sSeparator = sprintf(CASELOG_SEPARATOR, $sDate, UserRights::GetUserFriendlyName(), UserRights::GetUserId());
$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(),
'date' => new DateTime(),
'text_length' => $iTextlength,
'separator_length' => $iSepLength,
);
}
/**
* Get the latest entry from the log
* @return string
*/
public function GetLatestEntry()
{
$iLast = count($this->m_aIndex) - 1;
$aLastEntry = $this->m_aIndex[$iLast];
$sRes = substr($this->m_sLog, $aLastEntry['separator_length'], $aLastEntry['text_length']);
return $sRes;
}
/**
* Get the index of the latest entry from the log
* @return integer
*/
public function GetLatestEntryIndex()
{
$iLast = count($this->m_aIndex) - 1;
return $iLast;
}
}
?>

View File

@@ -35,36 +35,19 @@
require_once('cmdbsource.class.inc.php');
class SQLExpression extends BinaryExpression
{
}
class ScalarSQLExpression extends ScalarExpression
{
}
class TrueSQLExpression extends TrueExpression
{
}
class FieldSQLExpression extends FieldExpression
{
}
class VariableSQLExpression extends VariableExpression
{
}
class SQLQuery
{
private $m_SourceOQL = '';
private $m_sTable = '';
private $m_sTableAlias = '';
private $m_aFields = array();
private $m_oConditionExpr = null;
private $m_aFullTextNeedles = array();
private $m_bToDelete = true; // The current table must be listed for deletion ?
private $m_aValues = array(); // Values to set in case of an update query
private $m_oSelectedIdField = null;
private $m_aJoinSelects = array();
public function __construct($sTable, $sTableAlias, $aFields, $oConditionExpr, $aFullTextNeedles, $bToDelete = true, $aValues = array())
public function __construct($sTable, $sTableAlias, $aFields, $bToDelete = true, $aValues = array(), $oSelectedIdField = null)
{
// This check is not needed but for developping purposes
//if (!CMDBSource::IsTable($sTable))
@@ -79,18 +62,20 @@ class SQLQuery
$this->m_sTable = $sTable;
$this->m_sTableAlias = $sTableAlias;
$this->m_aFields = $aFields;
$this->m_oConditionExpr = $oConditionExpr;
if (is_null($oConditionExpr))
{
$this->m_oConditionExpr = new TrueExpression;
}
else if (!$oConditionExpr instanceof Expression)
{
throw new CoreException('Invalid type for condition, expecting an Expression', array('class' => get_class($oConditionExpr)));
}
$this->m_aFullTextNeedles = $aFullTextNeedles;
$this->m_oConditionExpr = null;
$this->m_bToDelete = $bToDelete;
$this->m_aValues = $aValues;
$this->m_oSelectedIdField = $oSelectedIdField;
}
public function SetSourceOQL($sOQL)
{
$this->m_SourceOQL = $sOQL;
}
public function GetSourceOQL()
{
return $this->m_SourceOQL;
}
public function DisplayHtml()
@@ -108,16 +93,6 @@ class SQLQuery
echo "<b>$this->m_sTable</b>$sFields<br/>\n";
// #@# todo - display html of an expression tree
//$this->m_oConditionExpr->DisplayHtml()
if (count($this->m_aFullTextNeedles) > 0)
{
echo "Full text criteria...<br/>\n";
echo "<ul class=\"treeview\">\n";
foreach ($this->m_aFullTextNeedles as $sFTNeedle)
{
echo "<li>$sFTNeedle</li>\n";
}
echo "</ul>";
}
if (count($this->m_aJoinSelects) > 0)
{
echo "Joined to...<br/>\n";
@@ -139,13 +114,19 @@ class SQLQuery
$oCondition = null;
$aDelTables = array();
$aSetValues = array();
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues);
$aSelectedIdFields = array();
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues, $aSelectedIdFields);
echo "From ...<br/>\n";
echo "<pre style=\"font-size: smaller;\">\n";
print_r($aFrom);
echo "</pre>";
}
public function SetSelect($aExpressions)
{
$this->m_aFields = $aExpressions;
}
public function SetCondition($oConditionExpr)
{
$this->m_oConditionExpr = $oConditionExpr;
@@ -153,7 +134,14 @@ class SQLQuery
public function AddCondition($oConditionExpr)
{
$this->m_oConditionExpr->LogAnd($oConditionExpr);
if (is_null($this->m_oConditionExpr))
{
$this->m_oConditionExpr = $oConditionExpr;
}
else
{
$this->m_oConditionExpr->LogAnd($oConditionExpr);
}
}
private function AddJoin($sJoinType, $oSQLQuery, $sLeftField, $sRightField, $sRightTableAlias = '')
@@ -202,7 +190,8 @@ class SQLQuery
$oCondition = null;
$aDelTables = array();
$aSetValues = array();
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues);
$aSelectedIdFields = array();
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues, $aSelectedIdFields);
// Target: DELETE myAlias1, myAlias2 FROM t1 as myAlias1, t2 as myAlias2, t3 as topreserve WHERE ...
@@ -216,8 +205,15 @@ class SQLQuery
throw new CoreException("Building a request wich will delete every object of a given table -looks suspicious- please use truncate instead...");
}
*/
$sWhere = self::ClauseWhere($oCondition, $aArgs);
return "DELETE $sDelete FROM $sFrom WHERE $sWhere";
if (is_null($oCondition))
{
// Delete all !!!
}
else
{
$sWhere = self::ClauseWhere($oCondition, $aArgs);
return "DELETE $sDelete FROM $sFrom WHERE $sWhere";
}
}
// Interface, build the SQL query
@@ -229,7 +225,8 @@ class SQLQuery
$oCondition = null;
$aDelTables = array();
$aSetValues = array();
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues);
$aSelectedIdFields = array();
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues, $aSelectedIdFields);
$sFrom = self::ClauseFrom($aFrom);
$sValues = self::ClauseValues($aSetValues);
@@ -246,13 +243,22 @@ class SQLQuery
$oCondition = null;
$aDelTables = array();
$aSetValues = array();
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues);
$aSelectedIdFields = array();
$this->privRender($aFrom, $aFields, $oCondition, $aDelTables, $aSetValues, $aSelectedIdFields);
$sFrom = self::ClauseFrom($aFrom);
$sWhere = self::ClauseWhere($oCondition, $aArgs);
if ($bGetCount)
{
$sSQL = "SELECT COUNT(*) AS COUNT FROM $sFrom WHERE $sWhere";
if (count($aSelectedIdFields) > 0)
{
$sIDFields = implode(', ', $aSelectedIdFields);
$sSQL = "SELECT COUNT(DISTINCT $sIDFields) AS COUNT FROM $sFrom WHERE $sWhere";
}
else
{
$sSQL = "SELECT COUNT(*) AS COUNT FROM $sFrom WHERE $sWhere";
}
}
else
{
@@ -338,7 +344,14 @@ class SQLQuery
private static function ClauseWhere($oConditionExpr, $aArgs = array())
{
return $oConditionExpr->Render($aArgs);
if (is_null($oConditionExpr))
{
return '1';
}
else
{
return $oConditionExpr->Render($aArgs);
}
}
private static function ClauseOrderBy($aOrderBy)
@@ -353,43 +366,14 @@ class SQLQuery
}
// Purpose: prepare the query data, once for all
private function privRender(&$aFrom, &$aFields, &$oCondition, &$aDelTables, &$aSetValues)
private function privRender(&$aFrom, &$aFields, &$oCondition, &$aDelTables, &$aSetValues, &$aSelectedIdFields)
{
$sTableAlias = $this->privRenderSingleTable($aFrom, $aFields, $aDelTables, $aSetValues);
// Add the full text search condition, based on each and every requested field
//
// To be updated with a real full text search based on the mySQL settings
// (then it might move somewhere else !)
//
$sTableAlias = $this->privRenderSingleTable($aFrom, $aFields, $aDelTables, $aSetValues, $aSelectedIdFields);
$oCondition = $this->m_oConditionExpr;
if ((count($aFields) > 0) && (count($this->m_aFullTextNeedles) > 0))
{
$aFieldExp = array();
foreach ($aFields as $sField)
{
// This is TEMPORARY (that's why it is weird, actually)
// Full text match will be done as an expression in the filter condition
// $sField is already a string `table`.`column`
// Let's make an expression out of it (again !)
$aFieldExp[] = Expression::FromOQL($sField);
}
$oFullTextExpr = new CharConcatExpression($aFieldExp);
// The cast is necessary because the CONCAT result in a binary string:
// if any of the field is a binary string => case sensitive comparison
//
foreach($this->m_aFullTextNeedles as $sFTNeedle)
{
$oNewCond = new BinaryExpression($oFullTextExpr, 'LIKE', new ScalarExpression("%$sFTNeedle%"));
$oCondition = $oCondition->LogAnd($oNewCond);
}
}
return $sTableAlias;
}
private function privRenderSingleTable(&$aFrom, &$aFields, &$aDelTables, &$aSetValues, $sJoinType = 'first', $sCallerAlias = '', $sLeftField = '', $sRightField = '', $sRightTableAlias = '')
private function privRenderSingleTable(&$aFrom, &$aFields, &$aDelTables, &$aSetValues, &$aSelectedIdFields, $sJoinType = 'first', $sCallerAlias = '', $sLeftField = '', $sRightField = '', $sRightTableAlias = '')
{
$aActualTableFields = CMDBSource::GetTableFieldsList($this->m_sTable);
@@ -419,8 +403,6 @@ class SQLQuery
//
foreach($this->m_aFields as $sAlias => $oExpression)
{
$sTable = $oExpression->GetParent();
$sColumn = $oExpression->GetName();
$aFields["`$sAlias`"] = $oExpression->Render();
}
if ($this->m_bToDelete)
@@ -432,6 +414,11 @@ class SQLQuery
$aSetValues["`{$this->m_sTableAlias}`.`$sFieldName`"] = $value; // quoted further!
}
if (!is_null($this->m_oSelectedIdField))
{
$aSelectedIdFields[] = $this->m_oSelectedIdField->Render();
}
// loop on joins, to complete the list of tables/fields/conditions
//
$aTempFrom = array(); // temporary subset of 'from' specs, to be grouped in the final query
@@ -443,7 +430,7 @@ class SQLQuery
$sRightField = $aJoinData["rightfield"];
$sRightTableAlias = $aJoinData["righttablealias"];
$sJoinTableAlias = $oRightSelect->privRenderSingleTable($aTempFrom, $aFields, $aDelTables, $aSetValues, $sJoinType, $this->m_sTableAlias, $sLeftField, $sRightField, $sRightTableAlias);
$sJoinTableAlias = $oRightSelect->privRenderSingleTable($aTempFrom, $aFields, $aDelTables, $aSetValues, $aSelectedIdFields, $sJoinType, $this->m_sTableAlias, $sLeftField, $sRightField, $sRightTableAlias);
}
$aFrom[$this->m_sTableAlias]['subfrom'] = $aTempFrom;

View File

@@ -105,6 +105,34 @@ abstract class TriggerOnObject extends Trigger
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
}
}
/**
* To trigger notifications when a ticket is updated from the portal
*/
class TriggerOnPortalUpdate extends TriggerOnObject
{
public static function Init()
{
$aParams = array
(
"category" => "core/cmdb",
"key_type" => "autoincrement",
"name_attcode" => "description",
"state_attcode" => "",
"reconc_keys" => array(),
"db_table" => "priv_trigger_onportalupdate",
"db_key_field" => "id",
"db_finalclass_field" => "",
"display_template" => "",
);
MetaModel::Init_Params($aParams);
MetaModel::Init_InheritAttributes();
// Display lists
MetaModel::Init_SetZListItems('details', array('description', 'target_class', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('finalclass', 'target_class', 'description')); // Attributes to be displayed for a list
// Search criteria
}
}
abstract class TriggerOnStateChange extends TriggerOnObject
{
@@ -130,7 +158,7 @@ abstract class TriggerOnStateChange extends TriggerOnObject
MetaModel::Init_SetZListItems('details', array('description', 'target_class', 'state', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('finalclass', 'target_class', 'state')); // 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('standard_search', array('description', 'target_class', 'state')); // Criteria of the std search form
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
}
}
@@ -141,7 +169,7 @@ class TriggerOnStateEnter extends TriggerOnStateChange
{
$aParams = array
(
"category" => "core/cmdb",
"category" => "core/cmdb,bizmodel",
"key_type" => "autoincrement",
"name_attcode" => "description",
"state_attcode" => "",
@@ -158,7 +186,7 @@ class TriggerOnStateEnter extends TriggerOnStateChange
MetaModel::Init_SetZListItems('details', array('description', 'target_class', 'state', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('target_class', 'state')); // 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('standard_search', array('description', 'target_class', 'state')); // Criteria of the std search form
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
}
}
@@ -169,7 +197,7 @@ class TriggerOnStateLeave extends TriggerOnStateChange
{
$aParams = array
(
"category" => "core/cmdb",
"category" => "core/cmdb,bizmodel",
"key_type" => "autoincrement",
"name_attcode" => "description",
"state_attcode" => "",
@@ -186,7 +214,7 @@ class TriggerOnStateLeave extends TriggerOnStateChange
MetaModel::Init_SetZListItems('details', array('description', 'target_class', 'state', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('target_class', 'state')); // Attributes to be displayed for a list
// Search criteria
// MetaModel::Init_SetZListItems('standard_search', array('')); // Criteria of the std search form
MetaModel::Init_SetZListItems('standard_search', array('description', 'target_class', 'state')); // Criteria of the std search form
// MetaModel::Init_SetZListItems('advanced_search', array('')); // Criteria of the advanced search form
}
}
@@ -197,7 +225,7 @@ class TriggerOnObjectCreate extends TriggerOnObject
{
$aParams = array
(
"category" => "core/cmdb",
"category" => "core/cmdb,bizmodel",
"key_type" => "autoincrement",
"name_attcode" => "description",
"state_attcode" => "",
@@ -214,7 +242,7 @@ class TriggerOnObjectCreate extends TriggerOnObject
MetaModel::Init_SetZListItems('details', array('description', 'target_class', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('finalclass', 'target_class')); // Attributes to be displayed for a list
// Search criteria
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
MetaModel::Init_SetZListItems('standard_search', array('description', 'target_class')); // Criteria of the std search form
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
}
}
@@ -225,7 +253,7 @@ class lnkTriggerAction extends cmdbAbstractObject
{
$aParams = array
(
"category" => "core/cmdb",
"category" => "core/cmdb,bizmodel",
"key_type" => "autoincrement",
"name_attcode" => "",
"state_attcode" => "",

View File

@@ -160,8 +160,7 @@ abstract class User extends cmdbAbstractObject
}
// Check that this user has at least one profile assigned
$oSet = $this->Get('profile_list');
$aProfileLinks = $oSet->ToArray();
if (count($aProfileLinks) == 0)
if ($oSet->Count() == 0)
{
$this->m_aCheckIssues[] = Dict::Format('Class:User/Error:AtLeastOneProfileIsNeeded');
}
@@ -202,7 +201,7 @@ abstract class User extends cmdbAbstractObject
{
if (UserRights::IsStimulusAllowed($sClass, $sStimulusCode, null, $this))
{
$aStimuli[] = '<span title="'.$sStimulusCode.': '.htmlentities($oStimulus->GetDescription()).'">'.htmlentities($oStimulus->GetLabel()).'</span>';
$aStimuli[] = '<span title="'.$sStimulusCode.': '.htmlentities($oStimulus->GetDescription(), ENT_QUOTES, 'UTF-8').'">'.htmlentities($oStimulus->GetLabel(), ENT_QUOTES, 'UTF-8').'</span>';
}
}
$sStimuli = implode(', ', $aStimuli);
@@ -668,10 +667,7 @@ class UserRights
if (MetaModel::DBIsReadOnly())
{
if ($iActionCode == UR_ACTION_MODIFY) return false;
if ($iActionCode == UR_ACTION_DELETE) return false;
if ($iActionCode == UR_ACTION_BULK_MODIFY) return false;
if ($iActionCode == UR_ACTION_BULK_DELETE) return false;
return false;
}
if (self::IsAdministrator($oUser)) return true;
@@ -820,4 +816,169 @@ class UserRights
}
}
/**
* Helper class to get the number/list of items for which a given action is allowed/possible
*/
class ActionChecker
{
var $oFilter;
var $iActionCode;
var $iAllowedCount = null;
var $aAllowedIDs = null;
public function __construct(DBObjectSearch $oFilter, $iActionCode)
{
$this->oFilter = $oFilter;
$this->iActionCode = $iActionCode;
$this->iAllowedCount = null;
$this->aAllowedIDs = null;
}
/**
* returns the number of objects for which the action is allowed
* @return integer The number of "allowed" objects 0..N
*/
public function GetAllowedCount()
{
if ($this->iAllowedCount == null) $this->CheckObjects();
return $this->iAllowedCount;
}
/**
* If IsAllowed returned UR_ALLOWED_DEPENDS, this methods returns
* an array of ObjKey => Status (true|false)
* @return array
*/
public function GetAllowedIDs()
{
if ($this->aAllowedIDs == null) $this->IsAllowed();
return $this->aAllowedIDs;
}
/**
* Check if the speficied stimulus is allowed for the set of objects
* @return UR_ALLOWED_YES, UR_ALLOWED_NO or UR_ALLOWED_DEPENDS
*/
public function IsAllowed()
{
$sClass = $this->oFilter->GetClass();
$oSet = new DBObjectSet($this->oFilter);
$iActionAllowed = UserRights::IsActionAllowed($sClass, $oSet, $this->iActionCode);
if ($iActionAllowed == UR_ALLOWED_DEPENDS)
{
// Check for each object if the action is allowed or not
$this->aAllowedIDs = array();
$oSet->Rewind();
$this->iAllowedCount = 0;
while($oObj = $oSet->Fetch())
{
$oObjSet = DBObjectSet::FromArray($sClass, array($oObj));
if (UserRights::IsActionAllowed($sClass, $this->iActionCode, $oObjSet) == UR_ALLOWED_NO)
{
$this->aAllowedIDs[$oObj->GetKey()] = false;
}
else
{
// Assume UR_ALLOWED_YES, since there is just one object !
$this->aAllowedIDs[$oObj->GetKey()] = true;
$this->iAllowedCount++;
}
}
}
else if ($iActionAllowed == UR_ALLOWED_YES)
{
$this->iAllowedCount = $oSet->Count();
$this->aAllowedIDs = array(); // Optimization: not filled when Ok for all objects
}
else // UR_ALLOWED_NO
{
$this->iAllowedCount = 0;
$this->aAllowedIDs = array();
}
return $iActionAllowed;
}
}
/**
* Helper class to get the number/list of items for which a given stimulus can be applied (allowed & possible)
*/
class StimulusChecker extends ActionChecker
{
var $sState = null;
public function __construct(DBObjectSearch $oFilter, $sState, $iStimulusCode)
{
parent::__construct($oFilter, $iStimulusCode);
$this->sState = $sState;
}
/**
* Check if the speficied stimulus is allowed for the set of objects
* @return UR_ALLOWED_YES, UR_ALLOWED_NO or UR_ALLOWED_DEPENDS
*/
public function IsAllowed()
{
$sClass = $this->oFilter->GetClass();
$oSet = new DBObjectSet($this->oFilter);
$iActionAllowed = UserRights::IsStimulusAllowed($sClass, $this->iActionCode, $oSet);
if ($iActionAllowed == UR_ALLOWED_NO)
{
$this->iAllowedCount = 0;
$this->aAllowedIDs = array();
}
else // Even if UR_ALLOWED_YES, we need to check if each object is in the appropriate state
{
// Hmmm, may not be needed right now because we limit the "multiple" action to object in
// the same state... may be useful later on if we want to extend this behavior...
// Check for each object if the action is allowed or not
$this->aAllowedIDs = array();
$oSet->Rewind();
$iAllowedCount = 0;
$iActionAllowed = UR_ALLOWED_DEPENDS;
while($oObj = $oSet->Fetch())
{
$aTransitions = $oObj->EnumTransitions();
if (array_key_exists($this->iActionCode, $aTransitions))
{
// Temporary optimization possible: since the current implementation
// of IsActionAllowed does not perform a 'per instance' check, we could
// skip this second validation phase and assume it would return UR_ALLOWED_YES
$oObjSet = DBObjectSet::FromArray($sClass, array($oObj));
if (UserRights::IsActionAllowed($sClass, $this->iActionCode, $oObjSet) == UR_ALLOWED_NO)
{
$this->aAllowedIDs[$oObj->GetKey()] = false;
}
else
{
// Assume UR_ALLOWED_YES, since there is just one object !
$this->aAllowedIDs[$oObj->GetKey()] = true;
$this->iState = $oObj->GetState();
$this->iAllowedCount++;
}
}
else
{
$this->aAllowedIDs[$oObj->GetKey()] = false;
}
}
}
if ($this->iAllowedCount == $oSet->Count())
{
$iActionAllowed = UR_ALLOWED_YES;
}
if ($this->iAllowedCount == 0)
{
$iActionAllowed = UR_ALLOWED_NO;
}
return $iActionAllowed;
}
public function GetState()
{
return $this->iState;
}
}
?>

View File

@@ -1,6 +1,6 @@
/* CSS Document */
body {
font-family: Tahoma, Verdana, Arial, Helevtica;
font-family: Tahoma, Verdana, Arial, Helvetica;
font-size: 10pt;
background-color: #fff;
color:#000000;
@@ -10,7 +10,7 @@ body {
}
.raw_output {
font-family: Courier-New, Courier, Arial, Helevtica;
font-family: Courier-New, Courier, Arial, Helvetica;
font-size: 8pt;
background-color: #eeeeee;
color: #000000;
@@ -126,9 +126,9 @@ th.headerSortDown {
td {
font-family: Tahoma, Verdana, Arial, Helvetica;
font-size: 8pt;
font-size: 12px;
color:#696969;
background-color: #ffffff;
nobackground-color: #ffffff;
padding: 0px;
}
@@ -139,14 +139,43 @@ tr.clicked td {
}
td.label {
vertical-align: top;
}
td.label span {
font-family: Tahoma, Verdana, Arial, Helvetica;
font-size: 12px;
color: #000000;
background-color:#f6f6f6;
padding: 0.25em;
font-weight:bold;
padding: 5px;
padding-right: 10px;
font-weight:bold;
vertical-align: top;
text-align: right;
display: block;
}
fieldset td.label span {
padding: 3px;
padding-right: 10px;
}
fieldset {
margin-top: 3px;
-moz-border-radius: 6px;
-webkit-border-radius: 6px;
border-radius: 6px;
border-style: solid;
border-color: #ddd;
}
legend {
font-family: Tahoma, Verdana, Arial, Helvetica;
font-size: 12px;
padding:8px;
color: #fff;
background-color: #1C94C4;
font-weight: bold;
-moz-border-radius: 6px;
-webkit-border-radius: 6px;
border-radius: 6px;
}
.ui-widget-content td a, p a, p a:visited, td a, td a:visited {
text-decoration:none;
color: #1C94C4;
@@ -160,7 +189,7 @@ p a:hover, td a:hover {
background: url(../images/mini-arrow-orange.gif) no-repeat left;
}
td a.no-arrow, td a.no-arrow:visited {
td a.no-arrow, td a.no-arrow:visited, .SearchDrawer a.no-arrow, .SearchDrawer a.no-arrow:visited {
text-decoration:none;
color:#000000;
padding-left:0px;
@@ -917,3 +946,106 @@ span.form_validation {
width: 95%;
-moz-border-radius: 0.5em;
}
.wiki_broken_link {
text-decoration: line-through;
}
.synoptics, .synoptics tr td {
background: transparent;
padding:10px;
font-size:1em;
vertical-align:middle;
color:#fff;
text-align:center;
}
.synoptics tr td.arrow {
color:#333;
border-top: 1px dashed #333;
width:100px;
}
.synoptics tr.synoptics_header td {
color:#000; font-size:1em;
vertical-align:middle;
text-align:center;
}
.mono_value {
display: inline-block;
background-color: #3c3;
color: #fff;
font-weight:bold;
padding: 3px;
padding-left: 5px;
padding-right: 5px;
margin-left:3px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
}
.multi_values {
display: inline-block;
background-color: #c33;
color: #fff;
font-weight:bold;
padding: 3px;
padding-left: 5px;
padding-right: 5px;
margin-left:3px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
}
.caselog {
overflow-x: hidden;
display: block;
overflow-y: auto;
border: 1px #ddd solid;
font-family: Tahoma, Verdana, Arial, Helvetica;
font-size: 12px;
}
.caselog_input_header {
padding-top:3px;
padding-bottom:3px;
border-top:1px solid #fff;
background: #ddd;
width:100%;
}
.caselog_header {
padding:3px;
border-top:1px solid #fff;
background: #ddd url(../images/plus.gif) left no-repeat;
padding-left: 16px;
cursor: pointer;
width:100%;
}
.caselog_header.open {
background: #ddd url(../images/minus.gif) left no-repeat;
}
.caselog_entry {
padding:3px;
padding-left: 16px;
border-bottom:1px #999 solid;
margin-left:0;
margin-right:0;
white-space: pre-wrap; /* css-3 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+, CSS3 */
}
table.details {
border-collapse: collapse;
noborder-bottom: 2px #fff solid;
width:100%;
}
table.details>tbody>tr>td {
border-bottom: 2px #ddd solid;
padding-bottom: 5px;
padding-top: 3px;
}
fieldset table.details>tbody>tr>td {
padding-top: 3px;
background: transparent;
border: 0;
}
.ac_dlg_loading {
background: white url('../images/indicator.gif') right center no-repeat;
}

View File

@@ -94,9 +94,6 @@ Dict::Add('DE DE', 'English', 'English', array(
'Core:AttributeTemplateHTML' => 'Template HTML',
'Core:AttributeTemplateHTML+' => 'HTML containing placeholders',
'Core:AttributeWikiText' => 'Wiki article',
'Core:AttributeWikiText+' => 'Wiki formatted text',
'Core:AttributeDateTime' => 'Date/time',
'Core:AttributeDateTime+' => 'Date and time (year-month-day hh:mm:ss)',
@@ -206,6 +203,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Change:ObjectDeleted' => 'Object deleted',
'Change:ObjectModified' => 'Object modified',
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s geändert zu %2$s (vorheriger Wert: %3$s)',
'Change:AttName_SetTo' => '%1$s geändert zu %2$s',
'Change:Text_AppendedTo_AttName' => '%1$s zugefügt an %2$s',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s modifiziert, vorheriger Wert: %2$s',
'Change:AttName_Changed' => '%1$s modifiziert',

View File

@@ -653,6 +653,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'Massenlöschung von %1$d Objekten der %2$s',
'UI:Delete:NotAllowedToDelete' => 'Sie sind nicht berechtigt, dieses Objekt zu löschen.',
'UI:Delete:NotAllowedToUpdate_Fields' => 'Sie sind nicht berechtigt, die folgenden Felder zu aktualisieren: %1$s',
'UI:Error:CannotDeleteBecause' => 'This object could not be deleted because: %1$s',
'UI:Error:NotEnoughRightsToDelete' => 'Dieses Objekt konnte nicht gelöscht werden, da der derzeitige Benutzer nicht die notwendigen Rechte dazu besitzt.',
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Dieses Objekt konnte nicht gelöscht werden, da zuerst dazu einige manuelle Operationen durchgeführt werden müssen.',
'UI:Archive_User_OnBehalfOf_User' => '%1$s im Auftrag von %2$s',
@@ -664,8 +665,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s gelöscht.',
'UI:Delete:ConfirmDeletionOf_Name' => 'Löschung von %1$s',
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Löschung von %1$d Objekten der Klasse %2$s',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Sollte automatisch gelöscht werden, aber Sie sind nicht berechtigt, dies zu tun',
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Muss automatisch gelöscht werden, aber Sie sind nicht berechtigt, dieses Objekt zu löschen. Bitte kontaktieren Sie Ihren Anwendungs-Administrator',
// 'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Sollte automatisch gelöscht werden, aber Sie sind nicht berechtigt, dies zu tun',
// 'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Muss automatisch gelöscht werden, aber Sie sind nicht berechtigt, dieses Objekt zu löschen. Bitte kontaktieren Sie Ihren Anwendungs-Administrator',
'UI:Delete:WillBeDeletedAutomatically' => 'Wird automatisch gelöscht',
'UI:Delete:MustBeDeletedManually' => 'Muss manuell gelöscht werden',
'UI:Delete:CannotUpdateBecause_Issue' => 'Sollte automatisch aktualisiert werden, aber: %1$s',

View File

@@ -84,9 +84,6 @@ Dict::Add('EN US', 'English', 'English', array(
'Core:AttributeTemplateHTML' => 'Template HTML',
'Core:AttributeTemplateHTML+' => 'HTML containing placeholders',
'Core:AttributeWikiText' => 'Wiki article',
'Core:AttributeWikiText+' => 'Wiki formatted text',
'Core:AttributeDateTime' => 'Date/time',
'Core:AttributeDateTime+' => 'Date and time (year-month-day hh:mm:ss)',
@@ -205,9 +202,11 @@ Dict::Add('EN US', 'English', 'English', array(
'Change:ObjectDeleted' => 'Object deleted',
'Change:ObjectModified' => 'Object modified',
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s set to %2$s (previous value: %3$s)',
'Change:AttName_SetTo' => '%1$s set to %2$s',
'Change:Text_AppendedTo_AttName' => '%1$s appended to %2$s',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s modified, previous value: %2$s',
'Change:AttName_Changed' => '%1$s modified',
'Change:AttName_EntryAdded' => '%1$s modified, new entry added.',
));
//
@@ -239,13 +238,13 @@ Dict::Add('EN US', 'English', 'English', array(
Dict::Add('EN US', 'English', 'English', array(
'Class:Event' => 'Log Event',
'Class:Event+' => 'An application internal event',
'Class:Event/Attribute:message' => 'message',
'Class:Event/Attribute:message' => 'Message',
'Class:Event/Attribute:message+' => 'short description of the event',
'Class:Event/Attribute:date' => 'date',
'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' => '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/Attribute:finalclass' => 'Type',
'Class:Event/Attribute:finalclass+' => '',
));
@@ -329,6 +328,21 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:EventWebService/Attribute:data+' => 'Result data',
));
//
// Class: EventLoginUsage
//
Dict::Add('EN US', 'English', 'English', array(
'Class:EventLoginUsage' => 'Login Usage',
'Class:EventLoginUsage+' => 'Connection to the application',
'Class:EventLoginUsage/Attribute:user_id' => 'Login',
'Class:EventLoginUsage/Attribute:user_id+' => 'Login',
'Class:EventLoginUsage/Attribute:contact_name' => 'User Name',
'Class:EventLoginUsage/Attribute:contact_name+' => 'User Name',
'Class:EventLoginUsage/Attribute:contact_email' => 'User Email',
'Class:EventLoginUsage/Attribute:contact_email+' => 'Email Address of the User',
));
//
// Class: Action
//
@@ -422,6 +436,15 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:TriggerOnObject/Attribute:target_class+' => '',
));
//
// Class: TriggerOnPortalUpdate
//
Dict::Add('EN US', 'English', 'English', array(
'Class:TriggerOnPortalUpdate' => 'Trigger (when updated from the portal)',
));
//
// Class: TriggerOnStateChange
//
@@ -479,5 +502,218 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:lnkTriggerAction/Attribute:order+' => 'Actions execution order',
));
//
// Synchro Data Source
//
Dict::Add('EN US', 'English', 'English', array(
'Class:SynchroDataSource/Attribute:name' => 'Name',
'Class:SynchroDataSource/Attribute:name+' => 'Name',
'Class:SynchroDataSource/Attribute:description' => 'Description',
'Class:SynchroDataSource/Attribute:status' => 'Status', //TODO: enum values
'Class:SynchroDataSource/Attribute:scope_class' => 'Target class',
'Class:SynchroDataSource/Attribute:user_id' => 'User',
'Class:SynchroDataSource/Attribute:notify_contact_id' => 'Contact to notify',
'Class:SynchroDataSource/Attribute:notify_contact_id+' => 'Contact to notify in case of error',
'Class:SynchroDataSource/Attribute:url_icon' => 'Icon\'s hyperlink',
'Class:SynchroDataSource/Attribute:url_icon+' => 'Hyperlink a (small) image representing the application with which iTop is synchronized',
'Class:SynchroDataSource/Attribute:url_application' => 'Application\'s hyperlink',
'Class:SynchroDataSource/Attribute:url_application+' => 'Hyperlink to the iTop object in the external application with which iTop is synchronized (if applicable). Possible placeholders: $this->attribute$ and $replica->primary_key$',
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Reconciliation policy', //TODO enum values
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Full load interval',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => 'A complete reload of all data must occur at least as often as specified here',
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Action on zero',
'Class:SynchroDataSource/Attribute:action_on_zero+' => 'Action taken when the search returns no object',
'Class:SynchroDataSource/Attribute:action_on_one' => 'Action on one',
'Class:SynchroDataSource/Attribute:action_on_one+' => 'Action taken when the search returns exactly one object',
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Action on many',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => 'Action taken when the search returns more than one object',
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'Users allowed',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => 'Who is allowed to delete synchronized objects',
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'Users allowed',
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Nobody',
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Administrators only',
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'All allowed users',
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Update rules',
'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',
'SynchroDataSource:Description' => 'Description',
'SynchroDataSource:Reconciliation' => 'Search &amp; reconciliation',
'SynchroDataSource:Deletion' => 'Deletion rules',
'SynchroDataSource:Status' => 'Status',
'SynchroDataSource:Information' => 'Information',
'SynchroDataSource:Definition' => 'Definition',
'Core:SynchroAttributes' => 'Attributes',
'Core:SynchroStatus' => 'Status',
'Core:Synchro:ErrorsLabel' => 'Errors',
'Core:Synchro:CreatedLabel' => 'Created',
'Core:Synchro:ModifiedLabel' => 'Modified',
'Core:Synchro:UnchangedLabel' => 'Unchanged',
'Core:Synchro:ReconciledErrorsLabel' => 'Errors',
'Core:Synchro:ReconciledLabel' => 'Reconciled',
'Core:Synchro:ReconciledNewLabel' => 'Created',
'Core:SynchroReconcile:Yes' => 'Yes',
'Core:SynchroReconcile:No' => 'No',
'Core:SynchroUpdate:Yes' => 'Yes',
'Core:SynchroUpdate:No' => 'No',
'Core:Synchro:LastestStatus' => 'Latest Status',
'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...',
'Menu:DataSources' => 'Synchronization Data Sources',
'Menu:DataSources+' => 'All Synchronization Data Sources',
'Core:Synchro:label_repl_ignored' => 'Ignored (%1$s)',
'Core:Synchro:label_repl_disappeared' => 'Disappeared (%1$s)',
'Core:Synchro:label_repl_existing' => 'Existing (%1$s)',
'Core:Synchro:label_repl_new' => 'New (%1$s)',
'Core:Synchro:label_obj_deleted' => 'Deleted (%1$s)',
'Core:Synchro:label_obj_obsoleted' => 'Obsoleted (%1$s)',
'Core:Synchro:label_obj_disappeared_errors' => 'Errors (%1$s)',
'Core:Synchro:label_obj_disappeared_no_action' => 'No Action (%1$s)',
'Core:Synchro:label_obj_unchanged' => 'Unchanged (%1$s)',
'Core:Synchro:label_obj_updated' => 'Updated (%1$s)',
'Core:Synchro:label_obj_updated_errors' => 'Errors (%1$s)',
'Core:Synchro:label_obj_new_unchanged' => 'Unchanged (%1$s)',
'Core:Synchro:label_obj_new_updated' => 'Updated (%1$s)',
'Core:Synchro:label_obj_created' => 'Created (%1$s)',
'Core:Synchro:label_obj_new_errors' => 'Errors (%1$s)',
'Core:Synchro:History' => 'Synchronization History',
'Core:SynchroLogTitle' => '%1$s - %2$s',
'Core:Synchro:Nb_Replica' => 'Replica processed: %1$s',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
'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.',
'Core:SynchroReplica:PublicData' => 'Public Data',
'Core:SynchroReplica:PrivateDetails' => 'Private Details',
'Core:SynchroReplica:BackToDataSource' => 'Go Back to the Synchro Data Source: %1$s',
'Core:SynchroReplica:ListOfReplicas' => 'List of Replica',
'Core:SynchroAttExtKey:ReconciliationById' => 'id (Primary Key)',
'Core:SynchroAtt:attcode' => 'Attribute',
'Core:SynchroAtt:attcode+' => 'Field of the object',
'Core:SynchroAtt:reconciliation' => 'Reconciliation ?',
'Core:SynchroAtt:reconciliation+' => 'Used for searching',
'Core:SynchroAtt:update' => 'Update ?',
'Core:SynchroAtt:update+' => 'Used to update the object',
'Core:SynchroAtt:update_policy' => 'Update Policy',
'Core:SynchroAtt:update_policy+' => 'Behavior of the updated field',
'Core:SynchroAtt:reconciliation_attcode' => 'Reconciliation Key',
'Core:SynchroAtt:reconciliation_attcode+' => 'Attribute Code for the External Key Reconciliation',
'Core:SyncDataExchangeComment' => '(DataExchange)',
'Core:Synchro:ListOfDataSources' => 'List of data sources:',
'Core:Synchro:LastSynchro' => 'Last synchronization:',
'Core:Synchro:ThisObjectIsSynchronized' => 'This object is synchronized with an external data source',
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'The object was <b>created</b> by the external data source %1$s',
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'The object <b>can be deleted</b> by the external data source %1$s',
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'You <b>cannot delete the object</b> because it is owned by the external data source %1$s',
'TitleSynchroExecution' => 'Execution of the synchronization',
'Class:SynchroDataSource:DataTable' => 'Database table: %1$s',
'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.',
'Class:AsyncSendEmail' => 'Email (asynchronous)',
'Class:AsyncSendEmail/Attribute:to' => 'To',
'Class:AsyncSendEmail/Attribute:subject' => 'Subject',
'Class:AsyncSendEmail/Attribute:body' => 'Body',
'Class:AsyncSendEmail/Attribute:header' => 'Header',
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Encrypted Password',
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Previous Value',
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Encrypted Field',
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Previous Value',
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Case Log',
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Last Entry',
'Class:SynchroDataSource' => 'Synchro Data Source',
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implementation',
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsolete',
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Production',
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Scope restriction',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Use the attributes',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Use the primary_key field',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Create',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Error',
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Error',
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Update',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Create',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Error',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Take the first one (random?)',
'Class:SynchroDataSource/Attribute:delete_policy' => 'Delete Policy',
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Delete',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignore',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Update',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Update then Delete',
'Class:SynchroDataSource/Attribute:attribute_list' => 'Attributes List',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Administrators only',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Everybody allowed to delete such objects',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Nobody',
'Class:SynchroAttribute' => 'Synchro Attribute',
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Sycnhro Data Source',
'Class:SynchroAttribute/Attribute:attcode' => 'Attribute Code',
'Class:SynchroAttribute/Attribute:update' => 'Update',
'Class:SynchroAttribute/Attribute:reconcile' => 'Reconcile',
'Class:SynchroAttribute/Attribute:update_policy' => 'Update Policy',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'Locked',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'Unlocked',
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Initialize if empty',
'Class:SynchroAttribute/Attribute:finalclass' => 'Class',
'Class:SynchroAttExtKey' => 'Synchro Attribute (ExtKey)',
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Reconciliation Attribute',
'Class:SynchroAttLinkSet' => 'Synchro Attribute (Linkset)',
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Rows separator',
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Attributes separator',
'Class:SynchroLog' => 'Synchr Log',
'Class:SynchroLog/Attribute:sync_source_id' => 'Synchro Data Source',
'Class:SynchroLog/Attribute:start_date' => 'Start Date',
'Class:SynchroLog/Attribute:end_date' => 'End Date',
'Class:SynchroLog/Attribute:status' => 'Status',
'Class:SynchroLog/Attribute:status/Value:completed' => 'Completed',
'Class:SynchroLog/Attribute:status/Value:error' => 'Error',
'Class:SynchroLog/Attribute:status/Value:running' => 'Still Running',
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nb replica seen',
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nb replica total',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nb objects deleted',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nb of errors while deleting',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nb objects obsoleted',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nb of errors while obsoleting',
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nb objects created',
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nb or errors while creating',
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nb objects updated',
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nb errors while updating',
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nb of errors during reconciliation',
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nb replica disappeared',
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nb objects updated',
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nb objects unchanged',
'Class:SynchroLog/Attribute:last_error' => 'Last error',
'Class:SynchroLog/Attribute:traces' => 'Traces',
'Class:SynchroReplica' => 'Synchro Replica',
'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' => 'Status',
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modified',
'Class:SynchroReplica/Attribute:status/Value:new' => 'New',
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Obsolete',
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Orphan',
'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: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',
));
//
// Attribute Duration
//
Dict::Add('EN US', 'English', 'English', array(
'Core:Duration_Seconds' => '%1$ds',
'Core:Duration_Minutes_Seconds' =>'%1$dmin %2$ds',
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds',
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sd %2$dh %3$dmin %4$ds',
));
?>

View File

@@ -400,7 +400,7 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:HistoryTab' => 'History',
'UI:NotificationsTab' => 'Notifications',
'UI:History:BulkImports' => 'History',
'UI:History:BulkImports+' => 'List of CSV imports (last first)',
'UI:History:BulkImports+' => 'List of CSV imports (latest import first)',
'UI:History:BulkImportDetails' => 'Changes resulting from the CSV import performed on %1$s (by %2$s)',
'UI:History:Date' => 'Date',
'UI:History:Date+' => 'Date of the change',
@@ -456,6 +456,7 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:LogOff:ThankYou' => 'Thank you for using iTop',
'UI:LogOff:ClickHereToLoginAgain' => 'Click here to login again...',
'UI:ChangePwdMenu' => 'Change Password...',
'UI:Login:PasswordChanged' => 'Password successfully set !',
'UI:AccessRO-All' => 'iTop is read-only',
'UI:AccessRO-Users' => 'iTop is read-only for end-users',
'UI:Login:RetypePwdDoesNotMatch' => 'New password and retyped new password do not match !',
@@ -623,8 +624,11 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:Delete:NotAllowedToDelete' => 'You are not allowed to delete this object',
'UI:Delete:NotAllowedToUpdate_Fields' => 'You are not allowed to update the following field(s): %1$s',
'UI:Error:NotEnoughRightsToDelete' => 'This object could not be deleted because the current user do not have sufficient rights',
'UI:Error:CannotDeleteBecause' => 'This object could not be deleted because: %1$s',
'UI:Error:CannotDeleteBecauseOfDepencies' => 'This object could not be deleted because some manual operations must be performed prior to that',
'UI:Error:CannotDeleteBecauseManualOpNeeded' => 'This object could not be deleted because some manual operations must be performed prior to that',
'UI:Archive_User_OnBehalfOf_User' => '%1$s on behalf of %2$s',
'UI:Delete:Deleted' => 'deleted',
'UI:Delete:AutomaticallyDeleted' => 'automatically deleted',
'UI:Delete:AutomaticResetOf_Fields' => 'automatic reset of field(s): %1$s',
'UI:Delete:CleaningUpRefencesTo_Object' => 'Cleaning up all references to %1$s...',
@@ -633,8 +637,9 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s deleted.',
'UI:Delete:ConfirmDeletionOf_Name' => 'Deletion of %1$s',
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Deletion of %1$d objects of class %2$s',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Should be automaticaly deleted, but you are not allowed to do so',
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Must be deleted manually - but you are not allowed to delete this object, please contact your application admin',
'UI:Delete:CannotDeleteBecause' => 'Could not be deleted: %1$s',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Should be automaticaly deleted, but this is not feasible: %1$s',
'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Must be deleted manually, but this is not feasible: %1$s',
'UI:Delete:WillBeDeletedAutomatically' => 'Will be automaticaly deleted',
'UI:Delete:MustBeDeletedManually' => 'Must be deleted manually',
'UI:Delete:CannotUpdateBecause_Issue' => 'Should be automatically updated, but: %1$s',
@@ -879,9 +884,36 @@ When associated with a trigger, each action is given an "order" number, specifyi
'Portal:AddAttachment' => ' Add Attachment ',
'Portal:RemoveAttachment' => ' Remove Attachment ',
'Portal:Attachment_No_To_Ticket_Name' => 'Attachment #%1$d to %2$s (%3$s)',
'Enum:Undefined' => 'Undefined',
'Enum:Undefined' => 'Undefined',
'UI:DurationForm_Days_Hours_Minutes_Seconds' => '%1$s Days %2$s Hours %3$s Minutes %4$s Seconds',
'UI:ModifyAllPageTitle' => 'Modify All',
'UI:Modify_N_ObjectsOf_Class' => 'Modifying %1$d objects of class %2$s',
'UI:Modify_M_ObjectsOf_Class_OutOf_N' => 'Modifying %1$d objects of class %2$s out of %3$d',
'UI:Menu:ModifyAll' => 'Modify...',
'UI:Button:ModifyAll' => 'Modify All',
'UI:Button:PreviewModifications' => 'Preview Modifications >>',
'UI:ModifiedObject' => 'Object Modified',
'UI:BulkModifyStatus' => 'Operation',
'UI:BulkModifyStatus+' => 'Status of the operation',
'UI:BulkModifyErrors' => 'Errors (if any)',
'UI:BulkModifyErrors+' => 'Errors preventing the modification',
'UI:BulkModifyStatusOk' => 'Ok',
'UI:BulkModifyStatusError' => 'Error',
'UI:BulkModifyStatusModified' => 'Modified',
'UI:BulkModifyStatusSkipped' => 'Skipped',
'UI:BulkModify_Count_DistinctValues' => '%1$d distinct values:',
'UI:BulkModify:Value_Exists_N_Times' => '%1$s, %2$d time(s)',
'UI:BulkModify:N_MoreValues' => '%1$d more values...',
'UI:AttemptingToSetAReadOnlyAttribute_Name' => 'Attempting to set the read-only field: %1$s',
'UI:FailedToApplyStimuli' => 'The action has failed.',
'UI:StimulusModify_N_ObjectsOf_Class' => '%1$s: Modifying %2$d objects of class %3$s',
'UI:CaseLogTypeYourTextHere' => 'Type your text here:',
'UI:CaseLog:DateFormat' => 'Y-m-d H:i:s',
'UI:CaseLog:Header_Date_UserName' => '%1$s - %2$s:',
'UI:CaseLog:InitialValue' => 'Initial value:',
'UI:AttemptingToSetASlaveAttribute_Name' => 'The field %1$s is not writable because it is mastered by the data synchronization. Value not set.',
'UI:ActionNotAllowed' => 'You are not allowed to perform this action on these objects.',
'UI:BulkAction:NoObjectSelected' => 'Please select at least one object to perform this operation',
'UI:AttemptingToChangeASlaveAttribute_Name' => 'The field %1$s is not writable because it is mastered by the data synchronization. Value remains unchanged.',
));
?>

View File

@@ -90,9 +90,6 @@ Dict::Add('ES CR', 'English', 'English', array(
'Core:AttributeTemplateHTML' => 'Template HTML',
'Core:AttributeTemplateHTML+' => 'HTML containing placeholders',
'Core:AttributeWikiText' => 'Wiki article',
'Core:AttributeWikiText+' => 'Wiki formatted text',
'Core:AttributeDateTime' => 'Date/time',
'Core:AttributeDateTime+' => 'Date and time (year-month-day hh:mm:ss)',
@@ -203,6 +200,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
// Used by CMDBChangeOp... & derived classes
Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s modificado en %2$s (valor anterior: %3$s)',
'Change:AttName_SetTo' => '%1$s modificado en %2$s',
'Change:Text_AppendedTo_AttName' => '%1$s añadido a %2$s',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s modificado, valor anterior: %2$s',
'Change:AttName_Changed' => '%1$s modificado',

View File

@@ -628,8 +628,8 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s borrado.',
'UI:Delete:ConfirmDeletionOf_Name' => 'Borrado de %1$s',
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Borrado de %1$d objetos de al clase %2$s',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Beberia ser eliminado automaticamente, pero usted no esta autorizado para hacerlo',
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Debe ser borrado manualmente - pero usted no esta autorizado para borrar este objeto, por favor contacte al administrador de la aplicacion',
// 'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Beberia ser eliminado automaticamente, pero usted no esta autorizado para hacerlo',
// 'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Debe ser borrado manualmente - pero usted no esta autorizado para borrar este objeto, por favor contacte al administrador de la aplicacion',
'UI:Delete:WillBeDeletedAutomatically' => 'Sera borrado automaticamente',
'UI:Delete:MustBeDeletedManually' => 'Debe ser borrado manualmente',
'UI:Delete:CannotUpdateBecause_Issue' => 'Debe ser actualizado automaticamente, pero: %1$s',

File diff suppressed because it is too large Load Diff

View File

@@ -15,46 +15,12 @@
// 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
* @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
*/
//////////////////////////////////////////////////////////////////////
// Classes in 'gui'
//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
// Classes in 'application'
//////////////////////////////////////////////////////////////////////
//
//
// Class: AuditCategory
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:AuditCategory' => 'Catégorie d\'audit',
'Class:AuditCategory+' => 'A section inside the overall audit',
'Class:AuditCategory/Attribute:name' => 'Nom',
'Class:AuditCategory/Attribute:name+' => 'Nom raccourci',
'Class:AuditCategory/Attribute:description' => 'Description',
'Class:AuditCategory/Attribute:description+' => 'Description',
'Class:AuditCategory/Attribute:definition_set' => 'Ensemble de définition',
'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: AuditRule
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:AuditRule' => 'Règle d\'audit',
'Class:AuditRule+' => '',
@@ -66,26 +32,94 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:AuditRule/Attribute:query+' => 'Expression OQL de calcul des éléments incorrects',
'Class:AuditRule/Attribute:valid_flag' => 'Interprétation',
'Class:AuditRule/Attribute:valid_flag+' => 'La requête définit-elle les éléments valides ?',
'Class:AuditRule/Attribute:valid_flag/Value:true' => 'Objets valides',
'Class:AuditRule/Attribute:valid_flag/Value:true+' => '',
'Class:AuditRule/Attribute:valid_flag/Value:false' => 'Objets incorrects',
'Class:AuditRule/Attribute:valid_flag/Value:false+' => '',
'Class:AuditRule/Attribute:valid_flag/Value:true' => 'Objets valides',
'Class:AuditRule/Attribute:valid_flag/Value:true+' => '',
'Class:AuditRule/Attribute:category_id' => 'Catégorie',
'Class:AuditRule/Attribute:category_id+' => '',
'Class:AuditRule/Attribute:category_name' => 'Category',
'Class:AuditRule/Attribute:category_name' => 'Categorie',
'Class:AuditRule/Attribute:category_name+' => '',
));
//////////////////////////////////////////////////////////////////////
// Classes in 'addon/userrights'
//////////////////////////////////////////////////////////////////////
//
//
// Class: User
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:AuditCategory' => 'Catégorie d\'audit',
'Class:AuditCategory+' => 'Une section de l\'audit',
'Class:AuditCategory/Attribute:name' => 'Nom',
'Class:AuditCategory/Attribute:name+' => 'Nom raccourci',
'Class:AuditCategory/Attribute:description' => 'Description',
'Class:AuditCategory/Attribute:description+' => 'Description',
'Class:AuditCategory/Attribute:definition_set' => 'Ensemble de définition',
'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:URP_Profiles' => 'Profil',
'Class:URP_Profiles+' => 'Profil utilisateur',
'Class:URP_Profiles/Attribute:name' => 'Nom',
'Class:URP_Profiles/Attribute:name+' => '',
'Class:URP_Profiles/Attribute:description' => 'Description',
'Class:URP_Profiles/Attribute:description+' => '',
'Class:URP_Profiles/Attribute:user_list' => 'Utilisateurs',
'Class:URP_Profiles/Attribute:user_list+' => 'Comptes utilisateur (logins) ayant ce profil',
'Class:URP_UserProfile' => 'Utilisateur/Profil',
'Class:URP_UserProfile+' => '',
'Class:URP_UserProfile/Attribute:userid' => 'Utilisateur',
'Class:URP_UserProfile/Attribute:userid+' => '',
'Class:URP_UserProfile/Attribute:userlogin' => 'Login',
'Class:URP_UserProfile/Attribute:userlogin+' => '',
'Class:URP_UserProfile/Attribute:profileid' => 'Profil',
'Class:URP_UserProfile/Attribute:profileid+' => '',
'Class:URP_UserProfile/Attribute:profile' => 'Profil',
'Class:URP_UserProfile/Attribute:profile+' => '',
'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/Attribute:userid' => 'Utilisateur',
'Class:URP_UserOrg/Attribute:userid+' => '',
'Class:URP_UserOrg/Attribute:userlogin' => 'Login',
'Class:URP_UserOrg/Attribute:userlogin+' => '',
'Class:URP_UserOrg/Attribute:allowed_org_id' => 'Organisation',
'Class:URP_UserOrg/Attribute:allowed_org_id+' => '',
'Class:URP_UserOrg/Attribute:allowed_org_name' => 'Organisation',
'Class:URP_UserOrg/Attribute:allowed_org_name+' => '',
'Class:URP_UserOrg/Attribute:reason' => 'Raison',
'Class:URP_UserOrg/Attribute:reason+' => 'Justifie la permission de voir les données de cette organisation',
'Class:URP_ActionGrant' => 'action_permission',
'Class:URP_ActionGrant+' => 'permissions on classes',
'Class:URP_ActionGrant/Attribute:profileid' => 'Profile',
'Class:URP_ActionGrant/Attribute:profileid+' => 'usage profile',
'Class:URP_ActionGrant/Attribute:profile' => 'Profile',
'Class:URP_ActionGrant/Attribute:profile+' => 'usage profile',
'Class:URP_ActionGrant/Attribute:class' => 'Class',
'Class:URP_ActionGrant/Attribute:class+' => 'Target class',
'Class:URP_ActionGrant/Attribute:permission' => 'Permission',
'Class:URP_ActionGrant/Attribute:permission+' => 'allowed or not allowed?',
'Class:URP_ActionGrant/Attribute:permission/Value:no' => 'no',
'Class:URP_ActionGrant/Attribute:permission/Value:no+' => 'no',
'Class:URP_ActionGrant/Attribute:permission/Value:yes' => 'yes',
'Class:URP_ActionGrant/Attribute:permission/Value:yes+' => 'yes',
'Class:URP_ActionGrant/Attribute:action' => 'Action',
'Class:URP_ActionGrant/Attribute:action+' => 'operations to perform on the given class',
'Class:URP_StimulusGrant' => 'stimulus_permission',
'Class:URP_StimulusGrant+' => 'permissions on stimilus in the life cycle of the object',
'Class:URP_StimulusGrant/Attribute:profileid' => 'Profile',
'Class:URP_StimulusGrant/Attribute:profileid+' => 'usage profile',
'Class:URP_StimulusGrant/Attribute:profile' => 'Profile',
'Class:URP_StimulusGrant/Attribute:profile+' => 'usage profile',
'Class:URP_StimulusGrant/Attribute:class' => 'Class',
'Class:URP_StimulusGrant/Attribute:class+' => 'Target class',
'Class:URP_StimulusGrant/Attribute:permission' => 'Permission',
'Class:URP_StimulusGrant/Attribute:permission+' => 'allowed or not allowed?',
'Class:URP_StimulusGrant/Attribute:permission/Value:no' => 'no',
'Class:URP_StimulusGrant/Attribute:permission/Value:no+' => 'no',
'Class:URP_StimulusGrant/Attribute:permission/Value:yes' => 'yes',
'Class:URP_StimulusGrant/Attribute:permission/Value:yes+' => 'yes',
'Class:URP_StimulusGrant/Attribute:stimulus' => 'Stimulus',
'Class:URP_StimulusGrant/Attribute:stimulus+' => 'stimulus code',
'Class:URP_AttributeGrant' => 'attribute_permission',
'Class:URP_AttributeGrant+' => 'permissions at the attributes level',
'Class:URP_AttributeGrant/Attribute:actiongrantid' => 'Action grant',
'Class:URP_AttributeGrant/Attribute:actiongrantid+' => 'action grant',
'Class:URP_AttributeGrant/Attribute:attcode' => 'Attribute',
'Class:URP_AttributeGrant/Attribute:attcode+' => 'attribute code',
'Class:User' => 'Utilisateur',
'Class:User+' => 'Compte utilisateur',
'Class:User/Attribute:finalclass' => 'Type de compte',
@@ -110,31 +144,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:User/Attribute:profile_list+' => 'Rôles, ouvrants les droits d\'accès',
'Class:User/Attribute:allowed_org_list' => 'Organisations permises',
'Class:User/Attribute:allowed_org_list+' => 'L\'utilisateur a le droit de voir les données des organisations listées ici. Si aucune organisation n\'est spécifiée, alors aucune restriction ne s\'applique.',
'Class:User/Error:LoginMustBeUnique' => 'Le login doit être unique - "%1s" est déjà utilisé.',
'Class:User/Error:AtLeastOneProfileIsNeeded' => 'L\'utilisateur doit avoir au moins un profil.',
));
//
// Class: URP_Profiles
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_Profiles' => 'Profil',
'Class:URP_Profiles+' => 'Profil utilisateur',
'Class:URP_Profiles/Attribute:name' => 'Nom',
'Class:URP_Profiles/Attribute:name+' => '',
'Class:URP_Profiles/Attribute:description' => 'Description',
'Class:URP_Profiles/Attribute:description+' => '',
'Class:URP_Profiles/Attribute:user_list' => 'Utilisateurs',
'Class:URP_Profiles/Attribute:user_list+' => 'Comptes utilisateur (logins) ayant ce profil',
));
//
// Class: URP_Dimensions
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_Dimensions' => 'Dimension',
'Class:URP_Dimensions+' => 'Dimension applicative (défini des silos)',
'Class:URP_Dimensions/Attribute:name' => 'Nom',
@@ -143,51 +154,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_Dimensions/Attribute:description+' => '',
'Class:URP_Dimensions/Attribute:type' => 'Type',
'Class:URP_Dimensions/Attribute:type+' => 'Nom de classe ou type de données (unité de projection)',
));
//
// Class: URP_UserProfile
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_UserProfile' => 'Utilisateur/Profil',
'Class:URP_UserProfile+' => '',
'Class:URP_UserProfile/Attribute:userid' => 'Utilisateur',
'Class:URP_UserProfile/Attribute:userid+' => '',
'Class:URP_UserProfile/Attribute:userlogin' => 'Login',
'Class:URP_UserProfile/Attribute:userlogin+' => '',
'Class:URP_UserProfile/Attribute:profileid' => 'Profil',
'Class:URP_UserProfile/Attribute:profileid+' => '',
'Class:URP_UserProfile/Attribute:profile' => 'Profil',
'Class:URP_UserProfile/Attribute:profile+' => '',
'Class:URP_UserProfile/Attribute:reason' => 'Raison',
'Class:URP_UserProfile/Attribute:reason+' => 'Justifie le rôle affecté à cet utilisateur',
));
//
// Class: URP_UserOrg
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_UserOrg' => 'Utilisateur/Organisation',
'Class:URP_UserOrg+' => 'Organizations permises pour l\'utilisateur',
'Class:URP_UserOrg/Attribute:userid' => 'Utilisateur',
'Class:URP_UserOrg/Attribute:userid+' => '',
'Class:URP_UserOrg/Attribute:userlogin' => 'Login',
'Class:URP_UserOrg/Attribute:userlogin+' => '',
'Class:URP_UserOrg/Attribute:allowed_org_id' => 'Organisation',
'Class:URP_UserOrg/Attribute:allowed_org_id+' => '',
'Class:URP_UserOrg/Attribute:allowed_org_name' => 'Organisation',
'Class:URP_UserOrg/Attribute:allowed_org_name+' => '',
'Class:URP_UserOrg/Attribute:reason' => 'Raison',
'Class:URP_UserOrg/Attribute:reason+' => 'Justifie la permission de voir les données de cette organisation',
));
//
// Class: URP_ProfileProjection
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_ProfileProjection' => 'profile_projection',
'Class:URP_ProfileProjection+' => 'profile projections',
'Class:URP_ProfileProjection/Attribute:dimensionid' => 'Dimension',
@@ -202,13 +168,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_ProfileProjection/Attribute:value+' => 'OQL expression (using $user) | constant | | +attribute code',
'Class:URP_ProfileProjection/Attribute:attribute' => 'Attribute',
'Class:URP_ProfileProjection/Attribute:attribute+' => 'Target attribute code (optional)',
));
//
// Class: URP_ClassProjection
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_ClassProjection' => 'class_projection',
'Class:URP_ClassProjection+' => 'class projections',
'Class:URP_ClassProjection/Attribute:dimensionid' => 'Dimension',
@@ -221,78 +180,11 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_ClassProjection/Attribute:value+' => 'OQL expression (using $this) | constant | | +attribute code',
'Class:URP_ClassProjection/Attribute:attribute' => 'Attribute',
'Class:URP_ClassProjection/Attribute:attribute+' => 'Target attribute code (optional)',
));
//
// Class: URP_ActionGrant
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_ActionGrant' => 'action_permission',
'Class:URP_ActionGrant+' => 'permissions on classes',
'Class:URP_ActionGrant/Attribute:profileid' => 'Profile',
'Class:URP_ActionGrant/Attribute:profileid+' => 'usage profile',
'Class:URP_ActionGrant/Attribute:profile' => 'Profile',
'Class:URP_ActionGrant/Attribute:profile+' => 'usage profile',
'Class:URP_ActionGrant/Attribute:class' => 'Class',
'Class:URP_ActionGrant/Attribute:class+' => 'Target class',
'Class:URP_ActionGrant/Attribute:permission' => 'Permission',
'Class:URP_ActionGrant/Attribute:permission+' => 'allowed or not allowed?',
'Class:URP_ActionGrant/Attribute:permission/Value:yes' => 'yes',
'Class:URP_ActionGrant/Attribute:permission/Value:yes+' => 'yes',
'Class:URP_ActionGrant/Attribute:permission/Value:no' => 'no',
'Class:URP_ActionGrant/Attribute:permission/Value:no+' => 'no',
'Class:URP_ActionGrant/Attribute:action' => 'Action',
'Class:URP_ActionGrant/Attribute:action+' => 'operations to perform on the given class',
));
//
// Class: URP_StimulusGrant
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_StimulusGrant' => 'stimulus_permission',
'Class:URP_StimulusGrant+' => 'permissions on stimilus in the life cycle of the object',
'Class:URP_StimulusGrant/Attribute:profileid' => 'Profile',
'Class:URP_StimulusGrant/Attribute:profileid+' => 'usage profile',
'Class:URP_StimulusGrant/Attribute:profile' => 'Profile',
'Class:URP_StimulusGrant/Attribute:profile+' => 'usage profile',
'Class:URP_StimulusGrant/Attribute:class' => 'Class',
'Class:URP_StimulusGrant/Attribute:class+' => 'Target class',
'Class:URP_StimulusGrant/Attribute:permission' => 'Permission',
'Class:URP_StimulusGrant/Attribute:permission+' => 'allowed or not allowed?',
'Class:URP_StimulusGrant/Attribute:permission/Value:yes' => 'yes',
'Class:URP_StimulusGrant/Attribute:permission/Value:yes+' => 'yes',
'Class:URP_StimulusGrant/Attribute:permission/Value:no' => 'no',
'Class:URP_StimulusGrant/Attribute:permission/Value:no+' => 'no',
'Class:URP_StimulusGrant/Attribute:stimulus' => 'Stimulus',
'Class:URP_StimulusGrant/Attribute:stimulus+' => 'stimulus code',
));
//
// Class: URP_AttributeGrant
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:URP_AttributeGrant' => 'attribute_permission',
'Class:URP_AttributeGrant+' => 'permissions at the attributes level',
'Class:URP_AttributeGrant/Attribute:actiongrantid' => 'Action grant',
'Class:URP_AttributeGrant/Attribute:actiongrantid+' => 'action grant',
'Class:URP_AttributeGrant/Attribute:attcode' => 'Attribute',
'Class:URP_AttributeGrant/Attribute:attcode+' => 'attribute code',
));
//
// String from the User Interface: menu, messages, buttons, etc...
//
Dict::Add('FR FR', 'French', 'Français', array(
'Menu:WelcomeMenu' => 'Bienvenue',
'Menu:WelcomeMenu+' => 'Bienvenue dans iTop',
'Menu:WelcomeMenuPage' => 'Bienvenue',
'Menu:WelcomeMenuPage+' => 'Bienvenue dans iTop',
'UI:WelcomeMenu:Title' => 'Bienvenue dans iTop',
'UI:WelcomeMenu:LeftBlock' => '<p>iTop est un portail opérationnel complet et libre pour gérer votre SI.</p>
<ul>il contient:
<li>Une base de gestion des configuration (CMDB - Configuration management database) pour documenter et gérer votre parc informatique.</li>
@@ -303,7 +195,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
<li>Des tableaux de bord pour avoir rapidement une vue synthétique de votre SI.</li>
</ul>
<p>Tous ces modules peuvent être installés séparément, à votre rythme.</p>',
'UI:WelcomeMenu:RightBlock' => '<p>iTop a été conçu pour les fournisseurs de service, il permet à vos équipes IT de gérer facilement de multiples clients et organisations.
<ul>iTop fournit un riche ensemble de processus métier&nbsp;pour:
<li>Augmenter l\'efficacité de la gestion de votre SI</li>
@@ -319,7 +210,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
<li>Contrôllez l\'actif le plus important de votre SI&nbsp;: la documentation.</li>
</ul>
</p>',
'UI:WelcomeMenu:AllOpenRequests' => 'Requêtes en cours: %1$d',
'UI:WelcomeMenu:MyCalls' => 'Mes Appels Support',
'UI:WelcomeMenu:OpenIncidents' => 'Incidents en cours: %1$d',
@@ -332,7 +222,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Button:Logoff' => 'Déconnexion',
'UI:Button:GlobalSearch' => 'Rechercher',
'UI:Button:Search' => 'Rechercher',
'UI:Button:Query' => ' Lancer la requête ',
'UI:Button:Ok' => 'Ok',
'UI:Button:Cancel' => 'Annuler',
@@ -356,13 +245,12 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Button:Delete' => ' Supprimer ! ',
'UI:Button:ChangePassword' => ' Changer ! ',
'UI:Button:ResetPassword' => ' Ràz du mot de passe ',
'UI:SearchToggle' => 'Recherche',
'UI:ClickToCreateNew' => 'Créer un nouvel objet de type %1$s',
'UI:SearchFor_Class' => 'Rechercher des objets de type %1$s',
'UI:NoObjectToDisplay' => 'Aucun objet à afficher.',
'UI:Error:MandatoryTemplateParameter_object_id' => 'Le paramètre object_id est obligatoire quand link_attr est spécifié. Vérifiez la définition du modèle.',
'UI:Error:MandatoryTemplateParameter_link_attr' => 'Le paramètre target_attr est obligatoire quand link_attr est spécifié. Vérifiez la définition du modèle.',
'UI:Error:MandatoryTemplateParameter_target_attr' => 'Le paramètre taarget_attr est obligatoire quand link_attr est spécifié. Vérifiez la définition du modèle.',
'UI:Error:MandatoryTemplateParameter_group_by' => 'Le paramètre group_by est obligatoire. Vérifiez la définition du modèle.',
'UI:Error:InvalidGroupByFields' => 'Liste des champs "group by" incorrecte: "%1$s".',
'UI:Error:UnsupportedStyleOfBlock' => 'Erreur: style de bloc("%1$s") inconnu.',
@@ -375,7 +263,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Error:CannotWriteToTmp_Dir' => 'Impossible d\'écrire le fichier temporaire sur disque. upload_tmp_dir = "%1$s".',
'UI:Error:UploadStoppedByExtension_FileName' => 'Téléchargement arrêté à cause de l\'extension. (Nom du fichier original = "%1$s").',
'UI:Error:UploadFailedUnknownCause_Code' => 'Le téléchargement a échoué pour une raison inconnue. (Code d\'erreur = "%1$s").',
'UI:Error:1ParametersMissing' => 'Erreur: Pour effectuer cette opération il manque le paramètre suivant: %1$s.',
'UI:Error:2ParametersMissing' => 'Erreur: Pour effectuer cette opération il manque les paramètres suivants: %1$s and %2$s.',
'UI:Error:3ParametersMissing' => 'Erreur: Pour effectuer cette opération il manque les paramètres suivants: %1$s, %2$s and %3$s.',
@@ -391,7 +278,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Error:ObjectAlreadyCloned' => 'Erreur: l\'objet a déjà été dupliqué !',
'UI:Error:ObjectAlreadyCreated' => 'Erreur: l\'objet a déjà été créé !',
'UI:Error:Invalid_Stimulus_On_Object_In_State' => 'Erreur: le stimulus "%1$s" n\'est pas valide pour l\'objet %2$s dans l\'état "%3$s".',
'UI:GroupBy:Count' => 'Nombre',
'UI:GroupBy:Count+' => 'Nombre d\'éléments',
'UI:CountOfObjects' => '%1$d objets correspondants aux critères.',
@@ -424,11 +310,10 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Menu:CSVExport' => 'Exporter en CSV',
'UI:Menu:Modify' => 'Modifier...',
'UI:Menu:Delete' => 'Supprimer...',
'UI:Menu:Manage' => 'Gérer...',
'UI:Menu:BulkDelete' => 'Supprimer...',
'UI:UndefinedObject' => 'non défini',
'UI:Document:OpenInNewWindow:Download' => 'Ouvrir dans un nouvelle fenêtre: %1$s, Télécharger: %2$s',
'UI:SelectAllToggle+' => 'Tout Sélectionner / Tout Désélectionner',
'UI:SelectAllToggle+' => 'Tout sélectionner / Tout déselectionner',
'UI:TruncatedResults' => '%1$d objets affichés sur %2$d',
'UI:DisplayAll' => 'Tout afficher',
'UI:CollapseList' => 'Refermer',
@@ -457,6 +342,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:LogOff:ThankYou' => 'Merci d\'avoir utilisé iTop',
'UI:LogOff:ClickHereToLoginAgain' => 'Cliquez ici pour vous reconnecter...',
'UI:ChangePwdMenu' => 'Changer de mot de passe...',
'UI:Login:PasswordChanged' => 'Mot de passe mis à jour !',
'UI:AccessRO-All' => 'iTop est en lecture seule',
'UI:AccessRO-Users' => 'iTop est en lecture seule pour les utilisateurs finaux',
'UI:Login:RetypePwdDoesNotMatch' => 'Les deux saisies du nouveau mot de passe ne sont pas identiques !',
@@ -507,35 +393,28 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:CSVImport:Tab:Templates' => 'Modèles',
'UI:CSVImport:PasteData' => 'Collez ici les données à importer:',
'UI:CSVImport:PickClassForTemplate' => 'Choisissez un modèle à télécharger: ',
'UI:CSVImport:SeparatorCharacter' => 'Caractère séparateur:',
'UI:CSVImport:TextQualifierCharacter' => 'Entourage des champs texte',
'UI:CSVImport:CommentsAndHeader' => 'En-tête et commentaires',
'UI:CSVImport:SeparatorCharacter' => 'Separator character:',
'UI:CSVImport:TextQualifierCharacter' => 'Text qualifier character',
'UI:CSVImport:CommentsAndHeader' => 'Comments and header',
'UI:CSVImport:SeparatorCharacter' => 'Séparateur:',
'UI:CSVImport:TextQualifierCharacter' => 'Délimiteur de texte',
'UI:CSVImport:CommentsAndHeader' => 'Commentaires et en-tête',
'UI:CSVImport:SelectClass' => 'Sélectionner le type d\'objets à importer:',
'UI:CSVImport:AdvancedMode' => 'Mode expert',
'UI:CSVImport:AdvancedMode+' => 'En mode expert, l\'"id" (clef primaire) des objets peut être utilisé pour renommer des objets.' .
'Cependant la colonne "id" (si elle est présente) ne peut être utilisée que comme clef de recherche et ne peut pas être combinée avec une autre clef de recherche.',
'UI:CSVImport:AdvancedMode+' => 'En mode expert, l\'"id" (clef primaire) des objets peut être utilisé pour renommer des objets.Cependant la colonne "id" (si elle est présente) ne peut être utilisée que comme clef de recherche et ne peut pas être combinée avec une autre clef de recherche.',
'UI:CSVImport:SelectAClassFirst' => 'Pour configurer la correspondance, choississez d\'abord un type ci-dessus.',
'UI:CSVImport:HeaderFields' => 'Champs',
'UI:CSVImport:HeaderMappings' => 'Correspondance',
'UI:CSVImport:HeaderSearch' => 'Recherche ?',
'UI:CSVImport:AlertIncompleteMapping' => 'Veuillez choisir le correspondance de chacun des champs.',
'UI:CSVImport:AlertNoSearchCriteria' => 'Veuillez choisir au moins une clef de recherche.',
'UI:CSVImport:Encoding' => 'Encodage des caractères',
'UI:CSVImport:Encoding' => 'Encodage des caractères',
'UI:UniversalSearchTitle' => 'iTop - Recherche Universelle',
'UI:UniversalSearch:Error' => 'Erreur : %1$s',
'UI:UniversalSearch:LabelSelectTheClass' => 'Sélectionnez le type d\'objets à rechercher : ',
'UI:Audit:Title' => 'iTop - Audit de la CMDB',
'UI:Audit:InteractiveAudit' => 'Audit Interactif',
'UI:Audit:HeaderAuditRule' => 'Règle d\'audit',
'UI:Audit:HeaderNbObjects' => 'Nb d\'Objets',
'UI:Audit:HeaderNbErrors' => 'Nb d\'Erreurs',
'UI:Audit:PercentageOk' => '% Ok',
'UI:RunQuery:Title' => 'iTop - Evaluation de requêtes OQL',
'UI:RunQuery:QueryExamples' => 'Exemples de requêtes',
'UI:RunQuery:HeaderPurpose' => 'Objectif',
@@ -547,7 +426,6 @@ 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:Schema:Title' => 'Modèle de données iTop',
'UI:Schema:CategoryMenuItem' => 'Catégorie <b>%1$s</b>',
'UI:Schema:Relationships' => 'Relations',
@@ -606,13 +484,11 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Schema:LifeCycleAttributeMustChange' => 'Doit changer',
'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:Combo:SelectValue' => '--- choisissez une valeur ---',
'UI:Label:SelectedObjects' => 'Objets sélectionnés: ',
'UI:Label:AvailableObjects' => 'Objets disponibles: ',
'UI:Link_Class_Attributes' => 'Attributs du type %1$s',
'UI:SelectAllToggle+' => 'Tout sélectionner / Tout déselectionner',
'UI:AddObjectsOf_Class_LinkedWith_Class_Instance' => 'Ajouter des objets de type %1$s liés à %3$s (%2$s)',
'UI:AddObjectsOf_Class_LinkedWith_Class' => 'Ajouter des objets de type %1$s à lier à cet objet de type %2$s',
'UI:ManageObjectsOf_Class_LinkedWith_Class_Instance' => 'Gérer les objets de type %1$s liés à %3$s (%2$s)',
@@ -620,15 +496,17 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:RemoveLinkedObjectsOf_Class' => 'Enlever les objets sélectionnés',
'UI:Message:EmptyList:UseAdd' => 'La liste est vide, utilisez le bouton "Ajouter..." pour ajouter des objets.',
'UI:Message:EmptyList:UseSearchForm' => 'Utilisez le formulaire de recherche ci-dessus pour trouver les objets à ajouter.',
'UI:Wizard:FinalStepTitle' => 'Dernière étape: confirmation',
'UI:Title:DeletionOf_Object' => 'Suppression de %1$s',
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'Suppression massive de %1$d objets de type %2$s',
'UI:Delete:NotAllowedToDelete' => 'Vous n\'êtes pas autorisé à supprimer cet objet',
'UI:Delete:NotAllowedToUpdate_Fields' => 'Vous n\'êtes pas autorisé à mettre à jour les champs suivants : %1$s',
'UI:Error:NotEnoughRightsToDelete' => 'Cet objet ne peut pas être supprimé car l\'utilisateur courant n\'a pas les droits nécessaires.',
'UI:Error:CannotDeleteBecause' => 'Cet objet ne peut pas être effacé. Raison: %1$s',
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Cet objet ne peut pas être supprimé, des opérations manuelles sont nécessaire avant sa suppression.',
'UI:Error:CannotDeleteBecauseManualOpNeeded' => 'Des opération manuelles sont nécessaires avant de pouvoir effacer cet objet',
'UI:Archive_User_OnBehalfOf_User' => '%1$s pour %2$s',
'UI:Delete:Deleted' => 'supprimé',
'UI:Delete:AutomaticallyDeleted' => 'supprimé automatiquement',
'UI:Delete:AutomaticResetOf_Fields' => 'mise à jour automatique des champ(s): %1$s',
'UI:Delete:CleaningUpRefencesTo_Object' => 'Suppression de toutes les références vers %1$s...',
@@ -637,14 +515,15 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Delete:_Name_Class_Deleted' => ' %2$s %1$s supprimé.',
'UI:Delete:ConfirmDeletionOf_Name' => 'Suppression de %1$s',
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Suppression de %1$d objets de type %2$s',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Devrait être supprimé automatiquement, mais vous n\'avez pas le droit d\'effectuer cette opération.',
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Doit être supprimé manuellement - mais vous n\'avez pas le droit de supprimer cet objet, contactez votre administrateur pour régler ce problème',
'UI:Delete:CannotDeleteBecause' => 'Ne peux pas être supprimé: %1$s',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Devrait être supprimé automatiquement, mais cela n\'est pas possible: %1$s',
'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Doit être supprimé manuellement, mais cela n\'est pas possible: %1$s',
'UI:Delete:WillBeDeletedAutomatically' => 'Sera supprimé automatiquement',
'UI:Delete:MustBeDeletedManually' => 'Doit être supprimé manuellement',
'UI:Delete:CannotUpdateBecause_Issue' => 'Devrait être mis à jour automatiquement, mais: %1$s',
'UI:Delete:WillAutomaticallyUpdate_Fields' => 'Va être mis à jour automatiquement (champs impactés : %1$s)',
'UI:Delete:Count_Objects/LinksReferencing_Object' => '%1$d objets ou liens font référence à %2$s',
'UI:Delete:Count_Objects/LinksReferencingTheObjects' => '%1$d objets ou liens font référence à certain des objets à supprimer',
'UI:Delete:Count_Objects/LinksReferencingTheObjects' => '%1$d objets ou liens font référence à certain des objets à supprimer',
'UI:Delete:ReferencesMustBeDeletedToEnsureIntegrity' => 'pour garantir l\'intégrité de la base de données, toutes les références doivent être supprimées.',
'UI:Delete:Consequence+' => 'Ce qui va être effectué',
'UI:Delete:SorryDeletionNotAllowed' => 'Désolé, vous n\'êtes pas autorisé à supprimer cette objet. Voir les explications détaillées ci-dessus.',
@@ -661,9 +540,9 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Search:Count_ObjectsOf_Class_Found' => 'Trouvé %1$d objet(s) de type %2$s.',
'UI:Search:NoObjectFound' => 'Aucun objet trouvé.',
'UI:ModificationPageTitle_Object_Class' => 'iTop - %2$s - Modification de %1$s',
'UI:ModificationTitle_Class_Object' => '%1$s - Modification de <span class=\"hilite\">%2$s</span>',
'UI:ModificationTitle_Class_Object' => '%1$s - Modification de <span class="hilite">%2$s</span>',
'UI:ClonePageTitle_Object_Class' => 'iTop - %2$s - Duplication de %1$s',
'UI:CloneTitle_Class_Object' => ' %1$s - Duplication de <span class=\"hilite\">%2$s</span>',
'UI:CloneTitle_Class_Object' => ' %1$s - Duplication de <span class="hilite">%2$s</span>',
'UI:CreationPageTitle_Class' => 'iTop - Création d\'un objet de type %1$s ',
'UI:CreationTitle_Class' => 'Création d\'un objet de type %1$s',
'UI:SelectTheTypeOf_Class_ToCreate' => 'Sélectionnez le type de %1$s à créer :',
@@ -676,11 +555,10 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => '%1$s pour %2$s de l\'état %3$s vers l\'état %4$s.',
'UI:ObjectCouldNotBeWritten' => 'L\'objet ne peut pas être enregistré: %1$s',
'UI:PageTitle:FatalError' => 'iTop - Erreur Fatale',
'UI:FatalErrorMessage' => 'Erreur fatale, iTop ne peut pas continuer.',
'UI:SystemIntrusion' => 'Accès non autorisé. Vous êtes en train de d\'effectuer une opération qui ne vous est pas permise.',
'UI:FatalErrorMessage' => 'Erreur fatale, iTop ne peut pas continuer.',
'UI:Error_Details' => 'Erreur: %1$s.',
'UI:PageTitle:ClassProjections' => 'iTop gestion des utilisateurs - projections des classes',
'UI:PageTitle:ClassProjections' => 'iTop gestion des utilisateurs - projections des classes',
'UI:PageTitle:ProfileProjections' => 'iTop gestion des utilisateurs - projections des profils',
'UI:UserManagement:Class' => 'Type',
'UI:UserManagement:Class+' => 'Type des objets',
@@ -717,16 +595,11 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:UserManagement:NoLifeCycleApplicable' => 'N/A',
'UI:UserManagement:NoLifeCycleApplicable+' => 'Aucun cycle de vie n\'est défini pour ce type d\'objets.',
'UI:UserManagement:GrantMatrix' => 'Matrice des droits',
'UI:USerManagement:LinkBetween_User_And_Profile' => 'Lien entre %1$s et %2$s',
'UI:USerManagement:LinkBetween_User_And_Org' => 'Lien entre %1$s et %2$s',
'UI:UserManagement:LinkBetween_User_And_Profile' => 'Lien entre %1$s et %2$s',
'UI:UserManagement:LinkBetween_User_And_Org' => 'Lien entre %1$s et %2$s',
'Menu:AdminTools' => 'Outils d\'admin',
'Menu:AdminTools+' => 'Outils d\'administration',
'Menu:AdminTools?' => 'Ces outils sont accessibles uniquement aux utilisateurs possédant le profil Administrateur.',
'UI:AuditMenu' => 'Audit',
'UI:AuditMenu+' => 'Audit',
'UI:ChangeManagementMenu' => 'Gestion du Changement',
'UI:ChangeManagementMenu+' => 'Gestion du Changement',
'UI:ChangeManagementMenu:Title' => 'Résumé des changements',
@@ -734,67 +607,48 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI-ChangeManagementMenu-ChangesByStatus' => 'Changements par état',
'UI-ChangeManagementMenu-ChangesByWorkgroup' => 'Changements par workgroup',
'UI-ChangeManagementMenu-ChangesNotYetAssigned' => 'Changements en attente d\'assignation',
'UI:ConfigurationItemsMenu'=> 'Actifs (CIs)',
'UI:ConfigurationItemsMenu+'=> 'Tous les actifs',
'UI:ConfigurationItemsMenu' => 'Actifs (CIs)',
'UI:ConfigurationItemsMenu+' => 'Tous les actifs',
'UI:ConfigurationItemsMenu:Title' => 'Résumé des actifs (CIs)',
'UI-ConfigurationItemsMenu-ServersByCriticity' => 'Serveurs par criticité',
'UI-ConfigurationItemsMenu-PCsByCriticity' => 'PCs par criticité',
'UI-ConfigurationItemsMenu-NWDevicesByCriticity' => 'Equipements réseau par criticité',
'UI-ConfigurationItemsMenu-ApplicationsByCriticity' => 'Applications par criticité',
'UI:ConfigurationManagementMenu' => 'Gestion de Configuration',
'UI:ConfigurationManagementMenu+' => 'Gestion de Configuration',
'UI:ConfigurationManagementMenu:Title' => 'Résumé de l\'Infrastructure',
'UI-ConfigurationManagementMenu-InfraByType' => 'Nombre d\'éléments par type',
'UI-ConfigurationManagementMenu-InfraByStatus' => 'Nombre d\'éléments par état',
'UI:ConfigMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion de Configuration',
'UI-ConfigMgmtMenuOverview-FunctionalCIbyStatus' => 'Actifs par état',
'UI-ConfigMgmtMenuOverview-FunctionalCIByType' => 'Actifs par type',
'UI:RequestMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Demandes Utilisateurs',
'UI-RequestManagementOverview-RequestByService' => 'Demandes par service',
'UI-RequestManagementOverview-RequestByPriority' => 'Demandes par priorité',
'UI-RequestManagementOverview-RequestUnassigned' => 'Demandes non affectées à un agent',
'UI:IncidentMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Incidents',
'UI-IncidentManagementOverview-IncidentByService' => 'Incidents par service',
'UI-IncidentManagementOverview-IncidentByPriority' => 'Incidents par priorité',
'UI-IncidentManagementOverview-IncidentUnassigned' => 'Incidents non affectés à un agent',
'UI:ChangeMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Changements',
'UI-ChangeManagementOverview-ChangeByType' => 'Changes par type',
'UI-ChangeManagementOverview-ChangeUnassigned' => 'Changes non affectés à un agent',
'UI-ChangeManagementOverview-ChangeWithOutage' => 'Interruptions de service liées à un changement',
'UI:ServiceMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Services',
'UI-ServiceManagementOverview-CustomerContractToRenew' => 'Contrats clients à renouveler dans les 30 jours',
'UI-ServiceManagementOverview-ProviderContractToRenew' => 'Contrats fournisseurs à renouveler dans les 30 jours',
'UI:ConfigMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion de Configuration',
'UI-ConfigMgmtMenuOverview-FunctionalCIbyStatus' => 'Actifs par état',
'UI-ConfigMgmtMenuOverview-FunctionalCIByType' => 'Actifs par type',
'UI:RequestMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Demandes Utilisateurs',
'UI-RequestManagementOverview-RequestByService' => 'Demandes par service',
'UI-RequestManagementOverview-RequestByPriority' => 'Demandes par priorité',
'UI-RequestManagementOverview-RequestUnassigned' => 'Demandes non affectées à un agent',
'UI:IncidentMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Incidents',
'UI-IncidentManagementOverview-IncidentByService' => 'Incidents par service',
'UI-IncidentManagementOverview-IncidentByPriority' => 'Incidents par priorité',
'UI-IncidentManagementOverview-IncidentUnassigned' => 'Incidents non affectés à un agent',
'UI:ChangeMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Changements',
'UI-ChangeManagementOverview-ChangeByType' => 'Changes par type',
'UI-ChangeManagementOverview-ChangeUnassigned' => 'Changes non affectés à un agent',
'UI-ChangeManagementOverview-ChangeWithOutage' => 'Interruptions de service liées à un changement',
'UI:ServiceMgmtMenuOverview:Title' => 'Tableau de bord de la Gestion des Services',
'UI-ServiceManagementOverview-CustomerContractToRenew' => 'Contrats clients à renouveler dans les 30 jours',
'UI-ServiceManagementOverview-ProviderContractToRenew' => 'Contrats fournisseurs à renouveler dans les 30 jours',
'UI:ContactsMenu' => 'Contacts',
'UI:ContactsMenu+' => 'Contacts',
'UI:ContactsMenu:Title' => 'Résumé des contacts',
'UI-ContactsMenu-ContactsByLocation' => 'Contacts par emplacement',
'UI-ContactsMenu-ContactsByType' => 'Contacts par type',
'UI-ContactsMenu-ContactsByStatus' => 'Contacts par état',
'Menu:CSVImportMenu' => 'Import CSV',
'Menu:CSVImportMenu+' => 'Import ou mise à jour en masse',
'Menu:DataModelMenu' => 'Modèle de Données',
'Menu:DataModelMenu+' => 'Résumé du Modèle de Données',
'Menu:ExportMenu' => 'Exportation',
'Menu:ExportMenu+' => 'Exportation des résultats d\'une requête en HTML, CSV ou XML',
'UI:IncidentManagementMenu:Title' => 'Résumé des incidents',
'UI-IncidentManagementMenu-IncidentsByType' => 'Incidents par type',
'UI-IncidentManagementMenu-IncidentsByStatus' => 'Incidents par état',
'UI-IncidentManagementMenu-IncidentsByWorkgroup' => 'Incidents par workgroup',
'UI-IncidentManagementMenu-IncidentsNotYetAssigned' => 'Incidents en attente d\'assignation',
'Menu:NotificationsMenu' => 'Notifications',
'Menu:NotificationsMenu+' => 'Configuration des Notifications',
'UI:NotificationsMenu:Title' => 'Configuration des <span class="hilite">Notifications</span>',
@@ -820,43 +674,36 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
'UI:NotificationsMenu:OnStateLeave' => 'Quand un objet quitte un état donné',
'UI:NotificationsMenu:Actions' => 'Actions',
'UI:NotificationsMenu:AvailableActions' => 'Actions existantes',
'Menu:AuditCategories' => 'Catégories d\'audit',
'Menu:AuditCategories+' => 'Catégories d\'audit',
'Menu:Notifications:Title' => 'Catégories d\'audit',
'Menu:RunQueriesMenu' => 'Requêtes OQL',
'Menu:RunQueriesMenu+' => 'Executer une requête OQL',
'Menu:DataAdministration' => 'Administration des données',
'Menu:DataAdministration+' => 'Administration des données',
'Menu:UniversalSearchMenu' => 'Recherche Universelle',
'Menu:UniversalSearchMenu+' => 'Rechercher n\'importe quel objet...',
'Menu:ApplicationLogMenu' => 'Application Log',
'Menu:ApplicationLogMenu+' => 'Application Log',
'Menu:ApplicationLogMenu:Title' => 'Application Log',
'Menu:UserManagementMenu' => 'Gestion des Utilisateurs',
'Menu:UserManagementMenu+' => 'Gestion des Utilisateurs',
'Menu:ProfilesMenu' => 'Profils',
'Menu:ProfilesMenu+' => 'Profils',
'Menu:ProfilesMenu:Title' => 'Profils',
'Menu:UserAccountsMenu' => 'Comptes Utilisateur',
'Menu:UserAccountsMenu+' => 'Comptes Utilisateur',
'MenuUI:UserAccountsMenu:Title' => 'Comptes Utilisateur',
'Menu:UserAccountsMenu' => 'Comptes Utilisateurs',
'Menu:UserAccountsMenu+' => 'Comptes Utilisateurs',
'Menu:UserAccountsMenu:Title' => 'Comptes Utilisateusr',
'UI:iTopVersion:Short' => 'iTop version %1$s',
'UI:iTopVersion:Long' => 'iTop version %1$s-%2$s du %3$s',
'UI:PropertiesTab' => 'Propriétés',
'UI:OpenDocumentInNewWindow_' => 'Ouvrir de document dans un autre fenêtre: %1$s',
'UI:DownloadDocument_' => 'Télécharger ce document: %1$s',
'UI:Document:NoPreview' => 'L\'aperçu n\'est pas disponible pour ce type de documents',
'UI:DeadlineMissedBy_duration' => 'Passé de %1$s',
'UI:Deadline_LessThan1Min' => '< 1 min',
'UI:Deadline_Minutes' => '%1$d min',
'UI:Deadline_Hours_Minutes' => '%1$dh %2$dmin',
'UI:Deadline_LessThan1Min' => '< 1 min',
'UI:Deadline_Minutes' => '%1$d min',
'UI:Deadline_Hours_Minutes' => '%1$dh %2$dmin',
'UI:Deadline_Days_Hours_Minutes' => '%1$dj %2$dh %3$dmin',
'UI:Help' => 'Aide',
'UI:PasswordConfirm' => '(Confirmer)',
@@ -865,7 +712,6 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
'UI:RelationshipGraph' => 'Vue graphique',
'UI:RelationshipList' => 'Liste',
'UI:OperationCancelled' => 'Opération Annulée',
'Portal:Title' => 'Portail utilisateur iTop',
'Portal:Refresh' => 'Rafraîchir',
'Portal:Back' => 'Retour',
@@ -873,11 +719,11 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
'Portal:ChangeMyPassword' => 'Changer mon mot de passe',
'Portal:Disconnect' => 'Déconnexion',
'Portal:OpenRequests' => 'Mes requêtes en cours',
'Portal:ResolvedRequests' => 'Mes requêtes résolues',
'Portal:ResolvedRequests' => 'Mes requêtes résolues',
'Portal:SelectService' => 'Choisissez un service dans le catalogue:',
'Portal:PleaseSelectOneService' => 'Veuillez choisir un service',
'Portal:SelectSubcategoryFrom_Service' => 'Choisissez une sous-catégorie du service %1$s:',
'Portal:PleaseSelectAServiceSubCategory' => 'Veuillez choisir une sous-catégorie',
'Portal:PleaseSelectAServiceSubCategory' => 'Veuillez choisir une sous-catégorie',
'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.',
@@ -888,8 +734,36 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
'Portal:AddAttachment' => ' Ajouter une pièce jointe ',
'Portal:RemoveAttachment' => ' Enlever la pièce jointe ',
'Portal:Attachment_No_To_Ticket_Name' => 'Pièce jointe #%1$d à %2$s (%3$s)',
'Enum:Undefined' => 'Non défini',
'UI:DurationForm_Days_Hours_Minutes_Seconds' => '%1$s J %2$s H %3$s min %4$s s',
'UI:ModifyAllPageTitle' => 'Modification par lots',
'UI:Modify_N_ObjectsOf_Class' => 'Modification de %1$d objet(s) de type %2$s',
'UI:Modify_M_ObjectsOf_Class_OutOf_N' => 'Modification de %1$d (sur %3$d) objets de type %2$s',
'UI:Menu:ModifyAll' => 'Modifier...',
'UI:Button:ModifyAll' => 'Modifier',
'UI:Button:PreviewModifications' => 'Aperçu des modifications >>',
'UI:ModifiedObject' => 'Objet Modifié',
'UI:BulkModifyStatus' => 'Opération',
'UI:BulkModifyStatus+' => '',
'UI:BulkModifyErrors' => 'Erreur',
'UI:BulkModifyErrors+' => '',
'UI:BulkModifyStatusOk' => 'Ok',
'UI:BulkModifyStatusError' => 'Erreur',
'UI:BulkModifyStatusModified' => 'Modifié',
'UI:BulkModifyStatusSkipped' => 'Ignoré',
'UI:BulkModify_Count_DistinctValues' => '%1$d valeurs distinctes:',
'UI:BulkModify:Value_Exists_N_Times' => '%1$s, %2$d fois',
'UI:BulkModify:N_MoreValues' => '%1$d valeurs supplémentaires...',
'UI:AttemptingToSetAReadOnlyAttribute_Name' => 'Tentative de modification du champ en lecture seule: %1$s',
'UI:FailedToApplyStimuli' => 'L\'action a échoué',
'UI:StimulusModify_N_ObjectsOf_Class' => '%1$s: Modification de %2$d objet(s) de type %3$s',
'UI:CaseLogTypeYourTextHere' => 'Nouvelle entrée ci-dessous:',
'UI:CaseLog:DateFormat' => 'Y-m-d H:i:s',
'UI:CaseLog:Header_Date_UserName' => '%1$s - %2$s:',
'UI:CaseLog:InitialValue' => 'Valeur initiale:',
'UI:AttemptingToSetASlaveAttribute_Name' => 'Le champ %1$s ne peut pas être modifié car il est géré par une synchronisation avec une source de données. Valeur ignorée.',
'UI:ActionNotAllowed' => 'Vous n\'êtes pas autorisé à exécuter cette opération sur ces objets.',
'UI:BulkAction:NoObjectSelected' => 'Veuillez s\électionner au moins un objet pour cette opération.',
'UI:AttemptingToChangeASlaveAttribute_Name' => 'Le champ %1$s ne peut pas être modifié car il est géré par une synchronisation avec une source de données. Valeur inchangée.',
));
?>

View File

@@ -0,0 +1,481 @@
<?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
/**
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Class:ActionEmail' => 'E-mail értesítés',
'Class:ActionEmail+' => '',
'Class:ActionEmail/Attribute:test_recipient' => 'Teszt címzett',
'Class:ActionEmail/Attribute:test_recipient+' => '',
'Class:ActionEmail/Attribute:from' => 'Feladó',
'Class:ActionEmail/Attribute:from+' => '',
'Class:ActionEmail/Attribute:reply_to' => 'Válasz',
'Class:ActionEmail/Attribute:reply_to+' => '',
'Class:ActionEmail/Attribute:to' => 'Címzett',
'Class:ActionEmail/Attribute:to+' => '',
'Class:ActionEmail/Attribute:cc' => 'Másolatot kap',
'Class:ActionEmail/Attribute:cc+' => '',
'Class:ActionEmail/Attribute:bcc' => 'Titkos másolatot kap',
'Class:ActionEmail/Attribute:bcc+' => '',
'Class:ActionEmail/Attribute:subject' => 'Tárgy',
'Class:ActionEmail/Attribute:subject+' => '',
'Class:ActionEmail/Attribute:body' => 'Szöveg',
'Class:ActionEmail/Attribute:body+' => '',
'Class:ActionEmail/Attribute:importance' => 'Fontosság',
'Class:ActionEmail/Attribute:importance+' => '',
'Class:ActionEmail/Attribute:importance/Value:high' => 'Fontos',
'Class:ActionEmail/Attribute:importance/Value:high+' => '',
'Class:ActionEmail/Attribute:importance/Value:low' => 'Nem fontos',
'Class:ActionEmail/Attribute:importance/Value:low+' => '',
'Class:ActionEmail/Attribute:importance/Value:normal' => 'Normál',
'Class:ActionEmail/Attribute:importance/Value:normal+' => '',
'Class:TriggerOnStateEnter' => 'Kiváltó ok (állapotba belépés)',
'Class:TriggerOnStateEnter+' => '',
'Class:TriggerOnStateLeave' => 'Kiváltó ok (állapot elhagyás)',
'Class:TriggerOnStateLeave+' => '',
'Class:TriggerOnObjectCreate' => 'Kiváltó ok (objektum létrehozás)',
'Class:TriggerOnObjectCreate+' => '',
'Class:lnkTriggerAction' => 'Akció / Kiváltó ok',
'Class:lnkTriggerAction+' => '',
'Class:lnkTriggerAction/Attribute:action_id' => 'Akció',
'Class:lnkTriggerAction/Attribute:action_id+' => '',
'Class:lnkTriggerAction/Attribute:trigger_id' => 'Kiváltó ok',
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
'Class:lnkTriggerAction/Attribute:order' => 'Sorrend',
'Class:lnkTriggerAction/Attribute:order+' => '',
'Class:AsyncSendEmail' => 'E-mail (aszinkron)',
'Class:AsyncSendEmail/Attribute:to' => 'Címzett',
'Class:AsyncSendEmail/Attribute:subject' => 'Tárgy',
'Class:AsyncSendEmail/Attribute:body' => 'Szöveg',
'Class:AsyncSendEmail/Attribute:header' => 'Fejléc',
'Class:CMDBChange' => 'Változás',
'Class:CMDBChange+' => '',
'Class:CMDBChange/Attribute:date' => 'Dátum',
'Class:CMDBChange/Attribute:date+' => '',
'Class:CMDBChange/Attribute:userinfo' => 'Egyéb információ',
'Class:CMDBChange/Attribute:userinfo+' => '',
'Class:CMDBChangeOp' => 'Változtatás művelet',
'Class:CMDBChangeOp+' => '',
'Class:CMDBChangeOp/Attribute:change' => 'Válktozás',
'Class:CMDBChangeOp/Attribute:change+' => '',
'Class:CMDBChangeOp/Attribute:objclass' => 'Objektum osztály',
'Class:CMDBChangeOp/Attribute:objclass+' => '',
'Class:CMDBChangeOp/Attribute:objkey' => 'Objektum azonosító',
'Class:CMDBChangeOp/Attribute:objkey+' => '',
'Class:CMDBChangeOp/Attribute:finalclass' => 'Típus',
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
'Class:CMDBChangeOpCreate' => 'Objektum létrehozás',
'Class:CMDBChangeOpCreate+' => '',
'Class:CMDBChangeOpDelete' => 'Objektum törlés',
'Class:CMDBChangeOpDelete+' => '',
'Class:CMDBChangeOpSetAttribute' => 'Objektum változtatás',
'Class:CMDBChangeOpSetAttribute+' => '',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => 'Attribútum',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => '',
'Class:CMDBChangeOpSetAttributeScalar' => 'Tulajdonság változtatás',
'Class:CMDBChangeOpSetAttributeScalar+' => '',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'Előző érték',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => '',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'Új érték',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => '',
'Class:CMDBChangeOpSetAttributeBlob' => 'Módosítás dátuma',
'Class:CMDBChangeOpSetAttributeBlob+' => '',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'Előző adat',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => '',
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Titkosított jelszó',
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Előző érték',
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Titkosított mező',
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Előző érték',
'Class:CMDBChangeOpSetAttributeText' => 'Szöveg változás',
'Class:CMDBChangeOpSetAttributeText+' => '',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Előző adat',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => '',
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Esemény napló',
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Utolsó bejegyzés',
'Class:Event' => 'Napló esemény',
'Class:Event+' => '',
'Class:Event/Attribute:message' => 'Üzenet',
'Class:Event/Attribute:message+' => '',
'Class:Event/Attribute:date' => 'Dátum',
'Class:Event/Attribute:date+' => '',
'Class:Event/Attribute:userinfo' => 'Felhasználói információ',
'Class:Event/Attribute:userinfo+' => '',
'Class:Event/Attribute:finalclass' => 'Típus',
'Class:Event/Attribute:finalclass+' => '',
'Class:EventNotification' => 'Értesítés esemény',
'Class:EventNotification+' => '',
'Class:EventNotification/Attribute:trigger_id' => 'Kiváltó ok',
'Class:EventNotification/Attribute:trigger_id+' => '',
'Class:EventNotification/Attribute:action_id' => 'Felhasználó',
'Class:EventNotification/Attribute:action_id+' => '',
'Class:EventNotification/Attribute:object_id' => 'Objektum azonosító',
'Class:EventNotification/Attribute:object_id+' => '',
'Class:EventNotificationEmail' => 'E-mail küldés esemény',
'Class:EventNotificationEmail+' => '',
'Class:EventNotificationEmail/Attribute:to' => 'Címzett',
'Class:EventNotificationEmail/Attribute:to+' => '',
'Class:EventNotificationEmail/Attribute:cc' => 'Másolatot kap',
'Class:EventNotificationEmail/Attribute:cc+' => '',
'Class:EventNotificationEmail/Attribute:bcc' => 'Titkos másolatot kap',
'Class:EventNotificationEmail/Attribute:bcc+' => '',
'Class:EventNotificationEmail/Attribute:from' => 'Feladó',
'Class:EventNotificationEmail/Attribute:from+' => '',
'Class:EventNotificationEmail/Attribute:subject' => 'Tárgy',
'Class:EventNotificationEmail/Attribute:subject+' => '',
'Class:EventNotificationEmail/Attribute:body' => 'Szöveg',
'Class:EventNotificationEmail/Attribute:body+' => '',
'Class:EventIssue' => 'Kérés esemény',
'Class:EventIssue+' => '',
'Class:EventIssue/Attribute:issue' => 'Kérés',
'Class:EventIssue/Attribute:issue+' => '',
'Class:EventIssue/Attribute:impact' => 'Hatás',
'Class:EventIssue/Attribute:impact+' => '',
'Class:EventIssue/Attribute:page' => 'Oldal',
'Class:EventIssue/Attribute:page+' => '',
'Class:EventIssue/Attribute:arguments_post' => 'Kérés részletei',
'Class:EventIssue/Attribute:arguments_post+' => '',
'Class:EventIssue/Attribute:arguments_get' => 'URL ',
'Class:EventIssue/Attribute:arguments_get+' => '',
'Class:EventIssue/Attribute:callstack' => 'Híváslista',
'Class:EventIssue/Attribute:callstack+' => '',
'Class:EventIssue/Attribute:data' => 'Dátum',
'Class:EventIssue/Attribute:data+' => '',
'Class:EventWebService' => 'Web szolgáltatás esemény',
'Class:EventWebService+' => '',
'Class:EventWebService/Attribute:verb' => 'Kérés',
'Class:EventWebService/Attribute:verb+' => '',
'Class:EventWebService/Attribute:result' => 'Eredmény',
'Class:EventWebService/Attribute:result+' => '',
'Class:EventWebService/Attribute:log_info' => 'Info napló',
'Class:EventWebService/Attribute:log_info+' => '',
'Class:EventWebService/Attribute:log_warning' => 'Warning napló',
'Class:EventWebService/Attribute:log_warning+' => '',
'Class:EventWebService/Attribute:log_error' => 'Error napló',
'Class:EventWebService/Attribute:log_error+' => '',
'Class:EventWebService/Attribute:data' => 'Adat',
'Class:EventWebService/Attribute:data+' => '',
'Class:EventLoginUsage' => 'Belépés esemény',
'Class:EventLoginUsage+' => '',
'Class:EventLoginUsage/Attribute:user_id' => 'Felhasználó név',
'Class:EventLoginUsage/Attribute:user_id+' => '',
'Class:SynchroDataSource' => 'Szinkron adatforrás',
'Class:SynchroDataSource/Attribute:name' => 'Neve',
'Class:SynchroDataSource/Attribute:name+' => '',
'Class:SynchroDataSource/Attribute:description' => 'Leírás',
'Class:SynchroDataSource/Attribute:status' => 'Státusz',
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Megvalósított',
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Elavult',
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Éles üzemben',
'Class:SynchroDataSource/Attribute:user_id' => 'Felhasználó',
'Class:SynchroDataSource/Attribute:scope_class' => 'Cél osztály',
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Tartalom szűkítés',
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Teljesen feltöltött intervallum',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => '',
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Egyeztetési szabály',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'A következő attribútum használata',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Elsődleges kulcs használata',
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Action on zero',
'Class:SynchroDataSource/Attribute:action_on_zero+' => '',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Létrehozás',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Hiba',
'Class:SynchroDataSource/Attribute:action_on_one' => 'Action on one',
'Class:SynchroDataSource/Attribute:action_on_one+' => '',
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Hiba',
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Firssítés',
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Action on many',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => '',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Létrehozás',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Hiba',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Take the first one (véletlen?)',
'Class:SynchroDataSource/Attribute:delete_policy' => 'Törlési szabály',
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Törlés',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Figyelmen kívül hagyás',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Frissítés',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Frissítés után törlés',
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Szabályok frissítése',
'Class:SynchroDataSource/Attribute:delete_policy_update+' => '',
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Késleltetés időtartama',
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => '',
'Class:SynchroDataSource/Attribute:attribute_list' => 'Attribútum lista',
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'Engedélyezett felhasználók',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => '',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Csak rendszergazdák',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Mindenkinek engedélyezett az objektumok törlése',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Senki',
'Class:SynchroDataSource/Attribute:url_icon' => 'Ikonok URL-je',
'Class:SynchroDataSource/Attribute:url_icon+' => '',
'Class:SynchroDataSource/Attribute:url_application' => 'Alkalmazások URL-je',
'Class:SynchroDataSource/Attribute:url_application+' => '',
'Class:SynchroAttribute' => 'Szinkron attribútumok',
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Szinkron adatforrás',
'Class:SynchroAttribute/Attribute:attcode' => 'Kód',
'Class:SynchroAttribute/Attribute:update' => 'Frissítés',
'Class:SynchroAttribute/Attribute:reconcile' => 'Egyeztetés',
'Class:SynchroAttribute/Attribute:update_policy' => 'Frissítési irányelv',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'Locked',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'Unlocked',
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Inicializálás ha üres',
'Class:SynchroAttribute/Attribute:finalclass' => 'Osztály',
'Class:SynchroAttExtKey' => 'Szinkron attribútum (ExtKey)',
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Egyeztetés attribútuma',
'Class:SynchroAttLinkSet' => 'Szinkron attribútum (Linkset)',
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Sor elválasztó',
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Attribútum elválasztó',
'Class:SynchroLog' => 'Szinkron napló',
'Class:SynchroLog/Attribute:sync_source_id' => 'Szinkron adatforrás',
'Class:SynchroLog/Attribute:start_date' => 'Kezdés dátuma',
'Class:SynchroLog/Attribute:end_date' => 'Befejezés dátuma',
'Class:SynchroLog/Attribute:status' => 'Státusz',
'Class:SynchroLog/Attribute:status/Value:completed' => 'Hibátlanul lefutott',
'Class:SynchroLog/Attribute:status/Value:error' => 'Hibás',
'Class:SynchroLog/Attribute:status/Value:running' => 'Még fut',
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nb replikáció létrejött',
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nb replikáció összesen',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nb objektumok törölve',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nb hibái törlés közben',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nb objketumok elavultak',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nb hibák elavulás közben',
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nb objketumok létrehozva',
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nb hibák létrehozás közben',
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nb objektum frissítve',
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nb hibák firssítés közben',
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nb hibák rekonsziliálás közben',
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nb replikáció eltűnt',
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nb objketumok frissítve',
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nb objketumok változatlanok',
'Class:SynchroLog/Attribute:last_error' => 'Utolsó hiba',
'Class:SynchroLog/Attribute:traces' => 'Trace',
'Class:SynchroReplica' => 'Szinkron másolat',
'Class:SynchroReplica/Attribute:sync_source_id' => 'Szinkron adatforrás',
'Class:SynchroReplica/Attribute:dest_id' => 'Cél objektum azonosító',
'Class:SynchroReplica/Attribute:dest_class' => 'Cél típusa',
'Class:SynchroReplica/Attribute:status_last_seen' => 'Utolsó megtekintett',
'Class:SynchroReplica/Attribute:status' => 'Státusz',
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Módosított',
'Class:SynchroReplica/Attribute:status/Value:new' => 'Új',
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Elavult',
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Árva',
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Szinkronizált',
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Objektum létrehozott?',
'Class:SynchroReplica/Attribute:status_last_error' => 'Utolsó hiba',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Létrehozás dátuma',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Utolsó módosítás dátuma',
'Class:appUserPreferences' => 'Felhasználói beállítások',
'Class:appUserPreferences/Attribute:userid' => 'Felhasználó',
'Class:appUserPreferences/Attribute:preferences' => 'Beállítások',
'Core:AttributeLinkedSet' => 'Objektum tömbök',
'Core:AttributeLinkedSet+' => '',
'Core:AttributeLinkedSetIndirect' => 'Objektum tömbök (N-N)',
'Core:AttributeLinkedSetIndirect+' => '',
'Core:AttributeInteger' => 'Integer',
'Core:AttributeInteger+' => '',
'Core:AttributeDecimal' => 'Decimal',
'Core:AttributeDecimal+' => '',
'Core:AttributeBoolean' => 'Boolean',
'Core:AttributeBoolean+' => '',
'Core:AttributeString' => 'String',
'Core:AttributeString+' => '',
'Core:AttributeClass' => 'Class',
'Core:AttributeClass+' => '',
'Core:AttributeApplicationLanguage' => 'Alkalmazás nyelve',
'Core:AttributeApplicationLanguage+' => '',
'Core:AttributeFinalClass' => 'Class (auto)',
'Core:AttributeFinalClass+' => '',
'Core:AttributePassword' => 'Jelszó',
'Core:AttributePassword+' => '',
'Core:AttributeEncryptedString' => 'Encrypted string',
'Core:AttributeEncryptedString+' => '',
'Core:AttributeText' => 'Text',
'Core:AttributeText+' => '',
'Core:AttributeHTML' => 'HTML',
'Core:AttributeHTML+' => '',
'Core:AttributeEmailAddress' => 'E-mail cím',
'Core:AttributeEmailAddress+' => '',
'Core:AttributeIPAddress' => 'IP cím',
'Core:AttributeIPAddress+' => '',
'Core:AttributeOQL' => 'OQL',
'Core:AttributeOQL+' => '',
'Core:AttributeEnum' => 'Enum',
'Core:AttributeEnum+' => '',
'Core:AttributeTemplateString' => 'Sablon szöveg',
'Core:AttributeTemplateString+' => '',
'Core:AttributeTemplateText' => 'Sablon szöveg',
'Core:AttributeTemplateText+' => '',
'Core:AttributeTemplateHTML' => 'Sablon HTML',
'Core:AttributeTemplateHTML+' => '',
'Core:AttributeDateTime' => 'Date/time',
'Core:AttributeDateTime+' => '',
'Core:AttributeDate' => 'Date',
'Core:AttributeDate+' => '',
'Core:AttributeDeadline' => 'Határidő',
'Core:AttributeDeadline+' => '',
'Core:AttributeExternalKey' => 'Külső kulcs',
'Core:AttributeExternalKey+' => '',
'Core:AttributeExternalField' => 'Külső mező',
'Core:AttributeExternalField+' => '',
'Core:AttributeURL' => 'URL',
'Core:AttributeURL+' => '',
'Core:AttributeBlob' => 'Blob',
'Core:AttributeBlob+' => '',
'Core:AttributeOneWayPassword' => 'One way password',
'Core:AttributeOneWayPassword+' => '',
'Core:AttributeTable' => 'Table',
'Core:AttributeTable+' => '',
'Core:AttributePropertySet' => 'Tulajdonságok',
'Core:AttributePropertySet+' => '',
'Class:CMDBChangeOp/Attribute:date' => 'Dátum',
'Class:CMDBChangeOp/Attribute:date+' => '',
'Class:CMDBChangeOp/Attribute:userinfo' => 'Felhasználó',
'Class:CMDBChangeOp/Attribute:userinfo+' => '',
'Change:ObjectCreated' => 'Objektum létrehozva',
'Change:ObjectDeleted' => 'Objektum törölve',
'Change:ObjectModified' => 'Objektum módosítva',
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s új értéke: %2$s (előző értéke: %3$s)',
'Change:AttName_SetTo' => '%1$s új értéke %2$s',
'Change:Text_AppendedTo_AttName' => '%1$s hozzáfűzve %2$s',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s módosítva, előző érték: %2$s',
'Change:AttName_Changed' => '%1$s módosítva',
'Change:AttName_EntryAdded' => '%1$s módosítva, új bejegyzés hozzáadva.',
'Class:EventLoginUsage/Attribute:contact_name' => 'Felhasználó neve',
'Class:EventLoginUsage/Attribute:contact_name+' => '',
'Class:EventLoginUsage/Attribute:contact_email' => 'Felhasználó e-mail',
'Class:EventLoginUsage/Attribute:contact_email+' => '',
'Class:Action' => 'Egyedi akciók',
'Class:Action+' => '',
'Class:Action/Attribute:name' => 'Neve',
'Class:Action/Attribute:name+' => '',
'Class:Action/Attribute:description' => 'Leírás',
'Class:Action/Attribute:description+' => '',
'Class:Action/Attribute:status' => 'Státusz',
'Class:Action/Attribute:status+' => '',
'Class:Action/Attribute:status/Value:test' => 'Tesztelés alatt',
'Class:Action/Attribute:status/Value:test+' => '',
'Class:Action/Attribute:status/Value:enabled' => 'Éles üzemeben',
'Class:Action/Attribute:status/Value:enabled+' => '',
'Class:Action/Attribute:status/Value:disabled' => 'Inaktív',
'Class:Action/Attribute:status/Value:disabled+' => '',
'Class:Action/Attribute:trigger_list' => 'Kapcsolódó kiváltó okok',
'Class:Action/Attribute:trigger_list+' => '',
'Class:Action/Attribute:finalclass' => 'Típus',
'Class:Action/Attribute:finalclass+' => '',
'Class:ActionNotification' => 'Értesítés',
'Class:ActionNotification+' => '',
'Class:Trigger' => 'Kiváltó ok',
'Class:Trigger+' => '',
'Class:Trigger/Attribute:description' => 'Leírás',
'Class:Trigger/Attribute:description+' => '',
'Class:Trigger/Attribute:action_list' => 'Kiváltott akció',
'Class:Trigger/Attribute:action_list+' => '',
'Class:Trigger/Attribute:finalclass' => 'Típus',
'Class:Trigger/Attribute:finalclass+' => '',
'Class:TriggerOnObject' => 'Kiváltó ok (osztály függő)',
'Class:TriggerOnObject+' => '',
'Class:TriggerOnObject/Attribute:target_class' => 'Cél osztály',
'Class:TriggerOnObject/Attribute:target_class+' => '',
'Class:TriggerOnStateChange' => 'Kiváltó ok (állapot változás)',
'Class:TriggerOnStateChange+' => '',
'Class:TriggerOnStateChange/Attribute:state' => 'Állapot',
'Class:TriggerOnStateChange/Attribute:state+' => '',
'Class:lnkTriggerAction/Attribute:action_name' => 'Akció',
'Class:lnkTriggerAction/Attribute:action_name+' => '',
'Class:lnkTriggerAction/Attribute:trigger_name' => 'Kiváltó ok',
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Senki',
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Csak adminisztrátorok',
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'Tíltott felhasználók',
'SynchroDataSource:Description' => 'Leírás',
'SynchroDataSource:Reconciliation' => 'Keresés &amp; rekponsziliálás',
'SynchroDataSource:Deletion' => 'Törlés szabályai',
'SynchroDataSource:Status' => 'Státusz',
'SynchroDataSource:Information' => 'Információ',
'SynchroDataSource:Definition' => 'Meghatározás',
'Core:SynchroAttributes' => 'Attribútumok',
'Core:SynchroStatus' => 'Státusz',
'Core:Synchro:ErrorsLabel' => 'Hibák',
'Core:Synchro:CreatedLabel' => 'Létrehozva',
'Core:Synchro:ModifiedLabel' => 'Módosítva',
'Core:Synchro:UnchangedLabel' => 'Változatlan',
'Core:Synchro:ReconciledErrorsLabel' => 'Hibák',
'Core:Synchro:ReconciledLabel' => 'Rekonsziliált',
'Core:Synchro:ReconciledNewLabel' => 'Létrehozva',
'Core:SynchroReconcile:Yes' => 'Igen',
'Core:SynchroReconcile:No' => 'Nem',
'Core:SynchroUpdate:Yes' => 'Igen',
'Core:SynchroUpdate:No' => 'Nem',
'Core:Synchro:LastestStatus' => 'Utolsó státusz',
'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.',
'Menu:DataSources' => 'Szinkronizált adatforrások',
'Menu:DataSources+' => '',
'Core:Synchro:label_repl_ignored' => 'Figyelmen kívül hagyott (%1$s)',
'Core:Synchro:label_repl_disappeared' => 'Elveszett (%1$s)',
'Core:Synchro:label_repl_existing' => 'Létező (%1$s)',
'Core:Synchro:label_repl_new' => 'Új (%1$s)',
'Core:Synchro:label_obj_deleted' => 'Törölt (%1$s)',
'Core:Synchro:label_obj_obsoleted' => 'Elavult (%1$s)',
'Core:Synchro:label_obj_disappeared_errors' => 'Hibák (%1$s)',
'Core:Synchro:label_obj_disappeared_no_action' => 'Beavatkozás nem szükséges (%1$s)',
'Core:Synchro:label_obj_unchanged' => 'Változatan (%1$s)',
'Core:Synchro:label_obj_updated' => 'Frisített (%1$s)',
'Core:Synchro:label_obj_updated_errors' => 'Hibák (%1$s)',
'Core:Synchro:label_obj_new_unchanged' => 'Változatlan (%1$s)',
'Core:Synchro:label_obj_new_updated' => 'Frissített (%1$s)',
'Core:Synchro:label_obj_created' => 'Létrehozott (%1$s)',
'Core:Synchro:label_obj_new_errors' => 'Hibák (%1$s)',
'Core:SynchroLogTitle' => '%1$s - %2$s',
'Core:Synchro:Nb_Replica' => 'Másolat elkészítve: %1$s',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Egyeztetéshez legalább egy kulcsot meg kell adni, egyébként az egyeztetés az elsődleges kulcs alapján történik.',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'A törlés késleltetésének időtartamát meg kell adni, egyébként az objektum törölve lesz annak elavulttá minősítése után.',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Lejárt objektumok frissítése nem tud megtörténni.',
'Core:SynchroReplica:PublicData' => 'Publikus adatok',
'Core:SynchroReplica:PrivateDetails' => 'Privát adatok',
'Core:SynchroReplica:BackToDataSource' => 'Vissza a következő szinkron adatforráshoz: %1$s',
'Core:SynchroReplica:ListOfReplicas' => 'Másolatok listája',
'Core:SynchroAttExtKey:ReconciliationById' => 'Azonosító (Elsődleges kulcs)',
'Core:SynchroAtt:attcode' => 'Attribútum',
'Core:SynchroAtt:attcode+' => '',
'Core:SynchroAtt:reconciliation' => 'Egyeztetés?',
'Core:SynchroAtt:reconciliation+' => '',
'Core:SynchroAtt:update' => 'Frissített?',
'Core:SynchroAtt:update+' => '',
'Core:SynchroAtt:update_policy' => 'Frissítési szabály',
'Core:SynchroAtt:update_policy+' => '',
'Core:SynchroAtt:reconciliation_attcode' => 'Egyeztetés kulcsa',
'Core:SynchroAtt:reconciliation_attcode+' => '',
'Core:SyncDataExchangeComment' => '(DataExchange)',
'Core:Synchro:ListOfDataSources' => 'Adatforrások listája',
'Core:Synchro:LastSynchro' => 'Utolsó szimkronizáció',
'Core:Synchro:ThisObjectIsSynchronized' => 'Az objektum szinkronizálva a külső adatforrással.',
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'Objektum <b>létrehozva</b> a következő adatforrásban: %1$s',
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'Objektum <b>törölhető</b> a következő külső adatforrásból: %1$s',
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => '<b>Objektum nem törölhető</b> mert egy másik adatforrás (%1$s) tulajdona',
'TitleSynchroExecution' => 'Szinkronizáció végrehajtás',
'Class:SynchroDataSource:DataTable' => 'Adatbázis tábla: %1$s',
'Core:SyncDataSourceObsolete' => 'Az adatforrás elvalultnak van jelölve. Művelet visszavonva.',
'Core:SyncDataSourceAccessRestriction' => 'Csak az adminisztrátor vagy speciális jogokkal rendelkező felhasználó futtathatja a műveletet. Művelet visszavonva.',
'Core:SyncTooManyMissingReplicas' => 'Import során az összes másolat elveszett. Az import valóban lefutott? Művelet visszavonva.',
'Core:Duration_Seconds' => '%1$sds',
'Core:Duration_Minutes_Seconds' => '%1$sdmin %2$sds',
'Core:Duration_Hours_Minutes_Seconds' => '%1$sdh %2$sdmin %3$sds',
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sd %2$sdh %3$sdmin %4$ds',
));
?>

View File

@@ -0,0 +1,768 @@
<?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
/**
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Class:AuditRule' => 'Auditálási szabály',
'Class:AuditRule+' => '',
'Class:AuditRule/Attribute:name' => 'Szabály neve',
'Class:AuditRule/Attribute:name+' => '',
'Class:AuditRule/Attribute:description' => 'Auditálási szabály leírása',
'Class:AuditRule/Attribute:description+' => '',
'Class:AuditRule/Attribute:query' => 'Futtatandó lekérdezés',
'Class:AuditRule/Attribute:query+' => '',
'Class:AuditRule/Attribute:valid_flag' => 'Érvényes objektum?',
'Class:AuditRule/Attribute:valid_flag+' => '',
'Class:AuditRule/Attribute:valid_flag/Value:false' => 'hamis',
'Class:AuditRule/Attribute:valid_flag/Value:false+' => '',
'Class:AuditRule/Attribute:valid_flag/Value:true' => 'igaz',
'Class:AuditRule/Attribute:valid_flag/Value:true+' => '',
'Class:AuditRule/Attribute:category_id' => 'Kategória',
'Class:AuditRule/Attribute:category_id+' => '',
'Class:AuditCategory' => 'Audit kategória',
'Class:AuditCategory+' => '',
'Class:AuditCategory/Attribute:name' => 'Kategória neve',
'Class:AuditCategory/Attribute:name+' => '',
'Class:AuditCategory/Attribute:description' => 'Audit kategória leírása',
'Class:AuditCategory/Attribute:description+' => '',
'Class:AuditCategory/Attribute:definition_set' => 'Meghatározás halmaz',
'Class:AuditCategory/Attribute:definition_set+' => '',
'Class:AuditCategory/Attribute:rules_list' => 'Audit szabályok',
'Class:AuditCategory/Attribute:rules_list+' => '',
'Class:URP_Profiles' => 'Profil',
'Class:URP_Profiles+' => '',
'Class:URP_Profiles/Attribute:name' => 'Neve',
'Class:URP_Profiles/Attribute:name+' => '',
'Class:URP_Profiles/Attribute:description' => 'Leírás',
'Class:URP_Profiles/Attribute:description+' => '',
'Class:URP_Profiles/Attribute:user_list' => 'Felhasználók',
'Class:URP_Profiles/Attribute:user_list+' => '',
'Class:URP_UserProfile' => 'Profilhoz rendelt felhasználók',
'Class:URP_UserProfile+' => '',
'Class:URP_UserProfile/Attribute:userid' => 'Felhasználó',
'Class:URP_UserProfile/Attribute:userid+' => '',
'Class:URP_UserProfile/Attribute:profileid' => 'Profil',
'Class:URP_UserProfile/Attribute:profileid+' => '',
'Class:URP_UserProfile/Attribute:reason' => 'Ok',
'Class:URP_UserProfile/Attribute:reason+' => '',
'Class:URP_UserOrg' => 'Felhasználó szervezeti egysége',
'Class:URP_UserOrg+' => '',
'Class:URP_UserOrg/Attribute:userid' => 'Felhasználó',
'Class:URP_UserOrg/Attribute:userid+' => '',
'Class:URP_UserOrg/Attribute:allowed_org_id' => 'Szervezeti egység',
'Class:URP_UserOrg/Attribute:allowed_org_id+' => '',
'Class:URP_UserOrg/Attribute:reason' => 'Ok',
'Class:URP_UserOrg/Attribute:reason+' => '',
'Class:URP_ActionGrant' => 'action_permission',
'Class:URP_ActionGrant+' => '',
'Class:URP_ActionGrant/Attribute:profileid' => 'Profil',
'Class:URP_ActionGrant/Attribute:profileid+' => '',
'Class:URP_ActionGrant/Attribute:class' => 'Osztály',
'Class:URP_ActionGrant/Attribute:class+' => '',
'Class:URP_ActionGrant/Attribute:permission' => 'Hozzáférés',
'Class:URP_ActionGrant/Attribute:permission+' => '',
'Class:URP_ActionGrant/Attribute:permission/Value:no' => 'Nem',
'Class:URP_ActionGrant/Attribute:permission/Value:no+' => '',
'Class:URP_ActionGrant/Attribute:permission/Value:yes' => 'Igen',
'Class:URP_ActionGrant/Attribute:permission/Value:yes+' => '',
'Class:URP_ActionGrant/Attribute:action' => 'Akció',
'Class:URP_ActionGrant/Attribute:action+' => '',
'Class:URP_StimulusGrant' => 'stimulus_permission',
'Class:URP_StimulusGrant+' => '',
'Class:URP_StimulusGrant/Attribute:profileid' => 'Profil',
'Class:URP_StimulusGrant/Attribute:profileid+' => '',
'Class:URP_StimulusGrant/Attribute:class' => 'Osztály',
'Class:URP_StimulusGrant/Attribute:class+' => '',
'Class:URP_StimulusGrant/Attribute:permission' => 'Hozzáférés',
'Class:URP_StimulusGrant/Attribute:permission+' => '',
'Class:URP_StimulusGrant/Attribute:permission/Value:no' => 'Nem',
'Class:URP_StimulusGrant/Attribute:permission/Value:no+' => '',
'Class:URP_StimulusGrant/Attribute:permission/Value:yes' => 'Igen',
'Class:URP_StimulusGrant/Attribute:permission/Value:yes+' => '',
'Class:URP_StimulusGrant/Attribute:stimulus' => 'Stimulus',
'Class:URP_StimulusGrant/Attribute:stimulus+' => '',
'Class:URP_AttributeGrant' => 'attribute_permission',
'Class:URP_AttributeGrant+' => '',
'Class:URP_AttributeGrant/Attribute:actiongrantid' => 'Akció engedély',
'Class:URP_AttributeGrant/Attribute:actiongrantid+' => '',
'Class:URP_AttributeGrant/Attribute:attcode' => 'Attribútum',
'Class:URP_AttributeGrant/Attribute:attcode+' => '',
'Class:AuditRule/Attribute:category_name' => 'Kategória',
'Class:AuditRule/Attribute:category_name+' => '',
'Class:User' => 'Felhasználó',
'Class:User+' => '',
'Class:User/Attribute:finalclass' => 'Felhasználó típusa',
'Class:User/Attribute:finalclass+' => '',
'Class:User/Attribute:contactid' => 'Kapcsolattartó (személy)',
'Class:User/Attribute:contactid+' => '',
'Class:User/Attribute:last_name' => 'Családnév',
'Class:User/Attribute:last_name+' => '',
'Class:User/Attribute:first_name' => 'Keresztnév',
'Class:User/Attribute:first_name+' => '',
'Class:User/Attribute:email' => 'E-mail',
'Class:User/Attribute:email+' => '',
'Class:User/Attribute:login' => 'Bejelentkezési név',
'Class:User/Attribute:login+' => '',
'Class:User/Attribute:language' => 'Nyelv',
'Class:User/Attribute:language+' => '',
'Class:User/Attribute:language/Value:EN US' => 'Angol',
'Class:User/Attribute:language/Value:EN US+' => '',
'Class:User/Attribute:language/Value:HU HU' => 'Magyar',
'Class:User/Attribute:language/Value:HU HU+' => '',
'Class:User/Attribute:language/Value:FR FR' => 'Francia',
'Class:User/Attribute:language/Value:FR FR+' => '',
'Class:User/Attribute:profile_list' => 'Profil',
'Class:User/Attribute:profile_list+' => '',
'Class:User/Attribute:allowed_org_list' => 'Engedélyezett szervezeti egységek',
'Class:User/Attribute:allowed_org_list+' => '',
'Class:User/Error:LoginMustBeUnique' => 'Bejelentkezési névnek egyedinek kell lennie - "%1s" már létezik.',
'Class:User/Error:AtLeastOneProfileIsNeeded' => 'Legalább egy profilt a felhasználóhoz kell rendelni.',
'Class:URP_Dimensions' => 'Dimenzió',
'Class:URP_Dimensions+' => '',
'Class:URP_Dimensions/Attribute:name' => 'Neve',
'Class:URP_Dimensions/Attribute:name+' => '',
'Class:URP_Dimensions/Attribute:description' => 'Leírás',
'Class:URP_Dimensions/Attribute:description+' => '',
'Class:URP_Dimensions/Attribute:type' => 'Típus',
'Class:URP_Dimensions/Attribute:type+' => '',
'Class:URP_UserProfile/Attribute:userlogin' => 'Bejelentkezési név',
'Class:URP_UserProfile/Attribute:userlogin+' => '',
'Class:URP_UserProfile/Attribute:profile' => 'Profil',
'Class:URP_UserProfile/Attribute:profile+' => '',
'Class:URP_UserOrg/Attribute:userlogin' => 'Bejelentkezési név',
'Class:URP_UserOrg/Attribute:userlogin+' => '',
'Class:URP_UserOrg/Attribute:allowed_org_name' => 'Szervezeti egység',
'Class:URP_UserOrg/Attribute:allowed_org_name+' => '',
'Class:URP_ProfileProjection' => 'profile_projection',
'Class:URP_ProfileProjection+' => '',
'Class:URP_ProfileProjection/Attribute:dimensionid' => 'Dimenzió',
'Class:URP_ProfileProjection/Attribute:dimensionid+' => '',
'Class:URP_ProfileProjection/Attribute:dimension' => 'Dimenzió',
'Class:URP_ProfileProjection/Attribute:dimension+' => '',
'Class:URP_ProfileProjection/Attribute:profileid' => 'Profil',
'Class:URP_ProfileProjection/Attribute:profileid+' => '',
'Class:URP_ProfileProjection/Attribute:profile' => 'Profil',
'Class:URP_ProfileProjection/Attribute:profile+' => '',
'Class:URP_ProfileProjection/Attribute:value' => 'Érték',
'Class:URP_ProfileProjection/Attribute:value+' => '',
'Class:URP_ProfileProjection/Attribute:attribute' => 'Attribútum',
'Class:URP_ProfileProjection/Attribute:attribute+' => '',
'Class:URP_ClassProjection' => 'class_projection',
'Class:URP_ClassProjection+' => '',
'Class:URP_ClassProjection/Attribute:dimensionid' => 'Dimenzió',
'Class:URP_ClassProjection/Attribute:dimensionid+' => '',
'Class:URP_ClassProjection/Attribute:dimension' => 'Dimenzió',
'Class:URP_ClassProjection/Attribute:dimension+' => '',
'Class:URP_ClassProjection/Attribute:class' => 'Osztály',
'Class:URP_ClassProjection/Attribute:class+' => '',
'Class:URP_ClassProjection/Attribute:value' => 'Érték',
'Class:URP_ClassProjection/Attribute:value+' => '',
'Class:URP_ClassProjection/Attribute:attribute' => 'Attribútum',
'Class:URP_ClassProjection/Attribute:attribute+' => '',
'Class:URP_ActionGrant/Attribute:profile' => 'Profil',
'Class:URP_ActionGrant/Attribute:profile+' => '',
'Class:URP_StimulusGrant/Attribute:profile' => 'Profil',
'Class:URP_StimulusGrant/Attribute:profile+' => '',
'Menu:WelcomeMenu' => 'Üdvözlöm',
'Menu:WelcomeMenu+' => '',
'Menu:WelcomeMenuPage' => 'Üdvözlöm',
'Menu:WelcomeMenuPage+' => '',
'UI:WelcomeMenu:Title' => 'Üdvözli az iTop',
'UI:WelcomeMenu:LeftBlock' => '<p>iTop egy teljeskörű, OpenSource, IT üzemeltetés támogató portál.</p>
<ul>A következőket tartalmazza:
<li>Teljeskörű CMDB (Konfiguráció menedzsment adatbázis) az IT eszközök dokumentálására és verzió kezelésére.</li>
<li>Incidens menedzsment modul az összes IT-hez kapcsolódó kérés életciklusának követésére.</li>
<li>Változás menedzsment modul az IT infrastruktúra változásainak nyomonkövetésére és tervezésére.</li>
<li>Ismert hibák adatbázisa az incidens kezelés sebességének növelésére.</li>
<li>Üzmeszünet modul az összes tervezett leállás tervezésére és azzal kapcsolatos kommunikáció támogatására.</li>
<li>Dashboard-ok az IT infrastruktúra pillanatnyi állapotának gyors áttekintésére.</li>
</ul>
<p>Mindegyik modul önállóan telepíthető és használható.</p>',
'UI:WelcomeMenu:RightBlock' => '<p>iTop egy szolgáltatás orientált megoldás, amely segít az IT szakembereknek több ügyfél és szervezet egyidejű menedzselését.
<ul>az iTop az üzleti folyamatok javításához egy hatékony eszköz, mert:
<li>javítja az IT menedzsment hatékonyságát</li>
<li>növeli IT üzemeltetés teljesítményét</li>
<li>növeli az ügyfél elégedettséget és a vezetők számára lehetőséget ad az üzleti teljesítmény növelésére</li>
</ul>
</p>
<p>Az iTop teljesn nyílt ezért, egyszerűen integrálható a jelenlegi IT infrastruktúrába</p>
<p>
<ul>Az üzemeltetési portál bevezetésével:
<li>jobban menedzselhető az egyre komplexebb IT infrstruktúra</li>
<li>az ITIL folyamatok bevezetésre kerülnek</li>
<li>hatékonyan tudja kezelni az egyik legfontosabb IT eszközt, a dokumentációt.</li>
</ul>
</p>',
'UI:WelcomeMenu:AllOpenRequests' => 'Összes nyitott kérés: %1$d',
'UI:WelcomeMenu:MyCalls' => 'Saját kérések',
'UI:WelcomeMenu:OpenIncidents' => 'Nyitott incidensek: %1$d',
'UI:WelcomeMenu:AllConfigItems' => 'Konfigurációs elemek: %1$d',
'UI:WelcomeMenu:MyIncidents' => 'Hozzám rendelt incidensek',
'UI:AllOrganizations' => 'Összes szervezeti egység',
'UI:YourSearch' => 'Saját keresések',
'UI:LoggedAsMessage' => 'Bejelentkezve %1$s',
'UI:LoggedAsMessage+Admin' => 'Bejelentkezve %1$s (Administrator)',
'UI:Button:Logoff' => 'Kijelentkezés',
'UI:Button:GlobalSearch' => 'Keresés',
'UI:Button:Search' => ' Keresés',
'UI:Button:Query' => ' Lekérdezés',
'UI:Button:Ok' => 'OK',
'UI:Button:Cancel' => 'Mégse',
'UI:Button:Apply' => 'Alkalmazás',
'UI:Button:Back' => ' << Vissza',
'UI:Button:Restart' => ' |<< Újraindítás',
'UI:Button:Next' => ' Következő >>',
'UI:Button:Finish' => ' Befejezés',
'UI:Button:DoImport' => ' Importálás indítása',
'UI:Button:Done' => ' Kész',
'UI:Button:SimulateImport' => ' Import szimulálása',
'UI:Button:Test' => 'Teszt!',
'UI:Button:Evaluate' => ' Értékelés',
'UI:Button:AddObject' => ' Hozzáad...',
'UI:Button:BrowseObjects' => ' Böngészés...',
'UI:Button:Add' => ' Hozzáad ',
'UI:Button:AddToList' => ' << Hozzáad ',
'UI:Button:RemoveFromList' => ' Eltávolít >> ',
'UI:Button:FilterList' => ' Szűrés... ',
'UI:Button:Create' => ' Létrehoz',
'UI:Button:Delete' => ' Töröl !',
'UI:Button:ChangePassword' => ' Jelszó változtatás',
'UI:Button:ResetPassword' => ' Jelszó változtatás',
'UI:SearchToggle' => 'Keresés',
'UI:ClickToCreateNew' => 'Új %1$s létrehozása',
'UI:SearchFor_Class' => '%1$s objektumok keresése',
'UI:NoObjectToDisplay' => 'Nincs megjeleníthető objektum',
'UI:Error:MandatoryTemplateParameter_object_id' => 'object_id pareméter kötelező a link_attr megadásánál. Ellenőrizze a sablon definíciót.',
'UI:Error:MandatoryTemplateParameter_target_attr' => 'target_attr pareméter kötelező a link_attr megadásánál. Ellenőrizze a sablon definíciót.',
'UI:Error:MandatoryTemplateParameter_group_by' => 'group_by paraméter kötelező. Ellenőrizze a sablon definíciót.',
'UI:Error:InvalidGroupByFields' => 'Csoportosításnál használt érvénytelen mezők: "%1$s".',
'UI:Error:UnsupportedStyleOfBlock' => 'Hiba: nem támogatott stílus tömb: "%1$s".',
'UI:Error:IncorrectLinkDefinition_LinkedClass_Class' => 'Nem megfelelő kapcsolat meghatározás: kapcsolódó osztály: %1$s nem külső kulcs a %2$s osztályban',
'UI:Error:Object_Class_Id_NotFound' => 'Objektum: %1$s:%2$d nem található.',
'UI:Error:WizardCircularReferenceInDependencies' => 'Hiba: Körkörös hivatkozás az egymásra mutató mezők között. Ellenőrizze az adatmodelt.',
'UI:Error:UploadedFileTooBig' => 'Feltöltendő fájl túl nagy. (Maximális méret: %1$s). Ellenőroizze a PHP konfigurációs fájlban az upload_max_filesize és post_max_size beállításokat.',
'UI:Error:UploadedFileTruncated.' => 'Feltöltött fájl átméretezett!',
'UI:Error:NoTmpDir' => 'Az átmeneti könyvtár nem meghatározott.',
'UI:Error:CannotWriteToTmp_Dir' => 'Az átmeneti fájl nem írható. upload_tmp_dir = "%1$s".',
'UI:Error:UploadStoppedByExtension_FileName' => 'Feltöltés megállt a fájl kiterjesztés miatt. (Eredeti fájl név = "%1$s").',
'UI:Error:UploadFailedUnknownCause_Code' => 'Fájl feltöltés sikertelen ismeretlen hiba miatt. (Hibakód = "%1$s").',
'UI:Error:1ParametersMissing' => 'Hiba: a következő paramétert meg kell adni ennél a műveletnél: %1$s.',
'UI:Error:2ParametersMissing' => 'Hiba: a következő paramétereket meg kell adni ennél a műveletnél: %1$s és %2$s.',
'UI:Error:3ParametersMissing' => 'Hiba: a következő paramétereket meg kell adni ennél a műveletnél: %1$s, %2$s és %3$s.',
'UI:Error:4ParametersMissing' => 'Hiba: a következő paramétereket meg kell adni ennél a műveletnél: %1$s, %2$s, %3$s és %4$s.',
'UI:Error:IncorrectOQLQuery_Message' => 'Hiba: nem megfelelő OQL lekérdezés: %1$',
'UI:Error:AnErrorOccuredWhileRunningTheQuery_Message' => 'Hiba történt a lekérdezs futtatása közben: %1$s',
'UI:Error:ObjectAlreadyUpdated' => 'Hiba: az objketum már korábban módosításra került.',
'UI:Error:ObjectCannotBeUpdated' => 'Hiba: az objektum nem frissíthető.',
'UI:Error:ObjectsAlreadyDeleted' => 'Hiba: az objektum már korában törlésre került!',
'UI:Error:BulkDeleteNotAllowedOn_Class' => 'Az osztály objektumainak tömeges törlése nem engedélyezett %1$s',
'UI:Error:DeleteNotAllowedOn_Class' => 'Az osztály objektumainak törlése nem engedélyezett %1$s',
'UI:Error:BulkModifyNotAllowedOn_Class' => 'Az osztály objektumainak tömeges frissítése nem engedélyezett %1$s',
'UI:Error:ObjectAlreadyCloned' => 'Hiba: az objektum már klónozott!',
'UI:Error:ObjectAlreadyCreated' => 'Hiba: az objekltum már létrehozva!',
'UI:Error:Invalid_Stimulus_On_Object_In_State' => 'Hiba: érvénytelen stimulus "%1$s" a következő objektum %2$s következő állapotában "%3$s".',
'UI:GroupBy:Count' => 'Számossága',
'UI:GroupBy:Count+' => '',
'UI:CountOfObjects' => '%1$d darab objektum felel meg a kritériumoknak.',
'UI_CountOfObjectsShort' => '%1$d objketum.',
'UI:NoObject_Class_ToDisplay' => 'Nincs megjeleníthető %1$s',
'UI:History:LastModified_On_By' => 'Utolsó módosítást a következő objektumon %1$s %2$s végezte.',
'UI:HistoryTab' => 'Törénet',
'UI:NotificationsTab' => 'Értesítés',
'UI:History:BulkImports' => 'Történet',
'UI:History:BulkImports+' => '',
'UI:History:BulkImportDetails' => 'CSV import végrehajtva: %1$s (%2$s által)',
'UI:History:Date' => 'Dátum',
'UI:History:Date+' => '',
'UI:History:User' => 'Felhasználó',
'UI:History:User+' => '',
'UI:History:Changes' => 'Változások',
'UI:History:Changes+' => '',
'UI:History:StatsCreations' => 'Létrehozva',
'UI:History:StatsCreations+' => '',
'UI:History:StatsModifs' => 'Módosítva',
'UI:History:StatsModifs+' => '',
'UI:History:StatsDeletes' => 'Törölve',
'UI:History:StatsDeletes+' => '',
'UI:Loading' => 'Betöltés...',
'UI:Menu:Actions' => 'Akciók',
'UI:Menu:New' => 'Új...',
'UI:Menu:Add' => 'Hozzáad...',
'UI:Menu:Manage' => 'Kezel...',
'UI:Menu:EMail' => 'e-mail',
'UI:Menu:CSVExport' => 'CSV export',
'UI:Menu:Modify' => 'Módosít...',
'UI:Menu:Delete' => 'Töröl...',
'UI:Menu:BulkDelete' => 'Töröl...',
'UI:UndefinedObject' => 'nem meghatározott',
'UI:Document:OpenInNewWindow:Download' => 'Megnyitás új ablakban: %1$s, Letöltés: %2$s',
'UI:SelectAllToggle+' => '',
'UI:TruncatedResults' => '%1$d objektum megjelenítve %2$d példányból',
'UI:DisplayAll' => 'Összes megjelenítése',
'UI:CollapseList' => 'Elemek',
'UI:CountOfResults' => '%1$d objektum',
'UI:ChangesLogTitle' => 'Változás napló (%1$d):',
'UI:EmptyChangesLogTitle' => 'Változás napló üres',
'UI:SearchFor_Class_Objects' => 'Keresés %1$s objektumra',
'UI:OQLQueryBuilderTitle' => 'OQL lekérdezés szerkesztő',
'UI:OQLQueryTab' => 'OQL lekérdezés',
'UI:SimpleSearchTab' => 'Egyszerű keresés',
'UI:Details+' => '',
'UI:SearchValue:Any' => '* Any *',
'UI:SearchValue:Mixed' => '* mixed *',
'UI:SelectOne' => '-- válasszon ki egyet --',
'UI:Login:Welcome' => 'Üdvözli az iTop!',
'UI:Login:IncorrectLoginPassword' => 'Nem megfelelő bejelentkezési név/jelszó, kérjük próbálja újra.',
'UI:Login:IdentifyYourself' => 'Folytatás előtt azonosítsa magát',
'UI:Login:UserNamePrompt' => 'Felhasználó név',
'UI:Login:PasswordPrompt' => 'Jelszó',
'UI:Login:ChangeYourPassword' => 'Jelszó változtatás',
'UI:Login:OldPasswordPrompt' => 'Jelenlegi jelszó',
'UI:Login:NewPasswordPrompt' => 'Új jelszó',
'UI:Login:RetypeNewPasswordPrompt' => 'Új jelszó ismét',
'UI:Login:IncorrectOldPassword' => 'Hiba: a jelenlegi jelszó hibás',
'UI:LogOffMenu' => 'Kilépés',
'UI:LogOff:ThankYou' => 'Köszönjük, hogy az iTop-ot használja!',
'UI:LogOff:ClickHereToLoginAgain' => 'Ismételt bejelentkezéshez kattintson ide',
'UI:ChangePwdMenu' => 'Jelszó módosítás...',
'UI:Login:PasswordChanged' => 'Jelszó sikeresen beállítva!',
'UI:AccessRO-All' => 'iTop csak olvasás módban',
'UI:AccessRO-Users' => 'iTop csak olvasás módban a végfelhasználók számára',
'UI:Login:RetypePwdDoesNotMatch' => 'Az új jelszó és ismételten beírt érték nem egyezik!',
'UI:Button:Login' => 'Belépés az iTop alkalmazásba',
'UI:Login:Error:AccessRestricted' => 'iTop hozzáférés korlátozva. Kérem forduljon az iTop adminisztrátorhoz!',
'UI:Login:Error:AccessAdmin' => 'Adminisztrátori hozzáférés korlátozott. Kérem forduljon az iTop adminisztrátorhoz!',
'UI:CSVImport:MappingSelectOne' => '-- válasszon ki egyet --',
'UI:CSVImport:MappingNotApplicable' => '-- mező figyelmen kívül hagyása --',
'UI:CSVImport:NoData' => 'Üres mező..., kérem agyjon meg adatot!',
'UI:Title:DataPreview' => 'Adatok előnézete',
'UI:CSVImport:ErrorOnlyOneColumn' => 'Hiba: Az import fájl egyetlen oszlopot tartalmaz. A megfelelő elválasztó karaktert adta meg?',
'UI:CSVImport:FieldName' => 'Mező %1$d',
'UI:CSVImport:DataLine1' => 'Adatsor 1',
'UI:CSVImport:DataLine2' => 'Adatsor 2',
'UI:CSVImport:idField' => 'id (elsődeges kulcs)',
'UI:Title:BulkImport' => 'iTop - tömeges betöltés',
'UI:Title:BulkImport+' => '',
'UI:Title:BulkSynchro_nbItem_ofClass_class' => '%2$s osztály %1$d objektumának szinkronizációja',
'UI:CSVImport:ClassesSelectOne' => '-- válasszon ki egyet --',
'UI:CSVImport:ErrorExtendedAttCode' => 'Belső hiba: "%1$s" nem megfelelő kód, mert "%2$s" nem külső kulcsa a "%3$s" osztálynak',
'UI:CSVImport:ObjectsWillStayUnchanged' => '%1$d objektumok változatlanok maradnak.',
'UI:CSVImport:ObjectsWillBeModified' => '%1$d objektumok fognak megváltozni.',
'UI:CSVImport:ObjectsWillBeAdded' => '%1$d objektumok hozzáadásra kerülnek.',
'UI:CSVImport:ObjectsWillHaveErrors' => '%1$d objektumok hibásak lesznek.',
'UI:CSVImport:ObjectsRemainedUnchanged' => '%1$d objektumok változatlanak maradtak',
'UI:CSVImport:ObjectsWereModified' => '%1$d objektumok módosításra kerültek.',
'UI:CSVImport:ObjectsWereAdded' => '%1$d objektumok hozzáadásra kerültek.',
'UI:CSVImport:ObjectsHadErrors' => '%1$d objkektumok hibásak.',
'UI:Title:CSVImportStep2' => '2. lépés az 5-ből: CSV adat opciók',
'UI:Title:CSVImportStep3' => '3. lépés az 5-ből: Adatok összerendelés',
'UI:Title:CSVImportStep4' => '4. lépés az 5-ből: Import szimuláció',
'UI:Title:CSVImportStep5' => '5. lépés az 5-ből: Import befejezve',
'UI:CSVImport:LinesNotImported' => 'Sorok, melyek nem lettek betöltve:',
'UI:CSVImport:LinesNotImported+' => '',
'UI:CSVImport:SeparatorComma+' => '',
'UI:CSVImport:SeparatorSemicolon+' => '',
'UI:CSVImport:SeparatorTab+' => '',
'UI:CSVImport:SeparatorOther' => 'egyéb:',
'UI:CSVImport:QualifierDoubleQuote+' => '',
'UI:CSVImport:QualifierSimpleQuote+' => '',
'UI:CSVImport:QualifierOther' => 'egyéb:',
'UI:CSVImport:TreatFirstLineAsHeader' => 'Első sor fejléc információkat tartalmaz (oszlopok nevei)',
'UI:CSVImport:Skip_N_LinesAtTheBeginning' => '%1$s sorok kihagyása a fájl elejéről',
'UI:CSVImport:CSVDataPreview' => 'CSV adat előnézet',
'UI:CSVImport:SelectFile' => 'Import fájl kiválasztása:',
'UI:CSVImport:Tab:LoadFromFile' => 'Betöltés fájlból',
'UI:CSVImport:Tab:CopyPaste' => 'Adat másolás és beillesztés',
'UI:CSVImport:Tab:Templates' => 'Sablonok',
'UI:CSVImport:PasteData' => 'Import adatok beillesztése:',
'UI:CSVImport:PickClassForTemplate' => 'Letöltendő sablon kiválasztása:',
'UI:CSVImport:SeparatorCharacter' => 'Elválasztó karakter:',
'UI:CSVImport:TextQualifierCharacter' => 'Szöveg qualifier karakter',
'UI:CSVImport:CommentsAndHeader' => 'Megjegyzések és fejléc',
'UI:CSVImport:SelectClass' => 'Importálandó osztály kiválasztása:',
'UI:CSVImport:AdvancedMode' => 'Haladó mód',
'UI:CSVImport:AdvancedMode+' => '',
'UI:CSVImport:SelectAClassFirst' => 'Adat összerendeléshez elöször válassza ki az osztályt.',
'UI:CSVImport:HeaderFields' => 'Mező',
'UI:CSVImport:HeaderMappings' => 'Összerendelés',
'UI:CSVImport:HeaderSearch' => 'Keresés?',
'UI:CSVImport:AlertIncompleteMapping' => 'Kérem adja meg az összes mezőre az összerendelési szabályokat.',
'UI:CSVImport:AlertNoSearchCriteria' => 'Kérem adjon eg legalább egy keresési kritériumot',
'UI:CSVImport:Encoding' => 'Karakter kódolása',
'UI:UniversalSearchTitle' => 'iTop - Univerzális kereső',
'UI:UniversalSearch:Error' => 'Hiba: %1$s',
'UI:UniversalSearch:LabelSelectTheClass' => 'Keresendő osztály kiválasztása:',
'UI:Audit:Title' => 'iTop - CMDB Audit',
'UI:Audit:InteractiveAudit' => 'Interaktív Audit',
'UI:Audit:HeaderAuditRule' => 'Audit szabály',
'UI:Audit:HeaderNbObjects' => '# Objektumok',
'UI:Audit:HeaderNbErrors' => '# Hibák',
'UI:Audit:PercentageOk' => '% OK',
'UI:RunQuery:Title' => 'iTop - OQL lekérdezés értékelés',
'UI:RunQuery:QueryExamples' => 'Lekérdezés példák',
'UI:RunQuery:HeaderPurpose' => 'Cél',
'UI:RunQuery:HeaderPurpose+' => '',
'UI:RunQuery:HeaderOQLExpression' => 'OQL kifejezés',
'UI:RunQuery:HeaderOQLExpression+' => '',
'UI:RunQuery:ExpressionToEvaluate' => 'Értékelendő kifejezés: ',
'UI:RunQuery:MoreInfo' => 'Több információ a lekérdezésről: ',
'UI:RunQuery:DevelopedQuery' => 'Újraírt lekérdező értékelés: ',
'UI:RunQuery:SerializedFilter' => 'Szerializált szűrő: ',
'UI:RunQuery:Error' => 'A lekérdezés futtatása közben a következő hiba jelentkezett: %1$s',
'UI:Schema:Title' => 'iTop objektum séma',
'UI:Schema:CategoryMenuItem' => '<b>%1$s</b> kategória',
'UI:Schema:Relationships' => 'Kapcsolatok',
'UI:Schema:AbstractClass' => 'Absztrakt osztály: nem példányosítható belőle objektum.',
'UI:Schema:NonAbstractClass' => 'Nem absztrakt osztály: objektum példányosítható belőle.',
'UI:Schema:ClassHierarchyTitle' => 'Osztály hierarchia',
'UI:Schema:AllClasses' => 'Összes osztály',
'UI:Schema:ExternalKey_To' => 'Külső kulcs %1$s-hoz',
'UI:Schema:Columns_Description' => 'Oszlopok: <em>%1$s</em>',
'UI:Schema:Default_Description' => 'Alapértelmezett: "%1$s"',
'UI:Schema:NullAllowed' => 'Null érték engedélyezett',
'UI:Schema:NullNotAllowed' => 'Null érték nem engedélyezett',
'UI:Schema:Attributes' => 'Attribútumok',
'UI:Schema:AttributeCode' => 'Attribútum kód',
'UI:Schema:AttributeCode+' => '',
'UI:Schema:Label' => 'Cimke',
'UI:Schema:Label+' => '',
'UI:Schema:Type' => 'Típus',
'UI:Schema:Type+' => '',
'UI:Schema:Origin' => 'Származás',
'UI:Schema:Origin+' => '',
'UI:Schema:Description' => 'Leírás',
'UI:Schema:Description+' => '',
'UI:Schema:AllowedValues' => 'Engedélyezett értékek',
'UI:Schema:AllowedValues+' => '',
'UI:Schema:MoreInfo' => 'Több információ',
'UI:Schema:MoreInfo+' => '',
'UI:Schema:SearchCriteria' => 'Keresési kritériumok',
'UI:Schema:FilterCode' => 'Szűrő kód',
'UI:Schema:FilterCode+' => '',
'UI:Schema:FilterDescription' => 'Leírás',
'UI:Schema:FilterDescription+' => '',
'UI:Schema:AvailOperators' => 'Elérhető műveletek',
'UI:Schema:AvailOperators+' => '',
'UI:Schema:ChildClasses' => 'Leszármazott osztályok',
'UI:Schema:ReferencingClasses' => 'Referált osztályok',
'UI:Schema:RelatedClasses' => 'Kapcsolódó osztályok',
'UI:Schema:LifeCycle' => 'Életciklus',
'UI:Schema:Triggers' => 'Kiváltó okok',
'UI:Schema:Relation_Code_Description' => 'Kapcsolat <em>%1$s</em> (%2$s)',
'UI:Schema:RelationDown_Description' => 'Lenn: %1$s',
'UI:Schema:RelationUp_Description' => 'Fenn: %1$s',
'UI:Schema:RelationPropagates' => '%1$s: kiterjesztése %2$d szintre, lekérdezés: %3$s',
'UI:Schema:RelationDoesNotPropagate' => '%1$s: nincs kiterjesztve (%2$d szintekre), lekérdezés: %3$s',
'UI:Schema:Class_ReferencingClasses_From_By' => '%1$s hivatkozva %2$s az osztályban %3$s mezőn keresztül',
'UI:Schema:Class_IsLinkedTo_Class_Via_ClassAndAttribute' => '%1$s hozzácsatolva %2$s-hoz %3$s-n keresztül::<em>%4$s</em>',
'UI:Schema:Links:1-n' => 'A következő osztályok mutatnak %1$s-ra (1:n kapcsolat):',
'UI:Schema:Links:n-n' => 'A következő osztályok mutatnak %1$s-ra (n:n kapcsolat):',
'UI:Schema:Links:All' => 'Össze kapcsolódó osztály grafikonja',
'UI:Schema:NoLifeCyle' => 'Nincs életciklus rendelve ehhez az osztályhoz.',
'UI:Schema:LifeCycleTransitions' => 'Átmenetek',
'UI:Schema:LifeCyleAttributeOptions' => 'Attribútum opciók',
'UI:Schema:LifeCycleHiddenAttribute' => 'Rejtett',
'UI:Schema:LifeCycleReadOnlyAttribute' => 'Csak olvasható',
'UI:Schema:LifeCycleMandatoryAttribute' => 'Kötelező',
'UI:Schema:LifeCycleAttributeMustChange' => 'Változtatni kell',
'UI:Schema:LifeCycleAttributeMustPrompt' => 'Felhasználó kéri a változtatását',
'UI:Schema:LifeCycleEmptyList' => 'üres lista',
'UI:LinksWidget:Autocomplete+' => '',
'UI:Combo:SelectValue' => '--- válasszon értéket ---',
'UI:Label:SelectedObjects' => 'Kiválasztott objektumok: ',
'UI:Label:AvailableObjects' => 'Lehetséges objektumok: ',
'UI:Link_Class_Attributes' => '%1$s attribútumai',
'UI:AddObjectsOf_Class_LinkedWith_Class_Instance' => '%1$s objektumok hozzáadása %2$s osztályhoz kapcsolással: %3$s',
'UI:AddObjectsOf_Class_LinkedWith_Class' => '%1$s objektumok hozzáadása %2$s osztályhoz csatolással',
'UI:ManageObjectsOf_Class_LinkedWith_Class_Instance' => '%2$s osztályhoz kapcsolt %1$s objektumok kezelése: %3$s',
'UI:AddLinkedObjectsOf_Class' => 'Hozzáadás %1$s osztályhoz',
'UI:RemoveLinkedObjectsOf_Class' => 'Kiválasztott objektum eltávolítása',
'UI:Message:EmptyList:UseAdd' => 'A lista üres, használja a "Hozzáadás..." gombot az elemekre.',
'UI:Message:EmptyList:UseSearchForm' => 'Használja a kereső formot a hozzáadandó objektumok kiválasztásához.',
'UI:Wizard:FinalStepTitle' => 'Utolsó lépés: megerősítés',
'UI:Title:DeletionOf_Object' => '%1$s törlése',
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => '%2$s osztály %1$d objektumának tömeges törlése',
'UI:Delete:NotAllowedToDelete' => 'Nem enegedélyezett az objektum törlése',
'UI:Delete:NotAllowedToUpdate_Fields' => 'A következő mező módosítása nem engedélyezett: %1$s',
'UI:Error:NotEnoughRightsToDelete' => 'Az objektum nem törölhető, mert a felhasználónak nincs elegendő joga',
'UI:Error:CannotDeleteBecause' => 'Az objektum nem törölhető, mert: %1$s',
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Az objektum nem törölhető, mert néhány hozzá kapcsolódó magasabb prioritású manuális művelet végrehajtásra vár',
'UI:Error:CannotDeleteBecauseManualOpNeeded' => 'Az objektum nem törölhető, mert néhány hozzá kapcsolódó magasabb prioritású manuális művelet végrehajtásra vár',
'UI:Archive_User_OnBehalfOf_User' => '%1$s felhasználó %2$s nevében',
'UI:Delete:Deleted' => 'törölt',
'UI:Delete:AutomaticallyDeleted' => 'automatikusan törölt',
'UI:Delete:AutomaticResetOf_Fields' => ' következő mezők automatikus újratöltése: %1$s',
'UI:Delete:CleaningUpRefencesTo_Object' => 'Összes referencia tisztítása %1$s...',
'UI:Delete:CleaningUpRefencesTo_Several_ObjectsOf_Class' => '%2$s osztály %1$d objektumára mutató referenciák tisztítása',
'UI:Delete:Done+' => '',
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s törölve.',
'UI:Delete:ConfirmDeletionOf_Name' => '%1$s törlése',
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => '%2$s osztály %1$d objektumának törlése',
'UI:Delete:CannotDeleteBecause' => 'Sikertelenül töröltek: %1$s',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Automatikusan kellett volna törlődniük, de a művelet nem volt végrehajtható: %1$s',
'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Manuállis törlés nem végrehajtható: %1$s',
'UI:Delete:WillBeDeletedAutomatically' => 'Automatikusan lesznek törölve',
'UI:Delete:MustBeDeletedManually' => 'Manuálisan törlendők',
'UI:Delete:CannotUpdateBecause_Issue' => 'Automatikus frissítés sikeretelen: %1$s',
'UI:Delete:WillAutomaticallyUpdate_Fields' => 'Automatikusan lesznek frissítve (reset: %1$s)',
'UI:Delete:Count_Objects/LinksReferencing_Object' => '%1$d objektumok / kapcsolatok hivatkoznak erre: %2$s',
'UI:Delete:Count_Objects/LinksReferencingTheObjects' => '%1$d objektumok / kapcsolatok hivatkoznak törlendő objektumokra',
'UI:Delete:ReferencesMustBeDeletedToEnsureIntegrity' => 'Adatbázis integritás ellenőrzés szükséges. Néhány hivatkozás megszüntetésre kerül.',
'UI:Delete:Consequence+' => '',
'UI:Delete:SorryDeletionNotAllowed' => 'Az objektum törlése nem engedélyezett. Részletes magyarázat a következő sorokban.',
'UI:Delete:PleaseDoTheManualOperations' => 'Kérem hajtsa végre a következő listában található műveleteket manuálisan az objektum törlésének kéréséhez',
'UI:Delect:Confirm_Object' => 'Kérjük hagyja jóvá a %1$s törlését!',
'UI:Delect:Confirm_Count_ObjectsOf_Class' => 'Kérjük hagyja jóvá a %2$s ostály %1$d objektumának törlését!',
'UI:WelcomeToITop' => 'Üdvözli az iTop',
'UI:DetailsPageTitle' => 'iTop - %1$s - %2$s részletek',
'UI:ErrorPageTitle' => 'iTop - Hiba',
'UI:ObjectDoesNotExist' => 'Sajnálom ez az objektum nem létezik (vagy a megtekintése nem engedélyezett a felhasználó számára).',
'UI:SearchResultsPageTitle' => 'iTop - Keresés eredményei',
'UI:Search:NoSearch' => 'Nincs keresés',
'UI:FullTextSearchTitle_Text' => '"%1$s" keresés eredményei:',
'UI:Search:Count_ObjectsOf_Class_Found' => '%2$s osztály %1$d objektuma',
'UI:Search:NoObjectFound' => 'Objektum nem található',
'UI:ModificationPageTitle_Object_Class' => 'iTop - %1$s - %2$s módosítása',
'UI:ModificationTitle_Class_Object' => '%1$s: <span class=\"hilite\">%2$s</span> módosítása',
'UI:ClonePageTitle_Object_Class' => 'iTop - %1$s - %2$s klón módosítása',
'UI:CloneTitle_Class_Object' => '%1$s: <span class=\"hilite\">%2$s</span> klón',
'UI:CreationPageTitle_Class' => 'iTop - %1$s létrehozása',
'UI:CreationTitle_Class' => '%1$s létrehozása',
'UI:SelectTheTypeOf_Class_ToCreate' => 'Válassza ki a létrehozni kívánt %1$s osztály típusát:',
'UI:Class_Object_NotUpdated' => 'Változás nem történt, %1$s (%2$s) <strong>NEM</strong> lett módosítva.',
'UI:Class_Object_Updated' => '%1$s (%2$s) frissítve.',
'UI:BulkDeletePageTitle' => 'iTop - Tömeges törlés',
'UI:BulkDeleteTitle' => 'Válassza ki a törölni kívánt objektumokat:',
'UI:PageTitle:ObjectCreated' => 'iTop objektum létrehozva.',
'UI:Title:Object_Of_Class_Created' => '%1$s - %2$s létrehozva.',
'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => 'Alkalmazva %1$s objektumon: %2$s.Kinduló állapot: %3$s cél állapot: %4$s.',
'UI:ObjectCouldNotBeWritten' => 'Au objektum írása sikertlen: %1$s',
'UI:PageTitle:FatalError' => 'iTop - Fatális hiba',
'UI:SystemIntrusion' => 'Hozzáférés megtagadva. A művelet végrehajtása nem engedélyezett.',
'UI:FatalErrorMessage' => 'Fatális hiba, iTop nem tudja a működését folytatni',
'UI:Error_Details' => 'Hiba: %1$s.',
'UI:PageTitle:ClassProjections' => 'iTop felhasználó menedzsmet - osztály nézet',
'UI:PageTitle:ProfileProjections' => 'iTop felhasználó menedzsmet - profil nézet',
'UI:UserManagement:Class' => 'Osztály',
'UI:UserManagement:Class+' => '',
'UI:UserManagement:ProjectedObject' => 'Objektum',
'UI:UserManagement:ProjectedObject+' => '',
'UI:UserManagement:AnyObject' => '* any *',
'UI:UserManagement:User' => 'Felhasználó',
'UI:UserManagement:User+' => '',
'UI:UserManagement:Profile' => 'Profil',
'UI:UserManagement:Profile+' => '',
'UI:UserManagement:Action:Read' => 'Olvas',
'UI:UserManagement:Action:Read+' => '',
'UI:UserManagement:Action:Modify' => 'Módosít',
'UI:UserManagement:Action:Modify+' => '',
'UI:UserManagement:Action:Delete' => 'Töröl',
'UI:UserManagement:Action:Delete+' => '',
'UI:UserManagement:Action:BulkRead' => 'Tömeges beolvasás (Export)',
'UI:UserManagement:Action:BulkRead+' => '',
'UI:UserManagement:Action:BulkModify' => 'Tömeges módosítás',
'UI:UserManagement:Action:BulkModify+' => '',
'UI:UserManagement:Action:BulkDelete' => 'Tömeges törlés',
'UI:UserManagement:Action:BulkDelete+' => '',
'UI:UserManagement:Action:Stimuli' => 'Stimuli',
'UI:UserManagement:Action:Stimuli+' => '',
'UI:UserManagement:Action' => 'Akció',
'UI:UserManagement:Action+' => '',
'UI:UserManagement:TitleActions' => 'Akciók',
'UI:UserManagement:Permission' => 'Engedély',
'UI:UserManagement:Permission+' => '',
'UI:UserManagement:Attributes' => 'Attribútumok',
'UI:UserManagement:ActionAllowed:Yes' => 'Igen',
'UI:UserManagement:ActionAllowed:No' => 'Nem',
'UI:UserManagement:AdminProfile+' => '',
'UI:UserManagement:NoLifeCycleApplicable' => 'N/A',
'UI:UserManagement:NoLifeCycleApplicable+' => '',
'UI:UserManagement:GrantMatrix' => 'Jogosutlsági mátrix',
'UI:UserManagement:LinkBetween_User_And_Profile' => 'Kapcsolat %1$s és %2$s között',
'UI:UserManagement:LinkBetween_User_And_Org' => 'Kapcsolat %1$s és %2$s között',
'Menu:AdminTools' => 'Adminisztrációs eszközök',
'Menu:AdminTools+' => '',
'Menu:AdminTools?' => 'Eszközök csak az adminisztrátori profilhoz rendlet felhasználók számára elérhetők.',
'UI:ChangeManagementMenu' => 'Változás menedzsment',
'UI:ChangeManagementMenu+' => '',
'UI:ChangeManagementMenu:Title' => 'Változás áttekintése',
'UI-ChangeManagementMenu-ChangesByType' => 'Változások típusok szerint',
'UI-ChangeManagementMenu-ChangesByStatus' => 'Változások státusz szerint',
'UI-ChangeManagementMenu-ChangesByWorkgroup' => 'Változások csoportok szerint',
'UI-ChangeManagementMenu-ChangesNotYetAssigned' => 'Még nem kiosztott változások',
'UI:ConfigurationItemsMenu' => 'Konfigurációs elemek',
'UI:ConfigurationItemsMenu+' => '',
'UI:ConfigurationItemsMenu:Title' => 'Konfigurációs elemek áttekintése',
'UI-ConfigurationItemsMenu-ServersByCriticity' => 'Szerverek kritikusság szerint',
'UI-ConfigurationItemsMenu-PCsByCriticity' => 'PC-k kritikusság szerint',
'UI-ConfigurationItemsMenu-NWDevicesByCriticity' => 'Hálózati eszközök kritikusság szerint',
'UI-ConfigurationItemsMenu-ApplicationsByCriticity' => 'Alkalmazások kritikusság szerint',
'UI:ConfigurationManagementMenu' => 'Konfiguráció menedzsment',
'UI:ConfigurationManagementMenu+' => '',
'UI:ConfigurationManagementMenu:Title' => 'Infrastruktúra áttekintő',
'UI-ConfigurationManagementMenu-InfraByType' => 'Infrastruktúra objetumok típusok szerint',
'UI-ConfigurationManagementMenu-InfraByStatus' => 'Infrastruktúra objetumok státuszok szerint',
'UI:ConfigMgmtMenuOverview:Title' => 'Konfiguráció menedzsment dashboard',
'UI-ConfigMgmtMenuOverview-FunctionalCIbyStatus' => 'Konfigurációs elemek státusz szerint',
'UI-ConfigMgmtMenuOverview-FunctionalCIByType' => 'Konfigurációs elemek típus szerint',
'UI:RequestMgmtMenuOverview:Title' => 'Igény menedzsment dashboard',
'UI-RequestManagementOverview-RequestByService' => 'Felhasználói kérések szolgáltatásonként',
'UI-RequestManagementOverview-RequestByPriority' => 'Felhasználói kérések prioritás szerint',
'UI-RequestManagementOverview-RequestUnassigned' => 'Felhasználói kérések, amelyek még nem lettek felelőshöz rendelve',
'UI:IncidentMgmtMenuOverview:Title' => 'Incidens menedzsment dashboard',
'UI-IncidentManagementOverview-IncidentByService' => 'Incidensek szolgáltatásonként',
'UI-IncidentManagementOverview-IncidentByPriority' => 'Incidensek prioritás szerint',
'UI-IncidentManagementOverview-IncidentUnassigned' => 'Incidensek, amelyek még nem lettek felelőshöz rendelve',
'UI:ChangeMgmtMenuOverview:Title' => 'Változás menedzsment dashboard',
'UI-ChangeManagementOverview-ChangeByType' => 'Változások típusonként',
'UI-ChangeManagementOverview-ChangeUnassigned' => 'Változások, amelyek még nem lettek felelőshöz rendelve',
'UI-ChangeManagementOverview-ChangeWithOutage' => 'Változások által okozott leállási idő',
'UI:ServiceMgmtMenuOverview:Title' => 'Szolgáltatás menedszment dashboard',
'UI-ServiceManagementOverview-CustomerContractToRenew' => 'A következő 30 napban lejáró ügyfél szerződések',
'UI-ServiceManagementOverview-ProviderContractToRenew' => 'A következő 30 napban lejáró szállítói szerződések',
'UI:ContactsMenu' => 'Kapcsolattartók',
'UI:ContactsMenu+' => '',
'UI:ContactsMenu:Title' => 'Kapcsolattartó áttekintő',
'UI-ContactsMenu-ContactsByLocation' => 'Kapcsolattartók földrajzi hely szerint',
'UI-ContactsMenu-ContactsByType' => 'Kapcsolattartók típus szerint',
'UI-ContactsMenu-ContactsByStatus' => 'Kapcsolattartók státusz szerint',
'Menu:CSVImportMenu' => 'CSV import',
'Menu:CSVImportMenu+' => '',
'Menu:DataModelMenu' => 'Adatmodell',
'Menu:DataModelMenu+' => '',
'Menu:ExportMenu' => 'Export',
'Menu:ExportMenu+' => '',
'Menu:NotificationsMenu' => 'Értesítések',
'Menu:NotificationsMenu+' => '',
'UI:NotificationsMenu:Title' => '<span class="hilite">Értesítések</span> beállítása',
'UI:NotificationsMenu:Help' => 'Segítség',
'UI:NotificationsMenu:HelpContent' => '<p>Az iTop alkalmazásban az értesítések teljesen testreszabhatók. Értesítések az objektumok két csoportjára épülnek: <i>kiváltó okok és akciók</i>.</p>
<p><i><b>Kiváltó ok</b></i> határozza meg mikor kell az értesítést végrehajtani. Kiváltó okoknak 2 típusa van az objektum életciklius három fázisának lefedésére:
<ol>
<li>"OnCreate" kiváltó ok egy objektum létrehozása</li>
<li>"OnStateEnter" kiváltó ok egy adott objektum állapot változása - az új objektum állapot elérése előtt váltódik ki</li>
<li>"OnStateLeave" kiváltó ok egy adott objektum állapot változása - az új objektum állapot elhagyása után váltódik ki</li>
</ol>
</p>
<p>
<i><b>Akciók</b></i> határozzák meg mit kell végrehjatani a kiváltó ok bekövetkezésekor. Jelenleg egyetlen akció fajta van: e-mail küldés.Természetesen az egyedi akciókbna meg lehet határozni a levél alapját képző sablont és az abba beépülő speciális paramétereket, pl.: címzett, fontossás, stb.
</p>
<p>Speciális oldal: <a href="../setup/email.test.php" target="_blank">email.test.php</a> oldalon keresztül a PHP mail konfiguráció tesztelhető.</p>
<p>Akció végrehjatásához azt kiváltó okhoz kell rendelni.
Akció kiváltó okhoz rendelésekor kap egy sorszámot , amely meghatározza az akciók végrehatási sorrendjét.</p>',
'UI:NotificationsMenu:Triggers' => 'Kiváltó okok',
'UI:NotificationsMenu:AvailableTriggers' => 'Lehetséges kiváltó okok',
'UI:NotificationsMenu:OnCreate' => 'Objektum létrehozás',
'UI:NotificationsMenu:OnStateEnter' => 'Objketum állapotba való belépése',
'UI:NotificationsMenu:OnStateLeave' => 'Objektum állotból való kilépése',
'UI:NotificationsMenu:Actions' => 'Akciók',
'UI:NotificationsMenu:AvailableActions' => 'Lehetséges akciók',
'Menu:AuditCategories' => 'Audit kategóriák',
'Menu:AuditCategories+' => '',
'Menu:Notifications:Title' => 'Audit kategóriák',
'Menu:RunQueriesMenu' => 'Lekérdezés futtatás',
'Menu:RunQueriesMenu+' => '',
'Menu:DataAdministration' => 'Adat adminisztráció',
'Menu:DataAdministration+' => '',
'Menu:UniversalSearchMenu' => 'Univerzális keresés',
'Menu:UniversalSearchMenu+' => '',
'Menu:ApplicationLogMenu' => 'Alkalmazás napló',
'Menu:ApplicationLogMenu+' => '',
'Menu:ApplicationLogMenu:Title' => 'Alkalmazás napló',
'Menu:UserManagementMenu' => 'Felhasználó menedzsment',
'Menu:UserManagementMenu+' => '',
'Menu:ProfilesMenu' => 'Profilok',
'Menu:ProfilesMenu+' => '',
'Menu:ProfilesMenu:Title' => 'Profilok',
'Menu:UserAccountsMenu' => 'Felhasználói fiókok',
'Menu:UserAccountsMenu+' => '',
'Menu:UserAccountsMenu:Title' => 'Felhasználói fiókok',
'UI:iTopVersion:Short' => 'iTop verzió: %1$s',
'UI:iTopVersion:Long' => 'iTop verzió: %1$s-%2$s %3$s',
'UI:PropertiesTab' => 'Tulajdonságok',
'UI:OpenDocumentInNewWindow_' => 'A követekező dokumentum megnyitása új ablakban: %1$s',
'UI:DownloadDocument_' => 'A következő dokuemntum letöltése: %1$s',
'UI:Document:NoPreview' => 'Nem elérhető előnézet ehhez a dokuemntumhoz',
'UI:DeadlineMissedBy_duration' => 'Elmulsztva %1$s által',
'UI:Deadline_LessThan1Min' => '< 1 perc',
'UI:Deadline_Minutes' => '%1$d perc',
'UI:Deadline_Hours_Minutes' => '%1$dóra %2$dperc',
'UI:Deadline_Days_Hours_Minutes' => '%1$nap %2$dóra %3$dperc',
'UI:Help' => 'Segítség',
'UI:PasswordConfirm' => '(Jóváhagyás)',
'UI:BeforeAdding_Class_ObjectsSaveThisObject' => '%1$s objektumok hozzáadása előtt mentse ezt az objektumot',
'UI:DisplayThisMessageAtStartup' => 'Az üzenet megjelenítése indításkor',
'UI:RelationshipGraph' => 'Grafikus nézet',
'UI:RelationshipList' => 'Lista',
'UI:OperationCancelled' => 'Művelet visszavonva',
'Portal:Title' => 'iTop felhasználói portál',
'Portal:Refresh' => 'Frissítés',
'Portal:Back' => 'Vissza',
'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: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',
'Portal:SelectSubcategoryFrom_Service' => 'Válassza ki a %1$s szolgáltatás alkategóriáját:',
'Portal:PleaseSelectAServiceSubCategory' => 'Kérem válasszon egy alkategóriát',
'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:Button:CloseTicket' => 'Hibajegy lezárása',
'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',
'Portal:AddAttachment' => 'Csatolmány hozzáadása',
'Portal:RemoveAttachment' => 'Csatolmány eltávolítása',
'Portal:Attachment_No_To_Ticket_Name' => 'Csatolmányok: #%1$d a %2$s (%3$s) hibajegyhez',
'Enum:Undefined' => 'Nem meghatározott',
'UI:DurationForm_Days_Hours_Minutes_Seconds' => '%1$s nap %2$s óra %3$s perc %4$s másodperc',
'UI:ModifyAllPageTitle' => 'Összes módosítása',
'UI:Modify_N_ObjectsOf_Class' => '%2$s osztály %1$d objketumainak módosítása',
'UI:Modify_M_ObjectsOf_Class_OutOf_N' => '%2$s osztály %1$d objektumának módosítása, kivéve: %3$d',
'UI:Menu:ModifyAll' => 'Módosítás...',
'UI:Button:ModifyAll' => 'Összes módosítása',
'UI:Button:PreviewModifications' => 'Módosítások előnézete >>',
'UI:ModifiedObject' => 'Objektum módosítva',
'UI:BulkModifyStatus' => 'Művelet',
'UI:BulkModifyStatus+' => '',
'UI:BulkModifyErrors' => 'Hibák (ha vannak)',
'UI:BulkModifyErrors+' => '',
'UI:BulkModifyStatusOk' => 'OK',
'UI:BulkModifyStatusError' => 'Hiba',
'UI:BulkModifyStatusModified' => 'Módosítva',
'UI:BulkModifyStatusSkipped' => 'Átugorva',
'UI:BulkModify_Count_DistinctValues' => '%1$d eltérő értékek:',
'UI:BulkModify:Value_Exists_N_Times' => '%1$s *, %2$d *',
'UI:BulkModify:N_MoreValues' => '%1$d további értékei ...',
'UI:AttemptingToSetAReadOnlyAttribute_Name' => 'Kísérlet a következő csak olvaható mező beállítására: %1$s',
'UI:FailedToApplyStimuli' => 'A művelet sikertelen',
'UI:StimulusModify_N_ObjectsOf_Class' => '%1$s: %3$s osztály %2$d objketumainak módosítása',
'UI:CaseLogTypeYourTextHere' => 'Írjon ide:',
'UI:CaseLog:DateFormat' => 'Y-m-d H:i:s',
'UI:CaseLog:Header_Date_UserName' => '%1$s - %2$s:',
'UI:CaseLog:InitialValue' => 'Kezdeti érték:',
'UI:AttemptingToSetASlaveAttribute_Name' => '%1$s mező nem írható, mert a szinkronizációnál használt kulcs. Érték nem lett beállítva.',
'UI:ActionNotAllowed' => 'Ennek a műveletnek a végrehajtása nem engedélyezett ezen az objektumon.',
'UI:BulkAction:NoObjectSelected' => 'Válasszon ki legalább egy objketumot a művelet végrehajtásához',
'UI:AttemptingToChangeASlaveAttribute_Name' => '%1$s mező nem írható, mert a szinkronizációnál használt kulcs. Érték változatlan maradt.',
));
?>

View File

@@ -0,0 +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
/**
* @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~~',
));
?>

View File

@@ -0,0 +1,773 @@
<?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:AuditRule' => 'Regola di Audit',
'Class:AuditRule+' => '',
'Class:AuditRule/Attribute:name' => 'Nome della regola',
'Class:AuditRule/Attribute:name+' => '',
'Class:AuditRule/Attribute:description' => 'Descrizione della regola di Audit',
'Class:AuditRule/Attribute:description+' => '',
'Class:AuditRule/Attribute:query' => 'Query da eseguire',
'Class:AuditRule/Attribute:query+' => '',
'Class:AuditRule/Attribute:valid_flag' => 'Oggetti validi?',
'Class:AuditRule/Attribute:valid_flag+' => '',
'Class:AuditRule/Attribute:valid_flag/Value:false' => 'falso',
'Class:AuditRule/Attribute:valid_flag/Value:false+' => '',
'Class:AuditRule/Attribute:valid_flag/Value:true' => 'vero',
'Class:AuditRule/Attribute:valid_flag/Value:true+' => '',
'Class:AuditRule/Attribute:category_id' => 'Categoria',
'Class:AuditRule/Attribute:category_id+' => '',
'Class:AuditCategory' => 'Categoria di Audit',
'Class:AuditCategory+' => '',
'Class:AuditCategory/Attribute:name' => 'Nome della Categoria',
'Class:AuditCategory/Attribute:name+' => '',
'Class:AuditCategory/Attribute:description' => 'Descrizione della Categoria di Audit',
'Class:AuditCategory/Attribute:description+' => '',
'Class:AuditCategory/Attribute:definition_set' => 'Insieme di definizione',
'Class:AuditCategory/Attribute:definition_set+' => '',
'Class:AuditCategory/Attribute:rules_list' => 'Regole di Audit',
'Class:AuditCategory/Attribute:rules_list+' => '',
'Class:URP_Profiles' => 'Profilo',
'Class:URP_Profiles+' => '',
'Class:URP_Profiles/Attribute:name' => 'Nome',
'Class:URP_Profiles/Attribute:name+' => '',
'Class:URP_Profiles/Attribute:description' => 'Descrizione',
'Class:URP_Profiles/Attribute:description+' => '',
'Class:URP_Profiles/Attribute:user_list' => 'Utenti',
'Class:URP_Profiles/Attribute:user_list+' => '',
'Class:URP_UserProfile' => 'Utente da Profilare',
'Class:URP_UserProfile+' => '',
'Class:URP_UserProfile/Attribute:userid' => 'Utente',
'Class:URP_UserProfile/Attribute:userid+' => '',
'Class:URP_UserProfile/Attribute:profileid' => 'Profilo',
'Class:URP_UserProfile/Attribute:profileid+' => '',
'Class:URP_UserProfile/Attribute:reason' => 'Motivo',
'Class:URP_UserProfile/Attribute:reason+' => '',
'Class:URP_UserOrg' => 'Organizzazione dell\'utente',
'Class:URP_UserOrg+' => '',
'Class:URP_UserOrg/Attribute:userid' => 'Utente',
'Class:URP_UserOrg/Attribute:userid+' => '',
'Class:URP_UserOrg/Attribute:allowed_org_id' => 'Organizazione',
'Class:URP_UserOrg/Attribute:allowed_org_id+' => '',
'Class:URP_UserOrg/Attribute:reason' => 'Motivo',
'Class:URP_UserOrg/Attribute:reason+' => '',
'Class:URP_ActionGrant' => 'azione_autorizzazione',
'Class:URP_ActionGrant+' => '',
'Class:URP_ActionGrant/Attribute:profileid' => 'Profilo',
'Class:URP_ActionGrant/Attribute:profileid+' => '',
'Class:URP_ActionGrant/Attribute:class' => 'Classe',
'Class:URP_ActionGrant/Attribute:class+' => '',
'Class:URP_ActionGrant/Attribute:permission' => 'Autorizzazione',
'Class:URP_ActionGrant/Attribute:permission+' => '',
'Class:URP_ActionGrant/Attribute:permission/Value:no' => 'no',
'Class:URP_ActionGrant/Attribute:permission/Value:no+' => '',
'Class:URP_ActionGrant/Attribute:permission/Value:yes' => 'yes',
'Class:URP_ActionGrant/Attribute:permission/Value:yes+' => '',
'Class:URP_ActionGrant/Attribute:action' => 'Azione',
'Class:URP_ActionGrant/Attribute:action+' => '',
'Class:URP_StimulusGrant' => 'stimulus_autorizzazione',
'Class:URP_StimulusGrant+' => '',
'Class:URP_StimulusGrant/Attribute:profileid' => 'Profilo',
'Class:URP_StimulusGrant/Attribute:profileid+' => '',
'Class:URP_StimulusGrant/Attribute:class' => 'Classe',
'Class:URP_StimulusGrant/Attribute:class+' => '',
'Class:URP_StimulusGrant/Attribute:permission' => 'Autorizzazione',
'Class:URP_StimulusGrant/Attribute:permission+' => '',
'Class:URP_StimulusGrant/Attribute:permission/Value:no' => 'no',
'Class:URP_StimulusGrant/Attribute:permission/Value:no+' => '',
'Class:URP_StimulusGrant/Attribute:permission/Value:yes' => 'yes',
'Class:URP_StimulusGrant/Attribute:permission/Value:yes+' => '',
'Class:URP_StimulusGrant/Attribute:stimulus' => 'Stimulus',
'Class:URP_StimulusGrant/Attribute:stimulus+' => '',
'Class:URP_AttributeGrant' => 'attributo_autorizzazione',
'Class:URP_AttributeGrant+' => '',
'Class:URP_AttributeGrant/Attribute:actiongrantid' => 'Azione di sovvenzione',
'Class:URP_AttributeGrant/Attribute:actiongrantid+' => '',
'Class:URP_AttributeGrant/Attribute:attcode' => 'Attributo',
'Class:URP_AttributeGrant/Attribute:attcode+' => '',
'Class:AuditRule/Attribute:category_name' => 'Categoria',
'Class:AuditRule/Attribute:category_name+' => '',
'Class:User' => 'User~~',
'Class:User+' => '',
'Class:User/Attribute:finalclass' => 'Tipo di account',
'Class:User/Attribute:finalclass+' => '',
'Class:User/Attribute:contactid' => 'Contatto (persona)',
'Class:User/Attribute:contactid+' => '',
'Class:User/Attribute:last_name' => 'Cognome',
'Class:User/Attribute:last_name+' => '',
'Class:User/Attribute:first_name' => 'Nome',
'Class:User/Attribute:first_name+' => '',
'Class:User/Attribute:email' => 'Email',
'Class:User/Attribute:email+' => '',
'Class:User/Attribute:login' => 'Login',
'Class:User/Attribute:login+' => '',
'Class:User/Attribute:language' => 'Lingua',
'Class:User/Attribute:language+' => '',
'Class:User/Attribute:language/Value:EN US' => 'Inglese',
'Class:User/Attribute:language/Value:EN US+' => '',
'Class:User/Attribute:language/Value:FR FR' => 'Francese',
'Class:User/Attribute:language/Value:FR FR+' => '',
'Class:User/Attribute:profile_list' => 'Profili',
'Class:User/Attribute:profile_list+' => '',
'Class:User/Attribute:allowed_org_list' => 'Organizzazioni autorizzate',
'Class:User/Attribute:allowed_org_list+' => '',
'Class:User/Error:LoginMustBeUnique' => 'Login deve essere unico - "%1s" è già utilizzato.~~',
'Class:User/Error:AtLeastOneProfileIsNeeded' => 'Almeno un profilo deve essere assegnato a questo utente',
'Class:URP_Dimensions' => 'dimensione',
'Class:URP_Dimensions+' => '',
'Class:URP_Dimensions/Attribute:name' => 'Nome',
'Class:URP_Dimensions/Attribute:name+' => '',
'Class:URP_Dimensions/Attribute:description' => 'Descrizione',
'Class:URP_Dimensions/Attribute:description+' => '',
'Class:URP_Dimensions/Attribute:type' => 'Tipo',
'Class:URP_Dimensions/Attribute:type+' => '',
'Class:URP_UserProfile/Attribute:userlogin' => 'Login',
'Class:URP_UserProfile/Attribute:userlogin+' => '',
'Class:URP_UserProfile/Attribute:profile' => 'Profilo',
'Class:URP_UserProfile/Attribute:profile+' => '',
'Class:URP_UserOrg/Attribute:userlogin' => 'Login',
'Class:URP_UserOrg/Attribute:userlogin+' => '',
'Class:URP_UserOrg/Attribute:allowed_org_name' => 'Organizazione',
'Class:URP_UserOrg/Attribute:allowed_org_name+' => '',
'Class:URP_ProfileProjection' => 'profilo_proiezione',
'Class:URP_ProfileProjection+' => '',
'Class:URP_ProfileProjection/Attribute:dimensionid' => 'Dimensione',
'Class:URP_ProfileProjection/Attribute:dimensionid+' => '',
'Class:URP_ProfileProjection/Attribute:dimension' => 'Dimensione',
'Class:URP_ProfileProjection/Attribute:dimension+' => '',
'Class:URP_ProfileProjection/Attribute:profileid' => 'Profilo',
'Class:URP_ProfileProjection/Attribute:profileid+' => '',
'Class:URP_ProfileProjection/Attribute:profile' => 'Profilo',
'Class:URP_ProfileProjection/Attribute:profile+' => '',
'Class:URP_ProfileProjection/Attribute:value' => 'Valore dell\'espressione',
'Class:URP_ProfileProjection/Attribute:value+' => '',
'Class:URP_ProfileProjection/Attribute:attribute' => 'Attributo',
'Class:URP_ProfileProjection/Attribute:attribute+' => '',
'Class:URP_ClassProjection' => 'classe_proiezione',
'Class:URP_ClassProjection+' => '',
'Class:URP_ClassProjection/Attribute:dimensionid' => 'Dimensione',
'Class:URP_ClassProjection/Attribute:dimensionid+' => '',
'Class:URP_ClassProjection/Attribute:dimension' => 'Dimensione',
'Class:URP_ClassProjection/Attribute:dimension+' => '',
'Class:URP_ClassProjection/Attribute:class' => 'Classe',
'Class:URP_ClassProjection/Attribute:class+' => '',
'Class:URP_ClassProjection/Attribute:value' => 'Valore dell\'espressione',
'Class:URP_ClassProjection/Attribute:value+' => '',
'Class:URP_ClassProjection/Attribute:attribute' => 'Attributo',
'Class:URP_ClassProjection/Attribute:attribute+' => '',
'Class:URP_ActionGrant/Attribute:profile' => 'Profilo',
'Class:URP_ActionGrant/Attribute:profile+' => '',
'Class:URP_StimulusGrant/Attribute:profile' => 'Profilo',
'Class:URP_StimulusGrant/Attribute:profile+' => '',
'Menu:WelcomeMenu' => 'Benveuto',
'Menu:WelcomeMenu+' => '',
'Menu:WelcomeMenuPage' => 'Benvenuto',
'Menu:WelcomeMenuPage+' => '',
'UI:WelcomeMenu:Title' => 'Benveuto su iTop',
'UI:WelcomeMenu:LeftBlock' => '<p>iTop è un completo Portale Funzionale IT, Open Source.</p>
<ul>Esso include:
<li>Un completo CMDB (Configuration management database) per documentare e gestire l\'IT di inventario.</li>
<li>Un modulo di gestione degli incidenti per monitorare e comunicare su tutte le problematiche che si verificano nel settore IT.</li>
<li>Un modulo di gestione delle modifiche per pianificare e monitorare i cambiamenti all\'ambiente IT.</li>
<li>Una banca dati errori noti per accelerare la risoluzione di incidenti.</li>
<li>Un modulo di interruzione per documentare tutte le interruzioni pianificate e notificare gli opportuni contatti.</li>
<li>Un cruscotto per ottenere rapidamente una panoramica del sistema IT.</li>
</ul>
<p>Tutti i moduli possono essere installati, passo dopo passo, indipendentemente l\'uno dall\'altro.</p>',
'UI:WelcomeMenu:RightBlock' => '<p>iTop è fornitore di servizi di orientamento, che consente ai progettisti di gestire più o organizzazioni o clienti con facilità.
<ul>>iTop, offre un set ricco di funzionalità dei processi di business che:
<li>Migliora l\'efficacia di gestione IT</li>
<li>Guida le prestazione delle operazioni IT</li>
<li>Migliora la soddisfazione del cliente e fornisce ai dirigenti un idea della performance del business.</li>
</ul>
</p>
<p>iTop è completamente aperto per essere integrato all\'interno della vostra infrastruttura di gestione dell\'IT.</p>
<p>
<ul>L\'adozione di questa nuova generazione di portale funzionale IT vi aiuterà a:
<li>Meglio gestire un ambiente IT sempre più complesso.</li>
<li>Implementare i processi ITIL al proprio ritmo.</li>
<li>Gestire la risorsa più importante della tua IT: Documentazione.</li>
</ul>
</p>',
'UI:WelcomeMenu:AllOpenRequests' => 'Apri le richieste: %1$d',
'UI:WelcomeMenu:MyCalls' => 'Le mie richieste',
'UI:WelcomeMenu:OpenIncidents' => 'Apri gli incidenti: %1$d',
'UI:WelcomeMenu:AllConfigItems' => 'Elementi di Configurazione (CI): %1$d',
'UI:WelcomeMenu:MyIncidents' => 'Incidenti assegnati a me',
'UI:AllOrganizations' => ' Tutte le Organizzazioni ',
'UI:YourSearch' => 'La tua Cerca',
'UI:LoggedAsMessage' => 'Logged come %1$s',
'UI:LoggedAsMessage+Admin' => 'Logged come %1$s (Amministratore)',
'UI:Button:Logoff' => 'Log off',
'UI:Button:GlobalSearch' => 'Cerca',
'UI:Button:Search' => ' Cerca',
'UI:Button:Query' => ' Domanda',
'UI:Button:Ok' => 'Ok',
'UI:Button:Cancel' => 'Cancella',
'UI:Button:Apply' => 'Applica',
'UI:Button:Back' => ' << Indietro',
'UI:Button:Restart' => ' |<< Riavvia',
'UI:Button:Next' => ' Prossimo >> ',
'UI:Button:Finish' => ' Fine',
'UI:Button:DoImport' => ' Esegui le Imporazioni ! ~~',
'UI:Button:Done' => ' Fatto',
'UI:Button:SimulateImport' => ' Simula l\'Importazione ~~',
'UI:Button:Test' => 'Testa!',
'UI:Button:Evaluate' => ' Valuta',
'UI:Button:AddObject' => ' Aggiungi... ~~',
'UI:Button:BrowseObjects' => ' Sfoglia... ~~',
'UI:Button:Add' => ' Aggiungi ~~',
'UI:Button:AddToList' => ' << Aggiungi ~~',
'UI:Button:RemoveFromList' => ' Rimuovi >> ~~',
'UI:Button:FilterList' => ' Filtra... ~~',
'UI:Button:Create' => ' Crea ~~',
'UI:Button:Delete' => ' Cancella ! ~~',
'UI:Button:ChangePassword' => ' Cambia Password ~~',
'UI:Button:ResetPassword' => ' Resetta Password ~~',
'UI:SearchToggle' => 'Cerca',
'UI:ClickToCreateNew' => 'Crea un nuovo %1$s~~',
'UI:SearchFor_Class' => 'Cerca l\'oggetto %1$s',
'UI:NoObjectToDisplay' => 'Nessun oggetto da mostrare.',
'UI:Error:MandatoryTemplateParameter_object_id' => 'Object_id parametro è obbligatorio quando link_attr è specificato. Verificare la definizione del modello di display.',
'UI:Error:MandatoryTemplateParameter_target_attr' => 'Target_attr parametro è obbligatorio quando link_attr è specificato. Verificare la definizione del modello di display.',
'UI:Error:MandatoryTemplateParameter_group_by' => 'Il parametro è group_by obbligatoria. Verificare la definizione del modello di display.',
'UI:Error:InvalidGroupByFields' => 'Elenco di campi non valido per il raggruppamento: "%1$s".',
'UI:Error:UnsupportedStyleOfBlock' => 'Errore: Stile non supportato di blocco: "%1$s".',
'UI:Error:IncorrectLinkDefinition_LinkedClass_Class' => 'Errata definizione di link: la classe di oggetti da gestire: %1$s non è stato trovato come chiave esterna nella classe %2$s',
'UI:Error:Object_Class_Id_NotFound' => 'Oggetto: %1$s:%2$d non trovato.',
'UI:Error:WizardCircularReferenceInDependencies' => 'Errore: Riferimento circolare nelle dipendenze tra i campi, controllare il modello di dati.',
'UI:Error:UploadedFileTooBig' => 'Il file caricato è troppo grande. (dimensione massima consentita è di %1$s). Verificare di configurazione di PHP per upload_max_filesize e post_max_size.',
'UI:Error:UploadedFileTruncated.' => 'Il file caricato è stata troncato !',
'UI:Error:NoTmpDir' => 'La directory temporanea non è definita.',
'UI:Error:CannotWriteToTmp_Dir' => 'Impossibile scrivere il file temporaneo sul disco. upload_tmp_dir = "%1$s".',
'UI:Error:UploadStoppedByExtension_FileName' => 'Caricamento fermato per estensione. (Nome del file originale = "%1$s").',
'UI:Error:UploadFailedUnknownCause_Code' => 'Il caricamento del file non riuscito, causa sconosciuta. (Codice errore = "%1$s").',
'UI:Error:1ParametersMissing' => 'Errore: il seguente parametro deve essere specificato per questa operazione: %1$s.',
'UI:Error:2ParametersMissing' => 'Errore: i seguenti parametri devono essere specificati per questa operazione: %1$s e %2$s.',
'UI:Error:3ParametersMissing' => 'Errore: i seguenti parametri devono essere specificati per questa operazione: %1$s, %2$s e %3$s.',
'UI:Error:4ParametersMissing' => 'Errore: i seguenti parametri devono essere specificati per questa operazione: %1$s, %2$s, %3$s e %4$s.',
'UI:Error:IncorrectOQLQuery_Message' => 'Errore: errata OQL query: %1$s',
'UI:Error:AnErrorOccuredWhileRunningTheQuery_Message' => 'Si è verificato un errore durante l\'esecuzione della query: %1$s',
'UI:Error:ObjectAlreadyUpdated' => 'Errore: l\'oggetto è già stato aggiornato.',
'UI:Error:ObjectCannotBeUpdated' => 'Errore: oggetto non può essere aggiornato.',
'UI:Error:ObjectsAlreadyDeleted' => 'Errore: gli oggetti sono già stati eliminati!',
'UI:Error:BulkDeleteNotAllowedOn_Class' => 'Non hai i permessi per eseguire una eliminazione collettiva degli oggetti della classe %1$s',
'UI:Error:DeleteNotAllowedOn_Class' => 'Non ti è permesso di eliminare gli oggetti della classe %1$s',
'UI:Error:BulkModifyNotAllowedOn_Class' => 'Non hai i permessi per eseguire un aggiornamento collettivo degli oggetti della classe %1$s',
'UI:Error:ObjectAlreadyCloned' => 'Errore: l\'oggetto è già stato clonato!',
'UI:Error:ObjectAlreadyCreated' => 'Errore: l\'oggetto è già stato creato!',
'UI:Error:Invalid_Stimulus_On_Object_In_State' => 'Errore: stimolo non valido "%1$s" su un oggetto %2$s nello stato "%3$s".',
'UI:GroupBy:Count' => 'Conteggio',
'UI:GroupBy:Count+' => '',
'UI:CountOfObjects' => '%1$d oggetti corrispondenti ai criteri.',
'UI_CountOfObjectsShort' => '%1$d oggetti.',
'UI:NoObject_Class_ToDisplay' => 'No %1$s da visualizzare',
'UI:History:LastModified_On_By' => 'Ultima modifica %1$s da %2$s.',
'UI:HistoryTab' => 'Storia',
'UI:NotificationsTab' => 'Notifiche',
'UI:History:BulkImports' => 'Storia',
'UI:History:BulkImports+' => 'Elenco delle importazioni CSV (primo ultimo)',
'UI:History:BulkImportDetails' => 'Modifiche derivanti dai importazione CSV eseguita su %1$s (da %2$s)',
'UI:History:Date' => 'Data',
'UI:History:Date+' => '',
'UI:History:User' => 'Utente',
'UI:History:User+' => '',
'UI:History:Changes' => 'Modifiche',
'UI:History:Changes+' => '',
'UI:History:StatsCreations' => 'Creato',
'UI:History:StatsCreations+' => '',
'UI:History:StatsModifs' => 'Modificato',
'UI:History:StatsModifs+' => '',
'UI:History:StatsDeletes' => 'Cancellato',
'UI:History:StatsDeletes+' => '',
'UI:Loading' => 'Caricamento...',
'UI:Menu:Actions' => 'Azioni',
'UI:Menu:New' => 'Nuovo...',
'UI:Menu:Add' => 'Aggiungi...',
'UI:Menu:Manage' => 'Gestischi...',
'UI:Menu:EMail' => 'eMail',
'UI:Menu:CSVExport' => 'CSV Export',
'UI:Menu:Modify' => 'Modifica...',
'UI:Menu:Delete' => 'Cancella...',
'UI:Menu:BulkDelete' => 'Cancella...',
'UI:UndefinedObject' => 'non definito',
'UI:Document:OpenInNewWindow:Download' => 'Apri in una nuova finestra: %1$s, Scarica: %2$s',
'UI:SelectAllToggle+' => '',
'UI:TruncatedResults' => '%1$d oggetti visualizzati su %2$d',
'UI:DisplayAll' => 'Mostra tutto',
'UI:CollapseList' => 'Collassa',
'UI:CountOfResults' => '%1$d oggetto(i)',
'UI:ChangesLogTitle' => 'Log delle modifiche (%1$d):',
'UI:EmptyChangesLogTitle' => 'Log delle modifiche è vuoto',
'UI:SearchFor_Class_Objects' => 'Cerca per %1$s Oggetti',
'UI:OQLQueryBuilderTitle' => 'OQL Query Builder',
'UI:OQLQueryTab' => 'OQL Query',
'UI:SimpleSearchTab' => 'Ricerca semplice',
'UI:Details+' => '',
'UI:SearchValue:Any' => '* Qualsiasi *',
'UI:SearchValue:Mixed' => '* misti *',
'UI:SelectOne' => '-- selezionare uno --',
'UI:Login:Welcome' => 'Benvenuti su iTop!',
'UI:Login:IncorrectLoginPassword' => 'Errato login/password, si prega di riprovare.',
'UI:Login:IdentifyYourself' => 'Identifica te stesso prima di continuare',
'UI:Login:UserNamePrompt' => 'Nome Utente',
'UI:Login:PasswordPrompt' => 'Password',
'UI:Login:ChangeYourPassword' => 'Cambia la tua password',
'UI:Login:OldPasswordPrompt' => 'Vecchia password',
'UI:Login:NewPasswordPrompt' => 'Nuova password',
'UI:Login:RetypeNewPasswordPrompt' => 'Riscrivi la nuova password',
'UI:Login:IncorrectOldPassword' => 'Errore: la vecchia password non è corretta',
'UI:LogOffMenu' => 'Log off',
'UI:LogOff:ThankYou' => 'Grazie per aver scelto iTop',
'UI:LogOff:ClickHereToLoginAgain' => 'Clicca qui per effettuare il login di nuovo...',
'UI:ChangePwdMenu' => 'Cambia Password...',
'UI:AccessRO-All' => 'iTop è di sola lettura',
'UI:AccessRO-Users' => 'iTop è di sola lettura per gli utenti finali',
'UI:Login:RetypePwdDoesNotMatch' => 'Nuova password e la nuova password digitata nuovamente non corrispondono !',
'UI:Button:Login' => 'Entra in iTop',
'UI:Login:Error:AccessRestricted' => 'L\'accesso a iTop è limitato. Si prega di contattare un amministratore iTop.',
'UI:Login:Error:AccessAdmin' => 'Accesso limitato alle persone che hanno privilegi di amministratore. Si prega di contattare un amministratore iTop.',
'UI:CSVImport:MappingSelectOne' => '-- seleziona uno --',
'UI:CSVImport:MappingNotApplicable' => '-- ignora questo campo --',
'UI:CSVImport:NoData' => 'Insieme di dati vuoto ..., si prega di fornire alcuni dati!',
'UI:Title:DataPreview' => 'Anteprima dati',
'UI:CSVImport:ErrorOnlyOneColumn' => 'Errore: I dati contengono solo una colonna. Avete selezionato il carattere separatore appropriato?',
'UI:CSVImport:FieldName' => 'Campo %1$d',
'UI:CSVImport:DataLine1' => 'Dati Linea 1',
'UI:CSVImport:DataLine2' => 'Dati Linea 2',
'UI:CSVImport:idField' => 'id (Chiave Primaria)',
'UI:Title:BulkImport' => 'iTop - importazione collettiva',
'UI:Title:BulkImport+' => '',
'UI:Title:BulkSynchro_nbItem_ofClass_class' => 'Sincronizzazione di %1$d oggetti della classe %2$s',
'UI:CSVImport:ClassesSelectOne' => '-- seleziona uno --',
'UI:CSVImport:ErrorExtendedAttCode' => 'Errore interno: "%1$s" è un codice errato, perché "%2$s" NON è una chiave esterna della classe "%3$s"',
'UI:CSVImport:ObjectsWillStayUnchanged' => '%1$d oggetto(i) rimarrà invariato.',
'UI:CSVImport:ObjectsWillBeModified' => '%1$d oggetto(i) sarà modificato.',
'UI:CSVImport:ObjectsWillBeAdded' => '%1$d oggetto(i) sarà aggiunto.',
'UI:CSVImport:ObjectsWillHaveErrors' => '%1$d oggetto(i) avranno i errori.',
'UI:CSVImport:ObjectsRemainedUnchanged' => '%1$d oggetto(i) è rimasto invariato.',
'UI:CSVImport:ObjectsWereModified' => '%1$d oggetto(i) sono stati modificati.',
'UI:CSVImport:ObjectsWereAdded' => '%1$d oggetto(i) sono stati aggiunti.',
'UI:CSVImport:ObjectsHadErrors' => '%1$d oggetto(i) hanno avuto errori.',
'UI:Title:CSVImportStep2' => 'Step 2 of 5: opzioni dati CVS',
'UI:Title:CSVImportStep3' => 'Step 3 of 5: Mappatura dei dati',
'UI:Title:CSVImportStep4' => 'Step 4 of 5: Importa simulazione',
'UI:Title:CSVImportStep5' => 'Step 5 of 5: Importazione completata',
'UI:CSVImport:LinesNotImported' => 'Linee che non possono essere caricate:',
'UI:CSVImport:LinesNotImported+' => '',
'UI:CSVImport:SeparatorComma+' => '',
'UI:CSVImport:SeparatorSemicolon+' => '',
'UI:CSVImport:SeparatorTab+' => '',
'UI:CSVImport:SeparatorOther' => 'altri:',
'UI:CSVImport:QualifierDoubleQuote+' => '',
'UI:CSVImport:QualifierSimpleQuote+' => '',
'UI:CSVImport:QualifierOther' => 'other:~~',
'UI:CSVImport:TreatFirstLineAsHeader' => 'Tratta la prima riga come intestazione (nomi di colonna)',
'UI:CSVImport:Skip_N_LinesAtTheBeginning' => 'Salta le linee %1$s all\'inzio del file',
'UI:CSVImport:CSVDataPreview' => 'CSV Anteprima dei dati',
'UI:CSVImport:SelectFile' => 'Selezionare il file da importare:',
'UI:CSVImport:Tab:LoadFromFile' => 'Carica da un file',
'UI:CSVImport:Tab:CopyPaste' => 'Copia e incolla i dati',
'UI:CSVImport:Tab:Templates' => 'Modelli',
'UI:CSVImport:PasteData' => 'Incolla i dati da importare:',
'UI:CSVImport:PickClassForTemplate' => 'Scegli il modello da scaricare: ',
'UI:CSVImport:SeparatorCharacter' => 'Separatore di carattere:',
'UI:CSVImport:TextQualifierCharacter' => 'Testo di qualificazione carattere',
'UI:CSVImport:CommentsAndHeader' => 'Commenti e intestazione',
'UI:CSVImport:SelectClass' => 'Selezionare la classe da importare:',
'UI:CSVImport:AdvancedMode' => 'Modalità avanzata',
'UI:CSVImport:AdvancedMode+' => '',
'UI:CSVImport:SelectAClassFirst' => 'Per configurare il mapping, selezionare prima una classe.',
'UI:CSVImport:HeaderFields' => 'Campi',
'UI:CSVImport:HeaderMappings' => 'Mappings',
'UI:CSVImport:HeaderSearch' => 'Cerca?',
'UI:CSVImport:AlertIncompleteMapping' => 'Per favore seleziona una mappatura per ogni campo.',
'UI:CSVImport:AlertNoSearchCriteria' => 'Per favore seleziona almeno un criterio di ricerca',
'UI:CSVImport:Encoding' => 'Codifica dei caratteri',
'UI:UniversalSearchTitle' => 'iTop - Ricerca Universale',
'UI:UniversalSearch:Error' => 'Errore: %1$s~~',
'UI:UniversalSearch:LabelSelectTheClass' => 'Seleziona la classe per la ricerca: ',
'UI:Audit:Title' => 'iTop - CMDB Audit~~',
'UI:Audit:InteractiveAudit' => 'Audit Interattivo',
'UI:Audit:HeaderAuditRule' => 'Regole di Audit',
'UI:Audit:HeaderNbObjects' => '# Oggetti',
'UI:Audit:HeaderNbErrors' => '# Errori',
'UI:Audit:PercentageOk' => '% Ok',
'UI:RunQuery:Title' => 'iTop - Valutazione Query OQL',
'UI:RunQuery:QueryExamples' => 'Esempi di Query',
'UI:RunQuery:HeaderPurpose' => 'Scopo',
'UI:RunQuery:HeaderPurpose+' => '',
'UI:RunQuery:HeaderOQLExpression' => 'Espressioni OQL',
'UI:RunQuery:HeaderOQLExpression+' => '',
'UI:RunQuery:ExpressionToEvaluate' => 'Espressione da valutare: ',
'UI:RunQuery:MoreInfo' => 'Maggiori informazioni sulla query: ',
'UI:RunQuery:DevelopedQuery' => 'Espressione della query riqualificata:',
'UI:RunQuery:SerializedFilter' => 'Filtro pubblicato: ',
'UI:RunQuery:Error' => 'Si è verificato un errore durante l\'esecuzione della query: %1$s',
'UI:Schema:Title' => 'iTop schema degli oggetti',
'UI:Schema:CategoryMenuItem' => 'Categoria <b>%1$s</b>',
'UI:Schema:Relationships' => 'Relazioni',
'UI:Schema:AbstractClass' => 'Classe astratta: nessun oggetto da questa classe può essere istanziato.',
'UI:Schema:NonAbstractClass' => 'Classe non-astratta: oggetti da questa classe possono essere istanziati.',
'UI:Schema:ClassHierarchyTitle' => 'Gerarchia delle classi',
'UI:Schema:AllClasses' => 'Tutte le classi',
'UI:Schema:ExternalKey_To' => 'Chiave esterna %1$s',
'UI:Schema:Columns_Description' => 'Colonne: <em>%1$s</em>',
'UI:Schema:Default_Description' => 'Default: "%1$s"',
'UI:Schema:NullAllowed' => 'Null consentito',
'UI:Schema:NullNotAllowed' => 'Null NON consentito',
'UI:Schema:Attributes' => 'Attributi',
'UI:Schema:AttributeCode' => 'Codice attributo',
'UI:Schema:AttributeCode+' => '',
'UI:Schema:Label' => 'Etichetta',
'UI:Schema:Label+' => '',
'UI:Schema:Type' => 'Tipo',
'UI:Schema:Type+' => '',
'UI:Schema:Origin' => 'Origine',
'UI:Schema:Origin+' => '',
'UI:Schema:Description' => 'Descrizione',
'UI:Schema:Description+' => '',
'UI:Schema:AllowedValues' => 'Valori consentiti',
'UI:Schema:AllowedValues+' => '',
'UI:Schema:MoreInfo' => 'Maggiori informazioni',
'UI:Schema:MoreInfo+' => '',
'UI:Schema:SearchCriteria' => 'Criteri di ricerca',
'UI:Schema:FilterCode' => 'Codice di filtro',
'UI:Schema:FilterCode+' => '',
'UI:Schema:FilterDescription' => 'Descrizione',
'UI:Schema:FilterDescription+' => '',
'UI:Schema:AvailOperators' => 'Operatori disponibili',
'UI:Schema:AvailOperators+' => '',
'UI:Schema:ChildClasses' => 'Classi figlio',
'UI:Schema:ReferencingClasses' => 'Classi di rifermento',
'UI:Schema:RelatedClasses' => 'Classi correlate',
'UI:Schema:LifeCycle' => 'Ciclo di vita',
'UI:Schema:Triggers' => 'Triggers',
'UI:Schema:Relation_Code_Description' => 'Relazione <em>%1$s</em> (%2$s)',
'UI:Schema:RelationDown_Description' => 'Giù: %1$s',
'UI:Schema:RelationUp_Description' => 'Su: %1$s',
'UI:Schema:RelationPropagates' => '%1$s: propagato al livello %2$d, query: %3$s',
'UI:Schema:RelationDoesNotPropagate' => '%1$s: non si propaga a (%2$d livelli), query: %3$s',
'UI:Schema:Class_ReferencingClasses_From_By' => '%1$s fa riferimento la classe %2$s tramite il campo %3$s',
'UI:Schema:Class_IsLinkedTo_Class_Via_ClassAndAttribute' => '%1$s è legata alla %2$s via %3$s::<em>%4$s</em>',
'UI:Schema:Links:1-n' => 'Classi che puntano a %1$s (1:n links):',
'UI:Schema:Links:n-n' => 'Classi legati alla %1$s (n:n links):',
'UI:Schema:Links:All' => 'Grafico di tutte le classi correlate',
'UI:Schema:NoLifeCyle' => 'Non vi è alcun ciclo di vita definito per questa classe.',
'UI:Schema:LifeCycleTransitions' => 'Transizioni',
'UI:Schema:LifeCyleAttributeOptions' => 'Opzioni per l\'attributo',
'UI:Schema:LifeCycleHiddenAttribute' => 'Nascosto',
'UI:Schema:LifeCycleReadOnlyAttribute' => 'Di sola lettura',
'UI:Schema:LifeCycleMandatoryAttribute' => 'Obbigatorio',
'UI:Schema:LifeCycleAttributeMustChange' => 'Deve cambiare',
'UI:Schema:LifeCycleAttributeMustPrompt' => 'All\'utente verrà richiesto di modificare il valore',
'UI:Schema:LifeCycleEmptyList' => 'lista vuota',
'UI:LinksWidget:Autocomplete+' => '',
'UI:Combo:SelectValue' => '--- seleziona un valore ---',
'UI:Label:SelectedObjects' => 'oggetti selezionati: ',
'UI:Label:AvailableObjects' => 'Oggetti disponibili: ',
'UI:Link_Class_Attributes' => '%1$s attributi',
'UI:AddObjectsOf_Class_LinkedWith_Class_Instance' => 'Aggiungi l\'oggeto %1$s collegato con %2$s: %3$s',
'UI:AddObjectsOf_Class_LinkedWith_Class' => 'Aggiungi l\'oggeto %1$s al collegamento con %2$s',
'UI:ManageObjectsOf_Class_LinkedWith_Class_Instance' => 'Gestisci l\'oggetto %1$s collegato con %2$s: %3$s',
'UI:AddLinkedObjectsOf_Class' => 'Aggiungi %1$s...',
'UI:RemoveLinkedObjectsOf_Class' => 'Rimuovi gli oggetti selezionati',
'UI:Message:EmptyList:UseAdd' => 'La lista è vuota, utilizzare il pulsante "Aggiungi ..." per aggiungere elementi.',
'UI:Message:EmptyList:UseSearchForm' => 'Utilizza il modulo di ricerca qui sopra per cercare oggetti da aggiungere.',
'UI:Wizard:FinalStepTitle' => 'Passo finale: la conferma',
'UI:Title:DeletionOf_Object' => 'Soppressione di %1$s',
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'Cancellazione collettiva di %1$d oggetti della classe %2$s',
'UI:Delete:NotAllowedToDelete' => 'Non ti è permesso di eliminare l\'oggetto',
'UI:Delete:NotAllowedToUpdate_Fields' => 'Non hai i permessi per aggiornare il seguente campo(i): %1$s',
'UI:Error:NotEnoughRightsToDelete' => 'Questo oggetto non può essere cancellato perché l\'utente corrente non dispone dei diritti necessari',
'UI:Error:CannotDeleteBecause' => 'Questo oggetto non può essere cancellato perchè: %1$s~~',
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Questo oggetto non può essere cancellato perché alcune operazioni manuali devono essere effettuate prima di questo',
'UI:Error:CannotDeleteBecauseManualOpNeeded' => 'Questo oggetto non può essere cancellato perché alcune operazioni manuali devono essere effettuate prima di questo',
'UI:Archive_User_OnBehalfOf_User' => '%1$s a nome di %2$s',
'UI:Delete:Deleted' => 'deleted~~',
'UI:Delete:AutomaticallyDeleted' => 'automaticamente eliminato',
'UI:Delete:AutomaticResetOf_Fields' => 'ripristino automatico del campo(i): %1$s',
'UI:Delete:CleaningUpRefencesTo_Object' => 'Pulizia di tutti i riferimenti a %1$s...',
'UI:Delete:CleaningUpRefencesTo_Several_ObjectsOf_Class' => 'Pulizia di tutti i riferimenti a %1$d oggetti di classe %2$s...',
'UI:Delete:Done+' => '',
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s cancellato.',
'UI:Delete:ConfirmDeletionOf_Name' => 'Soppressione di %1$s',
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Soppressione di %1$d oggetti di classe %2$s',
'UI:Delete:CannotDeleteBecause' => 'Non può essere cancellato: %1$s~~',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Dovrebbe essere eliminato automaticamente, ma questo non è fattibile: %1$s~~',
'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Deve essere cancellato manualmente, ma questo non è fattibile: %1$s~~',
'UI:Delete:WillBeDeletedAutomatically' => 'Sarà cancellato automaticamente',
'UI:Delete:MustBeDeletedManually' => 'Deve essere cancellato manualmente',
'UI:Delete:CannotUpdateBecause_Issue' => 'Dovrebbero essere automaticamente aggiornati, ma: %1$s~~',
'UI:Delete:WillAutomaticallyUpdate_Fields' => 'Sarà automaticamente aggiornato (reset: %1$s)~~',
'UI:Delete:Count_Objects/LinksReferencing_Object' => '%1$d oggetti/link fanno riferimento %2$s',
'UI:Delete:Count_Objects/LinksReferencingTheObjects' => '%1$d oggetti / link fanno riferimento alcuni degli oggetti da eliminare',
'UI:Delete:ReferencesMustBeDeletedToEnsureIntegrity' => 'Per garantire l\'integrità del database, ogni riferimento dovrebbe essere ulteriormente eliminato',
'UI:Delete:Consequence+' => '',
'UI:Delete:SorryDeletionNotAllowed' => 'Spiacenti, non sei autorizzato a cancellare questo oggetto, vedere le spiegazioni di cui sopra',
'UI:Delete:PleaseDoTheManualOperations' => 'Si prega di eseguire le operazioni manuali di cui sopra prima di richiedere la cancellazione di questo oggetto',
'UI:Delect:Confirm_Object' => 'Si prega di confermare che si desidera eliminare %1$s.',
'UI:Delect:Confirm_Count_ObjectsOf_Class' => 'Si prega di confermare che si desidera eliminare i seguenti oggetti %1$d della classe %2$s.',
'UI:WelcomeToITop' => 'Benvenuto su iTop',
'UI:DetailsPageTitle' => 'iTop - %1$s - %2$s dettagli',
'UI:ErrorPageTitle' => 'iTop - Errore',
'UI:ObjectDoesNotExist' => 'Spiacenti, questo oggetto non esiste (o non si è autorizzati per vederlo).',
'UI:SearchResultsPageTitle' => 'iTop - Risultati della ricerca',
'UI:Search:NoSearch' => 'Niente da ricercare',
'UI:FullTextSearchTitle_Text' => 'Risultati per "%1$s":',
'UI:Search:Count_ObjectsOf_Class_Found' => 'Trovato l\'oggetto(i) %1$d della classe %2$s.',
'UI:Search:NoObjectFound' => 'Nessun oggetto trovato.',
'UI:ModificationPageTitle_Object_Class' => 'iTop - %1$s - %2$s modifica',
'UI:ModificationTitle_Class_Object' => 'Modifica di %1$s: <span class=\"hilite\">%2$s</span>',
'UI:ClonePageTitle_Object_Class' => 'iTop - Clone %1$s - %2$s modifica',
'UI:CloneTitle_Class_Object' => 'Clone di %1$s: <span class=\"hilite\">%2$s</span>',
'UI:CreationPageTitle_Class' => 'iTop - Creazione di un nuovo %1$s ',
'UI:CreationTitle_Class' => 'Creazione di un nuovo %1$s',
'UI:SelectTheTypeOf_Class_ToCreate' => 'Seleziona il tipo di %1$s da creare:',
'UI:Class_Object_NotUpdated' => 'Nessun cambiamento rilevato, %1$s (%2$s) <strong>non</strong> è stato modificato.',
'UI:Class_Object_Updated' => '%1$s (%2$s) aggiornato.',
'UI:BulkDeletePageTitle' => 'iTop - Eliminazione collettiva',
'UI:BulkDeleteTitle' => 'Seleziona gli oggetti che si desidera eliminare:',
'UI:PageTitle:ObjectCreated' => 'iTop Oggetto Creato.',
'UI:Title:Object_Of_Class_Created' => '%1$s - %2$s creato.',
'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => 'Applicazione %1$s all\'oggetto: %2$s nello stato %3$s allo stato target: %4$s.',
'UI:ObjectCouldNotBeWritten' => 'L\'oggetto non può essere scritto: %1$s~~',
'UI:PageTitle:FatalError' => 'iTop - Fatal Error',
'UI:SystemIntrusion' => 'Accesso negato. Hai cercato di eseguire un\'operazione che non ti è consentita.',
'UI:FatalErrorMessage' => 'Fatal error, iTop non può continuare.',
'UI:Error_Details' => 'Errore: %1$s.',
'UI:PageTitle:ClassProjections' => 'iTop gestione degli utenti - proiezioni classe',
'UI:PageTitle:ProfileProjections' => 'iTop gestione degli utenti - proiezioni profilo',
'UI:UserManagement:Class' => 'Classe',
'UI:UserManagement:Class+' => '',
'UI:UserManagement:ProjectedObject' => 'Oggetto',
'UI:UserManagement:ProjectedObject+' => '',
'UI:UserManagement:AnyObject' => '* qualsiasi *',
'UI:UserManagement:User' => 'Utente',
'UI:UserManagement:User+' => '',
'UI:UserManagement:Profile' => 'Profilo',
'UI:UserManagement:Profile+' => '',
'UI:UserManagement:Action:Read' => 'Leggi',
'UI:UserManagement:Action:Read+' => '',
'UI:UserManagement:Action:Modify' => 'Modifica',
'UI:UserManagement:Action:Modify+' => '',
'UI:UserManagement:Action:Delete' => 'Cancella',
'UI:UserManagement:Action:Delete+' => '',
'UI:UserManagement:Action:BulkRead' => 'Leggi Bulk (Export)',
'UI:UserManagement:Action:BulkRead+' => '',
'UI:UserManagement:Action:BulkModify' => 'Modifica Bulk',
'UI:UserManagement:Action:BulkModify+' => '',
'UI:UserManagement:Action:BulkDelete' => 'Cancella Bulk ',
'UI:UserManagement:Action:BulkDelete+' => '',
'UI:UserManagement:Action:Stimuli' => 'Stimoli',
'UI:UserManagement:Action:Stimuli+' => '',
'UI:UserManagement:Action' => 'Azione',
'UI:UserManagement:Action+' => '',
'UI:UserManagement:TitleActions' => 'Azioni',
'UI:UserManagement:Permission' => 'Autorizzazione',
'UI:UserManagement:Permission+' => '',
'UI:UserManagement:Attributes' => 'Attributi',
'UI:UserManagement:ActionAllowed:Yes' => 'Si',
'UI:UserManagement:ActionAllowed:No' => 'No',
'UI:UserManagement:AdminProfile+' => '',
'UI:UserManagement:NoLifeCycleApplicable' => 'N/A',
'UI:UserManagement:NoLifeCycleApplicable+' => '',
'UI:UserManagement:GrantMatrix' => 'Grant Matrix',
'UI:UserManagement:LinkBetween_User_And_Profile' => 'Collegamento tra %1$s e %2$s',
'UI:UserManagement:LinkBetween_User_And_Org' => 'Collegamento tra %1$s e %2$s',
'Menu:AdminTools' => 'Strumenti di amministrazione',
'Menu:AdminTools+' => '',
'Menu:AdminTools?' => 'Strumenti accessibile solo agli utenti con il profilo di amministratore',
'UI:ChangeManagementMenu' => 'Gestione Cambi',
'UI:ChangeManagementMenu+' => '',
'UI:ChangeManagementMenu:Title' => 'Panoramica dei cambi',
'UI-ChangeManagementMenu-ChangesByType' => 'Cambi per tipo',
'UI-ChangeManagementMenu-ChangesByStatus' => 'Cambi per stato',
'UI-ChangeManagementMenu-ChangesByWorkgroup' => 'Cambi per gruppi di lavoro',
'UI-ChangeManagementMenu-ChangesNotYetAssigned' => 'Cambi non ancora assegnati',
'UI:ConfigurationItemsMenu' => 'Configuration Items',
'UI:ConfigurationItemsMenu+' => '',
'UI:ConfigurationItemsMenu:Title' => 'Configuration Items Panoramica',
'UI-ConfigurationItemsMenu-ServersByCriticity' => 'Server per criticità',
'UI-ConfigurationItemsMenu-PCsByCriticity' => 'PCs per criticità',
'UI-ConfigurationItemsMenu-NWDevicesByCriticity' => 'Dispositivi di rete per criticità',
'UI-ConfigurationItemsMenu-ApplicationsByCriticity' => 'Applicazioni per criticità',
'UI:ConfigurationManagementMenu' => 'Gestione Configurazione',
'UI:ConfigurationManagementMenu+' => '',
'UI:ConfigurationManagementMenu:Title' => 'Panoramica delle infrastrutture',
'UI-ConfigurationManagementMenu-InfraByType' => 'Oggetti infrastruttutura per tipo',
'UI-ConfigurationManagementMenu-InfraByStatus' => 'Oggetti infrastruttutura per stato',
'UI:ConfigMgmtMenuOverview:Title' => 'Cruscotto per Gestione configurazione',
'UI-ConfigMgmtMenuOverview-FunctionalCIbyStatus' => 'Configuration Items per stato',
'UI-ConfigMgmtMenuOverview-FunctionalCIByType' => 'Configuration Items per tipo',
'UI:RequestMgmtMenuOverview:Title' => 'Cruscotto per Gestione Richieste',
'UI-RequestManagementOverview-RequestByService' => 'Richieste degli utenti per servizio',
'UI-RequestManagementOverview-RequestByPriority' => 'Richieste degli utenti per priorità',
'UI-RequestManagementOverview-RequestUnassigned' => 'Richieste degli utenti non ancora assegnate ad un agente',
'UI:IncidentMgmtMenuOverview:Title' => 'Cruscotto Gestione degli Incidenti',
'UI-IncidentManagementOverview-IncidentByService' => 'Incidenti per servizio',
'UI-IncidentManagementOverview-IncidentByPriority' => 'Incidenti per priorità',
'UI-IncidentManagementOverview-IncidentUnassigned' => 'Incidenti non ancora assegnati ad un agente',
'UI:ChangeMgmtMenuOverview:Title' => 'Cruscotto per Gestione dei Cambi',
'UI-ChangeManagementOverview-ChangeByType' => 'Cambi per tipo',
'UI-ChangeManagementOverview-ChangeUnassigned' => 'Cambi non ancora assegnati ad un agente',
'UI-ChangeManagementOverview-ChangeWithOutage' => 'Interruzioni dovute ai cambi',
'UI:ServiceMgmtMenuOverview:Title' => 'Cruscotto per Gestione dei Cambi',
'UI-ServiceManagementOverview-CustomerContractToRenew' => 'Contratti con i clienti da rinnovarsi in 30 giorni',
'UI-ServiceManagementOverview-ProviderContractToRenew' => 'Contratti con i fornitori da rinnovarsi in 30 giorni',
'UI:ContactsMenu' => 'Contatti',
'UI:ContactsMenu+' => '',
'UI:ContactsMenu:Title' => 'Contatti Panoramica',
'UI-ContactsMenu-ContactsByLocation' => 'Contatti per localizzazione',
'UI-ContactsMenu-ContactsByType' => 'Contatti per tipo',
'UI-ContactsMenu-ContactsByStatus' => 'Contatti per stato',
'Menu:CSVImportMenu' => 'Importazione CSV',
'Menu:CSVImportMenu+' => '',
'Menu:DataModelMenu' => 'Modello Dati',
'Menu:DataModelMenu+' => '',
'Menu:ExportMenu' => 'Esporta',
'Menu:ExportMenu+' => '',
'Menu:NotificationsMenu' => 'Notifiche',
'Menu:NotificationsMenu+' => '',
'UI:NotificationsMenu:Title' => 'Configurazione delle <span class="hilite">Notifiche</span>',
'UI:NotificationsMenu:Help' => 'Aiuto',
'UI:NotificationsMenu:HelpContent' => '<p>In iTop le notifiche sono completamente personalizzabili. Essi si basano su due serie di oggetti: <i>trigger e azioni</i>.</p>
<p><i><b>Triggers</b></i> per definire quando una notifica verrà eseguita. Ci sono 3 tipi di trigger per la copertura di 3 fasi differenti del ciclo di vita di un oggetto:
<ol>
<li>the "OnCreate" trigger vengono eseguiti quando un oggetto della classe specificata viene creata</li>
<li>the "OnStateEnter" trigger vengono eseguiti prima che un oggetto della classe data entra in uno stato specifico (provenienti da un altro Stato)</li>
<li>the "OnStateLeave" trigger vengono eseguiti quando un oggetto della classe lascia uno stato specificato</li>
</ol>
</p>
<p>
<i><b>Azioni</b></i> definire le azioni da eseguire quando il trigger vengono eseguiti. Per ora c\'è solo un tipo di azione consiste nel mandare un messaggio email.
Inoltre, tali azioni definiscono il modello da utilizzare per l\'invio della e-mail così come gli altri parametri del messaggio come, l\'importanza dei destinatari, etc
</p>
<p>Una Pagina speciale: <a href="../setup/email.test.php" target="_blank">email.test.php</a> è disponibile per il testing e la risoluzione dei problemi di configurazione PHP mail.</p>
<p>Per essere eseguite, le azioni devono essere associate ai trigger.
Quando è associata a un trigger, ad ogni azione è assegnato un numero "ordine", che specifica in quale ordine le azioni devono essere eseguite.</p>',
'UI:NotificationsMenu:Triggers' => 'Triggers',
'UI:NotificationsMenu:AvailableTriggers' => 'Triggers Disponibili',
'UI:NotificationsMenu:OnCreate' => 'When an object is created~~',
'UI:NotificationsMenu:OnStateEnter' => 'Quando un oggetto viene creato',
'UI:NotificationsMenu:OnStateLeave' => 'Quando un oggetto lascia un determinato stato',
'UI:NotificationsMenu:Actions' => 'Azioni',
'UI:NotificationsMenu:AvailableActions' => 'Azioni disponibili',
'Menu:AuditCategories' => 'Categorie di Audit',
'Menu:AuditCategories+' => '',
'Menu:Notifications:Title' => 'Categorie di Audit',
'Menu:RunQueriesMenu' => 'Esegui query',
'Menu:RunQueriesMenu+' => '',
'Menu:DataAdministration' => 'Dati di amministrazione',
'Menu:DataAdministration+' => '',
'Menu:UniversalSearchMenu' => 'Ricerca universale',
'Menu:UniversalSearchMenu+' => '',
'Menu:ApplicationLogMenu' => 'Log dell\'applicazione',
'Menu:ApplicationLogMenu+' => '',
'Menu:ApplicationLogMenu:Title' => 'Log dell\'applicazione',
'Menu:UserManagementMenu' => 'Gestione degli utenti',
'Menu:UserManagementMenu+' => '',
'Menu:ProfilesMenu' => 'Profili',
'Menu:ProfilesMenu+' => '',
'Menu:ProfilesMenu:Title' => 'Profili',
'Menu:UserAccountsMenu' => 'Account utente',
'Menu:UserAccountsMenu+' => '',
'Menu:UserAccountsMenu:Title' => 'Account utente',
'UI:iTopVersion:Short' => 'Versione iTop %1$s',
'UI:iTopVersion:Long' => 'Versione iTop %1$s-%2$s costruita il %3$s',
'UI:PropertiesTab' => 'Proprietà',
'UI:OpenDocumentInNewWindow_' => 'Apri questo documento in una nuova finestra: %1$s',
'UI:DownloadDocument_' => 'Scarica questo documento: %1$s',
'UI:Document:NoPreview' => 'Non è disponibile un\'anteprima per questo tipo di documento',
'UI:DeadlineMissedBy_duration' => 'Mancati %1$s',
'UI:Deadline_LessThan1Min' => '< 1 min',
'UI:Deadline_Minutes' => '%1$d min',
'UI:Deadline_Hours_Minutes' => '%1$dh %2$dmin',
'UI:Deadline_Days_Hours_Minutes' => '%1$dg %2$dh %3$dmin',
'UI:Help' => 'Aiuto',
'UI:PasswordConfirm' => '(Conferma)',
'UI:BeforeAdding_Class_ObjectsSaveThisObject' => 'Prima di aggiungere più %1$s oggetti, salva questo oggetto.',
'UI:DisplayThisMessageAtStartup' => 'Visualizza questo messaggio in fase di avvio',
'UI:RelationshipGraph' => 'Visualizzazione grafica',
'UI:RelationshipList' => 'Lista',
'UI:OperationCancelled' => 'Operazione Annullata',
'Portal:Title' => 'Portale Utente iTop',
'Portal:Refresh' => 'Ricarica',
'Portal:Back' => 'Indietro',
'Portal:CreateNewRequest' => 'Crea una nuova richiesta',
'Portal:ChangeMyPassword' => 'Cambia la mia password',
'Portal:Disconnect' => 'Disconnetti',
'Portal:OpenRequests' => 'Le mie richieste aperte',
'Portal:ResolvedRequests' => 'Le mie richieste risolte',
'Portal:SelectService' => 'Seleziona un servizio dal catalogo:',
'Portal:PleaseSelectOneService' => 'Si prega di selezionare un servizio',
'Portal:SelectSubcategoryFrom_Service' => 'Seleziona una sotto-categoria per il servizio %1$s:',
'Portal:PleaseSelectAServiceSubCategory' => 'Si prega di selezionare una delle sottocategorie',
'Portal:DescriptionOfTheRequest' => 'Inserisci la descrizione della tua richiesta:',
'Portal:TitleRequestDetailsFor_Request' => 'Dettagli per la richiesta %1$s:',
'Portal:NoOpenRequest' => 'Nessuna richiesta in questa categoria.',
'Portal:Button:CloseTicket' => 'Chiudi questo ticket',
'Portal:EnterYourCommentsOnTicket' => 'Inserisci il tuo commento sulla risoluzione di questo ticket:',
'Portal:ErrorNoContactForThisUser' => 'Errore: l\'utente corrente non è associato ad un Contatto/Persona. Si prega di contattare l\'amministratore.',
'Portal:Attachments' => 'Allegati',
'Portal:AddAttachment' => ' Aggiungi allegati ',
'Portal:RemoveAttachment' => ' Rimuovi allegati ',
'Portal:Attachment_No_To_Ticket_Name' => 'Allegato #%1$d a %2$s (%3$s)',
'Enum:Undefined' => 'Non definito',
'UI:DurationForm_Days_Hours_Minutes_Seconds' => '%1$s Giorni %2$s Ore %3$s Minuti %4$s Secondi',
'UI:ModifyAllPageTitle' => 'Modifica Tutto',
'UI:Modify_N_ObjectsOf_Class' => 'Modifica %1$d oggetto della classe %2$s',
'UI:Modify_M_ObjectsOf_Class_OutOf_N' => 'Modifica %1$d oggetto della classe %2$s fuori da %3$d~~',
'UI:Menu:ModifyAll' => 'Modifica...',
'UI:Button:ModifyAll' => 'Modifica tutto',
'UI:Button:PreviewModifications' => 'Anteprima Modifiche >>~~',
'UI:ModifiedObject' => 'Oggetto Modificato',
'UI:BulkModifyStatus' => 'Operazioni',
'UI:BulkModifyStatus+' => '',
'UI:BulkModifyErrors' => 'Errori (eventuali)',
'UI:BulkModifyErrors+' => '',
'UI:BulkModifyStatusOk' => 'Ok',
'UI:BulkModifyStatusError' => 'Errore',
'UI:BulkModifyStatusModified' => 'Modificato',
'UI:BulkModifyStatusSkipped' => 'Saltato',
'UI:BulkModify_Count_DistinctValues' => '%1$d valori distinti:',
'UI:BulkModify:Value_Exists_N_Times' => '%1$s, %2$d volta(e)',
'UI:BulkModify:N_MoreValues' => '%1$d più valori...~~',
'UI:AttemptingToSetAReadOnlyAttribute_Name' => 'Tentativo di impostare il campo di sola lettura: %1$s',
'UI:FailedToApplyStimuli' => 'L\'azione non è riuscita.',
'UI:StimulusModify_N_ObjectsOf_Class' => '%1$s: Modifica %2$d oggetti della classe %3$s~~',
'UI:CaseLogTypeYourTextHere' => 'Digitare il tuo testo qui:',
'UI:CaseLog:DateFormat' => 'A-m-g H:m:s',
'UI:CaseLog:Header_Date_UserName' => '%1$s - %2$s:~~',
'UI:CaseLog:InitialValue' => 'Valore iniziale:',
'UI:AttemptingToSetASlaveAttribute_Name' => 'Il campo %1$s on è scrivibile, perché è comandato dalla sincronizzazione dei dati. Valore non impostato.',
'UI:ActionNotAllowed' => 'Non hai i permessi per eseguire questa azione su questi oggetti.',
'UI:BulkAction:NoObjectSelected' => 'Si prega di selezionare almeno un oggetto per eseguire questa operazione',
'UI:AttemptingToChangeASlaveAttribute_Name' => 'Il campo %1$s on è scrivibile, perché è comandato dalla sincronizzazione dei dati. Valore rimane invariato.',
));
?>

View File

@@ -1,474 +1,488 @@
<?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('PT BR', 'English', 'English', array(
'Core:AttributeLinkedSet' => 'Array of objects',
'Core:AttributeLinkedSet+' => 'Any kind of objects [subclass] of the same class',
'Core:AttributeLinkedSetIndirect' => 'Array of objects (N-N)',
'Core:AttributeLinkedSetIndirect+' => 'Any kind of objects [subclass] of the same class',
'Core:AttributeInteger' => 'Integer',
'Core:AttributeInteger+' => 'Numeric value (could be negative)',
'Core:AttributeDecimal' => 'Decimal',
'Core:AttributeDecimal+' => 'Decimal value (could be negative)',
'Core:AttributeBoolean' => 'Boolean',
'Core:AttributeBoolean+' => 'Boolean',
'Core:AttributeString' => 'String',
'Core:AttributeString+' => 'Alphanumeric string',
'Core:AttributeClass' => 'Class',
'Core:AttributeClass+' => 'Class',
'Core:AttributeApplicationLanguage' => 'User language',
'Core:AttributeApplicationLanguage+' => 'Language and country (EN US)',
'Core:AttributeFinalClass' => 'Class (auto)',
'Core:AttributeFinalClass+' => 'Real class of the object (automatically created by the core)',
'Core:AttributePassword' => 'Password',
'Core:AttributePassword+' => 'Password of an external device',
'Core:AttributeEncryptedString' => 'Encrypted string',
'Core:AttributeEncryptedString+' => 'String encrypted with a local key',
'Core:AttributeText' => 'Text',
'Core:AttributeText+' => 'Multiline character string',
'Core:AttributeHTML' => 'HTML',
'Core:AttributeHTML+' => 'HTML string',
'Core:AttributeEmailAddress' => 'Email address',
'Core:AttributeEmailAddress+' => 'Email address',
'Core:AttributeIPAddress' => 'IP address',
'Core:AttributeIPAddress+' => 'IP address',
'Core:AttributeOQL' => 'OQL',
'Core:AttributeOQL+' => 'Object Query Langage expression',
'Core:AttributeEnum' => 'Enum',
'Core:AttributeEnum+' => 'List of predefined alphanumeric strings',
'Core:AttributeTemplateString' => 'Template string',
'Core:AttributeTemplateString+' => 'String containing placeholders',
'Core:AttributeTemplateText' => 'Template text',
'Core:AttributeTemplateText+' => 'Text containing placeholders',
'Core:AttributeTemplateHTML' => 'Template HTML',
'Core:AttributeTemplateHTML+' => 'HTML containing placeholders',
'Core:AttributeWikiText' => 'Wiki article',
'Core:AttributeWikiText+' => 'Wiki formatted text',
'Core:AttributeDateTime' => 'Date/time',
'Core:AttributeDateTime+' => 'Date and time (year-month-day hh:mm:ss)',
'Core:AttributeDate' => 'Date',
'Core:AttributeDate+' => 'Date (year-month-day)',
'Core:AttributeDeadline' => 'Deadline',
'Core:AttributeDeadline+' => 'Date, displayed relatively to the current time',
'Core:AttributeExternalKey' => 'External key',
'Core:AttributeExternalKey+' => 'External (or foreign) key',
'Core:AttributeExternalField' => 'External field',
'Core:AttributeExternalField+' => 'Field mapped from an external key',
'Core:AttributeURL' => 'URL',
'Core:AttributeURL+' => 'Absolute or relative URL as a text string',
'Core:AttributeBlob' => 'Blob',
'Core:AttributeBlob+' => 'Any binary content (document)',
'Core:AttributeOneWayPassword' => 'One way password',
'Core:AttributeOneWayPassword+' => 'One way encrypted (hashed) password',
'Core:AttributeTable' => 'Table',
'Core:AttributeTable+' => 'Indexed array having two dimensions',
'Core:AttributePropertySet' => 'Properties',
'Core:AttributePropertySet+' => 'List of untyped properties (name and value)',
));
//////////////////////////////////////////////////////////////////////
// Classes in 'core/cmdb'
//////////////////////////////////////////////////////////////////////
//
//
// Class: CMDBChange
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChange' => 'Mudan&ccedil;as',
'Class:CMDBChange+' => 'Monitoramento Mudan&ccedil;as',
'Class:CMDBChange/Attribute:date' => 'data',
'Class:CMDBChange/Attribute:date+' => 'data e hora que as mudan&ccedil;as tenham sido registradas.',
'Class:CMDBChange/Attribute:userinfo' => 'misc. info',
'Class:CMDBChange/Attribute:userinfo+' => 'Solicitante definido informa&ccedil;&atilde;o',
));
//
// Class: CMDBChangeOp
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOp' => 'Opera&ccedil;&atilde;o Mudan&ccedil;a',
'Class:CMDBChangeOp+' => 'Controle Opera&ccedil;&atilde;o Mudan&ccedil;a',
'Class:CMDBChangeOp/Attribute:change' => 'mudan&ccedil;as',
'Class:CMDBChangeOp/Attribute:change+' => 'mudan&ccedil;as',
'Class:CMDBChangeOp/Attribute:date' => 'data',
'Class:CMDBChangeOp/Attribute:date+' => 'data e hora das mudan&ccedil;as',
'Class:CMDBChangeOp/Attribute:userinfo' => 'usu&aacute;rio',
'Class:CMDBChangeOp/Attribute:userinfo+' => 'quem fez esta mudan&ccedil;as',
'Class:CMDBChangeOp/Attribute:objclass' => 'classe objeto',
'Class:CMDBChangeOp/Attribute:objclass+' => 'classe objeto',
'Class:CMDBChangeOp/Attribute:objkey' => 'id objeto',
'Class:CMDBChangeOp/Attribute:objkey+' => 'objeto',
'Class:CMDBChangeOp/Attribute:finalclass' => 'tipo',
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
));
//
// Class: CMDBChangeOpCreate
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOpCreate' => 'objeto criado',
'Class:CMDBChangeOpCreate+' => 'Controle cria&ccedil;&atilde;o objeto',
));
//
// Class: CMDBChangeOpDelete
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOpDelete' => 'objeto apagado',
'Class:CMDBChangeOpDelete+' => 'Controle objeto eliminado',
));
//
// Class: CMDBChangeOpSetAttribute
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOpSetAttribute' => 'objeto alterado',
'Class:CMDBChangeOpSetAttribute+' => 'Controle do objeto alterado',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => 'Atributo',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => 'c&oacute;digo da modifica&ccedil;&atilde;o',
));
//
// Class: CMDBChangeOpSetAttributeScalar
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOpSetAttributeScalar' => 'mudan&ccedil;a propriedade',
'Class:CMDBChangeOpSetAttributeScalar+' => 'controle da mudan&ccedil;a propriedade do objeto',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'Valor anterior',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => 'valores anteriores do atributo',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'Novo valor',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => 'novo valor do atributo',
));
//
// Class: CMDBChangeOpSetAttributeBlob
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOpSetAttributeBlob' => 'mudan&ccedil;a dado',
'Class:CMDBChangeOpSetAttributeBlob+' => 'controle mudan&ccedil;a dado',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'Dado anterior',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => 'conte&uacute;do anterior do atributo',
));
//
// Class: CMDBChangeOpSetAttributeText
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOpSetAttributeText' => 'mudan&ccedil;a texto',
'Class:CMDBChangeOpSetAttributeText+' => 'controle mudan&ccedil;a texto',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Dado anterior',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => 'conte&uacute;do anterior do atributo',
));
//
// Class: Event
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Event' => 'Log Eventos',
'Class:Event+' => 'An application internal event',
'Class:Event/Attribute:message' => 'mensagem',
'Class:Event/Attribute:message+' => 'descri&ccedil;&atilde;o curta do evento',
'Class:Event/Attribute:date' => 'data',
'Class:Event/Attribute:date+' => 'data e hora em que as mudan&ccedil;as tenham sido registadas',
'Class:Event/Attribute:userinfo' => 'info usu&acute;rio',
'Class:Event/Attribute:userinfo+' => 'identifica&ccedil;&atilde;o do usu&aacute;rio queestava fazendo a a&ccedil;&atilde;o e desencadeou este evento',
'Class:Event/Attribute:finalclass' => 'tipo',
'Class:Event/Attribute:finalclass+' => '',
));
//
// Class: EventNotification
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:EventNotification' => 'Notifica&ccedil;&atilde;o evento',
'Class:EventNotification+' => 'Trace of a notification that has been sent',
'Class:EventNotification/Attribute:trigger_id' => 'Trigger',
'Class:EventNotification/Attribute:trigger_id+' => 'conta usu&aacute;rio',
'Class:EventNotification/Attribute:action_id' => 'usu&aacute;rio',
'Class:EventNotification/Attribute:action_id+' => 'conta usu&aacute;rio',
'Class:EventNotification/Attribute:object_id' => 'Objeto id',
'Class:EventNotification/Attribute:object_id+' => 'objeto id (classe definida pela trigger ?)',
));
//
// Class: EventNotificationEmail
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:EventNotificationEmail' => 'Enviando evento Email',
'Class:EventNotificationEmail+' => 'Controle de um email que foi enviado',
'Class:EventNotificationEmail/Attribute:to' => 'Para',
'Class:EventNotificationEmail/Attribute:to+' => 'Para',
'Class:EventNotificationEmail/Attribute:cc' => 'CC',
'Class:EventNotificationEmail/Attribute:cc+' => 'CC',
'Class:EventNotificationEmail/Attribute:bcc' => 'BCC',
'Class:EventNotificationEmail/Attribute:bcc+' => 'BCC',
'Class:EventNotificationEmail/Attribute:from' => 'De',
'Class:EventNotificationEmail/Attribute:from+' => 'Rementente da mensagem',
'Class:EventNotificationEmail/Attribute:subject' => 'Assunto',
'Class:EventNotificationEmail/Attribute:subject+' => 'Assunto',
'Class:EventNotificationEmail/Attribute:body' => 'Corpo',
'Class:EventNotificationEmail/Attribute:body+' => 'Corpo',
));
//
// Class: EventIssue
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:EventIssue' => 'Emiss&atilde;o de evento',
'Class:EventIssue+' => 'Controle da emiss&atilde;o (aten&ccedil;&atilde;o, erros, etc.)',
'Class:EventIssue/Attribute:issue' => 'Emiss&atilde;o',
'Class:EventIssue/Attribute:issue+' => 'O que aconteceu?',
'Class:EventIssue/Attribute:impact' => 'Impacto',
'Class:EventIssue/Attribute:impact+' => 'Quais s&atilde;o as consequ&ecirc;ncias?',
'Class:EventIssue/Attribute:page' => 'P&aacute;gina',
'Class:EventIssue/Attribute:page+' => 'HTTP ponto de entrada',
'Class:EventIssue/Attribute:arguments_post' => 'Postados argumentos',
'Class:EventIssue/Attribute:arguments_post+' => 'HTTP POST argumentos',
'Class:EventIssue/Attribute:arguments_get' => 'URL argumentos',
'Class:EventIssue/Attribute:arguments_get+' => 'HTTP GET argumentos',
'Class:EventIssue/Attribute:callstack' => 'Callstack',
'Class:EventIssue/Attribute:callstack+' => 'Call stack',
'Class:EventIssue/Attribute:data' => 'Dado',
'Class:EventIssue/Attribute:data+' => 'Mais informa&ccedil;&otilde;es',
));
//
// Class: EventWebService
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:EventWebService' => 'Evento Web service',
'Class:EventWebService+' => 'Controle chamado do web service',
'Class:EventWebService/Attribute:verb' => 'Verb',
'Class:EventWebService/Attribute:verb+' => 'Nome da opera&ccedil;&atilde;o',
'Class:EventWebService/Attribute:result' => 'Resultado',
'Class:EventWebService/Attribute:result+' => 'Vis&atilde;o geral successos/falhas',
'Class:EventWebService/Attribute:log_info' => 'Info log',
'Class:EventWebService/Attribute:log_info+' => 'Resultado info log',
'Class:EventWebService/Attribute:log_warning' => 'Log aten&ccedil;&atilde;o',
'Class:EventWebService/Attribute:log_warning+' => 'Resultado Log aten&ccedil;&atilde;o',
'Class:EventWebService/Attribute:log_error' => 'Log erro',
'Class:EventWebService/Attribute:log_error+' => 'Resultado log erro',
'Class:EventWebService/Attribute:data' => 'Dado',
'Class:EventWebService/Attribute:data+' => 'Resultado dado',
));
//
// Class: Action
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Action' => 'Personalizar A&ccedil;&atilde;o',
'Class:Action+' => 'A&ccedil;&atilde;o definida usu&aacute;rio',
'Class:Action/Attribute:name' => 'Nome',
'Class:Action/Attribute:name+' => '',
'Class:Action/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:Action/Attribute:description+' => '',
'Class:Action/Attribute:status' => 'Status',
'Class:Action/Attribute:status+' => 'Em produ&ccedil;&atilde;o ou ?',
'Class:Action/Attribute:status/Value:test' => 'Que est&aacute; sendo testado',
'Class:Action/Attribute:status/Value:test+' => 'Que est&aacute; sendo testado',
'Class:Action/Attribute:status/Value:enabled' => 'Em produ&ccedil;&atilde;o',
'Class:Action/Attribute:status/Value:enabled+' => 'Em produ&ccedil;&atilde;o',
'Class:Action/Attribute:status/Value:disabled' => 'Inativo',
'Class:Action/Attribute:status/Value:disabled+' => 'Inativo',
'Class:Action/Attribute:trigger_list' => 'Triggers relacionados',
'Class:Action/Attribute:trigger_list+' => 'Triggers ligado a esta a&ccedil;&atilde;o',
'Class:Action/Attribute:finalclass' => 'Tipo',
'Class:Action/Attribute:finalclass+' => '',
));
//
// Class: ActionNotification
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ActionNotification' => 'Notifica&ccedil;&atilde;o',
'Class:ActionNotification+' => 'Notifica&ccedil;&atilde;o (abstrato)',
));
//
// Class: ActionEmail
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ActionEmail' => 'Email notifica&ccedil;&atilde;o',
'Class:ActionEmail+' => '',
'Class:ActionEmail/Attribute:test_recipient' => 'Teste destino',
'Class:ActionEmail/Attribute:test_recipient+' => 'Destinat&aacute;rio o status est&aacute; como "Teste"',
'Class:ActionEmail/Attribute:from' => 'De',
'Class:ActionEmail/Attribute:from+' => 'Ser&aacute; enviado dentro do cabe&ccedil;alho do email',
'Class:ActionEmail/Attribute:reply_to' => 'Responder para',
'Class:ActionEmail/Attribute:reply_to+' => 'Ser&aacute; enviado dentro do cabe&ccedil;alho do email',
'Class:ActionEmail/Attribute:to' => 'Para',
'Class:ActionEmail/Attribute:to+' => 'Destinat&aacute;rio para o email',
'Class:ActionEmail/Attribute:cc' => 'Cc',
'Class:ActionEmail/Attribute:cc+' => 'Com c&oacute;pia',
'Class:ActionEmail/Attribute:bcc' => 'bcc',
'Class:ActionEmail/Attribute:bcc+' => 'Com c&oacute;pia oculta',
'Class:ActionEmail/Attribute:subject' => 'assunto',
'Class:ActionEmail/Attribute:subject+' => 'T&iacute;tulo do email',
'Class:ActionEmail/Attribute:body' => 'corpo',
'Class:ActionEmail/Attribute:body+' => 'Conte&uacute;do do email',
'Class:ActionEmail/Attribute:importance' => 'import&acirc;ncia',
'Class:ActionEmail/Attribute:importance+' => 'Flag import&acirc;ncia',
'Class:ActionEmail/Attribute:importance/Value:low' => 'baixo',
'Class:ActionEmail/Attribute:importance/Value:low+' => 'baixo',
'Class:ActionEmail/Attribute:importance/Value:normal' => 'normal',
'Class:ActionEmail/Attribute:importance/Value:normal+' => 'normal',
'Class:ActionEmail/Attribute:importance/Value:high' => 'alto',
'Class:ActionEmail/Attribute:importance/Value:high+' => 'alto',
));
//
// Class: Trigger
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Trigger' => 'Trigger',
'Class:Trigger+' => 'Personalizar manipulador de eventos',
'Class:Trigger/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:Trigger/Attribute:description+' => 'uma linha descri&ccedil;&atilde;o',
'Class:Trigger/Attribute:action_list' => 'A&ccedil;&otilde;es desencadeadas',
'Class:Trigger/Attribute:action_list+' => 'A&ccedil;&otilde;es executadas quando a Trigger é ativado',
'Class:Trigger/Attribute:finalclass' => 'Tipo',
'Class:Trigger/Attribute:finalclass+' => '',
));
//
// Class: TriggerOnObject
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:TriggerOnObject' => 'Trigger (classe dependente)',
'Class:TriggerOnObject+' => 'Trigger em uma determinada classe de objetos',
'Class:TriggerOnObject/Attribute:target_class' => 'Alvo classe',
'Class:TriggerOnObject/Attribute:target_class+' => '',
));
//
// Class: TriggerOnStateChange
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:TriggerOnStateChange' => 'Trigger (em estato mudan&ccedil;a)',
'Class:TriggerOnStateChange+' => 'Trigger sobre a mudan&ccedil;a de estado do objeto',
'Class:TriggerOnStateChange/Attribute:state' => 'Estado',
'Class:TriggerOnStateChange/Attribute:state+' => '',
));
//
// Class: TriggerOnStateEnter
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:TriggerOnStateEnter' => 'Trigger (ao entrar em um estado)',
'Class:TriggerOnStateEnter+' => 'Trigger sobre a mudan&ccedil;a de estado do objeto - entrar',
));
//
// Class: TriggerOnStateLeave
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:TriggerOnStateLeave' => 'Trigger (na saída de um estado)',
'Class:TriggerOnStateLeave+' => 'Trigger sobre a mudan&ccedil;a de estado do objeto - deixando',
));
//
// Class: TriggerOnObjectCreate
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:TriggerOnObjectCreate' => 'Trigger (sobre a cria&ccedil;&atilde;o do objeto)',
'Class:TriggerOnObjectCreate+' => 'Trigger sobre a cria&ccedil;&atilde;o do objeto de [uma classe filha de] uma determinada classe',
));
//
// Class: lnkTriggerAction
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkTriggerAction' => 'A&ccedil;&atilde;o/Trigger',
'Class:lnkTriggerAction+' => 'Liga&ccedil;&atilde;o entre uma trigger e uma a&ccedil;&atilde;o',
'Class:lnkTriggerAction/Attribute:action_id' => 'A&ccedil;&atilde;o',
'Class:lnkTriggerAction/Attribute:action_id+' => 'A&ccedil;&atilde;o a ser executada',
'Class:lnkTriggerAction/Attribute:action_name' => 'A&ccedil;&atilde;o',
'Class:lnkTriggerAction/Attribute:action_name+' => '',
'Class:lnkTriggerAction/Attribute:trigger_id' => 'Trigger',
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
'Class:lnkTriggerAction/Attribute:trigger_name' => 'Trigger',
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
'Class:lnkTriggerAction/Attribute:order' => 'Ordem',
'Class:lnkTriggerAction/Attribute:order+' => 'AA&ccedil;&otilde;es executadas ordem',
));
?>
<?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 Marco Tulio <mtulio@opensolucoes.com.br>
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ActionEmail' => 'Email notificação',
'Class:ActionEmail+' => '',
'Class:ActionEmail/Attribute:test_recipient' => 'Teste destino',
'Class:ActionEmail/Attribute:test_recipient+' => 'Destinatário o status está como "Teste"',
'Class:ActionEmail/Attribute:from' => 'De',
'Class:ActionEmail/Attribute:from+' => 'Será enviado dentro do cabeçalho do email',
'Class:ActionEmail/Attribute:reply_to' => 'Responder para',
'Class:ActionEmail/Attribute:reply_to+' => 'Será enviado dentro do cabeçalho do email',
'Class:ActionEmail/Attribute:to' => 'Para',
'Class:ActionEmail/Attribute:to+' => 'Destinatário para o email',
'Class:ActionEmail/Attribute:cc' => 'Cc',
'Class:ActionEmail/Attribute:cc+' => 'Com cópia',
'Class:ActionEmail/Attribute:bcc' => 'bcc',
'Class:ActionEmail/Attribute:bcc+' => 'Com cópia oculta',
'Class:ActionEmail/Attribute:subject' => 'assunto',
'Class:ActionEmail/Attribute:subject+' => 'Título do email',
'Class:ActionEmail/Attribute:body' => 'corpo',
'Class:ActionEmail/Attribute:body+' => 'Conteúdo do email',
'Class:ActionEmail/Attribute:importance' => 'importância',
'Class:ActionEmail/Attribute:importance+' => 'Flag importância',
'Class:ActionEmail/Attribute:importance/Value:high' => 'alto',
'Class:ActionEmail/Attribute:importance/Value:high+' => 'alto',
'Class:ActionEmail/Attribute:importance/Value:low' => 'baixo',
'Class:ActionEmail/Attribute:importance/Value:low+' => 'baixo',
'Class:ActionEmail/Attribute:importance/Value:normal' => 'normal',
'Class:ActionEmail/Attribute:importance/Value:normal+' => 'normal',
'Class:TriggerOnStateEnter' => 'Trigger (ao entrar em um estado)',
'Class:TriggerOnStateEnter+' => 'Trigger sobre a mudança de estado do objeto - entrar',
'Class:TriggerOnStateLeave' => 'Trigger (na saída de um estado)',
'Class:TriggerOnStateLeave+' => 'Trigger sobre a mudança de estado do objeto - deixando',
'Class:TriggerOnObjectCreate' => 'Trigger (sobre a criação do objeto)',
'Class:TriggerOnObjectCreate+' => 'Trigger sobre a criação do objeto de [uma classe filha de] uma determinada classe',
'Class:lnkTriggerAction' => 'Ação/Trigger',
'Class:lnkTriggerAction+' => 'Ligação entre uma trigger e uma ação',
'Class:lnkTriggerAction/Attribute:action_id' => 'Ação',
'Class:lnkTriggerAction/Attribute:action_id+' => 'Ação a ser executada',
'Class:lnkTriggerAction/Attribute:trigger_id' => 'Trigger',
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
'Class:lnkTriggerAction/Attribute:order' => 'Ordem',
'Class:lnkTriggerAction/Attribute:order+' => 'AAções executadas ordem',
'Class:AsyncSendEmail' => 'Email (assíncrono)',
'Class:AsyncSendEmail/Attribute:to' => 'Para',
'Class:AsyncSendEmail/Attribute:subject' => 'Assunto',
'Class:AsyncSendEmail/Attribute:body' => 'Corpo',
'Class:AsyncSendEmail/Attribute:header' => 'Cabeçalho',
'Class:CMDBChange' => 'Mudanças',
'Class:CMDBChange+' => 'Monitoramento Mudanças',
'Class:CMDBChange/Attribute:date' => 'data',
'Class:CMDBChange/Attribute:date+' => 'data e hora que as mudanças tenham sido registradas.',
'Class:CMDBChange/Attribute:userinfo' => 'misc. info',
'Class:CMDBChange/Attribute:userinfo+' => 'Solicitante definido informação',
'Class:CMDBChangeOp' => 'Operação Mudança',
'Class:CMDBChangeOp+' => 'Controle Operação Mudança',
'Class:CMDBChangeOp/Attribute:change' => 'mudanças',
'Class:CMDBChangeOp/Attribute:change+' => 'mudanças',
'Class:CMDBChangeOp/Attribute:objclass' => 'classe objeto',
'Class:CMDBChangeOp/Attribute:objclass+' => 'classe objeto',
'Class:CMDBChangeOp/Attribute:objkey' => 'id objeto',
'Class:CMDBChangeOp/Attribute:objkey+' => 'objeto',
'Class:CMDBChangeOp/Attribute:finalclass' => 'tipo',
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
'Class:CMDBChangeOpCreate' => 'objeto criado',
'Class:CMDBChangeOpCreate+' => 'Controle criação objeto',
'Class:CMDBChangeOpDelete' => 'objeto apagado',
'Class:CMDBChangeOpDelete+' => 'Controle objeto eliminado',
'Class:CMDBChangeOpSetAttribute' => 'objeto alterado',
'Class:CMDBChangeOpSetAttribute+' => 'Controle do objeto alterado',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => 'Atributo',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => 'código da modificação',
'Class:CMDBChangeOpSetAttributeScalar' => 'mudança propriedade',
'Class:CMDBChangeOpSetAttributeScalar+' => 'controle da mudança propriedade do objeto',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'Valor anterior',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => 'valores anteriores do atributo',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'Novo valor',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => 'novo valor do atributo',
'Class:CMDBChangeOpSetAttributeBlob' => 'mudança dado',
'Class:CMDBChangeOpSetAttributeBlob+' => 'controle mudança dado',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'Dado anterior',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => 'conteúdo anterior do atributo',
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Senha criptografada',
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Valores anteriores',
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Campo criptografado',
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Valores anteriores',
'Class:CMDBChangeOpSetAttributeText' => 'mudança texto',
'Class:CMDBChangeOpSetAttributeText+' => 'controle mudança texto',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Dado anterior',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => 'conteúdo anterior do atributo',
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Caso Log',
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Última entrada',
'Class:Event' => 'Log Eventos',
'Class:Event+' => 'Um pedido de evento interno',
'Class:Event/Attribute:message' => 'mensagem',
'Class:Event/Attribute:message+' => 'descrição curta do evento',
'Class:Event/Attribute:date' => 'data',
'Class:Event/Attribute:date+' => 'data e hora em que as mudanças tenham sido registadas',
'Class:Event/Attribute:userinfo' => 'info usuário',
'Class:Event/Attribute:userinfo+' => 'identificação do usuário queestava fazendo a ação e desencadeou este evento',
'Class:Event/Attribute:finalclass' => 'tipo',
'Class:Event/Attribute:finalclass+' => '',
'Class:EventNotification' => 'Notificação evento',
'Class:EventNotification+' => 'Trace of a notification that has been sent',
'Class:EventNotification/Attribute:trigger_id' => 'Trigger',
'Class:EventNotification/Attribute:trigger_id+' => 'conta usuário',
'Class:EventNotification/Attribute:action_id' => 'usuário',
'Class:EventNotification/Attribute:action_id+' => 'conta usuário',
'Class:EventNotification/Attribute:object_id' => 'Objeto id',
'Class:EventNotification/Attribute:object_id+' => 'objeto id (classe definida pela trigger ?)',
'Class:EventNotificationEmail' => 'Enviando evento Email',
'Class:EventNotificationEmail+' => 'Controle de um email que foi enviado',
'Class:EventNotificationEmail/Attribute:to' => 'Para',
'Class:EventNotificationEmail/Attribute:to+' => 'Para',
'Class:EventNotificationEmail/Attribute:cc' => 'CC',
'Class:EventNotificationEmail/Attribute:cc+' => 'CC',
'Class:EventNotificationEmail/Attribute:bcc' => 'BCC',
'Class:EventNotificationEmail/Attribute:bcc+' => 'BCC',
'Class:EventNotificationEmail/Attribute:from' => 'De',
'Class:EventNotificationEmail/Attribute:from+' => 'Rementente da mensagem',
'Class:EventNotificationEmail/Attribute:subject' => 'Assunto',
'Class:EventNotificationEmail/Attribute:subject+' => 'Assunto',
'Class:EventNotificationEmail/Attribute:body' => 'Corpo',
'Class:EventNotificationEmail/Attribute:body+' => 'Corpo',
'Class:EventIssue' => 'Emissão de evento',
'Class:EventIssue+' => 'Controle da emissão (atenção, erros, etc.)',
'Class:EventIssue/Attribute:issue' => 'Emissão',
'Class:EventIssue/Attribute:issue+' => 'O que aconteceu?',
'Class:EventIssue/Attribute:impact' => 'Impacto',
'Class:EventIssue/Attribute:impact+' => 'Quais são as consequências?',
'Class:EventIssue/Attribute:page' => 'Página',
'Class:EventIssue/Attribute:page+' => 'HTTP ponto de entrada',
'Class:EventIssue/Attribute:arguments_post' => 'Postados argumentos',
'Class:EventIssue/Attribute:arguments_post+' => 'HTTP POST argumentos',
'Class:EventIssue/Attribute:arguments_get' => 'URL argumentos',
'Class:EventIssue/Attribute:arguments_get+' => 'HTTP GET argumentos',
'Class:EventIssue/Attribute:callstack' => 'PilhaChamada',
'Class:EventIssue/Attribute:callstack+' => 'Pilha de chamada',
'Class:EventIssue/Attribute:data' => 'Dado',
'Class:EventIssue/Attribute:data+' => 'Mais informações',
'Class:EventWebService' => 'Evento Web service',
'Class:EventWebService+' => 'Controle chamado do web service',
'Class:EventWebService/Attribute:verb' => 'Verbo',
'Class:EventWebService/Attribute:verb+' => 'Nome da operação',
'Class:EventWebService/Attribute:result' => 'Resultado',
'Class:EventWebService/Attribute:result+' => 'Visão geral successos/falhas',
'Class:EventWebService/Attribute:log_info' => 'Info log',
'Class:EventWebService/Attribute:log_info+' => 'Resultado info log',
'Class:EventWebService/Attribute:log_warning' => 'Log atenção',
'Class:EventWebService/Attribute:log_warning+' => 'Resultado Log atenção',
'Class:EventWebService/Attribute:log_error' => 'Log erro',
'Class:EventWebService/Attribute:log_error+' => 'Resultado log erro',
'Class:EventWebService/Attribute:data' => 'Dado',
'Class:EventWebService/Attribute:data+' => 'Resultado dado',
'Class:EventLoginUsage' => 'Uso Login',
'Class:EventLoginUsage+' => '',
'Class:EventLoginUsage/Attribute:user_id' => 'Entrar',
'Class:EventLoginUsage/Attribute:user_id+' => '',
'Class:SynchroDataSource' => 'Fontes de dados de sincronização',
'Class:SynchroDataSource/Attribute:name' => 'Nome',
'Class:SynchroDataSource/Attribute:name+' => '',
'Class:SynchroDataSource/Attribute:description' => 'Descrição',
'Class:SynchroDataSource/Attribute:status' => 'Status',
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implementação',
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsoleto',
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Produção',
'Class:SynchroDataSource/Attribute:user_id' => 'Usuário',
'Class:SynchroDataSource/Attribute:notify_contact_id' => 'Contato para notificação',
'Class:SynchroDataSource/Attribute:notify_contact_id+' => '',
'Class:SynchroDataSource/Attribute:scope_class' => 'Classe alvo',
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Restrição de escopo',
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Intervalo de carga total',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => '',
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Política de conciliação',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Use os atributos',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Use o campo primary_key',
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Ação sobre o zero',
'Class:SynchroDataSource/Attribute:action_on_zero+' => '',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Criar',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Erro',
'Class:SynchroDataSource/Attribute:action_on_one' => 'Ação sobre o um',
'Class:SynchroDataSource/Attribute:action_on_one+' => '',
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Erro',
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Atualizar',
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Ação em muitos',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => '',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Criar',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Erro',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Pegue o primeiro (acaso?)',
'Class:SynchroDataSource/Attribute:delete_policy' => 'Apagar política',
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Apagar',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignorar',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Atualizar',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Atualizar, em seguida, Apagar',
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Atualizar regra',
'Class:SynchroDataSource/Attribute:delete_policy_update+' => '',
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Retenção Duração',
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => '',
'Class:SynchroDataSource/Attribute:attribute_list' => 'Lista atributos',
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'Usuários permitidos',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => '',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Somente administradores',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Toda permissão para excluir esses objetos',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Ninguém',
'Class:SynchroDataSource/Attribute:url_icon' => 'Icone\'s hyperlink',
'Class:SynchroDataSource/Attribute:url_icon+' => '',
'Class:SynchroDataSource/Attribute:url_application' => 'Aplicação hyperlink',
'Class:SynchroDataSource/Attribute:url_application+' => '',
'Class:SynchroAttribute' => 'Synchro atributo',
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Sycnhro origem dado',
'Class:SynchroAttribute/Attribute:attcode' => 'Código atributo',
'Class:SynchroAttribute/Attribute:update' => 'Atualizar',
'Class:SynchroAttribute/Attribute:reconcile' => 'Reconciliar',
'Class:SynchroAttribute/Attribute:update_policy' => 'Atualizar política',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'Bloqueado',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'Desbloqueado',
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Inicializar se vazio',
'Class:SynchroAttribute/Attribute:finalclass' => 'Classe',
'Class:SynchroAttExtKey' => 'Atributo sincronia (ExtKey)',
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Reconciliar atributos',
'Class:SynchroAttLinkSet' => 'Atributo sincronia (Linkset)',
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Separador linhas',
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Separador atributos',
'Class:SynchroLog' => 'Sincronia Log',
'Class:SynchroLog/Attribute:sync_source_id' => 'Sincronização fonte dados',
'Class:SynchroLog/Attribute:start_date' => 'Data início',
'Class:SynchroLog/Attribute:end_date' => 'Data final',
'Class:SynchroLog/Attribute:status' => 'Status',
'Class:SynchroLog/Attribute:status/Value:completed' => 'Completado',
'Class:SynchroLog/Attribute:status/Value:error' => 'Erro',
'Class:SynchroLog/Attribute:status/Value:running' => 'Em execução',
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nro réplica visita',
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nro réplica total',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nro objetos apagados',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nro de erros enquanto apagando',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nro objetos obsoletos',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nro de erros enquanto obsoletos',
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nro objetos criados',
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nro de erros enquanto criando',
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nro objetos atualizados',
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nro erros enquanto atualizando',
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nro de erros durante reconciliação',
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nro réplica desaparecido',
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nro objetos atualizados',
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nro objetos não alterados',
'Class:SynchroLog/Attribute:last_error' => 'Último erro',
'Class:SynchroLog/Attribute:traces' => 'Traços',
'Class:SynchroReplica' => 'Synchro Réplica',
'Class:SynchroReplica/Attribute:sync_source_id' => 'Synchro origem dado',
'Class:SynchroReplica/Attribute:dest_id' => 'Destino objeto (ID)',
'Class:SynchroReplica/Attribute:dest_class' => 'Tipo Destino',
'Class:SynchroReplica/Attribute:status_last_seen' => 'Última visita',
'Class:SynchroReplica/Attribute:status' => 'Status',
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modificação',
'Class:SynchroReplica/Attribute:status/Value:new' => 'Novo',
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Obsoleto',
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Orfão',
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Sincronizado',
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Objeto criado?',
'Class:SynchroReplica/Attribute:status_last_error' => 'Último erro',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Data criação',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Última data modificação',
'Class:appUserPreferences' => 'Preferências usuário',
'Class:appUserPreferences/Attribute:userid' => 'Usuários',
'Class:appUserPreferences/Attribute:preferences' => 'Prefs',
'Core:AttributeLinkedSet' => 'Ordem de objetos',
'Core:AttributeLinkedSet+' => 'Qualquer tipo objeto [sub-classe] da mesma classe',
'Core:AttributeLinkedSetIndirect' => 'Ordem de objetos (N-N)',
'Core:AttributeLinkedSetIndirect+' => 'Qualquer tipo objeto [sub-classe] da mesma classe',
'Core:AttributeInteger' => 'Inteiro',
'Core:AttributeInteger+' => 'Valor número (não pode ser negativo)',
'Core:AttributeDecimal' => 'Decimal',
'Core:AttributeDecimal+' => 'Valor decimal (não pode ser negativo)',
'Core:AttributeBoolean' => 'Boolean',
'Core:AttributeBoolean+' => 'Boolean',
'Core:AttributeString' => 'String',
'Core:AttributeString+' => 'String alfa-numéricos',
'Core:AttributeClass' => 'Classe',
'Core:AttributeClass+' => 'Classe',
'Core:AttributeApplicationLanguage' => 'Linguagem Usuário',
'Core:AttributeApplicationLanguage+' => 'Linguagem e País (pt BR)',
'Core:AttributeFinalClass' => 'Classe (auto)',
'Core:AttributeFinalClass+' => 'Classe real do objeto (automaticamente criado pelo núcleo)',
'Core:AttributePassword' => 'Senha',
'Core:AttributePassword+' => 'Senha de um dispositivo externo',
'Core:AttributeEncryptedString' => 'Senha criptografado',
'Core:AttributeEncryptedString+' => 'String criptografada com uma chave local',
'Core:AttributeText' => 'Texto',
'Core:AttributeText+' => 'Cadeia de caracteres multi-linhas',
'Core:AttributeHTML' => 'HTML',
'Core:AttributeHTML+' => 'HTML string',
'Core:AttributeEmailAddress' => 'Endereço Email',
'Core:AttributeEmailAddress+' => 'Endereço Email',
'Core:AttributeIPAddress' => 'Endereço IP',
'Core:AttributeIPAddress+' => 'Endereço IP',
'Core:AttributeOQL' => 'OQL',
'Core:AttributeOQL+' => 'Expressão linguagem consulta objetos',
'Core:AttributeEnum' => 'Enum',
'Core:AttributeEnum+' => 'Lista de pré-seqüências alfanuméricas',
'Core:AttributeTemplateString' => 'Modelo string',
'Core:AttributeTemplateString+' => 'String contendo espaços reservados',
'Core:AttributeTemplateText' => 'Modelo texto',
'Core:AttributeTemplateText+' => 'Texto contendo espaços reservados',
'Core:AttributeTemplateHTML' => 'Modelo HTML',
'Core:AttributeTemplateHTML+' => 'HTML contendo espaços reservados',
'Core:AttributeDateTime' => 'Data/hora',
'Core:AttributeDateTime+' => 'Data e hora (ano-mês-dia hh:mm:ss)',
'Core:AttributeDate' => 'Data',
'Core:AttributeDate+' => 'Data (ano-mês-dia)',
'Core:AttributeDeadline' => 'Prazo',
'Core:AttributeDeadline+' => 'Data, apresentada em relação ao tempo real',
'Core:AttributeExternalKey' => 'Chave externa',
'Core:AttributeExternalKey+' => 'Chave externa (ou estrangeira)',
'Core:AttributeExternalField' => 'Campo externo',
'Core:AttributeExternalField+' => 'Campo mapeado por uma chave externa',
'Core:AttributeURL' => 'URL',
'Core:AttributeURL+' => 'URL absoluta ou relativa, como uma seqüência de texto',
'Core:AttributeBlob' => 'Blob',
'Core:AttributeBlob+' => 'Qualquer conteúdo binário (documento)',
'Core:AttributeOneWayPassword' => 'Uma forma senha',
'Core:AttributeOneWayPassword+' => 'One way encrypted (hashed) password',
'Core:AttributeTable' => 'Tabela',
'Core:AttributeTable+' => 'Matriz cadastrada ter duas dimensões',
'Core:AttributePropertySet' => 'Propriedades',
'Core:AttributePropertySet+' => 'Lista de propriedades não tipado (nome e valor)',
'Class:CMDBChangeOp/Attribute:date' => 'data',
'Class:CMDBChangeOp/Attribute:date+' => 'data e hora das mudanças',
'Class:CMDBChangeOp/Attribute:userinfo' => 'usuário',
'Class:CMDBChangeOp/Attribute:userinfo+' => 'quem fez esta mudanças',
'Change:ObjectCreated' => 'Objeto criado',
'Change:ObjectDeleted' => 'Objeto apagado',
'Change:ObjectModified' => 'Objeto modificado',
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s configurado para %2$s (valor anterior: %3$s)',
'Change:AttName_SetTo' => '%1$s configurado para %2$s',
'Change:Text_AppendedTo_AttName' => '%1$s anexado ao %2$s',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s modificado, valor anterior: %2$s',
'Change:AttName_Changed' => '%1$s modificado',
'Change:AttName_EntryAdded' => '%1$s modificado, nova entrada adicionada.',
'Class:EventLoginUsage/Attribute:contact_name' => 'Nome usuário',
'Class:EventLoginUsage/Attribute:contact_name+' => '',
'Class:EventLoginUsage/Attribute:contact_email' => 'Email usuários',
'Class:EventLoginUsage/Attribute:contact_email+' => '',
'Class:Action' => 'Personalizar Ação',
'Class:Action+' => 'Ação definida usuário',
'Class:Action/Attribute:name' => 'Nome',
'Class:Action/Attribute:name+' => '',
'Class:Action/Attribute:description' => 'Descrição',
'Class:Action/Attribute:description+' => '',
'Class:Action/Attribute:status' => 'Status',
'Class:Action/Attribute:status+' => 'Em produção ou ?',
'Class:Action/Attribute:status/Value:test' => 'Que está sendo testado',
'Class:Action/Attribute:status/Value:test+' => 'Que está sendo testado',
'Class:Action/Attribute:status/Value:enabled' => 'Em produção',
'Class:Action/Attribute:status/Value:enabled+' => 'Em produção',
'Class:Action/Attribute:status/Value:disabled' => 'Inativo',
'Class:Action/Attribute:status/Value:disabled+' => 'Inativo',
'Class:Action/Attribute:trigger_list' => 'Triggers relacionados',
'Class:Action/Attribute:trigger_list+' => 'Triggers ligado a esta ação',
'Class:Action/Attribute:finalclass' => 'Tipo',
'Class:Action/Attribute:finalclass+' => '',
'Class:ActionNotification' => 'Notificação',
'Class:ActionNotification+' => 'Notificação (abstrato)',
'Class:Trigger' => 'Trigger',
'Class:Trigger+' => 'Personalizar manipulador de eventos',
'Class:Trigger/Attribute:description' => 'Descrição',
'Class:Trigger/Attribute:description+' => 'uma linha descrição',
'Class:Trigger/Attribute:action_list' => 'Ações desencadeadas',
'Class:Trigger/Attribute:action_list+' => 'Ações executadas quando a Trigger é ativado',
'Class:Trigger/Attribute:finalclass' => 'Tipo',
'Class:Trigger/Attribute:finalclass+' => '',
'Class:TriggerOnObject' => 'Trigger (classe dependente)',
'Class:TriggerOnObject+' => 'Trigger em uma determinada classe de objetos',
'Class:TriggerOnObject/Attribute:target_class' => 'Alvo classe',
'Class:TriggerOnObject/Attribute:target_class+' => '',
'Class:TriggerOnStateChange' => 'Trigger (em estato mudança)',
'Class:TriggerOnStateChange+' => 'Trigger sobre a mudança de estado do objeto',
'Class:TriggerOnStateChange/Attribute:state' => 'Estado',
'Class:TriggerOnStateChange/Attribute:state+' => '',
'Class:lnkTriggerAction/Attribute:action_name' => 'Ação',
'Class:lnkTriggerAction/Attribute:action_name+' => '',
'Class:lnkTriggerAction/Attribute:trigger_name' => 'Trigger',
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Ninguém',
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Somente administradores',
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'Todos usuários permitidos',
'SynchroDataSource:Description' => 'Descrição',
'SynchroDataSource:Reconciliation' => 'Pesquisar &amp; reconciliação',
'SynchroDataSource:Deletion' => 'Apagar regras',
'SynchroDataSource:Status' => 'Status',
'SynchroDataSource:Information' => 'Informação',
'SynchroDataSource:Definition' => 'Definição',
'Core:SynchroAttributes' => 'Atributos',
'Core:SynchroStatus' => 'Status',
'Core:Synchro:ErrorsLabel' => 'Erro',
'Core:Synchro:CreatedLabel' => 'Criado',
'Core:Synchro:ModifiedLabel' => 'Modificado',
'Core:Synchro:UnchangedLabel' => 'Não alterado',
'Core:Synchro:ReconciledErrorsLabel' => 'Erro',
'Core:Synchro:ReconciledLabel' => 'Reconciliação',
'Core:Synchro:ReconciledNewLabel' => 'Criado',
'Core:SynchroReconcile:Yes' => 'Sim',
'Core:SynchroReconcile:No' => 'Não',
'Core:SynchroUpdate:Yes' => 'Sim',
'Core:SynchroUpdate:No' => 'Não',
'Core:Synchro:LastestStatus' => 'Último Status',
'Core:Synchro:History' => 'Histórico de sincronização',
'Core:Synchro:NeverRun' => 'Este sincronismo nunca foi executado. Sem registo ainda.',
'Core:Synchro:SynchroEndedOn_Date' => 'A última sincronização terminou em% 1 $ s.',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'A sincronização começou em $1$s e em execução ainda...',
'Menu:DataSources' => 'Fontes de dados de sincronização',
'Menu:DataSources+' => '',
'Core:Synchro:label_repl_ignored' => 'Ignorado (%1$s)',
'Core:Synchro:label_repl_disappeared' => 'Desaparecido (%1$s)',
'Core:Synchro:label_repl_existing' => 'Existente (%1$s)',
'Core:Synchro:label_repl_new' => 'Novo (%1$s)',
'Core:Synchro:label_obj_deleted' => 'Apagado (%1$s)',
'Core:Synchro:label_obj_obsoleted' => 'Obsoleto (%1$s)',
'Core:Synchro:label_obj_disappeared_errors' => 'Erros (%1$s)',
'Core:Synchro:label_obj_disappeared_no_action' => 'Nenhuma ação (%1$s)',
'Core:Synchro:label_obj_unchanged' => 'Não alterado (%1$s)',
'Core:Synchro:label_obj_updated' => 'Atualizado (%1$s)',
'Core:Synchro:label_obj_updated_errors' => 'Erros (%1$s)',
'Core:Synchro:label_obj_new_unchanged' => 'Não alterado (%1$s)',
'Core:Synchro:label_obj_new_updated' => 'Atualizado (%1$s)',
'Core:Synchro:label_obj_created' => 'Criado (%1$s)',
'Core:Synchro:label_obj_new_errors' => 'Erros (%1$s)',
'Core:SynchroLogTitle' => '%1$s - %2$s',
'Core:Synchro:Nb_Replica' => 'Réplica processadas: %1$s',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Na chave de reconciliação pelo menos um deve ser especificado, ou a política de reconciliação deve ser o de utilizar a chave primária.',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'Um período de retenção a apagar deve ser especificado, desde que os objetos serão excluídos após ser marcado como obsoleto.',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Objetos obsoletos devem ser atualizados, mas nenhuma atualização é especificado.',
'Core:SynchroReplica:PublicData' => 'Dados públicos',
'Core:SynchroReplica:PrivateDetails' => 'Detalhes privativos',
'Core:SynchroReplica:BackToDataSource' => 'Voltar para a fonte de dados sincronizada:: %1$s',
'Core:SynchroReplica:ListOfReplicas' => 'Lista de réplica',
'Core:SynchroAttExtKey:ReconciliationById' => 'id (Chave primária)',
'Core:SynchroAtt:attcode' => 'Atributos',
'Core:SynchroAtt:attcode+' => '',
'Core:SynchroAtt:reconciliation' => 'Reconciliação?',
'Core:SynchroAtt:reconciliation+' => '',
'Core:SynchroAtt:update' => 'Atualizar?',
'Core:SynchroAtt:update+' => '',
'Core:SynchroAtt:update_policy' => 'Atualização Política',
'Core:SynchroAtt:update_policy+' => '',
'Core:SynchroAtt:reconciliation_attcode' => 'Chave reconciliação',
'Core:SynchroAtt:reconciliation_attcode+' => '',
'Core:SyncDataExchangeComment' => '(DataExchange)',
'Core:Synchro:ListOfDataSources' => 'Lista de fontes de dados:',
'Core:Synchro:LastSynchro' => 'Última sincronização:',
'Core:Synchro:ThisObjectIsSynchronized' => 'Este objeto é sincronizado com uma fonte de dados externa',
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'O objeto foi <b>criado</b> por uma fonte dados externa %1$s',
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'O objeto <b>não pode ser apagado</b> por uma fonte dados externa %1$s',
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'Você <b>não pode apagar o objeto</b> porque é propriedade de uma fonte dados externa %1$s',
'TitleSynchroExecution' => 'Execução da sincronização',
'Class:SynchroDataSource:DataTable' => 'Tabela de banco de dados: %1$s',
'Core:SyncDataSourceObsolete' => 'A fonte de dados está marcada como obsoleto. Operação cancelada.',
'Core:SyncDataSourceAccessRestriction' => 'Somente administradores ou o usuário especificado na fonte de dados pode executar essa operação. Operação cancelada.',
'Core:SyncTooManyMissingReplicas' => 'Todos os registros foram tocados por algum tempo (todos os objetos podem ser apagados). Verifique se o processo que grava na tabela de sincronização ainda está em execução. Operação cancelada.',
'Core:Duration_Seconds' => '%1$ds',
'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds',
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds',
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sd %2$dh %3$dmin %4$ds',
));
?>

File diff suppressed because it is too large Load Diff

View File

@@ -107,6 +107,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'Change:ObjectCreated' => 'Объект создан',
'Change:ObjectDeleted' => 'Объект удалён',
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s установлено в %2$s (предыдущее значение: %3$s)',
'Change:AttName_SetTo' => '%1$s установлено в %2$s',
'Change:Text_AppendedTo_AttName' => '%1$s добавлено к %2$s',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s изменено, предыдущее значение: %2$s',
'Change:AttName_Changed' => '%1$s изменено',

View File

@@ -609,6 +609,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'Пакетное удаление %1$d объектов класса %2$s',
'UI:Delete:NotAllowedToDelete' => 'Вы не можете удалить этот объект',
'UI:Delete:NotAllowedToUpdate_Fields' => 'Вы не можете обновить следующее(ие) поле(я): %1$s',
'UI:Error:CannotDeleteBecause' => 'This object could not be deleted because: %1$s',
'UI:Error:NotEnoughRightsToDelete' => 'Этот объект не может быть удален, потому что текущий пользователь не имеет достаточных прав',
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Этот объект не может быть удален, потому что некоторые ручные операции должны быть выполнены до этого',
'UI:Archive_User_OnBehalfOf_User' => '%1$s от имени %2$s',
@@ -620,8 +621,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s удалено.',
'UI:Delete:ConfirmDeletionOf_Name' => 'Удаление %1$s',
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Удаление %1$d объектов класса %2$s',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Должно быть автоматичски удалено, но вы не можете это сделать',
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Необходимо удалить вручную - но вы не можете удалить этот объект, свяжитесь с администратором вашего приложения',
// 'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Должно быть автоматичски удалено, но вы не можете это сделать',
// 'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Необходимо удалить вручную - но вы не можете удалить этот объект, свяжитесь с администратором вашего приложения',
'UI:Delete:WillBeDeletedAutomatically' => 'Будет удалено автоматически',
'UI:Delete:MustBeDeletedManually' => 'Необходимо удалить вручную',
'UI:Delete:CannotUpdateBecause_Issue' => 'Должно быть автоматически обновлено, но: %1$s',

View File

@@ -108,6 +108,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'Change:ObjectCreated' => 'Nesne yaratıldı',
'Change:ObjectDeleted' => 'Nesne silindi',
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s\'nin değeri %2$s olarak atandı (önceki değer: %3$s)',
'Change:AttName_SetTo' => '%1$s\'nin değeri %2$s olarak atandı',
'Change:Text_AppendedTo_AttName' => '%2$s\'ye %1$s eklendi',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$\'nin değeri deiştirildi, önceki değer: %2$s',
'Change:AttName_Changed' => '%1$s değiştirildi',

View File

@@ -608,6 +608,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => '%2$s sınıfına ait çoklu %1$d nesne silimi',
'UI:Delete:NotAllowedToDelete' => 'Bu nesneyi silmek için yetkiniz yok',
'UI:Delete:NotAllowedToUpdate_Fields' => '%1$s alanlarını güncellemek için yetkiniz yok',
'UI:Error:CannotDeleteBecause' => 'This object could not be deleted because: %1$s',
'UI:Error:NotEnoughRightsToDelete' => 'Nesne yetersiz yetki nedeniyle silinemedi',
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Bu nesneyi silmek için öncelikli dışarıdan yapılması gereken işlemler var',
'UI:Archive_User_OnBehalfOf_User' => '%1$s on behalf of %2$s',
@@ -619,8 +620,8 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s silindi.',
'UI:Delete:ConfirmDeletionOf_Name' => '%1$s\'in silimi',
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => '%2$s sınıfına ait %1$d nesnelerinin silimi ',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Otomatik silimesini mi istiyorsunuz, ancak buna yetkiniz yok',
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Manuel silinmeli - ancak bu nesneyi silmeye yetkiniz yok, lütfen sistem yöneticisiyle irtibata geçiniz.',
// 'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Otomatik silimesini mi istiyorsunuz, ancak buna yetkiniz yok',
// 'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Manuel silinmeli - ancak bu nesneyi silmeye yetkiniz yok, lütfen sistem yöneticisiyle irtibata geçiniz.',
'UI:Delete:WillBeDeletedAutomatically' => 'Otomatik olarak silinecek',
'UI:Delete:MustBeDeletedManually' => 'Manuel silinmeli',
'UI:Delete:CannotUpdateBecause_Issue' => 'Otomatik güncellenmeli, ancak: %1$s',

View File

@@ -107,6 +107,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Change:ObjectCreated' => 'Object created',
'Change:ObjectDeleted' => 'Object deleted',
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s set to %2$s (previous value: %3$s)',
'Change:AttName_SetTo' => '%1$s set to %2$s',
'Change:Text_AppendedTo_AttName' => '%1$s appended to %2$s',
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s modified, previous value: %2$s',
'Change:AttName_Changed' => '%1$s modified',

View File

@@ -607,6 +607,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => '批量删除 %1$d 个 %2$s 类的对象',
'UI:Delete:NotAllowedToDelete' => '您未被允许删除该对象',
'UI:Delete:NotAllowedToUpdate_Fields' => '您未被允许更新下述栏目: %1$s',
'UI:Error:CannotDeleteBecause' => 'This object could not be deleted because: %1$s',
'UI:Error:NotEnoughRightsToDelete' => '该对象不能被删除, 因为当前用户没有足够权限',
'UI:Error:CannotDeleteBecauseOfDepencies' => '该对象不能被删除, 因为一些手工操作必须事先完成',
'UI:Archive_User_OnBehalfOf_User' => '%1$s on behalf of %2$s',
@@ -618,8 +619,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s 删除了.',
'UI:Delete:ConfirmDeletionOf_Name' => '删除 %1$s',
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => '删除 %2$s 类的 %1$d 个对象',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => '应该自动删除, 但您未被允许这样做',
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => '必须手工删除 - 但您未被允许删除该对象, 请联系您的应用程序系统管理员',
// 'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => '应该自动删除, 但您未被允许这样做',
// 'UI:Delete:MustBeDeletedManuallyButNotPossible' => '必须手工删除 - 但您未被允许删除该对象, 请联系您的应用程序系统管理员',
'UI:Delete:WillBeDeletedAutomatically' => '将被自动删除',
'UI:Delete:MustBeDeletedManually' => '必须手工删除',
'UI:Delete:CannotUpdateBecause_Issue' => '应该被自动更新, 但是: %1$s',

View File

@@ -62,11 +62,47 @@ a.internal {
a.internal:hover {
text-decoration: underline;
}
.code {
background-color: #ccc;
padding: 10px;
border: 1px solid #999;
font-family: Courier, Courier-New, monospace;
}
</style>
</head>
<body>
<div id="banner"><span>Installation Help</span></div>
<div id="content">
<h1><a name="Installation">Completing the iTop installation</a></h1>
<h2>cron.php - overview</h2>
<p>In order to operate properly, iTop maintenance operations and asynchronous tasks must be executed on a regular basis.
In order to ease the installation, all the background tasks have been grouped to be launched from a single file: <tt>webservices/cron.php</tt></p>
<p>The following features require the activation of cron.php</p>
<ul>
<li><b>Asynchronous emails</b>. By default, this option is disabled. To enable it, set 'email_asynchronous' to 1 in the configuration file</li>
<li><b>Check ticket SLA</b>. Tickets reaching the limits will be passed into Escalation TTO/TTR states</li>
</ul>
</p>
<p>For more information about cron.php, check the <a href="https://sourceforge.net/apps/mediawiki/itop/index.php?title=Cron.php">Wiki</a></p>
<h2>Scheduling cron.php on Windows</h2>
<ol>
<li>Edit the file <em>&lt;itop root&gt</em>/webservices/<b>cron.params</b> to set the credentials used for cronified tasks (requires administator privileges)</li>
<li>Edit the file <em>&lt;itop root&gt</em>/webservices/<b>cron.cmd</b>, and set the relevant path for your installation of PHP. If you care about security, it is recommended to change also the path to the parameters file <em>&lt;itop root&gt</em>/webservices/<b>cron.params</b> and move this file to a place where its content is not served by the web server.</li>
<li>Schedule the execution of cron.cmd:
<pre>schtasks.exe /create /tn "iTop CRON" /sc minute /mo 1 /tr "\"<em>&lt;itop root&gt</em>/webservices/cron.cmd\""</pre>
</li>
</ol>
<h2>Scheduling cron.php on Linux/Unix</h2>
<ol>
<li>Edit the file <em>&lt;itop root&gt</em>/webservices/<b>cron.params</b> to set the credentials used for cronified tasks (requires administator privileges)</li>
<li>If you care about security: move the file <em>&lt;itop root&gt</em>/webservices/<b>cron.params</b> into a directory not in the scope of the web server (Apache), and make it be readable only by the account that will execute the cron</li>
<li>Edit the crontab and add the following line:
<pre>* * * * * /usr/bin/php <em>&lt;itop root&gt</em>/webservices/cron.php --param_file=<em>&lt;itop root&gt</em>/webservices/cron.params</pre>
</li>
</ol>
<h1><a name="Modules">iTop Modules</a></h1>
<!-- Configuration Management Module -->
@@ -75,7 +111,7 @@ a.internal:hover {
<p>This module allows IT operators to document all items they have under their control, it implements a CMDB following the ITIL best practices. The module provides a logical model of the IT infrastructure by identifying, controlling, maintaining and verifying the version of all existing Configuration Items (CIs).
Relationships between CIs are also documented in the Configuration Management module, so that IT engineers can easily analyze dependencies within the infrastructure and understand the impact due to incidents or changes.</p>
<p>Out of the box, iTop 1.0 allows you to manage:</p>
<ul>
<ul>
<li>Persons and Teams</li>
<li>Locations</li>
<li>Business Processes</li>
@@ -89,7 +125,7 @@ Relationships between CIs are also documented in the Configuration Management mo
<p><i>This module is the base for all other iTop modules and is automatically installed with iTop</i></p>
<!-- Service Management Module -->
<h2 id="Service"><a name="ServiceMgmt">Service Management</a></h2>
<p>This module allows you to define and maintain the Services provided by your organization, the contracts with your customers and providers and the available Service Levels for each of Service.</p>
<p>Using this module, you can document:</p>

BIN
images/details_sep.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 B

BIN
images/synchro.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
images/transp-lock.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

View File

@@ -1,12 +1,12 @@
Prerequisites:
iTop requires
- A web server running PHP 5.2.0 or higher, with PCRE, SESSION, mysql, iconv, simplexml and soap support.
- A web server running PHP 5.2.0 or higher, with PCRE, SESSION, mysql, iconv, simplexml, hash, json and soap support.
If you wish to use LDAP authentication, then LDAP support must be enabled in PHP.
- A connection to MySQL 5.0 or higher
Web browser support:
iTop is developed using FireFox 3.x and tested with IE 7 and IE 8.
iTop is developed using FireFox 3.x and tested with IE 8, IE 9, Safari 5 and Chrome.
Installation:
@@ -21,4 +21,4 @@ Installation:
other scripts will be a problem).
3. Open the main iTop directory in your web browser. iTop should then display
the setup instructions on screen.
the setup instructions on screen.

View File

@@ -45,14 +45,57 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
this.Search = function()
{
$('#ac_dlg_'+me.id).dialog('open');
this.UpdateSizes();
this.UpdateButtons();
if($('#'+me.id).attr('disabled')) return; // Disabled, do nothing
var value = $('#'+me.id).val(); // Current value
// Query the server to get the form to search for target objects
if (me.bSelectMode)
{
me.v_html = $('#v_'+me.id).html();
$('#v_'+me.id).html('<img src="../images/indicator.gif" />');
}
else
{
$('#label_'+me.id).addClass('ac_dlg_loading');
}
var theMap = { sAttCode: me.sAttCode,
iInputId: me.id,
sSuffix: me.sSuffix,
'class': me.sClass,
sValue: value,
operation: 'objectSearchForm'
}
// Make sure that we cancel any pending request before issuing another
// since responses may arrive in arbitrary order
me.StopPendingRequest();
// Run the query and get the result back directly in HTML
me.ajax_request = $.post( '../pages/ajax.render.php', theMap,
function(data)
{
$('#ac_dlg_'+me.id).html(data);
$('#ac_dlg_'+me.id).dialog('open');
me.UpdateSizes();
me.UpdateButtons();
me.ajax_request = null;
},
'html'
);
}
this.UpdateSizes = function()
{
var dlg = $('#ac_dlg_'+me.id);
// Adjust the dialog's size to fit into the screen
if (dlg.width() > ($(window).width()-40))
{
dlg.width($(window).width()-40);
}
if (dlg.height() > ($(window).height()-70))
{
dlg.height($(window).height()-70);
}
var searchForm = dlg.find('div.display_block:first'); // Top search form, enclosing display_block
var results = $('#dr_'+me.id);
padding_right = parseInt(dlg.css('padding-right').replace('px', ''));
@@ -65,7 +108,6 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
results.height(height - form_height - 40); // Leave some space for the buttons
}
this.UpdateButtons = function()
{
var okBtn = $('#btn_ok_'+me.id);
@@ -83,7 +125,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
{
var theMap = { sAttCode: me.sAttCode,
iInputId: me.id,
sSuffix: me.sSuffix,
sSuffix: me.sSuffix
}
// Gather the parameters from the search form
@@ -97,8 +139,16 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
}
);
me.oWizardHelper.UpdateWizard();
theMap['json'] = me.oWizardHelper.ToJSON();
if (me.oWizardHelper == null)
{
theMap['json'] = '';
}
else
{
// Not inside a "search form", updating a real object
me.oWizardHelper.UpdateWizard();
theMap['json'] = me.oWizardHelper.ToJSON();
}
theMap['sRemoteClass'] = theMap['class']; // swap 'class' (defined in the form) and 'remoteClass'
theMap['class'] = me.sClass;
@@ -114,7 +164,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
me.StopPendingRequest();
// Run the query and display the results
me.ajax_request = $.post( 'ajax.render.php', theMap,
me.ajax_request = $.post( '../pages/ajax.render.php', theMap,
function(data)
{
$(sSearchAreaId).html(data);
@@ -134,7 +184,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
{
var iObjectId = $('#fr_'+me.id+' input[name=selectObject]:checked').val();
$('#ac_dlg_'+this.id).dialog('close');
$('#label_'+this.id).addClass('ac_loading');
$('#label_'+this.id).addClass('ac_dlg_loading');
// Query the server again to get the display name of the selected object
var theMap = { sAttCode: me.sAttCode,
@@ -150,11 +200,11 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
me.StopPendingRequest();
// Run the query and get the result back directly in JSON
me.ajax_request = $.post( 'ajax.render.php', theMap,
me.ajax_request = $.post( '../pages/ajax.render.php', theMap,
function(data)
{
$('#label_'+me.id).val(data.name);
$('#label_'+me.id).removeClass('ac_loading');
$('#label_'+me.id).removeClass('ac_dlg_loading');
$('#'+me.id).val(iObjectId);
$('#'+me.id).trigger('validate');
$('#label_'+me.id).focus();
@@ -171,16 +221,20 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
// dialog is very slow. So empty it each time.
this.OnClose = function()
{
me.StopPendingRequest();
// called by the dialog, so in the context 'this' points to the jQueryObject
if (me.emptyOnClose)
{
$('#dr_'+me.id).html(me.emptyHtml);
}
$('#label_'+me.id).removeClass('ac_dlg_loading');
$('#label_'+me.id).focus();
me.ajax_request = null;
}
this.CreateObject = function(oWizHelper)
{
if($('#'+me.id).attr('disabled')) return; // Disabled, do nothing
// Query the server to get the form to create a target object
if (me.bSelectMode)
{
@@ -189,7 +243,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
}
else
{
$('#label_'+me.id).addClass('ac_loading');
$('#label_'+me.id).addClass('ac_dlg_loading');
}
me.oWizardHelper.UpdateWizard();
var theMap = { sAttCode: me.sAttCode,
@@ -205,7 +259,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
me.StopPendingRequest();
// Run the query and get the result back directly in HTML
me.ajax_request = $.post( 'ajax.render.php', theMap,
me.ajax_request = $.post( '../pages/ajax.render.php', theMap,
function(data)
{
$('#ajax_'+me.id).html(data);
@@ -214,6 +268,15 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
// Modify the action of the cancel button
$('#ac_create_'+me.id+' button.cancel').unbind('click').click( me.CloseCreateObject );
me.ajax_request = null;
// Adjust the dialog's size to fit into the screen
if ($('#ac_create_'+me.id).width() > ($(window).width()-40))
{
$('#ac_create_'+me.id).width($(window).width()-40);
}
if ($('#ac_create_'+me.id).height() > ($(window).height()-70))
{
$('#ac_create_'+me.id).height($(window).height()-70);
}
},
'html'
);
@@ -232,7 +295,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
}
else
{
$('#label_'+me.id).removeClass('ac_loading');
$('#label_'+me.id).removeClass('ac_dlg_loading');
}
$('#label_'+me.id).focus();
$('#ac_create_'+me.id).dialog("destroy");
@@ -275,7 +338,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
me.StopPendingRequest();
// Run the query and get the result back directly in JSON
me.ajax_request = $.post( 'ajax.render.php', theMap,
me.ajax_request = $.post( '../pages/ajax.render.php', theMap,
function(data)
{
if (me.bSelectMode)
@@ -290,7 +353,7 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
// Put the value corresponding to the newly created object in the autocomplete
$('#label_'+me.id).val(data.name);
$('#'+me.id).val(data.id);
$('#label_'+me.id).removeClass('ac_loading');
$('#label_'+me.id).removeClass('ac_dlg_loading');
$('#label_'+me.id).focus();
}
$('#'+me.id).trigger('validate');
@@ -301,4 +364,23 @@ function ExtKeyWidget(id, sClass, sAttCode, sSuffix, bSelectMode, oWizHelper)
}
return false; // do NOT submit the form
}
this.Update = function()
{
if ($('#'+me.id).attr('disabled'))
{
$('#v_'+me.id).html('');
$('#label_'+me.id).attr('disabled', 'disabled');
$('#label_'+me.id).css({'background': 'transparent'});
$('#mini_add_'+me.id).hide();
$('#mini_search_'+me.id).hide();
}
else
{
$('#label_'+me.id).attr('disabled', '');
$('#label_'+me.id).css({'background': '#fff url(../images/ac-background.gif) no-repeat right'});
$('#mini_add_'+me.id).show();
$('#mini_search_'+me.id).show();
}
}
}

View File

@@ -107,7 +107,7 @@ function ActivateStep(iTargetStep)
// if (oObj['m_aCurrValues'][sAttCode] == '')
// {
// var oJSON = document.getElementById(sJsonFieldId);
// $.get('ajax.render.php?class=' + sClass + '&json_obj=' + oJSON.value + '&att_code=' + sAttCode,
// $.get('../pages/ajax.render.php?class=' + sClass + '&json_obj=' + oJSON.value + '&att_code=' + sAttCode,
// { operation: "default_value" },
// function(json_data){
// var oObj = ReloadObjectFromServer(json_data);
@@ -174,26 +174,33 @@ function ReportFieldValidationStatus(sFieldId, sFormId, bValid)
function ValidateField(sFieldId, sPattern, bMandatory, sFormId, nullValue)
{
var bValid = true;
var currentVal = $('#'+sFieldId).val();
if ($('#'+sFieldId).attr('disabled'))
{
bValid = true; // disabled fields are not checked
}
else
{
var currentVal = $('#'+sFieldId).val();
if (currentVal == '$$NULL$$') // Convention to indicate a non-valid value since it may have to be passed as text
{
bValid = false;
}
else if (bMandatory && (currentVal == nullValue))
{
bValid = false;
}
else if (currentVal == nullValue)
{
// An empty field is Ok...
bValid = true;
}
else if (sPattern != '')
{
re = new RegExp(sPattern);
//console.log('Validating field: '+sFieldId + ' current value: '+currentVal + ' pattern: '+sPattern );
bValid = re.test(currentVal);
if (currentVal == '$$NULL$$') // Convention to indicate a non-valid value since it may have to be passed as text
{
bValid = false;
}
else if (bMandatory && (currentVal == nullValue))
{
bValid = false;
}
else if (currentVal == nullValue)
{
// An empty field is Ok...
bValid = true;
}
else if (sPattern != '')
{
re = new RegExp(sPattern);
//console.log('Validating field: '+sFieldId + ' current value: '+currentVal + ' pattern: '+sPattern );
bValid = re.test(currentVal);
}
}
ReportFieldValidationStatus(sFieldId, sFormId, bValid);
//console.log('Form: '+sFormId+' Validating field: '+sFieldId + ' current value: '+currentVal+' pattern: '+sPattern+' result: '+bValid );
@@ -292,6 +299,20 @@ function ValidatePasswordField(id, sFormId)
return true;
}
// Manage a 'duration' field
function UpdateDuration(iId)
{
var iDays = parseInt($('#'+iId+'_d').val(), 10);
var iHours = parseInt($('#'+iId+'_h').val(), 10);
var iMinutes = parseInt($('#'+iId+'_m').val(), 10);
var iSeconds = parseInt($('#'+iId+'_s').val(), 10);
var iDuration = (((iDays*24)+ iHours)*60+ iMinutes)*60 + iSeconds;
$('#'+iId).val(iDuration);
$('#'+iId).trigger('change');
return true;
}
// Called when filling an autocomplete field
function OnAutoComplete(id, event, data, formatted)
{

View File

@@ -28,7 +28,6 @@ jQuery.fn.popupmenu = function ()
if ( (previous_popup == null) || (previous_popup.get(0) != popupmenu.get(0))) // Comparing the DOM objects
{
// The user clicked in a different menu, let's open it
popupmenu.bgiframe();
popupmenu.positionBy({ target: $(this),
targetPos: 4,
elementPos: 0,

16
js/jquery.qtip-1.0.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -96,7 +96,7 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
$(sSearchAreaId).block();
// Run the query and display the results
$.post( 'ajax.render.php', theMap,
$.post( '../pages/ajax.render.php', theMap,
function(data)
{
$(sSearchAreaId).html(data);
@@ -147,7 +147,7 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
theMap['operation'] = 'doAddObjects';
$('#busy_'+me.iInputId).html('&nbsp;<img src="../images/indicator.gif"/>');
// Run the query and display the results
$.post( 'ajax.render.php', theMap,
$.post( '../pages/ajax.render.php', theMap,
function(data)
{
//console.log('Data: ' + data);

View File

@@ -21,7 +21,7 @@ function ReloadTruncatedList(divId, sSerializedFilter, sExtraParams)
console.log('Uh,uh, exception !');
}
}
aTruncatedLists[divId] = $.post('ajax.render.php?style=list',
aTruncatedLists[divId] = $.post('../pages/ajax.render.php?style=list',
{ operation: 'ajax', filter: sSerializedFilter, extra_params: sExtraParams },
function(data)
{
@@ -76,7 +76,7 @@ function ReloadBlock(divId, sStyle, sSerializedFilter, sExtraParams)
{
$('#'+divId).block();
//$('#'+divId).blockUI();
$.post('ajax.render.php?style='+sStyle,
$.post('../pages/ajax.render.php?style='+sStyle,
{ operation: 'ajax', filter: sSerializedFilter, extra_params: sExtraParams },
function(data){
$('#'+divId).empty();
@@ -135,9 +135,10 @@ function ReloadSearchForm(divId, sClassName, sBaseClass, sContext)
aSubmit [index ] = { data:oFormEvents.submit[index].data, namespace:oFormEvents.submit[index].namespace, handler: oFormEvents.submit[index].handler};
}
}
sAction = $('#ds_'+divId+' form').attr('action');
$.post('ajax.render.php?'+sContext,
{ operation: 'search_form', className: sClassName, baseClass: sBaseClass, currentId: divId },
$.post('../pages/ajax.render.php?'+sContext,
{ operation: 'search_form', className: sClassName, baseClass: sBaseClass, currentId: divId, action: sAction },
function(data) {
oDiv.empty();
oDiv.append(data);
@@ -182,7 +183,7 @@ function SetUserPreference(sPreferenceCode, sPrefValue, bPersistent)
oUserPreferences[sPreferenceCode] = sPrefValue;
if (bPersistent && (sPrefValue != sPreviousValue))
{
ajax_request = $.post('ajax.render.php',
ajax_request = $.post('../pages/ajax.render.php',
{ operation: 'set_pref', code: sPreferenceCode, value: sPrefValue} ); // Make it persistent
}
}
@@ -211,4 +212,76 @@ function CheckAll(sSelector, bValue)
$(sSelector).each( function() {
this.checked = value;
});
}
}
/**
* Toggle (enabled/disabled) the specified field of a form
*/
function ToogleField(value, field_id)
{
if (value)
{
$('#'+field_id).removeAttr('disabled');
}
else
{
$('#'+field_id).attr('disabled', 'disabled');
}
$('#'+field_id).trigger('update');
$('#'+field_id).trigger('validate');
}
/**
* For the fields that cannot be visually disabled, they can be blocked
* @return
*/
function BlockField(field_id, bBlocked)
{
if (bBlocked)
{
$('#'+field_id).block({ message: ' ** disabled ** '});
}
else
{
$('#'+field_id).unblock();
}
}
/**
* Updates (enables/disables) a "duration" field
*/
function ToggleDurationField(field_id)
{
// Toggle all the subfields that compose the "duration" input
aSubFields = new Array('d', 'h', 'm', 's');
if ($('#'+field_id).attr('disabled'))
{
for(var i=0; i<aSubFields.length; i++)
{
$('#'+field_id+'_'+aSubFields[i]).attr('disabled', 'disabled');
}
}
else
{
for(var i=0; i<aSubFields.length; i++)
{
$('#'+field_id+'_'+aSubFields[i]).removeAttr('disabled');
}
}
}
/**
* PropagateCheckBox
*/
function PropagateCheckBox(bCurrValue, aFieldsList, bCheck)
{
if (bCurrValue == bCheck)
{
for(var i=0;i<aFieldsList.length;i++)
{
$('#enable_'+aFieldsList[i]).attr('checked', bCheck);
ToogleField(bCheck, aFieldsList[i]);
}
}
}

View File

@@ -42,7 +42,7 @@ function ManageObjects(sTitle, sClass, sId, sExtKeyToRemote)
function Manage_LoadSelect(sSelectedId, sFilter)
{
$('#'+sSelectedId).addClass('loading');
$.post('ajax.render.php',
$.post('../pages/ajax.render.php',
{ operation: 'combo_options', filter: sFilter },
function(data){
$('#'+sSelectedId).empty();

View File

@@ -17,7 +17,7 @@ if (!Array.prototype.indexOf) // Emulation of the indexOf function for IE and ol
};
}
function WizardHelper(sClass, sFormPrefix)
function WizardHelper(sClass, sFormPrefix, sState)
{
this.m_oData = { 'm_sClass' : '',
'm_oFieldsMap': {},
@@ -27,7 +27,8 @@ function WizardHelper(sClass, sFormPrefix)
'm_oDefaultValue': {},
'm_oAllowedValues': {},
'm_iFieldsCount' : 0,
'm_sFormPrefix' : sFormPrefix
'm_sFormPrefix' : sFormPrefix,
'm_sState': sState
};
this.m_oData.m_sClass = sClass;
@@ -92,10 +93,16 @@ function WizardHelper(sClass, sFormPrefix)
// Set the full HTML for the input field
for(i=0; i<this.m_oData.m_aAllowedValuesRequested.length; i++)
{
sAttCode = this.m_oData.m_aAllowedValuesRequested[i];
sFieldId = this.m_oData.m_oFieldsMap[sAttCode];
var sAttCode = this.m_oData.m_aAllowedValuesRequested[i];
var sFieldId = this.m_oData.m_oFieldsMap[sAttCode];
var bDisabled = $('#'+sFieldId).attr('disabled');
//console.log('Setting #field_'+sFieldId+' to: '+this.m_oData.m_oAllowedValues[sAttCode]);
$('#field_'+sFieldId).html(this.m_oData.m_oAllowedValues[sAttCode]);
if (bDisabled)
{
$('#'+sFieldId).attr('disabled', 'disabled');
//$('#'+sFieldId).trigger('update'); // Propagate the disable
}
aRefreshed.push(sFieldId);
}
// Set the actual value of the input
@@ -113,7 +120,7 @@ function WizardHelper(sClass, sFormPrefix)
// For each "refreshed" field, asynchronously trigger a change in case there are dependent fields to update
for(i=0; i<aRefreshed.length; i++)
{
var sString = "$('#"+aRefreshed[i]+"').trigger('change');"
var sString = "$('#"+aRefreshed[i]+"').trigger('change').trigger('update');"
window.setTimeout(sString, 1); // Synchronous 'trigger' does nothing, call it asynchronously
}
}
@@ -133,7 +140,7 @@ function WizardHelper(sClass, sFormPrefix)
{
//console.log('data sent:', this.ToJSON());
//console.log('oWizard:', this);
$.post('ajax.render.php',
$.post('../pages/ajax.render.php',
{ operation: 'wizard_helper', json_obj: this.ToJSON() },
function(html){
$('#ajax_content').html(html);
@@ -149,7 +156,7 @@ function WizardHelper(sClass, sFormPrefix)
{
//console.log('data sent:', this.ToJSON());
//console.log('oWizard:', this);
$('#'+divId).load('ajax.render.php?operation=wizard_helper_preview',
$('#'+divId).load('../pages/ajax.render.php?operation=wizard_helper_preview',
{'json_obj': this.ToJSON()},
function(responseText, textStatus, XMLHttpRequest){
$('#wizStep'+ G_iCurrentStep).unblock( {fadeOut: 0} );

View File

@@ -1,45 +1,28 @@
<?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
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserExternal
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:UserExternal' => 'Utilisateur externe à iTop',
'Class:UserExternal+' => 'Utilisateur authentifié à l\'extérieur d\'iTop',
));
?>
<?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('FR FR', 'French', 'Français', array(
'Class:UserExternal' => 'Utilisateur externe à iTop',
'Class:UserExternal+' => 'Utilisateur authentifié à l\'extérieur d\'iTop',
));
?>

View File

@@ -0,0 +1,25 @@
<?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
/**
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Class:UserExternal' => 'Külső felhasználó',
'Class:UserExternal+' => '',
));
?>

View File

@@ -0,0 +1,47 @@
<?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
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserExternal
//
Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Class:UserExternal' => 'Esterno utente',
'Class:UserExternal+' => 'Utente autenticato al di fuori di iTop',
));
?>

View File

@@ -40,7 +40,7 @@ class UserExternal extends User
"key_type" => "autoincrement",
"name_attcode" => "login",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('login'),
"db_table" => "",
"db_key_field" => "id",
"db_finalclass_field" => "",

View File

@@ -45,14 +45,6 @@ SetupWebPage::AddModule(
'datamodel' => array(
'model.authent-external.php',
),
'dictionary' => array(
'en.dict.authent-external.php',
'fr.dict.authent-external.php',
'de.dict.authent-external.php',
'ru.dict.authent-external.php',
'tr.dict.authent-external.php',
'zh.dict.authent-external.php',
),
'data.struct' => array(
//'data.struct.authent-ldap.xml',
),

View File

@@ -1,47 +1,30 @@
<?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
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserLDAP
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:UserLDAP' => 'Utilisateur iTop',
'Class:UserLDAP+' => 'Utilisateur authentifié par iTop',
'Class:UserLDAP/Attribute:password' => 'Mot de passe LDAP',
'Class:UserLDAP/Attribute:password+' => '',
));
?>
<?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('FR FR', 'French', 'Français', array(
'Class:UserLDAP' => 'Utilisateur LDAP',
'Class:UserLDAP+' => 'Utilisateur authentifié par un serveur LDAP',
'Class:UserLDAP/Attribute:password' => 'Mot de passe LDAP',
'Class:UserLDAP/Attribute:password+' => '',
));
?>

View File

@@ -0,0 +1,27 @@
<?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
/**
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Class:UserLDAP' => 'LDAP felhasználó',
'Class:UserLDAP+' => '',
'Class:UserLDAP/Attribute:password' => 'Jelszó',
'Class:UserLDAP/Attribute:password+' => '',
));
?>

View File

@@ -0,0 +1,49 @@
<?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
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserLDAP
//
Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Class:UserLDAP' => 'Utente LDAP',
'Class:UserLDAP+' => 'Utente autenticato da LDAP',
'Class:UserLDAP/Attribute:password' => 'Password',
'Class:UserLDAP/Attribute:password+' => 'user authentication string',
));
?>

View File

@@ -35,7 +35,7 @@ class UserLDAP extends UserInternal
"key_type" => "autoincrement",
"name_attcode" => "login",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('login'),
"db_table" => "",
"db_key_field" => "id",
"db_finalclass_field" => "",

View File

@@ -28,14 +28,6 @@ SetupWebPage::AddModule(
'datamodel' => array(
'model.authent-ldap.php',
),
'dictionary' => array(
'en.dict.authent-ldap.php',
'fr.dict.authent-ldap.php',
'de.dict.authent-ldap.php',
'ru.dict.authent-ldap.php',
'tr.dict.authent-ldap.php',
'zh.dict.authent-ldap.php',
),
'data.struct' => array(
//'data.struct.authent-ldap.xml',
),

View File

@@ -1,47 +1,30 @@
<?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
*/
// 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('FR FR', 'French', 'Français', array(
'Class:UserLocal' => 'Utilisateur iTop',
'Class:UserLocal+' => 'Utilisateur authentifié par iTop',
'Class:UserLocal/Attribute:password' => 'Mot de passe',
'Class:UserLocal/Attribute:password+' => '',
));
?>
<?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('FR FR', 'French', 'Français', array(
'Class:UserLocal' => 'Utilisateur iTop',
'Class:UserLocal+' => 'Utilisateur authentifié par iTop',
'Class:UserLocal/Attribute:password' => 'Mot de passe',
'Class:UserLocal/Attribute:password+' => '',
));
?>

View File

@@ -0,0 +1,27 @@
<?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
/**
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Class:UserLocal' => 'iTop felhasználó',
'Class:UserLocal+' => '',
'Class:UserLocal/Attribute:password' => 'Jelszó',
'Class:UserLocal/Attribute:password+' => '',
));
?>

View File

@@ -0,0 +1,49 @@
<?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
*/
// 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('IT IT', 'Italian', 'Italiano', array(
'Class:UserLocal' => 'Utente iTop',
'Class:UserLocal+' => 'Utente autenticato da iTop',
'Class:UserLocal/Attribute:password' => 'Password',
'Class:UserLocal/Attribute:password+' => 'user authentication string',
));
?>

View File

@@ -35,7 +35,7 @@ class UserLocal extends UserInternal
"key_type" => "autoincrement",
"name_attcode" => "login",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('login'),
"db_table" => "priv_user_local",
"db_key_field" => "id",
"db_finalclass_field" => "",

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